Source Code
Overview
ETH Balance
ETH Value
$0.00| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 27338253 | 24 days ago | 0 ETH | ||||
| 27127010 | 30 days ago | 0 ETH | ||||
| 25532475 | 76 days ago | 0 ETH | ||||
| 24763557 | 97 days ago | 0 ETH | ||||
| 24574790 | 103 days ago | 0 ETH | ||||
| 24517851 | 104 days ago | 0 ETH | ||||
| 24248192 | 111 days ago | 0 ETH | ||||
| 24120340 | 114 days ago | 0 ETH | ||||
| 24023520 | 117 days ago | 0 ETH | ||||
| 24023253 | 117 days ago | 0 ETH | ||||
| 24016666 | 117 days ago | 0 ETH | ||||
| 23472790 | 130 days ago | 0 ETH | ||||
| 23279252 | 135 days ago | 0 ETH | ||||
| 22880730 | 145 days ago | 0 ETH | ||||
| 22737717 | 148 days ago | 0 ETH | ||||
| 22547349 | 153 days ago | 0 ETH | ||||
| 22395958 | 156 days ago | 0 ETH | ||||
| 22283635 | 159 days ago | 0 ETH | ||||
| 22234918 | 160 days ago | 0 ETH | ||||
| 22200587 | 161 days ago | 0 ETH | ||||
| 22047122 | 165 days ago | 0 ETH | ||||
| 21312887 | 184 days ago | 0 ETH | ||||
| 21279911 | 185 days ago | 0 ETH | ||||
| 21158639 | 188 days ago | 0 ETH | ||||
| 21086874 | 190 days ago | 0 ETH |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
SHOVesting
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at lineascan.build/ on 2024-02-15 */ // Sources flattened with hardhat v2.17.0 https://hardhat.org //SPDX-License-Identifier: MIT // File @openzeppelin/contracts-upgradeable/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.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 * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [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://consensys.net/diligence/blog/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.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts-upgradeable/proxy/utils/[email protected] // OpenZeppelin Contracts (last updated v4.9.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] * ```solidity * 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 Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint8) { return _initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _initializing; } } // File @openzeppelin/contracts-upgradeable/utils/[email protected] // 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] // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract 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. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } /** * @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/security/[email protected] // OpenZeppelin Contracts (last updated v4.9.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 Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _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/token/ERC20/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File @openzeppelin/contracts/token/ERC20/extensions/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (utils/Address.sol) pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 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 functionCall(target, data, "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"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(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) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason 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 { // 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // OpenZeppelin Contracts v4.4.0 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/SHOVesting.sol pragma solidity =0.8.4; contract SHOVesting is Initializable, OwnableUpgradeable, ReentrancyGuardUpgradeable { using SafeERC20 for IERC20; uint32 constant public VERSION = 2; uint32 constant internal HUNDRED_PERCENT = 1e6; struct User { uint120 allocation; // How many tokens user can claim in total without including fee. uint120 refundableAmount; // How many refund tokens is user eligible for uint16 claimedUnlocksCount; // How many unlocks user has claimed. uint16 eliminatedAfterUnlock; // At which unlock user has been eliminated. bool refunded; // Whether user was refunded. } struct InitParameters { IERC20 shoToken; // The vesting token that whitelisted users can claim. uint32[] unlockPercentagesDiff; // Array of unlock percentages as differentials. uint32[] unlockPeriodsDiff; // Array of unlock periods as differentials. uint32 baseFeePercentage1; // Base fee in percentage for users. address feeCollector; // EOA that receives fees. uint64 startTime; // When users can start claiming. IERC20 refundToken; // Refund token address. address refundReceiver; // Address receiving refunded tokens. uint64 refundStartTime; // When refund starts. uint64 refundEndTime; // When refund ends. } mapping(address => User) public users1; mapping(address => bool) public blockedUsers; uint32[] public unlockPercentages; uint32[] public unlockPeriods; IERC20 public shoToken; uint64 public startTime; address public feeCollector; uint32 public baseFeePercentage1; IERC20 public refundToken; address public refundReceiver; uint64 public refundStartTime; uint64 public refundEndTime; bool public whitelistingAllowed; uint16 passedUnlocksCount; uint120 public globalTotalAllocation1; uint120 public totalRefundedAllocation; uint120 public totalRefundableAmount; uint120 public totalRefundedAmount; uint16 public collectedFeesUnlocksCount; uint120 public extraFees1Allocation; uint120 public extraFees1AllocationUncollectable; event Whitelist( address user, uint120 allocation ); event Claim( address indexed user, uint16 currentUnlock, uint120 claimedTokens ); event FeeCollection( uint16 currentUnlock, uint120 totalFee, uint120 extraFee ); event UserElimination( address user, uint16 currentUnlock ); event Update( uint16 passedUnlocksCount ); event Refund( address user, uint refundAmount ); event BlockUsers( address[] userAddresses, bool state ); modifier onlyWhitelistedUser(address userAddress) { require(users1[userAddress].allocation > 0, "SHOVesting: not whitelisted"); _; } /** * @notice Initializes contract. * @param params InitParameters struct. */ function init( InitParameters calldata params ) external initializer { __ReentrancyGuard_init(); __Ownable_init(); require(address(params.shoToken) != address(0), "SHOVesting: sho token zero address"); require(params.unlockPercentagesDiff.length > 0, "SHOVesting: 0 unlock percentages"); require(params.unlockPeriodsDiff.length == params.unlockPercentagesDiff.length, "SHOVesting: different array lengths"); require(params.baseFeePercentage1 <= HUNDRED_PERCENT, "SHOVesting: base fee percentage 1 higher than 100%"); require(params.feeCollector != address(0), "SHOVesting: fee collector zero address"); require(params.startTime > block.timestamp, "SHOVesting: start time must be in future"); uint32[] memory _unlockPercentages = _buildArraySum(params.unlockPercentagesDiff); uint32[] memory _unlockPeriods = _buildArraySum(params.unlockPeriodsDiff); require(_unlockPercentages[_unlockPercentages.length - 1] == HUNDRED_PERCENT, "SHOVesting: invalid unlock percentages"); require(params.shoToken != params.refundToken, "SHOVesting: same tokens"); if (address(params.refundToken) != address(0)) { require(params.refundStartTime >= params.startTime, "SHOVesting: invalid refundStartTime"); require(params.refundEndTime > params.refundStartTime, "SHOVesting: invalid refundEndTime"); require(params.refundReceiver != address(0), "SHOVesting: invalid refundReceiver"); } else { require(params.refundStartTime == 0, "SHOVesting: invalid refundStartTime"); require(params.refundEndTime == 0, "SHOVesting: invalid refundEndTime"); require(params.refundReceiver == address(0), "SHOVesting: invalid refundReceiver"); } shoToken = params.shoToken; unlockPercentages = _unlockPercentages; unlockPeriods = _unlockPeriods; baseFeePercentage1 = params.baseFeePercentage1; feeCollector = params.feeCollector; startTime = params.startTime; refundToken = params.refundToken; refundReceiver = params.refundReceiver; refundStartTime = params.refundStartTime; refundEndTime = params.refundEndTime; whitelistingAllowed = true; } /** * @notice Allows to withdraw remaining refund token balance. */ function recoverRefundToken() external { require(msg.sender == owner() || msg.sender == refundReceiver, "SHOVesting: unauthorized"); refundToken.safeTransfer(refundReceiver, refundToken.balanceOf(address(this))); } /** * @notice Owner whitelists addresses their given allocations. * @param userAddresses User addresses to whitelist * @param allocations Users allocation * @param last Disable Whitelisting after last whitelist */ function whitelistUsers( address[] calldata userAddresses, uint120[] calldata allocations, uint120[] calldata refundableAmounts, bool last ) external onlyOwner { require(whitelistingAllowed, "SHOVesting: whitelisting not allowed anymore"); require(userAddresses.length != 0, "SHOVesting: zero length array"); require(userAddresses.length == allocations.length, "SHOVesting: different array lengths"); require(userAddresses.length == refundableAmounts.length, "SHOVesting: different array lengths"); uint120 _globalTotalAllocation1; uint120 _totalRefundableAmount; for (uint256 i; i < userAddresses.length; i++) { address userAddress = userAddresses[i]; if (userAddress == feeCollector) { globalTotalAllocation1 += allocations[i]; extraFees1Allocation += _applyBaseFee(allocations[i]); continue; } require(users1[userAddress].allocation == 0, "SHOVesting: already whitelisted"); users1[userAddress].allocation = allocations[i]; users1[userAddress].refundableAmount = refundableAmounts[i]; _globalTotalAllocation1 += allocations[i]; _totalRefundableAmount += refundableAmounts[i]; emit Whitelist(userAddresses[i], allocations[i]); } globalTotalAllocation1 += _globalTotalAllocation1; totalRefundableAmount += _totalRefundableAmount; if (last) { whitelistingAllowed = false; } } /** * @notice Allows owner to block some wallets from claiming. * @dev Used for wallets that don't complete offchain requirements. * @param userAddresses User addresses to block/unblock * @param state Whether to block/unblock */ function blockUsers(address[] calldata userAddresses, bool state) external onlyOwner { for (uint i; i < userAddresses.length; i++) { blockedUsers[userAddresses[i]] = state; } emit BlockUsers(userAddresses, state); } /** * @notice Whitelisted users can claim their available tokens. * @dev There's still the baseFee deducted from their allocation. * @param userAddress The user address to claim tokens for. */ function claimUser1(address userAddress) onlyWhitelistedUser(userAddress) public nonReentrant returns (uint120 amountToClaim) { update(); User memory user = users1[userAddress]; if (userAddress != msg.sender) { require(block.timestamp > refundEndTime, "SHOVesting: refund period"); } require(passedUnlocksCount > 0, "SHOVesting: no unlocks passed"); require(user.claimedUnlocksCount < passedUnlocksCount, "SHOVesting: nothing to claim"); require(!user.refunded, "SHOVesting: refunded"); require(!blockedUsers[userAddress], "SHOVesting: blocked"); uint16 currentUnlock = passedUnlocksCount - 1; if (user.eliminatedAfterUnlock > 0) { require(user.claimedUnlocksCount < user.eliminatedAfterUnlock, "SHOVesting: nothing to claim"); currentUnlock = user.eliminatedAfterUnlock - 1; } uint32 lastUnlockPercentage = user.claimedUnlocksCount > 0 ? unlockPercentages[user.claimedUnlocksCount - 1] : 0; amountToClaim = _applyPercentage(user.allocation, unlockPercentages[currentUnlock] - lastUnlockPercentage); amountToClaim = _applyBaseFee(amountToClaim); user.claimedUnlocksCount = currentUnlock + 1; users1[userAddress] = user; shoToken.safeTransfer(userAddress, amountToClaim); emit Claim(userAddress, currentUnlock, amountToClaim); } /** * @notice Sender claims tokens. */ function claimUser1() external returns (uint120 amountToClaim) { return claimUser1(msg.sender); } /** * @notice The sender gets refunded in sale token and forfeits all vested tokens. */ function refund() external nonReentrant { update(); require(block.timestamp >= refundStartTime && block.timestamp <= refundEndTime, "SHOVesting: no refund period"); address userAddress = msg.sender; User storage user = users1[userAddress]; require(user.claimedUnlocksCount == 0, "SHOVesting: claimed"); require(user.eliminatedAfterUnlock == 0, "SHOVesting: eliminated"); require(user.refundableAmount > 0, "SHOVesting: not refundable"); require(!user.refunded, "SHOVesting: already refunded"); uint120 refundAmount = user.refundableAmount; shoToken.safeTransfer(refundReceiver, user.allocation); refundToken.safeTransfer(userAddress, refundAmount); totalRefundedAllocation += user.allocation; totalRefundedAmount += refundAmount; user.refunded = true; emit Refund(userAddress, refundAmount); } /** * @notice Removes all the future allocation of passed user addresses. * @dev Users can still claim the unlock they were eliminated in. * @param userAddresses Whitelisted user addresses to eliminate */ function eliminateUsers1(address[] calldata userAddresses) external onlyOwner { update(); require(passedUnlocksCount > 0, "SHOVesting: no unlocks passed"); uint16 currentUnlock = passedUnlocksCount - 1; require(currentUnlock < unlockPeriods.length - 1, "SHOVesting: eliminating in the last unlock"); for (uint256 i; i < userAddresses.length; i++) { address userAddress = userAddresses[i]; User memory user = users1[userAddress]; require(user.allocation > 0, "SHOVesting: not whitelisted"); require(!user.refunded, "SHOVesting: refunded"); require(user.eliminatedAfterUnlock == 0, "SHOVesting: already eliminated"); uint120 userAllocation = _applyBaseFee(user.allocation); uint120 uncollectable = _applyPercentage(userAllocation, unlockPercentages[currentUnlock]); extraFees1Allocation += userAllocation; extraFees1AllocationUncollectable += uncollectable; users1[userAddress].eliminatedAfterUnlock = currentUnlock + 1; emit UserElimination(userAddress, currentUnlock); } } /** * @notice Claims fees from all users. * @dev The fees are collectable not depedning on if users are claiming. * @dev Anybody can call this but the fees go to the fee collector. * @dev If some users are refunded after collecting fees, the fee collector is responsible for rebalancing. */ function collectFees() external nonReentrant returns (uint120 baseFee, uint120 extraFee) { update(); require(collectedFeesUnlocksCount < passedUnlocksCount, "SHOVesting: no fees to collect"); uint16 currentUnlock = passedUnlocksCount - 1; uint32 lastUnlockPercentage = collectedFeesUnlocksCount > 0 ? unlockPercentages[collectedFeesUnlocksCount - 1] : 0; uint120 globalAllocation1 = _applyPercentage(globalTotalAllocation1 - totalRefundedAllocation, unlockPercentages[currentUnlock] - lastUnlockPercentage); baseFee = _applyPercentage(globalAllocation1, baseFeePercentage1); uint120 extraFees1AllocationTillNow = _applyPercentage(extraFees1Allocation, unlockPercentages[currentUnlock]); extraFee = extraFees1AllocationTillNow - extraFees1AllocationUncollectable; extraFees1AllocationUncollectable = extraFees1AllocationTillNow; uint120 totalFee = baseFee + extraFee; collectedFeesUnlocksCount = currentUnlock + 1; shoToken.safeTransfer(feeCollector, totalFee); emit FeeCollection(currentUnlock, totalFee, extraFee); } /** * @notice Updates passedUnlocksCount. */ function update() public { uint16 _passedUnlocksCount = getPassedUnlocksCount(); if (_passedUnlocksCount > passedUnlocksCount) { passedUnlocksCount = _passedUnlocksCount; emit Update(_passedUnlocksCount); } } // PUBLIC VIEW FUNCTIONS function getPassedUnlocksCount() public view returns (uint16 _passedUnlocksCount) { require(block.timestamp >= startTime, "SHOVesting: before startTime"); uint256 timeSinceStart = block.timestamp - startTime; uint256 maxReleases = unlockPeriods.length; _passedUnlocksCount = passedUnlocksCount; while (_passedUnlocksCount < maxReleases && timeSinceStart >= unlockPeriods[_passedUnlocksCount]) { _passedUnlocksCount++; } } function getTotalUnlocksCount() public view returns (uint16 totalUnlocksCount) { return uint16(unlockPercentages.length); } // PRIVATE FUNCTIONS function _applyPercentage(uint120 value, uint32 percentage) private pure returns (uint120) { return uint120(uint256(value) * percentage / HUNDRED_PERCENT); } function _applyBaseFee(uint120 value) private view returns (uint120) { return value - _applyPercentage(value, baseFeePercentage1); } function _buildArraySum(uint32[] memory diffArray) internal pure returns (uint32[] memory) { uint256 len = diffArray.length; uint32[] memory sumArray = new uint32[](len); uint32 lastSum = 0; for (uint256 i; i < len; i++) { if (i > 0) { lastSum = sumArray[i - 1]; } sumArray[i] = lastSum + diffArray[i]; } return sumArray; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"userAddresses","type":"address[]"},{"indexed":false,"internalType":"bool","name":"state","type":"bool"}],"name":"BlockUsers","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint16","name":"currentUnlock","type":"uint16"},{"indexed":false,"internalType":"uint120","name":"claimedTokens","type":"uint120"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"currentUnlock","type":"uint16"},{"indexed":false,"internalType":"uint120","name":"totalFee","type":"uint120"},{"indexed":false,"internalType":"uint120","name":"extraFee","type":"uint120"}],"name":"FeeCollection","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"refundAmount","type":"uint256"}],"name":"Refund","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"passedUnlocksCount","type":"uint16"}],"name":"Update","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint16","name":"currentUnlock","type":"uint16"}],"name":"UserElimination","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint120","name":"allocation","type":"uint120"}],"name":"Whitelist","type":"event"},{"inputs":[],"name":"VERSION","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseFeePercentage1","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"userAddresses","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"blockUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"blockedUsers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"}],"name":"claimUser1","outputs":[{"internalType":"uint120","name":"amountToClaim","type":"uint120"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimUser1","outputs":[{"internalType":"uint120","name":"amountToClaim","type":"uint120"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectFees","outputs":[{"internalType":"uint120","name":"baseFee","type":"uint120"},{"internalType":"uint120","name":"extraFee","type":"uint120"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectedFeesUnlocksCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"userAddresses","type":"address[]"}],"name":"eliminateUsers1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extraFees1Allocation","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"extraFees1AllocationUncollectable","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPassedUnlocksCount","outputs":[{"internalType":"uint16","name":"_passedUnlocksCount","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalUnlocksCount","outputs":[{"internalType":"uint16","name":"totalUnlocksCount","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalTotalAllocation1","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"shoToken","type":"address"},{"internalType":"uint32[]","name":"unlockPercentagesDiff","type":"uint32[]"},{"internalType":"uint32[]","name":"unlockPeriodsDiff","type":"uint32[]"},{"internalType":"uint32","name":"baseFeePercentage1","type":"uint32"},{"internalType":"address","name":"feeCollector","type":"address"},{"internalType":"uint64","name":"startTime","type":"uint64"},{"internalType":"contract IERC20","name":"refundToken","type":"address"},{"internalType":"address","name":"refundReceiver","type":"address"},{"internalType":"uint64","name":"refundStartTime","type":"uint64"},{"internalType":"uint64","name":"refundEndTime","type":"uint64"}],"internalType":"struct SHOVesting.InitParameters","name":"params","type":"tuple"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverRefundToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundEndTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundStartTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shoToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRefundableAmount","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRefundedAllocation","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRefundedAmount","outputs":[{"internalType":"uint120","name":"","type":"uint120"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unlockPercentages","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"unlockPeriods","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"update","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users1","outputs":[{"internalType":"uint120","name":"allocation","type":"uint120"},{"internalType":"uint120","name":"refundableAmount","type":"uint120"},{"internalType":"uint16","name":"claimedUnlocksCount","type":"uint16"},{"internalType":"uint16","name":"eliminatedAfterUnlock","type":"uint16"},{"internalType":"bool","name":"refunded","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"userAddresses","type":"address[]"},{"internalType":"uint120[]","name":"allocations","type":"uint120[]"},{"internalType":"uint120[]","name":"refundableAmounts","type":"uint120[]"},{"internalType":"bool","name":"last","type":"bool"}],"name":"whitelistUsers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whitelistingAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060405234801561001057600080fd5b50613566806100206000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80639b442e3f11610125578063cd1e0355116100ad578063db81213a1161007c578063db81213a1461056c578063f2fde38b14610586578063f53014b414610599578063ffa1ad74146105ac578063ffec0fb5146105b457600080fd5b8063cd1e035514610513578063d1dfb8dc14610526578063d713c3041461053b578063da40ea1d1461055557600080fd5b8063ba93f699116100f4578063ba93f699146104aa578063c31c0018146104bd578063c415b95c146104d0578063c736e1ff146104e3578063c8796572146104eb57600080fd5b80639b442e3f14610470578063a2e6204514610487578063a92b51611461048f578063b28e20c0146104a257600080fd5b80636aba899b116101a8578063798c87ce11610177578063798c87ce146103fe57806388a60946146104265780638c6dd673146104395780638da5cb5b1461044c57806399230a031461045d57600080fd5b80636aba899b14610397578063715018a6146103c957806373fddd16146103d157806378e97925146103e457600080fd5b8063464a59c7116101ef578063464a59c714610323578063590e1ae3146103375780635cb732be1461033f578063604445fd1461036a578063677375c31461037d57600080fd5b8063011852851461022157806306324044146102515780632a8b279a1461025b5780633af2d5e7146102f0575b600080fd5b60a254610234906001600160781b031681565b6040516001600160781b0390911681526020015b60405180910390f35b6102596105c7565b005b6102b4610269366004612ee0565b609760205260009081526040902080546001909101546001600160781b0380831692600160781b81049091169161ffff600160f01b90920482169181169060ff620100009091041685565b604080516001600160781b03968716815295909416602086015261ffff928316938501939093521660608301521515608082015260a001610248565b6103136102fe366004612ee0565b60986020526000908152604090205460ff1681565b6040519015158152602001610248565b609f5461031390600160401b900460ff1681565b6102596106d4565b609d54610352906001600160a01b031681565b6040516001600160a01b039091168152602001610248565b610259610378366004612fe4565b610a05565b60a05461023490600160781b90046001600160781b031681565b609e546103b190600160a01b90046001600160401b031681565b6040516001600160401b039091168152602001610248565b610259610acd565b609f546103b1906001600160401b031681565b609b546103b190600160a01b90046001600160401b031681565b61041161040c3660046130b3565b610adf565b60405163ffffffff9091168152602001610248565b610259610434366004612efc565b610b19565b610259610447366004612f3b565b610f4c565b6033546001600160a01b0316610352565b60a054610234906001600160781b031681565b6099545b60405161ffff9091168152602001610248565b610259611507565b609e54610352906001600160a01b031681565b61047461158a565b6104116104b83660046130b3565b61169d565b6102346104cb366004612ee0565b6116ad565b609c54610352906001600160a01b031681565b610234611c0d565b6104f3611c1d565b604080516001600160781b03938416815292909116602083015201610248565b60a154610234906001600160781b031681565b60a15461047490600160781b900461ffff1681565b60a15461023490600160881b90046001600160781b031681565b609c5461041190600160a01b900463ffffffff1681565b609f5461023490600160581b90046001600160781b031681565b610259610594366004612ee0565b611ee6565b609b54610352906001600160a01b031681565b610411600281565b6102596105c2366004613054565b611f5c565b6033546001600160a01b03163314806105ea5750609e546001600160a01b031633145b61063b5760405162461bcd60e51b815260206004820152601860248201527f53484f56657374696e673a20756e617574686f72697a6564000000000000000060448201526064015b60405180910390fd5b609e54609d546040516370a0823160e01b81523060048201526106d2926001600160a01b039081169216906370a082319060240160206040518083038186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf91906130cb565b609d546001600160a01b031691906127ee565b565b6106dc612845565b6106e4611507565b609e54600160a01b90046001600160401b031642108015906107115750609f546001600160401b03164211155b61075d5760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a206e6f20726566756e6420706572696f64000000006044820152606401610632565b3360008181526097602052604090208054600160f01b900461ffff16156107bc5760405162461bcd60e51b815260206004820152601360248201527214d213d5995cdd1a5b99ce8818db185a5b5959606a1b6044820152606401610632565b600181015461ffff161561080b5760405162461bcd60e51b815260206004820152601660248201527514d213d5995cdd1a5b99ce88195b1a5b5a5b985d195960521b6044820152606401610632565b8054600160781b90046001600160781b03166108695760405162461bcd60e51b815260206004820152601a60248201527f53484f56657374696e673a206e6f7420726566756e6461626c650000000000006044820152606401610632565b600181015462010000900460ff16156108c45760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a20616c726561647920726566756e646564000000006044820152606401610632565b8054609e54609b546001600160781b03600160781b84048116936108f6936001600160a01b03938416931691166127ee565b609d54610916906001600160a01b0316846001600160781b0384166127ee565b815460a080546001600160781b039283169260009161093791859116613371565b92506101000a8154816001600160781b0302191690836001600160781b031602179055508060a160008282829054906101000a90046001600160781b031661097f9190613371565b82546101009290920a6001600160781b038181021990931691831602179091556001840180546201000062ff000019909116179055604080516001600160a01b038716815291841660208301527fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d92500160405180910390a15050506106d26001606555565b610a0d6128a6565b60005b82811015610a8c578160986000868685818110610a3d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a529190612ee0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610a84816134dc565b915050610a10565b507f934de86aac2bd6f5a4967899f3a725630a82f782f5965e4eae50a454a953de4b838383604051610ac09392919061314a565b60405180910390a1505050565b610ad56128a6565b6106d26000612900565b60998181548110610aef57600080fd5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b610b216128a6565b610b29611507565b609f54600160481b900461ffff16610b835760405162461bcd60e51b815260206004820152601d60248201527f53484f56657374696e673a206e6f20756e6c6f636b73207061737365640000006044820152606401610632565b609f54600090610ba090600190600160481b900461ffff1661343f565b609a54909150610bb29060019061345a565b8161ffff1610610c175760405162461bcd60e51b815260206004820152602a60248201527f53484f56657374696e673a20656c696d696e6174696e6720696e20746865206c60448201526961737420756e6c6f636b60b01b6064820152608401610632565b60005b82811015610f46576000848483818110610c4457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c599190612ee0565b6001600160a01b038116600090815260976020908152604091829020825160a08101845281546001600160781b03808216808452600160781b830490911694830194909452600160f01b900461ffff9081169482019490945260019091015492831660608201526201000090920460ff161515608083015291925090610d215760405162461bcd60e51b815260206004820152601b60248201527f53484f56657374696e673a206e6f742077686974656c697374656400000000006044820152606401610632565b806080015115610d6a5760405162461bcd60e51b815260206004820152601460248201527314d213d5995cdd1a5b99ce881c99599d5b99195960621b6044820152606401610632565b606081015161ffff1615610dc05760405162461bcd60e51b815260206004820152601e60248201527f53484f56657374696e673a20616c726561647920656c696d696e6174656400006044820152606401610632565b6000610dcf8260000151612952565b90506000610e278260998861ffff1681548110610dfc57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16612980565b90508160a160118282829054906101000a90046001600160781b0316610e4d9190613371565b92506101000a8154816001600160781b0302191690836001600160781b031602179055508060a260008282829054906101000a90046001600160781b0316610e959190613371565b92506101000a8154816001600160781b0302191690836001600160781b03160217905550856001610ec6919061339c565b6001600160a01b038516600081815260976020908152604091829020600101805461ffff191661ffff9586161790558151928352928916928201929092527f2e534232be2bba1dbb7d9f42a931f682e70335382d04258ae54c1e4f7f3fbbea910160405180910390a1505050508080610f3e906134dc565b915050610c1a565b50505050565b610f546128a6565b609f54600160401b900460ff16610fc25760405162461bcd60e51b815260206004820152602c60248201527f53484f56657374696e673a2077686974656c697374696e67206e6f7420616c6c60448201526b6f77656420616e796d6f726560a01b6064820152608401610632565b8561100f5760405162461bcd60e51b815260206004820152601d60248201527f53484f56657374696e673a207a65726f206c656e6774682061727261790000006044820152606401610632565b85841461102e5760405162461bcd60e51b81526004016106329061325b565b85821461104d5760405162461bcd60e51b81526004016106329061325b565b60008060005b888110156114525760008a8a8381811061107d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110929190612ee0565b609c549091506001600160a01b03808316911614156111af578888838181106110cb57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110e0919061308c565b609f8054600b90611102908490600160581b90046001600160781b0316613371565b92506101000a8154816001600160781b0302191690836001600160781b0316021790555061116389898481811061114957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061115e919061308c565b612952565b60a18054601190611185908490600160881b90046001600160781b0316613371565b92506101000a8154816001600160781b0302191690836001600160781b0316021790555050611440565b6001600160a01b0381166000908152609760205260409020546001600160781b03161561121e5760405162461bcd60e51b815260206004820152601f60248201527f53484f56657374696e673a20616c72656164792077686974656c6973746564006044820152606401610632565b88888381811061123e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611253919061308c565b6001600160a01b038216600090815260976020526040902080546001600160781b0319166001600160781b03929092169190911790558686838181106112a957634e487b7160e01b600052603260045260246000fd5b90506020020160208101906112be919061308c565b6001600160a01b038216600090815260976020526040902080546001600160781b0392909216600160781b026effffffffffffffffffffffffffffff60781b1990921691909117905588888381811061132757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061133c919061308c565b6113469085613371565b935086868381811061136857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061137d919061308c565b6113879084613371565b92507ff5c74de6cec9e002af662bfb79cabd341487707a7d26654a6a0326ab718649ca8b8b848181106113ca57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906113df9190612ee0565b8a8a858181106113ff57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611414919061308c565b604080516001600160a01b0390931683526001600160781b0390911660208301520160405180910390a1505b8061144a816134dc565b915050611053565b5081609f600b8282829054906101000a90046001600160781b03166114779190613371565b92506101000a8154816001600160781b0302191690836001600160781b031602179055508060a0600f8282829054906101000a90046001600160781b03166114bf9190613371565b92506101000a8154816001600160781b0302191690836001600160781b0316021790555082156114fc57609f805468ff0000000000000000191690555b505050505050505050565b600061151161158a565b609f5490915061ffff600160481b9091048116908216111561158757609f80546affff0000000000000000001916600160481b61ffff8416908102919091179091556040519081527f51d949e894d194a06df7af6fb215f324ab4717f75f3b9efcb57210c3a68087259060200160405180910390a15b50565b609b54600090600160a01b90046001600160401b03164210156115ef5760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a206265666f726520737461727454696d65000000006044820152606401610632565b609b5460009061160f90600160a01b90046001600160401b03164261345a565b609a54609f54600160481b900461ffff1693509091505b808361ffff161080156116815750609a8361ffff168154811061165957634e487b7160e01b600052603260045260246000fd5b6000918252602090912060088204015460079091166004026101000a900463ffffffff168210155b156116985782611690816134ba565b935050611626565b505090565b609a8181548110610aef57600080fd5b6001600160a01b03811660009081526097602052604081205482906001600160781b031661171d5760405162461bcd60e51b815260206004820152601b60248201527f53484f56657374696e673a206e6f742077686974656c697374656400000000006044820152606401610632565b611725612845565b61172d611507565b6001600160a01b038316600081815260976020908152604091829020825160a08101845281546001600160781b038082168352600160781b8204169382019390935261ffff600160f01b90930483169381019390935260010154908116606083015260ff62010000909104161515608082015290331461180157609f546001600160401b031642116118015760405162461bcd60e51b815260206004820152601960248201527f53484f56657374696e673a20726566756e6420706572696f64000000000000006044820152606401610632565b609f54600160481b900461ffff1661185b5760405162461bcd60e51b815260206004820152601d60248201527f53484f56657374696e673a206e6f20756e6c6f636b73207061737365640000006044820152606401610632565b609f54604082015161ffff600160481b90920482169116106118bf5760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a206e6f7468696e6720746f20636c61696d000000006044820152606401610632565b8060800151156119085760405162461bcd60e51b815260206004820152601460248201527314d213d5995cdd1a5b99ce881c99599d5b99195960621b6044820152606401610632565b6001600160a01b03841660009081526098602052604090205460ff16156119675760405162461bcd60e51b815260206004820152601360248201527214d213d5995cdd1a5b99ce88189b1bd8dad959606a1b6044820152606401610632565b609f5460009061198490600190600160481b900461ffff1661343f565b606083015190915061ffff1615611a0857816060015161ffff16826040015161ffff16106119f45760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a206e6f7468696e6720746f20636c61696d000000006044820152606401610632565b60018260600151611a05919061343f565b90505b600080836040015161ffff1611611a20576000611a7c565b609960018460400151611a33919061343f565b61ffff1681548110611a5557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff165b9050611ae183600001518260998561ffff1681548110611aac57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16611adc9190613471565b612980565b9450611aec85612952565b9450611af982600161339c565b61ffff90811660408086019182526001600160a01b03808a16600090815260976020908152929020875181549389015194518616600160f01b026001600160f01b036001600160781b03968716600160781b026001600160f01b031990961692871692909217949094171692909217825560608701516001909201805460808901511515620100000262ffffff199091169390951692909217939093179055609b54611baa921690889088166127ee565b6040805161ffff841681526001600160781b03871660208201526001600160a01b038816917fe53ee7234965d7ed82340b976c78e38c0fa06bb7ac6864bec5277059d4967b53910160405180910390a2505050611c076001606555565b50919050565b6000611c18336116ad565b905090565b600080611c28612845565b611c30611507565b609f5460a154600160481b90910461ffff908116600160781b9092041610611c9a5760405162461bcd60e51b815260206004820152601e60248201527f53484f56657374696e673a206e6f206665657320746f20636f6c6c65637400006044820152606401610632565b609f54600090611cb790600190600160481b900461ffff1661343f565b60a154909150600090600160781b900461ffff16611cd6576000611d3c565b60a154609990611cf390600190600160781b900461ffff1661343f565b61ffff1681548110611d1557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff165b60a054609f54919250600091611d9091611d6a916001600160781b0391821691600160581b90910416613417565b8360998661ffff1681548110611aac57634e487b7160e01b600052603260045260246000fd5b9050611dae81609c60149054906101000a900463ffffffff16612980565b94506000611df060a160119054906101000a90046001600160781b031660998661ffff1681548110610dfc57634e487b7160e01b600052603260045260246000fd5b60a254909150611e09906001600160781b031682613417565b60a280546001600160781b0319166001600160781b03841617905594506000611e328688613371565b9050611e3f85600161339c565b60a1805461ffff92909216600160781b0261ffff60781b19909216919091179055609c54609b54611e86916001600160a01b0391821691166001600160781b0384166127ee565b6040805161ffff871681526001600160781b03838116602083015288168183015290517fcadc637e639b10c483bc9665c0f04cdd10478b94d3c7afd157af7499e05cb5df9181900360600190a15050505050611ee26001606555565b9091565b611eee6128a6565b6001600160a01b038116611f535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610632565b61158781612900565b600054610100900460ff1615808015611f7c5750600054600160ff909116105b80611f965750303b158015611f96575060005460ff166001145b611ff95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610632565b6000805460ff19166001179055801561201c576000805461ff0019166101001790555b6120246129b0565b61202c6129df565b600061203b6020840184612ee0565b6001600160a01b0316141561209d5760405162461bcd60e51b815260206004820152602260248201527f53484f56657374696e673a2073686f20746f6b656e207a65726f206164647265604482015261737360f01b6064820152608401610632565b60006120ac602084018461332a565b9050116120fb5760405162461bcd60e51b815260206004820181905260248201527f53484f56657374696e673a203020756e6c6f636b2070657263656e74616765736044820152606401610632565b612108602083018361332a565b9050612117604084018461332a565b9050146121365760405162461bcd60e51b81526004016106329061325b565b620f424061214a60808401606085016130e3565b63ffffffff1611156121b95760405162461bcd60e51b815260206004820152603260248201527f53484f56657374696e673a2062617365206665652070657263656e74616765206044820152713120686967686572207468616e203130302560701b6064820152608401610632565b60006121cb60a0840160808501612ee0565b6001600160a01b031614156122315760405162461bcd60e51b815260206004820152602660248201527f53484f56657374696e673a2066656520636f6c6c6563746f72207a65726f206160448201526564647265737360d01b6064820152608401610632565b4261224260c0840160a08501613107565b6001600160401b0316116122a95760405162461bcd60e51b815260206004820152602860248201527f53484f56657374696e673a2073746172742074696d65206d75737420626520696044820152676e2066757475726560c01b6064820152608401610632565b60006122f26122bb602085018561332a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a0e92505050565b905060006123066122bb604086018661332a565b9050620f424063ffffffff168260018451612321919061345a565b8151811061233f57634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff16146123a95760405162461bcd60e51b815260206004820152602660248201527f53484f56657374696e673a20696e76616c696420756e6c6f636b2070657263656044820152656e746167657360d01b6064820152608401610632565b6123b960e0850160c08601612ee0565b6001600160a01b03166123cf6020860186612ee0565b6001600160a01b031614156124265760405162461bcd60e51b815260206004820152601760248201527f53484f56657374696e673a2073616d6520746f6b656e730000000000000000006044820152606401610632565b600061243860e0860160c08701612ee0565b6001600160a01b03161461252a5761245660c0850160a08601613107565b6001600160401b031661247161012086016101008701613107565b6001600160401b031610156124985760405162461bcd60e51b8152600401610632906131d6565b6124aa61012085016101008601613107565b6001600160401b03166124c561014086016101208701613107565b6001600160401b0316116124eb5760405162461bcd60e51b8152600401610632906132e9565b60006124fe610100860160e08701612ee0565b6001600160a01b031614156125255760405162461bcd60e51b815260040161063290613219565b6125d3565b61253c61012085016101008601613107565b6001600160401b0316156125625760405162461bcd60e51b8152600401610632906131d6565b61257461014085016101208601613107565b6001600160401b03161561259a5760405162461bcd60e51b8152600401610632906132e9565b60006125ad610100860160e08701612ee0565b6001600160a01b0316146125d35760405162461bcd60e51b815260040161063290613219565b6125e06020850185612ee0565b609b80546001600160a01b0319166001600160a01b03929092169190911790558151612613906099906020850190612dd3565b50805161262790609a906020840190612dd3565b5061263860808501606086016130e3565b609c805463ffffffff92909216600160a01b0263ffffffff60a01b1990921691909117905561266d60a0850160808601612ee0565b609c80546001600160a01b0319166001600160a01b039290921691909117905561269d60c0850160a08601613107565b609b80546001600160401b0392909216600160a01b0267ffffffffffffffff60a01b199092169190911790556126d960e0850160c08601612ee0565b609d80546001600160a01b0319166001600160a01b039290921691909117905561270a610100850160e08601612ee0565b609e80546001600160a01b0319166001600160a01b039290921691909117905561273c61012085016101008601613107565b609e80546001600160401b0392909216600160a01b0267ffffffffffffffff60a01b1990921691909117905561277a61014085016101208601613107565b609f805468ffffffffffffffffff19166001600160401b039290921691909117600160401b179055505080156127ea576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612840908490612b32565b505050565b600260655414156128985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610632565b6002606555565b6001606555565b6033546001600160a01b031633146106d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610632565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061297082609c60149054906101000a900463ffffffff16612980565b61297a9083613417565b92915050565b6000620f424061299f63ffffffff84166001600160781b0386166133f8565b6129a991906133d8565b9392505050565b600054610100900460ff166129d75760405162461bcd60e51b81526004016106329061329e565b6106d2612c04565b600054610100900460ff16612a065760405162461bcd60e51b81526004016106329061329e565b6106d2612c2b565b80516060906000816001600160401b03811115612a3b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612a64578160200160208202803683370190505b5090506000805b83811015612b28578015612aae5782612a8560018361345a565b81518110612aa357634e487b7160e01b600052603260045260246000fd5b602002602001015191505b858181518110612ace57634e487b7160e01b600052603260045260246000fd5b602002602001015182612ae191906133b9565b838281518110612b0157634e487b7160e01b600052603260045260246000fd5b63ffffffff9092166020928302919091019091015280612b20816134dc565b915050612a6b565b5090949350505050565b6000612b87826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c5b9092919063ffffffff16565b8051909150156128405780806020019051810190612ba59190613038565b6128405760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610632565b600054610100900460ff1661289f5760405162461bcd60e51b81526004016106329061329e565b600054610100900460ff16612c525760405162461bcd60e51b81526004016106329061329e565b6106d233612900565b6060612c6a8484600085612c72565b949350505050565b606082471015612cd35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610632565b843b612d215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610632565b600080866001600160a01b03168587604051612d3d919061312e565b60006040518083038185875af1925050503d8060008114612d7a576040519150601f19603f3d011682016040523d82523d6000602084013e612d7f565b606091505b5091509150612d8f828286612d9a565b979650505050505050565b60608315612da95750816129a9565b825115612db95782518084602001fd5b8160405162461bcd60e51b815260040161063291906131a3565b82805482825590600052602060002090600701600890048101928215612e725791602002820160005b83821115612e4057835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302612dfc565b8015612e705782816101000a81549063ffffffff0219169055600401602081600301049283019260010302612e40565b505b50612e7e929150612e82565b5090565b5b80821115612e7e5760008155600101612e83565b60008083601f840112612ea8578182fd5b5081356001600160401b03811115612ebe578182fd5b6020830191508360208260051b8501011115612ed957600080fd5b9250929050565b600060208284031215612ef1578081fd5b81356129a98161350d565b60008060208385031215612f0e578081fd5b82356001600160401b03811115612f23578182fd5b612f2f85828601612e97565b90969095509350505050565b60008060008060008060006080888a031215612f55578283fd5b87356001600160401b0380821115612f6b578485fd5b612f778b838c01612e97565b909950975060208a0135915080821115612f8f578485fd5b612f9b8b838c01612e97565b909750955060408a0135915080821115612fb3578485fd5b50612fc08a828b01612e97565b9094509250506060880135612fd481613522565b8091505092959891949750929550565b600080600060408486031215612ff8578283fd5b83356001600160401b0381111561300d578384fd5b61301986828701612e97565b909450925050602084013561302d81613522565b809150509250925092565b600060208284031215613049578081fd5b81516129a981613522565b600060208284031215613065578081fd5b81356001600160401b0381111561307a578182fd5b820161014081850312156129a9578182fd5b60006020828403121561309d578081fd5b81356001600160781b03811681146129a9578182fd5b6000602082840312156130c4578081fd5b5035919050565b6000602082840312156130dc578081fd5b5051919050565b6000602082840312156130f4578081fd5b813563ffffffff811681146129a9578182fd5b600060208284031215613118578081fd5b81356001600160401b03811681146129a9578182fd5b6000825161314081846020870161348e565b9190910192915050565b6040808252810183905260008460608301825b8681101561318d5782356131708161350d565b6001600160a01b031682526020928301929091019060010161315d565b5080925050508215156020830152949350505050565b60208152600082518060208401526131c281604085016020870161348e565b601f01601f19169190910160400192915050565b60208082526023908201527f53484f56657374696e673a20696e76616c696420726566756e64537461727454604082015262696d6560e81b606082015260800190565b60208082526022908201527f53484f56657374696e673a20696e76616c696420726566756e6452656365697660408201526132b960f11b606082015260800190565b60208082526023908201527f53484f56657374696e673a20646966666572656e74206172726179206c656e6760408201526274687360e81b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526021908201527f53484f56657374696e673a20696e76616c696420726566756e64456e6454696d6040820152606560f81b606082015260800190565b6000808335601e19843603018112613340578283fd5b8301803591506001600160401b03821115613359578283fd5b6020019150600581901b3603821315612ed957600080fd5b60006001600160781b03808316818516808303821115613393576133936134f7565b01949350505050565b600061ffff808316818516808303821115613393576133936134f7565b600063ffffffff808316818516808303821115613393576133936134f7565b6000826133f357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613412576134126134f7565b500290565b60006001600160781b0383811690831681811015613437576134376134f7565b039392505050565b600061ffff83811690831681811015613437576134376134f7565b60008282101561346c5761346c6134f7565b500390565b600063ffffffff83811690831681811015613437576134376134f7565b60005b838110156134a9578181015183820152602001613491565b83811115610f465750506000910152565b600061ffff808316818114156134d2576134d26134f7565b6001019392505050565b60006000198214156134f0576134f06134f7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461158757600080fd5b801515811461158757600080fdfea2646970667358221220b641c6bd9b91913fb5bdc06b628b46e60b02a319ea3a86f37d388e26b2eaf7f564736f6c63430008040033
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80639b442e3f11610125578063cd1e0355116100ad578063db81213a1161007c578063db81213a1461056c578063f2fde38b14610586578063f53014b414610599578063ffa1ad74146105ac578063ffec0fb5146105b457600080fd5b8063cd1e035514610513578063d1dfb8dc14610526578063d713c3041461053b578063da40ea1d1461055557600080fd5b8063ba93f699116100f4578063ba93f699146104aa578063c31c0018146104bd578063c415b95c146104d0578063c736e1ff146104e3578063c8796572146104eb57600080fd5b80639b442e3f14610470578063a2e6204514610487578063a92b51611461048f578063b28e20c0146104a257600080fd5b80636aba899b116101a8578063798c87ce11610177578063798c87ce146103fe57806388a60946146104265780638c6dd673146104395780638da5cb5b1461044c57806399230a031461045d57600080fd5b80636aba899b14610397578063715018a6146103c957806373fddd16146103d157806378e97925146103e457600080fd5b8063464a59c7116101ef578063464a59c714610323578063590e1ae3146103375780635cb732be1461033f578063604445fd1461036a578063677375c31461037d57600080fd5b8063011852851461022157806306324044146102515780632a8b279a1461025b5780633af2d5e7146102f0575b600080fd5b60a254610234906001600160781b031681565b6040516001600160781b0390911681526020015b60405180910390f35b6102596105c7565b005b6102b4610269366004612ee0565b609760205260009081526040902080546001909101546001600160781b0380831692600160781b81049091169161ffff600160f01b90920482169181169060ff620100009091041685565b604080516001600160781b03968716815295909416602086015261ffff928316938501939093521660608301521515608082015260a001610248565b6103136102fe366004612ee0565b60986020526000908152604090205460ff1681565b6040519015158152602001610248565b609f5461031390600160401b900460ff1681565b6102596106d4565b609d54610352906001600160a01b031681565b6040516001600160a01b039091168152602001610248565b610259610378366004612fe4565b610a05565b60a05461023490600160781b90046001600160781b031681565b609e546103b190600160a01b90046001600160401b031681565b6040516001600160401b039091168152602001610248565b610259610acd565b609f546103b1906001600160401b031681565b609b546103b190600160a01b90046001600160401b031681565b61041161040c3660046130b3565b610adf565b60405163ffffffff9091168152602001610248565b610259610434366004612efc565b610b19565b610259610447366004612f3b565b610f4c565b6033546001600160a01b0316610352565b60a054610234906001600160781b031681565b6099545b60405161ffff9091168152602001610248565b610259611507565b609e54610352906001600160a01b031681565b61047461158a565b6104116104b83660046130b3565b61169d565b6102346104cb366004612ee0565b6116ad565b609c54610352906001600160a01b031681565b610234611c0d565b6104f3611c1d565b604080516001600160781b03938416815292909116602083015201610248565b60a154610234906001600160781b031681565b60a15461047490600160781b900461ffff1681565b60a15461023490600160881b90046001600160781b031681565b609c5461041190600160a01b900463ffffffff1681565b609f5461023490600160581b90046001600160781b031681565b610259610594366004612ee0565b611ee6565b609b54610352906001600160a01b031681565b610411600281565b6102596105c2366004613054565b611f5c565b6033546001600160a01b03163314806105ea5750609e546001600160a01b031633145b61063b5760405162461bcd60e51b815260206004820152601860248201527f53484f56657374696e673a20756e617574686f72697a6564000000000000000060448201526064015b60405180910390fd5b609e54609d546040516370a0823160e01b81523060048201526106d2926001600160a01b039081169216906370a082319060240160206040518083038186803b15801561068757600080fd5b505afa15801561069b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106bf91906130cb565b609d546001600160a01b031691906127ee565b565b6106dc612845565b6106e4611507565b609e54600160a01b90046001600160401b031642108015906107115750609f546001600160401b03164211155b61075d5760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a206e6f20726566756e6420706572696f64000000006044820152606401610632565b3360008181526097602052604090208054600160f01b900461ffff16156107bc5760405162461bcd60e51b815260206004820152601360248201527214d213d5995cdd1a5b99ce8818db185a5b5959606a1b6044820152606401610632565b600181015461ffff161561080b5760405162461bcd60e51b815260206004820152601660248201527514d213d5995cdd1a5b99ce88195b1a5b5a5b985d195960521b6044820152606401610632565b8054600160781b90046001600160781b03166108695760405162461bcd60e51b815260206004820152601a60248201527f53484f56657374696e673a206e6f7420726566756e6461626c650000000000006044820152606401610632565b600181015462010000900460ff16156108c45760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a20616c726561647920726566756e646564000000006044820152606401610632565b8054609e54609b546001600160781b03600160781b84048116936108f6936001600160a01b03938416931691166127ee565b609d54610916906001600160a01b0316846001600160781b0384166127ee565b815460a080546001600160781b039283169260009161093791859116613371565b92506101000a8154816001600160781b0302191690836001600160781b031602179055508060a160008282829054906101000a90046001600160781b031661097f9190613371565b82546101009290920a6001600160781b038181021990931691831602179091556001840180546201000062ff000019909116179055604080516001600160a01b038716815291841660208301527fbb28353e4598c3b9199101a66e0989549b659a59a54d2c27fbb183f1932c8e6d92500160405180910390a15050506106d26001606555565b610a0d6128a6565b60005b82811015610a8c578160986000868685818110610a3d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610a529190612ee0565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905580610a84816134dc565b915050610a10565b507f934de86aac2bd6f5a4967899f3a725630a82f782f5965e4eae50a454a953de4b838383604051610ac09392919061314a565b60405180910390a1505050565b610ad56128a6565b6106d26000612900565b60998181548110610aef57600080fd5b9060005260206000209060089182820401919006600402915054906101000a900463ffffffff1681565b610b216128a6565b610b29611507565b609f54600160481b900461ffff16610b835760405162461bcd60e51b815260206004820152601d60248201527f53484f56657374696e673a206e6f20756e6c6f636b73207061737365640000006044820152606401610632565b609f54600090610ba090600190600160481b900461ffff1661343f565b609a54909150610bb29060019061345a565b8161ffff1610610c175760405162461bcd60e51b815260206004820152602a60248201527f53484f56657374696e673a20656c696d696e6174696e6720696e20746865206c60448201526961737420756e6c6f636b60b01b6064820152608401610632565b60005b82811015610f46576000848483818110610c4457634e487b7160e01b600052603260045260246000fd5b9050602002016020810190610c599190612ee0565b6001600160a01b038116600090815260976020908152604091829020825160a08101845281546001600160781b03808216808452600160781b830490911694830194909452600160f01b900461ffff9081169482019490945260019091015492831660608201526201000090920460ff161515608083015291925090610d215760405162461bcd60e51b815260206004820152601b60248201527f53484f56657374696e673a206e6f742077686974656c697374656400000000006044820152606401610632565b806080015115610d6a5760405162461bcd60e51b815260206004820152601460248201527314d213d5995cdd1a5b99ce881c99599d5b99195960621b6044820152606401610632565b606081015161ffff1615610dc05760405162461bcd60e51b815260206004820152601e60248201527f53484f56657374696e673a20616c726561647920656c696d696e6174656400006044820152606401610632565b6000610dcf8260000151612952565b90506000610e278260998861ffff1681548110610dfc57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16612980565b90508160a160118282829054906101000a90046001600160781b0316610e4d9190613371565b92506101000a8154816001600160781b0302191690836001600160781b031602179055508060a260008282829054906101000a90046001600160781b0316610e959190613371565b92506101000a8154816001600160781b0302191690836001600160781b03160217905550856001610ec6919061339c565b6001600160a01b038516600081815260976020908152604091829020600101805461ffff191661ffff9586161790558151928352928916928201929092527f2e534232be2bba1dbb7d9f42a931f682e70335382d04258ae54c1e4f7f3fbbea910160405180910390a1505050508080610f3e906134dc565b915050610c1a565b50505050565b610f546128a6565b609f54600160401b900460ff16610fc25760405162461bcd60e51b815260206004820152602c60248201527f53484f56657374696e673a2077686974656c697374696e67206e6f7420616c6c60448201526b6f77656420616e796d6f726560a01b6064820152608401610632565b8561100f5760405162461bcd60e51b815260206004820152601d60248201527f53484f56657374696e673a207a65726f206c656e6774682061727261790000006044820152606401610632565b85841461102e5760405162461bcd60e51b81526004016106329061325b565b85821461104d5760405162461bcd60e51b81526004016106329061325b565b60008060005b888110156114525760008a8a8381811061107d57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110929190612ee0565b609c549091506001600160a01b03808316911614156111af578888838181106110cb57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906110e0919061308c565b609f8054600b90611102908490600160581b90046001600160781b0316613371565b92506101000a8154816001600160781b0302191690836001600160781b0316021790555061116389898481811061114957634e487b7160e01b600052603260045260246000fd5b905060200201602081019061115e919061308c565b612952565b60a18054601190611185908490600160881b90046001600160781b0316613371565b92506101000a8154816001600160781b0302191690836001600160781b0316021790555050611440565b6001600160a01b0381166000908152609760205260409020546001600160781b03161561121e5760405162461bcd60e51b815260206004820152601f60248201527f53484f56657374696e673a20616c72656164792077686974656c6973746564006044820152606401610632565b88888381811061123e57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611253919061308c565b6001600160a01b038216600090815260976020526040902080546001600160781b0319166001600160781b03929092169190911790558686838181106112a957634e487b7160e01b600052603260045260246000fd5b90506020020160208101906112be919061308c565b6001600160a01b038216600090815260976020526040902080546001600160781b0392909216600160781b026effffffffffffffffffffffffffffff60781b1990921691909117905588888381811061132757634e487b7160e01b600052603260045260246000fd5b905060200201602081019061133c919061308c565b6113469085613371565b935086868381811061136857634e487b7160e01b600052603260045260246000fd5b905060200201602081019061137d919061308c565b6113879084613371565b92507ff5c74de6cec9e002af662bfb79cabd341487707a7d26654a6a0326ab718649ca8b8b848181106113ca57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906113df9190612ee0565b8a8a858181106113ff57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611414919061308c565b604080516001600160a01b0390931683526001600160781b0390911660208301520160405180910390a1505b8061144a816134dc565b915050611053565b5081609f600b8282829054906101000a90046001600160781b03166114779190613371565b92506101000a8154816001600160781b0302191690836001600160781b031602179055508060a0600f8282829054906101000a90046001600160781b03166114bf9190613371565b92506101000a8154816001600160781b0302191690836001600160781b0316021790555082156114fc57609f805468ff0000000000000000191690555b505050505050505050565b600061151161158a565b609f5490915061ffff600160481b9091048116908216111561158757609f80546affff0000000000000000001916600160481b61ffff8416908102919091179091556040519081527f51d949e894d194a06df7af6fb215f324ab4717f75f3b9efcb57210c3a68087259060200160405180910390a15b50565b609b54600090600160a01b90046001600160401b03164210156115ef5760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a206265666f726520737461727454696d65000000006044820152606401610632565b609b5460009061160f90600160a01b90046001600160401b03164261345a565b609a54609f54600160481b900461ffff1693509091505b808361ffff161080156116815750609a8361ffff168154811061165957634e487b7160e01b600052603260045260246000fd5b6000918252602090912060088204015460079091166004026101000a900463ffffffff168210155b156116985782611690816134ba565b935050611626565b505090565b609a8181548110610aef57600080fd5b6001600160a01b03811660009081526097602052604081205482906001600160781b031661171d5760405162461bcd60e51b815260206004820152601b60248201527f53484f56657374696e673a206e6f742077686974656c697374656400000000006044820152606401610632565b611725612845565b61172d611507565b6001600160a01b038316600081815260976020908152604091829020825160a08101845281546001600160781b038082168352600160781b8204169382019390935261ffff600160f01b90930483169381019390935260010154908116606083015260ff62010000909104161515608082015290331461180157609f546001600160401b031642116118015760405162461bcd60e51b815260206004820152601960248201527f53484f56657374696e673a20726566756e6420706572696f64000000000000006044820152606401610632565b609f54600160481b900461ffff1661185b5760405162461bcd60e51b815260206004820152601d60248201527f53484f56657374696e673a206e6f20756e6c6f636b73207061737365640000006044820152606401610632565b609f54604082015161ffff600160481b90920482169116106118bf5760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a206e6f7468696e6720746f20636c61696d000000006044820152606401610632565b8060800151156119085760405162461bcd60e51b815260206004820152601460248201527314d213d5995cdd1a5b99ce881c99599d5b99195960621b6044820152606401610632565b6001600160a01b03841660009081526098602052604090205460ff16156119675760405162461bcd60e51b815260206004820152601360248201527214d213d5995cdd1a5b99ce88189b1bd8dad959606a1b6044820152606401610632565b609f5460009061198490600190600160481b900461ffff1661343f565b606083015190915061ffff1615611a0857816060015161ffff16826040015161ffff16106119f45760405162461bcd60e51b815260206004820152601c60248201527f53484f56657374696e673a206e6f7468696e6720746f20636c61696d000000006044820152606401610632565b60018260600151611a05919061343f565b90505b600080836040015161ffff1611611a20576000611a7c565b609960018460400151611a33919061343f565b61ffff1681548110611a5557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff165b9050611ae183600001518260998561ffff1681548110611aac57634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff16611adc9190613471565b612980565b9450611aec85612952565b9450611af982600161339c565b61ffff90811660408086019182526001600160a01b03808a16600090815260976020908152929020875181549389015194518616600160f01b026001600160f01b036001600160781b03968716600160781b026001600160f01b031990961692871692909217949094171692909217825560608701516001909201805460808901511515620100000262ffffff199091169390951692909217939093179055609b54611baa921690889088166127ee565b6040805161ffff841681526001600160781b03871660208201526001600160a01b038816917fe53ee7234965d7ed82340b976c78e38c0fa06bb7ac6864bec5277059d4967b53910160405180910390a2505050611c076001606555565b50919050565b6000611c18336116ad565b905090565b600080611c28612845565b611c30611507565b609f5460a154600160481b90910461ffff908116600160781b9092041610611c9a5760405162461bcd60e51b815260206004820152601e60248201527f53484f56657374696e673a206e6f206665657320746f20636f6c6c65637400006044820152606401610632565b609f54600090611cb790600190600160481b900461ffff1661343f565b60a154909150600090600160781b900461ffff16611cd6576000611d3c565b60a154609990611cf390600190600160781b900461ffff1661343f565b61ffff1681548110611d1557634e487b7160e01b600052603260045260246000fd5b90600052602060002090600891828204019190066004029054906101000a900463ffffffff165b60a054609f54919250600091611d9091611d6a916001600160781b0391821691600160581b90910416613417565b8360998661ffff1681548110611aac57634e487b7160e01b600052603260045260246000fd5b9050611dae81609c60149054906101000a900463ffffffff16612980565b94506000611df060a160119054906101000a90046001600160781b031660998661ffff1681548110610dfc57634e487b7160e01b600052603260045260246000fd5b60a254909150611e09906001600160781b031682613417565b60a280546001600160781b0319166001600160781b03841617905594506000611e328688613371565b9050611e3f85600161339c565b60a1805461ffff92909216600160781b0261ffff60781b19909216919091179055609c54609b54611e86916001600160a01b0391821691166001600160781b0384166127ee565b6040805161ffff871681526001600160781b03838116602083015288168183015290517fcadc637e639b10c483bc9665c0f04cdd10478b94d3c7afd157af7499e05cb5df9181900360600190a15050505050611ee26001606555565b9091565b611eee6128a6565b6001600160a01b038116611f535760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610632565b61158781612900565b600054610100900460ff1615808015611f7c5750600054600160ff909116105b80611f965750303b158015611f96575060005460ff166001145b611ff95760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610632565b6000805460ff19166001179055801561201c576000805461ff0019166101001790555b6120246129b0565b61202c6129df565b600061203b6020840184612ee0565b6001600160a01b0316141561209d5760405162461bcd60e51b815260206004820152602260248201527f53484f56657374696e673a2073686f20746f6b656e207a65726f206164647265604482015261737360f01b6064820152608401610632565b60006120ac602084018461332a565b9050116120fb5760405162461bcd60e51b815260206004820181905260248201527f53484f56657374696e673a203020756e6c6f636b2070657263656e74616765736044820152606401610632565b612108602083018361332a565b9050612117604084018461332a565b9050146121365760405162461bcd60e51b81526004016106329061325b565b620f424061214a60808401606085016130e3565b63ffffffff1611156121b95760405162461bcd60e51b815260206004820152603260248201527f53484f56657374696e673a2062617365206665652070657263656e74616765206044820152713120686967686572207468616e203130302560701b6064820152608401610632565b60006121cb60a0840160808501612ee0565b6001600160a01b031614156122315760405162461bcd60e51b815260206004820152602660248201527f53484f56657374696e673a2066656520636f6c6c6563746f72207a65726f206160448201526564647265737360d01b6064820152608401610632565b4261224260c0840160a08501613107565b6001600160401b0316116122a95760405162461bcd60e51b815260206004820152602860248201527f53484f56657374696e673a2073746172742074696d65206d75737420626520696044820152676e2066757475726560c01b6064820152608401610632565b60006122f26122bb602085018561332a565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612a0e92505050565b905060006123066122bb604086018661332a565b9050620f424063ffffffff168260018451612321919061345a565b8151811061233f57634e487b7160e01b600052603260045260246000fd5b602002602001015163ffffffff16146123a95760405162461bcd60e51b815260206004820152602660248201527f53484f56657374696e673a20696e76616c696420756e6c6f636b2070657263656044820152656e746167657360d01b6064820152608401610632565b6123b960e0850160c08601612ee0565b6001600160a01b03166123cf6020860186612ee0565b6001600160a01b031614156124265760405162461bcd60e51b815260206004820152601760248201527f53484f56657374696e673a2073616d6520746f6b656e730000000000000000006044820152606401610632565b600061243860e0860160c08701612ee0565b6001600160a01b03161461252a5761245660c0850160a08601613107565b6001600160401b031661247161012086016101008701613107565b6001600160401b031610156124985760405162461bcd60e51b8152600401610632906131d6565b6124aa61012085016101008601613107565b6001600160401b03166124c561014086016101208701613107565b6001600160401b0316116124eb5760405162461bcd60e51b8152600401610632906132e9565b60006124fe610100860160e08701612ee0565b6001600160a01b031614156125255760405162461bcd60e51b815260040161063290613219565b6125d3565b61253c61012085016101008601613107565b6001600160401b0316156125625760405162461bcd60e51b8152600401610632906131d6565b61257461014085016101208601613107565b6001600160401b03161561259a5760405162461bcd60e51b8152600401610632906132e9565b60006125ad610100860160e08701612ee0565b6001600160a01b0316146125d35760405162461bcd60e51b815260040161063290613219565b6125e06020850185612ee0565b609b80546001600160a01b0319166001600160a01b03929092169190911790558151612613906099906020850190612dd3565b50805161262790609a906020840190612dd3565b5061263860808501606086016130e3565b609c805463ffffffff92909216600160a01b0263ffffffff60a01b1990921691909117905561266d60a0850160808601612ee0565b609c80546001600160a01b0319166001600160a01b039290921691909117905561269d60c0850160a08601613107565b609b80546001600160401b0392909216600160a01b0267ffffffffffffffff60a01b199092169190911790556126d960e0850160c08601612ee0565b609d80546001600160a01b0319166001600160a01b039290921691909117905561270a610100850160e08601612ee0565b609e80546001600160a01b0319166001600160a01b039290921691909117905561273c61012085016101008601613107565b609e80546001600160401b0392909216600160a01b0267ffffffffffffffff60a01b1990921691909117905561277a61014085016101208601613107565b609f805468ffffffffffffffffff19166001600160401b039290921691909117600160401b179055505080156127ea576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052612840908490612b32565b505050565b600260655414156128985760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610632565b6002606555565b6001606555565b6033546001600160a01b031633146106d25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610632565b603380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600061297082609c60149054906101000a900463ffffffff16612980565b61297a9083613417565b92915050565b6000620f424061299f63ffffffff84166001600160781b0386166133f8565b6129a991906133d8565b9392505050565b600054610100900460ff166129d75760405162461bcd60e51b81526004016106329061329e565b6106d2612c04565b600054610100900460ff16612a065760405162461bcd60e51b81526004016106329061329e565b6106d2612c2b565b80516060906000816001600160401b03811115612a3b57634e487b7160e01b600052604160045260246000fd5b604051908082528060200260200182016040528015612a64578160200160208202803683370190505b5090506000805b83811015612b28578015612aae5782612a8560018361345a565b81518110612aa357634e487b7160e01b600052603260045260246000fd5b602002602001015191505b858181518110612ace57634e487b7160e01b600052603260045260246000fd5b602002602001015182612ae191906133b9565b838281518110612b0157634e487b7160e01b600052603260045260246000fd5b63ffffffff9092166020928302919091019091015280612b20816134dc565b915050612a6b565b5090949350505050565b6000612b87826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612c5b9092919063ffffffff16565b8051909150156128405780806020019051810190612ba59190613038565b6128405760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610632565b600054610100900460ff1661289f5760405162461bcd60e51b81526004016106329061329e565b600054610100900460ff16612c525760405162461bcd60e51b81526004016106329061329e565b6106d233612900565b6060612c6a8484600085612c72565b949350505050565b606082471015612cd35760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610632565b843b612d215760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610632565b600080866001600160a01b03168587604051612d3d919061312e565b60006040518083038185875af1925050503d8060008114612d7a576040519150601f19603f3d011682016040523d82523d6000602084013e612d7f565b606091505b5091509150612d8f828286612d9a565b979650505050505050565b60608315612da95750816129a9565b825115612db95782518084602001fd5b8160405162461bcd60e51b815260040161063291906131a3565b82805482825590600052602060002090600701600890048101928215612e725791602002820160005b83821115612e4057835183826101000a81548163ffffffff021916908363ffffffff1602179055509260200192600401602081600301049283019260010302612dfc565b8015612e705782816101000a81549063ffffffff0219169055600401602081600301049283019260010302612e40565b505b50612e7e929150612e82565b5090565b5b80821115612e7e5760008155600101612e83565b60008083601f840112612ea8578182fd5b5081356001600160401b03811115612ebe578182fd5b6020830191508360208260051b8501011115612ed957600080fd5b9250929050565b600060208284031215612ef1578081fd5b81356129a98161350d565b60008060208385031215612f0e578081fd5b82356001600160401b03811115612f23578182fd5b612f2f85828601612e97565b90969095509350505050565b60008060008060008060006080888a031215612f55578283fd5b87356001600160401b0380821115612f6b578485fd5b612f778b838c01612e97565b909950975060208a0135915080821115612f8f578485fd5b612f9b8b838c01612e97565b909750955060408a0135915080821115612fb3578485fd5b50612fc08a828b01612e97565b9094509250506060880135612fd481613522565b8091505092959891949750929550565b600080600060408486031215612ff8578283fd5b83356001600160401b0381111561300d578384fd5b61301986828701612e97565b909450925050602084013561302d81613522565b809150509250925092565b600060208284031215613049578081fd5b81516129a981613522565b600060208284031215613065578081fd5b81356001600160401b0381111561307a578182fd5b820161014081850312156129a9578182fd5b60006020828403121561309d578081fd5b81356001600160781b03811681146129a9578182fd5b6000602082840312156130c4578081fd5b5035919050565b6000602082840312156130dc578081fd5b5051919050565b6000602082840312156130f4578081fd5b813563ffffffff811681146129a9578182fd5b600060208284031215613118578081fd5b81356001600160401b03811681146129a9578182fd5b6000825161314081846020870161348e565b9190910192915050565b6040808252810183905260008460608301825b8681101561318d5782356131708161350d565b6001600160a01b031682526020928301929091019060010161315d565b5080925050508215156020830152949350505050565b60208152600082518060208401526131c281604085016020870161348e565b601f01601f19169190910160400192915050565b60208082526023908201527f53484f56657374696e673a20696e76616c696420726566756e64537461727454604082015262696d6560e81b606082015260800190565b60208082526022908201527f53484f56657374696e673a20696e76616c696420726566756e6452656365697660408201526132b960f11b606082015260800190565b60208082526023908201527f53484f56657374696e673a20646966666572656e74206172726179206c656e6760408201526274687360e81b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60208082526021908201527f53484f56657374696e673a20696e76616c696420726566756e64456e6454696d6040820152606560f81b606082015260800190565b6000808335601e19843603018112613340578283fd5b8301803591506001600160401b03821115613359578283fd5b6020019150600581901b3603821315612ed957600080fd5b60006001600160781b03808316818516808303821115613393576133936134f7565b01949350505050565b600061ffff808316818516808303821115613393576133936134f7565b600063ffffffff808316818516808303821115613393576133936134f7565b6000826133f357634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615613412576134126134f7565b500290565b60006001600160781b0383811690831681811015613437576134376134f7565b039392505050565b600061ffff83811690831681811015613437576134376134f7565b60008282101561346c5761346c6134f7565b500390565b600063ffffffff83811690831681811015613437576134376134f7565b60005b838110156134a9578181015183820152602001613491565b83811115610f465750506000910152565b600061ffff808316818114156134d2576134d26134f7565b6001019392505050565b60006000198214156134f0576134f06134f7565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b038116811461158757600080fd5b801515811461158757600080fdfea2646970667358221220b641c6bd9b91913fb5bdc06b628b46e60b02a319ea3a86f37d388e26b2eaf7f564736f6c63430008040033
Deployed Bytecode Sourcemap
40832:15860:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42975:48;;;;;-1:-1:-1;;;;;42975:48:0;;;;;;-1:-1:-1;;;;;23306:45:1;;;23288:64;;23276:2;23261:18;42975:48:0;;;;;;;;46381:237;;;:::i;:::-;;42190:38;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42190:38:0;;;;-1:-1:-1;;;42190:38:0;;;;;;;-1:-1:-1;;;42190:38:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24003:15:1;;;23985:34;;24055:15;;;;24050:2;24035:18;;24028:43;24090:6;24132:15;;;24112:18;;;24105:43;;;;24184:15;24179:2;24164:18;;24157:43;24244:14;24237:22;24231:3;24216:19;;24209:51;23921:3;23906:19;42190:38:0;23888:378:1;42235:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;7944:14:1;;7937:22;7919:41;;7907:2;7892:18;42235:44:0;7874:92:1;42638:31:0;;;;;-1:-1:-1;;;42638:31:0;;;;;;51015:945;;;:::i;42500:25::-;;;;;-1:-1:-1;;;;;42500:25:0;;;;;;-1:-1:-1;;;;;5728:32:1;;;5710:51;;5698:2;5683:18;42500:25:0;5665:102:1;48791:260:0;;;;;;:::i;:::-;;:::i;42801:36::-;;;;;-1:-1:-1;;;42801:36:0;;-1:-1:-1;;;;;42801:36:0;;;42568:29;;;;;-1:-1:-1;;;42568:29:0;;-1:-1:-1;;;;;42568:29:0;;;;;;-1:-1:-1;;;;;25530:31:1;;;25512:50;;25500:2;25485:18;42568:29:0;25467:101:1;20077:103:0;;;:::i;42604:27::-;;;;;-1:-1:-1;;;;;42604:27:0;;;42395:23;;;;;-1:-1:-1;;;42395:23:0;;-1:-1:-1;;;;;42395:23:0;;;42288:33;;;;;;:::i;:::-;;:::i;:::-;;;25345:10:1;25333:23;;;25315:42;;25303:2;25288:18;42288:33:0;25270:93:1;52202:1182:0;;;;;;:::i;:::-;;:::i;46875:1644::-;;;;;;:::i;:::-;;:::i;19436:87::-;19509:6;;-1:-1:-1;;;;;19509:6:0;19436:87;;42754:38;;;;;-1:-1:-1;;;;;42754:38:0;;;55745:137;55849:17;:24;55745:137;;;24445:6:1;24433:19;;;24415:38;;24403:2;24388:18;55745:137:0;24370:89:1;54936:266:0;;;:::i;42532:29::-;;;;;-1:-1:-1;;;;;42532:29:0;;;55242:495;;;:::i;42328:29::-;;;;;;:::i;:::-;;:::i;49280:1447::-;;;;;;:::i;:::-;;:::i;42425:27::-;;;;;-1:-1:-1;;;;;42425:27:0;;;50791:111;;;:::i;53719:1145::-;;;:::i;:::-;;;;-1:-1:-1;;;;;23606:15:1;;;23588:34;;23658:15;;;;23653:2;23638:18;;23631:43;23510:18;53719:1145:0;23492:188:1;42844:34:0;;;;;-1:-1:-1;;;;;42844:34:0;;;42887:39;;;;;-1:-1:-1;;;42887:39:0;;;;;;42933:35;;;;;-1:-1:-1;;;42933:35:0;;-1:-1:-1;;;;;42933:35:0;;;42459:32;;;;;-1:-1:-1;;;42459:32:0;;;;;;42710:37;;;;;-1:-1:-1;;;42710:37:0;;-1:-1:-1;;;;;42710:37:0;;;20335:201;;;;;;:::i;:::-;;:::i;42366:22::-;;;;;-1:-1:-1;;;;;42366:22:0;;;40959:34;;40992:1;40959:34;;43941:2347;;;;;;:::i;:::-;;:::i;46381:237::-;19509:6;;-1:-1:-1;;;;;19509:6:0;46439:10;:21;;:53;;-1:-1:-1;46478:14:0;;-1:-1:-1;;;;;46478:14:0;46464:10;:28;46439:53;46431:90;;;;-1:-1:-1;;;46431:90:0;;10912:2:1;46431:90:0;;;10894:21:1;10951:2;10931:18;;;10924:30;10990:26;10970:18;;;10963:54;11034:18;;46431:90:0;;;;;;;;;46557:14;;46573:11;;:36;;-1:-1:-1;;;46573:36:0;;46603:4;46573:36;;;5710:51:1;46532:78:0;;-1:-1:-1;;;;;46557:14:0;;;;46573:11;;:21;;5683:18:1;;46573:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46532:11;;-1:-1:-1;;;;;46532:11:0;;:78;:24;:78::i;:::-;46381:237::o;51015:945::-;23773:21;:19;:21::i;:::-;51066:8:::1;:6;:8::i;:::-;51114:15;::::0;-1:-1:-1;;;51114:15:0;::::1;-1:-1:-1::0;;;;;51114:15:0::1;51095;:34;::::0;::::1;::::0;:70:::1;;-1:-1:-1::0;51152:13:0::1;::::0;-1:-1:-1;;;;;51152:13:0::1;51133:15;:32;;51095:70;51087:111;;;::::0;-1:-1:-1;;;51087:111:0;;16569:2:1;51087:111:0::1;::::0;::::1;16551:21:1::0;16608:2;16588:18;;;16581:30;16647;16627:18;;;16620:58;16695:18;;51087:111:0::1;16541:178:1::0;51087:111:0::1;51233:10;51211:19;51274::::0;;;:6:::1;:19;::::0;;;;51314:24;;-1:-1:-1;;;51314:24:0;::::1;;;:29:::0;51306:61:::1;;;::::0;-1:-1:-1;;;51306:61:0;;19122:2:1;51306:61:0::1;::::0;::::1;19104:21:1::0;19161:2;19141:18;;;19134:30;-1:-1:-1;;;19180:18:1;;;19173:49;19239:18;;51306:61:0::1;19094:169:1::0;51306:61:0::1;51386:26;::::0;::::1;::::0;::::1;;:31:::0;51378:66:::1;;;::::0;-1:-1:-1;;;51378:66:0;;8982:2:1;51378:66:0::1;::::0;::::1;8964:21:1::0;9021:2;9001:18;;;8994:30;-1:-1:-1;;;9040:18:1;;;9033:52;9102:18;;51378:66:0::1;8954:172:1::0;51378:66:0::1;51463:21:::0;;-1:-1:-1;;;51463:21:0;::::1;-1:-1:-1::0;;;;;51463:21:0::1;51455:64;;;::::0;-1:-1:-1;;;51455:64:0;;21457:2:1;51455:64:0::1;::::0;::::1;21439:21:1::0;21496:2;21476:18;;;21469:30;21535:28;21515:18;;;21508:56;21581:18;;51455:64:0::1;21429:176:1::0;51455:64:0::1;51539:13;::::0;::::1;::::0;;;::::1;;;51538:14;51530:55;;;::::0;-1:-1:-1;;;51530:55:0;;11265:2:1;51530:55:0::1;::::0;::::1;11247:21:1::0;11304:2;11284:18;;;11277:30;11343;11323:18;;;11316:58;11391:18;;51530:55:0::1;11237:178:1::0;51530:55:0::1;51621:21:::0;;51675:14:::1;::::0;51653:8:::1;::::0;-1:-1:-1;;;;;;;;51621:21:0;::::1;::::0;::::1;::::0;51653:54:::1;::::0;-1:-1:-1;;;;;51653:8:0;;::::1;::::0;51675:14:::1;::::0;51691:15:::1;51653:21;:54::i;:::-;51718:11;::::0;:51:::1;::::0;-1:-1:-1;;;;;51718:11:0::1;51743::::0;-1:-1:-1;;;;;51718:51:0;::::1;:24;:51::i;:::-;51809:15:::0;;51782:23:::1;:42:::0;;-1:-1:-1;;;;;51809:15:0;;::::1;::::0;::::1;::::0;51782:42:::1;::::0;51809:15;;51782:42:::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;51782:42:0::1;;;;;-1:-1:-1::0;;;;;51782:42:0::1;;;;;;51858:12;51835:19;;:35;;;;;;;;;;-1:-1:-1::0;;;;;51835:35:0::1;;;;;:::i;:::-;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;;;51835:35:0;;::::1;;::::0;;::::1;::::0;;::::1;;;::::0;;;-1:-1:-1;51883:13:0;::::1;:20:::0;;;-1:-1:-1;;51883:20:0;;::::1;;::::0;;51919:33:::1;::::0;;-1:-1:-1;;;;;5964:32:1;;5946:51;;6033:45;;;6028:2;6013:18;;6006:73;51919:33:0::1;::::0;-1:-1:-1;5919:18:1;51919:33:0::1;;;;;;;23805:1;;;23817:20:::0;23034:1;24337:7;:22;24154:213;48791:260;19322:13;:11;:13::i;:::-;48892:6:::1;48887:109;48900:24:::0;;::::1;48887:109;;;48979:5;48946:12;:30;48959:13;;48973:1;48959:16;;;;;-1:-1:-1::0;;;48959:16:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48946:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;48946:30:0;:38;;-1:-1:-1;;48946:38:0::1;::::0;::::1;;::::0;;;::::1;::::0;;48926:3;::::1;::::0;::::1;:::i;:::-;;;;48887:109;;;;49011:32;49022:13;;49037:5;49011:32;;;;;;;;:::i;:::-;;;;;;;;48791:260:::0;;;:::o;20077:103::-;19322:13;:11;:13::i;:::-;20142:30:::1;20169:1;20142:18;:30::i;42288:33::-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52202:1182::-;19322:13;:11;:13::i;:::-;52291:8:::1;:6;:8::i;:::-;52318:18;::::0;-1:-1:-1;;;52318:18:0;::::1;;;52310:64;;;::::0;-1:-1:-1;;;52310:64:0;;15446:2:1;52310:64:0::1;::::0;::::1;15428:21:1::0;15485:2;15465:18;;;15458:30;15524:31;15504:18;;;15497:59;15573:18;;52310:64:0::1;15418:179:1::0;52310:64:0::1;52408:18;::::0;52385:20:::1;::::0;52408:22:::1;::::0;52429:1:::1;::::0;-1:-1:-1;;;52408:18:0;::::1;;;:22;:::i;:::-;52465:13;:20:::0;52385:45;;-1:-1:-1;52465:24:0::1;::::0;52488:1:::1;::::0;52465:24:::1;:::i;:::-;52449:13;:40;;;52441:95;;;::::0;-1:-1:-1;;;52441:95:0;;22531:2:1;52441:95:0::1;::::0;::::1;22513:21:1::0;22570:2;22550:18;;;22543:30;22609:34;22589:18;;;22582:62;-1:-1:-1;;;22660:18:1;;;22653:40;22710:19;;52441:95:0::1;22503:232:1::0;52441:95:0::1;52554:9;52549:828;52565:24:::0;;::::1;52549:828;;;52611:19;52633:13;;52647:1;52633:16;;;;;-1:-1:-1::0;;;52633:16:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;52683:19:0;::::1;52664:16;52683:19:::0;;;:6:::1;:19;::::0;;;;;;;;52664:38;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;;;52664:38:0;;::::1;::::0;;;-1:-1:-1;;;52664:38:0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;-1:-1:-1;;;52664:38:0;::::1;;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;;::::1;::::0;;;;;;;::::1;;;;;::::0;;;;52683:19;;-1:-1:-1;52664:38:0;52717:59:::1;;;::::0;-1:-1:-1;;;52717:59:0;;13963:2:1;52717:59:0::1;::::0;::::1;13945:21:1::0;14002:2;13982:18;;;13975:30;14041:29;14021:18;;;14014:57;14088:18;;52717:59:0::1;13935:177:1::0;52717:59:0::1;52800:4;:13;;;52799:14;52791:47;;;::::0;-1:-1:-1;;;52791:47:0;;20290:2:1;52791:47:0::1;::::0;::::1;20272:21:1::0;20329:2;20309:18;;;20302:30;-1:-1:-1;;;20348:18:1;;;20341:50;20408:18;;52791:47:0::1;20262:170:1::0;52791:47:0::1;52861:26;::::0;::::1;::::0;:31:::1;;::::0;52853:74:::1;;;::::0;-1:-1:-1;;;52853:74:0;;10553:2:1;52853:74:0::1;::::0;::::1;10535:21:1::0;10592:2;10572:18;;;10565:30;10631:32;10611:18;;;10604:60;10681:18;;52853:74:0::1;10525:180:1::0;52853:74:0::1;52944:22;52969:30;52983:4;:15;;;52969:13;:30::i;:::-;52944:55;;53014:21;53038:66;53055:14;53071:17;53089:13;53071:32;;;;;;;;-1:-1:-1::0;;;53071:32:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53038:16;:66::i;:::-;53014:90;;53145:14;53121:20;;:38;;;;;;;;;;-1:-1:-1::0;;;;;53121:38:0::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;53121:38:0::1;;;;;-1:-1:-1::0;;;;;53121:38:0::1;;;;;;53211:13;53174:33;;:50;;;;;;;;;;-1:-1:-1::0;;;;;53174:50:0::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;53174:50:0::1;;;;;-1:-1:-1::0;;;;;53174:50:0::1;;;;;;53285:13;53301:1;53285:17;;;;:::i;:::-;-1:-1:-1::0;;;;;53241:19:0;::::1;;::::0;;;:6:::1;:19;::::0;;;;;;;;:41:::1;;:61:::0;;-1:-1:-1;;53241:61:0::1;;::::0;;::::1;;::::0;;53322:43;;6580:51:1;;;6667:19;;;6647:18;;;6640:47;;;;53322:43:0::1;::::0;6553:18:1;53322:43:0::1;;;;;;;52549:828;;;;52591:3;;;;;:::i;:::-;;;;52549:828;;;;19346:1;52202:1182:::0;;:::o;46875:1644::-;19322:13;:11;:13::i;:::-;47095:19:::1;::::0;-1:-1:-1;;;47095:19:0;::::1;;;47087:76;;;::::0;-1:-1:-1;;;47087:76:0;;19877:2:1;47087:76:0::1;::::0;::::1;19859:21:1::0;19916:2;19896:18;;;19889:30;19955:34;19935:18;;;19928:62;-1:-1:-1;;;20006:18:1;;;19999:42;20058:19;;47087:76:0::1;19849:234:1::0;47087:76:0::1;47182:25:::0;47174:67:::1;;;::::0;-1:-1:-1;;;47174:67:0;;14673:2:1;47174:67:0::1;::::0;::::1;14655:21:1::0;14712:2;14692:18;;;14685:30;14751:31;14731:18;;;14724:59;14800:18;;47174:67:0::1;14645:179:1::0;47174:67:0::1;47260:42:::0;;::::1;47252:90;;;;-1:-1:-1::0;;;47252:90:0::1;;;;;;;:::i;:::-;47361:48:::0;;::::1;47353:96;;;;-1:-1:-1::0;;;47353:96:0::1;;;;;;;:::i;:::-;47462:31;47504:30:::0;47552:9:::1;47547:749;47563:24:::0;;::::1;47547:749;;;47609:19;47631:13;;47645:1;47631:16;;;;;-1:-1:-1::0;;;47631:16:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47681:12;::::0;47609:38;;-1:-1:-1;;;;;;47666:27:0;;::::1;47681:12:::0;::::1;47666:27;47662:207;;;47740:11;;47752:1;47740:14;;;;;-1:-1:-1::0;;;47740:14:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47714:22;:40:::0;;:22:::1;::::0;:40:::1;::::0;;;-1:-1:-1;;;47714:40:0;::::1;-1:-1:-1::0;;;;;47714:40:0::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;47714:40:0::1;;;;;-1:-1:-1::0;;;;;47714:40:0::1;;;;;;47797:29;47811:11;;47823:1;47811:14;;;;;-1:-1:-1::0;;;47811:14:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47797:13;:29::i;:::-;47773:20;:53:::0;;:20:::1;::::0;:53:::1;::::0;;;-1:-1:-1;;;47773:53:0;::::1;-1:-1:-1::0;;;;;47773:53:0::1;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;47773:53:0::1;;;;;-1:-1:-1::0;;;;;47773:53:0::1;;;;;;47845:8;;;47662:207;-1:-1:-1::0;;;;;47893:19:0;::::1;;::::0;;;:6:::1;:19;::::0;;;;:30;-1:-1:-1;;;;;47893:30:0::1;:35:::0;47885:79:::1;;;::::0;-1:-1:-1;;;47885:79:0;;17283:2:1;47885:79:0::1;::::0;::::1;17265:21:1::0;17322:2;17302:18;;;17295:30;17361:33;17341:18;;;17334:61;17412:18;;47885:79:0::1;17255:181:1::0;47885:79:0::1;48014:11;;48026:1;48014:14;;;;;-1:-1:-1::0;;;48014:14:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;47981:19:0;::::1;;::::0;;;:6:::1;:19;::::0;;;;:47;;-1:-1:-1;;;;;;47981:47:0::1;-1:-1:-1::0;;;;;47981:47:0;;;::::1;::::0;;;::::1;::::0;;48082:17;;48100:1;48082:20;;::::1;;;-1:-1:-1::0;;;48082:20:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;48043:19:0;::::1;;::::0;;;:6:::1;:19;::::0;;;;:59;;-1:-1:-1;;;;;48043:59:0;;;::::1;-1:-1:-1::0;;;48043:59:0::1;-1:-1:-1::0;;;;48043:59:0;;::::1;::::0;;;::::1;::::0;;48144:11;;48156:1;48144:14;;::::1;;;-1:-1:-1::0;;;48144:14:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48117:41;::::0;;::::1;:::i;:::-;;;48199:17;;48217:1;48199:20;;;;;-1:-1:-1::0;;;48199:20:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48173:46;::::0;;::::1;:::i;:::-;;;48241:43;48251:13;;48265:1;48251:16;;;;;-1:-1:-1::0;;;48251:16:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48269:11;;48281:1;48269:14;;;;;-1:-1:-1::0;;;48269:14:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48241:43;::::0;;-1:-1:-1;;;;;5964:32:1;;;5946:51;;-1:-1:-1;;;;;6033:45:1;;;6028:2;6013:18;;6006:73;5919:18;48241:43:0::1;;;;;;;47547:749;;47589:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47547:749;;;;48346:23;48320:22;;:49;;;;;;;;;;-1:-1:-1::0;;;;;48320:49:0::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;48320:49:0::1;;;;;-1:-1:-1::0;;;;;48320:49:0::1;;;;;;48405:22;48380:21;;:47;;;;;;;;;;-1:-1:-1::0;;;;;48380:47:0::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;;;;48380:47:0::1;;;;;-1:-1:-1::0;;;;;48380:47:0::1;;;;;;48452:4;48448:64;;;48473:19;:27:::0;;-1:-1:-1;;48473:27:0::1;::::0;;48448:64:::1;19346:1;;46875:1644:::0;;;;;;;:::o;54936:266::-;54972:26;55001:23;:21;:23::i;:::-;55061:18;;54972:52;;-1:-1:-1;55061:18:0;-1:-1:-1;;;55061:18:0;;;;;55039:40;;;;55035:160;;;55096:18;:40;;-1:-1:-1;;55096:40:0;-1:-1:-1;;;55096:40:0;;;;;;;;;;;;;55156:27;;24415:38:1;;;55156:27:0;;24403:2:1;24388:18;55156:27:0;;;;;;;55035:160;54936:266;:::o;55242:495::-;55362:9;;55296:26;;-1:-1:-1;;;55362:9:0;;-1:-1:-1;;;;;55362:9:0;55343:15;:28;;55335:69;;;;-1:-1:-1;;;55335:69:0;;11622:2:1;55335:69:0;;;11604:21:1;11661:2;11641:18;;;11634:30;11700;11680:18;;;11673:58;11748:18;;55335:69:0;11594:178:1;55335:69:0;55458:9;;55415:22;;55440:27;;-1:-1:-1;;;55458:9:0;;-1:-1:-1;;;;;55458:9:0;55440:15;:27;:::i;:::-;55500:13;:20;55553:18;;-1:-1:-1;;;55553:18:0;;;;;-1:-1:-1;55415:52:0;;-1:-1:-1;55584:146:0;55613:11;55591:19;:33;;;:89;;;;;55646:13;55660:19;55646:34;;;;;;;;-1:-1:-1;;;55646:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55628:52;;;55591:89;55584:146;;;55697:21;;;;:::i;:::-;;;;55584:146;;;55242:495;;;:::o;42328:29::-;;;;;;;;;;;;49280:1447;-1:-1:-1;;;;;43746:19:0;;49383:21;43746:19;;;:6;:19;;;;;:30;49341:11;;-1:-1:-1;;;;;43746:30:0;43738:74;;;;-1:-1:-1;;;43738:74:0;;13963:2:1;43738:74:0;;;13945:21:1;14002:2;13982:18;;;13975:30;14041:29;14021:18;;;14014:57;14088:18;;43738:74:0;13935:177:1;43738:74:0;23773:21:::1;:19;:21::i;:::-;49417:8:::2;:6;:8::i;:::-;-1:-1:-1::0;;;;;49457:19:0;::::2;49438:16;49457:19:::0;;;:6:::2;:19;::::0;;;;;;;;49438:38;;::::2;::::0;::::2;::::0;;;;-1:-1:-1;;;;;49438:38:0;;::::2;::::0;;-1:-1:-1;;;49438:38:0;::::2;;::::0;;::::2;::::0;;;;::::2;-1:-1:-1::0;;;49438:38:0;;::::2;::::0;::::2;::::0;;;;;;;;::::2;::::0;;;::::2;::::0;;;;::::2;::::0;;;::::2;;;;::::0;;;;;49508:10:::2;49493:25;49489:127;;49561:13;::::0;-1:-1:-1;;;;;49561:13:0::2;49543:15;:31;49535:69;;;::::0;-1:-1:-1;;;49535:69:0;;14319:2:1;49535:69:0::2;::::0;::::2;14301:21:1::0;14358:2;14338:18;;;14331:30;14397:27;14377:18;;;14370:55;14442:18;;49535:69:0::2;14291:175:1::0;49535:69:0::2;49636:18;::::0;-1:-1:-1;;;49636:18:0;::::2;;;49628:64;;;::::0;-1:-1:-1;;;49628:64:0;;15446:2:1;49628:64:0::2;::::0;::::2;15428:21:1::0;15485:2;15465:18;;;15458:30;15524:31;15504:18;;;15497:59;15573:18;;49628:64:0::2;15418:179:1::0;49628:64:0::2;49738:18;::::0;49711:24:::2;::::0;::::2;::::0;49738:18:::2;-1:-1:-1::0;;;49738:18:0;;::::2;::::0;::::2;49711:45:::0;::::2;;49703:86;;;::::0;-1:-1:-1;;;49703:86:0;;16926:2:1;49703:86:0::2;::::0;::::2;16908:21:1::0;16965:2;16945:18;;;16938:30;17004;16984:18;;;16977:58;17052:18;;49703:86:0::2;16898:178:1::0;49703:86:0::2;49809:4;:13;;;49808:14;49800:47;;;::::0;-1:-1:-1;;;49800:47:0;;20290:2:1;49800:47:0::2;::::0;::::2;20272:21:1::0;20329:2;20309:18;;;20302:30;-1:-1:-1;;;20348:18:1;;;20341:50;20408:18;;49800:47:0::2;20262:170:1::0;49800:47:0::2;-1:-1:-1::0;;;;;49867:25:0;::::2;;::::0;;;:12:::2;:25;::::0;;;;;::::2;;49866:26;49858:58;;;::::0;-1:-1:-1;;;49858:58:0;;18362:2:1;49858:58:0::2;::::0;::::2;18344:21:1::0;18401:2;18381:18;;;18374:30;-1:-1:-1;;;18420:18:1;;;18413:49;18479:18;;49858:58:0::2;18334:169:1::0;49858:58:0::2;49952:18;::::0;49929:20:::2;::::0;49952:22:::2;::::0;49973:1:::2;::::0;-1:-1:-1;;;49952:18:0;::::2;;;:22;:::i;:::-;49989:26;::::0;::::2;::::0;49929:45;;-1:-1:-1;49989:30:0::2;;::::0;49985:218:::2;;50071:4;:26;;;50044:53;;:4;:24;;;:53;;;50036:94;;;::::0;-1:-1:-1;;;50036:94:0;;16926:2:1;50036:94:0::2;::::0;::::2;16908:21:1::0;16965:2;16945:18;;;16938:30;17004;16984:18;;;16977:58;17052:18;;50036:94:0::2;16898:178:1::0;50036:94:0::2;50190:1;50161:4;:26;;;:30;;;;:::i;:::-;50145:46;;49985:218;50215:27;50272:1:::0;50245:4:::2;:24;;;:28;;;:82;;50326:1;50245:82;;;50276:17;50321:1;50294:4;:24;;;:28;;;;:::i;:::-;50276:47;;;;;;;;-1:-1:-1::0;;;50276:47:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50245:82;50215:112;;50354:90;50371:4;:15;;;50423:20;50388:17;50406:13;50388:32;;;;;;;;-1:-1:-1::0;;;50388:32:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:55;;;;:::i;:::-;50354:16;:90::i;:::-;50338:106;;50471:28;50485:13;50471;:28::i;:::-;50455:44:::0;-1:-1:-1;50539:17:0::2;:13:::0;50555:1:::2;50539:17;:::i;:::-;50512:44;::::0;;::::2;:24;::::0;;::::2;:44:::0;;;-1:-1:-1;;;;;50567:19:0;;::::2;;::::0;;;:6:::2;:19;::::0;;;;;;:26;;;;;;::::2;::::0;;;;::::2;-1:-1:-1::0;;;50567:26:0::2;-1:-1:-1::0;;;;;;;;;;50567:26:0;;::::2;-1:-1:-1::0;;;50567:26:0::2;-1:-1:-1::0;;;;;;50567:26:0;;;;;::::2;::::0;;;;;;;::::2;;::::0;;;::::2;::::0;;::::2;::::0;::::2;::::0;;;;::::2;::::0;;::::2;::::0;::::2;::::0;::::2;;::::0;::::2;-1:-1:-1::0;;50567:26:0;;;;;;::::2;::::0;;;;;;;::::2;::::0;;50604:8:::2;::::0;:49:::2;::::0;:8:::2;::::0;50574:11;;50604:49;::::2;:21;:49::i;:::-;50671:48;::::0;;24666:6:1;24654:19;;24636:38;;-1:-1:-1;;;;;24710:45:1;;24705:2;24690:18;;24683:73;-1:-1:-1;;;;;50671:48:0;::::2;::::0;::::2;::::0;24609:18:1;50671:48:0::2;;;;;;;23805:1;;;23817:20:::1;23034:1:::0;24337:7;:22;24154:213;23817:20:::1;49280:1447:::0;;;;:::o;50791:111::-;50831:21;50872:22;50883:10;50872;:22::i;:::-;50865:29;;50791:111;:::o;53719:1145::-;53773:15;53790:16;23773:21;:19;:21::i;:::-;53819:8:::1;:6;:8::i;:::-;53874:18;::::0;53846:25:::1;::::0;-1:-1:-1;;;53874:18:0;;::::1;;::::0;;::::1;-1:-1:-1::0;;;53846:25:0;;::::1;;:46;53838:89;;;::::0;-1:-1:-1;;;53838:89:0;;22172:2:1;53838:89:0::1;::::0;::::1;22154:21:1::0;22211:2;22191:18;;;22184:30;22250:32;22230:18;;;22223:60;22300:18;;53838:89:0::1;22144:180:1::0;53838:89:0::1;53961:18;::::0;53938:20:::1;::::0;53961:22:::1;::::0;53982:1:::1;::::0;-1:-1:-1;;;53961:18:0;::::1;;;:22;:::i;:::-;54026:25;::::0;53938:45;;-1:-1:-1;53996:27:0::1;::::0;-1:-1:-1;;;54026:25:0;::::1;;;:84;;54109:1;54026:84;;;54076:25;::::0;54058:17:::1;::::0;54076:29:::1;::::0;54104:1:::1;::::0;-1:-1:-1;;;54076:25:0;::::1;;;:29;:::i;:::-;54058:48;;;;;;;;-1:-1:-1::0;;;54058:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54026:84;54191:23;::::0;54166:22:::1;::::0;53996:114;;-1:-1:-1;54121:25:0::1;::::0;54149:123:::1;::::0;54166:48:::1;::::0;-1:-1:-1;;;;;54191:23:0;;::::1;::::0;-1:-1:-1;;;54166:22:0;;::::1;;:48;:::i;:::-;54251:20;54216:17;54234:13;54216:32;;;;;;;;-1:-1:-1::0;;;54216:32:0::1;;;;;;;;54149:123;54121:151;;54293:55;54310:17;54329:18;;;;;;;;;;;54293:16;:55::i;:::-;54283:65;;54361:35;54399:72;54416:20;;;;;;;;;-1:-1:-1::0;;;;;54416:20:0::1;54438:17;54456:13;54438:32;;;;;;;;-1:-1:-1::0;;;54438:32:0::1;;;;;;;;54399:72;54523:33;::::0;54361:110;;-1:-1:-1;54493:63:0::1;::::0;-1:-1:-1;;;;;54523:33:0::1;54361:110:::0;54493:63:::1;:::i;:::-;54567:33;:63:::0;;-1:-1:-1;;;;;;54567:63:0::1;-1:-1:-1::0;;;;;54567:63:0;::::1;;::::0;;54482:74;-1:-1:-1;;54662:18:0::1;54482:74:::0;54662:7;:18:::1;:::i;:::-;54643:37:::0;-1:-1:-1;54719:17:0::1;:13:::0;54735:1:::1;54719:17;:::i;:::-;54691:25;:45:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;54691:45:0::1;-1:-1:-1::0;;;;54691:45:0;;::::1;::::0;;;::::1;::::0;;54769:12:::1;::::0;54747:8:::1;::::0;:45:::1;::::0;-1:-1:-1;;;;;54747:8:0;;::::1;::::0;54769:12:::1;-1:-1:-1::0;;;;;54747:45:0;::::1;:21;:45::i;:::-;54808:48;::::0;;24997:6:1;24985:19;;24967:38;;-1:-1:-1;;;;;25092:15:1;;;25087:2;25072:18;;25065:43;25144:15;;25124:18;;;25117:43;54808:48:0;;::::1;::::0;;;;24955:2:1;54808:48:0;;::::1;23805:1;;;;;23817:20:::0;23034:1;24337:7;:22;24154:213;23817:20;53719:1145;;:::o;20335:201::-;19322:13;:11;:13::i;:::-;-1:-1:-1;;;;;20424:22:0;::::1;20416:73;;;::::0;-1:-1:-1;;;20416:73:0;;10146:2:1;20416:73:0::1;::::0;::::1;10128:21:1::0;10185:2;10165:18;;;10158:30;10224:34;10204:18;;;10197:62;-1:-1:-1;;;10275:18:1;;;10268:36;10321:19;;20416:73:0::1;10118:228:1::0;20416:73:0::1;20500:28;20519:8;20500:18;:28::i;43941:2347::-:0;13140:19;13163:13;;;;;;13162:14;;13210:34;;;;-1:-1:-1;13228:12:0;;13243:1;13228:12;;;;:16;13210:34;13209:108;;;-1:-1:-1;13289:4:0;1906:19;:23;;;13250:66;;-1:-1:-1;13299:12:0;;;;;:17;13250:66;13187:204;;;;-1:-1:-1;;;13187:204:0;;15031:2:1;13187:204:0;;;15013:21:1;15070:2;15050:18;;;15043:30;15109:34;15089:18;;;15082:62;-1:-1:-1;;;15160:18:1;;;15153:44;15214:19;;13187:204:0;15003:236:1;13187:204:0;13402:12;:16;;-1:-1:-1;;13402:16:0;13417:1;13402:16;;;13429:67;;;;13464:13;:20;;-1:-1:-1;;13464:20:0;;;;;13429:67;44035:24:::1;:22;:24::i;:::-;44070:16;:14;:16::i;:::-;44143:1;44115:15;;::::0;::::1;:6:::0;:15:::1;:::i;:::-;-1:-1:-1::0;;;;;44107:38:0::1;;;44099:85;;;::::0;-1:-1:-1;;;44099:85:0;;12386:2:1;44099:85:0::1;::::0;::::1;12368:21:1::0;12425:2;12405:18;;;12398:30;12464:34;12444:18;;;12437:62;-1:-1:-1;;;12515:18:1;;;12508:32;12557:19;;44099:85:0::1;12358:224:1::0;44099:85:0::1;44241:1;44203:28;;::::0;::::1;:6:::0;:28:::1;:::i;:::-;:35;;:39;44195:84;;;::::0;-1:-1:-1;;;44195:84:0;;18001:2:1;44195:84:0::1;::::0;::::1;17983:21:1::0;;;18020:18;;;18013:30;18079:34;18059:18;;;18052:62;18131:18;;44195:84:0::1;17973:182:1::0;44195:84:0::1;44333:28;;::::0;::::1;:6:::0;:28:::1;:::i;:::-;:35:::0;-1:-1:-1;44298:24:0::1;;::::0;::::1;:6:::0;:24:::1;:::i;:::-;:31;;:70;44290:118;;;;-1:-1:-1::0;;;44290:118:0::1;;;;;;;:::i;:::-;41043:3;44427:25;::::0;;;::::1;::::0;::::1;;:::i;:::-;:44;;;;44419:107;;;::::0;-1:-1:-1;;;44419:107:0;;13192:2:1;44419:107:0::1;::::0;::::1;13174:21:1::0;13231:2;13211:18;;;13204:30;13270:34;13250:18;;;13243:62;-1:-1:-1;;;13321:18:1;;;13314:48;13379:19;;44419:107:0::1;13164:240:1::0;44419:107:0::1;44576:1;44545:19;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;44545:33:0::1;;;44537:84;;;::::0;-1:-1:-1;;;44537:84:0;;19470:2:1;44537:84:0::1;::::0;::::1;19452:21:1::0;19509:2;19489:18;;;19482:30;19548:34;19528:18;;;19521:62;-1:-1:-1;;;19599:18:1;;;19592:36;19645:19;;44537:84:0::1;19442:228:1::0;44537:84:0::1;44659:15;44640:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;44640:34:0::1;;44632:87;;;::::0;-1:-1:-1;;;44632:87:0;;9333:2:1;44632:87:0::1;::::0;::::1;9315:21:1::0;9372:2;9352:18;;;9345:30;9411:34;9391:18;;;9384:62;-1:-1:-1;;;9462:18:1;;;9455:38;9510:19;;44632:87:0::1;9305:230:1::0;44632:87:0::1;44732:34;44769:44;44784:28;;::::0;::::1;:6:::0;:28:::1;:::i;:::-;44769:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;44769:14:0::1;::::0;-1:-1:-1;;;44769:44:0:i:1;:::-;44732:81:::0;-1:-1:-1;44824:30:0::1;44857:40;44872:24;;::::0;::::1;:6:::0;:24:::1;:::i;44857:40::-;44824:73;;41043:3;44916:68;;:18;44963:1;44935:18;:25;:29;;;;:::i;:::-;44916:49;;;;;;-1:-1:-1::0;;;44916:49:0::1;;;;;;;;;;;;;;;:68;;;44908:119;;;::::0;-1:-1:-1;;;44908:119:0;;21050:2:1;44908:119:0::1;::::0;::::1;21032:21:1::0;21089:2;21069:18;;;21062:30;21128:34;21108:18;;;21101:62;-1:-1:-1;;;21179:18:1;;;21172:36;21225:19;;44908:119:0::1;21022:228:1::0;44908:119:0::1;45067:18;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45048:37:0::1;:15;;::::0;::::1;:6:::0;:15:::1;:::i;:::-;-1:-1:-1::0;;;;;45048:37:0::1;;;45040:73;;;::::0;-1:-1:-1;;;45040:73:0;;13611:2:1;45040:73:0::1;::::0;::::1;13593:21:1::0;13650:2;13630:18;;;13623:30;13689:25;13669:18;;;13662:53;13732:18;;45040:73:0::1;13583:173:1::0;45040:73:0::1;45167:1;45136:18;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45128:41:0::1;;45124:658;;45220:16;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45194:42:0::1;:22;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45194:42:0::1;;;45186:90;;;;-1:-1:-1::0;;;45186:90:0::1;;;;;;;:::i;:::-;45322:22;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45299:45:0::1;:20;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45299:45:0::1;;45291:91;;;;-1:-1:-1::0;;;45291:91:0::1;;;;;;;:::i;:::-;45438:1;45405:21;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45405:35:0::1;;;45397:82;;;;-1:-1:-1::0;;;45397:82:0::1;;;;;;;:::i;:::-;45124:658;;;45520:22;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45520:27:0::1;::::0;45512:75:::1;;;;-1:-1:-1::0;;;45512:75:0::1;;;;;;;:::i;:::-;45610:20;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45610:25:0::1;::::0;45602:71:::1;;;;-1:-1:-1::0;;;45602:71:0::1;;;;;;;:::i;:::-;45729:1;45696:21;::::0;;;::::1;::::0;::::1;;:::i;:::-;-1:-1:-1::0;;;;;45696:35:0::1;;45688:82;;;;-1:-1:-1::0;;;45688:82:0::1;;;;;;;:::i;:::-;45805:15;;::::0;::::1;:6:::0;:15:::1;:::i;:::-;45794:8;:26:::0;;-1:-1:-1;;;;;;45794:26:0::1;-1:-1:-1::0;;;;;45794:26:0;;;::::1;::::0;;;::::1;::::0;;45831:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45880:30:0;;::::1;::::0;:13:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;45942:25:0::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;45921:18;:46:::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;;45921:46:0::1;-1:-1:-1::0;;;;45921:46:0;;::::1;::::0;;;::::1;::::0;;45993:19:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;45978:12;:34:::0;;-1:-1:-1;;;;;;45978:34:0::1;-1:-1:-1::0;;;;;45978:34:0;;;::::1;::::0;;;::::1;::::0;;46035:16:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;46023:9;:28:::0;;-1:-1:-1;;;;;46023:28:0;;;::::1;-1:-1:-1::0;;;46023:28:0::1;-1:-1:-1::0;;;;46023:28:0;;::::1;::::0;;;::::1;::::0;;46076:18:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;46062:11;:32:::0;;-1:-1:-1;;;;;;46062:32:0::1;-1:-1:-1::0;;;;;46062:32:0;;;::::1;::::0;;;::::1;::::0;;46122:21:::1;46062:32;46122:21:::0;;::::1;::::0;::::1;;:::i;:::-;46105:14;:38:::0;;-1:-1:-1;;;;;;46105:38:0::1;-1:-1:-1::0;;;;;46105:38:0;;;::::1;::::0;;;::::1;::::0;;46172:22:::1;::::0;;;46105:38:::1;46172:22:::0;::::1;;:::i;:::-;46154:15;:40:::0;;-1:-1:-1;;;;;46154:40:0;;;::::1;-1:-1:-1::0;;;46154:40:0::1;-1:-1:-1::0;;;;46154:40:0;;::::1;::::0;;;::::1;::::0;;46221:20:::1;::::0;;;::::1;::::0;::::1;;:::i;:::-;46205:13;:36:::0;;-1:-1:-1;;46254:26:0;-1:-1:-1;;;;;46205:36:0;;;::::1;46254:26:::0;;;;-1:-1:-1;;;46254:26:0::1;::::0;;-1:-1:-1;;13518:102:0;;;;13569:5;13553:21;;-1:-1:-1;;13553:21:0;;;13594:14;;-1:-1:-1;8345:36:1;;13594:14:0;;8333:2:1;8318:18;13594:14:0;;;;;;;13518:102;43941:2347;;:::o;37473:211::-;37617:58;;;-1:-1:-1;;;;;6890:32:1;;37617:58:0;;;6872:51:1;6939:18;;;;6932:34;;;37617:58:0;;;;;;;;;;6845:18:1;;;;37617:58:0;;;;;;;;-1:-1:-1;;;;;37617:58:0;-1:-1:-1;;;37617:58:0;;;37590:86;;37610:5;;37590:19;:86::i;:::-;37473:211;;;:::o;23853:293::-;23078:1;23987:7;;:19;;23979:63;;;;-1:-1:-1;;;23979:63:0;;21812:2:1;23979:63:0;;;21794:21:1;21851:2;21831:18;;;21824:30;21890:33;21870:18;;;21863:61;21941:18;;23979:63:0;21784:181:1;23979:63:0;23078:1;24120:7;:18;23853:293::o;24154:213::-;23034:1;24337:7;:22;24154:213::o;19601:132::-;19509:6;;-1:-1:-1;;;;;19509:6:0;17548:10;19665:23;19657:68;;;;-1:-1:-1;;;19657:68:0;;16208:2:1;19657:68:0;;;16190:21:1;;;16227:18;;;16220:30;16286:34;16266:18;;;16259:62;16338:18;;19657:68:0;16180:182:1;20696:191:0;20789:6;;;-1:-1:-1;;;;;20806:17:0;;;-1:-1:-1;;;;;;20806:17:0;;;;;;;20839:40;;20789:6;;;20806:17;20789:6;;20839:40;;20770:16;;20839:40;20696:191;;:::o;56097:146::-;56157:7;56192:43;56209:5;56216:18;;;;;;;;;;;56192:16;:43::i;:::-;56184:51;;:5;:51;:::i;:::-;56177:58;56097:146;-1:-1:-1;;56097:146:0:o;55918:171::-;56000:7;41043:3;56035:27;:45;:27;;-1:-1:-1;;;;;56035:14:0;;:27;:::i;:::-;:45;;;;:::i;:::-;56020:61;55918:171;-1:-1:-1;;;55918:171:0:o;23120:113::-;15283:13;;;;;;;15275:69;;;;-1:-1:-1;;;15275:69:0;;;;;;;:::i;:::-;23191:34:::1;:32;:34::i;18979:97::-:0;15283:13;;;;;;;15275:69;;;;-1:-1:-1;;;15275:69:0;;;;;;;:::i;:::-;19042:26:::1;:24;:26::i;56251:438::-:0;56367:16;;56325:15;;56353:11;56367:16;-1:-1:-1;;;;;56421:17:0;;;;;-1:-1:-1;;;56421:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56421:17:0;;56394:44;;56449:14;56483:9;56478:178;56498:3;56494:1;:7;56478:178;;;56527:5;;56523:71;;56563:8;56572:5;56576:1;56572;:5;:::i;:::-;56563:15;;;;;;-1:-1:-1;;;56563:15:0;;;;;;;;;;;;;;;56553:25;;56523:71;56632:9;56642:1;56632:12;;;;;;-1:-1:-1;;;56632:12:0;;;;;;;;;;;;;;;56622:7;:22;;;;:::i;:::-;56608:8;56617:1;56608:11;;;;;;-1:-1:-1;;;56608:11:0;;;;;;;;;:36;;;;:11;;;;;;;;;;;:36;56503:3;;;;:::i;:::-;;;;56478:178;;;-1:-1:-1;56673:8:0;;56251:438;-1:-1:-1;;;;56251:438:0:o;40046:716::-;40470:23;40496:69;40524:4;40496:69;;;;;;;;;;;;;;;;;40504:5;-1:-1:-1;;;;;40496:27:0;;;:69;;;;;:::i;:::-;40580:17;;40470:95;;-1:-1:-1;40580:21:0;40576:179;;40677:10;40666:30;;;;;;;;;;;;:::i;:::-;40658:85;;;;-1:-1:-1;;;40658:85:0;;20639:2:1;40658:85:0;;;20621:21:1;20678:2;20658:18;;;20651:30;20717:34;20697:18;;;20690:62;-1:-1:-1;;;20768:18:1;;;20761:40;20818:19;;40658:85:0;20611:232:1;23241:111:0;15283:13;;;;;;;15275:69;;;;-1:-1:-1;;;15275:69:0;;;;;;;:::i;19084:113::-;15283:13;;;;;;;15275:69;;;;-1:-1:-1;;;15275:69:0;;;;;;;:::i;:::-;19157:32:::1;17548:10:::0;19157:18:::1;:32::i;32245:229::-:0;32382:12;32414:52;32436:6;32444:4;32450:1;32453:12;32414:21;:52::i;:::-;32407:59;32245:229;-1:-1:-1;;;;32245:229:0:o;33365:510::-;33535:12;33593:5;33568:21;:30;;33560:81;;;;-1:-1:-1;;;33560:81:0;;11979:2:1;33560:81:0;;;11961:21:1;12018:2;11998:18;;;11991:30;12057:34;12037:18;;;12030:62;-1:-1:-1;;;12108:18:1;;;12101:36;12154:19;;33560:81:0;11951:228:1;33560:81:0;29762:20;;33652:60;;;;-1:-1:-1;;;33652:60:0;;17643:2:1;33652:60:0;;;17625:21:1;17682:2;17662:18;;;17655:30;17721:31;17701:18;;;17694:59;17770:18;;33652:60:0;17615:179:1;33652:60:0;33726:12;33740:23;33767:6;-1:-1:-1;;;;;33767:11:0;33786:5;33793:4;33767:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33725:73;;;;33816:51;33833:7;33842:10;33854:12;33816:16;:51::i;:::-;33809:58;33365:510;-1:-1:-1;;;;;;;33365:510:0:o;36051:712::-;36201:12;36230:7;36226:530;;;-1:-1:-1;36261:10:0;36254:17;;36226:530;36375:17;;:21;36371:374;;36573:10;36567:17;36634:15;36621:10;36617:2;36613:19;36606:44;36521:148;36716:12;36709:20;;-1:-1:-1;;;36709:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:395:1;77:8;87:6;141:3;134:4;126:6;122:17;118:27;108:2;;166:8;156;149:26;108:2;-1:-1:-1;196:20:1;;-1:-1:-1;;;;;228:30:1;;225:2;;;278:8;268;261:26;225:2;322:4;314:6;310:17;298:29;;382:3;375:4;365:6;362:1;358:14;350:6;346:27;342:38;339:47;336:2;;;399:1;396;389:12;336:2;98:311;;;;;:::o;414:257::-;473:6;526:2;514:9;505:7;501:23;497:32;494:2;;;547:6;539;532:22;494:2;591:9;578:23;610:31;635:5;610:31;:::i;676:457::-;762:6;770;823:2;811:9;802:7;798:23;794:32;791:2;;;844:6;836;829:22;791:2;889:9;876:23;-1:-1:-1;;;;;914:6:1;911:30;908:2;;;959:6;951;944:22;908:2;1003:70;1065:7;1056:6;1045:9;1041:22;1003:70;:::i;:::-;1092:8;;977:96;;-1:-1:-1;781:352:1;-1:-1:-1;;;;781:352:1:o;1138:1258::-;1302:6;1310;1318;1326;1334;1342;1350;1403:3;1391:9;1382:7;1378:23;1374:33;1371:2;;;1425:6;1417;1410:22;1371:2;1470:9;1457:23;-1:-1:-1;;;;;1540:2:1;1532:6;1529:14;1526:2;;;1561:6;1553;1546:22;1526:2;1605:70;1667:7;1658:6;1647:9;1643:22;1605:70;:::i;:::-;1694:8;;-1:-1:-1;1579:96:1;-1:-1:-1;1782:2:1;1767:18;;1754:32;;-1:-1:-1;1798:16:1;;;1795:2;;;1832:6;1824;1817:22;1795:2;1876:72;1940:7;1929:8;1918:9;1914:24;1876:72;:::i;:::-;1967:8;;-1:-1:-1;1850:98:1;-1:-1:-1;2055:2:1;2040:18;;2027:32;;-1:-1:-1;2071:16:1;;;2068:2;;;2105:6;2097;2090:22;2068:2;;2149:72;2213:7;2202:8;2191:9;2187:24;2149:72;:::i;:::-;2240:8;;-1:-1:-1;2123:98:1;-1:-1:-1;;2325:2:1;2310:18;;2297:32;2338:28;2297:32;2338:28;:::i;:::-;2385:5;2375:15;;;1361:1035;;;;;;;;;;:::o;2401:586::-;2493:6;2501;2509;2562:2;2550:9;2541:7;2537:23;2533:32;2530:2;;;2583:6;2575;2568:22;2530:2;2628:9;2615:23;-1:-1:-1;;;;;2653:6:1;2650:30;2647:2;;;2698:6;2690;2683:22;2647:2;2742:70;2804:7;2795:6;2784:9;2780:22;2742:70;:::i;:::-;2831:8;;-1:-1:-1;2716:96:1;-1:-1:-1;;2916:2:1;2901:18;;2888:32;2929:28;2888:32;2929:28;:::i;:::-;2976:5;2966:15;;;2520:467;;;;;:::o;2992:255::-;3059:6;3112:2;3100:9;3091:7;3087:23;3083:32;3080:2;;;3133:6;3125;3118:22;3080:2;3170:9;3164:16;3189:28;3211:5;3189:28;:::i;3528:424::-;3621:6;3674:2;3662:9;3653:7;3649:23;3645:32;3642:2;;;3695:6;3687;3680:22;3642:2;3740:9;3727:23;-1:-1:-1;;;;;3765:6:1;3762:30;3759:2;;;3810:6;3802;3795:22;3759:2;3838:22;;3894:3;3876:16;;;3872:26;3869:2;;;3916:6;3908;3901:22;3957:319;4016:6;4069:2;4057:9;4048:7;4044:23;4040:32;4037:2;;;4090:6;4082;4075:22;4037:2;4134:9;4121:23;-1:-1:-1;;;;;4177:5:1;4173:44;4166:5;4163:55;4153:2;;4237:6;4229;4222:22;4281:190;4340:6;4393:2;4381:9;4372:7;4368:23;4364:32;4361:2;;;4414:6;4406;4399:22;4361:2;-1:-1:-1;4442:23:1;;4351:120;-1:-1:-1;4351:120:1:o;4476:194::-;4546:6;4599:2;4587:9;4578:7;4574:23;4570:32;4567:2;;;4620:6;4612;4605:22;4567:2;-1:-1:-1;4648:16:1;;4557:113;-1:-1:-1;4557:113:1:o;4675:296::-;4733:6;4786:2;4774:9;4765:7;4761:23;4757:32;4754:2;;;4807:6;4799;4792:22;4754:2;4851:9;4838:23;4901:10;4894:5;4890:22;4883:5;4880:33;4870:2;;4932:6;4924;4917:22;4976:304;5034:6;5087:2;5075:9;5066:7;5062:23;5058:32;5055:2;;;5108:6;5100;5093:22;5055:2;5152:9;5139:23;-1:-1:-1;;;;;5195:5:1;5191:30;5184:5;5181:41;5171:2;;5241:6;5233;5226:22;5285:274;5414:3;5452:6;5446:13;5468:53;5514:6;5509:3;5502:4;5494:6;5490:17;5468:53;:::i;:::-;5537:16;;;;;5422:137;-1:-1:-1;;5422:137:1:o;6977:797::-;7199:2;7211:21;;;7184:18;;7267:22;;;7151:4;7346:6;7320:2;7305:18;;7151:4;7383:304;7397:6;7394:1;7391:13;7383:304;;;7472:6;7459:20;7492:31;7517:5;7492:31;:::i;:::-;-1:-1:-1;;;;;7548:31:1;7536:44;;7603:4;7662:15;;;;7627:12;;;;7576:1;7412:9;7383:304;;;7387:3;7704;7696:11;;;;7759:6;7752:14;7745:22;7738:4;7727:9;7723:20;7716:52;7160:614;;;;;;:::o;8392:383::-;8541:2;8530:9;8523:21;8504:4;8573:6;8567:13;8616:6;8611:2;8600:9;8596:18;8589:34;8632:66;8691:6;8686:2;8675:9;8671:18;8666:2;8658:6;8654:15;8632:66;:::i;:::-;8759:2;8738:15;-1:-1:-1;;8734:29:1;8719:45;;;;8766:2;8715:54;;8513:262;-1:-1:-1;;8513:262:1:o;9540:399::-;9742:2;9724:21;;;9781:2;9761:18;;;9754:30;9820:34;9815:2;9800:18;;9793:62;-1:-1:-1;;;9886:2:1;9871:18;;9864:33;9929:3;9914:19;;9714:225::o;12587:398::-;12789:2;12771:21;;;12828:2;12808:18;;;12801:30;12867:34;12862:2;12847:18;;12840:62;-1:-1:-1;;;12933:2:1;12918:18;;12911:32;12975:3;12960:19;;12761:224::o;15602:399::-;15804:2;15786:21;;;15843:2;15823:18;;;15816:30;15882:34;15877:2;15862:18;;15855:62;-1:-1:-1;;;15948:2:1;15933:18;;15926:33;15991:3;15976:19;;15776:225::o;18508:407::-;18710:2;18692:21;;;18749:2;18729:18;;;18722:30;18788:34;18783:2;18768:18;;18761:62;-1:-1:-1;;;18854:2:1;18839:18;;18832:41;18905:3;18890:19;;18682:233::o;22740:397::-;22942:2;22924:21;;;22981:2;22961:18;;;22954:30;23020:34;23015:2;23000:18;;22993:62;-1:-1:-1;;;23086:2:1;23071:18;;23064:31;23127:3;23112:19;;22914:223::o;25573:556::-;25665:4;25671:6;25731:11;25718:25;25825:2;25821:7;25810:8;25794:14;25790:29;25786:43;25766:18;25762:68;25752:2;;25847:4;25841;25834:18;25752:2;25877:33;;25929:20;;;-1:-1:-1;;;;;;25961:30:1;;25958:2;;;26007:4;26001;25994:18;25958:2;26043:4;26031:17;;-1:-1:-1;26094:1:1;26090:14;;;26074;26070:35;26060:46;;26057:2;;;26119:1;26116;26109:12;26134:251;26174:3;-1:-1:-1;;;;;26261:2:1;26258:1;26254:10;26291:2;26288:1;26284:10;26322:3;26318:2;26314:12;26309:3;26306:21;26303:2;;;26330:18;;:::i;:::-;26366:13;;26182:203;-1:-1:-1;;;;26182:203:1:o;26390:224::-;26429:3;26457:6;26490:2;26487:1;26483:10;26520:2;26517:1;26513:10;26551:3;26547:2;26543:12;26538:3;26535:21;26532:2;;;26559:18;;:::i;26619:228::-;26658:3;26686:10;26723:2;26720:1;26716:10;26753:2;26750:1;26746:10;26784:3;26780:2;26776:12;26771:3;26768:21;26765:2;;;26792:18;;:::i;26852:217::-;26892:1;26918;26908:2;;-1:-1:-1;;;26943:31:1;;26997:4;26994:1;26987:15;27025:4;26950:1;27015:15;26908:2;-1:-1:-1;27054:9:1;;26898:171::o;27074:168::-;27114:7;27180:1;27176;27172:6;27168:14;27165:1;27162:21;27157:1;27150:9;27143:17;27139:45;27136:2;;;27187:18;;:::i;:::-;-1:-1:-1;27227:9:1;;27126:116::o;27247:244::-;27287:4;-1:-1:-1;;;;;27398:10:1;;;;27368;;27420:12;;;27417:2;;;27435:18;;:::i;:::-;27472:13;;27296:195;-1:-1:-1;;;27296:195:1:o;27496:217::-;27535:4;27564:6;27620:10;;;;27590;;27642:12;;;27639:2;;;27657:18;;:::i;27718:125::-;27758:4;27786:1;27783;27780:8;27777:2;;;27791:18;;:::i;:::-;-1:-1:-1;27828:9:1;;27767:76::o;27848:221::-;27887:4;27916:10;27976;;;;27946;;27998:12;;;27995:2;;;28013:18;;:::i;28074:258::-;28146:1;28156:113;28170:6;28167:1;28164:13;28156:113;;;28246:11;;;28240:18;28227:11;;;28220:39;28192:2;28185:10;28156:113;;;28287:6;28284:1;28281:13;28278:2;;;-1:-1:-1;;28322:1:1;28304:16;;28297:27;28127:205::o;28337:197::-;28375:3;28403:6;28444:2;28437:5;28433:14;28471:2;28462:7;28459:15;28456:2;;;28477:18;;:::i;:::-;28526:1;28513:15;;28383:151;-1:-1:-1;;;28383:151:1:o;28539:135::-;28578:3;-1:-1:-1;;28599:17:1;;28596:2;;;28619:18;;:::i;:::-;-1:-1:-1;28666:1:1;28655:13;;28586:88::o;28679:127::-;28740:10;28735:3;28731:20;28728:1;28721:31;28771:4;28768:1;28761:15;28795:4;28792:1;28785:15;28811:131;-1:-1:-1;;;;;28886:31:1;;28876:42;;28866:2;;28932:1;28929;28922:12;28947:118;29033:5;29026:13;29019:21;29012:5;29009:32;28999:2;;29055:1;29052;29045:12
Swarm Source
ipfs://b641c6bd9b91913fb5bdc06b628b46e60b02a319ea3a86f37d388e26b2eaf7f5
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.