Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 4,947 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 21076158 | 24 days ago | IN | 0 ETH | 0.00046135 | ||||
Claim | 20688515 | 78 days ago | IN | 0 ETH | 0.00013143 | ||||
Claim | 20676354 | 80 days ago | IN | 0 ETH | 0.00021032 | ||||
Claim | 20636833 | 85 days ago | IN | 0 ETH | 0.00021711 | ||||
Claim | 20626438 | 87 days ago | IN | 0 ETH | 0.00020925 | ||||
Claim | 20584552 | 93 days ago | IN | 0 ETH | 0.00045151 | ||||
Claim | 20567842 | 95 days ago | IN | 0 ETH | 0.00014265 | ||||
Claim | 20562613 | 96 days ago | IN | 0 ETH | 0.00013432 | ||||
Claim | 20560673 | 96 days ago | IN | 0 ETH | 0.00010474 | ||||
Claim | 20560344 | 96 days ago | IN | 0 ETH | 0.00011656 | ||||
Claim | 20534415 | 100 days ago | IN | 0 ETH | 0.00048935 | ||||
Claim | 20527129 | 101 days ago | IN | 0 ETH | 0.00043207 | ||||
Claim | 20526060 | 101 days ago | IN | 0 ETH | 0.00025859 | ||||
Claim | 20524531 | 101 days ago | IN | 0 ETH | 0.00025896 | ||||
Claim | 20512016 | 103 days ago | IN | 0 ETH | 0.0003491 | ||||
Claim | 20511530 | 103 days ago | IN | 0 ETH | 0.00049343 | ||||
Claim | 20509231 | 103 days ago | IN | 0 ETH | 0.00015492 | ||||
Claim | 20491363 | 106 days ago | IN | 0 ETH | 0.00064973 | ||||
Claim | 20491344 | 106 days ago | IN | 0 ETH | 0.00046882 | ||||
Claim | 20483107 | 107 days ago | IN | 0 ETH | 0.00084002 | ||||
Claim | 20475767 | 108 days ago | IN | 0 ETH | 0.00029868 | ||||
Claim | 20461298 | 110 days ago | IN | 0 ETH | 0.00213055 | ||||
Claim | 20454615 | 111 days ago | IN | 0 ETH | 0.0001485 | ||||
Claim | 20454234 | 111 days ago | IN | 0 ETH | 0.00014122 | ||||
Claim | 20453386 | 111 days ago | IN | 0 ETH | 0.00012898 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
AtheneVesting
Compiler Version
v0.8.18+commit.87f61d96
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-05-30 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/security/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract 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; 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 require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @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.encodeWithSelector(token.transfer.selector, 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.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @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. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @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 silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @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 { /** * @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); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @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 { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @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: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: contracts/AtheneVesting.sol // /$$$$$$ /$$ /$$ /$$ /$$ /$$ /$$ // /$$__ $$ | $$ | $$ | $$$ | $$ | $$ | $$ // | $$ \ $$ /$$$$$$ | $$$$$$$ /$$$$$$ /$$$$$$$ /$$$$$$ | $$$$| $$ /$$$$$$ /$$$$$$ /$$ /$$ /$$ /$$$$$$ /$$$$$$ | $$ /$$ // | $$$$$$$$|_ $$_/ | $$__ $$ /$$__ $$| $$__ $$ /$$__ $$ | $$ $$ $$ /$$__ $$|_ $$_/ | $$ | $$ | $$ /$$__ $$ /$$__ $$| $$ /$$/ // | $$__ $$ | $$ | $$ \ $$| $$$$$$$$| $$ \ $$| $$$$$$$$ | $$ $$$$| $$$$$$$$ | $$ | $$ | $$ | $$| $$ \ $$| $$ \__/| $$$$$$/ // | $$ | $$ | $$ /$$| $$ | $$| $$_____/| $$ | $$| $$_____/ | $$\ $$$| $$_____/ | $$ /$$| $$ | $$ | $$| $$ | $$| $$ | $$_ $$ // | $$ | $$ | $$$$/| $$ | $$| $$$$$$$| $$ | $$| $$$$$$$ | $$ \ $$| $$$$$$$ | $$$$/| $$$$$/$$$$/| $$$$$$/| $$ | $$ \ $$ // |__/ |__/ \___/ |__/ |__/ \_______/|__/ |__/ \_______/ |__/ \__/ \_______/ \___/ \_____/\___/ \______/ |__/ |__/ \__/ pragma solidity ^0.8.18; contract AtheneVesting is Ownable, Pausable, ReentrancyGuard { using SafeERC20 for IERC20; struct Beneficiary { uint256 totalAmount; // total amount of vesting tokens bool isClaimedTge; // is claimed at TGE uint256 totalClaimed; // total amount claimed } // milestone claim vesting uint256 public tgeMilestone = 0; uint256 public vestingMilestone = 0; // percent constant uint256 private immutable _tge_percent = 350; // 35% uint256 private constant DENOMINATOR = 1000; // e.g., 35% = 350/DENOMINATOR IERC20 private immutable token; address public adminAddress; mapping(address => Beneficiary) internal _beneficiaries; event BeneficiaryRegistered(address indexed beneficiary, uint256 amount); event ChangeAdminAddress( address indexed oldAddress, address indexed newAddress ); event SetMilestone( uint256 indexed tgeMilestone, uint256 indexed vestingMilestone ); event Claimed( address indexed beneficiary, uint256 amount, uint256 timestamp ); modifier isBeneficiary() { require( _beneficiaries[msg.sender].totalAmount > 0, "AtheneVesting: beneficiary is not valid" ); _; } modifier isAdmin() { require(adminAddress == msg.sender, "AtheneVesting: only admin"); _; } constructor(address _token) Ownable() { require( _token != address(0), "AtheneVesting: token address must not be zero" ); token = IERC20(_token); adminAddress = msg.sender; } function stop() external onlyOwner { _pause(); } function start() external onlyOwner { _unpause(); } function _addBeneficiaries( address beneficiary, uint256 totalAmount ) internal { require( beneficiary != address(0), "AtheneVesting: beneficiary address must not be zero" ); require( totalAmount > 0, "AtheneVesting: total amount must be greater than zero" ); require( _beneficiaries[beneficiary].totalAmount == 0, "AtheneVesting: beneficiary is already in pool" ); _beneficiaries[beneficiary] = Beneficiary(totalAmount, false, 0); emit BeneficiaryRegistered(beneficiary, totalAmount); } function addBeneficiaries( address[] memory beneficiaries, uint256[] memory amounts ) external onlyOwner { require( beneficiaries.length == amounts.length, "AtheneVesting: beneficiaries and amounts' length should be equal" ); for (uint256 i = 0; i < beneficiaries.length; i++) { _addBeneficiaries(beneficiaries[i], amounts[i]); } } function setMilestone( uint256 _tgeMilestone, uint256 _vestingMilestone ) external onlyOwner { require( _tgeMilestone > 0 && _vestingMilestone > 0, "AtheneVesting: milestone must be a timestamp" ); require( _tgeMilestone < _vestingMilestone, "AtheneVesting: vesting milestone must be greater than TGE milestone" ); tgeMilestone = _tgeMilestone; vestingMilestone = _vestingMilestone; emit SetMilestone(tgeMilestone, vestingMilestone); } function vestingOf( address beneficiary ) external view returns (uint256, bool, uint256) { return ( _beneficiaries[beneficiary].totalAmount, _beneficiaries[beneficiary].isClaimedTge, _beneficiaries[beneficiary].totalClaimed ); } function claim() external isBeneficiary whenNotPaused nonReentrant { require( tgeMilestone > 0 && block.timestamp >= tgeMilestone, "AtheneVesting: need to wait until after TGE to claim" ); Beneficiary memory _beneficiary = _beneficiaries[msg.sender]; require( _beneficiary.totalClaimed < _beneficiary.totalAmount, "AtheneVesting: cannot claim more than the total vested amount" ); uint256 percent = 0; if (block.timestamp >= vestingMilestone) { if (_beneficiary.isClaimedTge) { percent = DENOMINATOR - _tge_percent; } else { percent = DENOMINATOR; _beneficiaries[msg.sender].isClaimedTge = true; } } else { if (!_beneficiary.isClaimedTge) { percent = _tge_percent; _beneficiaries[msg.sender].isClaimedTge = true; } } require( percent > 0 && percent <= DENOMINATOR, "AtheneVesting: nothing to claim" ); uint256 transferAmount = (_beneficiary.totalAmount * percent) / DENOMINATOR; require( token.balanceOf(address(this)) >= transferAmount, "AtheneVesting: insufficient contract balance" ); require( _beneficiary.totalClaimed + transferAmount <= _beneficiary.totalAmount, "AtheneVesting: cannot claim more than the total vested amount" ); _beneficiaries[msg.sender].totalClaimed += transferAmount; token.safeTransfer(msg.sender, transferAmount); emit Claimed(msg.sender, transferAmount, block.timestamp); } function hasClaimedTGE(address addr) external view returns (bool) { return _beneficiaries[addr].isClaimedTge; } function setAdminWallet(address _newAdminAddress) external onlyOwner { require( _newAdminAddress != address(0), "AtheneVesting: admin address cannot be zero" ); address oldAddressReceive = adminAddress; adminAddress = _newAdminAddress; emit ChangeAdminAddress(oldAddressReceive, _newAdminAddress); } function withdraw() external isAdmin { uint256 balance = token.balanceOf(address(this)); require(balance > 0, "AtheneVesting: contract balance is zero"); token.safeTransfer(adminAddress, balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"BeneficiaryRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"ChangeAdminAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"}],"name":"Claimed","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":true,"internalType":"uint256","name":"tgeMilestone","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"vestingMilestone","type":"uint256"}],"name":"SetMilestone","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address[]","name":"beneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"addBeneficiaries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"adminAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"hasClaimedTGE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdminAddress","type":"address"}],"name":"setAdminWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tgeMilestone","type":"uint256"},{"internalType":"uint256","name":"_vestingMilestone","type":"uint256"}],"name":"setMilestone","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tgeMilestone","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":"vestingMilestone","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"vestingOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c06040526000600255600060035561015e6080908152503480156200002457600080fd5b5060405162002f2538038062002f2583398181016040528101906200004a9190620002af565b6200006a6200005e6200017960201b60201c565b6200018160201b60201c565b60008060146101000a81548160ff02191690831515021790555060018081905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620000fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000f49062000368565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff168152505033600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200038a565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000277826200024a565b9050919050565b62000289816200026a565b81146200029557600080fd5b50565b600081519050620002a9816200027e565b92915050565b600060208284031215620002c857620002c762000245565b5b6000620002d88482850162000298565b91505092915050565b600082825260208201905092915050565b7f417468656e6556657374696e673a20746f6b656e2061646472657373206d757360008201527f74206e6f74206265207a65726f00000000000000000000000000000000000000602082015250565b600062000350602d83620002e1565b91506200035d82620002f2565b604082019050919050565b60006020820190508181036000830152620003838162000341565b9050919050565b60805160a051612b59620003cc6000396000818161048e0152818161059401528181610a150152610ba401526000818161087e01526109220152612b596000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c8063715018a611610097578063beaacb6211610066578063beaacb6214610203578063c47cfca114610233578063f2fde38b14610265578063fc6f94681461028157610100565b8063715018a6146101b55780638da5cb5b146101bf578063a9610655146101dd578063be9a6555146101f957610100565b80633ccfd60b116100d35780633ccfd60b146101675780633ed0cd21146101715780634e71d92d1461018d5780635c975abb1461019757610100565b806307da68f51461010557806317d0c0701461010f578063350829331461012d5780633b22ca7f14610149575b600080fd5b61010d61029f565b005b6101176102b1565b604051610124919061178e565b60405180910390f35b6101476004803603810190610142919061181b565b6102b7565b005b6101516103f4565b60405161015e919061178e565b60405180910390f35b61016f6103fa565b005b61018b60048036038101906101869190611874565b6105db565b005b6101956106b8565b005b61019f610c45565b6040516101ac91906118cf565b60405180910390f35b6101bd610c5b565b005b6101c7610c6f565b6040516101d491906118f9565b60405180910390f35b6101f760048036038101906101f29190611b30565b610c98565b005b610201610d46565b005b61021d6004803603810190610218919061181b565b610d58565b60405161022a91906118cf565b60405180910390f35b61024d6004803603810190610248919061181b565b610db1565b60405161025c93929190611ba8565b60405180910390f35b61027f600480360381019061027a919061181b565b610e99565b005b610289610f1c565b60405161029691906118f9565b60405180910390f35b6102a7610f42565b6102af610fc0565b565b60025481565b6102bf610f42565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361032e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032590611c62565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f6a3c98d3aa0449db5995dcdff5a20325eb323757ff62aa4f2415d0f6260d51fd60405160405180910390a35050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461048a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048190611cce565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104e591906118f9565b602060405180830381865afa158015610502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105269190611d03565b90506000811161056b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056290611da2565b60405180910390fd5b6105d8600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166110239092919063ffffffff16565b50565b6105e3610f42565b6000821180156105f35750600081115b610632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062990611e34565b60405180910390fd5b808210610674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066b90611eec565b60405180910390fd5b81600281905550806003819055506003546002547f4781450d498a4df4b8909299c63832853ab979e36430a500ccd798fc6a09816b60405160405180910390a35050565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541161073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490611f7e565b60405180910390fd5b6107456110a9565b61074d6110f3565b600060025411801561076157506002544210155b6107a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079790612010565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a900460ff1615151515815260200160028201548152505090508060000151816040015110610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085e906120a2565b60405180910390fd5b60006003544210610917578160200151156108b1577f00000000000000000000000000000000000000000000000000000000000000006103e86108aa91906120f1565b9050610912565b6103e890506001600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055505b6109a0565b816020015161099f577f000000000000000000000000000000000000000000000000000000000000000090506001600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055505b5b6000811180156109b257506103e88111155b6109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e890612171565b60405180910390fd5b60006103e8828460000151610a069190612191565b610a109190612202565b9050807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a6c91906118f9565b602060405180830381865afa158015610a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aad9190611d03565b1015610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906122a5565b60405180910390fd5b8260000151818460400151610b0391906122c5565b1115610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b906120a2565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254610b9691906122c5565b92505081905550610be833827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166110239092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8242604051610c309291906122f9565b60405180910390a2505050610c43611142565b565b60008060149054906101000a900460ff16905090565b610c63610f42565b610c6d600061114b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ca0610f42565b8051825114610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90612394565b60405180910390fd5b60005b8251811015610d4157610d2e838281518110610d0657610d056123b4565b5b6020026020010151838381518110610d2157610d206123b4565b5b602002602001015161120f565b8080610d39906123e3565b915050610ce7565b505050565b610d4e610f42565b610d5661142d565b565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff169050919050565b6000806000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b610ea1610f42565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f079061249d565b60405180910390fd5b610f198161114b565b50565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f4a61148f565b73ffffffffffffffffffffffffffffffffffffffff16610f68610c6f565b73ffffffffffffffffffffffffffffffffffffffff1614610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590612509565b60405180910390fd5b565b610fc86110a9565b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861100c61148f565b60405161101991906118f9565b60405180910390a1565b6110a48363a9059cbb60e01b8484604051602401611042929190612529565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611497565b505050565b6110b1610c45565b156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e89061259e565b60405180910390fd5b565b600260015403611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f9061260a565b60405180910390fd5b6002600181905550565b60018081905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361127e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112759061269c565b60405180910390fd5b600081116112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b89061272e565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d906127c0565b60405180910390fd5b60405180606001604052808281526020016000151581526020016000815250600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908315150217905550604082015181600201559050508173ffffffffffffffffffffffffffffffffffffffff167fff65a2f5a5680b4db6dadbe5e90a02bc72e5ad8534ac312ef33392750b29759482604051611421919061178e565b60405180910390a25050565b61143561155f565b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61147861148f565b60405161148591906118f9565b60405180910390a1565b600033905090565b60006114f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166115a89092919063ffffffff16565b905060008151148061151b57508080602001905181019061151a919061280c565b5b61155a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611551906128ab565b60405180910390fd5b505050565b611567610c45565b6115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d90612917565b60405180910390fd5b565b60606115b784846000856115c0565b90509392505050565b606082471015611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc906129a9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161162e9190612a3a565b60006040518083038185875af1925050503d806000811461166b576040519150601f19603f3d011682016040523d82523d6000602084013e611670565b606091505b50915091506116818783838761168d565b92505050949350505050565b606083156116ef5760008351036116e7576116a785611702565b6116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90612a9d565b60405180910390fd5b5b8290506116fa565b6116f98383611725565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156117385781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c9190612b01565b60405180910390fd5b6000819050919050565b61178881611775565b82525050565b60006020820190506117a3600083018461177f565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117e8826117bd565b9050919050565b6117f8816117dd565b811461180357600080fd5b50565b600081359050611815816117ef565b92915050565b600060208284031215611831576118306117b3565b5b600061183f84828501611806565b91505092915050565b61185181611775565b811461185c57600080fd5b50565b60008135905061186e81611848565b92915050565b6000806040838503121561188b5761188a6117b3565b5b60006118998582860161185f565b92505060206118aa8582860161185f565b9150509250929050565b60008115159050919050565b6118c9816118b4565b82525050565b60006020820190506118e460008301846118c0565b92915050565b6118f3816117dd565b82525050565b600060208201905061190e60008301846118ea565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61196282611919565b810181811067ffffffffffffffff821117156119815761198061192a565b5b80604052505050565b60006119946117a9565b90506119a08282611959565b919050565b600067ffffffffffffffff8211156119c0576119bf61192a565b5b602082029050602081019050919050565b600080fd5b60006119e96119e4846119a5565b61198a565b90508083825260208201905060208402830185811115611a0c57611a0b6119d1565b5b835b81811015611a355780611a218882611806565b845260208401935050602081019050611a0e565b5050509392505050565b600082601f830112611a5457611a53611914565b5b8135611a648482602086016119d6565b91505092915050565b600067ffffffffffffffff821115611a8857611a8761192a565b5b602082029050602081019050919050565b6000611aac611aa784611a6d565b61198a565b90508083825260208201905060208402830185811115611acf57611ace6119d1565b5b835b81811015611af85780611ae4888261185f565b845260208401935050602081019050611ad1565b5050509392505050565b600082601f830112611b1757611b16611914565b5b8135611b27848260208601611a99565b91505092915050565b60008060408385031215611b4757611b466117b3565b5b600083013567ffffffffffffffff811115611b6557611b646117b8565b5b611b7185828601611a3f565b925050602083013567ffffffffffffffff811115611b9257611b916117b8565b5b611b9e85828601611b02565b9150509250929050565b6000606082019050611bbd600083018661177f565b611bca60208301856118c0565b611bd7604083018461177f565b949350505050565b600082825260208201905092915050565b7f417468656e6556657374696e673a2061646d696e20616464726573732063616e60008201527f6e6f74206265207a65726f000000000000000000000000000000000000000000602082015250565b6000611c4c602b83611bdf565b9150611c5782611bf0565b604082019050919050565b60006020820190508181036000830152611c7b81611c3f565b9050919050565b7f417468656e6556657374696e673a206f6e6c792061646d696e00000000000000600082015250565b6000611cb8601983611bdf565b9150611cc382611c82565b602082019050919050565b60006020820190508181036000830152611ce781611cab565b9050919050565b600081519050611cfd81611848565b92915050565b600060208284031215611d1957611d186117b3565b5b6000611d2784828501611cee565b91505092915050565b7f417468656e6556657374696e673a20636f6e74726163742062616c616e63652060008201527f6973207a65726f00000000000000000000000000000000000000000000000000602082015250565b6000611d8c602783611bdf565b9150611d9782611d30565b604082019050919050565b60006020820190508181036000830152611dbb81611d7f565b9050919050565b7f417468656e6556657374696e673a206d696c6573746f6e65206d75737420626560008201527f20612074696d657374616d700000000000000000000000000000000000000000602082015250565b6000611e1e602c83611bdf565b9150611e2982611dc2565b604082019050919050565b60006020820190508181036000830152611e4d81611e11565b9050919050565b7f417468656e6556657374696e673a2076657374696e67206d696c6573746f6e6560008201527f206d7573742062652067726561746572207468616e20544745206d696c65737460208201527f6f6e650000000000000000000000000000000000000000000000000000000000604082015250565b6000611ed6604383611bdf565b9150611ee182611e54565b606082019050919050565b60006020820190508181036000830152611f0581611ec9565b9050919050565b7f417468656e6556657374696e673a2062656e6566696369617279206973206e6f60008201527f742076616c696400000000000000000000000000000000000000000000000000602082015250565b6000611f68602783611bdf565b9150611f7382611f0c565b604082019050919050565b60006020820190508181036000830152611f9781611f5b565b9050919050565b7f417468656e6556657374696e673a206e65656420746f207761697420756e746960008201527f6c2061667465722054474520746f20636c61696d000000000000000000000000602082015250565b6000611ffa603483611bdf565b915061200582611f9e565b604082019050919050565b6000602082019050818103600083015261202981611fed565b9050919050565b7f417468656e6556657374696e673a2063616e6e6f7420636c61696d206d6f726560008201527f207468616e2074686520746f74616c2076657374656420616d6f756e74000000602082015250565b600061208c603d83611bdf565b915061209782612030565b604082019050919050565b600060208201905081810360008301526120bb8161207f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006120fc82611775565b915061210783611775565b925082820390508181111561211f5761211e6120c2565b5b92915050565b7f417468656e6556657374696e673a206e6f7468696e6720746f20636c61696d00600082015250565b600061215b601f83611bdf565b915061216682612125565b602082019050919050565b6000602082019050818103600083015261218a8161214e565b9050919050565b600061219c82611775565b91506121a783611775565b92508282026121b581611775565b915082820484148315176121cc576121cb6120c2565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061220d82611775565b915061221883611775565b925082612228576122276121d3565b5b828204905092915050565b7f417468656e6556657374696e673a20696e73756666696369656e7420636f6e7460008201527f726163742062616c616e63650000000000000000000000000000000000000000602082015250565b600061228f602c83611bdf565b915061229a82612233565b604082019050919050565b600060208201905081810360008301526122be81612282565b9050919050565b60006122d082611775565b91506122db83611775565b92508282019050808211156122f3576122f26120c2565b5b92915050565b600060408201905061230e600083018561177f565b61231b602083018461177f565b9392505050565b7f417468656e6556657374696e673a2062656e6566696369617269657320616e6460008201527f20616d6f756e747327206c656e6774682073686f756c6420626520657175616c602082015250565b600061237e604083611bdf565b915061238982612322565b604082019050919050565b600060208201905081810360008301526123ad81612371565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006123ee82611775565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124205761241f6120c2565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612487602683611bdf565b91506124928261242b565b604082019050919050565b600060208201905081810360008301526124b68161247a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006124f3602083611bdf565b91506124fe826124bd565b602082019050919050565b60006020820190508181036000830152612522816124e6565b9050919050565b600060408201905061253e60008301856118ea565b61254b602083018461177f565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612588601083611bdf565b915061259382612552565b602082019050919050565b600060208201905081810360008301526125b78161257b565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006125f4601f83611bdf565b91506125ff826125be565b602082019050919050565b60006020820190508181036000830152612623816125e7565b9050919050565b7f417468656e6556657374696e673a2062656e656669636961727920616464726560008201527f7373206d757374206e6f74206265207a65726f00000000000000000000000000602082015250565b6000612686603383611bdf565b91506126918261262a565b604082019050919050565b600060208201905081810360008301526126b581612679565b9050919050565b7f417468656e6556657374696e673a20746f74616c20616d6f756e74206d75737460008201527f2062652067726561746572207468616e207a65726f0000000000000000000000602082015250565b6000612718603583611bdf565b9150612723826126bc565b604082019050919050565b600060208201905081810360008301526127478161270b565b9050919050565b7f417468656e6556657374696e673a2062656e656669636961727920697320616c60008201527f726561647920696e20706f6f6c00000000000000000000000000000000000000602082015250565b60006127aa602d83611bdf565b91506127b58261274e565b604082019050919050565b600060208201905081810360008301526127d98161279d565b9050919050565b6127e9816118b4565b81146127f457600080fd5b50565b600081519050612806816127e0565b92915050565b600060208284031215612822576128216117b3565b5b6000612830848285016127f7565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612895602a83611bdf565b91506128a082612839565b604082019050919050565b600060208201905081810360008301526128c481612888565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612901601483611bdf565b915061290c826128cb565b602082019050919050565b60006020820190508181036000830152612930816128f4565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612993602683611bdf565b915061299e82612937565b604082019050919050565b600060208201905081810360008301526129c281612986565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156129fd5780820151818401526020810190506129e2565b60008484015250505050565b6000612a14826129c9565b612a1e81856129d4565b9350612a2e8185602086016129df565b80840191505092915050565b6000612a468284612a09565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612a87601d83611bdf565b9150612a9282612a51565b602082019050919050565b60006020820190508181036000830152612ab681612a7a565b9050919050565b600081519050919050565b6000612ad382612abd565b612add8185611bdf565b9350612aed8185602086016129df565b612af681611919565b840191505092915050565b60006020820190508181036000830152612b1b8184612ac8565b90509291505056fea26469706673582212201388e3af230906f69c3c29aaa77407c381697985acbc5498aa2d5e971b3882ea64736f6c63430008120033000000000000000000000000f3c3745894d979f8f85761bd060520bddbc464e9
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101005760003560e01c8063715018a611610097578063beaacb6211610066578063beaacb6214610203578063c47cfca114610233578063f2fde38b14610265578063fc6f94681461028157610100565b8063715018a6146101b55780638da5cb5b146101bf578063a9610655146101dd578063be9a6555146101f957610100565b80633ccfd60b116100d35780633ccfd60b146101675780633ed0cd21146101715780634e71d92d1461018d5780635c975abb1461019757610100565b806307da68f51461010557806317d0c0701461010f578063350829331461012d5780633b22ca7f14610149575b600080fd5b61010d61029f565b005b6101176102b1565b604051610124919061178e565b60405180910390f35b6101476004803603810190610142919061181b565b6102b7565b005b6101516103f4565b60405161015e919061178e565b60405180910390f35b61016f6103fa565b005b61018b60048036038101906101869190611874565b6105db565b005b6101956106b8565b005b61019f610c45565b6040516101ac91906118cf565b60405180910390f35b6101bd610c5b565b005b6101c7610c6f565b6040516101d491906118f9565b60405180910390f35b6101f760048036038101906101f29190611b30565b610c98565b005b610201610d46565b005b61021d6004803603810190610218919061181b565b610d58565b60405161022a91906118cf565b60405180910390f35b61024d6004803603810190610248919061181b565b610db1565b60405161025c93929190611ba8565b60405180910390f35b61027f600480360381019061027a919061181b565b610e99565b005b610289610f1c565b60405161029691906118f9565b60405180910390f35b6102a7610f42565b6102af610fc0565b565b60025481565b6102bf610f42565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361032e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032590611c62565b60405180910390fd5b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f6a3c98d3aa0449db5995dcdff5a20325eb323757ff62aa4f2415d0f6260d51fd60405160405180910390a35050565b60035481565b3373ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461048a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161048190611cce565b60405180910390fd5b60007f000000000000000000000000f3c3745894d979f8f85761bd060520bddbc464e973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104e591906118f9565b602060405180830381865afa158015610502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105269190611d03565b90506000811161056b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161056290611da2565b60405180910390fd5b6105d8600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16827f000000000000000000000000f3c3745894d979f8f85761bd060520bddbc464e973ffffffffffffffffffffffffffffffffffffffff166110239092919063ffffffff16565b50565b6105e3610f42565b6000821180156105f35750600081115b610632576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062990611e34565b60405180910390fd5b808210610674576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066b90611eec565b60405180910390fd5b81600281905550806003819055506003546002547f4781450d498a4df4b8909299c63832853ab979e36430a500ccd798fc6a09816b60405160405180910390a35050565b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001541161073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490611f7e565b60405180910390fd5b6107456110a9565b61074d6110f3565b600060025411801561076157506002544210155b6107a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079790612010565b60405180910390fd5b6000600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020604051806060016040529081600082015481526020016001820160009054906101000a900460ff1615151515815260200160028201548152505090508060000151816040015110610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085e906120a2565b60405180910390fd5b60006003544210610917578160200151156108b1577f000000000000000000000000000000000000000000000000000000000000015e6103e86108aa91906120f1565b9050610912565b6103e890506001600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055505b6109a0565b816020015161099f577f000000000000000000000000000000000000000000000000000000000000015e90506001600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160006101000a81548160ff0219169083151502179055505b5b6000811180156109b257506103e88111155b6109f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e890612171565b60405180910390fd5b60006103e8828460000151610a069190612191565b610a109190612202565b9050807f000000000000000000000000f3c3745894d979f8f85761bd060520bddbc464e973ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610a6c91906118f9565b602060405180830381865afa158015610a89573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610aad9190611d03565b1015610aee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae5906122a5565b60405180910390fd5b8260000151818460400151610b0391906122c5565b1115610b44576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3b906120a2565b60405180910390fd5b80600560003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002016000828254610b9691906122c5565b92505081905550610be833827f000000000000000000000000f3c3745894d979f8f85761bd060520bddbc464e973ffffffffffffffffffffffffffffffffffffffff166110239092919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff167f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a8242604051610c309291906122f9565b60405180910390a2505050610c43611142565b565b60008060149054906101000a900460ff16905090565b610c63610f42565b610c6d600061114b565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610ca0610f42565b8051825114610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb90612394565b60405180910390fd5b60005b8251811015610d4157610d2e838281518110610d0657610d056123b4565b5b6020026020010151838381518110610d2157610d206123b4565b5b602002602001015161120f565b8080610d39906123e3565b915050610ce7565b505050565b610d4e610f42565b610d5661142d565b565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff169050919050565b6000806000600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160009054906101000a900460ff16600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201549250925092509193909250565b610ea1610f42565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f079061249d565b60405180910390fd5b610f198161114b565b50565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610f4a61148f565b73ffffffffffffffffffffffffffffffffffffffff16610f68610c6f565b73ffffffffffffffffffffffffffffffffffffffff1614610fbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb590612509565b60405180910390fd5b565b610fc86110a9565b6001600060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861100c61148f565b60405161101991906118f9565b60405180910390a1565b6110a48363a9059cbb60e01b8484604051602401611042929190612529565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611497565b505050565b6110b1610c45565b156110f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e89061259e565b60405180910390fd5b565b600260015403611138576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112f9061260a565b60405180910390fd5b6002600181905550565b60018081905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361127e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112759061269c565b60405180910390fd5b600081116112c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b89061272e565b60405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000015414611346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133d906127c0565b60405180910390fd5b60405180606001604052808281526020016000151581526020016000815250600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000820151816000015560208201518160010160006101000a81548160ff021916908315150217905550604082015181600201559050508173ffffffffffffffffffffffffffffffffffffffff167fff65a2f5a5680b4db6dadbe5e90a02bc72e5ad8534ac312ef33392750b29759482604051611421919061178e565b60405180910390a25050565b61143561155f565b60008060146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61147861148f565b60405161148591906118f9565b60405180910390a1565b600033905090565b60006114f9826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166115a89092919063ffffffff16565b905060008151148061151b57508080602001905181019061151a919061280c565b5b61155a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611551906128ab565b60405180910390fd5b505050565b611567610c45565b6115a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159d90612917565b60405180910390fd5b565b60606115b784846000856115c0565b90509392505050565b606082471015611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc906129a9565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161162e9190612a3a565b60006040518083038185875af1925050503d806000811461166b576040519150601f19603f3d011682016040523d82523d6000602084013e611670565b606091505b50915091506116818783838761168d565b92505050949350505050565b606083156116ef5760008351036116e7576116a785611702565b6116e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116dd90612a9d565b60405180910390fd5b5b8290506116fa565b6116f98383611725565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156117385781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161176c9190612b01565b60405180910390fd5b6000819050919050565b61178881611775565b82525050565b60006020820190506117a3600083018461177f565b92915050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006117e8826117bd565b9050919050565b6117f8816117dd565b811461180357600080fd5b50565b600081359050611815816117ef565b92915050565b600060208284031215611831576118306117b3565b5b600061183f84828501611806565b91505092915050565b61185181611775565b811461185c57600080fd5b50565b60008135905061186e81611848565b92915050565b6000806040838503121561188b5761188a6117b3565b5b60006118998582860161185f565b92505060206118aa8582860161185f565b9150509250929050565b60008115159050919050565b6118c9816118b4565b82525050565b60006020820190506118e460008301846118c0565b92915050565b6118f3816117dd565b82525050565b600060208201905061190e60008301846118ea565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61196282611919565b810181811067ffffffffffffffff821117156119815761198061192a565b5b80604052505050565b60006119946117a9565b90506119a08282611959565b919050565b600067ffffffffffffffff8211156119c0576119bf61192a565b5b602082029050602081019050919050565b600080fd5b60006119e96119e4846119a5565b61198a565b90508083825260208201905060208402830185811115611a0c57611a0b6119d1565b5b835b81811015611a355780611a218882611806565b845260208401935050602081019050611a0e565b5050509392505050565b600082601f830112611a5457611a53611914565b5b8135611a648482602086016119d6565b91505092915050565b600067ffffffffffffffff821115611a8857611a8761192a565b5b602082029050602081019050919050565b6000611aac611aa784611a6d565b61198a565b90508083825260208201905060208402830185811115611acf57611ace6119d1565b5b835b81811015611af85780611ae4888261185f565b845260208401935050602081019050611ad1565b5050509392505050565b600082601f830112611b1757611b16611914565b5b8135611b27848260208601611a99565b91505092915050565b60008060408385031215611b4757611b466117b3565b5b600083013567ffffffffffffffff811115611b6557611b646117b8565b5b611b7185828601611a3f565b925050602083013567ffffffffffffffff811115611b9257611b916117b8565b5b611b9e85828601611b02565b9150509250929050565b6000606082019050611bbd600083018661177f565b611bca60208301856118c0565b611bd7604083018461177f565b949350505050565b600082825260208201905092915050565b7f417468656e6556657374696e673a2061646d696e20616464726573732063616e60008201527f6e6f74206265207a65726f000000000000000000000000000000000000000000602082015250565b6000611c4c602b83611bdf565b9150611c5782611bf0565b604082019050919050565b60006020820190508181036000830152611c7b81611c3f565b9050919050565b7f417468656e6556657374696e673a206f6e6c792061646d696e00000000000000600082015250565b6000611cb8601983611bdf565b9150611cc382611c82565b602082019050919050565b60006020820190508181036000830152611ce781611cab565b9050919050565b600081519050611cfd81611848565b92915050565b600060208284031215611d1957611d186117b3565b5b6000611d2784828501611cee565b91505092915050565b7f417468656e6556657374696e673a20636f6e74726163742062616c616e63652060008201527f6973207a65726f00000000000000000000000000000000000000000000000000602082015250565b6000611d8c602783611bdf565b9150611d9782611d30565b604082019050919050565b60006020820190508181036000830152611dbb81611d7f565b9050919050565b7f417468656e6556657374696e673a206d696c6573746f6e65206d75737420626560008201527f20612074696d657374616d700000000000000000000000000000000000000000602082015250565b6000611e1e602c83611bdf565b9150611e2982611dc2565b604082019050919050565b60006020820190508181036000830152611e4d81611e11565b9050919050565b7f417468656e6556657374696e673a2076657374696e67206d696c6573746f6e6560008201527f206d7573742062652067726561746572207468616e20544745206d696c65737460208201527f6f6e650000000000000000000000000000000000000000000000000000000000604082015250565b6000611ed6604383611bdf565b9150611ee182611e54565b606082019050919050565b60006020820190508181036000830152611f0581611ec9565b9050919050565b7f417468656e6556657374696e673a2062656e6566696369617279206973206e6f60008201527f742076616c696400000000000000000000000000000000000000000000000000602082015250565b6000611f68602783611bdf565b9150611f7382611f0c565b604082019050919050565b60006020820190508181036000830152611f9781611f5b565b9050919050565b7f417468656e6556657374696e673a206e65656420746f207761697420756e746960008201527f6c2061667465722054474520746f20636c61696d000000000000000000000000602082015250565b6000611ffa603483611bdf565b915061200582611f9e565b604082019050919050565b6000602082019050818103600083015261202981611fed565b9050919050565b7f417468656e6556657374696e673a2063616e6e6f7420636c61696d206d6f726560008201527f207468616e2074686520746f74616c2076657374656420616d6f756e74000000602082015250565b600061208c603d83611bdf565b915061209782612030565b604082019050919050565b600060208201905081810360008301526120bb8161207f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006120fc82611775565b915061210783611775565b925082820390508181111561211f5761211e6120c2565b5b92915050565b7f417468656e6556657374696e673a206e6f7468696e6720746f20636c61696d00600082015250565b600061215b601f83611bdf565b915061216682612125565b602082019050919050565b6000602082019050818103600083015261218a8161214e565b9050919050565b600061219c82611775565b91506121a783611775565b92508282026121b581611775565b915082820484148315176121cc576121cb6120c2565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061220d82611775565b915061221883611775565b925082612228576122276121d3565b5b828204905092915050565b7f417468656e6556657374696e673a20696e73756666696369656e7420636f6e7460008201527f726163742062616c616e63650000000000000000000000000000000000000000602082015250565b600061228f602c83611bdf565b915061229a82612233565b604082019050919050565b600060208201905081810360008301526122be81612282565b9050919050565b60006122d082611775565b91506122db83611775565b92508282019050808211156122f3576122f26120c2565b5b92915050565b600060408201905061230e600083018561177f565b61231b602083018461177f565b9392505050565b7f417468656e6556657374696e673a2062656e6566696369617269657320616e6460008201527f20616d6f756e747327206c656e6774682073686f756c6420626520657175616c602082015250565b600061237e604083611bdf565b915061238982612322565b604082019050919050565b600060208201905081810360008301526123ad81612371565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006123ee82611775565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036124205761241f6120c2565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612487602683611bdf565b91506124928261242b565b604082019050919050565b600060208201905081810360008301526124b68161247a565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006124f3602083611bdf565b91506124fe826124bd565b602082019050919050565b60006020820190508181036000830152612522816124e6565b9050919050565b600060408201905061253e60008301856118ea565b61254b602083018461177f565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000612588601083611bdf565b915061259382612552565b602082019050919050565b600060208201905081810360008301526125b78161257b565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006125f4601f83611bdf565b91506125ff826125be565b602082019050919050565b60006020820190508181036000830152612623816125e7565b9050919050565b7f417468656e6556657374696e673a2062656e656669636961727920616464726560008201527f7373206d757374206e6f74206265207a65726f00000000000000000000000000602082015250565b6000612686603383611bdf565b91506126918261262a565b604082019050919050565b600060208201905081810360008301526126b581612679565b9050919050565b7f417468656e6556657374696e673a20746f74616c20616d6f756e74206d75737460008201527f2062652067726561746572207468616e207a65726f0000000000000000000000602082015250565b6000612718603583611bdf565b9150612723826126bc565b604082019050919050565b600060208201905081810360008301526127478161270b565b9050919050565b7f417468656e6556657374696e673a2062656e656669636961727920697320616c60008201527f726561647920696e20706f6f6c00000000000000000000000000000000000000602082015250565b60006127aa602d83611bdf565b91506127b58261274e565b604082019050919050565b600060208201905081810360008301526127d98161279d565b9050919050565b6127e9816118b4565b81146127f457600080fd5b50565b600081519050612806816127e0565b92915050565b600060208284031215612822576128216117b3565b5b6000612830848285016127f7565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612895602a83611bdf565b91506128a082612839565b604082019050919050565b600060208201905081810360008301526128c481612888565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000612901601483611bdf565b915061290c826128cb565b602082019050919050565b60006020820190508181036000830152612930816128f4565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612993602683611bdf565b915061299e82612937565b604082019050919050565b600060208201905081810360008301526129c281612986565b9050919050565b600081519050919050565b600081905092915050565b60005b838110156129fd5780820151818401526020810190506129e2565b60008484015250505050565b6000612a14826129c9565b612a1e81856129d4565b9350612a2e8185602086016129df565b80840191505092915050565b6000612a468284612a09565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000612a87601d83611bdf565b9150612a9282612a51565b602082019050919050565b60006020820190508181036000830152612ab681612a7a565b9050919050565b600081519050919050565b6000612ad382612abd565b612add8185611bdf565b9350612aed8185602086016129df565b612af681611919565b840191505092915050565b60006020820190508181036000830152612b1b8184612ac8565b90509291505056fea26469706673582212201388e3af230906f69c3c29aaa77407c381697985acbc5498aa2d5e971b3882ea64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f3c3745894d979f8f85761bd060520bddbc464e9
-----Decoded View---------------
Arg [0] : _token (address): 0xF3c3745894d979F8F85761bd060520BDdbc464e9
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000f3c3745894d979f8f85761bd060520bddbc464e9
Deployed Bytecode Sourcemap
34294:6424:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36010:62;;;:::i;:::-;;34632:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40102:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34670:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40485:230;;;:::i;:::-;;37274:578;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38172:1789;;;:::i;:::-;;29395:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32253:103;;;:::i;:::-;;31612:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36830:436;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36080:65;;;:::i;:::-;;39969:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37860:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;32511:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34919:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36010:62;31498:13;:11;:13::i;:::-;36056:8:::1;:6;:8::i;:::-;36010:62::o:0;34632:31::-;;;;:::o;40102:375::-;31498:13;:11;:13::i;:::-;40232:1:::1;40204:30;;:16;:30;;::::0;40182:123:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;40316:25;40344:12;;;;;;;;;;;40316:40;;40382:16;40367:12;;:31;;;;;;;;;;;;;;;;;;40452:16;40414:55;;40433:17;40414:55;;;;;;;;;;;;40171:306;40102:375:::0;:::o;34670:35::-;;;;:::o;40485:230::-;35693:10;35677:26;;:12;;;;;;;;;;;:26;;;35669:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;40533:15:::1;40551:5;:15;;;40575:4;40551:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40533:48;;40610:1;40600:7;:11;40592:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;40666:41;40685:12;;;;;;;;;;;40699:7;40666:5;:18;;;;:41;;;;;:::i;:::-;40522:193;40485:230::o:0;37274:578::-;31498:13;:11;:13::i;:::-;37439:1:::1;37423:13;:17;:42;;;;;37464:1;37444:17;:21;37423:42;37401:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;37586:17;37570:13;:33;37548:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;37724:13;37709:12;:28;;;;37767:17;37748:16;:36;;;;37827:16;;37813:12;;37800:44;;;;;;;;;;37274:578:::0;;:::o;38172:1789::-;35543:1;35502:14;:26;35517:10;35502:26;;;;;;;;;;;;;;;:38;;;:42;35480:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;29000:19:::1;:17;:19::i;:::-;2378:21:::2;:19;:21::i;:::-;38287:1:::3;38272:12;;:16;:51;;;;;38311:12;;38292:15;:31;;38272:51;38250:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;38414:31;38448:14;:26;38463:10;38448:26;;;;;;;;;;;;;;;38414:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::3;;;38535:12;:24;;;38507:12;:25;;;:52;38485:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;38659:15;38712:16;;38693:15;:35;38689:482;;38749:12;:25;;;38745:229;;;38819:12;34836:4;38805:26;;;;:::i;:::-;38795:36;;38745:229;;;34836:4;38872:21;;38954:4;38912:14;:26;38927:10;38912:26;;;;;;;;;;;;;;;:39;;;:46;;;;;;;;;;;;;;;;;;38745:229;38689:482;;;39011:12;:25;;;39006:154;;39067:12;39057:22;;39140:4;39098:14;:26;39113:10;39098:26;;;;;;;;;;;;;;;:39;;;:46;;;;;;;;;;;;;;;;;;39006:154;38689:482;39213:1;39203:7;:11;:37;;;;;34836:4;39218:7;:22;;39203:37;39181:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;39310:22;34836:4;39363:7;39336:12;:24;;;:34;;;;:::i;:::-;39335:63;;;;:::i;:::-;39310:88;;39465:14;39431:5;:15;;;39455:4;39431:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::3;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:48;;39409:142;;;;;;;;;;;;:::i;:::-;;;;;;;;;39647:12;:24;;;39612:14;39584:12;:25;;;:42;;;;:::i;:::-;:87;;39562:198;;;;;;;;;;;;:::i;:::-;;;;;;;;;39814:14;39771;:26;39786:10;39771:26;;;;;;;;;;;;;;;:39;;;:57;;;;;;;:::i;:::-;;;;;;;;39839:46;39858:10;39870:14;39839:5;:18;;;;:46;;;;;:::i;:::-;39909:10;39901:52;;;39921:14;39937:15;39901:52;;;;;;;:::i;:::-;;;;;;;;38239:1722;;;2422:20:::2;:18;:20::i;:::-;38172:1789::o:0;29395:86::-;29442:4;29466:7;;;;;;;;;;;29459:14;;29395:86;:::o;32253:103::-;31498:13;:11;:13::i;:::-;32318:30:::1;32345:1;32318:18;:30::i;:::-;32253:103::o:0;31612:87::-;31658:7;31685:6;;;;;;;;;;;31678:13;;31612:87;:::o;36830:436::-;31498:13;:11;:13::i;:::-;37015:7:::1;:14;36991:13;:20;:38;36969:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;37139:9;37134:125;37158:13;:20;37154:1;:24;37134:125;;;37200:47;37218:13;37232:1;37218:16;;;;;;;;:::i;:::-;;;;;;;;37236:7;37244:1;37236:10;;;;;;;;:::i;:::-;;;;;;;;37200:17;:47::i;:::-;37180:3;;;;;:::i;:::-;;;;37134:125;;;;36830:436:::0;;:::o;36080:65::-;31498:13;:11;:13::i;:::-;36127:10:::1;:8;:10::i;:::-;36080:65::o:0;39969:125::-;40029:4;40053:14;:20;40068:4;40053:20;;;;;;;;;;;;;;;:33;;;;;;;;;;;;40046:40;;39969:125;;;:::o;37860:304::-;37939:7;37948:4;37954:7;37996:14;:27;38011:11;37996:27;;;;;;;;;;;;;;;:39;;;38050:14;:27;38065:11;38050:27;;;;;;;;;;;;;;;:40;;;;;;;;;;;;38105:14;:27;38120:11;38105:27;;;;;;;;;;;;;;;:40;;;37974:182;;;;;;37860:304;;;;;:::o;32511:201::-;31498:13;:11;:13::i;:::-;32620:1:::1;32600:22;;:8;:22;;::::0;32592:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;32676:28;32695:8;32676:18;:28::i;:::-;32511:201:::0;:::o;34919:27::-;;;;;;;;;;;;;:::o;31777:132::-;31852:12;:10;:12::i;:::-;31841:23;;:7;:5;:7::i;:::-;:23;;;31833:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31777:132::o;29991:118::-;29000:19;:17;:19::i;:::-;30061:4:::1;30051:7;;:14;;;;;;;;;;;;;;;;;;30081:20;30088:12;:10;:12::i;:::-;30081:20;;;;;;:::i;:::-;;;;;;;;29991:118::o:0;20592:177::-;20675:86;20695:5;20725:23;;;20750:2;20754:5;20702:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20675:19;:86::i;:::-;20592:177;;;:::o;29554:108::-;29625:8;:6;:8::i;:::-;29624:9;29616:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;29554:108::o;2458:293::-;1860:1;2592:7;;:19;2584:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1860:1;2725:7;:18;;;;2458:293::o;2759:213::-;1816:1;2942:7;:22;;;;2759:213::o;32872:191::-;32946:16;32965:6;;;;;;;;;;;32946:25;;32991:8;32982:6;;:17;;;;;;;;;;;;;;;;;;33046:8;33015:40;;33036:8;33015:40;;;;;;;;;;;;32935:128;32872:191;:::o;36153:669::-;36312:1;36289:25;;:11;:25;;;36267:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;36440:1;36426:11;:15;36404:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;36598:1;36555:14;:27;36570:11;36555:27;;;;;;;;;;;;;;;:39;;;:44;36533:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;36715:34;;;;;;;;36727:11;36715:34;;;;36740:5;36715:34;;;;;;36747:1;36715:34;;;36685:14;:27;36700:11;36685:27;;;;;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36789:11;36767:47;;;36802:11;36767:47;;;;;;:::i;:::-;;;;;;;;36153:669;;:::o;30250:120::-;29259:16;:14;:16::i;:::-;30319:5:::1;30309:7:::0;::::1;:15;;;;;;;;;;;;;;;;;;30340:22;30349:12;:10;:12::i;:::-;30340:22;;;;;;:::i;:::-;;;;;;;;30250:120::o:0;27401:98::-;27454:7;27481:10;27474:17;;27401:98;:::o;24938:649::-;25362:23;25388:69;25416:4;25388:69;;;;;;;;;;;;;;;;;25396:5;25388:27;;;;:69;;;;;:::i;:::-;25362:95;;25497:1;25476:10;:17;:22;:56;;;;25513:10;25502:30;;;;;;;;;;;;:::i;:::-;25476:56;25468:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25008:579;24938:649;;:::o;29739:108::-;29806:8;:6;:8::i;:::-;29798:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;29739:108::o;7502:229::-;7639:12;7671:52;7693:6;7701:4;7707:1;7710:12;7671:21;:52::i;:::-;7664:59;;7502:229;;;;;:::o;8588:455::-;8758:12;8816:5;8791:21;:30;;8783:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;8876:12;8890:23;8917:6;:11;;8936:5;8943:4;8917:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8875:73;;;;8966:69;8993:6;9001:7;9010:10;9022:12;8966:26;:69::i;:::-;8959:76;;;;8588:455;;;;;;:::o;11161:644::-;11346:12;11375:7;11371:427;;;11424:1;11403:10;:17;:22;11399:290;;11621:18;11632:6;11621:10;:18::i;:::-;11613:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;11399:290;11710:10;11703:17;;;;11371:427;11753:33;11761:10;11773:12;11753:7;:33::i;:::-;11161:644;;;;;;;:::o;4747:326::-;4807:4;5064:1;5042:7;:19;;;:23;5035:30;;4747:326;;;:::o;12347:552::-;12528:1;12508:10;:17;:21;12504:388;;;12740:10;12734:17;12797:15;12784:10;12780:2;12776:19;12769:44;12504:388;12867:12;12860:20;;;;;;;;;;;:::i;:::-;;;;;;;;7:77:1;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;442:75::-;475:6;508:2;502:9;492:19;;442:75;:::o;523:117::-;632:1;629;622:12;646:117;755:1;752;745:12;769:126;806:7;846:42;839:5;835:54;824:65;;769:126;;;:::o;901:96::-;938:7;967:24;985:5;967:24;:::i;:::-;956:35;;901:96;;;:::o;1003:122::-;1076:24;1094:5;1076:24;:::i;:::-;1069:5;1066:35;1056:63;;1115:1;1112;1105:12;1056:63;1003:122;:::o;1131:139::-;1177:5;1215:6;1202:20;1193:29;;1231:33;1258:5;1231:33;:::i;:::-;1131:139;;;;:::o;1276:329::-;1335:6;1384:2;1372:9;1363:7;1359:23;1355:32;1352:119;;;1390:79;;:::i;:::-;1352:119;1510:1;1535:53;1580:7;1571:6;1560:9;1556:22;1535:53;:::i;:::-;1525:63;;1481:117;1276:329;;;;:::o;1611:122::-;1684:24;1702:5;1684:24;:::i;:::-;1677:5;1674:35;1664:63;;1723:1;1720;1713:12;1664:63;1611:122;:::o;1739:139::-;1785:5;1823:6;1810:20;1801:29;;1839:33;1866:5;1839:33;:::i;:::-;1739:139;;;;:::o;1884:474::-;1952:6;1960;2009:2;1997:9;1988:7;1984:23;1980:32;1977:119;;;2015:79;;:::i;:::-;1977:119;2135:1;2160:53;2205:7;2196:6;2185:9;2181:22;2160:53;:::i;:::-;2150:63;;2106:117;2262:2;2288:53;2333:7;2324:6;2313:9;2309:22;2288:53;:::i;:::-;2278:63;;2233:118;1884:474;;;;;:::o;2364:90::-;2398:7;2441:5;2434:13;2427:21;2416:32;;2364:90;;;:::o;2460:109::-;2541:21;2556:5;2541:21;:::i;:::-;2536:3;2529:34;2460:109;;:::o;2575:210::-;2662:4;2700:2;2689:9;2685:18;2677:26;;2713:65;2775:1;2764:9;2760:17;2751:6;2713:65;:::i;:::-;2575:210;;;;:::o;2791:118::-;2878:24;2896:5;2878:24;:::i;:::-;2873:3;2866:37;2791:118;;:::o;2915:222::-;3008:4;3046:2;3035:9;3031:18;3023:26;;3059:71;3127:1;3116:9;3112:17;3103:6;3059:71;:::i;:::-;2915:222;;;;:::o;3143:117::-;3252:1;3249;3242:12;3266:102;3307:6;3358:2;3354:7;3349:2;3342:5;3338:14;3334:28;3324:38;;3266:102;;;:::o;3374:180::-;3422:77;3419:1;3412:88;3519:4;3516:1;3509:15;3543:4;3540:1;3533:15;3560:281;3643:27;3665:4;3643:27;:::i;:::-;3635:6;3631:40;3773:6;3761:10;3758:22;3737:18;3725:10;3722:34;3719:62;3716:88;;;3784:18;;:::i;:::-;3716:88;3824:10;3820:2;3813:22;3603:238;3560:281;;:::o;3847:129::-;3881:6;3908:20;;:::i;:::-;3898:30;;3937:33;3965:4;3957:6;3937:33;:::i;:::-;3847:129;;;:::o;3982:311::-;4059:4;4149:18;4141:6;4138:30;4135:56;;;4171:18;;:::i;:::-;4135:56;4221:4;4213:6;4209:17;4201:25;;4281:4;4275;4271:15;4263:23;;3982:311;;;:::o;4299:117::-;4408:1;4405;4398:12;4439:710;4535:5;4560:81;4576:64;4633:6;4576:64;:::i;:::-;4560:81;:::i;:::-;4551:90;;4661:5;4690:6;4683:5;4676:21;4724:4;4717:5;4713:16;4706:23;;4777:4;4769:6;4765:17;4757:6;4753:30;4806:3;4798:6;4795:15;4792:122;;;4825:79;;:::i;:::-;4792:122;4940:6;4923:220;4957:6;4952:3;4949:15;4923:220;;;5032:3;5061:37;5094:3;5082:10;5061:37;:::i;:::-;5056:3;5049:50;5128:4;5123:3;5119:14;5112:21;;4999:144;4983:4;4978:3;4974:14;4967:21;;4923:220;;;4927:21;4541:608;;4439:710;;;;;:::o;5172:370::-;5243:5;5292:3;5285:4;5277:6;5273:17;5269:27;5259:122;;5300:79;;:::i;:::-;5259:122;5417:6;5404:20;5442:94;5532:3;5524:6;5517:4;5509:6;5505:17;5442:94;:::i;:::-;5433:103;;5249:293;5172:370;;;;:::o;5548:311::-;5625:4;5715:18;5707:6;5704:30;5701:56;;;5737:18;;:::i;:::-;5701:56;5787:4;5779:6;5775:17;5767:25;;5847:4;5841;5837:15;5829:23;;5548:311;;;:::o;5882:710::-;5978:5;6003:81;6019:64;6076:6;6019:64;:::i;:::-;6003:81;:::i;:::-;5994:90;;6104:5;6133:6;6126:5;6119:21;6167:4;6160:5;6156:16;6149:23;;6220:4;6212:6;6208:17;6200:6;6196:30;6249:3;6241:6;6238:15;6235:122;;;6268:79;;:::i;:::-;6235:122;6383:6;6366:220;6400:6;6395:3;6392:15;6366:220;;;6475:3;6504:37;6537:3;6525:10;6504:37;:::i;:::-;6499:3;6492:50;6571:4;6566:3;6562:14;6555:21;;6442:144;6426:4;6421:3;6417:14;6410:21;;6366:220;;;6370:21;5984:608;;5882:710;;;;;:::o;6615:370::-;6686:5;6735:3;6728:4;6720:6;6716:17;6712:27;6702:122;;6743:79;;:::i;:::-;6702:122;6860:6;6847:20;6885:94;6975:3;6967:6;6960:4;6952:6;6948:17;6885:94;:::i;:::-;6876:103;;6692:293;6615:370;;;;:::o;6991:894::-;7109:6;7117;7166:2;7154:9;7145:7;7141:23;7137:32;7134:119;;;7172:79;;:::i;:::-;7134:119;7320:1;7309:9;7305:17;7292:31;7350:18;7342:6;7339:30;7336:117;;;7372:79;;:::i;:::-;7336:117;7477:78;7547:7;7538:6;7527:9;7523:22;7477:78;:::i;:::-;7467:88;;7263:302;7632:2;7621:9;7617:18;7604:32;7663:18;7655:6;7652:30;7649:117;;;7685:79;;:::i;:::-;7649:117;7790:78;7860:7;7851:6;7840:9;7836:22;7790:78;:::i;:::-;7780:88;;7575:303;6991:894;;;;;:::o;7891:430::-;8034:4;8072:2;8061:9;8057:18;8049:26;;8085:71;8153:1;8142:9;8138:17;8129:6;8085:71;:::i;:::-;8166:66;8228:2;8217:9;8213:18;8204:6;8166:66;:::i;:::-;8242:72;8310:2;8299:9;8295:18;8286:6;8242:72;:::i;:::-;7891:430;;;;;;:::o;8327:169::-;8411:11;8445:6;8440:3;8433:19;8485:4;8480:3;8476:14;8461:29;;8327:169;;;;:::o;8502:230::-;8642:34;8638:1;8630:6;8626:14;8619:58;8711:13;8706:2;8698:6;8694:15;8687:38;8502:230;:::o;8738:366::-;8880:3;8901:67;8965:2;8960:3;8901:67;:::i;:::-;8894:74;;8977:93;9066:3;8977:93;:::i;:::-;9095:2;9090:3;9086:12;9079:19;;8738:366;;;:::o;9110:419::-;9276:4;9314:2;9303:9;9299:18;9291:26;;9363:9;9357:4;9353:20;9349:1;9338:9;9334:17;9327:47;9391:131;9517:4;9391:131;:::i;:::-;9383:139;;9110:419;;;:::o;9535:175::-;9675:27;9671:1;9663:6;9659:14;9652:51;9535:175;:::o;9716:366::-;9858:3;9879:67;9943:2;9938:3;9879:67;:::i;:::-;9872:74;;9955:93;10044:3;9955:93;:::i;:::-;10073:2;10068:3;10064:12;10057:19;;9716:366;;;:::o;10088:419::-;10254:4;10292:2;10281:9;10277:18;10269:26;;10341:9;10335:4;10331:20;10327:1;10316:9;10312:17;10305:47;10369:131;10495:4;10369:131;:::i;:::-;10361:139;;10088:419;;;:::o;10513:143::-;10570:5;10601:6;10595:13;10586:22;;10617:33;10644:5;10617:33;:::i;:::-;10513:143;;;;:::o;10662:351::-;10732:6;10781:2;10769:9;10760:7;10756:23;10752:32;10749:119;;;10787:79;;:::i;:::-;10749:119;10907:1;10932:64;10988:7;10979:6;10968:9;10964:22;10932:64;:::i;:::-;10922:74;;10878:128;10662:351;;;;:::o;11019:226::-;11159:34;11155:1;11147:6;11143:14;11136:58;11228:9;11223:2;11215:6;11211:15;11204:34;11019:226;:::o;11251:366::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11251:366;;;:::o;11623:419::-;11789:4;11827:2;11816:9;11812:18;11804:26;;11876:9;11870:4;11866:20;11862:1;11851:9;11847:17;11840:47;11904:131;12030:4;11904:131;:::i;:::-;11896:139;;11623:419;;;:::o;12048:231::-;12188:34;12184:1;12176:6;12172:14;12165:58;12257:14;12252:2;12244:6;12240:15;12233:39;12048:231;:::o;12285:366::-;12427:3;12448:67;12512:2;12507:3;12448:67;:::i;:::-;12441:74;;12524:93;12613:3;12524:93;:::i;:::-;12642:2;12637:3;12633:12;12626:19;;12285:366;;;:::o;12657:419::-;12823:4;12861:2;12850:9;12846:18;12838:26;;12910:9;12904:4;12900:20;12896:1;12885:9;12881:17;12874:47;12938:131;13064:4;12938:131;:::i;:::-;12930:139;;12657:419;;;:::o;13082:291::-;13222:34;13218:1;13210:6;13206:14;13199:58;13291:34;13286:2;13278:6;13274:15;13267:59;13360:5;13355:2;13347:6;13343:15;13336:30;13082:291;:::o;13379:366::-;13521:3;13542:67;13606:2;13601:3;13542:67;:::i;:::-;13535:74;;13618:93;13707:3;13618:93;:::i;:::-;13736:2;13731:3;13727:12;13720:19;;13379:366;;;:::o;13751:419::-;13917:4;13955:2;13944:9;13940:18;13932:26;;14004:9;13998:4;13994:20;13990:1;13979:9;13975:17;13968:47;14032:131;14158:4;14032:131;:::i;:::-;14024:139;;13751:419;;;:::o;14176:226::-;14316:34;14312:1;14304:6;14300:14;14293:58;14385:9;14380:2;14372:6;14368:15;14361:34;14176:226;:::o;14408:366::-;14550:3;14571:67;14635:2;14630:3;14571:67;:::i;:::-;14564:74;;14647:93;14736:3;14647:93;:::i;:::-;14765:2;14760:3;14756:12;14749:19;;14408:366;;;:::o;14780:419::-;14946:4;14984:2;14973:9;14969:18;14961:26;;15033:9;15027:4;15023:20;15019:1;15008:9;15004:17;14997:47;15061:131;15187:4;15061:131;:::i;:::-;15053:139;;14780:419;;;:::o;15205:239::-;15345:34;15341:1;15333:6;15329:14;15322:58;15414:22;15409:2;15401:6;15397:15;15390:47;15205:239;:::o;15450:366::-;15592:3;15613:67;15677:2;15672:3;15613:67;:::i;:::-;15606:74;;15689:93;15778:3;15689:93;:::i;:::-;15807:2;15802:3;15798:12;15791:19;;15450:366;;;:::o;15822:419::-;15988:4;16026:2;16015:9;16011:18;16003:26;;16075:9;16069:4;16065:20;16061:1;16050:9;16046:17;16039:47;16103:131;16229:4;16103:131;:::i;:::-;16095:139;;15822:419;;;:::o;16247:248::-;16387:34;16383:1;16375:6;16371:14;16364:58;16456:31;16451:2;16443:6;16439:15;16432:56;16247:248;:::o;16501:366::-;16643:3;16664:67;16728:2;16723:3;16664:67;:::i;:::-;16657:74;;16740:93;16829:3;16740:93;:::i;:::-;16858:2;16853:3;16849:12;16842:19;;16501:366;;;:::o;16873:419::-;17039:4;17077:2;17066:9;17062:18;17054:26;;17126:9;17120:4;17116:20;17112:1;17101:9;17097:17;17090:47;17154:131;17280:4;17154:131;:::i;:::-;17146:139;;16873:419;;;:::o;17298:180::-;17346:77;17343:1;17336:88;17443:4;17440:1;17433:15;17467:4;17464:1;17457:15;17484:194;17524:4;17544:20;17562:1;17544:20;:::i;:::-;17539:25;;17578:20;17596:1;17578:20;:::i;:::-;17573:25;;17622:1;17619;17615:9;17607:17;;17646:1;17640:4;17637:11;17634:37;;;17651:18;;:::i;:::-;17634:37;17484:194;;;;:::o;17684:181::-;17824:33;17820:1;17812:6;17808:14;17801:57;17684:181;:::o;17871:366::-;18013:3;18034:67;18098:2;18093:3;18034:67;:::i;:::-;18027:74;;18110:93;18199:3;18110:93;:::i;:::-;18228:2;18223:3;18219:12;18212:19;;17871:366;;;:::o;18243:419::-;18409:4;18447:2;18436:9;18432:18;18424:26;;18496:9;18490:4;18486:20;18482:1;18471:9;18467:17;18460:47;18524:131;18650:4;18524:131;:::i;:::-;18516:139;;18243:419;;;:::o;18668:410::-;18708:7;18731:20;18749:1;18731:20;:::i;:::-;18726:25;;18765:20;18783:1;18765:20;:::i;:::-;18760:25;;18820:1;18817;18813:9;18842:30;18860:11;18842:30;:::i;:::-;18831:41;;19021:1;19012:7;19008:15;19005:1;19002:22;18982:1;18975:9;18955:83;18932:139;;19051:18;;:::i;:::-;18932:139;18716:362;18668:410;;;;:::o;19084:180::-;19132:77;19129:1;19122:88;19229:4;19226:1;19219:15;19253:4;19250:1;19243:15;19270:185;19310:1;19327:20;19345:1;19327:20;:::i;:::-;19322:25;;19361:20;19379:1;19361:20;:::i;:::-;19356:25;;19400:1;19390:35;;19405:18;;:::i;:::-;19390:35;19447:1;19444;19440:9;19435:14;;19270:185;;;;:::o;19461:231::-;19601:34;19597:1;19589:6;19585:14;19578:58;19670:14;19665:2;19657:6;19653:15;19646:39;19461:231;:::o;19698:366::-;19840:3;19861:67;19925:2;19920:3;19861:67;:::i;:::-;19854:74;;19937:93;20026:3;19937:93;:::i;:::-;20055:2;20050:3;20046:12;20039:19;;19698:366;;;:::o;20070:419::-;20236:4;20274:2;20263:9;20259:18;20251:26;;20323:9;20317:4;20313:20;20309:1;20298:9;20294:17;20287:47;20351:131;20477:4;20351:131;:::i;:::-;20343:139;;20070:419;;;:::o;20495:191::-;20535:3;20554:20;20572:1;20554:20;:::i;:::-;20549:25;;20588:20;20606:1;20588:20;:::i;:::-;20583:25;;20631:1;20628;20624:9;20617:16;;20652:3;20649:1;20646:10;20643:36;;;20659:18;;:::i;:::-;20643:36;20495:191;;;;:::o;20692:332::-;20813:4;20851:2;20840:9;20836:18;20828:26;;20864:71;20932:1;20921:9;20917:17;20908:6;20864:71;:::i;:::-;20945:72;21013:2;21002:9;20998:18;20989:6;20945:72;:::i;:::-;20692:332;;;;;:::o;21030:251::-;21170:34;21166:1;21158:6;21154:14;21147:58;21239:34;21234:2;21226:6;21222:15;21215:59;21030:251;:::o;21287:366::-;21429:3;21450:67;21514:2;21509:3;21450:67;:::i;:::-;21443:74;;21526:93;21615:3;21526:93;:::i;:::-;21644:2;21639:3;21635:12;21628:19;;21287:366;;;:::o;21659:419::-;21825:4;21863:2;21852:9;21848:18;21840:26;;21912:9;21906:4;21902:20;21898:1;21887:9;21883:17;21876:47;21940:131;22066:4;21940:131;:::i;:::-;21932:139;;21659:419;;;:::o;22084:180::-;22132:77;22129:1;22122:88;22229:4;22226:1;22219:15;22253:4;22250:1;22243:15;22270:233;22309:3;22332:24;22350:5;22332:24;:::i;:::-;22323:33;;22378:66;22371:5;22368:77;22365:103;;22448:18;;:::i;:::-;22365:103;22495:1;22488:5;22484:13;22477:20;;22270:233;;;:::o;22509:225::-;22649:34;22645:1;22637:6;22633:14;22626:58;22718:8;22713:2;22705:6;22701:15;22694:33;22509:225;:::o;22740:366::-;22882:3;22903:67;22967:2;22962:3;22903:67;:::i;:::-;22896:74;;22979:93;23068:3;22979:93;:::i;:::-;23097:2;23092:3;23088:12;23081:19;;22740:366;;;:::o;23112:419::-;23278:4;23316:2;23305:9;23301:18;23293:26;;23365:9;23359:4;23355:20;23351:1;23340:9;23336:17;23329:47;23393:131;23519:4;23393:131;:::i;:::-;23385:139;;23112:419;;;:::o;23537:182::-;23677:34;23673:1;23665:6;23661:14;23654:58;23537:182;:::o;23725:366::-;23867:3;23888:67;23952:2;23947:3;23888:67;:::i;:::-;23881:74;;23964:93;24053:3;23964:93;:::i;:::-;24082:2;24077:3;24073:12;24066:19;;23725:366;;;:::o;24097:419::-;24263:4;24301:2;24290:9;24286:18;24278:26;;24350:9;24344:4;24340:20;24336:1;24325:9;24321:17;24314:47;24378:131;24504:4;24378:131;:::i;:::-;24370:139;;24097:419;;;:::o;24522:332::-;24643:4;24681:2;24670:9;24666:18;24658:26;;24694:71;24762:1;24751:9;24747:17;24738:6;24694:71;:::i;:::-;24775:72;24843:2;24832:9;24828:18;24819:6;24775:72;:::i;:::-;24522:332;;;;;:::o;24860:166::-;25000:18;24996:1;24988:6;24984:14;24977:42;24860:166;:::o;25032:366::-;25174:3;25195:67;25259:2;25254:3;25195:67;:::i;:::-;25188:74;;25271:93;25360:3;25271:93;:::i;:::-;25389:2;25384:3;25380:12;25373:19;;25032:366;;;:::o;25404:419::-;25570:4;25608:2;25597:9;25593:18;25585:26;;25657:9;25651:4;25647:20;25643:1;25632:9;25628:17;25621:47;25685:131;25811:4;25685:131;:::i;:::-;25677:139;;25404:419;;;:::o;25829:181::-;25969:33;25965:1;25957:6;25953:14;25946:57;25829:181;:::o;26016:366::-;26158:3;26179:67;26243:2;26238:3;26179:67;:::i;:::-;26172:74;;26255:93;26344:3;26255:93;:::i;:::-;26373:2;26368:3;26364:12;26357:19;;26016:366;;;:::o;26388:419::-;26554:4;26592:2;26581:9;26577:18;26569:26;;26641:9;26635:4;26631:20;26627:1;26616:9;26612:17;26605:47;26669:131;26795:4;26669:131;:::i;:::-;26661:139;;26388:419;;;:::o;26813:238::-;26953:34;26949:1;26941:6;26937:14;26930:58;27022:21;27017:2;27009:6;27005:15;26998:46;26813:238;:::o;27057:366::-;27199:3;27220:67;27284:2;27279:3;27220:67;:::i;:::-;27213:74;;27296:93;27385:3;27296:93;:::i;:::-;27414:2;27409:3;27405:12;27398:19;;27057:366;;;:::o;27429:419::-;27595:4;27633:2;27622:9;27618:18;27610:26;;27682:9;27676:4;27672:20;27668:1;27657:9;27653:17;27646:47;27710:131;27836:4;27710:131;:::i;:::-;27702:139;;27429:419;;;:::o;27854:240::-;27994:34;27990:1;27982:6;27978:14;27971:58;28063:23;28058:2;28050:6;28046:15;28039:48;27854:240;:::o;28100:366::-;28242:3;28263:67;28327:2;28322:3;28263:67;:::i;:::-;28256:74;;28339:93;28428:3;28339:93;:::i;:::-;28457:2;28452:3;28448:12;28441:19;;28100:366;;;:::o;28472:419::-;28638:4;28676:2;28665:9;28661:18;28653:26;;28725:9;28719:4;28715:20;28711:1;28700:9;28696:17;28689:47;28753:131;28879:4;28753:131;:::i;:::-;28745:139;;28472:419;;;:::o;28897:232::-;29037:34;29033:1;29025:6;29021:14;29014:58;29106:15;29101:2;29093:6;29089:15;29082:40;28897:232;:::o;29135:366::-;29277:3;29298:67;29362:2;29357:3;29298:67;:::i;:::-;29291:74;;29374:93;29463:3;29374:93;:::i;:::-;29492:2;29487:3;29483:12;29476:19;;29135:366;;;:::o;29507:419::-;29673:4;29711:2;29700:9;29696:18;29688:26;;29760:9;29754:4;29750:20;29746:1;29735:9;29731:17;29724:47;29788:131;29914:4;29788:131;:::i;:::-;29780:139;;29507:419;;;:::o;29932:116::-;30002:21;30017:5;30002:21;:::i;:::-;29995:5;29992:32;29982:60;;30038:1;30035;30028:12;29982:60;29932:116;:::o;30054:137::-;30108:5;30139:6;30133:13;30124:22;;30155:30;30179:5;30155:30;:::i;:::-;30054:137;;;;:::o;30197:345::-;30264:6;30313:2;30301:9;30292:7;30288:23;30284:32;30281:119;;;30319:79;;:::i;:::-;30281:119;30439:1;30464:61;30517:7;30508:6;30497:9;30493:22;30464:61;:::i;:::-;30454:71;;30410:125;30197:345;;;;:::o;30548:229::-;30688:34;30684:1;30676:6;30672:14;30665:58;30757:12;30752:2;30744:6;30740:15;30733:37;30548:229;:::o;30783:366::-;30925:3;30946:67;31010:2;31005:3;30946:67;:::i;:::-;30939:74;;31022:93;31111:3;31022:93;:::i;:::-;31140:2;31135:3;31131:12;31124:19;;30783:366;;;:::o;31155:419::-;31321:4;31359:2;31348:9;31344:18;31336:26;;31408:9;31402:4;31398:20;31394:1;31383:9;31379:17;31372:47;31436:131;31562:4;31436:131;:::i;:::-;31428:139;;31155:419;;;:::o;31580:170::-;31720:22;31716:1;31708:6;31704:14;31697:46;31580:170;:::o;31756:366::-;31898:3;31919:67;31983:2;31978:3;31919:67;:::i;:::-;31912:74;;31995:93;32084:3;31995:93;:::i;:::-;32113:2;32108:3;32104:12;32097:19;;31756:366;;;:::o;32128:419::-;32294:4;32332:2;32321:9;32317:18;32309:26;;32381:9;32375:4;32371:20;32367:1;32356:9;32352:17;32345:47;32409:131;32535:4;32409:131;:::i;:::-;32401:139;;32128:419;;;:::o;32553:225::-;32693:34;32689:1;32681:6;32677:14;32670:58;32762:8;32757:2;32749:6;32745:15;32738:33;32553:225;:::o;32784:366::-;32926:3;32947:67;33011:2;33006:3;32947:67;:::i;:::-;32940:74;;33023:93;33112:3;33023:93;:::i;:::-;33141:2;33136:3;33132:12;33125:19;;32784:366;;;:::o;33156:419::-;33322:4;33360:2;33349:9;33345:18;33337:26;;33409:9;33403:4;33399:20;33395:1;33384:9;33380:17;33373:47;33437:131;33563:4;33437:131;:::i;:::-;33429:139;;33156:419;;;:::o;33581:98::-;33632:6;33666:5;33660:12;33650:22;;33581:98;;;:::o;33685:147::-;33786:11;33823:3;33808:18;;33685:147;;;;:::o;33838:246::-;33919:1;33929:113;33943:6;33940:1;33937:13;33929:113;;;34028:1;34023:3;34019:11;34013:18;34009:1;34004:3;34000:11;33993:39;33965:2;33962:1;33958:10;33953:15;;33929:113;;;34076:1;34067:6;34062:3;34058:16;34051:27;33900:184;33838:246;;;:::o;34090:386::-;34194:3;34222:38;34254:5;34222:38;:::i;:::-;34276:88;34357:6;34352:3;34276:88;:::i;:::-;34269:95;;34373:65;34431:6;34426:3;34419:4;34412:5;34408:16;34373:65;:::i;:::-;34463:6;34458:3;34454:16;34447:23;;34198:278;34090:386;;;;:::o;34482:271::-;34612:3;34634:93;34723:3;34714:6;34634:93;:::i;:::-;34627:100;;34744:3;34737:10;;34482:271;;;;:::o;34759:179::-;34899:31;34895:1;34887:6;34883:14;34876:55;34759:179;:::o;34944:366::-;35086:3;35107:67;35171:2;35166:3;35107:67;:::i;:::-;35100:74;;35183:93;35272:3;35183:93;:::i;:::-;35301:2;35296:3;35292:12;35285:19;;34944:366;;;:::o;35316:419::-;35482:4;35520:2;35509:9;35505:18;35497:26;;35569:9;35563:4;35559:20;35555:1;35544:9;35540:17;35533:47;35597:131;35723:4;35597:131;:::i;:::-;35589:139;;35316:419;;;:::o;35741:99::-;35793:6;35827:5;35821:12;35811:22;;35741:99;;;:::o;35846:377::-;35934:3;35962:39;35995:5;35962:39;:::i;:::-;36017:71;36081:6;36076:3;36017:71;:::i;:::-;36010:78;;36097:65;36155:6;36150:3;36143:4;36136:5;36132:16;36097:65;:::i;:::-;36187:29;36209:6;36187:29;:::i;:::-;36182:3;36178:39;36171:46;;35938:285;35846:377;;;;:::o;36229:313::-;36342:4;36380:2;36369:9;36365:18;36357:26;;36429:9;36423:4;36419:20;36415:1;36404:9;36400:17;36393:47;36457:78;36530:4;36521:6;36457:78;:::i;:::-;36449:86;;36229:313;;;;:::o
Swarm Source
ipfs://1388e3af230906f69c3c29aaa77407c381697985acbc5498aa2d5e971b3882ea
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.