Source Code
Latest 25 from a total of 301 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Buy With ETH | 23729234 | 9 hrs ago | IN | 0.153308 ETH | 0.00019807 | ||||
| Buy With ETH | 23723115 | 29 hrs ago | IN | 0.013791 ETH | 0.00003494 | ||||
| Buy With ETH | 23714006 | 2 days ago | IN | 0.26534139 ETH | 0.00014183 | ||||
| Buy With ETH | 23709887 | 3 days ago | IN | 0.00052 ETH | 0.00010376 | ||||
| Buy With ETH | 23701845 | 4 days ago | IN | 0.0004 ETH | 0.00011455 | ||||
| Buy With ETH | 23701245 | 4 days ago | IN | 0.00156 ETH | 0.00020142 | ||||
| Buy With ETH | 23699957 | 4 days ago | IN | 0.008 ETH | 0.00015048 | ||||
| Buy With ETH | 23692279 | 5 days ago | IN | 0.24893056 ETH | 0.00013509 | ||||
| Buy With ETH | 23690486 | 5 days ago | IN | 0.002 ETH | 0.0004011 | ||||
| Buy With ETH | 23655983 | 10 days ago | IN | 0.012 ETH | 0.00001292 | ||||
| Buy With ETH | 23655694 | 10 days ago | IN | 0.021 ETH | 0.00001632 | ||||
| Buy With ETH | 23650978 | 11 days ago | IN | 0.010181 ETH | 0.00027414 | ||||
| Buy With ETH | 23647524 | 11 days ago | IN | 0.99 ETH | 0.00029815 | ||||
| Buy With ETH | 23624658 | 15 days ago | IN | 0.01413 ETH | 0.00015574 | ||||
| Buy With ETH | 23615918 | 16 days ago | IN | 0.0379 ETH | 0.00014787 | ||||
| Buy With ETH | 23597827 | 18 days ago | IN | 0.01884479 ETH | 0.00033598 | ||||
| Buy With ETH | 23571952 | 22 days ago | IN | 0.0017 ETH | 0.00011958 | ||||
| Buy With ETH | 23571827 | 22 days ago | IN | 0.0017 ETH | 0.00011597 | ||||
| Buy With ETH | 23563762 | 23 days ago | IN | 0.01 ETH | 0.00024284 | ||||
| Buy With ETH | 23528723 | 28 days ago | IN | 0.001 ETH | 0.00022677 | ||||
| Buy With ETH | 23526737 | 28 days ago | IN | 0.025 ETH | 0.00064202 | ||||
| Buy With ETH | 23524239 | 29 days ago | IN | 0.0078 ETH | 0.00001701 | ||||
| Buy With ETH | 23520593 | 29 days ago | IN | 0.010634 ETH | 0.00031806 | ||||
| Buy With ETH | 23520353 | 29 days ago | IN | 0.0028 ETH | 0.00038948 | ||||
| Buy With ETH | 23512087 | 30 days ago | IN | 0.0025 ETH | 0.00010944 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 23729234 | 9 hrs ago | 0.153308 ETH | ||||
| Transfer | 23723115 | 29 hrs ago | 0.013791 ETH | ||||
| Transfer | 23714006 | 2 days ago | 0.26534139 ETH | ||||
| Transfer | 23709887 | 3 days ago | 0.00052 ETH | ||||
| Transfer | 23701845 | 4 days ago | 0.0004 ETH | ||||
| Transfer | 23701245 | 4 days ago | 0.00156 ETH | ||||
| Transfer | 23699957 | 4 days ago | 0.008 ETH | ||||
| Transfer | 23692279 | 5 days ago | 0.24893056 ETH | ||||
| Transfer | 23690486 | 5 days ago | 0.002 ETH | ||||
| Transfer | 23655983 | 10 days ago | 0.012 ETH | ||||
| Transfer | 23655694 | 10 days ago | 0.021 ETH | ||||
| Transfer | 23650978 | 11 days ago | 0.010181 ETH | ||||
| Transfer | 23647524 | 11 days ago | 0.99 ETH | ||||
| Transfer | 23624658 | 15 days ago | 0.01413 ETH | ||||
| Transfer | 23615918 | 16 days ago | 0.0379 ETH | ||||
| Transfer | 23597827 | 18 days ago | 0.01884479 ETH | ||||
| Transfer | 23571952 | 22 days ago | 0.0017 ETH | ||||
| Transfer | 23571827 | 22 days ago | 0.0017 ETH | ||||
| Transfer | 23563762 | 23 days ago | 0.01 ETH | ||||
| Transfer | 23528723 | 28 days ago | 0.001 ETH | ||||
| Transfer | 23526737 | 28 days ago | 0.025 ETH | ||||
| Transfer | 23524239 | 29 days ago | 0.0078 ETH | ||||
| Transfer | 23520593 | 29 days ago | 0.010634 ETH | ||||
| Transfer | 23520353 | 29 days ago | 0.0028 ETH | ||||
| Transfer | 23512087 | 30 days ago | 0.0025 ETH |
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
LynoPresale
Compiler Version
v0.8.30+commit.73712a01
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2025-07-12 */ // Sources flattened with hardhat v2.25.0 https://hardhat.org // SPDX-License-Identifier: MIT // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File @openzeppelin/contracts/access/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @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 { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[ERC]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC165.sol) pragma solidity ^0.8.20; // File @openzeppelin/contracts/token/ERC20/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol) pragma solidity ^0.8.20; // File @openzeppelin/contracts/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (interfaces/IERC1363.sol) pragma solidity ^0.8.20; /** * @title IERC1363 * @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363]. * * Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract * after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction. */ interface IERC1363 is IERC20, IERC165 { /* * Note: the ERC-165 identifier for this interface is 0xb0202a11. * 0xb0202a11 === * bytes4(keccak256('transferAndCall(address,uint256)')) ^ * bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^ * bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^ * bytes4(keccak256('approveAndCall(address,uint256)')) ^ * bytes4(keccak256('approveAndCall(address,uint256,bytes)')) */ /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from the caller's account to `to` * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism * and then calls {IERC1363Receiver-onTransferReceived} on `to`. * @param from The address which you want to send tokens from. * @param to The address which you want to transfer to. * @param value The amount of tokens to be transferred. * @param data Additional data with no specified format, sent in call to `to`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value) external returns (bool); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`. * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. * @param data Additional data with no specified format, sent in call to `spender`. * @return A boolean value indicating whether the operation succeeded unless throwing. */ function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool); } // File @openzeppelin/contracts/token/ERC20/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC-20 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 { /** * @dev An operation with an ERC-20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful. */ function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) { return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful. */ function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) { return _callOptionalReturnBool(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. * * IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client" * smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using * this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract * that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. * * NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function * only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being * set here. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { safeTransfer(token, to, value); } else if (!token.transferAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target * has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * Reverts if the returned value is other than `true`. */ function transferFromAndCallRelaxed( IERC1363 token, address from, address to, uint256 value, bytes memory data ) internal { if (to.code.length == 0) { safeTransferFrom(token, from, to, value); } else if (!token.transferFromAndCall(from, to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no * code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when * targeting contracts. * * NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}. * Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall} * once without retrying, and relies on the returned value to be true. * * Reverts if the returned value is other than `true`. */ function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal { if (to.code.length == 0) { forceApprove(token, to, value); } else if (!token.approveAndCall(to, value, data)) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturnBool} that reverts if call fails to meet the requirements. */ function _callOptionalReturn(IERC20 token, bytes memory data) private { uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) // bubble errors if iszero(success) { let ptr := mload(0x40) returndatacopy(ptr, 0, returndatasize()) revert(ptr, returndatasize()) } returnSize := returndatasize() returnValue := mload(0) } if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silently catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { bool success; uint256 returnSize; uint256 returnValue; assembly ("memory-safe") { success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20) returnSize := returndatasize() returnValue := mload(0) } return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1); } } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @chainlink/contracts/src/v0.8/shared/interfaces/[email protected] // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.0; // solhint-disable-next-line interface-starts-with-i interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData( uint80 _roundId ) external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); function latestRoundData() external view returns (uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound); } // File @openzeppelin/contracts/utils/[email protected] // Original license: SPDX_License_Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @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 EIP-1153 (transient storage) is available on the chain you're deploying at, * consider using {ReentrancyGuardTransient} instead. * * 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 ReentrancyGuard { // 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; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _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 if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // 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; } } // File contracts/LynoPresale.sol // Original license: SPDX_License_Identifier: MIT pragma solidity ^0.8.20; /** * @title Lyno Token Presale Contract * @dev Manages multiple presale stages for Lyno Token with different payment methods (ETH, USDC, USDT) */ contract LynoPresale is Ownable, Pausable, ReentrancyGuard { using SafeERC20 for IERC20; // Constants address public constant ETH_ADDRESS = address(0xEeeeeEeeeEeEeeEeEeEeeEEEeeeeEeeeeeeeEEeE); uint256 public constant PRECISION = 1e18; // Token and payment addresses address public usdcAddress; address public usdtAddress; address public ethReceiver; address public lynoToken; AggregatorV3Interface public ethPriceFeed; // State variables uint8 public currentStageId; bool public claimingEnabled = false; uint256 public totalTokensSold; // Per-user tracking mapping(address => uint256) public purchasedTokens; mapping(address => bool) public hasClaimed; mapping(address => mapping(address => uint256)) public contributions; mapping(address => uint256) public totalContributionsByToken; // Stage structure struct Stage { string name; uint256 price; // Price in USD with 18 decimals (e.g. $0.035 = 35000000000000000) uint256 tokenAllocation; uint256 tokensSold; bool active; } // Stages mapping mapping(uint8 => Stage) public stages; // Events event Contribution(address indexed user, address indexed token, uint256 amount, uint256 tokensAllocated, uint8 stageId, uint256 timestamp); event StageChanged(uint8 oldStageId, uint8 newStageId); event ClaimingEnabled(); event TokensClaimed(address indexed user, uint256 amount); /** * @dev Constructor sets initial values * @param _usdc Address of USDC token * @param _usdt Address of USDT token * @param _ethReceiver Address to receive ETH contributions * @param _priceFeed Chainlink ETH/USD price feed */ constructor( address _usdc, address _usdt, address _ethReceiver, address _priceFeed ) Ownable(msg.sender) { require(_usdc != address(0), "Invalid USDC address"); require(_usdt != address(0), "Invalid USDT address"); require(_ethReceiver != address(0), "Invalid ETH receiver address"); require(_priceFeed != address(0), "Invalid price feed address"); usdcAddress = _usdc; usdtAddress = _usdt; ethReceiver = _ethReceiver; ethPriceFeed = AggregatorV3Interface(_priceFeed); // Initialize stages (can also be done via setupStages function) setupDefaultStages(); } /** * @dev Sets up default presale stages based on the 7-stage community distribution plan * Stage prices are in USD with 18 decimals (e.g. $0.050 = 50000000000000000) */ function setupDefaultStages() private { stages[0] = Stage({ name: "Early Bird", price: 50000000000000000, // $0.050 tokenAllocation: 16000000 * PRECISION, // 16M tokens (3.2%) tokensSold: 0, active: true }); stages[1] = Stage({ name: "Stage 1", price: 55000000000000000, // $0.055 tokenAllocation: 21000000 * PRECISION, // 21M tokens (4.2%) tokensSold: 0, active: false }); stages[2] = Stage({ name: "Stage 2", price: 60000000000000000, // $0.060 tokenAllocation: 21000000 * PRECISION, // 21M tokens (4.2%) tokensSold: 0, active: false }); stages[3] = Stage({ name: "Stage 3", price: 70000000000000000, // $0.070 tokenAllocation: 21000000 * PRECISION, // 21M tokens (4.2%) tokensSold: 0, active: false }); stages[4] = Stage({ name: "Stage 4", price: 80000000000000000, // $0.080 tokenAllocation: 21000000 * PRECISION, // 21M tokens (4.2%) tokensSold: 0, active: false }); stages[5] = Stage({ name: "Stage 5", price: 85000000000000000, // $0.085 tokenAllocation: 24000000 * PRECISION, // 24M tokens (4.8%) tokensSold: 0, active: false }); stages[6] = Stage({ name: "Bonus Fire", price: 100000000000000000, // $0.100 tokenAllocation: 16000000 * PRECISION, // 16M tokens (3.2%) tokensSold: 0, active: false }); currentStageId = 0; // Start with Early Bird stage } /** * @dev Set the Lyno token address * @param _lynoToken Address of the Lyno token */ function setToken(address _lynoToken) external onlyOwner { require(_lynoToken != address(0), "Invalid token address"); require(lynoToken == address(0), "Token already set"); lynoToken = _lynoToken; } /** * @dev Enable token claiming */ function enableClaiming() external onlyOwner { require(lynoToken != address(0), "Token not set"); claimingEnabled = true; emit ClaimingEnabled(); } /** * @dev Change to a specific presale stage * @param newStageId ID of the new stage */ function setStage(uint8 newStageId) external onlyOwner { require(newStageId <= 6, "Invalid stage ID"); require(newStageId != currentStageId, "Already in this stage"); // Deactivate current stage stages[currentStageId].active = false; // Activate new stage stages[newStageId].active = true; emit StageChanged(currentStageId, newStageId); currentStageId = newStageId; } /** * @dev Get current ETH/USD price from Chainlink * @return ETH price in USD with 18 decimals */ function getEthPrice() public view returns (uint256) { // Get latest price from Chainlink (returns price with 8 decimals) (, int256 price, , , ) = ethPriceFeed.latestRoundData(); require(price > 0, "Invalid ETH price"); // Convert to 18 decimals return uint256(price) * 10**10; } /** * @dev Buy tokens with ETH */ function buyWithETH() external payable nonReentrant whenNotPaused { require(msg.value > 0, "ETH amount must be greater than 0"); Stage storage stage = stages[currentStageId]; require(stage.active, "Current stage not active"); // Calculate USD value of ETH uint256 ethPrice = getEthPrice(); uint256 ethInUSD = (msg.value * ethPrice) / PRECISION; // Calculate token amount uint256 baseTokens = (ethInUSD * PRECISION) / stage.price; uint256 totalTokens = baseTokens; // Check token allocation require(stage.tokensSold + totalTokens <= stage.tokenAllocation, "Exceeds stage allocation"); // Update token statistics stage.tokensSold += totalTokens; totalTokensSold += totalTokens; purchasedTokens[msg.sender] += totalTokens; contributions[msg.sender][ETH_ADDRESS] += msg.value; totalContributionsByToken[ETH_ADDRESS] += msg.value; // Transfer ETH to receiver (bool sent, ) = payable(ethReceiver).call{value: msg.value}(""); require(sent, "ETH transfer failed"); emit Contribution(msg.sender, ETH_ADDRESS, msg.value, totalTokens, currentStageId, block.timestamp); } /** * @dev Buy tokens with USDC * @param amount Amount of USDC (in USDC decimals - 6) */ function buyWithUSDC(uint256 amount) external nonReentrant whenNotPaused { require(amount > 0, "Amount must be greater than 0"); Stage storage stage = stages[currentStageId]; require(stage.active, "Current stage not active"); // Calculate normalized amount (convert from 6 to 18 decimals) uint256 normalizedAmount = amount * 10**12; // Calculate token amount uint256 baseTokens = (normalizedAmount * PRECISION) / stage.price; uint256 totalTokens = baseTokens; // Check token allocation require(stage.tokensSold + totalTokens <= stage.tokenAllocation, "Exceeds stage allocation"); // Update token statistics stage.tokensSold += totalTokens; totalTokensSold += totalTokens; purchasedTokens[msg.sender] += totalTokens; contributions[msg.sender][usdcAddress] += amount; totalContributionsByToken[usdcAddress] += amount; // Transfer tokens from sender IERC20(usdcAddress).safeTransferFrom(msg.sender, address(this), amount); emit Contribution(msg.sender, usdcAddress, amount, totalTokens, currentStageId, block.timestamp); } /** * @dev Buy tokens with USDT * @param amount Amount of USDT (in USDT decimals - 6) */ function buyWithUSDT(uint256 amount) external nonReentrant whenNotPaused { require(amount > 0, "Amount must be greater than 0"); Stage storage stage = stages[currentStageId]; require(stage.active, "Current stage not active"); // Calculate normalized amount (convert from 6 to 18 decimals) uint256 normalizedAmount = amount * 10**12; // Calculate token amount uint256 baseTokens = (normalizedAmount * PRECISION) / stage.price; uint256 totalTokens = baseTokens; // Check token allocation require(stage.tokensSold + totalTokens <= stage.tokenAllocation, "Exceeds stage allocation"); // Update token statistics stage.tokensSold += totalTokens; totalTokensSold += totalTokens; purchasedTokens[msg.sender] += totalTokens; contributions[msg.sender][usdtAddress] += amount; totalContributionsByToken[usdtAddress] += amount; // Transfer tokens from sender IERC20(usdtAddress).safeTransferFrom(msg.sender, address(this), amount); emit Contribution(msg.sender, usdtAddress, amount, totalTokens, currentStageId, block.timestamp); } /** * @dev Claim tokens after presale ends and claiming is enabled */ function claim() external nonReentrant { require(claimingEnabled, "Claiming not enabled yet"); require(purchasedTokens[msg.sender] > 0, "No tokens to claim"); require(!hasClaimed[msg.sender], "Already claimed"); uint256 amount = purchasedTokens[msg.sender]; hasClaimed[msg.sender] = true; // Transfer tokens to user IERC20(lynoToken).safeTransfer(msg.sender, amount); emit TokensClaimed(msg.sender, amount); } /** * @dev Withdraw ERC20 tokens from the contract * @param token The token address (USDC or USDT) */ function withdrawERC20(address token) external onlyOwner { require(token == usdcAddress || token == usdtAddress, "Unsupported token"); uint256 balance = IERC20(token).balanceOf(address(this)); require(balance > 0, "No tokens to withdraw"); IERC20(token).safeTransfer(msg.sender, balance); } /** * @dev Get current stage details * @return name Stage name * @return price Stage price in USD (18 decimals) * @return tokenAllocation Total tokens allocated to this stage * @return tokensSold Tokens sold in this stage * @return active Whether this stage is active */ function getCurrentStage() external view returns ( string memory name, uint256 price, uint256 tokenAllocation, uint256 tokensSold, bool active ) { Stage memory stage = stages[currentStageId]; return ( stage.name, stage.price, stage.tokenAllocation, stage.tokensSold, stage.active ); } /** * @dev Pause the contract */ function pause() external onlyOwner { _pause(); } /** * @dev Unpause the contract */ function unpause() external onlyOwner { _unpause(); } // Support existing functions for frontend compatibility /** * @dev Get contribution amount for a user and token * @param user The user address * @param token The token address (ETH, USDC, or USDT) * @return The contribution amount */ function getContribution(address user, address token) external view returns (uint256) { require(token == ETH_ADDRESS || token == usdcAddress || token == usdtAddress, "Unsupported token"); return contributions[user][token]; } /** * @dev Get total contributions for a token * @param token The token address (ETH, USDC, or USDT) * @return The total contribution amount */ function totalContributions(address token) external view returns (uint256) { require(token == ETH_ADDRESS || token == usdcAddress || token == usdtAddress, "Unsupported token"); return totalContributionsByToken[token]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_usdc","type":"address"},{"internalType":"address","name":"_usdt","type":"address"},{"internalType":"address","name":"_ethReceiver","type":"address"},{"internalType":"address","name":"_priceFeed","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[],"name":"ClaimingEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensAllocated","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"stageId","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Contribution","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"oldStageId","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newStageId","type":"uint8"}],"name":"StageChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"ETH_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRECISION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithUSDC","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyWithUSDT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"contributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentStageId","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableClaiming","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ethPriceFeed","outputs":[{"internalType":"contract AggregatorV3Interface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ethReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"address","name":"token","type":"address"}],"name":"getContribution","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentStage","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenAllocation","type":"uint256"},{"internalType":"uint256","name":"tokensSold","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEthPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lynoToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchasedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newStageId","type":"uint8"}],"name":"setStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lynoToken","type":"address"}],"name":"setToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"stages","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"tokenAllocation","type":"uint256"},{"internalType":"uint256","name":"tokensSold","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"totalContributions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalContributionsByToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokensSold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usdcAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usdtAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"withdrawERC20","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040525f600660156101000a81548160ff021916908315150217905550348015610029575f5ffd5b5060405161477a38038061477a833981810160405281019061004b9190610b22565b335f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036100bc575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016100b39190610b95565b60405180910390fd5b6100cb816103a260201b60201c565b50600180819055505f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610141576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161013890610c08565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036101af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101a690610c70565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361021d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161021490610cd8565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361028b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161028290610d40565b60405180910390fd5b8360025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508260035f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508160045f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061039961046360201b60201c565b505050506110d8565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6040518060a001604052806040518060400160405280600a81526020017f4561726c79204269726400000000000000000000000000000000000000000000815250815260200166b1a2bc2ec500008152602001670de0b6b3a764000062f424006104cd9190610d94565b81526020015f815260200160011515815250600c5f5f60ff1681526020019081526020015f205f820151815f0190816105069190611009565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083151502179055509050506040518060a001604052806040518060400160405280600781526020017f5374616765203100000000000000000000000000000000000000000000000000815250815260200166c3663566a580008152602001670de0b6b3a76400006301406f406105b29190610d94565b81526020015f81526020015f1515815250600c5f600160ff1681526020019081526020015f205f820151815f0190816105eb9190611009565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083151502179055509050506040518060a001604052806040518060400160405280600781526020017f5374616765203200000000000000000000000000000000000000000000000000815250815260200166d529ae9e8600008152602001670de0b6b3a76400006301406f406106979190610d94565b81526020015f81526020015f1515815250600c5f600260ff1681526020019081526020015f205f820151815f0190816106d09190611009565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083151502179055509050506040518060a001604052806040518060400160405280600781526020017f5374616765203300000000000000000000000000000000000000000000000000815250815260200166f8b0a10e4700008152602001670de0b6b3a76400006301406f4061077c9190610d94565b81526020015f81526020015f1515815250600c5f600360ff1681526020019081526020015f205f820151815f0190816107b59190611009565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083151502179055509050506040518060a001604052806040518060400160405280600781526020017f5374616765203400000000000000000000000000000000000000000000000000815250815260200167011c37937e0800008152602001670de0b6b3a76400006301406f406108629190610d94565b81526020015f81526020015f1515815250600c5f600460ff1681526020019081526020015f205f820151815f01908161089b9190611009565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083151502179055509050506040518060a001604052806040518060400160405280600781526020017f5374616765203500000000000000000000000000000000000000000000000000815250815260200167012dfb0cb5e880008152602001670de0b6b3a764000063016e36006109489190610d94565b81526020015f81526020015f1515815250600c5f600560ff1681526020019081526020015f205f820151815f0190816109819190611009565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083151502179055509050506040518060a001604052806040518060400160405280600a81526020017f426f6e7573204669726500000000000000000000000000000000000000000000815250815260200167016345785d8a00008152602001670de0b6b3a764000062f42400610a2d9190610d94565b81526020015f81526020015f1515815250600c5f600660ff1681526020019081526020015f205f820151815f019081610a669190611009565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083151502179055509050505f600660146101000a81548160ff021916908360ff160217905550565b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610af182610ac8565b9050919050565b610b0181610ae7565b8114610b0b575f5ffd5b50565b5f81519050610b1c81610af8565b92915050565b5f5f5f5f60808587031215610b3a57610b39610ac4565b5b5f610b4787828801610b0e565b9450506020610b5887828801610b0e565b9350506040610b6987828801610b0e565b9250506060610b7a87828801610b0e565b91505092959194509250565b610b8f81610ae7565b82525050565b5f602082019050610ba85f830184610b86565b92915050565b5f82825260208201905092915050565b7f496e76616c6964205553444320616464726573730000000000000000000000005f82015250565b5f610bf2601483610bae565b9150610bfd82610bbe565b602082019050919050565b5f6020820190508181035f830152610c1f81610be6565b9050919050565b7f496e76616c6964205553445420616464726573730000000000000000000000005f82015250565b5f610c5a601483610bae565b9150610c6582610c26565b602082019050919050565b5f6020820190508181035f830152610c8781610c4e565b9050919050565b7f496e76616c6964204554482072656365697665722061646472657373000000005f82015250565b5f610cc2601c83610bae565b9150610ccd82610c8e565b602082019050919050565b5f6020820190508181035f830152610cef81610cb6565b9050919050565b7f496e76616c6964207072696365206665656420616464726573730000000000005f82015250565b5f610d2a601a83610bae565b9150610d3582610cf6565b602082019050919050565b5f6020820190508181035f830152610d5781610d1e565b9050919050565b5f819050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610d9e82610d5e565b9150610da983610d5e565b9250828202610db781610d5e565b91508282048414831517610dce57610dcd610d67565b5b5092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680610e5057607f821691505b602082108103610e6357610e62610e0c565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302610ec57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610e8a565b610ecf8683610e8a565b95508019841693508086168417925050509392505050565b5f819050919050565b5f610f0a610f05610f0084610d5e565b610ee7565b610d5e565b9050919050565b5f819050919050565b610f2383610ef0565b610f37610f2f82610f11565b848454610e96565b825550505050565b5f5f905090565b610f4e610f3f565b610f59818484610f1a565b505050565b5b81811015610f7c57610f715f82610f46565b600181019050610f5f565b5050565b601f821115610fc157610f9281610e69565b610f9b84610e7b565b81016020851015610faa578190505b610fbe610fb685610e7b565b830182610f5e565b50505b505050565b5f82821c905092915050565b5f610fe15f1984600802610fc6565b1980831691505092915050565b5f610ff98383610fd2565b9150826002028217905092915050565b61101282610dd5565b67ffffffffffffffff81111561102b5761102a610ddf565b5b6110358254610e39565b611040828285610f80565b5f60209050601f831160018114611071575f841561105f578287015190505b6110698582610fee565b8655506110d0565b601f19841661107f86610e69565b5f5b828110156110a657848901518255600182019150602085019450602081019050611081565b868310156110c357848901516110bf601f891682610fd2565b8355505b6001600288020188555050505b505050505050565b613695806110e55f395ff3fe6080604052600436106101ed575f3560e01c806373b2e80e1161010c578063aeccf7351161009f578063e282a8741161006e578063e282a8741461066d578063ec45127a146106a9578063eedbe31d146106d3578063f2fde38b14610701578063f4f3b20014610729576101ed565b8063aeccf735146105c9578063af7665ce146105f1578063b98884721461061b578063ce3cd99714610645576101ed565b80639ab4a445116100db5780639ab4a44514610523578063a734f06e1461054d578063a7c6016014610577578063aaf5eb681461059f576101ed565b806373b2e80e1461046b5780637ed3deba146104a75780638456cb59146104e35780638da5cb5b146104f9576101ed565b80632a23a6b6116101845780635c975abb116101535780635c975abb146103d757806363b201171461040157806367c9b0171461042b578063715018a614610455576101ed565b80632a23a6b6146103455780633f4ba83a1461036f5780634bae6f3f146103855780634e71d92d146103c1576101ed565b8063150d283d116101c0578063150d283d146102a95780631e88b2aa146102b35780632081a88c146102f357806329369ccf14610309576101ed565b806302d45457146101f15780630e141a9b1461021b578063126eac4314610245578063144fa6d714610281575b5f5ffd5b3480156101fc575f5ffd5b50610205610751565b6040516102129190612901565b60405180910390f35b348015610226575f5ffd5b5061022f610776565b60405161023c9190612934565b60405180910390f35b348015610250575f5ffd5b5061026b6004803603810190610266919061297b565b610789565b60405161027891906129d1565b60405180910390f35b34801561028c575f5ffd5b506102a760048036038101906102a291906129ea565b61093b565b005b6102b1610a83565b005b3480156102be575f5ffd5b506102d960048036038101906102d49190612a4b565b610ef0565b6040516102ea959493929190612ae6565b60405180910390f35b3480156102fe575f5ffd5b50610307610fb4565b005b348015610314575f5ffd5b5061032f600480360381019061032a919061297b565b611094565b60405161033c91906129d1565b60405180910390f35b348015610350575f5ffd5b506103596110b4565b6040516103669190612901565b60405180910390f35b34801561037a575f5ffd5b506103836110d9565b005b348015610390575f5ffd5b506103ab60048036038101906103a691906129ea565b6110eb565b6040516103b891906129d1565b60405180910390f35b3480156103cc575f5ffd5b506103d5611100565b005b3480156103e2575f5ffd5b506103eb61139b565b6040516103f89190612934565b60405180910390f35b34801561040c575f5ffd5b506104156113b0565b60405161042291906129d1565b60405180910390f35b348015610436575f5ffd5b5061043f6113b6565b60405161044c91906129d1565b60405180910390f35b348015610460575f5ffd5b506104696114a5565b005b348015610476575f5ffd5b50610491600480360381019061048c91906129ea565b6114b8565b60405161049e9190612934565b60405180910390f35b3480156104b2575f5ffd5b506104cd60048036038101906104c891906129ea565b6114d5565b6040516104da91906129d1565b60405180910390f35b3480156104ee575f5ffd5b506104f761164b565b005b348015610504575f5ffd5b5061050d61165d565b60405161051a9190612901565b60405180910390f35b34801561052e575f5ffd5b50610537611684565b6040516105449190612901565b60405180910390f35b348015610558575f5ffd5b506105616116a9565b60405161056e9190612901565b60405180910390f35b348015610582575f5ffd5b5061059d60048036038101906105989190612b68565b6116c1565b005b3480156105aa575f5ffd5b506105b3611ac0565b6040516105c091906129d1565b60405180910390f35b3480156105d4575f5ffd5b506105ef60048036038101906105ea9190612b68565b611acc565b005b3480156105fc575f5ffd5b50610605611ecb565b6040516106129190612bee565b60405180910390f35b348015610626575f5ffd5b5061062f611ef0565b60405161063c9190612901565b60405180910390f35b348015610650575f5ffd5b5061066b60048036038101906106669190612a4b565b611f15565b005b348015610678575f5ffd5b50610693600480360381019061068e91906129ea565b612093565b6040516106a091906129d1565b60405180910390f35b3480156106b4575f5ffd5b506106bd6120a8565b6040516106ca9190612c16565b60405180910390f35b3480156106de575f5ffd5b506106e76120bb565b6040516106f8959493929190612ae6565b60405180910390f35b34801561070c575f5ffd5b50610727600480360381019061072291906129ea565b6121e6565b005b348015610734575f5ffd5b5061074f600480360381019061074a91906129ea565b61226a565b005b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660159054906101000a900460ff1681565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480610824575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061087b575060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b190612c79565b60405180910390fd5b600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610943612444565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890612ce1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3790612d49565b60405180910390fd5b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610a8b6124cb565b610a93612511565b5f3411610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc90612dd7565b60405180910390fd5b5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f209050806004015f9054906101000a900460ff16610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590612e3f565b60405180910390fd5b5f610b576113b6565b90505f670de0b6b3a76400008234610b6f9190612e8a565b610b799190612ef8565b90505f8360010154670de0b6b3a764000083610b959190612e8a565b610b9f9190612ef8565b90505f8190508460020154818660030154610bba9190612f28565b1115610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290612fa5565b60405180910390fd5b80856003015f828254610c0e9190612f28565b925050819055508060075f828254610c269190612f28565b925050819055508060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610c799190612f28565b9250508190555034600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d1b9190612f28565b9250508190555034600b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d829190612f28565b925050819055505f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610dcf90612ff0565b5f6040518083038185875af1925050503d805f8114610e09576040519150601f19603f3d011682016040523d82523d5f602084013e610e0e565b606091505b5050905080610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061304e565b60405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f99090e5231c4c7765fabae78f8cca1dbd9296387cdc37a898de0d3cb7f3647b83485600660149054906101000a900460ff1642604051610ed8949392919061306c565b60405180910390a3505050505050610eee612552565b565b600c602052805f5260405f205f91509050805f018054610f0f906130dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3b906130dc565b8015610f865780601f10610f5d57610100808354040283529160200191610f86565b820191905f5260205f20905b815481529060010190602001808311610f6957829003601f168201915b505050505090806001015490806002015490806003015490806004015f9054906101000a900460ff16905085565b610fbc612444565b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290613156565b60405180910390fd5b6001600660156101000a81548160ff0219169083151502179055507f25b238f97b16f614c2cc471460ad0d72c33c632bde1300d098e531ed9b5a627a60405160405180910390a1565b600a602052815f5260405f20602052805f5260405f205f91509150505481565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110e1612444565b6110e961255b565b565b6008602052805f5260405f205f915090505481565b6111086124cb565b600660159054906101000a900460ff16611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e906131be565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90613226565b60405180910390fd5b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112579061328e565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050600160095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611342338260055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125bc9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e4308260405161138891906129d1565b60405180910390a250611399612552565b565b5f5f60149054906101000a900460ff16905090565b60075481565b5f5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611422573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114469190613332565b5050509150505f811361148e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611485906133f3565b60405180910390fd5b6402540be4008161149f9190612e8a565b91505090565b6114ad612444565b6114b65f61263b565b565b6009602052805f5260405f205f915054906101000a900460ff1681565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480611570575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806115c7575060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90612c79565b60405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611653612444565b61165b6126fc565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6116c96124cb565b6116d1612511565b5f8111611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a9061345b565b60405180910390fd5b5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f209050806004015f9054906101000a900460ff1661178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390612e3f565b60405180910390fd5b5f64e8d4a510008361179e9190612e8a565b90505f8260010154670de0b6b3a7640000836117ba9190612e8a565b6117c49190612ef8565b90505f81905083600201548185600301546117df9190612f28565b1115611820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181790612fa5565b60405180910390fd5b80846003015f8282546118339190612f28565b925050819055508060075f82825461184b9190612f28565b925050819055508060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461189e9190612f28565b9250508190555084600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461194d9190612f28565b9250508190555084600b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546119c19190612f28565b92505081905550611a1633308760035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661275e909392919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f99090e5231c4c7765fabae78f8cca1dbd9296387cdc37a898de0d3cb7f3647b88784600660149054906101000a900460ff1642604051611aa9949392919061306c565b60405180910390a350505050611abd612552565b50565b670de0b6b3a764000081565b611ad46124cb565b611adc612511565b5f8111611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b159061345b565b60405180910390fd5b5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f209050806004015f9054906101000a900460ff16611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90612e3f565b60405180910390fd5b5f64e8d4a5100083611ba99190612e8a565b90505f8260010154670de0b6b3a764000083611bc59190612e8a565b611bcf9190612ef8565b90505f8190508360020154818560030154611bea9190612f28565b1115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290612fa5565b60405180910390fd5b80846003015f828254611c3e9190612f28565b925050819055508060075f828254611c569190612f28565b925050819055508060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ca99190612f28565b9250508190555084600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d589190612f28565b9250508190555084600b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611dcc9190612f28565b92505081905550611e2133308760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661275e909392919063ffffffff16565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f99090e5231c4c7765fabae78f8cca1dbd9296387cdc37a898de0d3cb7f3647b88784600660149054906101000a900460ff1642604051611eb4949392919061306c565b60405180910390a350505050611ec8612552565b50565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f1d612444565b60068160ff161115611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5b906134c3565b60405180910390fd5b600660149054906101000a900460ff1660ff168160ff1603611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb29061352b565b60405180910390fd5b5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f206004015f6101000a81548160ff0219169083151502179055506001600c5f8360ff1660ff1681526020019081526020015f206004015f6101000a81548160ff0219169083151502179055507f0f63b8bffe147a0fe1362da0e6e3ae0fcffce5497482f4d438715fe53890acf1600660149054906101000a900460ff168260405161206d929190613549565b60405180910390a180600660146101000a81548160ff021916908360ff16021790555050565b600b602052805f5260405f205f915090505481565b600660149054906101000a900460ff1681565b60605f5f5f5f5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f206040518060a00160405290815f82018054612102906130dc565b80601f016020809104026020016040519081016040528092919081815260200182805461212e906130dc565b80156121795780601f1061215057610100808354040283529160200191612179565b820191905f5260205f20905b81548152906001019060200180831161215c57829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015f9054906101000a900460ff1615151515815250509050805f0151816020015182604001518360600151846080015195509550955095509550509091929394565b6121ee612444565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361225e575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016122559190612901565b60405180910390fd5b6122678161263b565b50565b612272612444565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612319575060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90612c79565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123929190612901565b602060405180830381865afa1580156123ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123d19190613570565b90505f8111612415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240c906135e5565b60405180910390fd5b61244033828473ffffffffffffffffffffffffffffffffffffffff166125bc9092919063ffffffff16565b5050565b61244c6127e0565b73ffffffffffffffffffffffffffffffffffffffff1661246a61165d565b73ffffffffffffffffffffffffffffffffffffffff16146124c95761248d6127e0565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016124c09190612901565b60405180910390fd5b565b600260015403612507576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b61251961139b565b15612550576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60018081905550565b6125636127e7565b5f5f60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125a56127e0565b6040516125b29190612901565b60405180910390a1565b612636838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016125ef929190613603565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612827565b505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612704612511565b60015f60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127476127e0565b6040516127549190612901565b60405180910390a1565b6127da848573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016127939392919061362a565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612827565b50505050565b5f33905090565b6127ef61139b565b612825576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f5f60205f8451602086015f885af180612846576040513d5f823e3d81fd5b3d92505f519150505f821461285f57600181141561287a565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b156128bc57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016128b39190612901565b60405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6128eb826128c2565b9050919050565b6128fb816128e1565b82525050565b5f6020820190506129145f8301846128f2565b92915050565b5f8115159050919050565b61292e8161291a565b82525050565b5f6020820190506129475f830184612925565b92915050565b5f5ffd5b61295a816128e1565b8114612964575f5ffd5b50565b5f8135905061297581612951565b92915050565b5f5f604083850312156129915761299061294d565b5b5f61299e85828601612967565b92505060206129af85828601612967565b9150509250929050565b5f819050919050565b6129cb816129b9565b82525050565b5f6020820190506129e45f8301846129c2565b92915050565b5f602082840312156129ff576129fe61294d565b5b5f612a0c84828501612967565b91505092915050565b5f60ff82169050919050565b612a2a81612a15565b8114612a34575f5ffd5b50565b5f81359050612a4581612a21565b92915050565b5f60208284031215612a6057612a5f61294d565b5b5f612a6d84828501612a37565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612ab882612a76565b612ac28185612a80565b9350612ad2818560208601612a90565b612adb81612a9e565b840191505092915050565b5f60a0820190508181035f830152612afe8188612aae565b9050612b0d60208301876129c2565b612b1a60408301866129c2565b612b2760608301856129c2565b612b346080830184612925565b9695505050505050565b612b47816129b9565b8114612b51575f5ffd5b50565b5f81359050612b6281612b3e565b92915050565b5f60208284031215612b7d57612b7c61294d565b5b5f612b8a84828501612b54565b91505092915050565b5f819050919050565b5f612bb6612bb1612bac846128c2565b612b93565b6128c2565b9050919050565b5f612bc782612b9c565b9050919050565b5f612bd882612bbd565b9050919050565b612be881612bce565b82525050565b5f602082019050612c015f830184612bdf565b92915050565b612c1081612a15565b82525050565b5f602082019050612c295f830184612c07565b92915050565b7f556e737570706f7274656420746f6b656e0000000000000000000000000000005f82015250565b5f612c63601183612a80565b9150612c6e82612c2f565b602082019050919050565b5f6020820190508181035f830152612c9081612c57565b9050919050565b7f496e76616c696420746f6b656e206164647265737300000000000000000000005f82015250565b5f612ccb601583612a80565b9150612cd682612c97565b602082019050919050565b5f6020820190508181035f830152612cf881612cbf565b9050919050565b7f546f6b656e20616c7265616479207365740000000000000000000000000000005f82015250565b5f612d33601183612a80565b9150612d3e82612cff565b602082019050919050565b5f6020820190508181035f830152612d6081612d27565b9050919050565b7f45544820616d6f756e74206d7573742062652067726561746572207468616e205f8201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b5f612dc1602183612a80565b9150612dcc82612d67565b604082019050919050565b5f6020820190508181035f830152612dee81612db5565b9050919050565b7f43757272656e74207374616765206e6f742061637469766500000000000000005f82015250565b5f612e29601883612a80565b9150612e3482612df5565b602082019050919050565b5f6020820190508181035f830152612e5681612e1d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e94826129b9565b9150612e9f836129b9565b9250828202612ead816129b9565b91508282048414831517612ec457612ec3612e5d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612f02826129b9565b9150612f0d836129b9565b925082612f1d57612f1c612ecb565b5b828204905092915050565b5f612f32826129b9565b9150612f3d836129b9565b9250828201905080821115612f5557612f54612e5d565b5b92915050565b7f4578636565647320737461676520616c6c6f636174696f6e00000000000000005f82015250565b5f612f8f601883612a80565b9150612f9a82612f5b565b602082019050919050565b5f6020820190508181035f830152612fbc81612f83565b9050919050565b5f81905092915050565b50565b5f612fdb5f83612fc3565b9150612fe682612fcd565b5f82019050919050565b5f612ffa82612fd0565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f613038601383612a80565b915061304382613004565b602082019050919050565b5f6020820190508181035f8301526130658161302c565b9050919050565b5f60808201905061307f5f8301876129c2565b61308c60208301866129c2565b6130996040830185612c07565b6130a660608301846129c2565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806130f357607f821691505b602082108103613106576131056130af565b5b50919050565b7f546f6b656e206e6f7420736574000000000000000000000000000000000000005f82015250565b5f613140600d83612a80565b915061314b8261310c565b602082019050919050565b5f6020820190508181035f83015261316d81613134565b9050919050565b7f436c61696d696e67206e6f7420656e61626c65642079657400000000000000005f82015250565b5f6131a8601883612a80565b91506131b382613174565b602082019050919050565b5f6020820190508181035f8301526131d58161319c565b9050919050565b7f4e6f20746f6b656e7320746f20636c61696d00000000000000000000000000005f82015250565b5f613210601283612a80565b915061321b826131dc565b602082019050919050565b5f6020820190508181035f83015261323d81613204565b9050919050565b7f416c726561647920636c61696d656400000000000000000000000000000000005f82015250565b5f613278600f83612a80565b915061328382613244565b602082019050919050565b5f6020820190508181035f8301526132a58161326c565b9050919050565b5f69ffffffffffffffffffff82169050919050565b6132ca816132ac565b81146132d4575f5ffd5b50565b5f815190506132e5816132c1565b92915050565b5f819050919050565b6132fd816132eb565b8114613307575f5ffd5b50565b5f81519050613318816132f4565b92915050565b5f8151905061332c81612b3e565b92915050565b5f5f5f5f5f60a0868803121561334b5761334a61294d565b5b5f613358888289016132d7565b95505060206133698882890161330a565b945050604061337a8882890161331e565b935050606061338b8882890161331e565b925050608061339c888289016132d7565b9150509295509295909350565b7f496e76616c6964204554482070726963650000000000000000000000000000005f82015250565b5f6133dd601183612a80565b91506133e8826133a9565b602082019050919050565b5f6020820190508181035f83015261340a816133d1565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20300000005f82015250565b5f613445601d83612a80565b915061345082613411565b602082019050919050565b5f6020820190508181035f83015261347281613439565b9050919050565b7f496e76616c6964207374616765204944000000000000000000000000000000005f82015250565b5f6134ad601083612a80565b91506134b882613479565b602082019050919050565b5f6020820190508181035f8301526134da816134a1565b9050919050565b7f416c726561647920696e207468697320737461676500000000000000000000005f82015250565b5f613515601583612a80565b9150613520826134e1565b602082019050919050565b5f6020820190508181035f83015261354281613509565b9050919050565b5f60408201905061355c5f830185612c07565b6135696020830184612c07565b9392505050565b5f602082840312156135855761358461294d565b5b5f6135928482850161331e565b91505092915050565b7f4e6f20746f6b656e7320746f20776974686472617700000000000000000000005f82015250565b5f6135cf601583612a80565b91506135da8261359b565b602082019050919050565b5f6020820190508181035f8301526135fc816135c3565b9050919050565b5f6040820190506136165f8301856128f2565b61362360208301846129c2565b9392505050565b5f60608201905061363d5f8301866128f2565b61364a60208301856128f2565b61365760408301846129c2565b94935050505056fea26469706673582212200b670c59cfbb6e60e5c7c2683d8790816b4f27ce0515f03205b9a019c535e89f64736f6c634300081e0033000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a7565c6f03e0584671d945dd7949a26abb1dcae40000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode
0x6080604052600436106101ed575f3560e01c806373b2e80e1161010c578063aeccf7351161009f578063e282a8741161006e578063e282a8741461066d578063ec45127a146106a9578063eedbe31d146106d3578063f2fde38b14610701578063f4f3b20014610729576101ed565b8063aeccf735146105c9578063af7665ce146105f1578063b98884721461061b578063ce3cd99714610645576101ed565b80639ab4a445116100db5780639ab4a44514610523578063a734f06e1461054d578063a7c6016014610577578063aaf5eb681461059f576101ed565b806373b2e80e1461046b5780637ed3deba146104a75780638456cb59146104e35780638da5cb5b146104f9576101ed565b80632a23a6b6116101845780635c975abb116101535780635c975abb146103d757806363b201171461040157806367c9b0171461042b578063715018a614610455576101ed565b80632a23a6b6146103455780633f4ba83a1461036f5780634bae6f3f146103855780634e71d92d146103c1576101ed565b8063150d283d116101c0578063150d283d146102a95780631e88b2aa146102b35780632081a88c146102f357806329369ccf14610309576101ed565b806302d45457146101f15780630e141a9b1461021b578063126eac4314610245578063144fa6d714610281575b5f5ffd5b3480156101fc575f5ffd5b50610205610751565b6040516102129190612901565b60405180910390f35b348015610226575f5ffd5b5061022f610776565b60405161023c9190612934565b60405180910390f35b348015610250575f5ffd5b5061026b6004803603810190610266919061297b565b610789565b60405161027891906129d1565b60405180910390f35b34801561028c575f5ffd5b506102a760048036038101906102a291906129ea565b61093b565b005b6102b1610a83565b005b3480156102be575f5ffd5b506102d960048036038101906102d49190612a4b565b610ef0565b6040516102ea959493929190612ae6565b60405180910390f35b3480156102fe575f5ffd5b50610307610fb4565b005b348015610314575f5ffd5b5061032f600480360381019061032a919061297b565b611094565b60405161033c91906129d1565b60405180910390f35b348015610350575f5ffd5b506103596110b4565b6040516103669190612901565b60405180910390f35b34801561037a575f5ffd5b506103836110d9565b005b348015610390575f5ffd5b506103ab60048036038101906103a691906129ea565b6110eb565b6040516103b891906129d1565b60405180910390f35b3480156103cc575f5ffd5b506103d5611100565b005b3480156103e2575f5ffd5b506103eb61139b565b6040516103f89190612934565b60405180910390f35b34801561040c575f5ffd5b506104156113b0565b60405161042291906129d1565b60405180910390f35b348015610436575f5ffd5b5061043f6113b6565b60405161044c91906129d1565b60405180910390f35b348015610460575f5ffd5b506104696114a5565b005b348015610476575f5ffd5b50610491600480360381019061048c91906129ea565b6114b8565b60405161049e9190612934565b60405180910390f35b3480156104b2575f5ffd5b506104cd60048036038101906104c891906129ea565b6114d5565b6040516104da91906129d1565b60405180910390f35b3480156104ee575f5ffd5b506104f761164b565b005b348015610504575f5ffd5b5061050d61165d565b60405161051a9190612901565b60405180910390f35b34801561052e575f5ffd5b50610537611684565b6040516105449190612901565b60405180910390f35b348015610558575f5ffd5b506105616116a9565b60405161056e9190612901565b60405180910390f35b348015610582575f5ffd5b5061059d60048036038101906105989190612b68565b6116c1565b005b3480156105aa575f5ffd5b506105b3611ac0565b6040516105c091906129d1565b60405180910390f35b3480156105d4575f5ffd5b506105ef60048036038101906105ea9190612b68565b611acc565b005b3480156105fc575f5ffd5b50610605611ecb565b6040516106129190612bee565b60405180910390f35b348015610626575f5ffd5b5061062f611ef0565b60405161063c9190612901565b60405180910390f35b348015610650575f5ffd5b5061066b60048036038101906106669190612a4b565b611f15565b005b348015610678575f5ffd5b50610693600480360381019061068e91906129ea565b612093565b6040516106a091906129d1565b60405180910390f35b3480156106b4575f5ffd5b506106bd6120a8565b6040516106ca9190612c16565b60405180910390f35b3480156106de575f5ffd5b506106e76120bb565b6040516106f8959493929190612ae6565b60405180910390f35b34801561070c575f5ffd5b50610727600480360381019061072291906129ea565b6121e6565b005b348015610734575f5ffd5b5061074f600480360381019061074a91906129ea565b61226a565b005b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660159054906101000a900460ff1681565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480610824575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b8061087b575060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b6108ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b190612c79565b60405180910390fd5b600a5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b610943612444565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890612ce1565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3790612d49565b60405180910390fd5b8060055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610a8b6124cb565b610a93612511565b5f3411610ad5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acc90612dd7565b60405180910390fd5b5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f209050806004015f9054906101000a900460ff16610b4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4590612e3f565b60405180910390fd5b5f610b576113b6565b90505f670de0b6b3a76400008234610b6f9190612e8a565b610b799190612ef8565b90505f8360010154670de0b6b3a764000083610b959190612e8a565b610b9f9190612ef8565b90505f8190508460020154818660030154610bba9190612f28565b1115610bfb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf290612fa5565b60405180910390fd5b80856003015f828254610c0e9190612f28565b925050819055508060075f828254610c269190612f28565b925050819055508060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610c799190612f28565b9250508190555034600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d1b9190612f28565b9250508190555034600b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254610d829190612f28565b925050819055505f60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1634604051610dcf90612ff0565b5f6040518083038185875af1925050503d805f8114610e09576040519150601f19603f3d011682016040523d82523d5f602084013e610e0e565b606091505b5050905080610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061304e565b60405180910390fd5b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f99090e5231c4c7765fabae78f8cca1dbd9296387cdc37a898de0d3cb7f3647b83485600660149054906101000a900460ff1642604051610ed8949392919061306c565b60405180910390a3505050505050610eee612552565b565b600c602052805f5260405f205f91509050805f018054610f0f906130dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610f3b906130dc565b8015610f865780601f10610f5d57610100808354040283529160200191610f86565b820191905f5260205f20905b815481529060010190602001808311610f6957829003601f168201915b505050505090806001015490806002015490806003015490806004015f9054906101000a900460ff16905085565b610fbc612444565b5f73ffffffffffffffffffffffffffffffffffffffff1660055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361104b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104290613156565b60405180910390fd5b6001600660156101000a81548160ff0219169083151502179055507f25b238f97b16f614c2cc471460ad0d72c33c632bde1300d098e531ed9b5a627a60405160405180910390a1565b600a602052815f5260405f20602052805f5260405f205f91509150505481565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6110e1612444565b6110e961255b565b565b6008602052805f5260405f205f915090505481565b6111086124cb565b600660159054906101000a900460ff16611157576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114e906131be565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116111d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cd90613226565b60405180910390fd5b60095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615611260576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112579061328e565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050600160095f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550611342338260055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166125bc9092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f896e034966eaaf1adc54acc0f257056febbd300c9e47182cf761982cf1f5e4308260405161138891906129d1565b60405180910390a250611399612552565b565b5f5f60149054906101000a900460ff16905090565b60075481565b5f5f60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa158015611422573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114469190613332565b5050509150505f811361148e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611485906133f3565b60405180910390fd5b6402540be4008161149f9190612e8a565b91505090565b6114ad612444565b6114b65f61263b565b565b6009602052805f5260405f205f915054906101000a900460ff1681565b5f73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161480611570575060025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806115c7575060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b611606576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fd90612c79565b60405180910390fd5b600b5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611653612444565b61165b6126fc565b565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b73eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee81565b6116c96124cb565b6116d1612511565b5f8111611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a9061345b565b60405180910390fd5b5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f209050806004015f9054906101000a900460ff1661178c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178390612e3f565b60405180910390fd5b5f64e8d4a510008361179e9190612e8a565b90505f8260010154670de0b6b3a7640000836117ba9190612e8a565b6117c49190612ef8565b90505f81905083600201548185600301546117df9190612f28565b1115611820576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181790612fa5565b60405180910390fd5b80846003015f8282546118339190612f28565b925050819055508060075f82825461184b9190612f28565b925050819055508060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461189e9190612f28565b9250508190555084600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461194d9190612f28565b9250508190555084600b5f60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546119c19190612f28565b92505081905550611a1633308760035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661275e909392919063ffffffff16565b60035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f99090e5231c4c7765fabae78f8cca1dbd9296387cdc37a898de0d3cb7f3647b88784600660149054906101000a900460ff1642604051611aa9949392919061306c565b60405180910390a350505050611abd612552565b50565b670de0b6b3a764000081565b611ad46124cb565b611adc612511565b5f8111611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b159061345b565b60405180910390fd5b5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f209050806004015f9054906101000a900460ff16611b97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8e90612e3f565b60405180910390fd5b5f64e8d4a5100083611ba99190612e8a565b90505f8260010154670de0b6b3a764000083611bc59190612e8a565b611bcf9190612ef8565b90505f8190508360020154818560030154611bea9190612f28565b1115611c2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2290612fa5565b60405180910390fd5b80846003015f828254611c3e9190612f28565b925050819055508060075f828254611c569190612f28565b925050819055508060085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611ca99190612f28565b9250508190555084600a5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611d589190612f28565b9250508190555084600b5f60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254611dcc9190612f28565b92505081905550611e2133308760025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661275e909392919063ffffffff16565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f99090e5231c4c7765fabae78f8cca1dbd9296387cdc37a898de0d3cb7f3647b88784600660149054906101000a900460ff1642604051611eb4949392919061306c565b60405180910390a350505050611ec8612552565b50565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611f1d612444565b60068160ff161115611f64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5b906134c3565b60405180910390fd5b600660149054906101000a900460ff1660ff168160ff1603611fbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb29061352b565b60405180910390fd5b5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f206004015f6101000a81548160ff0219169083151502179055506001600c5f8360ff1660ff1681526020019081526020015f206004015f6101000a81548160ff0219169083151502179055507f0f63b8bffe147a0fe1362da0e6e3ae0fcffce5497482f4d438715fe53890acf1600660149054906101000a900460ff168260405161206d929190613549565b60405180910390a180600660146101000a81548160ff021916908360ff16021790555050565b600b602052805f5260405f205f915090505481565b600660149054906101000a900460ff1681565b60605f5f5f5f5f600c5f600660149054906101000a900460ff1660ff1660ff1681526020019081526020015f206040518060a00160405290815f82018054612102906130dc565b80601f016020809104026020016040519081016040528092919081815260200182805461212e906130dc565b80156121795780601f1061215057610100808354040283529160200191612179565b820191905f5260205f20905b81548152906001019060200180831161215c57829003601f168201915b50505050508152602001600182015481526020016002820154815260200160038201548152602001600482015f9054906101000a900460ff1615151515815250509050805f0151816020015182604001518360600151846080015195509550955095509550509091929394565b6121ee612444565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361225e575f6040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081526004016122559190612901565b60405180910390fd5b6122678161263b565b50565b612272612444565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480612319575060035f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b612358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234f90612c79565b60405180910390fd5b5f8173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016123929190612901565b602060405180830381865afa1580156123ad573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123d19190613570565b90505f8111612415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240c906135e5565b60405180910390fd5b61244033828473ffffffffffffffffffffffffffffffffffffffff166125bc9092919063ffffffff16565b5050565b61244c6127e0565b73ffffffffffffffffffffffffffffffffffffffff1661246a61165d565b73ffffffffffffffffffffffffffffffffffffffff16146124c95761248d6127e0565b6040517f118cdaa70000000000000000000000000000000000000000000000000000000081526004016124c09190612901565b60405180910390fd5b565b600260015403612507576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b61251961139b565b15612550576040517fd93c066500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b60018081905550565b6125636127e7565b5f5f60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6125a56127e0565b6040516125b29190612901565b60405180910390a1565b612636838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb85856040516024016125ef929190613603565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612827565b505050565b5f5f5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050815f5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612704612511565b60015f60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127476127e0565b6040516127549190612901565b60405180910390a1565b6127da848573ffffffffffffffffffffffffffffffffffffffff166323b872dd8686866040516024016127939392919061362a565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612827565b50505050565b5f33905090565b6127ef61139b565b612825576040517f8dfc202b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b565b5f5f60205f8451602086015f885af180612846576040513d5f823e3d81fd5b3d92505f519150505f821461285f57600181141561287a565b5f8473ffffffffffffffffffffffffffffffffffffffff163b145b156128bc57836040517f5274afe70000000000000000000000000000000000000000000000000000000081526004016128b39190612901565b60405180910390fd5b50505050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6128eb826128c2565b9050919050565b6128fb816128e1565b82525050565b5f6020820190506129145f8301846128f2565b92915050565b5f8115159050919050565b61292e8161291a565b82525050565b5f6020820190506129475f830184612925565b92915050565b5f5ffd5b61295a816128e1565b8114612964575f5ffd5b50565b5f8135905061297581612951565b92915050565b5f5f604083850312156129915761299061294d565b5b5f61299e85828601612967565b92505060206129af85828601612967565b9150509250929050565b5f819050919050565b6129cb816129b9565b82525050565b5f6020820190506129e45f8301846129c2565b92915050565b5f602082840312156129ff576129fe61294d565b5b5f612a0c84828501612967565b91505092915050565b5f60ff82169050919050565b612a2a81612a15565b8114612a34575f5ffd5b50565b5f81359050612a4581612a21565b92915050565b5f60208284031215612a6057612a5f61294d565b5b5f612a6d84828501612a37565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f612ab882612a76565b612ac28185612a80565b9350612ad2818560208601612a90565b612adb81612a9e565b840191505092915050565b5f60a0820190508181035f830152612afe8188612aae565b9050612b0d60208301876129c2565b612b1a60408301866129c2565b612b2760608301856129c2565b612b346080830184612925565b9695505050505050565b612b47816129b9565b8114612b51575f5ffd5b50565b5f81359050612b6281612b3e565b92915050565b5f60208284031215612b7d57612b7c61294d565b5b5f612b8a84828501612b54565b91505092915050565b5f819050919050565b5f612bb6612bb1612bac846128c2565b612b93565b6128c2565b9050919050565b5f612bc782612b9c565b9050919050565b5f612bd882612bbd565b9050919050565b612be881612bce565b82525050565b5f602082019050612c015f830184612bdf565b92915050565b612c1081612a15565b82525050565b5f602082019050612c295f830184612c07565b92915050565b7f556e737570706f7274656420746f6b656e0000000000000000000000000000005f82015250565b5f612c63601183612a80565b9150612c6e82612c2f565b602082019050919050565b5f6020820190508181035f830152612c9081612c57565b9050919050565b7f496e76616c696420746f6b656e206164647265737300000000000000000000005f82015250565b5f612ccb601583612a80565b9150612cd682612c97565b602082019050919050565b5f6020820190508181035f830152612cf881612cbf565b9050919050565b7f546f6b656e20616c7265616479207365740000000000000000000000000000005f82015250565b5f612d33601183612a80565b9150612d3e82612cff565b602082019050919050565b5f6020820190508181035f830152612d6081612d27565b9050919050565b7f45544820616d6f756e74206d7573742062652067726561746572207468616e205f8201527f3000000000000000000000000000000000000000000000000000000000000000602082015250565b5f612dc1602183612a80565b9150612dcc82612d67565b604082019050919050565b5f6020820190508181035f830152612dee81612db5565b9050919050565b7f43757272656e74207374616765206e6f742061637469766500000000000000005f82015250565b5f612e29601883612a80565b9150612e3482612df5565b602082019050919050565b5f6020820190508181035f830152612e5681612e1d565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612e94826129b9565b9150612e9f836129b9565b9250828202612ead816129b9565b91508282048414831517612ec457612ec3612e5d565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612f02826129b9565b9150612f0d836129b9565b925082612f1d57612f1c612ecb565b5b828204905092915050565b5f612f32826129b9565b9150612f3d836129b9565b9250828201905080821115612f5557612f54612e5d565b5b92915050565b7f4578636565647320737461676520616c6c6f636174696f6e00000000000000005f82015250565b5f612f8f601883612a80565b9150612f9a82612f5b565b602082019050919050565b5f6020820190508181035f830152612fbc81612f83565b9050919050565b5f81905092915050565b50565b5f612fdb5f83612fc3565b9150612fe682612fcd565b5f82019050919050565b5f612ffa82612fd0565b9150819050919050565b7f455448207472616e73666572206661696c6564000000000000000000000000005f82015250565b5f613038601383612a80565b915061304382613004565b602082019050919050565b5f6020820190508181035f8301526130658161302c565b9050919050565b5f60808201905061307f5f8301876129c2565b61308c60208301866129c2565b6130996040830185612c07565b6130a660608301846129c2565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806130f357607f821691505b602082108103613106576131056130af565b5b50919050565b7f546f6b656e206e6f7420736574000000000000000000000000000000000000005f82015250565b5f613140600d83612a80565b915061314b8261310c565b602082019050919050565b5f6020820190508181035f83015261316d81613134565b9050919050565b7f436c61696d696e67206e6f7420656e61626c65642079657400000000000000005f82015250565b5f6131a8601883612a80565b91506131b382613174565b602082019050919050565b5f6020820190508181035f8301526131d58161319c565b9050919050565b7f4e6f20746f6b656e7320746f20636c61696d00000000000000000000000000005f82015250565b5f613210601283612a80565b915061321b826131dc565b602082019050919050565b5f6020820190508181035f83015261323d81613204565b9050919050565b7f416c726561647920636c61696d656400000000000000000000000000000000005f82015250565b5f613278600f83612a80565b915061328382613244565b602082019050919050565b5f6020820190508181035f8301526132a58161326c565b9050919050565b5f69ffffffffffffffffffff82169050919050565b6132ca816132ac565b81146132d4575f5ffd5b50565b5f815190506132e5816132c1565b92915050565b5f819050919050565b6132fd816132eb565b8114613307575f5ffd5b50565b5f81519050613318816132f4565b92915050565b5f8151905061332c81612b3e565b92915050565b5f5f5f5f5f60a0868803121561334b5761334a61294d565b5b5f613358888289016132d7565b95505060206133698882890161330a565b945050604061337a8882890161331e565b935050606061338b8882890161331e565b925050608061339c888289016132d7565b9150509295509295909350565b7f496e76616c6964204554482070726963650000000000000000000000000000005f82015250565b5f6133dd601183612a80565b91506133e8826133a9565b602082019050919050565b5f6020820190508181035f83015261340a816133d1565b9050919050565b7f416d6f756e74206d7573742062652067726561746572207468616e20300000005f82015250565b5f613445601d83612a80565b915061345082613411565b602082019050919050565b5f6020820190508181035f83015261347281613439565b9050919050565b7f496e76616c6964207374616765204944000000000000000000000000000000005f82015250565b5f6134ad601083612a80565b91506134b882613479565b602082019050919050565b5f6020820190508181035f8301526134da816134a1565b9050919050565b7f416c726561647920696e207468697320737461676500000000000000000000005f82015250565b5f613515601583612a80565b9150613520826134e1565b602082019050919050565b5f6020820190508181035f83015261354281613509565b9050919050565b5f60408201905061355c5f830185612c07565b6135696020830184612c07565b9392505050565b5f602082840312156135855761358461294d565b5b5f6135928482850161331e565b91505092915050565b7f4e6f20746f6b656e7320746f20776974686472617700000000000000000000005f82015250565b5f6135cf601583612a80565b91506135da8261359b565b602082019050919050565b5f6020820190508181035f8301526135fc816135c3565b9050919050565b5f6040820190506136165f8301856128f2565b61362360208301846129c2565b9392505050565b5f60608201905061363d5f8301866128f2565b61364a60208301856128f2565b61365760408301846129c2565b94935050505056fea26469706673582212200b670c59cfbb6e60e5c7c2683d8790816b4f27ce0515f03205b9a019c535e89f64736f6c634300081e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7000000000000000000000000a7565c6f03e0584671d945dd7949a26abb1dcae40000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
-----Decoded View---------------
Arg [0] : _usdc (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [1] : _usdt (address): 0xdAC17F958D2ee523a2206206994597C13D831ec7
Arg [2] : _ethReceiver (address): 0xA7565C6F03E0584671D945dD7949A26ABb1dCAe4
Arg [3] : _priceFeed (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [1] : 000000000000000000000000dac17f958d2ee523a2206206994597c13d831ec7
Arg [2] : 000000000000000000000000a7565c6f03e0584671d945dd7949a26abb1dcae4
Arg [3] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode Sourcemap
31083:13562:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31392:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31634:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43968:247;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35885:231;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37494:1313;;;:::i;:::-;;32277:37;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;36181:179;;;;;;;;;;;;;:::i;:::-;;31851:68;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31491:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43608:67;;;;;;;;;;;;;:::i;:::-;;31745:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41664:516;;;;;;;;;;;;;:::i;:::-;;25444:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31676:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37092:339;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3571:103;;;;;;;;;;;;;:::i;:::-;;31802:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44400:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43481:63;;;;;;;;;;;;;:::i;:::-;;2896:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31425:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31207:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40310:1255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31303:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38931:1255;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31522:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31458:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36484:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31926:60;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31600:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42988:431;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;3829:220;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42317:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31392:26;;;;;;;;;;;;;:::o;31634:35::-;;;;;;;;;;;;;:::o;43968:247::-;44045:7;31253:42;44073:20;;:5;:20;;;:44;;;;44106:11;;;;;;;;;;;44097:20;;:5;:20;;;44073:44;:68;;;;44130:11;;;;;;;;;;;44121:20;;:5;:20;;;44073:68;44065:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;44181:13;:19;44195:4;44181:19;;;;;;;;;;;;;;;:26;44201:5;44181:26;;;;;;;;;;;;;;;;44174:33;;43968:247;;;;:::o;35885:231::-;2782:13;:11;:13::i;:::-;35983:1:::1;35961:24;;:10;:24;;::::0;35953:58:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36051:1;36030:23;;:9;;;;;;;;;;;:23;;;36022:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;36098:10;36086:9;;:22;;;;;;;;;;;;;;;;;;35885:231:::0;:::o;37494:1313::-;29897:21;:19;:21::i;:::-;25049:19:::1;:17;:19::i;:::-;37591:1:::2;37579:9;:13;37571:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;37641:19;37663:6;:22;37670:14;;;;;;;;;;;37663:22;;;;;;;;;;;;;;;37641:44;;37704:5;:12;;;;;;;;;;;;37696:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;37805:16;37824:13;:11;:13::i;:::-;37805:32;;37848:16;31339:4;37880:8;37868:9;:20;;;;:::i;:::-;37867:34;;;;:::i;:::-;37848:53;;37957:18;38003:5;:11;;;31339:4;37979:8;:20;;;;:::i;:::-;37978:36;;;;:::i;:::-;37957:57;;38025:19;38047:10;38025:32;;38155:5;:21;;;38140:11;38121:5;:16;;;:30;;;;:::i;:::-;:55;;38113:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;38282:11;38262:5;:16;;;:31;;;;;;;:::i;:::-;;;;;;;;38323:11;38304:15;;:30;;;;;;;:::i;:::-;;;;;;;;38376:11;38345:15;:27;38361:10;38345:27;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;38440:9;38398:13;:25;38412:10;38398:25;;;;;;;;;;;;;;;:38;31253:42;38398:38;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;38502:9;38460:25;:38;31253:42;38460:38;;;;;;;;;;;;;;;;:51;;;;;;;:::i;:::-;;;;;;;;38570:9;38593:11;;;;;;;;;;;38585:25;;38618:9;38585:47;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38569:63;;;38651:4;38643:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;31253:42;38705:94;;38718:10;38705:94;;;38743:9;38754:11;38767:14;;;;;;;;;;;38783:15;38705:94;;;;;;;;;:::i;:::-;;;;;;;;37560:1247;;;;;;29941:20:::0;:18;:20::i;:::-;37494:1313::o;32277:37::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36181:179::-;2782:13;:11;:13::i;:::-;36266:1:::1;36245:23;;:9;;;;;;;;;;;:23;;::::0;36237:49:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36315:4;36297:15;;:22;;;;;;;;;;;;;;;;;;36335:17;;;;;;;;;;36181:179::o:0;31851:68::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31491:24::-;;;;;;;;;;;;;:::o;43608:67::-;2782:13;:11;:13::i;:::-;43657:10:::1;:8;:10::i;:::-;43608:67::o:0;31745:50::-;;;;;;;;;;;;;;;;;:::o;41664:516::-;29897:21;:19;:21::i;:::-;41722:15:::1;;;;;;;;;;;41714:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;41815:1;41785:15;:27;41801:10;41785:27;;;;;;;;;;;;;;;;:31;41777:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41859:10;:22;41870:10;41859:22;;;;;;;;;;;;;;;;;;;;;;;;;41858:23;41850:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;41922:14;41939:15;:27;41955:10;41939:27;;;;;;;;;;;;;;;;41922:44;;42002:4;41977:10;:22;41988:10;41977:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;42063:50;42094:10;42106:6;42070:9;;;;;;;;;;;42063:30;;;;:50;;;;;:::i;:::-;42153:10;42139:33;;;42165:6;42139:33;;;;;;:::i;:::-;;;;;;;;41703:477;29941:20:::0;:18;:20::i;:::-;41664:516::o;25444:86::-;25491:4;25515:7;;;;;;;;;;;25508:14;;25444:86;:::o;31676:30::-;;;;:::o;37092:339::-;37136:7;37235:12;37257;;;;;;;;;;;:28;;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37232:55;;;;;;37314:1;37306:5;:9;37298:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;37417:6;37408:5;37400:23;;;;:::i;:::-;37393:30;;;37092:339;:::o;3571:103::-;2782:13;:11;:13::i;:::-;3636:30:::1;3663:1;3636:18;:30::i;:::-;3571:103::o:0;31802:42::-;;;;;;;;;;;;;;;;;;;;;;:::o;44400:242::-;44466:7;31253:42;44494:20;;:5;:20;;;:44;;;;44527:11;;;;;;;;;;;44518:20;;:5;:20;;;44494:44;:68;;;;44551:11;;;;;;;;;;;44542:20;;:5;:20;;;44494:68;44486:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;44602:25;:32;44628:5;44602:32;;;;;;;;;;;;;;;;44595:39;;44400:242;;;:::o;43481:63::-;2782:13;:11;:13::i;:::-;43528:8:::1;:6;:8::i;:::-;43481:63::o:0;2896:87::-;2942:7;2969:6;;;;;;;;;;;2962:13;;2896:87;:::o;31425:26::-;;;;;;;;;;;;;:::o;31207:89::-;31253:42;31207:89;:::o;40310:1255::-;29897:21;:19;:21::i;:::-;25049:19:::1;:17;:19::i;:::-;40411:1:::2;40402:6;:10;40394:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;40457:19;40479:6;:22;40486:14;;;;;;;;;;;40479:22;;;;;;;;;;;;;;;40457:44;;40520:5;:12;;;;;;;;;;;;40512:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;40654:24;40690:6;40681;:15;;;;:::i;:::-;40654:42;;40752:18;40806:5;:11;;;31339:4;40774:16;:28;;;;:::i;:::-;40773:44;;;;:::i;:::-;40752:65;;40828:19;40850:10;40828:32;;40958:5;:21;;;40943:11;40924:5;:16;;;:30;;;;:::i;:::-;:55;;40916:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;41085:11;41065:5;:16;;;:31;;;;;;;:::i;:::-;;;;;;;;41126:11;41107:15;;:30;;;;;;;:::i;:::-;;;;;;;;41179:11;41148:15;:27;41164:10;41148:27;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;41243:6;41201:13;:25;41215:10;41201:25;;;;;;;;;;;;;;;:38;41227:11;;;;;;;;;;;41201:38;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;41302:6;41260:25;:38;41286:11;;;;;;;;;;;41260:38;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;41369:71;41406:10;41426:4;41433:6;41376:11;;;;;;;;;;;41369:36;;;;:71;;;;;;:::i;:::-;41491:11;;;;;;;;;;;41466:91;;41479:10;41466:91;;;41504:6;41512:11;41525:14;;;;;;;;;;;41541:15;41466:91;;;;;;;;;:::i;:::-;;;;;;;;40383:1182;;;;29941:20:::0;:18;:20::i;:::-;40310:1255;:::o;31303:40::-;31339:4;31303:40;:::o;38931:1255::-;29897:21;:19;:21::i;:::-;25049:19:::1;:17;:19::i;:::-;39032:1:::2;39023:6;:10;39015:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;39078:19;39100:6;:22;39107:14;;;;;;;;;;;39100:22;;;;;;;;;;;;;;;39078:44;;39141:5;:12;;;;;;;;;;;;39133:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;39275:24;39311:6;39302;:15;;;;:::i;:::-;39275:42;;39373:18;39427:5;:11;;;31339:4;39395:16;:28;;;;:::i;:::-;39394:44;;;;:::i;:::-;39373:65;;39449:19;39471:10;39449:32;;39579:5;:21;;;39564:11;39545:5;:16;;;:30;;;;:::i;:::-;:55;;39537:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;39706:11;39686:5;:16;;;:31;;;;;;;:::i;:::-;;;;;;;;39747:11;39728:15;;:30;;;;;;;:::i;:::-;;;;;;;;39800:11;39769:15;:27;39785:10;39769:27;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;39864:6;39822:13;:25;39836:10;39822:25;;;;;;;;;;;;;;;:38;39848:11;;;;;;;;;;;39822:38;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;39923:6;39881:25;:38;39907:11;;;;;;;;;;;39881:38;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;39990:71;40027:10;40047:4;40054:6;39997:11;;;;;;;;;;;39990:36;;;;:71;;;;;;:::i;:::-;40112:11;;;;;;;;;;;40087:91;;40100:10;40087:91;;;40125:6;40133:11;40146:14;;;;;;;;;;;40162:15;40087:91;;;;;;;;;:::i;:::-;;;;;;;;39004:1182;;;;29941:20:::0;:18;:20::i;:::-;38931:1255;:::o;31522:41::-;;;;;;;;;;;;;:::o;31458:26::-;;;;;;;;;;;;;:::o;36484:474::-;2782:13;:11;:13::i;:::-;36572:1:::1;36558:10;:15;;;;36550:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;36627:14;;;;;;;;;;;36613:28;;:10;:28;;::::0;36605:62:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;36757:5;36725:6;:22;36732:14;;;;;;;;;;;36725:22;;;;;;;;;;;;;;;:29;;;:37;;;;;;;;;;;;;;;;;;36842:4;36814:6;:18;36821:10;36814:18;;;;;;;;;;;;;;;:25;;;:32;;;;;;;;;;;;;;;;;;36872:40;36885:14;;;;;;;;;;;36901:10;36872:40;;;;;;;:::i;:::-;;;;;;;;36940:10;36923:14;;:27;;;;;;;;;;;;;;;;;;36484:474:::0;:::o;31926:60::-;;;;;;;;;;;;;;;;;:::o;31600:27::-;;;;;;;;;;;;;:::o;42988:431::-;43048:18;43077:13;43101:23;43135:18;43164:11;43194:18;43215:6;:22;43222:14;;;;;;;;;;;43215:22;;;;;;;;;;;;;;;43194:43;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43270:5;:10;;;43295:5;:11;;;43321:5;:21;;;43357:5;:16;;;43388:5;:12;;;43248:163;;;;;;;;;;;42988:431;;;;;:::o;3829:220::-;2782:13;:11;:13::i;:::-;3934:1:::1;3914:22;;:8;:22;;::::0;3910:93:::1;;3988:1;3960:31;;;;;;;;;;;:::i;:::-;;;;;;;;3910:93;4013:28;4032:8;4013:18;:28::i;:::-;3829:220:::0;:::o;42317:341::-;2782:13;:11;:13::i;:::-;42402:11:::1;;;;;;;;;;;42393:20;;:5;:20;;;:44;;;;42426:11;;;;;;;;;;;42417:20;;:5;:20;;;42393:44;42385:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42470:15;42495:5;42488:23;;;42520:4;42488:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42470:56;;42555:1;42545:7;:11;42537:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;42603:47;42630:10;42642:7;42610:5;42603:26;;;;:47;;;;;:::i;:::-;42374:284;42317:341:::0;:::o;3061:166::-;3132:12;:10;:12::i;:::-;3121:23;;:7;:5;:7::i;:::-;:23;;;3117:103;;3195:12;:10;:12::i;:::-;3168:40;;;;;;;;;;;:::i;:::-;;;;;;;;3117:103;3061:166::o;29977:315::-;29275:1;30106:7;;:18;30102:88;;30148:30;;;;;;;;;;;;;;30102:88;29275:1;30267:7;:17;;;;29977:315::o;25603:132::-;25669:8;:6;:8::i;:::-;25665:63;;;25701:15;;;;;;;;;;;;;;25665:63;25603:132::o;30300:212::-;29232:1;30483:7;:21;;;;30300:212::o;26345:120::-;25308:16;:14;:16::i;:::-;26414:5:::1;26404:7;;:15;;;;;;;;;;;;;;;;;;26435:22;26444:12;:10;:12::i;:::-;26435:22;;;;;;:::i;:::-;;;;;;;;26345:120::o:0;14582:162::-;14665:71;14685:5;14707;:14;;;14724:2;14728:5;14692:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14665:19;:71::i;:::-;14582:162;;;:::o;4209:191::-;4283:16;4302:6;;;;;;;;;;;4283:25;;4328:8;4319:6;;:17;;;;;;;;;;;;;;;;;;4383:8;4352:40;;4373:8;4352:40;;;;;;;;;;;;4272:128;4209:191;:::o;26086:118::-;25049:19;:17;:19::i;:::-;26156:4:::1;26146:7;;:14;;;;;;;;;;;;;;;;;;26176:20;26183:12;:10;:12::i;:::-;26176:20;;;;;;:::i;:::-;;;;;;;;26086:118::o:0;14989:190::-;15090:81;15110:5;15132;:18;;;15153:4;15159:2;15163:5;15117:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15090:19;:81::i;:::-;14989:190;;;;:::o;850:98::-;903:7;930:10;923:17;;850:98;:::o;25812:130::-;25876:8;:6;:8::i;:::-;25871:64;;25908:15;;;;;;;;;;;;;;25871:64;25812:130::o;21873:738::-;21954:18;21983:19;22123:4;22120:1;22113:4;22107:11;22100:4;22094;22090:15;22087:1;22080:5;22073;22068:60;22182:7;22172:180;;22227:4;22221:11;22273:16;22270:1;22265:3;22250:40;22320:16;22315:3;22308:29;22172:180;22380:16;22366:30;;22431:1;22425:8;22410:23;;22038:406;22474:1;22460:10;:15;:68;;22527:1;22512:11;:16;;22460:68;;;22508:1;22486:5;22478:26;;;:31;22460:68;22456:148;;;22585:5;22552:40;;;;;;;;;;;:::i;:::-;;;;;;;;22456:148;21943:668;;21873:738;;:::o;7:126:1:-;44:7;84:42;77:5;73:54;62:65;;7:126;;;:::o;139:96::-;176:7;205:24;223:5;205:24;:::i;:::-;194:35;;139:96;;;:::o;241:118::-;328:24;346:5;328:24;:::i;:::-;323:3;316:37;241:118;;:::o;365:222::-;458:4;496:2;485:9;481:18;473:26;;509:71;577:1;566:9;562:17;553:6;509:71;:::i;:::-;365:222;;;;:::o;593:90::-;627:7;670:5;663:13;656:21;645:32;;593:90;;;:::o;689:109::-;770:21;785:5;770:21;:::i;:::-;765:3;758:34;689:109;;:::o;804:210::-;891:4;929:2;918:9;914:18;906:26;;942:65;1004:1;993:9;989:17;980:6;942:65;:::i;:::-;804:210;;;;:::o;1101:117::-;1210:1;1207;1200:12;1347:122;1420:24;1438:5;1420:24;:::i;:::-;1413:5;1410:35;1400:63;;1459:1;1456;1449:12;1400:63;1347:122;:::o;1475:139::-;1521:5;1559:6;1546:20;1537:29;;1575:33;1602:5;1575:33;:::i;:::-;1475:139;;;;:::o;1620:474::-;1688:6;1696;1745:2;1733:9;1724:7;1720:23;1716:32;1713:119;;;1751:79;;:::i;:::-;1713:119;1871:1;1896:53;1941:7;1932:6;1921:9;1917:22;1896:53;:::i;:::-;1886:63;;1842:117;1998:2;2024:53;2069:7;2060:6;2049:9;2045:22;2024:53;:::i;:::-;2014:63;;1969:118;1620:474;;;;;:::o;2100:77::-;2137:7;2166:5;2155:16;;2100:77;;;:::o;2183:118::-;2270:24;2288:5;2270:24;:::i;:::-;2265:3;2258:37;2183:118;;:::o;2307:222::-;2400:4;2438:2;2427:9;2423:18;2415:26;;2451:71;2519:1;2508:9;2504:17;2495:6;2451:71;:::i;:::-;2307:222;;;;:::o;2535:329::-;2594:6;2643:2;2631:9;2622:7;2618:23;2614:32;2611:119;;;2649:79;;:::i;:::-;2611:119;2769:1;2794:53;2839:7;2830:6;2819:9;2815:22;2794:53;:::i;:::-;2784:63;;2740:117;2535:329;;;;:::o;2870:86::-;2905:7;2945:4;2938:5;2934:16;2923:27;;2870:86;;;:::o;2962:118::-;3033:22;3049:5;3033:22;:::i;:::-;3026:5;3023:33;3013:61;;3070:1;3067;3060:12;3013:61;2962:118;:::o;3086:135::-;3130:5;3168:6;3155:20;3146:29;;3184:31;3209:5;3184:31;:::i;:::-;3086:135;;;;:::o;3227:325::-;3284:6;3333:2;3321:9;3312:7;3308:23;3304:32;3301:119;;;3339:79;;:::i;:::-;3301:119;3459:1;3484:51;3527:7;3518:6;3507:9;3503:22;3484:51;:::i;:::-;3474:61;;3430:115;3227:325;;;;:::o;3558:99::-;3610:6;3644:5;3638:12;3628:22;;3558:99;;;:::o;3663:169::-;3747:11;3781:6;3776:3;3769:19;3821:4;3816:3;3812:14;3797:29;;3663:169;;;;:::o;3838:139::-;3927:6;3922:3;3917;3911:23;3968:1;3959:6;3954:3;3950:16;3943:27;3838:139;;;:::o;3983:102::-;4024:6;4075:2;4071:7;4066:2;4059:5;4055:14;4051:28;4041:38;;3983:102;;;:::o;4091:377::-;4179:3;4207:39;4240:5;4207:39;:::i;:::-;4262:71;4326:6;4321:3;4262:71;:::i;:::-;4255:78;;4342:65;4400:6;4395:3;4388:4;4381:5;4377:16;4342:65;:::i;:::-;4432:29;4454:6;4432:29;:::i;:::-;4427:3;4423:39;4416:46;;4183:285;4091:377;;;;:::o;4474:743::-;4693:4;4731:3;4720:9;4716:19;4708:27;;4781:9;4775:4;4771:20;4767:1;4756:9;4752:17;4745:47;4809:78;4882:4;4873:6;4809:78;:::i;:::-;4801:86;;4897:72;4965:2;4954:9;4950:18;4941:6;4897:72;:::i;:::-;4979;5047:2;5036:9;5032:18;5023:6;4979:72;:::i;:::-;5061;5129:2;5118:9;5114:18;5105:6;5061:72;:::i;:::-;5143:67;5205:3;5194:9;5190:19;5181:6;5143:67;:::i;:::-;4474:743;;;;;;;;:::o;5223:122::-;5296:24;5314:5;5296:24;:::i;:::-;5289:5;5286:35;5276:63;;5335:1;5332;5325:12;5276:63;5223:122;:::o;5351:139::-;5397:5;5435:6;5422:20;5413:29;;5451:33;5478:5;5451:33;:::i;:::-;5351:139;;;;:::o;5496:329::-;5555:6;5604:2;5592:9;5583:7;5579:23;5575:32;5572:119;;;5610:79;;:::i;:::-;5572:119;5730:1;5755:53;5800:7;5791:6;5780:9;5776:22;5755:53;:::i;:::-;5745:63;;5701:117;5496:329;;;;:::o;5831:60::-;5859:3;5880:5;5873:12;;5831:60;;;:::o;5897:142::-;5947:9;5980:53;5998:34;6007:24;6025:5;6007:24;:::i;:::-;5998:34;:::i;:::-;5980:53;:::i;:::-;5967:66;;5897:142;;;:::o;6045:126::-;6095:9;6128:37;6159:5;6128:37;:::i;:::-;6115:50;;6045:126;;;:::o;6177:155::-;6256:9;6289:37;6320:5;6289:37;:::i;:::-;6276:50;;6177:155;;;:::o;6338:189::-;6454:66;6514:5;6454:66;:::i;:::-;6449:3;6442:79;6338:189;;:::o;6533:280::-;6655:4;6693:2;6682:9;6678:18;6670:26;;6706:100;6803:1;6792:9;6788:17;6779:6;6706:100;:::i;:::-;6533:280;;;;:::o;6819:112::-;6902:22;6918:5;6902:22;:::i;:::-;6897:3;6890:35;6819:112;;:::o;6937:214::-;7026:4;7064:2;7053:9;7049:18;7041:26;;7077:67;7141:1;7130:9;7126:17;7117:6;7077:67;:::i;:::-;6937:214;;;;:::o;7157:167::-;7297:19;7293:1;7285:6;7281:14;7274:43;7157:167;:::o;7330:366::-;7472:3;7493:67;7557:2;7552:3;7493:67;:::i;:::-;7486:74;;7569:93;7658:3;7569:93;:::i;:::-;7687:2;7682:3;7678:12;7671:19;;7330:366;;;:::o;7702:419::-;7868:4;7906:2;7895:9;7891:18;7883:26;;7955:9;7949:4;7945:20;7941:1;7930:9;7926:17;7919:47;7983:131;8109:4;7983:131;:::i;:::-;7975:139;;7702:419;;;:::o;8127:171::-;8267:23;8263:1;8255:6;8251:14;8244:47;8127:171;:::o;8304:366::-;8446:3;8467:67;8531:2;8526:3;8467:67;:::i;:::-;8460:74;;8543:93;8632:3;8543:93;:::i;:::-;8661:2;8656:3;8652:12;8645:19;;8304:366;;;:::o;8676:419::-;8842:4;8880:2;8869:9;8865:18;8857:26;;8929:9;8923:4;8919:20;8915:1;8904:9;8900:17;8893:47;8957:131;9083:4;8957:131;:::i;:::-;8949:139;;8676:419;;;:::o;9101:167::-;9241:19;9237:1;9229:6;9225:14;9218:43;9101:167;:::o;9274:366::-;9416:3;9437:67;9501:2;9496:3;9437:67;:::i;:::-;9430:74;;9513:93;9602:3;9513:93;:::i;:::-;9631:2;9626:3;9622:12;9615:19;;9274:366;;;:::o;9646:419::-;9812:4;9850:2;9839:9;9835:18;9827:26;;9899:9;9893:4;9889:20;9885:1;9874:9;9870:17;9863:47;9927:131;10053:4;9927:131;:::i;:::-;9919:139;;9646:419;;;:::o;10071:220::-;10211:34;10207:1;10199:6;10195:14;10188:58;10280:3;10275:2;10267:6;10263:15;10256:28;10071:220;:::o;10297:366::-;10439:3;10460:67;10524:2;10519:3;10460:67;:::i;:::-;10453:74;;10536:93;10625:3;10536:93;:::i;:::-;10654:2;10649:3;10645:12;10638:19;;10297:366;;;:::o;10669:419::-;10835:4;10873:2;10862:9;10858:18;10850:26;;10922:9;10916:4;10912:20;10908:1;10897:9;10893:17;10886:47;10950:131;11076:4;10950:131;:::i;:::-;10942:139;;10669:419;;;:::o;11094:174::-;11234:26;11230:1;11222:6;11218:14;11211:50;11094:174;:::o;11274:366::-;11416:3;11437:67;11501:2;11496:3;11437:67;:::i;:::-;11430:74;;11513:93;11602:3;11513:93;:::i;:::-;11631:2;11626:3;11622:12;11615:19;;11274:366;;;:::o;11646:419::-;11812:4;11850:2;11839:9;11835:18;11827:26;;11899:9;11893:4;11889:20;11885:1;11874:9;11870:17;11863:47;11927:131;12053:4;11927:131;:::i;:::-;11919:139;;11646:419;;;:::o;12071:180::-;12119:77;12116:1;12109:88;12216:4;12213:1;12206:15;12240:4;12237:1;12230:15;12257:410;12297:7;12320:20;12338:1;12320:20;:::i;:::-;12315:25;;12354:20;12372:1;12354:20;:::i;:::-;12349:25;;12409:1;12406;12402:9;12431:30;12449:11;12431:30;:::i;:::-;12420:41;;12610:1;12601:7;12597:15;12594:1;12591:22;12571:1;12564:9;12544:83;12521:139;;12640:18;;:::i;:::-;12521:139;12305:362;12257:410;;;;:::o;12673:180::-;12721:77;12718:1;12711:88;12818:4;12815:1;12808:15;12842:4;12839:1;12832:15;12859:185;12899:1;12916:20;12934:1;12916:20;:::i;:::-;12911:25;;12950:20;12968:1;12950:20;:::i;:::-;12945:25;;12989:1;12979:35;;12994:18;;:::i;:::-;12979:35;13036:1;13033;13029:9;13024:14;;12859:185;;;;:::o;13050:191::-;13090:3;13109:20;13127:1;13109:20;:::i;:::-;13104:25;;13143:20;13161:1;13143:20;:::i;:::-;13138:25;;13186:1;13183;13179:9;13172:16;;13207:3;13204:1;13201:10;13198:36;;;13214:18;;:::i;:::-;13198:36;13050:191;;;;:::o;13247:174::-;13387:26;13383:1;13375:6;13371:14;13364:50;13247:174;:::o;13427:366::-;13569:3;13590:67;13654:2;13649:3;13590:67;:::i;:::-;13583:74;;13666:93;13755:3;13666:93;:::i;:::-;13784:2;13779:3;13775:12;13768:19;;13427:366;;;:::o;13799:419::-;13965:4;14003:2;13992:9;13988:18;13980:26;;14052:9;14046:4;14042:20;14038:1;14027:9;14023:17;14016:47;14080:131;14206:4;14080:131;:::i;:::-;14072:139;;13799:419;;;:::o;14224:147::-;14325:11;14362:3;14347:18;;14224:147;;;;:::o;14377:114::-;;:::o;14497:398::-;14656:3;14677:83;14758:1;14753:3;14677:83;:::i;:::-;14670:90;;14769:93;14858:3;14769:93;:::i;:::-;14887:1;14882:3;14878:11;14871:18;;14497:398;;;:::o;14901:379::-;15085:3;15107:147;15250:3;15107:147;:::i;:::-;15100:154;;15271:3;15264:10;;14901:379;;;:::o;15286:169::-;15426:21;15422:1;15414:6;15410:14;15403:45;15286:169;:::o;15461:366::-;15603:3;15624:67;15688:2;15683:3;15624:67;:::i;:::-;15617:74;;15700:93;15789:3;15700:93;:::i;:::-;15818:2;15813:3;15809:12;15802:19;;15461:366;;;:::o;15833:419::-;15999:4;16037:2;16026:9;16022:18;16014:26;;16086:9;16080:4;16076:20;16072:1;16061:9;16057:17;16050:47;16114:131;16240:4;16114:131;:::i;:::-;16106:139;;15833:419;;;:::o;16258:545::-;16431:4;16469:3;16458:9;16454:19;16446:27;;16483:71;16551:1;16540:9;16536:17;16527:6;16483:71;:::i;:::-;16564:72;16632:2;16621:9;16617:18;16608:6;16564:72;:::i;:::-;16646:68;16710:2;16699:9;16695:18;16686:6;16646:68;:::i;:::-;16724:72;16792:2;16781:9;16777:18;16768:6;16724:72;:::i;:::-;16258:545;;;;;;;:::o;16809:180::-;16857:77;16854:1;16847:88;16954:4;16951:1;16944:15;16978:4;16975:1;16968:15;16995:320;17039:6;17076:1;17070:4;17066:12;17056:22;;17123:1;17117:4;17113:12;17144:18;17134:81;;17200:4;17192:6;17188:17;17178:27;;17134:81;17262:2;17254:6;17251:14;17231:18;17228:38;17225:84;;17281:18;;:::i;:::-;17225:84;17046:269;16995:320;;;:::o;17321:163::-;17461:15;17457:1;17449:6;17445:14;17438:39;17321:163;:::o;17490:366::-;17632:3;17653:67;17717:2;17712:3;17653:67;:::i;:::-;17646:74;;17729:93;17818:3;17729:93;:::i;:::-;17847:2;17842:3;17838:12;17831:19;;17490:366;;;:::o;17862:419::-;18028:4;18066:2;18055:9;18051:18;18043:26;;18115:9;18109:4;18105:20;18101:1;18090:9;18086:17;18079:47;18143:131;18269:4;18143:131;:::i;:::-;18135:139;;17862:419;;;:::o;18287:174::-;18427:26;18423:1;18415:6;18411:14;18404:50;18287:174;:::o;18467:366::-;18609:3;18630:67;18694:2;18689:3;18630:67;:::i;:::-;18623:74;;18706:93;18795:3;18706:93;:::i;:::-;18824:2;18819:3;18815:12;18808:19;;18467:366;;;:::o;18839:419::-;19005:4;19043:2;19032:9;19028:18;19020:26;;19092:9;19086:4;19082:20;19078:1;19067:9;19063:17;19056:47;19120:131;19246:4;19120:131;:::i;:::-;19112:139;;18839:419;;;:::o;19264:168::-;19404:20;19400:1;19392:6;19388:14;19381:44;19264:168;:::o;19438:366::-;19580:3;19601:67;19665:2;19660:3;19601:67;:::i;:::-;19594:74;;19677:93;19766:3;19677:93;:::i;:::-;19795:2;19790:3;19786:12;19779:19;;19438:366;;;:::o;19810:419::-;19976:4;20014:2;20003:9;19999:18;19991:26;;20063:9;20057:4;20053:20;20049:1;20038:9;20034:17;20027:47;20091:131;20217:4;20091:131;:::i;:::-;20083:139;;19810:419;;;:::o;20235:165::-;20375:17;20371:1;20363:6;20359:14;20352:41;20235:165;:::o;20406:366::-;20548:3;20569:67;20633:2;20628:3;20569:67;:::i;:::-;20562:74;;20645:93;20734:3;20645:93;:::i;:::-;20763:2;20758:3;20754:12;20747:19;;20406:366;;;:::o;20778:419::-;20944:4;20982:2;20971:9;20967:18;20959:26;;21031:9;21025:4;21021:20;21017:1;21006:9;21002:17;20995:47;21059:131;21185:4;21059:131;:::i;:::-;21051:139;;20778:419;;;:::o;21203:105::-;21239:7;21279:22;21272:5;21268:34;21257:45;;21203:105;;;:::o;21314:120::-;21386:23;21403:5;21386:23;:::i;:::-;21379:5;21376:34;21366:62;;21424:1;21421;21414:12;21366:62;21314:120;:::o;21440:141::-;21496:5;21527:6;21521:13;21512:22;;21543:32;21569:5;21543:32;:::i;:::-;21440:141;;;;:::o;21587:76::-;21623:7;21652:5;21641:16;;21587:76;;;:::o;21669:120::-;21741:23;21758:5;21741:23;:::i;:::-;21734:5;21731:34;21721:62;;21779:1;21776;21769:12;21721:62;21669:120;:::o;21795:141::-;21851:5;21882:6;21876:13;21867:22;;21898:32;21924:5;21898:32;:::i;:::-;21795:141;;;;:::o;21942:143::-;21999:5;22030:6;22024:13;22015:22;;22046:33;22073:5;22046:33;:::i;:::-;21942:143;;;;:::o;22091:971::-;22194:6;22202;22210;22218;22226;22275:3;22263:9;22254:7;22250:23;22246:33;22243:120;;;22282:79;;:::i;:::-;22243:120;22402:1;22427:63;22482:7;22473:6;22462:9;22458:22;22427:63;:::i;:::-;22417:73;;22373:127;22539:2;22565:63;22620:7;22611:6;22600:9;22596:22;22565:63;:::i;:::-;22555:73;;22510:128;22677:2;22703:64;22759:7;22750:6;22739:9;22735:22;22703:64;:::i;:::-;22693:74;;22648:129;22816:2;22842:64;22898:7;22889:6;22878:9;22874:22;22842:64;:::i;:::-;22832:74;;22787:129;22955:3;22982:63;23037:7;23028:6;23017:9;23013:22;22982:63;:::i;:::-;22972:73;;22926:129;22091:971;;;;;;;;:::o;23068:167::-;23208:19;23204:1;23196:6;23192:14;23185:43;23068:167;:::o;23241:366::-;23383:3;23404:67;23468:2;23463:3;23404:67;:::i;:::-;23397:74;;23480:93;23569:3;23480:93;:::i;:::-;23598:2;23593:3;23589:12;23582:19;;23241:366;;;:::o;23613:419::-;23779:4;23817:2;23806:9;23802:18;23794:26;;23866:9;23860:4;23856:20;23852:1;23841:9;23837:17;23830:47;23894:131;24020:4;23894:131;:::i;:::-;23886:139;;23613:419;;;:::o;24038:179::-;24178:31;24174:1;24166:6;24162:14;24155:55;24038:179;:::o;24223:366::-;24365:3;24386:67;24450:2;24445:3;24386:67;:::i;:::-;24379:74;;24462:93;24551:3;24462:93;:::i;:::-;24580:2;24575:3;24571:12;24564:19;;24223:366;;;:::o;24595:419::-;24761:4;24799:2;24788:9;24784:18;24776:26;;24848:9;24842:4;24838:20;24834:1;24823:9;24819:17;24812:47;24876:131;25002:4;24876:131;:::i;:::-;24868:139;;24595:419;;;:::o;25020:166::-;25160:18;25156:1;25148:6;25144:14;25137:42;25020:166;:::o;25192:366::-;25334:3;25355:67;25419:2;25414:3;25355:67;:::i;:::-;25348:74;;25431:93;25520:3;25431:93;:::i;:::-;25549:2;25544:3;25540:12;25533:19;;25192:366;;;:::o;25564:419::-;25730:4;25768:2;25757:9;25753:18;25745:26;;25817:9;25811:4;25807:20;25803:1;25792:9;25788:17;25781:47;25845:131;25971:4;25845:131;:::i;:::-;25837:139;;25564:419;;;:::o;25989:171::-;26129:23;26125:1;26117:6;26113:14;26106:47;25989:171;:::o;26166:366::-;26308:3;26329:67;26393:2;26388:3;26329:67;:::i;:::-;26322:74;;26405:93;26494:3;26405:93;:::i;:::-;26523:2;26518:3;26514:12;26507:19;;26166:366;;;:::o;26538:419::-;26704:4;26742:2;26731:9;26727:18;26719:26;;26791:9;26785:4;26781:20;26777:1;26766:9;26762:17;26755:47;26819:131;26945:4;26819:131;:::i;:::-;26811:139;;26538:419;;;:::o;26963:316::-;27076:4;27114:2;27103:9;27099:18;27091:26;;27127:67;27191:1;27180:9;27176:17;27167:6;27127:67;:::i;:::-;27204:68;27268:2;27257:9;27253:18;27244:6;27204:68;:::i;:::-;26963:316;;;;;:::o;27285:351::-;27355:6;27404:2;27392:9;27383:7;27379:23;27375:32;27372:119;;;27410:79;;:::i;:::-;27372:119;27530:1;27555:64;27611:7;27602:6;27591:9;27587:22;27555:64;:::i;:::-;27545:74;;27501:128;27285:351;;;;:::o;27642:171::-;27782:23;27778:1;27770:6;27766:14;27759:47;27642:171;:::o;27819:366::-;27961:3;27982:67;28046:2;28041:3;27982:67;:::i;:::-;27975:74;;28058:93;28147:3;28058:93;:::i;:::-;28176:2;28171:3;28167:12;28160:19;;27819:366;;;:::o;28191:419::-;28357:4;28395:2;28384:9;28380:18;28372:26;;28444:9;28438:4;28434:20;28430:1;28419:9;28415:17;28408:47;28472:131;28598:4;28472:131;:::i;:::-;28464:139;;28191:419;;;:::o;28616:332::-;28737:4;28775:2;28764:9;28760:18;28752:26;;28788:71;28856:1;28845:9;28841:17;28832:6;28788:71;:::i;:::-;28869:72;28937:2;28926:9;28922:18;28913:6;28869:72;:::i;:::-;28616:332;;;;;:::o;28954:442::-;29103:4;29141:2;29130:9;29126:18;29118:26;;29154:71;29222:1;29211:9;29207:17;29198:6;29154:71;:::i;:::-;29235:72;29303:2;29292:9;29288:18;29279:6;29235:72;:::i;:::-;29317;29385:2;29374:9;29370:18;29361:6;29317:72;:::i;:::-;28954:442;;;;;;:::o
Swarm Source
ipfs://0b670c59cfbb6e60e5c7c2683d8790816b4f27ce0515f03205b9a019c535e89f
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.