Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 24 from a total of 24 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Sale Status | 19436281 | 298 days ago | IN | 0 ETH | 0.00120089 | ||||
Buy VTRU Via OTC | 19409480 | 302 days ago | IN | 0 ETH | 0.01316427 | ||||
Buy VTRU Via OTC | 19396014 | 304 days ago | IN | 0 ETH | 0.01576985 | ||||
Buy VTRU Via OTC | 19347039 | 311 days ago | IN | 0 ETH | 0.0138191 | ||||
Buy VTRU Via OTC | 19346577 | 311 days ago | IN | 0 ETH | 0.0126489 | ||||
Buy VTRU Via OTC | 19340671 | 312 days ago | IN | 0 ETH | 0.01861513 | ||||
Buy VTRU Via OTC | 19333614 | 313 days ago | IN | 0 ETH | 0.02951451 | ||||
Buy VTRU Via OTC | 19222572 | 328 days ago | IN | 0 ETH | 0.00706528 | ||||
Buy VTRU Via OTC | 19181678 | 334 days ago | IN | 0 ETH | 0.01507398 | ||||
Buy VTRU Via OTC | 19177953 | 334 days ago | IN | 0 ETH | 0.01938882 | ||||
Buy VTRU Via OTC | 19171194 | 335 days ago | IN | 0 ETH | 0.00896135 | ||||
Buy VTRU Via OTC | 19151968 | 338 days ago | IN | 0 ETH | 0.00383695 | ||||
Buy VTRU Via OTC | 19150021 | 338 days ago | IN | 0 ETH | 0.00452742 | ||||
Buy VTRU Via OTC | 19149388 | 338 days ago | IN | 0 ETH | 0.00679778 | ||||
Buy VTRU Via OTC | 19146716 | 339 days ago | IN | 0 ETH | 0.00474674 | ||||
Buy VTRU Via OTC | 19144719 | 339 days ago | IN | 0 ETH | 0.0102226 | ||||
Buy VTRU Via OTC | 19144008 | 339 days ago | IN | 0 ETH | 0.00637686 | ||||
Buy VTRU Via OTC | 19139311 | 340 days ago | IN | 0 ETH | 0.00680865 | ||||
Buy VTRU Via OTC | 19134358 | 341 days ago | IN | 0 ETH | 0.01093563 | ||||
Buy VTRU Via OTC | 19134351 | 341 days ago | IN | 0 ETH | 0.00897087 | ||||
Buy VTRU Via OTC | 19134210 | 341 days ago | IN | 0 ETH | 0.00791356 | ||||
Set Min Per Tx | 19134193 | 341 days ago | IN | 0 ETH | 0.00078832 | ||||
Buy VTRU Via OTC | 19134077 | 341 days ago | IN | 0 ETH | 0.00994801 | ||||
Buy VTRU Via OTC | 19134052 | 341 days ago | IN | 0 ETH | 0.01174769 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
VitruveoOTCSale
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-02-01 */ // File: @openzeppelin/contracts/utils/ReentrancyGuard.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/ReentrancyGuard.sol) pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol) pragma solidity ^0.8.20; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol) pragma solidity ^0.8.20; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev The `account` is missing a role. */ error AccessControlUnauthorizedAccount(address account, bytes32 neededRole); /** * @dev The caller of a function is not the expected one. * * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}. */ error AccessControlBadConfirmation(); /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. */ function renounceRole(bytes32 role, address callerConfirmation) external; } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol) pragma solidity ^0.8.20; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ```solidity * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address account => bool) hasRole; bytes32 adminRole; } mapping(bytes32 role => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with an {AccessControlUnauthorizedAccount} error including the required role. */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual returns (bool) { return _roles[role].hasRole[account]; } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()` * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier. */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account` * is missing `role`. */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert AccessControlUnauthorizedAccount(account, role); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `callerConfirmation`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address callerConfirmation) public virtual { if (callerConfirmation != _msgSender()) { revert AccessControlBadConfirmation(); } _revokeRole(role, callerConfirmation); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual returns (bool) { if (!hasRole(role, account)) { _roles[role].hasRole[account] = true; emit RoleGranted(role, account, _msgSender()); return true; } else { return false; } } /** * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual returns (bool) { if (hasRole(role, account)) { _roles[role].hasRole[account] = false; emit RoleRevoked(role, account, _msgSender()); return true; } else { return false; } } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) 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 FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @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 v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @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 An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev 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); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev 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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that 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(token).code.length > 0; } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: vtru-otc/VitruveoOTCETH.sol pragma solidity 0.8.20; /* * @author 0xtp * @title Vitruveo OTC Sale * * ██╗ ██╗ ██╗ ████████╗ ██████╗ ██╗ ██╗ ██╗ ██╗ ███████╗ ██████╗ * ██║ ██║ ██║ ╚══██╔══╝ ██╔══██╗ ██║ ██║ ██║ ██║ ██╔════╝ ██╔═══██╗ * ██║ ██║ ██║ ██║ ██████╔╝ ██║ ██║ ██║ ██║ █████╗ ██║ ██║ * ╚██╗ ██╔╝ ██║ ██║ ██╔══██╗ ██║ ██║ ╚██╗ ██╔╝ ██╔══╝ ██║ ██║ * ╚████╔╝ ██║ ██║ ██║ ██║ ╚██████╔╝ ╚████╔╝ ███████╗ ╚██████╔╝ * ╚═══╝ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═══╝ ╚══════╝ ╚═════╝ * */ contract VitruveoOTCSale is AccessControl, ReentrancyGuard { using SafeERC20 for IERC20; using Counters for Counters.Counter; Counters.Counter public nextSaleId; /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ S T A T E @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ bool public isSaleActive; uint256 public vtruOTCPrice; address public vtruWallet; uint256 public totalSaleCounter; uint256 public minPerTx; uint256 public maxPerTx; struct otcDetails { uint256 id; string tokenSymbol; uint256 qty; uint256 tokenAmount; address accountAddress; uint256 timestamp; string status; } mapping(uint256 => string) public OTCStatus; mapping(uint256 => otcDetails)public OTCDetails; mapping(string => address) public AllowedTokens; mapping(string => uint256) public TokenDecimals; mapping(string => uint256) public TotalTokenSaleCounter; mapping(address => mapping(address => uint256)) public ERC20Deposit; mapping(address => mapping(string => uint256[])) private AccountDeposits; bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE"); /*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ E V E N T S @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/ event ERC20Deposited( uint256 indexed otcDetailsId, string indexed tokenSymbol, address indexed accountAddress, uint256 qty, uint256 tokenAmount ); constructor() { _init(); } function _init() internal { isSaleActive = true; minPerTx = 11; // 10 maxPerTx = 250001; // 250,000 vtruOTCPrice = 150; TokenDecimals["USDT"] = 6; TokenDecimals["USDC"] = 6; OTCStatus[1] = "pending"; OTCStatus[2] = "completed"; OTCStatus[3] = "cancelled"; _grantRole(ADMIN_ROLE, msg.sender); _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); //Vitruveo Multisig - Ethereum vtruWallet = 0x7EBA3E4617521B5c2a892eA526bc108a3B9E828c; setAllowedTokens("USDC", 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); setAllowedTokens("USDT", 0xdAC17F958D2ee523a2206206994597C13D831ec7); } function buyVTRUViaOTC(string memory symbol, uint256 qty, uint256 amount) external nonReentrant returns (otcDetails memory) { uint256 tokenDecimals = 10 ** TokenDecimals[symbol]; uint256 qtyTar = qty * 100; uint256 amountForWei = (qtyTar * vtruOTCPrice); uint256 amountToWei = amountForWei * tokenDecimals; uint256 amountToCheck = amountToWei / 10000; require(isSaleActive == true, "Sale not active"); require(qty > minPerTx && qty < maxPerTx, "Qty must be greater than minPerTx & less than maxPerTx"); require(amount == amountToCheck, "Amount should match price * qty"); require(AllowedTokens[symbol] != address(0), "Address not part of allowed token list" ); nextSaleId.increment(); address tokenAddress = AllowedTokens[symbol]; ERC20Deposit[msg.sender][tokenAddress] += amount; AccountDeposits[msg.sender][symbol].push(nextSaleId.current()); totalSaleCounter = totalSaleCounter + amount; TotalTokenSaleCounter[symbol] = TotalTokenSaleCounter[symbol] + amount; otcDetails memory newOTCSale = _createNewOTCSale( symbol, qty, amount, msg.sender, block.timestamp, OTCStatus[2] ); IERC20(tokenAddress).safeTransferFrom(msg.sender, vtruWallet, amount); emit ERC20Deposited(newOTCSale.id, symbol, msg.sender, qty, amount); return newOTCSale; } function _createNewOTCSale( string memory _symbol, uint256 _qty, uint256 _amount, address _account, uint256 _timestamp, string memory _status ) internal returns (otcDetails memory) { otcDetails storage newOTCSale = OTCDetails[nextSaleId.current()]; newOTCSale.id = nextSaleId.current(); newOTCSale.tokenSymbol = _symbol; newOTCSale.qty = _qty; newOTCSale.tokenAmount = _amount; newOTCSale.accountAddress = _account; newOTCSale.timestamp = _timestamp; newOTCSale.status = _status; return newOTCSale; } function setAllowedTokens(string memory _symbol, address _tokenAddress) public onlyRole(ADMIN_ROLE) { AllowedTokens[_symbol] = _tokenAddress; } function setTokenDecimals(string memory _symbol, uint256 _decimals) public onlyRole(ADMIN_ROLE) { TokenDecimals[_symbol] = _decimals; } function setSaleStatus(bool _isActive) external onlyRole(ADMIN_ROLE) { isSaleActive = _isActive; } function setVTRUWallet(address _vtruWallet) external onlyRole(ADMIN_ROLE) { vtruWallet = _vtruWallet; } function setMinPerTx(uint256 _minPerTx) external onlyRole(ADMIN_ROLE) { minPerTx = _minPerTx; } function setMaxPerTx(uint256 _maxPerTx) external onlyRole(ADMIN_ROLE) { maxPerTx = _maxPerTx; } function withdraw() external onlyRole(ADMIN_ROLE) { require(payable(msg.sender).send(address(this).balance)); } function recoverERC20(IERC20 tokenContract, address to) external onlyRole(ADMIN_ROLE) { tokenContract.transfer(to, tokenContract.balanceOf(address(this))); } function getCurrentOTCId() external view returns (uint256) { return nextSaleId.current(); } function getAccountDeposits(address _account, string memory _symbol) public view returns (uint256[] memory) { return AccountDeposits[_account][_symbol]; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"otcDetailsId","type":"uint256"},{"indexed":true,"internalType":"string","name":"tokenSymbol","type":"string"},{"indexed":true,"internalType":"address","name":"accountAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"qty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"ERC20Deposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"AllowedTokens","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"ERC20Deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"OTCDetails","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"address","name":"accountAddress","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"string","name":"status","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"OTCStatus","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"TokenDecimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"TotalTokenSaleCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"buyVTRUViaOTC","outputs":[{"components":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"tokenSymbol","type":"string"},{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"address","name":"accountAddress","type":"address"},{"internalType":"uint256","name":"timestamp","type":"uint256"},{"internalType":"string","name":"status","type":"string"}],"internalType":"struct VitruveoOTCSale.otcDetails","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"string","name":"_symbol","type":"string"}],"name":"getAccountDeposits","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentOTCId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextSaleId","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenContract","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setAllowedTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPerTx","type":"uint256"}],"name":"setMinPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"_decimals","type":"uint256"}],"name":"setTokenDecimals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vtruWallet","type":"address"}],"name":"setVTRUWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSaleCounter","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vtruOTCPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vtruWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801562000010575f80fd5b5060018081905550620000286200002e60201b60201c565b62000a97565b600160035f6101000a81548160ff021916908315150217905550600b6007819055506203d09160088190555060966004819055506006600c6040516200007490620005d5565b9081526020016040518091039020819055506006600c604051620000989062000639565b9081526020016040518091039020819055506040518060400160405280600781526020017f70656e64696e670000000000000000000000000000000000000000000000000081525060095f600181526020019081526020015f209081620001009190620008b3565b506040518060400160405280600981526020017f636f6d706c65746564000000000000000000000000000000000000000000000081525060095f600281526020019081526020015f209081620001579190620008b3565b506040518060400160405280600981526020017f63616e63656c6c6564000000000000000000000000000000000000000000000081525060095f600381526020019081526020015f209081620001ae9190620008b3565b50620001e17fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336200030360201b60201c565b50620001f65f801b336200030360201b60201c565b50737eba3e4617521b5c2a892ea526bc108a3b9e828c60055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620002a66040518060400160405280600481526020017f555344430000000000000000000000000000000000000000000000000000000081525073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48620003fe60201b60201c565b620003016040518060400160405280600481526020017f555344540000000000000000000000000000000000000000000000000000000081525073dac17f958d2ee523a2206206994597c13d831ec7620003fe60201b60201c565b565b5f6200031683836200049360201b60201c565b620003f45760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555062000390620004f660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050620003f8565b5f90505b92915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756200043081620004fd60201b60201c565b81600b84604051620004439190620009f7565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f33905090565b6200051e8162000512620004f660201b60201c565b6200052160201b60201c565b50565b6200053382826200049360201b60201c565b620005795780826040517fe2517d3f0000000000000000000000000000000000000000000000000000000081526004016200057092919062000a6c565b60405180910390fd5b5050565b5f81905092915050565b7f55534454000000000000000000000000000000000000000000000000000000005f82015250565b5f620005bd6004836200057d565b9150620005ca8262000587565b600482019050919050565b5f620005e182620005af565b9150819050919050565b7f55534443000000000000000000000000000000000000000000000000000000005f82015250565b5f620006216004836200057d565b91506200062e82620005eb565b600482019050919050565b5f620006458262000613565b9150819050919050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f6002820490506001821680620006cb57607f821691505b602082108103620006e157620006e062000686565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620007457fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000708565b62000751868362000708565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f6200079b620007956200078f8462000769565b62000772565b62000769565b9050919050565b5f819050919050565b620007b6836200077b565b620007ce620007c582620007a2565b84845462000714565b825550505050565b5f90565b620007e4620007d6565b620007f1818484620007ab565b505050565b5b8181101562000818576200080c5f82620007da565b600181019050620007f7565b5050565b601f82111562000867576200083181620006e7565b6200083c84620006f9565b810160208510156200084c578190505b620008646200085b85620006f9565b830182620007f6565b50505b505050565b5f82821c905092915050565b5f620008895f19846008026200086c565b1980831691505092915050565b5f620008a3838362000878565b9150826002028217905092915050565b620008be826200064f565b67ffffffffffffffff811115620008da57620008d962000659565b5b620008e68254620006b3565b620008f38282856200081c565b5f60209050601f83116001811462000929575f841562000914578287015190505b62000920858262000896565b8655506200098f565b601f1984166200093986620006e7565b5f5b8281101562000962578489015182556001820191506020850194506020810190506200093b565b868310156200098257848901516200097e601f89168262000878565b8355505b6001600288020188555050505b505050505050565b5f5b83811015620009b657808201518184015260208101905062000999565b5f8484015250505050565b5f620009cd826200064f565b620009d981856200057d565b9350620009eb81856020860162000997565b80840191505092915050565b5f62000a048284620009c1565b915081905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000a3a8262000a0f565b9050919050565b62000a4c8162000a2e565b82525050565b5f819050919050565b62000a668162000a52565b82525050565b5f60408201905062000a815f83018562000a41565b62000a90602083018462000a5b565b9392505050565b61307a8062000aa55f395ff3fe608060405234801561000f575f80fd5b50600436106101ee575f3560e01c806378377ffe1161010d578063cb8f351e116100a0578063deb077b91161006f578063deb077b9146105cc578063df25f3f0146105ea578063e8bb2a9f14610608578063f968adbe14610638576101ee565b8063cb8f351e14610548578063d2cba7e514610578578063d547741f14610594578063d897833e146105b0576101ee565b8063a289c13b116100dc578063a289c13b146104b0578063a2a6ca27146104e0578063a5e12ad8146104fc578063c6f6f2161461052c576101ee565b806378377ffe1461042a578063886f039a1461044657806391d1485414610462578063a217fddf14610492576101ee565b8063482cdaac1161018557806369b08ff71161015457806369b08ff71461038e5780636c49bfc0146103ac57806371f8e08b146103dc57806375b238fc1461040c576101ee565b8063482cdaac146103065780634fa8de9514610336578063564566a81461035257806356a6449214610370576101ee565b806336568abe116101c157806336568abe146102a45780633ccfd60b146102c057806340b6e36f146102ca578063423f22a8146102e8576101ee565b806301ffc9a7146101f2578063248a9ca31461022257806329349c92146102525780632f2ff15d14610288575b5f80fd5b61020c60048036038101906102079190611de5565b610656565b6040516102199190611e2a565b60405180910390f35b61023c60048036038101906102379190611e76565b6106cf565b6040516102499190611eb0565b60405180910390f35b61026c60048036038101906102679190611efc565b6106eb565b60405161027f9796959493929190611fff565b60405180910390f35b6102a2600480360381019061029d91906120a4565b610854565b005b6102be60048036038101906102b991906120a4565b610876565b005b6102c86108f1565b005b6102d261095a565b6040516102df91906120e2565b60405180910390f35b6102f061096a565b6040516102fd91906120e2565b60405180910390f35b610320600480360381019061031b91906120fb565b610970565b60405161032d91906120e2565b60405180910390f35b610350600480360381019061034b9190612265565b610990565b005b61035a610a1b565b6040516103679190611e2a565b60405180910390f35b610378610a2d565b60405161038591906122bf565b60405180910390f35b610396610a52565b6040516103a391906120e2565b60405180910390f35b6103c660048036038101906103c19190611efc565b610a58565b6040516103d391906122d8565b60405180910390f35b6103f660048036038101906103f191906122f8565b610af3565b60405161040391906120e2565b60405180910390f35b610414610b20565b6040516104219190611eb0565b60405180910390f35b610444600480360381019061043f919061233f565b610b44565b005b610460600480360381019061045b91906123a5565b610bb2565b005b61047c600480360381019061047791906120a4565b610cd4565b6040516104899190611e2a565b60405180910390f35b61049a610d37565b6040516104a79190611eb0565b60405180910390f35b6104ca60048036038101906104c591906123e3565b610d3d565b6040516104d791906124f4565b60405180910390f35b6104fa60048036038101906104f59190611efc565b610ded565b005b61051660048036038101906105119190612514565b610e22565b6040516105239190612677565b60405180910390f35b61054660048036038101906105419190611efc565b61136d565b005b610562600480360381019061055d91906122f8565b6113a2565b60405161056f91906120e2565b60405180910390f35b610592600480360381019061058d9190612697565b6113cf565b005b6105ae60048036038101906105a991906120a4565b611421565b005b6105ca60048036038101906105c5919061271b565b611443565b005b6105d461148a565b6040516105e191906120e2565b60405180910390f35b6105f2611495565b6040516105ff91906120e2565b60405180910390f35b610622600480360381019061061d91906122f8565b61149b565b60405161062f91906122bf565b60405180910390f35b6106406114e3565b60405161064d91906120e2565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c857506106c7826114e9565b5b9050919050565b5f805f8381526020019081526020015f20600101549050919050565b600a602052805f5260405f205f91509050805f01549080600101805461071090612773565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90612773565b80156107875780601f1061075e57610100808354040283529160200191610787565b820191905f5260205f20905b81548152906001019060200180831161076a57829003601f168201915b505050505090806002015490806003015490806004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050154908060060180546107d390612773565b80601f01602080910402602001604051908101604052809291908181526020018280546107ff90612773565b801561084a5780601f106108215761010080835404028352916020019161084a565b820191905f5260205f20905b81548152906001019060200180831161082d57829003601f168201915b5050505050905087565b61085d826106cf565b61086681611552565b6108708383611566565b50505050565b61087e61164f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108e2576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ec8282611656565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561091b81611552565b3373ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050610957575f80fd5b50565b5f610965600261173f565b905090565b60045481565b600e602052815f5260405f20602052805f5260405f205f91509150505481565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756109ba81611552565b81600b846040516109cb91906127dd565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60035f9054906101000a900460ff1681565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b6009602052805f5260405f205f915090508054610a7490612773565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090612773565b8015610aeb5780601f10610ac257610100808354040283529160200191610aeb565b820191905f5260205f20905b815481529060010190602001808311610ace57829003601f168201915b505050505081565b600d818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610b6e81611552565b8160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610bdc81611552565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c3291906122bf565b602060405180830381865afa158015610c4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c719190612807565b6040518363ffffffff1660e01b8152600401610c8e929190612832565b6020604051808303815f875af1158015610caa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cce919061286d565b50505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b81565b6060600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082604051610d8a91906127dd565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020018280548015610de057602002820191905f5260205f20905b815481526020019060010190808311610dcc575b5050505050905092915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610e1781611552565b816007819055505050565b610e2a611d31565b610e3261174b565b5f600c85604051610e4391906127dd565b908152602001604051809103902054600a610e5e91906129f4565b90505f606485610e6e9190612a3e565b90505f60045482610e7f9190612a3e565b90505f8382610e8e9190612a3e565b90505f61271082610e9f9190612aac565b90506001151560035f9054906101000a900460ff16151514610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90612b26565b60405180910390fd5b60075488118015610f08575060085488105b610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90612bb4565b60405180910390fd5b808714610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8090612c1c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600b8a604051610fb091906127dd565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90612caa565b60405180910390fd5b61103e6002611791565b5f600b8a60405161104f91906127dd565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905087600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111069190612cc8565b92505081905550600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208a60405161115891906127dd565b9081526020016040518091039020611170600261173f565b908060018154018082558091505060019003905f5260205f20015f9091909190915055876006546111a19190612cc8565b60068190555087600d8b6040516111b891906127dd565b9081526020016040518091039020546111d19190612cc8565b600d8b6040516111e191906127dd565b9081526020016040518091039020819055505f61129a8b8b8b334260095f600281526020019081526020015f20805461121990612773565b80601f016020809104026020016040519081016040528092919081815260200182805461124590612773565b80156112905780601f1061126757610100808354040283529160200191611290565b820191905f5260205f20905b81548152906001019060200180831161127357829003601f168201915b50505050506117a5565b90506112ea3360055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b8573ffffffffffffffffffffffffffffffffffffffff16611a11909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168b60405161130f91906127dd565b6040518091039020825f01517f5050238d423bf7e97e5f4d9e6b80b228751ca66adab26e5a3ee850c3b36ead3f8d8d60405161134c929190612cfb565b60405180910390a480975050505050505050611366611a93565b9392505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561139781611552565b816008819055505050565b600c818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756113f981611552565b81600c8460405161140a91906127dd565b908152602001604051809103902081905550505050565b61142a826106cf565b61143381611552565b61143d8383611656565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561146d81611552565b8160035f6101000a81548160ff0219169083151502179055505050565b6002805f0154905081565b60075481565b600b818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6115638161155e61164f565b611a9c565b50565b5f6115718383610cd4565b6116455760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506115e261164f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611649565b5f90505b92915050565b5f33905090565b5f6116618383610cd4565b15611735575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506116d261164f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611739565b5f90505b92915050565b5f815f01549050919050565b600260015403611787576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b6001815f015f828254019250508190555050565b6117ad611d31565b5f600a5f6117bb600261173f565b81526020019081526020015f2090506117d4600261173f565b815f0181905550878160010190816117ec9190612ebf565b5086816002018190555085816003018190555084816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508381600501819055508281600601908161185b9190612ebf565b50806040518060e00160405290815f820154815260200160018201805461188190612773565b80601f01602080910402602001604051908101604052809291908181526020018280546118ad90612773565b80156118f85780601f106118cf576101008083540402835291602001916118f8565b820191905f5260205f20905b8154815290600101906020018083116118db57829003601f168201915b505050505081526020016002820154815260200160038201548152602001600482015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820154815260200160068201805461198490612773565b80601f01602080910402602001604051908101604052809291908181526020018280546119b090612773565b80156119fb5780601f106119d2576101008083540402835291602001916119fb565b820191905f5260205f20905b8154815290600101906020018083116119de57829003601f168201915b5050505050815250509150509695505050505050565b611a8d848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401611a4693929190612f8e565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611aed565b50505050565b60018081905550565b611aa68282610cd4565b611ae95780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611ae0929190612fc3565b60405180910390fd5b5050565b5f611b17828473ffffffffffffffffffffffffffffffffffffffff16611b8290919063ffffffff16565b90505f815114158015611b3b575080806020019051810190611b39919061286d565b155b15611b7d57826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611b7491906122bf565b60405180910390fd5b505050565b6060611b8f83835f611b97565b905092915050565b606081471015611bde57306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611bd591906122bf565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff168486604051611c06919061302e565b5f6040518083038185875af1925050503d805f8114611c40576040519150601f19603f3d011682016040523d82523d5f602084013e611c45565b606091505b5091509150611c55868383611c60565b925050509392505050565b606082611c7557611c7082611ced565b611ce5565b5f8251148015611c9b57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611cdd57836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611cd491906122bf565b60405180910390fd5b819050611ce6565b5b9392505050565b5f81511115611cff5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060e001604052805f8152602001606081526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611dc481611d90565b8114611dce575f80fd5b50565b5f81359050611ddf81611dbb565b92915050565b5f60208284031215611dfa57611df9611d88565b5b5f611e0784828501611dd1565b91505092915050565b5f8115159050919050565b611e2481611e10565b82525050565b5f602082019050611e3d5f830184611e1b565b92915050565b5f819050919050565b611e5581611e43565b8114611e5f575f80fd5b50565b5f81359050611e7081611e4c565b92915050565b5f60208284031215611e8b57611e8a611d88565b5b5f611e9884828501611e62565b91505092915050565b611eaa81611e43565b82525050565b5f602082019050611ec35f830184611ea1565b92915050565b5f819050919050565b611edb81611ec9565b8114611ee5575f80fd5b50565b5f81359050611ef681611ed2565b92915050565b5f60208284031215611f1157611f10611d88565b5b5f611f1e84828501611ee8565b91505092915050565b611f3081611ec9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611f6d578082015181840152602081019050611f52565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611f9282611f36565b611f9c8185611f40565b9350611fac818560208601611f50565b611fb581611f78565b840191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611fe982611fc0565b9050919050565b611ff981611fdf565b82525050565b5f60e0820190506120125f83018a611f27565b81810360208301526120248189611f88565b90506120336040830188611f27565b6120406060830187611f27565b61204d6080830186611ff0565b61205a60a0830185611f27565b81810360c083015261206c8184611f88565b905098975050505050505050565b61208381611fdf565b811461208d575f80fd5b50565b5f8135905061209e8161207a565b92915050565b5f80604083850312156120ba576120b9611d88565b5b5f6120c785828601611e62565b92505060206120d885828601612090565b9150509250929050565b5f6020820190506120f55f830184611f27565b92915050565b5f806040838503121561211157612110611d88565b5b5f61211e85828601612090565b925050602061212f85828601612090565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61217782611f78565b810181811067ffffffffffffffff8211171561219657612195612141565b5b80604052505050565b5f6121a8611d7f565b90506121b4828261216e565b919050565b5f67ffffffffffffffff8211156121d3576121d2612141565b5b6121dc82611f78565b9050602081019050919050565b828183375f83830152505050565b5f612209612204846121b9565b61219f565b9050828152602081018484840111156122255761222461213d565b5b6122308482856121e9565b509392505050565b5f82601f83011261224c5761224b612139565b5b813561225c8482602086016121f7565b91505092915050565b5f806040838503121561227b5761227a611d88565b5b5f83013567ffffffffffffffff81111561229857612297611d8c565b5b6122a485828601612238565b92505060206122b585828601612090565b9150509250929050565b5f6020820190506122d25f830184611ff0565b92915050565b5f6020820190508181035f8301526122f08184611f88565b905092915050565b5f6020828403121561230d5761230c611d88565b5b5f82013567ffffffffffffffff81111561232a57612329611d8c565b5b61233684828501612238565b91505092915050565b5f6020828403121561235457612353611d88565b5b5f61236184828501612090565b91505092915050565b5f61237482611fdf565b9050919050565b6123848161236a565b811461238e575f80fd5b50565b5f8135905061239f8161237b565b92915050565b5f80604083850312156123bb576123ba611d88565b5b5f6123c885828601612391565b92505060206123d985828601612090565b9150509250929050565b5f80604083850312156123f9576123f8611d88565b5b5f61240685828601612090565b925050602083013567ffffffffffffffff81111561242757612426611d8c565b5b61243385828601612238565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61246f81611ec9565b82525050565b5f6124808383612466565b60208301905092915050565b5f602082019050919050565b5f6124a28261243d565b6124ac8185612447565b93506124b783612457565b805f5b838110156124e75781516124ce8882612475565b97506124d98361248c565b9250506001810190506124ba565b5085935050505092915050565b5f6020820190508181035f83015261250c8184612498565b905092915050565b5f805f6060848603121561252b5761252a611d88565b5b5f84013567ffffffffffffffff81111561254857612547611d8c565b5b61255486828701612238565b935050602061256586828701611ee8565b925050604061257686828701611ee8565b9150509250925092565b5f82825260208201905092915050565b5f61259a82611f36565b6125a48185612580565b93506125b4818560208601611f50565b6125bd81611f78565b840191505092915050565b6125d181611fdf565b82525050565b5f60e083015f8301516125ec5f860182612466565b50602083015184820360208601526126048282612590565b91505060408301516126196040860182612466565b50606083015161262c6060860182612466565b50608083015161263f60808601826125c8565b5060a083015161265260a0860182612466565b5060c083015184820360c086015261266a8282612590565b9150508091505092915050565b5f6020820190508181035f83015261268f81846125d7565b905092915050565b5f80604083850312156126ad576126ac611d88565b5b5f83013567ffffffffffffffff8111156126ca576126c9611d8c565b5b6126d685828601612238565b92505060206126e785828601611ee8565b9150509250929050565b6126fa81611e10565b8114612704575f80fd5b50565b5f81359050612715816126f1565b92915050565b5f602082840312156127305761272f611d88565b5b5f61273d84828501612707565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061278a57607f821691505b60208210810361279d5761279c612746565b5b50919050565b5f81905092915050565b5f6127b782611f36565b6127c181856127a3565b93506127d1818560208601611f50565b80840191505092915050565b5f6127e882846127ad565b915081905092915050565b5f8151905061280181611ed2565b92915050565b5f6020828403121561281c5761281b611d88565b5b5f612829848285016127f3565b91505092915050565b5f6040820190506128455f830185611ff0565b6128526020830184611f27565b9392505050565b5f81519050612867816126f1565b92915050565b5f6020828403121561288257612881611d88565b5b5f61288f84828501612859565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561291a578086048111156128f6576128f5612898565b5b60018516156129055780820291505b8081029050612913856128c5565b94506128da565b94509492505050565b5f8261293257600190506129ed565b8161293f575f90506129ed565b8160018114612955576002811461295f5761298e565b60019150506129ed565b60ff84111561297157612970612898565b5b8360020a91508482111561298857612987612898565b5b506129ed565b5060208310610133831016604e8410600b84101617156129c35782820a9050838111156129be576129bd612898565b5b6129ed565b6129d084848460016128d1565b925090508184048111156129e7576129e6612898565b5b81810290505b9392505050565b5f6129fe82611ec9565b9150612a0983611ec9565b9250612a367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612923565b905092915050565b5f612a4882611ec9565b9150612a5383611ec9565b9250828202612a6181611ec9565b91508282048414831517612a7857612a77612898565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ab682611ec9565b9150612ac183611ec9565b925082612ad157612ad0612a7f565b5b828204905092915050565b7f53616c65206e6f742061637469766500000000000000000000000000000000005f82015250565b5f612b10600f83611f40565b9150612b1b82612adc565b602082019050919050565b5f6020820190508181035f830152612b3d81612b04565b9050919050565b7f517479206d7573742062652067726561746572207468616e206d696e506572545f8201527f782026206c657373207468616e206d6178506572547800000000000000000000602082015250565b5f612b9e603683611f40565b9150612ba982612b44565b604082019050919050565b5f6020820190508181035f830152612bcb81612b92565b9050919050565b7f416d6f756e742073686f756c64206d61746368207072696365202a20717479005f82015250565b5f612c06601f83611f40565b9150612c1182612bd2565b602082019050919050565b5f6020820190508181035f830152612c3381612bfa565b9050919050565b7f41646472657373206e6f742070617274206f6620616c6c6f77656420746f6b655f8201527f6e206c6973740000000000000000000000000000000000000000000000000000602082015250565b5f612c94602683611f40565b9150612c9f82612c3a565b604082019050919050565b5f6020820190508181035f830152612cc181612c88565b9050919050565b5f612cd282611ec9565b9150612cdd83611ec9565b9250828201905080821115612cf557612cf4612898565b5b92915050565b5f604082019050612d0e5f830185611f27565b612d1b6020830184611f27565b9392505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612d7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612d43565b612d888683612d43565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612dc3612dbe612db984611ec9565b612da0565b611ec9565b9050919050565b5f819050919050565b612ddc83612da9565b612df0612de882612dca565b848454612d4f565b825550505050565b5f90565b612e04612df8565b612e0f818484612dd3565b505050565b5b81811015612e3257612e275f82612dfc565b600181019050612e15565b5050565b601f821115612e7757612e4881612d22565b612e5184612d34565b81016020851015612e60578190505b612e74612e6c85612d34565b830182612e14565b50505b505050565b5f82821c905092915050565b5f612e975f1984600802612e7c565b1980831691505092915050565b5f612eaf8383612e88565b9150826002028217905092915050565b612ec882611f36565b67ffffffffffffffff811115612ee157612ee0612141565b5b612eeb8254612773565b612ef6828285612e36565b5f60209050601f831160018114612f27575f8415612f15578287015190505b612f1f8582612ea4565b865550612f86565b601f198416612f3586612d22565b5f5b82811015612f5c57848901518255600182019150602085019450602081019050612f37565b86831015612f795784890151612f75601f891682612e88565b8355505b6001600288020188555050505b505050505050565b5f606082019050612fa15f830186611ff0565b612fae6020830185611ff0565b612fbb6040830184611f27565b949350505050565b5f604082019050612fd65f830185611ff0565b612fe36020830184611ea1565b9392505050565b5f81519050919050565b5f81905092915050565b5f61300882612fea565b6130128185612ff4565b9350613022818560208601611f50565b80840191505092915050565b5f6130398284612ffe565b91508190509291505056fea2646970667358221220dbe0283ab2ed013ec062d2029ad67ebaf43202ad6c80812cd179a077592af84f64736f6c63430008140033
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101ee575f3560e01c806378377ffe1161010d578063cb8f351e116100a0578063deb077b91161006f578063deb077b9146105cc578063df25f3f0146105ea578063e8bb2a9f14610608578063f968adbe14610638576101ee565b8063cb8f351e14610548578063d2cba7e514610578578063d547741f14610594578063d897833e146105b0576101ee565b8063a289c13b116100dc578063a289c13b146104b0578063a2a6ca27146104e0578063a5e12ad8146104fc578063c6f6f2161461052c576101ee565b806378377ffe1461042a578063886f039a1461044657806391d1485414610462578063a217fddf14610492576101ee565b8063482cdaac1161018557806369b08ff71161015457806369b08ff71461038e5780636c49bfc0146103ac57806371f8e08b146103dc57806375b238fc1461040c576101ee565b8063482cdaac146103065780634fa8de9514610336578063564566a81461035257806356a6449214610370576101ee565b806336568abe116101c157806336568abe146102a45780633ccfd60b146102c057806340b6e36f146102ca578063423f22a8146102e8576101ee565b806301ffc9a7146101f2578063248a9ca31461022257806329349c92146102525780632f2ff15d14610288575b5f80fd5b61020c60048036038101906102079190611de5565b610656565b6040516102199190611e2a565b60405180910390f35b61023c60048036038101906102379190611e76565b6106cf565b6040516102499190611eb0565b60405180910390f35b61026c60048036038101906102679190611efc565b6106eb565b60405161027f9796959493929190611fff565b60405180910390f35b6102a2600480360381019061029d91906120a4565b610854565b005b6102be60048036038101906102b991906120a4565b610876565b005b6102c86108f1565b005b6102d261095a565b6040516102df91906120e2565b60405180910390f35b6102f061096a565b6040516102fd91906120e2565b60405180910390f35b610320600480360381019061031b91906120fb565b610970565b60405161032d91906120e2565b60405180910390f35b610350600480360381019061034b9190612265565b610990565b005b61035a610a1b565b6040516103679190611e2a565b60405180910390f35b610378610a2d565b60405161038591906122bf565b60405180910390f35b610396610a52565b6040516103a391906120e2565b60405180910390f35b6103c660048036038101906103c19190611efc565b610a58565b6040516103d391906122d8565b60405180910390f35b6103f660048036038101906103f191906122f8565b610af3565b60405161040391906120e2565b60405180910390f35b610414610b20565b6040516104219190611eb0565b60405180910390f35b610444600480360381019061043f919061233f565b610b44565b005b610460600480360381019061045b91906123a5565b610bb2565b005b61047c600480360381019061047791906120a4565b610cd4565b6040516104899190611e2a565b60405180910390f35b61049a610d37565b6040516104a79190611eb0565b60405180910390f35b6104ca60048036038101906104c591906123e3565b610d3d565b6040516104d791906124f4565b60405180910390f35b6104fa60048036038101906104f59190611efc565b610ded565b005b61051660048036038101906105119190612514565b610e22565b6040516105239190612677565b60405180910390f35b61054660048036038101906105419190611efc565b61136d565b005b610562600480360381019061055d91906122f8565b6113a2565b60405161056f91906120e2565b60405180910390f35b610592600480360381019061058d9190612697565b6113cf565b005b6105ae60048036038101906105a991906120a4565b611421565b005b6105ca60048036038101906105c5919061271b565b611443565b005b6105d461148a565b6040516105e191906120e2565b60405180910390f35b6105f2611495565b6040516105ff91906120e2565b60405180910390f35b610622600480360381019061061d91906122f8565b61149b565b60405161062f91906122bf565b60405180910390f35b6106406114e3565b60405161064d91906120e2565b60405180910390f35b5f7f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106c857506106c7826114e9565b5b9050919050565b5f805f8381526020019081526020015f20600101549050919050565b600a602052805f5260405f205f91509050805f01549080600101805461071090612773565b80601f016020809104026020016040519081016040528092919081815260200182805461073c90612773565b80156107875780601f1061075e57610100808354040283529160200191610787565b820191905f5260205f20905b81548152906001019060200180831161076a57829003601f168201915b505050505090806002015490806003015490806004015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060050154908060060180546107d390612773565b80601f01602080910402602001604051908101604052809291908181526020018280546107ff90612773565b801561084a5780601f106108215761010080835404028352916020019161084a565b820191905f5260205f20905b81548152906001019060200180831161082d57829003601f168201915b5050505050905087565b61085d826106cf565b61086681611552565b6108708383611566565b50505050565b61087e61164f565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146108e2576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6108ec8282611656565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561091b81611552565b3373ffffffffffffffffffffffffffffffffffffffff166108fc4790811502906040515f60405180830381858888f19350505050610957575f80fd5b50565b5f610965600261173f565b905090565b60045481565b600e602052815f5260405f20602052805f5260405f205f91509150505481565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756109ba81611552565b81600b846040516109cb91906127dd565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050565b60035f9054906101000a900460ff1681565b60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60065481565b6009602052805f5260405f205f915090508054610a7490612773565b80601f0160208091040260200160405190810160405280929190818152602001828054610aa090612773565b8015610aeb5780601f10610ac257610100808354040283529160200191610aeb565b820191905f5260205f20905b815481529060010190602001808311610ace57829003601f168201915b505050505081565b600d818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610b6e81611552565b8160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610bdc81611552565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb838573ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c3291906122bf565b602060405180830381865afa158015610c4d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c719190612807565b6040518363ffffffff1660e01b8152600401610c8e929190612832565b6020604051808303815f875af1158015610caa573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610cce919061286d565b50505050565b5f805f8481526020019081526020015f205f015f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b5f801b81565b6060600f5f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2082604051610d8a91906127dd565b9081526020016040518091039020805480602002602001604051908101604052809291908181526020018280548015610de057602002820191905f5260205f20905b815481526020019060010190808311610dcc575b5050505050905092915050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610e1781611552565b816007819055505050565b610e2a611d31565b610e3261174b565b5f600c85604051610e4391906127dd565b908152602001604051809103902054600a610e5e91906129f4565b90505f606485610e6e9190612a3e565b90505f60045482610e7f9190612a3e565b90505f8382610e8e9190612a3e565b90505f61271082610e9f9190612aac565b90506001151560035f9054906101000a900460ff16151514610ef6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eed90612b26565b60405180910390fd5b60075488118015610f08575060085488105b610f47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3e90612bb4565b60405180910390fd5b808714610f89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8090612c1c565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff16600b8a604051610fb091906127dd565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102b90612caa565b60405180910390fd5b61103e6002611791565b5f600b8a60405161104f91906127dd565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905087600e5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546111069190612cc8565b92505081905550600f5f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208a60405161115891906127dd565b9081526020016040518091039020611170600261173f565b908060018154018082558091505060019003905f5260205f20015f9091909190915055876006546111a19190612cc8565b60068190555087600d8b6040516111b891906127dd565b9081526020016040518091039020546111d19190612cc8565b600d8b6040516111e191906127dd565b9081526020016040518091039020819055505f61129a8b8b8b334260095f600281526020019081526020015f20805461121990612773565b80601f016020809104026020016040519081016040528092919081815260200182805461124590612773565b80156112905780601f1061126757610100808354040283529160200191611290565b820191905f5260205f20905b81548152906001019060200180831161127357829003601f168201915b50505050506117a5565b90506112ea3360055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff168b8573ffffffffffffffffffffffffffffffffffffffff16611a11909392919063ffffffff16565b3373ffffffffffffffffffffffffffffffffffffffff168b60405161130f91906127dd565b6040518091039020825f01517f5050238d423bf7e97e5f4d9e6b80b228751ca66adab26e5a3ee850c3b36ead3f8d8d60405161134c929190612cfb565b60405180910390a480975050505050505050611366611a93565b9392505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561139781611552565b816008819055505050565b600c818051602081018201805184825260208301602085012081835280955050505050505f915090505481565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756113f981611552565b81600c8460405161140a91906127dd565b908152602001604051809103902081905550505050565b61142a826106cf565b61143381611552565b61143d8383611656565b50505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561146d81611552565b8160035f6101000a81548160ff0219169083151502179055505050565b6002805f0154905081565b60075481565b600b818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60085481565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6115638161155e61164f565b611a9c565b50565b5f6115718383610cd4565b6116455760015f808581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506115e261164f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a460019050611649565b5f90505b92915050565b5f33905090565b5f6116618383610cd4565b15611735575f805f8581526020019081526020015f205f015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055506116d261164f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16847ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a460019050611739565b5f90505b92915050565b5f815f01549050919050565b600260015403611787576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600181905550565b6001815f015f828254019250508190555050565b6117ad611d31565b5f600a5f6117bb600261173f565b81526020019081526020015f2090506117d4600261173f565b815f0181905550878160010190816117ec9190612ebf565b5086816002018190555085816003018190555084816004015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508381600501819055508281600601908161185b9190612ebf565b50806040518060e00160405290815f820154815260200160018201805461188190612773565b80601f01602080910402602001604051908101604052809291908181526020018280546118ad90612773565b80156118f85780601f106118cf576101008083540402835291602001916118f8565b820191905f5260205f20905b8154815290600101906020018083116118db57829003601f168201915b505050505081526020016002820154815260200160038201548152602001600482015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016005820154815260200160068201805461198490612773565b80601f01602080910402602001604051908101604052809291908181526020018280546119b090612773565b80156119fb5780601f106119d2576101008083540402835291602001916119fb565b820191905f5260205f20905b8154815290600101906020018083116119de57829003601f168201915b5050505050815250509150509695505050505050565b611a8d848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401611a4693929190612f8e565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611aed565b50505050565b60018081905550565b611aa68282610cd4565b611ae95780826040517fe2517d3f000000000000000000000000000000000000000000000000000000008152600401611ae0929190612fc3565b60405180910390fd5b5050565b5f611b17828473ffffffffffffffffffffffffffffffffffffffff16611b8290919063ffffffff16565b90505f815114158015611b3b575080806020019051810190611b39919061286d565b155b15611b7d57826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611b7491906122bf565b60405180910390fd5b505050565b6060611b8f83835f611b97565b905092915050565b606081471015611bde57306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611bd591906122bf565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff168486604051611c06919061302e565b5f6040518083038185875af1925050503d805f8114611c40576040519150601f19603f3d011682016040523d82523d5f602084013e611c45565b606091505b5091509150611c55868383611c60565b925050509392505050565b606082611c7557611c7082611ced565b611ce5565b5f8251148015611c9b57505f8473ffffffffffffffffffffffffffffffffffffffff163b145b15611cdd57836040517f9996b315000000000000000000000000000000000000000000000000000000008152600401611cd491906122bf565b60405180910390fd5b819050611ce6565b5b9392505050565b5f81511115611cff5780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040518060e001604052805f8152602001606081526020015f81526020015f81526020015f73ffffffffffffffffffffffffffffffffffffffff1681526020015f8152602001606081525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611dc481611d90565b8114611dce575f80fd5b50565b5f81359050611ddf81611dbb565b92915050565b5f60208284031215611dfa57611df9611d88565b5b5f611e0784828501611dd1565b91505092915050565b5f8115159050919050565b611e2481611e10565b82525050565b5f602082019050611e3d5f830184611e1b565b92915050565b5f819050919050565b611e5581611e43565b8114611e5f575f80fd5b50565b5f81359050611e7081611e4c565b92915050565b5f60208284031215611e8b57611e8a611d88565b5b5f611e9884828501611e62565b91505092915050565b611eaa81611e43565b82525050565b5f602082019050611ec35f830184611ea1565b92915050565b5f819050919050565b611edb81611ec9565b8114611ee5575f80fd5b50565b5f81359050611ef681611ed2565b92915050565b5f60208284031215611f1157611f10611d88565b5b5f611f1e84828501611ee8565b91505092915050565b611f3081611ec9565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015611f6d578082015181840152602081019050611f52565b5f8484015250505050565b5f601f19601f8301169050919050565b5f611f9282611f36565b611f9c8185611f40565b9350611fac818560208601611f50565b611fb581611f78565b840191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f611fe982611fc0565b9050919050565b611ff981611fdf565b82525050565b5f60e0820190506120125f83018a611f27565b81810360208301526120248189611f88565b90506120336040830188611f27565b6120406060830187611f27565b61204d6080830186611ff0565b61205a60a0830185611f27565b81810360c083015261206c8184611f88565b905098975050505050505050565b61208381611fdf565b811461208d575f80fd5b50565b5f8135905061209e8161207a565b92915050565b5f80604083850312156120ba576120b9611d88565b5b5f6120c785828601611e62565b92505060206120d885828601612090565b9150509250929050565b5f6020820190506120f55f830184611f27565b92915050565b5f806040838503121561211157612110611d88565b5b5f61211e85828601612090565b925050602061212f85828601612090565b9150509250929050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61217782611f78565b810181811067ffffffffffffffff8211171561219657612195612141565b5b80604052505050565b5f6121a8611d7f565b90506121b4828261216e565b919050565b5f67ffffffffffffffff8211156121d3576121d2612141565b5b6121dc82611f78565b9050602081019050919050565b828183375f83830152505050565b5f612209612204846121b9565b61219f565b9050828152602081018484840111156122255761222461213d565b5b6122308482856121e9565b509392505050565b5f82601f83011261224c5761224b612139565b5b813561225c8482602086016121f7565b91505092915050565b5f806040838503121561227b5761227a611d88565b5b5f83013567ffffffffffffffff81111561229857612297611d8c565b5b6122a485828601612238565b92505060206122b585828601612090565b9150509250929050565b5f6020820190506122d25f830184611ff0565b92915050565b5f6020820190508181035f8301526122f08184611f88565b905092915050565b5f6020828403121561230d5761230c611d88565b5b5f82013567ffffffffffffffff81111561232a57612329611d8c565b5b61233684828501612238565b91505092915050565b5f6020828403121561235457612353611d88565b5b5f61236184828501612090565b91505092915050565b5f61237482611fdf565b9050919050565b6123848161236a565b811461238e575f80fd5b50565b5f8135905061239f8161237b565b92915050565b5f80604083850312156123bb576123ba611d88565b5b5f6123c885828601612391565b92505060206123d985828601612090565b9150509250929050565b5f80604083850312156123f9576123f8611d88565b5b5f61240685828601612090565b925050602083013567ffffffffffffffff81111561242757612426611d8c565b5b61243385828601612238565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b61246f81611ec9565b82525050565b5f6124808383612466565b60208301905092915050565b5f602082019050919050565b5f6124a28261243d565b6124ac8185612447565b93506124b783612457565b805f5b838110156124e75781516124ce8882612475565b97506124d98361248c565b9250506001810190506124ba565b5085935050505092915050565b5f6020820190508181035f83015261250c8184612498565b905092915050565b5f805f6060848603121561252b5761252a611d88565b5b5f84013567ffffffffffffffff81111561254857612547611d8c565b5b61255486828701612238565b935050602061256586828701611ee8565b925050604061257686828701611ee8565b9150509250925092565b5f82825260208201905092915050565b5f61259a82611f36565b6125a48185612580565b93506125b4818560208601611f50565b6125bd81611f78565b840191505092915050565b6125d181611fdf565b82525050565b5f60e083015f8301516125ec5f860182612466565b50602083015184820360208601526126048282612590565b91505060408301516126196040860182612466565b50606083015161262c6060860182612466565b50608083015161263f60808601826125c8565b5060a083015161265260a0860182612466565b5060c083015184820360c086015261266a8282612590565b9150508091505092915050565b5f6020820190508181035f83015261268f81846125d7565b905092915050565b5f80604083850312156126ad576126ac611d88565b5b5f83013567ffffffffffffffff8111156126ca576126c9611d8c565b5b6126d685828601612238565b92505060206126e785828601611ee8565b9150509250929050565b6126fa81611e10565b8114612704575f80fd5b50565b5f81359050612715816126f1565b92915050565b5f602082840312156127305761272f611d88565b5b5f61273d84828501612707565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061278a57607f821691505b60208210810361279d5761279c612746565b5b50919050565b5f81905092915050565b5f6127b782611f36565b6127c181856127a3565b93506127d1818560208601611f50565b80840191505092915050565b5f6127e882846127ad565b915081905092915050565b5f8151905061280181611ed2565b92915050565b5f6020828403121561281c5761281b611d88565b5b5f612829848285016127f3565b91505092915050565b5f6040820190506128455f830185611ff0565b6128526020830184611f27565b9392505050565b5f81519050612867816126f1565b92915050565b5f6020828403121561288257612881611d88565b5b5f61288f84828501612859565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f8160011c9050919050565b5f808291508390505b600185111561291a578086048111156128f6576128f5612898565b5b60018516156129055780820291505b8081029050612913856128c5565b94506128da565b94509492505050565b5f8261293257600190506129ed565b8161293f575f90506129ed565b8160018114612955576002811461295f5761298e565b60019150506129ed565b60ff84111561297157612970612898565b5b8360020a91508482111561298857612987612898565b5b506129ed565b5060208310610133831016604e8410600b84101617156129c35782820a9050838111156129be576129bd612898565b5b6129ed565b6129d084848460016128d1565b925090508184048111156129e7576129e6612898565b5b81810290505b9392505050565b5f6129fe82611ec9565b9150612a0983611ec9565b9250612a367fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612923565b905092915050565b5f612a4882611ec9565b9150612a5383611ec9565b9250828202612a6181611ec9565b91508282048414831517612a7857612a77612898565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f612ab682611ec9565b9150612ac183611ec9565b925082612ad157612ad0612a7f565b5b828204905092915050565b7f53616c65206e6f742061637469766500000000000000000000000000000000005f82015250565b5f612b10600f83611f40565b9150612b1b82612adc565b602082019050919050565b5f6020820190508181035f830152612b3d81612b04565b9050919050565b7f517479206d7573742062652067726561746572207468616e206d696e506572545f8201527f782026206c657373207468616e206d6178506572547800000000000000000000602082015250565b5f612b9e603683611f40565b9150612ba982612b44565b604082019050919050565b5f6020820190508181035f830152612bcb81612b92565b9050919050565b7f416d6f756e742073686f756c64206d61746368207072696365202a20717479005f82015250565b5f612c06601f83611f40565b9150612c1182612bd2565b602082019050919050565b5f6020820190508181035f830152612c3381612bfa565b9050919050565b7f41646472657373206e6f742070617274206f6620616c6c6f77656420746f6b655f8201527f6e206c6973740000000000000000000000000000000000000000000000000000602082015250565b5f612c94602683611f40565b9150612c9f82612c3a565b604082019050919050565b5f6020820190508181035f830152612cc181612c88565b9050919050565b5f612cd282611ec9565b9150612cdd83611ec9565b9250828201905080821115612cf557612cf4612898565b5b92915050565b5f604082019050612d0e5f830185611f27565b612d1b6020830184611f27565b9392505050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302612d7e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82612d43565b612d888683612d43565b95508019841693508086168417925050509392505050565b5f819050919050565b5f612dc3612dbe612db984611ec9565b612da0565b611ec9565b9050919050565b5f819050919050565b612ddc83612da9565b612df0612de882612dca565b848454612d4f565b825550505050565b5f90565b612e04612df8565b612e0f818484612dd3565b505050565b5b81811015612e3257612e275f82612dfc565b600181019050612e15565b5050565b601f821115612e7757612e4881612d22565b612e5184612d34565b81016020851015612e60578190505b612e74612e6c85612d34565b830182612e14565b50505b505050565b5f82821c905092915050565b5f612e975f1984600802612e7c565b1980831691505092915050565b5f612eaf8383612e88565b9150826002028217905092915050565b612ec882611f36565b67ffffffffffffffff811115612ee157612ee0612141565b5b612eeb8254612773565b612ef6828285612e36565b5f60209050601f831160018114612f27575f8415612f15578287015190505b612f1f8582612ea4565b865550612f86565b601f198416612f3586612d22565b5f5b82811015612f5c57848901518255600182019150602085019450602081019050612f37565b86831015612f795784890151612f75601f891682612e88565b8355505b6001600288020188555050505b505050505050565b5f606082019050612fa15f830186611ff0565b612fae6020830185611ff0565b612fbb6040830184611f27565b949350505050565b5f604082019050612fd65f830185611ff0565b612fe36020830184611ea1565b9392505050565b5f81519050919050565b5f81905092915050565b5f61300882612fea565b6130128185612ff4565b9350613022818560208601611f50565b80840191505092915050565b5f6130398284612ffe565b91508190509291505056fea2646970667358221220dbe0283ab2ed013ec062d2029ad67ebaf43202ad6c80812cd179a077592af84f64736f6c63430008140033
Deployed Bytecode Sourcemap
38605:5991:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12034:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13314:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39365:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;13746:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14883:251;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43968:125;;;:::i;:::-;;44280:105;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38925:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39594:67;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43121:180;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38891:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38959:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38991:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39314:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39529:56;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39749:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43609:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44101:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12330:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11642:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44393:200;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43734:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40902:1556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43851:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39474:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43309:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14177:140;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43489:112;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38746:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39029:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39419:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39059:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12034:204;12119:4;12158:32;12143:47;;;:11;:47;;;;:87;;;;12194:36;12218:11;12194:23;:36::i;:::-;12143:87;12136:94;;12034:204;;;:::o;13314:122::-;13379:7;13406:6;:12;13413:4;13406:12;;;;;;;;;;;:22;;;13399:29;;13314:122;;;:::o;39365:47::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13746:138::-;13820:18;13833:4;13820:12;:18::i;:::-;11926:16;11937:4;11926:10;:16::i;:::-;13851:25:::1;13862:4;13868:7;13851:10;:25::i;:::-;;13746:138:::0;;;:::o;14883:251::-;14999:12;:10;:12::i;:::-;14977:34;;:18;:34;;;14973:104;;15035:30;;;;;;;;;;;;;;14973:104;15089:37;15101:4;15107:18;15089:11;:37::i;:::-;;14883:251;;:::o;43968:125::-;39786:23;11926:16;11937:4;11926:10;:16::i;:::-;44045:10:::1;44037:24;;:47;44062:21;44037:47;;;;;;;;;;;;;;;;;;;;;;;44029:56;;;::::0;::::1;;43968:125:::0;:::o;44280:105::-;44330:7;44357:20;:10;:18;:20::i;:::-;44350:27;;44280:105;:::o;38925:27::-;;;;:::o;39594:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43121:180::-;39786:23;11926:16;11937:4;11926:10;:16::i;:::-;43280:13:::1;43255;43269:7;43255:22;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;43121:180:::0;;;:::o;38891:27::-;;;;;;;;;;;;;:::o;38959:25::-;;;;;;;;;;;;;:::o;38991:31::-;;;;:::o;39314:44::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39529:56::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39749:60::-;39786:23;39749:60;:::o;43609:117::-;39786:23;11926:16;11937:4;11926:10;:16::i;:::-;43707:11:::1;43694:10;;:24;;;;;;;;;;;;;;;;;;43609:117:::0;;:::o;44101:171::-;39786:23;11926:16;11937:4;11926:10;:16::i;:::-;44198:13:::1;:22;;;44221:2;44225:13;:23;;;44257:4;44225:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44198:66;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44101:171:::0;;;:::o;12330:138::-;12407:4;12431:6;:12;12438:4;12431:12;;;;;;;;;;;:20;;:29;12452:7;12431:29;;;;;;;;;;;;;;;;;;;;;;;;;12424:36;;12330:138;;;;:::o;11642:49::-;11687:4;11642:49;;;:::o;44393:200::-;44510:16;44551:15;:25;44567:8;44551:25;;;;;;;;;;;;;;;44577:7;44551:34;;;;;;:::i;:::-;;;;;;;;;;;;;44544:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44393:200;;;;:::o;43734:109::-;39786:23;11926:16;11937:4;11926:10;:16::i;:::-;43826:9:::1;43815:8;:20;;;;43734:109:::0;;:::o;40902:1556::-;41034:17;;:::i;:::-;2442:21;:19;:21::i;:::-;41069::::1;41099:13;41113:6;41099:21;;;;;;:::i;:::-;;;;;;;;;;;;;;41093:2;:27;;;;:::i;:::-;41069:51;;41133:14;41156:3;41150;:9;;;;:::i;:::-;41133:26;;41170:20;41203:12;;41194:6;:21;;;;:::i;:::-;41170:46;;41227:19;41264:13;41249:12;:28;;;;:::i;:::-;41227:50;;41288:21;41326:5;41312:11;:19;;;;:::i;:::-;41288:43;;41368:4;41352:20;;:12;;;;;;;;;;;:20;;;41344:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;41417:8;;41411:3;:14;:32;;;;;41435:8;;41429:3;:14;41411:32;41403:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;41531:13;41521:6;:23;41513:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;41632:1;41599:35;;:13;41613:6;41599:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:35;;::::0;41591:87:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;41691:22;:10;:20;:22::i;:::-;41724:20;41747:13;41761:6;41747:21;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;41724:44;;41821:6;41779:12;:24;41792:10;41779:24;;;;;;;;;;;;;;;:38;41804:12;41779:38;;;;;;;;;;;;;;;;:48;;;;;;;:::i;:::-;;;;;;;;41838:15;:27;41854:10;41838:27;;;;;;;;;;;;;;;41866:6;41838:35;;;;;;:::i;:::-;;;;;;;;;;;;;41879:20;:10;:18;:20::i;:::-;41838:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41957:6;41938:16;;:25;;;;:::i;:::-;41919:16;:44;;;;42038:6;42006:21;42028:6;42006:29;;;;;;:::i;:::-;;;;;;;;;;;;;;:38;;;;:::i;:::-;41974:21;41996:6;41974:29;;;;;;:::i;:::-;;;;;;;;;;;;;:70;;;;42057:28;42088:170;42120:6;42141:3;42159:6;42180:10;42205:15;42235:9;:12;42245:1;42235:12;;;;;;;;;;;42088:170;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:17;:170::i;:::-;42057:201;;42271:69;42309:10;42321;;;;;;;;;;;42333:6;42278:12;42271:37;;;;:69;;;;;;:::i;:::-;42396:10;42358:62;;42388:6;42358:62;;;;;;:::i;:::-;;;;;;;;42373:10;:13;;;42358:62;42408:3;42413:6;42358:62;;;;;;;:::i;:::-;;;;;;;;42440:10;42433:17;;;;;;;;;2486:20:::0;:18;:20::i;:::-;40902:1556;;;;;:::o;43851:109::-;39786:23;11926:16;11937:4;11926:10;:16::i;:::-;43943:9:::1;43932:8;:20;;;;43851:109:::0;;:::o;39474:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43309:172::-;39786:23;11926:16;11937:4;11926:10;:16::i;:::-;43464:9:::1;43439:13;43453:7;43439:22;;;;;;:::i;:::-;;;;;;;;;;;;;:34;;;;43309:172:::0;;;:::o;14177:140::-;14252:18;14265:4;14252:12;:18::i;:::-;11926:16;11937:4;11926:10;:16::i;:::-;14283:26:::1;14295:4;14301:7;14283:11;:26::i;:::-;;14177:140:::0;;;:::o;43489:112::-;39786:23;11926:16;11937:4;11926:10;:16::i;:::-;43584:9:::1;43569:12;;:24;;;;;;;;;;;;;;;;;;43489:112:::0;;:::o;38746:34::-;;;;;;;;;:::o;39029:23::-;;;;:::o;39419:48::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39059:23::-;;;;:::o;5071:148::-;5147:4;5186:25;5171:40;;;:11;:40;;;;5164:47;;5071:148;;;:::o;12683:105::-;12750:30;12761:4;12767:12;:10;:12::i;:::-;12750:10;:30::i;:::-;12683:105;:::o;15760:324::-;15837:4;15859:22;15867:4;15873:7;15859;:22::i;:::-;15854:223;;15930:4;15898:6;:12;15905:4;15898:12;;;;;;;;;;;:20;;:29;15919:7;15898:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;15981:12;:10;:12::i;:::-;15954:40;;15972:7;15954:40;;15966:4;15954:40;;;;;;;;;;16016:4;16009:11;;;;15854:223;16060:5;16053:12;;15760:324;;;;;:::o;5921:98::-;5974:7;6001:10;5994:17;;5921:98;:::o;16328:325::-;16406:4;16427:22;16435:4;16441:7;16427;:22::i;:::-;16423:223;;;16498:5;16466:6;:12;16473:4;16466:12;;;;;;;;;;;:20;;:29;16487:7;16466:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;16550:12;:10;:12::i;:::-;16523:40;;16541:7;16523:40;;16535:4;16523:40;;;;;;;;;;16585:4;16578:11;;;;16423:223;16629:5;16622:12;;16328:325;;;;;:::o;36583:114::-;36648:7;36675;:14;;;36668:21;;36583:114;;;:::o;2522:315::-;1820:1;2651:7;;:18;2647:88;;2693:30;;;;;;;;;;;;;;2647:88;1820:1;2812:7;:17;;;;2522:315::o;36705:127::-;36812:1;36794:7;:14;;;:19;;;;;;;;;;;36705:127;:::o;42466:647::-;42687:17;;:::i;:::-;42717:29;42749:10;:32;42760:20;:10;:18;:20::i;:::-;42749:32;;;;;;;;;;;42717:64;;42808:20;:10;:18;:20::i;:::-;42792:10;:13;;:36;;;;42864:7;42839:10;:22;;:32;;;;;;:::i;:::-;;42899:4;42882:10;:14;;:21;;;;42939:7;42914:10;:22;;:32;;;;42985:8;42957:10;:25;;;:36;;;;;;;;;;;;;;;;;;43027:10;43004;:20;;:33;;;;43068:7;43048:10;:17;;:27;;;;;;:::i;:::-;;43095:10;43088:17;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42466:647;;;;;;;;:::o;31566:190::-;31667:81;31687:5;31709;:18;;;31730:4;31736:2;31740:5;31694:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31667:19;:81::i;:::-;31566:190;;;;:::o;2845:212::-;1777:1;3028:7;:21;;;;2845:212::o;12924:201::-;13013:22;13021:4;13027:7;13013;:22::i;:::-;13008:110;;13092:7;13101:4;13059:47;;;;;;;;;;;;:::i;:::-;;;;;;;;13008:110;12924:201;;:::o;33970:638::-;34394:23;34420:33;34448:4;34428:5;34420:27;;;;:33;;;;:::i;:::-;34394:59;;34489:1;34468:10;:17;:22;;:57;;;;;34506:10;34495:30;;;;;;;;;;;;:::i;:::-;34494:31;34468:57;34464:137;;;34582:5;34549:40;;;;;;;;;;;:::i;:::-;;;;;;;;34464:137;34040:568;33970:638;;:::o;19457:153::-;19532:12;19564:38;19586:6;19594:4;19600:1;19564:21;:38::i;:::-;19557:45;;19457:153;;;;:::o;19945:398::-;20044:12;20097:5;20073:21;:29;20069:110;;;20161:4;20126:41;;;;;;;;;;;:::i;:::-;;;;;;;;20069:110;20190:12;20204:23;20231:6;:11;;20250:5;20257:4;20231:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20189:73;;;;20280:55;20307:6;20315:7;20324:10;20280:26;:55::i;:::-;20273:62;;;;19945:398;;;;;:::o;21421:597::-;21569:12;21599:7;21594:417;;21623:19;21631:10;21623:7;:19::i;:::-;21594:417;;;21872:1;21851:10;:17;:22;:49;;;;;21899:1;21877:6;:18;;;:23;21851:49;21847:121;;;21945:6;21928:24;;;;;;;;;;;:::i;:::-;;;;;;;;21847:121;21989:10;21982:17;;;;21594:417;21421:597;;;;;;:::o;22571:528::-;22724:1;22704:10;:17;:21;22700:392;;;22936:10;22930:17;22993:15;22980:10;22976:2;22972:19;22965:44;22700:392;23063:17;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:118::-;2296:24;2314:5;2296:24;:::i;:::-;2291:3;2284:37;2209:118;;:::o;2333:222::-;2426:4;2464:2;2453:9;2449:18;2441:26;;2477:71;2545:1;2534:9;2530:17;2521:6;2477:71;:::i;:::-;2333:222;;;;:::o;2561:77::-;2598:7;2627:5;2616:16;;2561:77;;;:::o;2644:122::-;2717:24;2735:5;2717:24;:::i;:::-;2710:5;2707:35;2697:63;;2756:1;2753;2746:12;2697:63;2644:122;:::o;2772:139::-;2818:5;2856:6;2843:20;2834:29;;2872:33;2899:5;2872:33;:::i;:::-;2772:139;;;;:::o;2917:329::-;2976:6;3025:2;3013:9;3004:7;3000:23;2996:32;2993:119;;;3031:79;;:::i;:::-;2993:119;3151:1;3176:53;3221:7;3212:6;3201:9;3197:22;3176:53;:::i;:::-;3166:63;;3122:117;2917:329;;;;:::o;3252:118::-;3339:24;3357:5;3339:24;:::i;:::-;3334:3;3327:37;3252:118;;:::o;3376:99::-;3428:6;3462:5;3456:12;3446:22;;3376:99;;;:::o;3481:169::-;3565:11;3599:6;3594:3;3587:19;3639:4;3634:3;3630:14;3615:29;;3481:169;;;;:::o;3656:246::-;3737:1;3747:113;3761:6;3758:1;3755:13;3747:113;;;3846:1;3841:3;3837:11;3831:18;3827:1;3822:3;3818:11;3811:39;3783:2;3780:1;3776:10;3771:15;;3747:113;;;3894:1;3885:6;3880:3;3876:16;3869:27;3718:184;3656:246;;;:::o;3908:102::-;3949:6;4000:2;3996:7;3991:2;3984:5;3980:14;3976:28;3966:38;;3908:102;;;:::o;4016:377::-;4104:3;4132:39;4165:5;4132:39;:::i;:::-;4187:71;4251:6;4246:3;4187:71;:::i;:::-;4180:78;;4267:65;4325:6;4320:3;4313:4;4306:5;4302:16;4267:65;:::i;:::-;4357:29;4379:6;4357:29;:::i;:::-;4352:3;4348:39;4341:46;;4108:285;4016:377;;;;:::o;4399:126::-;4436:7;4476:42;4469:5;4465:54;4454:65;;4399:126;;;:::o;4531:96::-;4568:7;4597:24;4615:5;4597:24;:::i;:::-;4586:35;;4531:96;;;:::o;4633:118::-;4720:24;4738:5;4720:24;:::i;:::-;4715:3;4708:37;4633:118;;:::o;4757:1068::-;5058:4;5096:3;5085:9;5081:19;5073:27;;5110:71;5178:1;5167:9;5163:17;5154:6;5110:71;:::i;:::-;5228:9;5222:4;5218:20;5213:2;5202:9;5198:18;5191:48;5256:78;5329:4;5320:6;5256:78;:::i;:::-;5248:86;;5344:72;5412:2;5401:9;5397:18;5388:6;5344:72;:::i;:::-;5426;5494:2;5483:9;5479:18;5470:6;5426:72;:::i;:::-;5508:73;5576:3;5565:9;5561:19;5552:6;5508:73;:::i;:::-;5591;5659:3;5648:9;5644:19;5635:6;5591:73;:::i;:::-;5712:9;5706:4;5702:20;5696:3;5685:9;5681:19;5674:49;5740:78;5813:4;5804:6;5740:78;:::i;:::-;5732:86;;4757:1068;;;;;;;;;;:::o;5831:122::-;5904:24;5922:5;5904:24;:::i;:::-;5897:5;5894:35;5884:63;;5943:1;5940;5933:12;5884:63;5831:122;:::o;5959:139::-;6005:5;6043:6;6030:20;6021:29;;6059:33;6086:5;6059:33;:::i;:::-;5959:139;;;;:::o;6104:474::-;6172:6;6180;6229:2;6217:9;6208:7;6204:23;6200:32;6197:119;;;6235:79;;:::i;:::-;6197:119;6355:1;6380:53;6425:7;6416:6;6405:9;6401:22;6380:53;:::i;:::-;6370:63;;6326:117;6482:2;6508:53;6553:7;6544:6;6533:9;6529:22;6508:53;:::i;:::-;6498:63;;6453:118;6104:474;;;;;:::o;6584:222::-;6677:4;6715:2;6704:9;6700:18;6692:26;;6728:71;6796:1;6785:9;6781:17;6772:6;6728:71;:::i;:::-;6584:222;;;;:::o;6812:474::-;6880:6;6888;6937:2;6925:9;6916:7;6912:23;6908:32;6905:119;;;6943:79;;:::i;:::-;6905:119;7063:1;7088:53;7133:7;7124:6;7113:9;7109:22;7088:53;:::i;:::-;7078:63;;7034:117;7190:2;7216:53;7261:7;7252:6;7241:9;7237:22;7216:53;:::i;:::-;7206:63;;7161:118;6812:474;;;;;:::o;7292:117::-;7401:1;7398;7391:12;7415:117;7524:1;7521;7514:12;7538:180;7586:77;7583:1;7576:88;7683:4;7680:1;7673:15;7707:4;7704:1;7697:15;7724:281;7807:27;7829:4;7807:27;:::i;:::-;7799:6;7795:40;7937:6;7925:10;7922:22;7901:18;7889:10;7886:34;7883:62;7880:88;;;7948:18;;:::i;:::-;7880:88;7988:10;7984:2;7977:22;7767:238;7724:281;;:::o;8011:129::-;8045:6;8072:20;;:::i;:::-;8062:30;;8101:33;8129:4;8121:6;8101:33;:::i;:::-;8011:129;;;:::o;8146:308::-;8208:4;8298:18;8290:6;8287:30;8284:56;;;8320:18;;:::i;:::-;8284:56;8358:29;8380:6;8358:29;:::i;:::-;8350:37;;8442:4;8436;8432:15;8424:23;;8146:308;;;:::o;8460:146::-;8557:6;8552:3;8547;8534:30;8598:1;8589:6;8584:3;8580:16;8573:27;8460:146;;;:::o;8612:425::-;8690:5;8715:66;8731:49;8773:6;8731:49;:::i;:::-;8715:66;:::i;:::-;8706:75;;8804:6;8797:5;8790:21;8842:4;8835:5;8831:16;8880:3;8871:6;8866:3;8862:16;8859:25;8856:112;;;8887:79;;:::i;:::-;8856:112;8977:54;9024:6;9019:3;9014;8977:54;:::i;:::-;8696:341;8612:425;;;;;:::o;9057:340::-;9113:5;9162:3;9155:4;9147:6;9143:17;9139:27;9129:122;;9170:79;;:::i;:::-;9129:122;9287:6;9274:20;9312:79;9387:3;9379:6;9372:4;9364:6;9360:17;9312:79;:::i;:::-;9303:88;;9119:278;9057:340;;;;:::o;9403:654::-;9481:6;9489;9538:2;9526:9;9517:7;9513:23;9509:32;9506:119;;;9544:79;;:::i;:::-;9506:119;9692:1;9681:9;9677:17;9664:31;9722:18;9714:6;9711:30;9708:117;;;9744:79;;:::i;:::-;9708:117;9849:63;9904:7;9895:6;9884:9;9880:22;9849:63;:::i;:::-;9839:73;;9635:287;9961:2;9987:53;10032:7;10023:6;10012:9;10008:22;9987:53;:::i;:::-;9977:63;;9932:118;9403:654;;;;;:::o;10063:222::-;10156:4;10194:2;10183:9;10179:18;10171:26;;10207:71;10275:1;10264:9;10260:17;10251:6;10207:71;:::i;:::-;10063:222;;;;:::o;10291:313::-;10404:4;10442:2;10431:9;10427:18;10419:26;;10491:9;10485:4;10481:20;10477:1;10466:9;10462:17;10455:47;10519:78;10592:4;10583:6;10519:78;:::i;:::-;10511:86;;10291:313;;;;:::o;10610:509::-;10679:6;10728:2;10716:9;10707:7;10703:23;10699:32;10696:119;;;10734:79;;:::i;:::-;10696:119;10882:1;10871:9;10867:17;10854:31;10912:18;10904:6;10901:30;10898:117;;;10934:79;;:::i;:::-;10898:117;11039:63;11094:7;11085:6;11074:9;11070:22;11039:63;:::i;:::-;11029:73;;10825:287;10610:509;;;;:::o;11125:329::-;11184:6;11233:2;11221:9;11212:7;11208:23;11204:32;11201:119;;;11239:79;;:::i;:::-;11201:119;11359:1;11384:53;11429:7;11420:6;11409:9;11405:22;11384:53;:::i;:::-;11374:63;;11330:117;11125:329;;;;:::o;11460:110::-;11511:7;11540:24;11558:5;11540:24;:::i;:::-;11529:35;;11460:110;;;:::o;11576:150::-;11663:38;11695:5;11663:38;:::i;:::-;11656:5;11653:49;11643:77;;11716:1;11713;11706:12;11643:77;11576:150;:::o;11732:167::-;11792:5;11830:6;11817:20;11808:29;;11846:47;11887:5;11846:47;:::i;:::-;11732:167;;;;:::o;11905:502::-;11987:6;11995;12044:2;12032:9;12023:7;12019:23;12015:32;12012:119;;;12050:79;;:::i;:::-;12012:119;12170:1;12195:67;12254:7;12245:6;12234:9;12230:22;12195:67;:::i;:::-;12185:77;;12141:131;12311:2;12337:53;12382:7;12373:6;12362:9;12358:22;12337:53;:::i;:::-;12327:63;;12282:118;11905:502;;;;;:::o;12413:654::-;12491:6;12499;12548:2;12536:9;12527:7;12523:23;12519:32;12516:119;;;12554:79;;:::i;:::-;12516:119;12674:1;12699:53;12744:7;12735:6;12724:9;12720:22;12699:53;:::i;:::-;12689:63;;12645:117;12829:2;12818:9;12814:18;12801:32;12860:18;12852:6;12849:30;12846:117;;;12882:79;;:::i;:::-;12846:117;12987:63;13042:7;13033:6;13022:9;13018:22;12987:63;:::i;:::-;12977:73;;12772:288;12413:654;;;;;:::o;13073:114::-;13140:6;13174:5;13168:12;13158:22;;13073:114;;;:::o;13193:184::-;13292:11;13326:6;13321:3;13314:19;13366:4;13361:3;13357:14;13342:29;;13193:184;;;;:::o;13383:132::-;13450:4;13473:3;13465:11;;13503:4;13498:3;13494:14;13486:22;;13383:132;;;:::o;13521:108::-;13598:24;13616:5;13598:24;:::i;:::-;13593:3;13586:37;13521:108;;:::o;13635:179::-;13704:10;13725:46;13767:3;13759:6;13725:46;:::i;:::-;13803:4;13798:3;13794:14;13780:28;;13635:179;;;;:::o;13820:113::-;13890:4;13922;13917:3;13913:14;13905:22;;13820:113;;;:::o;13969:732::-;14088:3;14117:54;14165:5;14117:54;:::i;:::-;14187:86;14266:6;14261:3;14187:86;:::i;:::-;14180:93;;14297:56;14347:5;14297:56;:::i;:::-;14376:7;14407:1;14392:284;14417:6;14414:1;14411:13;14392:284;;;14493:6;14487:13;14520:63;14579:3;14564:13;14520:63;:::i;:::-;14513:70;;14606:60;14659:6;14606:60;:::i;:::-;14596:70;;14452:224;14439:1;14436;14432:9;14427:14;;14392:284;;;14396:14;14692:3;14685:10;;14093:608;;;13969:732;;;;:::o;14707:373::-;14850:4;14888:2;14877:9;14873:18;14865:26;;14937:9;14931:4;14927:20;14923:1;14912:9;14908:17;14901:47;14965:108;15068:4;15059:6;14965:108;:::i;:::-;14957:116;;14707:373;;;;:::o;15086:799::-;15173:6;15181;15189;15238:2;15226:9;15217:7;15213:23;15209:32;15206:119;;;15244:79;;:::i;:::-;15206:119;15392:1;15381:9;15377:17;15364:31;15422:18;15414:6;15411:30;15408:117;;;15444:79;;:::i;:::-;15408:117;15549:63;15604:7;15595:6;15584:9;15580:22;15549:63;:::i;:::-;15539:73;;15335:287;15661:2;15687:53;15732:7;15723:6;15712:9;15708:22;15687:53;:::i;:::-;15677:63;;15632:118;15789:2;15815:53;15860:7;15851:6;15840:9;15836:22;15815:53;:::i;:::-;15805:63;;15760:118;15086:799;;;;;:::o;15891:159::-;15965:11;15999:6;15994:3;15987:19;16039:4;16034:3;16030:14;16015:29;;15891:159;;;;:::o;16056:357::-;16134:3;16162:39;16195:5;16162:39;:::i;:::-;16217:61;16271:6;16266:3;16217:61;:::i;:::-;16210:68;;16287:65;16345:6;16340:3;16333:4;16326:5;16322:16;16287:65;:::i;:::-;16377:29;16399:6;16377:29;:::i;:::-;16372:3;16368:39;16361:46;;16138:275;16056:357;;;;:::o;16419:108::-;16496:24;16514:5;16496:24;:::i;:::-;16491:3;16484:37;16419:108;;:::o;16611:1581::-;16736:3;16772:4;16767:3;16763:14;16857:4;16850:5;16846:16;16840:23;16876:63;16933:4;16928:3;16924:14;16910:12;16876:63;:::i;:::-;16787:162;17038:4;17031:5;17027:16;17021:23;17091:3;17085:4;17081:14;17074:4;17069:3;17065:14;17058:38;17117:73;17185:4;17171:12;17117:73;:::i;:::-;17109:81;;16959:242;17282:4;17275:5;17271:16;17265:23;17301:63;17358:4;17353:3;17349:14;17335:12;17301:63;:::i;:::-;17211:163;17463:4;17456:5;17452:16;17446:23;17482:63;17539:4;17534:3;17530:14;17516:12;17482:63;:::i;:::-;17384:171;17647:4;17640:5;17636:16;17630:23;17666:63;17723:4;17718:3;17714:14;17700:12;17666:63;:::i;:::-;17565:174;17826:4;17819:5;17815:16;17809:23;17845:63;17902:4;17897:3;17893:14;17879:12;17845:63;:::i;:::-;17749:169;18002:4;17995:5;17991:16;17985:23;18055:3;18049:4;18045:14;18038:4;18033:3;18029:14;18022:38;18081:73;18149:4;18135:12;18081:73;:::i;:::-;18073:81;;17928:237;18182:4;18175:11;;16741:1451;16611:1581;;;;:::o;18198:385::-;18347:4;18385:2;18374:9;18370:18;18362:26;;18434:9;18428:4;18424:20;18420:1;18409:9;18405:17;18398:47;18462:114;18571:4;18562:6;18462:114;:::i;:::-;18454:122;;18198:385;;;;:::o;18589:654::-;18667:6;18675;18724:2;18712:9;18703:7;18699:23;18695:32;18692:119;;;18730:79;;:::i;:::-;18692:119;18878:1;18867:9;18863:17;18850:31;18908:18;18900:6;18897:30;18894:117;;;18930:79;;:::i;:::-;18894:117;19035:63;19090:7;19081:6;19070:9;19066:22;19035:63;:::i;:::-;19025:73;;18821:287;19147:2;19173:53;19218:7;19209:6;19198:9;19194:22;19173:53;:::i;:::-;19163:63;;19118:118;18589:654;;;;;:::o;19249:116::-;19319:21;19334:5;19319:21;:::i;:::-;19312:5;19309:32;19299:60;;19355:1;19352;19345:12;19299:60;19249:116;:::o;19371:133::-;19414:5;19452:6;19439:20;19430:29;;19468:30;19492:5;19468:30;:::i;:::-;19371:133;;;;:::o;19510:323::-;19566:6;19615:2;19603:9;19594:7;19590:23;19586:32;19583:119;;;19621:79;;:::i;:::-;19583:119;19741:1;19766:50;19808:7;19799:6;19788:9;19784:22;19766:50;:::i;:::-;19756:60;;19712:114;19510:323;;;;:::o;19839:180::-;19887:77;19884:1;19877:88;19984:4;19981:1;19974:15;20008:4;20005:1;19998:15;20025:320;20069:6;20106:1;20100:4;20096:12;20086:22;;20153:1;20147:4;20143:12;20174:18;20164:81;;20230:4;20222:6;20218:17;20208:27;;20164:81;20292:2;20284:6;20281:14;20261:18;20258:38;20255:84;;20311:18;;:::i;:::-;20255:84;20076:269;20025:320;;;:::o;20351:148::-;20453:11;20490:3;20475:18;;20351:148;;;;:::o;20505:390::-;20611:3;20639:39;20672:5;20639:39;:::i;:::-;20694:89;20776:6;20771:3;20694:89;:::i;:::-;20687:96;;20792:65;20850:6;20845:3;20838:4;20831:5;20827:16;20792:65;:::i;:::-;20882:6;20877:3;20873:16;20866:23;;20615:280;20505:390;;;;:::o;20901:275::-;21033:3;21055:95;21146:3;21137:6;21055:95;:::i;:::-;21048:102;;21167:3;21160:10;;20901:275;;;;:::o;21182:143::-;21239:5;21270:6;21264:13;21255:22;;21286:33;21313:5;21286:33;:::i;:::-;21182:143;;;;:::o;21331:351::-;21401:6;21450:2;21438:9;21429:7;21425:23;21421:32;21418:119;;;21456:79;;:::i;:::-;21418:119;21576:1;21601:64;21657:7;21648:6;21637:9;21633:22;21601:64;:::i;:::-;21591:74;;21547:128;21331:351;;;;:::o;21688:332::-;21809:4;21847:2;21836:9;21832:18;21824:26;;21860:71;21928:1;21917:9;21913:17;21904:6;21860:71;:::i;:::-;21941:72;22009:2;21998:9;21994:18;21985:6;21941:72;:::i;:::-;21688:332;;;;;:::o;22026:137::-;22080:5;22111:6;22105:13;22096:22;;22127:30;22151:5;22127:30;:::i;:::-;22026:137;;;;:::o;22169:345::-;22236:6;22285:2;22273:9;22264:7;22260:23;22256:32;22253:119;;;22291:79;;:::i;:::-;22253:119;22411:1;22436:61;22489:7;22480:6;22469:9;22465:22;22436:61;:::i;:::-;22426:71;;22382:125;22169:345;;;;:::o;22520:180::-;22568:77;22565:1;22558:88;22665:4;22662:1;22655:15;22689:4;22686:1;22679:15;22706:102;22748:8;22795:5;22792:1;22788:13;22767:34;;22706:102;;;:::o;22814:848::-;22875:5;22882:4;22906:6;22897:15;;22930:5;22921:14;;22944:712;22965:1;22955:8;22952:15;22944:712;;;23060:4;23055:3;23051:14;23045:4;23042:24;23039:50;;;23069:18;;:::i;:::-;23039:50;23119:1;23109:8;23105:16;23102:451;;;23534:4;23527:5;23523:16;23514:25;;23102:451;23584:4;23578;23574:15;23566:23;;23614:32;23637:8;23614:32;:::i;:::-;23602:44;;22944:712;;;22814:848;;;;;;;:::o;23668:1073::-;23722:5;23913:8;23903:40;;23934:1;23925:10;;23936:5;;23903:40;23962:4;23952:36;;23979:1;23970:10;;23981:5;;23952:36;24048:4;24096:1;24091:27;;;;24132:1;24127:191;;;;24041:277;;24091:27;24109:1;24100:10;;24111:5;;;24127:191;24172:3;24162:8;24159:17;24156:43;;;24179:18;;:::i;:::-;24156:43;24228:8;24225:1;24221:16;24212:25;;24263:3;24256:5;24253:14;24250:40;;;24270:18;;:::i;:::-;24250:40;24303:5;;;24041:277;;24427:2;24417:8;24414:16;24408:3;24402:4;24399:13;24395:36;24377:2;24367:8;24364:16;24359:2;24353:4;24350:12;24346:35;24330:111;24327:246;;;24483:8;24477:4;24473:19;24464:28;;24518:3;24511:5;24508:14;24505:40;;;24525:18;;:::i;:::-;24505:40;24558:5;;24327:246;24598:42;24636:3;24626:8;24620:4;24617:1;24598:42;:::i;:::-;24583:57;;;;24672:4;24667:3;24663:14;24656:5;24653:25;24650:51;;;24681:18;;:::i;:::-;24650:51;24730:4;24723:5;24719:16;24710:25;;23668:1073;;;;;;:::o;24747:285::-;24807:5;24831:23;24849:4;24831:23;:::i;:::-;24823:31;;24875:27;24893:8;24875:27;:::i;:::-;24863:39;;24921:104;24958:66;24948:8;24942:4;24921:104;:::i;:::-;24912:113;;24747:285;;;;:::o;25038:410::-;25078:7;25101:20;25119:1;25101:20;:::i;:::-;25096:25;;25135:20;25153:1;25135:20;:::i;:::-;25130:25;;25190:1;25187;25183:9;25212:30;25230:11;25212:30;:::i;:::-;25201:41;;25391:1;25382:7;25378:15;25375:1;25372:22;25352:1;25345:9;25325:83;25302:139;;25421:18;;:::i;:::-;25302:139;25086:362;25038:410;;;;:::o;25454:180::-;25502:77;25499:1;25492:88;25599:4;25596:1;25589:15;25623:4;25620:1;25613:15;25640:185;25680:1;25697:20;25715:1;25697:20;:::i;:::-;25692:25;;25731:20;25749:1;25731:20;:::i;:::-;25726:25;;25770:1;25760:35;;25775:18;;:::i;:::-;25760:35;25817:1;25814;25810:9;25805:14;;25640:185;;;;:::o;25831:165::-;25971:17;25967:1;25959:6;25955:14;25948:41;25831:165;:::o;26002:366::-;26144:3;26165:67;26229:2;26224:3;26165:67;:::i;:::-;26158:74;;26241:93;26330:3;26241:93;:::i;:::-;26359:2;26354:3;26350:12;26343:19;;26002:366;;;:::o;26374:419::-;26540:4;26578:2;26567:9;26563:18;26555:26;;26627:9;26621:4;26617:20;26613:1;26602:9;26598:17;26591:47;26655:131;26781:4;26655:131;:::i;:::-;26647:139;;26374:419;;;:::o;26799:241::-;26939:34;26935:1;26927:6;26923:14;26916:58;27008:24;27003:2;26995:6;26991:15;26984:49;26799:241;:::o;27046:366::-;27188:3;27209:67;27273:2;27268:3;27209:67;:::i;:::-;27202:74;;27285:93;27374:3;27285:93;:::i;:::-;27403:2;27398:3;27394:12;27387:19;;27046:366;;;:::o;27418:419::-;27584:4;27622:2;27611:9;27607:18;27599:26;;27671:9;27665:4;27661:20;27657:1;27646:9;27642:17;27635:47;27699:131;27825:4;27699:131;:::i;:::-;27691:139;;27418:419;;;:::o;27843:181::-;27983:33;27979:1;27971:6;27967:14;27960:57;27843:181;:::o;28030:366::-;28172:3;28193:67;28257:2;28252:3;28193:67;:::i;:::-;28186:74;;28269:93;28358:3;28269:93;:::i;:::-;28387:2;28382:3;28378:12;28371:19;;28030:366;;;:::o;28402:419::-;28568:4;28606:2;28595:9;28591:18;28583:26;;28655:9;28649:4;28645:20;28641:1;28630:9;28626:17;28619:47;28683:131;28809:4;28683:131;:::i;:::-;28675:139;;28402:419;;;:::o;28827:225::-;28967:34;28963:1;28955:6;28951:14;28944:58;29036:8;29031:2;29023:6;29019:15;29012:33;28827:225;:::o;29058:366::-;29200:3;29221:67;29285:2;29280:3;29221:67;:::i;:::-;29214:74;;29297:93;29386:3;29297:93;:::i;:::-;29415:2;29410:3;29406:12;29399:19;;29058:366;;;:::o;29430:419::-;29596:4;29634:2;29623:9;29619:18;29611:26;;29683:9;29677:4;29673:20;29669:1;29658:9;29654:17;29647:47;29711:131;29837:4;29711:131;:::i;:::-;29703:139;;29430:419;;;:::o;29855:191::-;29895:3;29914:20;29932:1;29914:20;:::i;:::-;29909:25;;29948:20;29966:1;29948:20;:::i;:::-;29943:25;;29991:1;29988;29984:9;29977:16;;30012:3;30009:1;30006:10;30003:36;;;30019:18;;:::i;:::-;30003:36;29855:191;;;;:::o;30052:332::-;30173:4;30211:2;30200:9;30196:18;30188:26;;30224:71;30292:1;30281:9;30277:17;30268:6;30224:71;:::i;:::-;30305:72;30373:2;30362:9;30358:18;30349:6;30305:72;:::i;:::-;30052:332;;;;;:::o;30390:141::-;30439:4;30462:3;30454:11;;30485:3;30482:1;30475:14;30519:4;30516:1;30506:18;30498:26;;30390:141;;;:::o;30537:93::-;30574:6;30621:2;30616;30609:5;30605:14;30601:23;30591:33;;30537:93;;;:::o;30636:107::-;30680:8;30730:5;30724:4;30720:16;30699:37;;30636:107;;;;:::o;30749:393::-;30818:6;30868:1;30856:10;30852:18;30891:97;30921:66;30910:9;30891:97;:::i;:::-;31009:39;31039:8;31028:9;31009:39;:::i;:::-;30997:51;;31081:4;31077:9;31070:5;31066:21;31057:30;;31130:4;31120:8;31116:19;31109:5;31106:30;31096:40;;30825:317;;30749:393;;;;;:::o;31148:60::-;31176:3;31197:5;31190:12;;31148:60;;;:::o;31214:142::-;31264:9;31297:53;31315:34;31324:24;31342:5;31324:24;:::i;:::-;31315:34;:::i;:::-;31297:53;:::i;:::-;31284:66;;31214:142;;;:::o;31362:75::-;31405:3;31426:5;31419:12;;31362:75;;;:::o;31443:269::-;31553:39;31584:7;31553:39;:::i;:::-;31614:91;31663:41;31687:16;31663:41;:::i;:::-;31655:6;31648:4;31642:11;31614:91;:::i;:::-;31608:4;31601:105;31519:193;31443:269;;;:::o;31718:73::-;31763:3;31718:73;:::o;31797:189::-;31874:32;;:::i;:::-;31915:65;31973:6;31965;31959:4;31915:65;:::i;:::-;31850:136;31797:189;;:::o;31992:186::-;32052:120;32069:3;32062:5;32059:14;32052:120;;;32123:39;32160:1;32153:5;32123:39;:::i;:::-;32096:1;32089:5;32085:13;32076:22;;32052:120;;;31992:186;;:::o;32184:543::-;32285:2;32280:3;32277:11;32274:446;;;32319:38;32351:5;32319:38;:::i;:::-;32403:29;32421:10;32403:29;:::i;:::-;32393:8;32389:44;32586:2;32574:10;32571:18;32568:49;;;32607:8;32592:23;;32568:49;32630:80;32686:22;32704:3;32686:22;:::i;:::-;32676:8;32672:37;32659:11;32630:80;:::i;:::-;32289:431;;32274:446;32184:543;;;:::o;32733:117::-;32787:8;32837:5;32831:4;32827:16;32806:37;;32733:117;;;;:::o;32856:169::-;32900:6;32933:51;32981:1;32977:6;32969:5;32966:1;32962:13;32933:51;:::i;:::-;32929:56;33014:4;33008;33004:15;32994:25;;32907:118;32856:169;;;;:::o;33030:295::-;33106:4;33252:29;33277:3;33271:4;33252:29;:::i;:::-;33244:37;;33314:3;33311:1;33307:11;33301:4;33298:21;33290:29;;33030:295;;;;:::o;33330:1395::-;33447:37;33480:3;33447:37;:::i;:::-;33549:18;33541:6;33538:30;33535:56;;;33571:18;;:::i;:::-;33535:56;33615:38;33647:4;33641:11;33615:38;:::i;:::-;33700:67;33760:6;33752;33746:4;33700:67;:::i;:::-;33794:1;33818:4;33805:17;;33850:2;33842:6;33839:14;33867:1;33862:618;;;;34524:1;34541:6;34538:77;;;34590:9;34585:3;34581:19;34575:26;34566:35;;34538:77;34641:67;34701:6;34694:5;34641:67;:::i;:::-;34635:4;34628:81;34497:222;33832:887;;33862:618;33914:4;33910:9;33902:6;33898:22;33948:37;33980:4;33948:37;:::i;:::-;34007:1;34021:208;34035:7;34032:1;34029:14;34021:208;;;34114:9;34109:3;34105:19;34099:26;34091:6;34084:42;34165:1;34157:6;34153:14;34143:24;;34212:2;34201:9;34197:18;34184:31;;34058:4;34055:1;34051:12;34046:17;;34021:208;;;34257:6;34248:7;34245:19;34242:179;;;34315:9;34310:3;34306:19;34300:26;34358:48;34400:4;34392:6;34388:17;34377:9;34358:48;:::i;:::-;34350:6;34343:64;34265:156;34242:179;34467:1;34463;34455:6;34451:14;34447:22;34441:4;34434:36;33869:611;;;33832:887;;33422:1303;;;33330:1395;;:::o;34731:442::-;34880:4;34918:2;34907:9;34903:18;34895:26;;34931:71;34999:1;34988:9;34984:17;34975:6;34931:71;:::i;:::-;35012:72;35080:2;35069:9;35065:18;35056:6;35012:72;:::i;:::-;35094;35162:2;35151:9;35147:18;35138:6;35094:72;:::i;:::-;34731:442;;;;;;:::o;35179:332::-;35300:4;35338:2;35327:9;35323:18;35315:26;;35351:71;35419:1;35408:9;35404:17;35395:6;35351:71;:::i;:::-;35432:72;35500:2;35489:9;35485:18;35476:6;35432:72;:::i;:::-;35179:332;;;;;:::o;35517:98::-;35568:6;35602:5;35596:12;35586:22;;35517:98;;;:::o;35621:147::-;35722:11;35759:3;35744:18;;35621:147;;;;:::o;35774:386::-;35878:3;35906:38;35938:5;35906:38;:::i;:::-;35960:88;36041:6;36036:3;35960:88;:::i;:::-;35953:95;;36057:65;36115:6;36110:3;36103:4;36096:5;36092:16;36057:65;:::i;:::-;36147:6;36142:3;36138:16;36131:23;;35882:278;35774:386;;;;:::o;36166:271::-;36296:3;36318:93;36407:3;36398:6;36318:93;:::i;:::-;36311:100;;36428:3;36421:10;;36166:271;;;;:::o
Swarm Source
ipfs://dbe0283ab2ed013ec062d2029ad67ebaf43202ad6c80812cd179a077592af84f
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.