Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 36 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Build Dough V2Ds... | 19996128 | 58 days ago | IN | 0 ETH | 0.01643271 | ||||
Build Dough V2Ds... | 19820847 | 82 days ago | IN | 0 ETH | 0.01454421 | ||||
Build Dough V2Ds... | 19819246 | 82 days ago | IN | 0 ETH | 0.02473433 | ||||
Build Dough V2Ds... | 19707617 | 98 days ago | IN | 0 ETH | 0.01557538 | ||||
Transfer Ownersh... | 19008603 | 196 days ago | IN | 0 ETH | 0.00053513 | ||||
Set Repay Fee | 18696376 | 240 days ago | IN | 0 ETH | 0.00067688 | ||||
Set Withdraw Fee | 18696374 | 240 days ago | IN | 0 ETH | 0.00064964 | ||||
Build Dough V2Ds... | 18673423 | 243 days ago | IN | 0 ETH | 0.07185018 | ||||
Set Repay Fee | 18670064 | 244 days ago | IN | 0 ETH | 0.00122149 | ||||
Set Withdraw Fee | 18670060 | 244 days ago | IN | 0 ETH | 0.00120446 | ||||
Build Dough V2Ds... | 18661821 | 245 days ago | IN | 0 ETH | 0.05996343 | ||||
Set Withdraw Fee | 18659517 | 245 days ago | IN | 0 ETH | 0.00058482 | ||||
Set Supply Fee | 18659516 | 245 days ago | IN | 0 ETH | 0.00061578 | ||||
Set Shield Fee | 18659515 | 245 days ago | IN | 0 ETH | 0.00059806 | ||||
Set Repay Fee | 18659513 | 245 days ago | IN | 0 ETH | 0.00062713 | ||||
Set Flashloan Fe... | 18659512 | 245 days ago | IN | 0 ETH | 0.00061955 | ||||
Set Borrow Fee | 18659510 | 245 days ago | IN | 0 ETH | 0.00063958 | ||||
Build Dough V2Ds... | 18658792 | 245 days ago | IN | 0 ETH | 0.0560557 | ||||
Build Dough V2Ds... | 18658045 | 245 days ago | IN | 0 ETH | 0.06316516 | ||||
Build Dough V2Ds... | 18656312 | 245 days ago | IN | 0 ETH | 0.06755247 | ||||
Build Dough V2Ds... | 18656182 | 245 days ago | IN | 0 ETH | 0.05462762 | ||||
Build Dough V2Ds... | 18653211 | 246 days ago | IN | 0 ETH | 0.04264728 | ||||
Set Withdraw Fee | 18652641 | 246 days ago | IN | 0 ETH | 0.00144127 | ||||
Set Supply Fee | 18652639 | 246 days ago | IN | 0 ETH | 0.00136687 | ||||
Set Repay Fee | 18652638 | 246 days ago | IN | 0 ETH | 0.00137124 |
Latest 16 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
19996128 | 58 days ago | Contract Creation | 0 ETH | |||
19820847 | 82 days ago | Contract Creation | 0 ETH | |||
19819246 | 82 days ago | Contract Creation | 0 ETH | |||
19707617 | 98 days ago | Contract Creation | 0 ETH | |||
18673423 | 243 days ago | Contract Creation | 0 ETH | |||
18661821 | 245 days ago | Contract Creation | 0 ETH | |||
18658792 | 245 days ago | Contract Creation | 0 ETH | |||
18658045 | 245 days ago | Contract Creation | 0 ETH | |||
18656312 | 245 days ago | Contract Creation | 0 ETH | |||
18656182 | 245 days ago | Contract Creation | 0 ETH | |||
18653211 | 246 days ago | Contract Creation | 0 ETH | |||
18652628 | 246 days ago | Contract Creation | 0 ETH | |||
18638917 | 248 days ago | Contract Creation | 0 ETH | |||
18627966 | 249 days ago | Contract Creation | 0 ETH | |||
18619162 | 251 days ago | Contract Creation | 0 ETH | |||
18618008 | 251 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
DoughV2Index
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import "./DoughV2Dsa.sol"; import {CustomError} from "./Interfaces.sol"; contract DoughV2Index is Ownable { using Address for address; using SafeERC20 for IERC20; /* ========== CONSTANTS ========== */ address private constant _DEAD_ADDRESS = address(0x000000000000000000000000000000000000dEaD); IAaveV3Pool private constant _I_AAVE_V3_POOL = IAaveV3Pool(0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2); /* ========== STATE VARIABLES ========== */ address public treasury = address(0); address public shieldExecutor = address(0); uint256 public supplyFee = 0; // 0 % uint256 public withdrawFee = 0; // 0 % uint256 public borrowFee = 0; // 0 % uint256 public repayFee = 0; // 0 % uint256 public flashloanFee = 100; // 1 % uint256 public shieldFee = 500; // 5 % uint256 public shieldSupplyLimit = 15000; // $ 15000 mapping(address => address) private _doughV2DsaList; mapping(uint256 => address) private _connectors; struct ShieldInfo { uint256 hfTrigger; uint256 hfTarget; address prevShieldDsa; address nextShieldDsa; } uint256 public shieldDsaCnt = 0; address public shieldFirstDsa = address(0); address public shieldLastDsa = address(0); mapping(address => ShieldInfo) private _shieldDsa; /* ========== CONSTRUCTOR ========== */ constructor(address _treasury) { if (_treasury == address(0)) revert CustomError("invalid address"); treasury = _treasury; } /* ========== VIEWS ========== */ function getDoughV2Dsa(address _user) external view returns (address) { return _doughV2DsaList[_user]; } function getDoughV2Connector(uint256 _connectorId) external view returns (address) { return _connectors[_connectorId]; } function getShieldInfo(address dsa) external view returns (uint256, uint256, address, address) { return (_shieldDsa[dsa].hfTarget, _shieldDsa[dsa].hfTrigger, _shieldDsa[dsa].prevShieldDsa, _shieldDsa[dsa].nextShieldDsa); } /* ========== MUTATIVE FUNCTIONS ========== */ function withdrawToken(address _tokenAddr, uint256 _amount) external onlyOwner { if (_amount == 0) revert CustomError("must be greater than zero"); uint256 balanceOfToken = IERC20(_tokenAddr).balanceOf(address(this)); uint256 transAmount = _amount; if (_amount > balanceOfToken) { transAmount = balanceOfToken; } IERC20(_tokenAddr).safeTransfer(owner(), transAmount); } function setTreasury(address _treasury) external onlyOwner { if (_treasury == _DEAD_ADDRESS || _treasury == address(0)) revert CustomError("treasury account error"); treasury = _treasury; } function setShieldExecutor(address _shieldExecutor) external onlyOwner { if (_shieldExecutor == _DEAD_ADDRESS || _shieldExecutor == address(0)) revert CustomError("shieldExecutor account error"); if (_shieldExecutor == address(0)) revert CustomError("_shieldExecutor is zero_address"); if (_shieldExecutor == _DEAD_ADDRESS) revert CustomError("_shieldExecutor is zero_address"); shieldExecutor = _shieldExecutor; } function setSupplyFee(uint256 _supplyFee) external onlyOwner { // _supplyFee <= 5% if (_supplyFee > 500) revert CustomError("invaid value"); supplyFee = _supplyFee; } function setWithdrawFee(uint256 _withdrawFee) external onlyOwner { // _withdrawFee <= 5% if (_withdrawFee > 500) revert CustomError("invaid value"); withdrawFee = _withdrawFee; } function setBorrowFee(uint256 _borrowFee) external onlyOwner { // _borrowFee <= 5% if (_borrowFee > 500) revert CustomError("invaid value"); borrowFee = _borrowFee; } function setRepayFee(uint256 _repayFee) external onlyOwner { // _repayFee <= 5% if (_repayFee > 500) revert CustomError("invaid value"); repayFee = _repayFee; } function setFlashloanFee(uint256 _flashloanFee) external onlyOwner { // _flashloanFee <= 5% if (_flashloanFee > 500) revert CustomError("invaid value"); flashloanFee = _flashloanFee; } function setShieldFee(uint256 _shieldFee) external onlyOwner { // _shieldFee <= 10% if (_shieldFee > 1000) revert CustomError("invaid value"); shieldFee = _shieldFee; } function setShieldSupplyLimit(uint256 _shieldSupplyLimit) external onlyOwner { if (_shieldSupplyLimit == 0) revert CustomError("must be greater than zero."); shieldSupplyLimit = _shieldSupplyLimit; } function setConnectors(uint256 _connectorId, address _connectorsAddr) external onlyOwner { if (_connectorsAddr == address(0)) revert CustomError("addConnectors: _connectors address not vaild"); _connectors[_connectorId] = _connectorsAddr; } function buildDoughV2Dsa() external returns (address) { if (_doughV2DsaList[msg.sender] != address(0)) revert CustomError("created already"); DoughV2Dsa newDoughV2Dsa = new DoughV2Dsa(msg.sender, address(this)); _doughV2DsaList[msg.sender] = address(newDoughV2Dsa); return address(newDoughV2Dsa); } function setShield(uint256 _hfTrigger, uint256 _hfTarget) external { address dsa = _doughV2DsaList[msg.sender]; if (dsa == address(0)) revert CustomError("doughV2Index: uncreated dsa"); if (_hfTrigger <= 1e18) revert CustomError("Shield: wrong trigger value of health factor"); if (_hfTrigger >= _hfTarget) revert CustomError("Shield: wrong target value of health factor"); (uint256 totalCollateralBase, , , , , ) = _I_AAVE_V3_POOL.getUserAccountData(dsa); if (totalCollateralBase < shieldSupplyLimit * 1e8) revert CustomError("Shield: supply amount < shieldSupplyLimit"); ShieldInfo storage _refShieldDsa = _shieldDsa[dsa]; if (shieldDsaCnt == 0) { shieldFirstDsa = dsa; shieldLastDsa = dsa; _refShieldDsa.prevShieldDsa = address(1); _refShieldDsa.nextShieldDsa = address(2); shieldDsaCnt++; } else { if (_refShieldDsa.hfTrigger == 0) { _shieldDsa[shieldLastDsa].nextShieldDsa = dsa; _refShieldDsa.prevShieldDsa = shieldLastDsa; _refShieldDsa.nextShieldDsa = address(2); shieldLastDsa = dsa; shieldDsaCnt++; } } _refShieldDsa.hfTarget = _hfTarget; _refShieldDsa.hfTrigger = _hfTrigger; } function unsetShield() external { address dsa = _doughV2DsaList[msg.sender]; if (dsa == address(0)) revert CustomError("doughV2Index: uncreated dsa"); if (shieldDsaCnt == 0) revert CustomError("doughV2Index: empty list"); ShieldInfo storage _refShieldDsa = _shieldDsa[dsa]; if (_refShieldDsa.hfTrigger <= 1e18) revert CustomError("doughV2Index: already unset"); if (shieldDsaCnt == 1) { shieldFirstDsa = address(0); shieldLastDsa = address(0); } else { if (dsa == shieldLastDsa) { _shieldDsa[_refShieldDsa.prevShieldDsa].nextShieldDsa = address(2); shieldLastDsa = _refShieldDsa.prevShieldDsa; } else if (dsa == shieldFirstDsa) { _shieldDsa[_refShieldDsa.nextShieldDsa].prevShieldDsa = address(1); shieldFirstDsa = _refShieldDsa.nextShieldDsa; } else { _shieldDsa[_refShieldDsa.prevShieldDsa].nextShieldDsa = _refShieldDsa.nextShieldDsa; _shieldDsa[_refShieldDsa.nextShieldDsa].prevShieldDsa = _refShieldDsa.prevShieldDsa; } _refShieldDsa.hfTrigger = 0; _refShieldDsa.hfTarget = 0; _refShieldDsa.prevShieldDsa = address(0); _refShieldDsa.nextShieldDsa = address(0); } shieldDsaCnt--; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. */ 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]. */ 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); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; import "../IERC20.sol"; import "../extensions/IERC20Permit.sol"; import "../../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol"; import {IWETH, IDoughV2Index, IAaveV3Pool, IAaveV3DataProvider, CustomError} from "./Interfaces.sol"; contract DoughV2Dsa { using SafeERC20 for IERC20; /* ========== Layout ========== */ address public owner; address public doughV2Index = address(0); /* ========== Constant ========== */ address private constant _WETH = address(0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2); address private constant _USDC = address(0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48); IAaveV3Pool private constant _I_AAVE_V3_POOL = IAaveV3Pool(0x87870Bca3F3fD6335C3F4ce8392D69350B4fA4E2); IAaveV3DataProvider private constant _I_AAVE_V3_DATA_PROVIDER = IAaveV3DataProvider(0x7B4EB56E7CD4b454BA8ff71E4518426369a138a3); /* ========== CONSTRUCTOR ========== */ constructor(address _owner, address _doughV2Index) { if (_owner == address(0)) revert CustomError("invalid owner"); if (_doughV2Index == address(0)) revert CustomError("invalid _doughV2Index"); owner = _owner; doughV2Index = _doughV2Index; } receive() external payable {} /* ========== DelegateCall ========== */ function doughCall(uint256 _connectorId, uint256 _actionId, address _token, uint256 _amount, bool _opt) external payable { if (_connectorId == 2) { (, , , , , uint256 _healthFactor) = _I_AAVE_V3_POOL.getUserAccountData(address(this)); (, uint256 _shieldDsaHfTrigger, , ) = IDoughV2Index(doughV2Index).getShieldInfo(address(this)); if (_healthFactor < _shieldDsaHfTrigger && _actionId == 1) { address shieldExecutor = IDoughV2Index(doughV2Index).shieldExecutor(); if (owner != msg.sender && shieldExecutor != msg.sender) revert CustomError("Ownable: caller is not the owner or Shield executor"); } else { if (owner != msg.sender) revert CustomError("Ownable: caller is not the owner"); } } else { if (owner != msg.sender) revert CustomError("Ownable: caller is not the owner"); } address _contract = IDoughV2Index(doughV2Index).getDoughV2Connector(_connectorId); if (_contract == address(0)) revert CustomError("doughCall: unregistered connector"); (bool success, bytes memory data) = _contract.delegatecall(abi.encodeWithSignature("delegateDoughCall(uint256,address,uint256,bool)", _actionId, _token, _amount, _opt)); if (!success) { if (data.length == 0) revert(); assembly { revert(add(32, data), mload(data)) } } } function executeAction(address tokenIn, uint256 inAmount, address tokenOut, uint256 outAmount, uint256 funcId) external { // get connectorV2Flashloan address address _connectorV2Flashloan = IDoughV2Index(doughV2Index).getDoughV2Connector(2); if (_connectorV2Flashloan == address(0)) revert CustomError("doughV2Dsa: executeAction : unregistered connectorV2Flashloan"); if (msg.sender != _connectorV2Flashloan) revert CustomError("wrong doughFlashloan"); // Loop: funcId = 0 , DeLoop: funcId = 1; Switch: funcId = 2; if (funcId > 2) revert CustomError("flashloanReq : invalid-id"); IERC20(tokenIn).safeTransferFrom(_connectorV2Flashloan, address(this), inAmount); IERC20(tokenIn).approve(address(_I_AAVE_V3_POOL), inAmount); if (funcId == 0) { // Loop _I_AAVE_V3_POOL.supply(tokenIn, inAmount, address(this), 0); _I_AAVE_V3_POOL.borrow(tokenOut, outAmount, 2, 0, address(this)); // Check Health Factor (, , , , , uint256 _healthFactor) = _I_AAVE_V3_POOL.getUserAccountData(address(this)); (, uint256 _shieldDsaHfTrigger, , ) = IDoughV2Index(doughV2Index).getShieldInfo(address(this)); if (_healthFactor <= _shieldDsaHfTrigger) revert CustomError("error: HealthFactor <= hfTrigger"); } else if (funcId == 1) { // Deloop if (tokenIn == _USDC && tokenOut == _USDC) { _I_AAVE_V3_POOL.repay(_USDC, inAmount, 2, address(this)); _I_AAVE_V3_POOL.withdraw(_USDC, outAmount, address(this)); } else if (tokenIn == _USDC && tokenOut == _WETH) { _I_AAVE_V3_POOL.repay(_USDC, inAmount, 2, address(this)); // get USDC Position (uint256 currentATokenBalance, , , , , , , , ) = _I_AAVE_V3_DATA_PROVIDER.getUserReserveData(_USDC, address(this)); if (currentATokenBalance > 0) { _I_AAVE_V3_POOL.withdraw(_USDC, currentATokenBalance, address(this)); IERC20(_USDC).approve(_connectorV2Flashloan, currentATokenBalance); } _I_AAVE_V3_POOL.withdraw(_WETH, outAmount, address(this)); } } else { // Switch _I_AAVE_V3_POOL.supply(tokenIn, inAmount, address(this), 0); _I_AAVE_V3_POOL.withdraw(tokenOut, outAmount, address(this)); } IERC20(tokenOut).approve(_connectorV2Flashloan, outAmount); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.10; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; // custom errors error CustomError(string errorMsg); // interfaces interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint amount) external; } interface IDoughV2Index { function owner() external view returns (address); function treasury() external view returns (address); function shieldExecutor() external view returns (address); function supplyFee() external view returns (uint256); function withdrawFee() external view returns (uint256); function borrowFee() external view returns (uint256); function repayFee() external view returns (uint256); function flashloanFee() external view returns (uint256); function shieldFee() external view returns (uint256); function getShieldInfo(address dsa) external view returns (uint256, uint256, address, address); function getDoughV2Connector(uint256 _connectorId) external view returns (address); } interface IDoughV2Dsa { function doughV2Index() external view returns (address); function executeAction(address tokenIn, uint256 inAmount, address tokenOut, uint256 outAmount, uint256 funcId) external; } interface IAaveV3DataProvider { function getUserReserveData( address asset, address user ) external view returns (uint256 currentATokenBalance, uint256 currentStableDebt, uint256 currentVariableDebt, uint256 principalStableDebt, uint256 scaledVariableDebt, uint256 stableBorrowRate, uint256 liquidityRate, uint40 stableRateLastUpdated, bool usageAsCollateralEnabled); } interface IAaveV3Pool { function FLASHLOAN_PREMIUM_TOTAL() external view returns (uint128); function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor); function supply(address asset, uint256 amount, address onBehalfOf, uint16 referralCode) external; function withdraw(address asset, uint256 amount, address to) external; function borrow(address asset, uint256 amount, uint256 interestRateMode, uint16 referralCode, address onBehalfOf) external; function repay(address asset, uint256 amount, uint256 interestRateMode, address onBehalfOf) external returns (uint256); } interface IConnectorV2Flashloan { function flashloanReq(address _loanToken, uint256 _loanAmount, uint256 _funcId, bool _isShield) external; } interface IUniswapV2Router { function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"string","name":"errorMsg","type":"string"}],"name":"CustomError","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"borrowFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buildDoughV2Dsa","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flashloanFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_connectorId","type":"uint256"}],"name":"getDoughV2Connector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getDoughV2Dsa","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"dsa","type":"address"}],"name":"getShieldInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"repayFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_borrowFee","type":"uint256"}],"name":"setBorrowFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_connectorId","type":"uint256"},{"internalType":"address","name":"_connectorsAddr","type":"address"}],"name":"setConnectors","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_flashloanFee","type":"uint256"}],"name":"setFlashloanFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_repayFee","type":"uint256"}],"name":"setRepayFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_hfTrigger","type":"uint256"},{"internalType":"uint256","name":"_hfTarget","type":"uint256"}],"name":"setShield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_shieldExecutor","type":"address"}],"name":"setShieldExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shieldFee","type":"uint256"}],"name":"setShieldFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shieldSupplyLimit","type":"uint256"}],"name":"setShieldSupplyLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_supplyFee","type":"uint256"}],"name":"setSupplyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawFee","type":"uint256"}],"name":"setWithdrawFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"shieldDsaCnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shieldExecutor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shieldFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shieldFirstDsa","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shieldLastDsa","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"shieldSupplyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"supplyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unsetShield","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600060035560006004556000600555600060065560646007556101f4600855613a986009556000600c556000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200014357600080fd5b50604051620061343803806200613483398181016040528101906200016991906200037a565b620001896200017d6200024460201b60201c565b6200024c60201b60201c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620001fc576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620001f3906200040d565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200042f565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003428262000315565b9050919050565b620003548162000335565b81146200036057600080fd5b50565b600081519050620003748162000349565b92915050565b60006020828403121562000393576200039262000310565b5b6000620003a38482850162000363565b91505092915050565b600082825260208201905092915050565b7f696e76616c696420616464726573730000000000000000000000000000000000600082015250565b6000620003f5600f83620003ac565b91506200040282620003bd565b602082019050919050565b600060208201905081810360008301526200042881620003e6565b9050919050565b615cf5806200043f6000396000f3fe60806040523480156200001157600080fd5b5060043610620002205760003560e01c80637bfae10a1162000129578063b6ac642a11620000b1578063e941fa78116200007b578063e941fa7814620005dc578063f0f4426014620005fe578063f2fde38b146200061e578063fb978a8a146200063e5762000220565b8063b6ac642a1462000544578063c869adb41462000564578063c9994b431462000584578063e626648a14620005ba5762000220565b806397440c2411620000f357806397440c2414620004a95780639e281a9814620004c9578063a34f1c4c14620004e9578063ad3efcdf146200050b5762000220565b80637bfae10a14620004395780637c0f59f414620004595780638d006e9f146200047b5780638da5cb5b14620004875762000220565b8063413ca0aa11620001ad5780635ba0f6e811620001775780635ba0f6e814620003c757806361d027b314620003e9578063715018a6146200040b57806371744d7f14620004175762000220565b8063413ca0aa146200032f5780634255b1d9146200034f5780634e1b6fa9146200036f5780635350b7de14620003915762000220565b80631c08c65411620001ef5780631c08c65414620002ab5780631fddabfb14620002cd5780632683fc0e14620002ed578063311f463f146200030f5762000220565b806301c3779014620002255780630b38b9581462000247578063157c81b914620002695780631723f6011462000289575b600080fd5b6200022f6200065e565b6040516200023e9190620024ac565b60405180910390f35b6200025162000664565b604051620002609190620024ac565b60405180910390f35b620002876004803603810190620002819190620024ff565b6200066a565b005b62000293620006c6565b604051620002a2919062002576565b60405180910390f35b620002b5620006ec565b604051620002c4919062002576565b60405180910390f35b620002eb6004803603810190620002e59190620024ff565b62000712565b005b620002f76200076e565b60405162000306919062002576565b60405180910390f35b6200032d6004803603810190620003279190620024ff565b62000904565b005b6200034d6004803603810190620003479190620025c4565b62000960565b005b6200036d6004803603810190620003679190620025f6565b62000b41565b005b6200037962000c14565b604051620003889190620024ac565b60405180910390f35b620003af6004803603810190620003a99190620024ff565b62000c1a565b604051620003be919062002576565b60405180910390f35b620003d162000c57565b604051620003e09190620024ac565b60405180910390f35b620003f362000c5d565b60405162000402919062002576565b60405180910390f35b6200041562000c83565b005b6200042162000c9b565b604051620004309190620024ac565b60405180910390f35b620004576004803603810190620004519190620024ff565b62000ca1565b005b6200046362000cfc565b604051620004729190620024ac565b60405180910390f35b6200048562000d02565b005b620004916200146b565b604051620004a0919062002576565b60405180910390f35b620004c76004803603810190620004c19190620024ff565b62001494565b005b620004e76004803603810190620004e191906200263d565b620014f0565b005b620004f362001612565b60405162000502919062002576565b60405180910390f35b620005296004803603810190620005239190620025c4565b62001638565b6040516200053b949392919062002684565b60405180910390f35b6200056260048036038101906200055c9190620024ff565b62001799565b005b6200058260048036038101906200057c9190620024ff565b620017f5565b005b620005a260048036038101906200059c9190620025c4565b62001851565b604051620005b1919062002576565b60405180910390f35b620005c4620018ba565b604051620005d39190620024ac565b60405180910390f35b620005e6620018c0565b604051620005f59190620024ac565b60405180910390f35b6200061c6004803603810190620006169190620025c4565b620018c6565b005b6200063c6004803603810190620006369190620025c4565b620019c0565b005b6200065c6004803603810190620006569190620026d1565b62001a4b565b005b60085481565b60035481565b6200067462001ff2565b6101f4811115620006bc576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620006b39062002779565b60405180910390fd5b8060068190555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6200071c62001ff2565b6101f481111562000764576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016200075b9062002779565b60405180910390fd5b8060038190555050565b60008073ffffffffffffffffffffffffffffffffffffffff16600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000840576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016200083790620027eb565b60405180910390fd5b60003330604051620008529062002483565b6200085f9291906200280d565b604051809103906000f0801580156200087c573d6000803e3d6000fd5b50905080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508091505090565b6200090e62001ff2565b6101f481111562000956576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016200094d9062002779565b60405180910390fd5b8060078190555050565b6200096a62001ff2565b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480620009d35750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1562000a16576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000a0d906200288a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000a89576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000a8090620028fc565b60405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000afd576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000af490620028fc565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b62000b4b62001ff2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000bbe576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000bb59062002994565b60405180910390fd5b80600b600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600c5481565b6000600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b62000c8d62001ff2565b62000c99600062002077565b565b60095481565b62000cab62001ff2565b600081141562000cf2576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000ce99062002a06565b60405180910390fd5b8060098190555050565b60065481565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000dd9576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000dd09062002a78565b60405180910390fd5b6000600c54141562000e22576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000e199062002aea565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050670de0b6b3a764000081600001541162000eb6576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000ead9062002b5c565b60405180910390fd5b6001600c54141562000f4c576000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200144d565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620010b4576002600f60008360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620013b0565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200121c576001600f60008360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620013af565b8060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600081600001819055506000816001018190555060008160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600c6000815480929190620014629062002bad565b91905055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200149e62001ff2565b6103e8811115620014e6576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620014dd9062002779565b60405180910390fd5b8060088190555050565b620014fa62001ff2565b600081141562001541576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620015389062002c2c565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016200157e919062002576565b602060405180830381865afa1580156200159c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015c2919062002c65565b9050600082905081831115620015d6578190505b6200160c620015e46200146b565b828673ffffffffffffffffffffffffffffffffffffffff166200213b9092919063ffffffff16565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693509350935093509193509193565b620017a362001ff2565b6101f4811115620017eb576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620017e29062002779565b60405180910390fd5b8060048190555050565b620017ff62001ff2565b6101f481111562001847576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016200183e9062002779565b60405180910390fd5b8060058190555050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60055481565b60045481565b620018d062001ff2565b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480620019395750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156200197c576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620019739062002ce7565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620019ca62001ff2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a349062002d7f565b60405180910390fd5b62001a488162002077565b50565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562001b22576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162001b199062002a78565b60405180910390fd5b670de0b6b3a7640000831162001b6f576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162001b669062002e17565b60405180910390fd5b81831062001bb4576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162001bab9062002eaf565b60405180910390fd5b60007387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663bf92857c836040518263ffffffff1660e01b815260040162001c05919062002576565b60c060405180830381865afa15801562001c23573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c49919062002ed1565b505050505090506305f5e10060095462001c64919062002f6d565b81101562001ca9576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162001ca09062003044565b60405180910390fd5b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600c54141562001e225782600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c600081548092919062001e179062003066565b919050555062001fd9565b60008160000154141562001fd85782600f6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c600081548092919062001fd29062003066565b91905055505b5b8381600101819055508481600001819055505050505050565b62001ffc620021c5565b73ffffffffffffffffffffffffffffffffffffffff166200201c6200146b565b73ffffffffffffffffffffffffffffffffffffffff161462002075576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200206c9062003104565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620021c08363a9059cbb60e01b84846040516024016200215d92919062003126565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620021cd565b505050565b600033905090565b600062002231826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200229d9092919063ffffffff16565b90506000815114806200225657508080602001905181019062002255919062003190565b5b62002298576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200228f9062003238565b60405180910390fd5b505050565b6060620022ae8484600085620022b7565b90509392505050565b606082471015620022ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620022f690620032d0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200232a919062003375565b60006040518083038185875af1925050503d806000811462002369576040519150601f19603f3d011682016040523d82523d6000602084013e6200236e565b606091505b509150915062002381878383876200238d565b92505050949350505050565b60608315620023f857600083511415620023ef57620023ac856200240d565b620023ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620023e590620033de565b60405180910390fd5b5b82905062002405565b62002404838362002430565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115620024445781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200247a91906200345d565b60405180910390fd5b61283e806200348283390190565b6000819050919050565b620024a68162002491565b82525050565b6000602082019050620024c360008301846200249b565b92915050565b600080fd5b620024d98162002491565b8114620024e557600080fd5b50565b600081359050620024f981620024ce565b92915050565b600060208284031215620025185762002517620024c9565b5b60006200252884828501620024e8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200255e8262002531565b9050919050565b620025708162002551565b82525050565b60006020820190506200258d600083018462002565565b92915050565b6200259e8162002551565b8114620025aa57600080fd5b50565b600081359050620025be8162002593565b92915050565b600060208284031215620025dd57620025dc620024c9565b5b6000620025ed84828501620025ad565b91505092915050565b6000806040838503121562002610576200260f620024c9565b5b60006200262085828601620024e8565b92505060206200263385828601620025ad565b9150509250929050565b60008060408385031215620026575762002656620024c9565b5b60006200266785828601620025ad565b92505060206200267a85828601620024e8565b9150509250929050565b60006080820190506200269b60008301876200249b565b620026aa60208301866200249b565b620026b9604083018562002565565b620026c8606083018462002565565b95945050505050565b60008060408385031215620026eb57620026ea620024c9565b5b6000620026fb85828601620024e8565b92505060206200270e85828601620024e8565b9150509250929050565b600082825260208201905092915050565b7f696e766169642076616c75650000000000000000000000000000000000000000600082015250565b600062002761600c8362002718565b91506200276e8262002729565b602082019050919050565b60006020820190508181036000830152620027948162002752565b9050919050565b7f6372656174656420616c72656164790000000000000000000000000000000000600082015250565b6000620027d3600f8362002718565b9150620027e0826200279b565b602082019050919050565b600060208201905081810360008301526200280681620027c4565b9050919050565b600060408201905062002824600083018562002565565b62002833602083018462002565565b9392505050565b7f736869656c644578656375746f72206163636f756e74206572726f7200000000600082015250565b600062002872601c8362002718565b91506200287f826200283a565b602082019050919050565b60006020820190508181036000830152620028a58162002863565b9050919050565b7f5f736869656c644578656375746f72206973207a65726f5f6164647265737300600082015250565b6000620028e4601f8362002718565b9150620028f182620028ac565b602082019050919050565b600060208201905081810360008301526200291781620028d5565b9050919050565b7f616464436f6e6e6563746f72733a205f636f6e6e6563746f727320616464726560008201527f7373206e6f74207661696c640000000000000000000000000000000000000000602082015250565b60006200297c602c8362002718565b915062002989826200291e565b604082019050919050565b60006020820190508181036000830152620029af816200296d565b9050919050565b7f6d7573742062652067726561746572207468616e207a65726f2e000000000000600082015250565b6000620029ee601a8362002718565b9150620029fb82620029b6565b602082019050919050565b6000602082019050818103600083015262002a2181620029df565b9050919050565b7f646f7567685632496e6465783a20756e63726561746564206473610000000000600082015250565b600062002a60601b8362002718565b915062002a6d8262002a28565b602082019050919050565b6000602082019050818103600083015262002a938162002a51565b9050919050565b7f646f7567685632496e6465783a20656d707479206c6973740000000000000000600082015250565b600062002ad260188362002718565b915062002adf8262002a9a565b602082019050919050565b6000602082019050818103600083015262002b058162002ac3565b9050919050565b7f646f7567685632496e6465783a20616c726561647920756e7365740000000000600082015250565b600062002b44601b8362002718565b915062002b518262002b0c565b602082019050919050565b6000602082019050818103600083015262002b778162002b35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062002bba8262002491565b9150600082141562002bd15762002bd062002b7e565b5b600182039050919050565b7f6d7573742062652067726561746572207468616e207a65726f00000000000000600082015250565b600062002c1460198362002718565b915062002c218262002bdc565b602082019050919050565b6000602082019050818103600083015262002c478162002c05565b9050919050565b60008151905062002c5f81620024ce565b92915050565b60006020828403121562002c7e5762002c7d620024c9565b5b600062002c8e8482850162002c4e565b91505092915050565b7f7472656173757279206163636f756e74206572726f7200000000000000000000600082015250565b600062002ccf60168362002718565b915062002cdc8262002c97565b602082019050919050565b6000602082019050818103600083015262002d028162002cc0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062002d6760268362002718565b915062002d748262002d09565b604082019050919050565b6000602082019050818103600083015262002d9a8162002d58565b9050919050565b7f536869656c643a2077726f6e6720747269676765722076616c7565206f66206860008201527f65616c746820666163746f720000000000000000000000000000000000000000602082015250565b600062002dff602c8362002718565b915062002e0c8262002da1565b604082019050919050565b6000602082019050818103600083015262002e328162002df0565b9050919050565b7f536869656c643a2077726f6e67207461726765742076616c7565206f6620686560008201527f616c746820666163746f72000000000000000000000000000000000000000000602082015250565b600062002e97602b8362002718565b915062002ea48262002e39565b604082019050919050565b6000602082019050818103600083015262002eca8162002e88565b9050919050565b60008060008060008060c0878903121562002ef15762002ef0620024c9565b5b600062002f0189828a0162002c4e565b965050602062002f1489828a0162002c4e565b955050604062002f2789828a0162002c4e565b945050606062002f3a89828a0162002c4e565b935050608062002f4d89828a0162002c4e565b92505060a062002f6089828a0162002c4e565b9150509295509295509295565b600062002f7a8262002491565b915062002f878362002491565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562002fc35762002fc262002b7e565b5b828202905092915050565b7f536869656c643a20737570706c7920616d6f756e74203c20736869656c64537560008201527f70706c794c696d69740000000000000000000000000000000000000000000000602082015250565b60006200302c60298362002718565b9150620030398262002fce565b604082019050919050565b600060208201905081810360008301526200305f816200301d565b9050919050565b6000620030738262002491565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620030a957620030a862002b7e565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620030ec60208362002718565b9150620030f982620030b4565b602082019050919050565b600060208201905081810360008301526200311f81620030dd565b9050919050565b60006040820190506200313d600083018562002565565b6200314c60208301846200249b565b9392505050565b60008115159050919050565b6200316a8162003153565b81146200317657600080fd5b50565b6000815190506200318a816200315f565b92915050565b600060208284031215620031a957620031a8620024c9565b5b6000620031b98482850162003179565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600062003220602a8362002718565b91506200322d82620031c2565b604082019050919050565b60006020820190508181036000830152620032538162003211565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000620032b860268362002718565b9150620032c5826200325a565b604082019050919050565b60006020820190508181036000830152620032eb81620032a9565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015620033285780820151818401526020810190506200330b565b8381111562003338576000848401525b50505050565b60006200334b82620032f2565b620033578185620032fd565b93506200336981856020860162003308565b80840191505092915050565b60006200338382846200333e565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000620033c6601d8362002718565b9150620033d3826200338e565b602082019050919050565b60006020820190508181036000830152620033f981620033b7565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b6000620034298262003400565b62003435818562002718565b93506200344781856020860162003308565b62003452816200340b565b840191505092915050565b600060208201905081810360008301526200347981846200341c565b90509291505056fe60806040526000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b506040516200283e3803806200283e833981810160405281019062000079919062000252565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620000ec576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620000e390620002fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200015f576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000156906200036c565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200038e565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200021a82620001ed565b9050919050565b6200022c816200020d565b81146200023857600080fd5b50565b6000815190506200024c8162000221565b92915050565b600080604083850312156200026c576200026b620001e8565b5b60006200027c858286016200023b565b92505060206200028f858286016200023b565b9150509250929050565b600082825260208201905092915050565b7f696e76616c6964206f776e657200000000000000000000000000000000000000600082015250565b6000620002e2600d8362000299565b9150620002ef82620002aa565b602082019050919050565b600060208201905081810360008301526200031581620002d3565b9050919050565b7f696e76616c6964205f646f7567685632496e6465780000000000000000000000600082015250565b60006200035460158362000299565b915062000361826200031c565b602082019050919050565b60006020820190508181036000830152620003878162000345565b9050919050565b6124a0806200039e6000396000f3fe6080604052600436106100435760003560e01c806304078e951461004f5780638da5cb5b14610078578063a69b6a76146100a3578063d80e95a8146100ce5761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b5061007660048036038101906100719190611758565b6100ea565b005b34801561008457600080fd5b5061008d610d41565b60405161009a91906117e2565b60405180910390f35b3480156100af57600080fd5b506100b8610d65565b6040516100c591906117e2565b60405180910390f35b6100e860048036038101906100e39190611835565b610d8b565b005b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635350b7de60026040518263ffffffff1660e01b815260040161014891906118f5565b602060405180830381865afa158015610165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101899190611925565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156101fb576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016101f2906119d5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610269576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040161026090611a41565b60405180910390fd5b60028211156102ad576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016102a490611aad565b60405180910390fd5b6102da8130878973ffffffffffffffffffffffffffffffffffffffff166113a0909392919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff1663095ea7b37387870bca3f3fd6335c3f4ce8392d69350b4fa4e2876040518363ffffffff1660e01b8152600401610329929190611adc565b6020604051808303816000875af1158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611b1a565b506000821415610608577387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663617ba03787873060006040518563ffffffff1660e01b81526004016103ca9493929190611b90565b600060405180830381600087803b1580156103e457600080fd5b505af11580156103f8573d6000803e3d6000fd5b505050507387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663a415bcad858560026000306040518663ffffffff1660e01b8152600401610453959493929190611bd5565b600060405180830381600087803b15801561046d57600080fd5b505af1158015610481573d6000803e3d6000fd5b5050505060007387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663bf92857c306040518263ffffffff1660e01b81526004016104d491906117e2565b60c060405180830381865afa1580156104f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105159190611c3d565b955050505050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad3efcdf306040518263ffffffff1660e01b815260040161057991906117e2565b608060405180830381865afa158015610596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ba9190611cca565b5050915050808211610601576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016105f890611da3565b60405180910390fd5b5050610cba565b6001821415610baf5773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614801561069f575073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156107ec577387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663573ade8173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48876002306040518563ffffffff1660e01b815260040161070c9493929190611dc3565b6020604051808303816000875af115801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190611e08565b507387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff166369328dec73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4885306040518463ffffffff1660e01b81526004016107b593929190611e35565b600060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b50505050610baa565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614801561087a575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15610ba9577387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663573ade8173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48876002306040518563ffffffff1660e01b81526004016108e79493929190611dc3565b6020604051808303816000875af1158015610906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092a9190611e08565b506000737b4eb56e7cd4b454ba8ff71e4518426369a138a373ffffffffffffffffffffffffffffffffffffffff166328dd2d0173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48306040518363ffffffff1660e01b8152600401610990929190611e6c565b61012060405180830381865afa1580156109ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d29190611ed2565b505050505050505090506000811115610b10577387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff166369328dec73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4883306040518463ffffffff1660e01b8152600401610a4a93929190611e35565b600060405180830381600087803b158015610a6457600080fd5b505af1158015610a78573d6000803e3d6000fd5b5050505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401610acb929190611adc565b6020604051808303816000875af1158015610aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0e9190611b1a565b505b7387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff166369328dec73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc286306040518463ffffffff1660e01b8152600401610b7593929190611e35565b600060405180830381600087803b158015610b8f57600080fd5b505af1158015610ba3573d6000803e3d6000fd5b50505050505b5b610cb9565b7387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663617ba03787873060006040518563ffffffff1660e01b8152600401610c039493929190611b90565b600060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b505050507387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff166369328dec8585306040518463ffffffff1660e01b8152600401610c8693929190611e35565b600060405180830381600087803b158015610ca057600080fd5b505af1158015610cb4573d6000803e3d6000fd5b505050505b5b8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b382856040518363ffffffff1660e01b8152600401610cf5929190611adc565b6020604051808303816000875af1158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d389190611b1a565b50505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028514156110db5760007387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663bf92857c306040518263ffffffff1660e01b8152600401610de391906117e2565b60c060405180830381865afa158015610e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e249190611c3d565b955050505050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad3efcdf306040518263ffffffff1660e01b8152600401610e8891906117e2565b608060405180830381865afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec99190611cca565b50509150508082108015610edd5750600186145b15611045576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a34f1c4c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f759190611925565b90503373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015610fff57503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561103f576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016110369061200e565b60405180910390fd5b506110d4565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110d3576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016110ca9061207a565b60405180910390fd5b5b505061116a565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611169576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016111609061207a565b60405180910390fd5b5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635350b7de876040518263ffffffff1660e01b81526004016111c7919061209a565b602060405180830381865afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190611925565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561127a576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040161127190612127565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16878787876040516024016112ab9493929190612156565b6040516020818303038152906040527fe75bfee4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516113359190612215565b600060405180830381855af49150503d8060008114611370576040519150601f19603f3d011682016040523d82523d6000602084013e611375565b606091505b5091509150816113965760008151141561138e57600080fd5b805181602001fd5b5050505050505050565b611423846323b872dd60e01b8585856040516024016113c19392919061222c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611429565b50505050565b600061148b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114f19092919063ffffffff16565b90506000815114806114ad5750808060200190518101906114ac9190611b1a565b5b6114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e3906122d5565b60405180910390fd5b505050565b60606115008484600085611509565b90509392505050565b60608247101561154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590612367565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115779190612215565b60006040518083038185875af1925050503d80600081146115b4576040519150601f19603f3d011682016040523d82523d6000602084013e6115b9565b606091505b50915091506115ca878383876115d6565b92505050949350505050565b6060831561163957600083511415611631576115f18561164c565b611630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611627906123d3565b60405180910390fd5b5b829050611644565b611643838361166f565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156116825781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69190612448565b60405180910390fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116ef826116c4565b9050919050565b6116ff816116e4565b811461170a57600080fd5b50565b60008135905061171c816116f6565b92915050565b6000819050919050565b61173581611722565b811461174057600080fd5b50565b6000813590506117528161172c565b92915050565b600080600080600060a08688031215611774576117736116bf565b5b60006117828882890161170d565b955050602061179388828901611743565b94505060406117a48882890161170d565b93505060606117b588828901611743565b92505060806117c688828901611743565b9150509295509295909350565b6117dc816116e4565b82525050565b60006020820190506117f760008301846117d3565b92915050565b60008115159050919050565b611812816117fd565b811461181d57600080fd5b50565b60008135905061182f81611809565b92915050565b600080600080600060a08688031215611851576118506116bf565b5b600061185f88828901611743565b955050602061187088828901611743565b94505060406118818882890161170d565b935050606061189288828901611743565b92505060806118a388828901611820565b9150509295509295909350565b6000819050919050565b6000819050919050565b60006118df6118da6118d5846118b0565b6118ba565b611722565b9050919050565b6118ef816118c4565b82525050565b600060208201905061190a60008301846118e6565b92915050565b60008151905061191f816116f6565b92915050565b60006020828403121561193b5761193a6116bf565b5b600061194984828501611910565b91505092915050565b600082825260208201905092915050565b7f646f75676856324473613a2065786563757465416374696f6e203a20756e726560008201527f676973746572656420636f6e6e6563746f725632466c6173686c6f616e000000602082015250565b60006119bf603d83611952565b91506119ca82611963565b604082019050919050565b600060208201905081810360008301526119ee816119b2565b9050919050565b7f77726f6e6720646f756768466c6173686c6f616e000000000000000000000000600082015250565b6000611a2b601483611952565b9150611a36826119f5565b602082019050919050565b60006020820190508181036000830152611a5a81611a1e565b9050919050565b7f666c6173686c6f616e526571203a20696e76616c69642d696400000000000000600082015250565b6000611a97601983611952565b9150611aa282611a61565b602082019050919050565b60006020820190508181036000830152611ac681611a8a565b9050919050565b611ad681611722565b82525050565b6000604082019050611af160008301856117d3565b611afe6020830184611acd565b9392505050565b600081519050611b1481611809565b92915050565b600060208284031215611b3057611b2f6116bf565b5b6000611b3e84828501611b05565b91505092915050565b6000819050919050565b600061ffff82169050919050565b6000611b7a611b75611b7084611b47565b6118ba565b611b51565b9050919050565b611b8a81611b5f565b82525050565b6000608082019050611ba560008301876117d3565b611bb26020830186611acd565b611bbf60408301856117d3565b611bcc6060830184611b81565b95945050505050565b600060a082019050611bea60008301886117d3565b611bf76020830187611acd565b611c0460408301866118e6565b611c116060830185611b81565b611c1e60808301846117d3565b9695505050505050565b600081519050611c378161172c565b92915050565b60008060008060008060c08789031215611c5a57611c596116bf565b5b6000611c6889828a01611c28565b9650506020611c7989828a01611c28565b9550506040611c8a89828a01611c28565b9450506060611c9b89828a01611c28565b9350506080611cac89828a01611c28565b92505060a0611cbd89828a01611c28565b9150509295509295509295565b60008060008060808587031215611ce457611ce36116bf565b5b6000611cf287828801611c28565b9450506020611d0387828801611c28565b9350506040611d1487828801611910565b9250506060611d2587828801611910565b91505092959194509250565b7f6572726f723a204865616c7468466163746f72203c3d2020686654726967676560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d8d602183611952565b9150611d9882611d31565b604082019050919050565b60006020820190508181036000830152611dbc81611d80565b9050919050565b6000608082019050611dd860008301876117d3565b611de56020830186611acd565b611df260408301856118e6565b611dff60608301846117d3565b95945050505050565b600060208284031215611e1e57611e1d6116bf565b5b6000611e2c84828501611c28565b91505092915050565b6000606082019050611e4a60008301866117d3565b611e576020830185611acd565b611e6460408301846117d3565b949350505050565b6000604082019050611e8160008301856117d3565b611e8e60208301846117d3565b9392505050565b600064ffffffffff82169050919050565b611eaf81611e95565b8114611eba57600080fd5b50565b600081519050611ecc81611ea6565b92915050565b60008060008060008060008060006101208a8c031215611ef557611ef46116bf565b5b6000611f038c828d01611c28565b9950506020611f148c828d01611c28565b9850506040611f258c828d01611c28565b9750506060611f368c828d01611c28565b9650506080611f478c828d01611c28565b95505060a0611f588c828d01611c28565b94505060c0611f698c828d01611c28565b93505060e0611f7a8c828d01611ebd565b925050610100611f8c8c828d01611b05565b9150509295985092959850929598565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260008201527f206f7220536869656c64206578656375746f7200000000000000000000000000602082015250565b6000611ff8603383611952565b915061200382611f9c565b604082019050919050565b6000602082019050818103600083015261202781611feb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612064602083611952565b915061206f8261202e565b602082019050919050565b6000602082019050818103600083015261209381612057565b9050919050565b60006020820190506120af6000830184611acd565b92915050565b7f646f75676843616c6c3a20756e7265676973746572656420636f6e6e6563746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612111602183611952565b915061211c826120b5565b604082019050919050565b6000602082019050818103600083015261214081612104565b9050919050565b612150816117fd565b82525050565b600060808201905061216b6000830187611acd565b61217860208301866117d3565b6121856040830185611acd565b6121926060830184612147565b95945050505050565b600081519050919050565b600081905092915050565b60005b838110156121cf5780820151818401526020810190506121b4565b838111156121de576000848401525b50505050565b60006121ef8261219b565b6121f981856121a6565b93506122098185602086016121b1565b80840191505092915050565b600061222182846121e4565b915081905092915050565b600060608201905061224160008301866117d3565b61224e60208301856117d3565b61225b6040830184611acd565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006122bf602a83611952565b91506122ca82612263565b604082019050919050565b600060208201905081810360008301526122ee816122b2565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612351602683611952565b915061235c826122f5565b604082019050919050565b6000602082019050818103600083015261238081612344565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006123bd601d83611952565b91506123c882612387565b602082019050919050565b600060208201905081810360008301526123ec816123b0565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b600061241a826123f3565b6124248185611952565b93506124348185602086016121b1565b61243d816123fe565b840191505092915050565b60006020820190508181036000830152612462818461240f565b90509291505056fea2646970667358221220e1c585e9245d525591b9000452f2085f461a79cb89143f4a65c33333358d5aa364736f6c634300080a0033a2646970667358221220d46e68382bf6d2d077a2d38f136df65b31487270a22c761e2dd2c088c4dd00cf64736f6c634300080a0033000000000000000000000000b97e7f9ee36a1e22ccfb0e013810c21e720a7b21
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620002205760003560e01c80637bfae10a1162000129578063b6ac642a11620000b1578063e941fa78116200007b578063e941fa7814620005dc578063f0f4426014620005fe578063f2fde38b146200061e578063fb978a8a146200063e5762000220565b8063b6ac642a1462000544578063c869adb41462000564578063c9994b431462000584578063e626648a14620005ba5762000220565b806397440c2411620000f357806397440c2414620004a95780639e281a9814620004c9578063a34f1c4c14620004e9578063ad3efcdf146200050b5762000220565b80637bfae10a14620004395780637c0f59f414620004595780638d006e9f146200047b5780638da5cb5b14620004875762000220565b8063413ca0aa11620001ad5780635ba0f6e811620001775780635ba0f6e814620003c757806361d027b314620003e9578063715018a6146200040b57806371744d7f14620004175762000220565b8063413ca0aa146200032f5780634255b1d9146200034f5780634e1b6fa9146200036f5780635350b7de14620003915762000220565b80631c08c65411620001ef5780631c08c65414620002ab5780631fddabfb14620002cd5780632683fc0e14620002ed578063311f463f146200030f5762000220565b806301c3779014620002255780630b38b9581462000247578063157c81b914620002695780631723f6011462000289575b600080fd5b6200022f6200065e565b6040516200023e9190620024ac565b60405180910390f35b6200025162000664565b604051620002609190620024ac565b60405180910390f35b620002876004803603810190620002819190620024ff565b6200066a565b005b62000293620006c6565b604051620002a2919062002576565b60405180910390f35b620002b5620006ec565b604051620002c4919062002576565b60405180910390f35b620002eb6004803603810190620002e59190620024ff565b62000712565b005b620002f76200076e565b60405162000306919062002576565b60405180910390f35b6200032d6004803603810190620003279190620024ff565b62000904565b005b6200034d6004803603810190620003479190620025c4565b62000960565b005b6200036d6004803603810190620003679190620025f6565b62000b41565b005b6200037962000c14565b604051620003889190620024ac565b60405180910390f35b620003af6004803603810190620003a99190620024ff565b62000c1a565b604051620003be919062002576565b60405180910390f35b620003d162000c57565b604051620003e09190620024ac565b60405180910390f35b620003f362000c5d565b60405162000402919062002576565b60405180910390f35b6200041562000c83565b005b6200042162000c9b565b604051620004309190620024ac565b60405180910390f35b620004576004803603810190620004519190620024ff565b62000ca1565b005b6200046362000cfc565b604051620004729190620024ac565b60405180910390f35b6200048562000d02565b005b620004916200146b565b604051620004a0919062002576565b60405180910390f35b620004c76004803603810190620004c19190620024ff565b62001494565b005b620004e76004803603810190620004e191906200263d565b620014f0565b005b620004f362001612565b60405162000502919062002576565b60405180910390f35b620005296004803603810190620005239190620025c4565b62001638565b6040516200053b949392919062002684565b60405180910390f35b6200056260048036038101906200055c9190620024ff565b62001799565b005b6200058260048036038101906200057c9190620024ff565b620017f5565b005b620005a260048036038101906200059c9190620025c4565b62001851565b604051620005b1919062002576565b60405180910390f35b620005c4620018ba565b604051620005d39190620024ac565b60405180910390f35b620005e6620018c0565b604051620005f59190620024ac565b60405180910390f35b6200061c6004803603810190620006169190620025c4565b620018c6565b005b6200063c6004803603810190620006369190620025c4565b620019c0565b005b6200065c6004803603810190620006569190620026d1565b62001a4b565b005b60085481565b60035481565b6200067462001ff2565b6101f4811115620006bc576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620006b39062002779565b60405180910390fd5b8060068190555050565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6200071c62001ff2565b6101f481111562000764576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016200075b9062002779565b60405180910390fd5b8060038190555050565b60008073ffffffffffffffffffffffffffffffffffffffff16600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000840576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016200083790620027eb565b60405180910390fd5b60003330604051620008529062002483565b6200085f9291906200280d565b604051809103906000f0801580156200087c573d6000803e3d6000fd5b50905080600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508091505090565b6200090e62001ff2565b6101f481111562000956576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016200094d9062002779565b60405180910390fd5b8060078190555050565b6200096a62001ff2565b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480620009d35750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b1562000a16576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000a0d906200288a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000a89576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000a8090620028fc565b60405180910390fd5b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000afd576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000af490620028fc565b60405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b62000b4b62001ff2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000bbe576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000bb59062002994565b60405180910390fd5b80600b600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b600c5481565b6000600b600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60075481565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b62000c8d62001ff2565b62000c99600062002077565b565b60095481565b62000cab62001ff2565b600081141562000cf2576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000ce99062002a06565b60405180910390fd5b8060098190555050565b60065481565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562000dd9576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000dd09062002a78565b60405180910390fd5b6000600c54141562000e22576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000e199062002aea565b60405180910390fd5b6000600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050670de0b6b3a764000081600001541162000eb6576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000ead9062002b5c565b60405180910390fd5b6001600c54141562000f4c576000600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200144d565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620010b4576002600f60008360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620013b0565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200121c576001600f60008360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620013af565b8060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008360020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008360030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b5b600081600001819055506000816001018190555060008160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600c6000815480929190620014629062002bad565b91905055505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6200149e62001ff2565b6103e8811115620014e6576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620014dd9062002779565b60405180910390fd5b8060088190555050565b620014fa62001ff2565b600081141562001541576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620015389062002c2c565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016200157e919062002576565b602060405180830381865afa1580156200159c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620015c2919062002c65565b9050600082905081831115620015d6578190505b6200160c620015e46200146b565b828673ffffffffffffffffffffffffffffffffffffffff166200213b9092919063ffffffff16565b50505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600080600f60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600f60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600f60008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1693509350935093509193509193565b620017a362001ff2565b6101f4811115620017eb576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620017e29062002779565b60405180910390fd5b8060048190555050565b620017ff62001ff2565b6101f481111562001847576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016200183e9062002779565b60405180910390fd5b8060058190555050565b6000600a60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60055481565b60045481565b620018d062001ff2565b61dead73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480620019395750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b156200197c576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620019739062002ce7565b60405180910390fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620019ca62001ff2565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562001a3d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a349062002d7f565b60405180910390fd5b62001a488162002077565b50565b6000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141562001b22576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162001b199062002a78565b60405180910390fd5b670de0b6b3a7640000831162001b6f576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162001b669062002e17565b60405180910390fd5b81831062001bb4576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162001bab9062002eaf565b60405180910390fd5b60007387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663bf92857c836040518263ffffffff1660e01b815260040162001c05919062002576565b60c060405180830381865afa15801562001c23573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001c49919062002ed1565b505050505090506305f5e10060095462001c64919062002f6d565b81101562001ca9576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162001ca09062003044565b60405180910390fd5b6000600f60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600c54141562001e225782600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060018160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c600081548092919062001e179062003066565b919050555062001fd9565b60008160000154141562001fd85782600f6000600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060028160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600c600081548092919062001fd29062003066565b91905055505b5b8381600101819055508481600001819055505050505050565b62001ffc620021c5565b73ffffffffffffffffffffffffffffffffffffffff166200201c6200146b565b73ffffffffffffffffffffffffffffffffffffffff161462002075576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200206c9062003104565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620021c08363a9059cbb60e01b84846040516024016200215d92919062003126565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050620021cd565b505050565b600033905090565b600062002231826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166200229d9092919063ffffffff16565b90506000815114806200225657508080602001905181019062002255919062003190565b5b62002298576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200228f9062003238565b60405180910390fd5b505050565b6060620022ae8484600085620022b7565b90509392505050565b606082471015620022ff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620022f690620032d0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516200232a919062003375565b60006040518083038185875af1925050503d806000811462002369576040519150601f19603f3d011682016040523d82523d6000602084013e6200236e565b606091505b509150915062002381878383876200238d565b92505050949350505050565b60608315620023f857600083511415620023ef57620023ac856200240d565b620023ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620023e590620033de565b60405180910390fd5b5b82905062002405565b62002404838362002430565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082511115620024445781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200247a91906200345d565b60405180910390fd5b61283e806200348283390190565b6000819050919050565b620024a68162002491565b82525050565b6000602082019050620024c360008301846200249b565b92915050565b600080fd5b620024d98162002491565b8114620024e557600080fd5b50565b600081359050620024f981620024ce565b92915050565b600060208284031215620025185762002517620024c9565b5b60006200252884828501620024e8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200255e8262002531565b9050919050565b620025708162002551565b82525050565b60006020820190506200258d600083018462002565565b92915050565b6200259e8162002551565b8114620025aa57600080fd5b50565b600081359050620025be8162002593565b92915050565b600060208284031215620025dd57620025dc620024c9565b5b6000620025ed84828501620025ad565b91505092915050565b6000806040838503121562002610576200260f620024c9565b5b60006200262085828601620024e8565b92505060206200263385828601620025ad565b9150509250929050565b60008060408385031215620026575762002656620024c9565b5b60006200266785828601620025ad565b92505060206200267a85828601620024e8565b9150509250929050565b60006080820190506200269b60008301876200249b565b620026aa60208301866200249b565b620026b9604083018562002565565b620026c8606083018462002565565b95945050505050565b60008060408385031215620026eb57620026ea620024c9565b5b6000620026fb85828601620024e8565b92505060206200270e85828601620024e8565b9150509250929050565b600082825260208201905092915050565b7f696e766169642076616c75650000000000000000000000000000000000000000600082015250565b600062002761600c8362002718565b91506200276e8262002729565b602082019050919050565b60006020820190508181036000830152620027948162002752565b9050919050565b7f6372656174656420616c72656164790000000000000000000000000000000000600082015250565b6000620027d3600f8362002718565b9150620027e0826200279b565b602082019050919050565b600060208201905081810360008301526200280681620027c4565b9050919050565b600060408201905062002824600083018562002565565b62002833602083018462002565565b9392505050565b7f736869656c644578656375746f72206163636f756e74206572726f7200000000600082015250565b600062002872601c8362002718565b91506200287f826200283a565b602082019050919050565b60006020820190508181036000830152620028a58162002863565b9050919050565b7f5f736869656c644578656375746f72206973207a65726f5f6164647265737300600082015250565b6000620028e4601f8362002718565b9150620028f182620028ac565b602082019050919050565b600060208201905081810360008301526200291781620028d5565b9050919050565b7f616464436f6e6e6563746f72733a205f636f6e6e6563746f727320616464726560008201527f7373206e6f74207661696c640000000000000000000000000000000000000000602082015250565b60006200297c602c8362002718565b915062002989826200291e565b604082019050919050565b60006020820190508181036000830152620029af816200296d565b9050919050565b7f6d7573742062652067726561746572207468616e207a65726f2e000000000000600082015250565b6000620029ee601a8362002718565b9150620029fb82620029b6565b602082019050919050565b6000602082019050818103600083015262002a2181620029df565b9050919050565b7f646f7567685632496e6465783a20756e63726561746564206473610000000000600082015250565b600062002a60601b8362002718565b915062002a6d8262002a28565b602082019050919050565b6000602082019050818103600083015262002a938162002a51565b9050919050565b7f646f7567685632496e6465783a20656d707479206c6973740000000000000000600082015250565b600062002ad260188362002718565b915062002adf8262002a9a565b602082019050919050565b6000602082019050818103600083015262002b058162002ac3565b9050919050565b7f646f7567685632496e6465783a20616c726561647920756e7365740000000000600082015250565b600062002b44601b8362002718565b915062002b518262002b0c565b602082019050919050565b6000602082019050818103600083015262002b778162002b35565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062002bba8262002491565b9150600082141562002bd15762002bd062002b7e565b5b600182039050919050565b7f6d7573742062652067726561746572207468616e207a65726f00000000000000600082015250565b600062002c1460198362002718565b915062002c218262002bdc565b602082019050919050565b6000602082019050818103600083015262002c478162002c05565b9050919050565b60008151905062002c5f81620024ce565b92915050565b60006020828403121562002c7e5762002c7d620024c9565b5b600062002c8e8482850162002c4e565b91505092915050565b7f7472656173757279206163636f756e74206572726f7200000000000000000000600082015250565b600062002ccf60168362002718565b915062002cdc8262002c97565b602082019050919050565b6000602082019050818103600083015262002d028162002cc0565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062002d6760268362002718565b915062002d748262002d09565b604082019050919050565b6000602082019050818103600083015262002d9a8162002d58565b9050919050565b7f536869656c643a2077726f6e6720747269676765722076616c7565206f66206860008201527f65616c746820666163746f720000000000000000000000000000000000000000602082015250565b600062002dff602c8362002718565b915062002e0c8262002da1565b604082019050919050565b6000602082019050818103600083015262002e328162002df0565b9050919050565b7f536869656c643a2077726f6e67207461726765742076616c7565206f6620686560008201527f616c746820666163746f72000000000000000000000000000000000000000000602082015250565b600062002e97602b8362002718565b915062002ea48262002e39565b604082019050919050565b6000602082019050818103600083015262002eca8162002e88565b9050919050565b60008060008060008060c0878903121562002ef15762002ef0620024c9565b5b600062002f0189828a0162002c4e565b965050602062002f1489828a0162002c4e565b955050604062002f2789828a0162002c4e565b945050606062002f3a89828a0162002c4e565b935050608062002f4d89828a0162002c4e565b92505060a062002f6089828a0162002c4e565b9150509295509295509295565b600062002f7a8262002491565b915062002f878362002491565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161562002fc35762002fc262002b7e565b5b828202905092915050565b7f536869656c643a20737570706c7920616d6f756e74203c20736869656c64537560008201527f70706c794c696d69740000000000000000000000000000000000000000000000602082015250565b60006200302c60298362002718565b9150620030398262002fce565b604082019050919050565b600060208201905081810360008301526200305f816200301d565b9050919050565b6000620030738262002491565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620030a957620030a862002b7e565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620030ec60208362002718565b9150620030f982620030b4565b602082019050919050565b600060208201905081810360008301526200311f81620030dd565b9050919050565b60006040820190506200313d600083018562002565565b6200314c60208301846200249b565b9392505050565b60008115159050919050565b6200316a8162003153565b81146200317657600080fd5b50565b6000815190506200318a816200315f565b92915050565b600060208284031215620031a957620031a8620024c9565b5b6000620031b98482850162003179565b91505092915050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600062003220602a8362002718565b91506200322d82620031c2565b604082019050919050565b60006020820190508181036000830152620032538162003211565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000620032b860268362002718565b9150620032c5826200325a565b604082019050919050565b60006020820190508181036000830152620032eb81620032a9565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015620033285780820151818401526020810190506200330b565b8381111562003338576000848401525b50505050565b60006200334b82620032f2565b620033578185620032fd565b93506200336981856020860162003308565b80840191505092915050565b60006200338382846200333e565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000620033c6601d8362002718565b9150620033d3826200338e565b602082019050919050565b60006020820190508181036000830152620033f981620033b7565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b6000620034298262003400565b62003435818562002718565b93506200344781856020860162003308565b62003452816200340b565b840191505092915050565b600060208201905081810360008301526200347981846200341c565b90509291505056fe60806040526000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200005357600080fd5b506040516200283e3803806200283e833981810160405281019062000079919062000252565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620000ec576040517f8d6ea8be000000000000000000000000000000000000000000000000000000008152600401620000e390620002fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200015f576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040162000156906200036c565b60405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050506200038e565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200021a82620001ed565b9050919050565b6200022c816200020d565b81146200023857600080fd5b50565b6000815190506200024c8162000221565b92915050565b600080604083850312156200026c576200026b620001e8565b5b60006200027c858286016200023b565b92505060206200028f858286016200023b565b9150509250929050565b600082825260208201905092915050565b7f696e76616c6964206f776e657200000000000000000000000000000000000000600082015250565b6000620002e2600d8362000299565b9150620002ef82620002aa565b602082019050919050565b600060208201905081810360008301526200031581620002d3565b9050919050565b7f696e76616c6964205f646f7567685632496e6465780000000000000000000000600082015250565b60006200035460158362000299565b915062000361826200031c565b602082019050919050565b60006020820190508181036000830152620003878162000345565b9050919050565b6124a0806200039e6000396000f3fe6080604052600436106100435760003560e01c806304078e951461004f5780638da5cb5b14610078578063a69b6a76146100a3578063d80e95a8146100ce5761004a565b3661004a57005b600080fd5b34801561005b57600080fd5b5061007660048036038101906100719190611758565b6100ea565b005b34801561008457600080fd5b5061008d610d41565b60405161009a91906117e2565b60405180910390f35b3480156100af57600080fd5b506100b8610d65565b6040516100c591906117e2565b60405180910390f35b6100e860048036038101906100e39190611835565b610d8b565b005b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635350b7de60026040518263ffffffff1660e01b815260040161014891906118f5565b602060405180830381865afa158015610165573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101899190611925565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156101fb576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016101f2906119d5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610269576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040161026090611a41565b60405180910390fd5b60028211156102ad576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016102a490611aad565b60405180910390fd5b6102da8130878973ffffffffffffffffffffffffffffffffffffffff166113a0909392919063ffffffff16565b8573ffffffffffffffffffffffffffffffffffffffff1663095ea7b37387870bca3f3fd6335c3f4ce8392d69350b4fa4e2876040518363ffffffff1660e01b8152600401610329929190611adc565b6020604051808303816000875af1158015610348573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061036c9190611b1a565b506000821415610608577387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663617ba03787873060006040518563ffffffff1660e01b81526004016103ca9493929190611b90565b600060405180830381600087803b1580156103e457600080fd5b505af11580156103f8573d6000803e3d6000fd5b505050507387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663a415bcad858560026000306040518663ffffffff1660e01b8152600401610453959493929190611bd5565b600060405180830381600087803b15801561046d57600080fd5b505af1158015610481573d6000803e3d6000fd5b5050505060007387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663bf92857c306040518263ffffffff1660e01b81526004016104d491906117e2565b60c060405180830381865afa1580156104f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105159190611c3d565b955050505050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad3efcdf306040518263ffffffff1660e01b815260040161057991906117e2565b608060405180830381865afa158015610596573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ba9190611cca565b5050915050808211610601576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016105f890611da3565b60405180910390fd5b5050610cba565b6001821415610baf5773a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614801561069f575073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b156107ec577387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663573ade8173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48876002306040518563ffffffff1660e01b815260040161070c9493929190611dc3565b6020604051808303816000875af115801561072b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074f9190611e08565b507387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff166369328dec73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4885306040518463ffffffff1660e01b81526004016107b593929190611e35565b600060405180830381600087803b1580156107cf57600080fd5b505af11580156107e3573d6000803e3d6000fd5b50505050610baa565b73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614801561087a575073c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b15610ba9577387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663573ade8173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48876002306040518563ffffffff1660e01b81526004016108e79493929190611dc3565b6020604051808303816000875af1158015610906573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092a9190611e08565b506000737b4eb56e7cd4b454ba8ff71e4518426369a138a373ffffffffffffffffffffffffffffffffffffffff166328dd2d0173a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48306040518363ffffffff1660e01b8152600401610990929190611e6c565b61012060405180830381865afa1580156109ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d29190611ed2565b505050505050505090506000811115610b10577387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff166369328dec73a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4883306040518463ffffffff1660e01b8152600401610a4a93929190611e35565b600060405180830381600087803b158015610a6457600080fd5b505af1158015610a78573d6000803e3d6000fd5b5050505073a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4873ffffffffffffffffffffffffffffffffffffffff1663095ea7b383836040518363ffffffff1660e01b8152600401610acb929190611adc565b6020604051808303816000875af1158015610aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0e9190611b1a565b505b7387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff166369328dec73c02aaa39b223fe8d0a0e5c4f27ead9083c756cc286306040518463ffffffff1660e01b8152600401610b7593929190611e35565b600060405180830381600087803b158015610b8f57600080fd5b505af1158015610ba3573d6000803e3d6000fd5b50505050505b5b610cb9565b7387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663617ba03787873060006040518563ffffffff1660e01b8152600401610c039493929190611b90565b600060405180830381600087803b158015610c1d57600080fd5b505af1158015610c31573d6000803e3d6000fd5b505050507387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff166369328dec8585306040518463ffffffff1660e01b8152600401610c8693929190611e35565b600060405180830381600087803b158015610ca057600080fd5b505af1158015610cb4573d6000803e3d6000fd5b505050505b5b8373ffffffffffffffffffffffffffffffffffffffff1663095ea7b382856040518363ffffffff1660e01b8152600401610cf5929190611adc565b6020604051808303816000875af1158015610d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d389190611b1a565b50505050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60028514156110db5760007387870bca3f3fd6335c3f4ce8392d69350b4fa4e273ffffffffffffffffffffffffffffffffffffffff1663bf92857c306040518263ffffffff1660e01b8152600401610de391906117e2565b60c060405180830381865afa158015610e00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e249190611c3d565b955050505050506000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ad3efcdf306040518263ffffffff1660e01b8152600401610e8891906117e2565b608060405180830381865afa158015610ea5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec99190611cca565b50509150508082108015610edd5750600186145b15611045576000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a34f1c4c6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f51573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f759190611925565b90503373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158015610fff57503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561103f576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016110369061200e565b60405180910390fd5b506110d4565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110d3576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016110ca9061207a565b60405180910390fd5b5b505061116a565b3373ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611169576040517f8d6ea8be0000000000000000000000000000000000000000000000000000000081526004016111609061207a565b60405180910390fd5b5b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635350b7de876040518263ffffffff1660e01b81526004016111c7919061209a565b602060405180830381865afa1580156111e4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112089190611925565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561127a576040517f8d6ea8be00000000000000000000000000000000000000000000000000000000815260040161127190612127565b60405180910390fd5b6000808273ffffffffffffffffffffffffffffffffffffffff16878787876040516024016112ab9493929190612156565b6040516020818303038152906040527fe75bfee4000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516113359190612215565b600060405180830381855af49150503d8060008114611370576040519150601f19603f3d011682016040523d82523d6000602084013e611375565b606091505b5091509150816113965760008151141561138e57600080fd5b805181602001fd5b5050505050505050565b611423846323b872dd60e01b8585856040516024016113c19392919061222c565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611429565b50505050565b600061148b826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166114f19092919063ffffffff16565b90506000815114806114ad5750808060200190518101906114ac9190611b1a565b5b6114ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e3906122d5565b60405180910390fd5b505050565b60606115008484600085611509565b90509392505050565b60608247101561154e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154590612367565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516115779190612215565b60006040518083038185875af1925050503d80600081146115b4576040519150601f19603f3d011682016040523d82523d6000602084013e6115b9565b606091505b50915091506115ca878383876115d6565b92505050949350505050565b6060831561163957600083511415611631576115f18561164c565b611630576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611627906123d3565b60405180910390fd5b5b829050611644565b611643838361166f565b5b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000825111156116825781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69190612448565b60405180910390fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006116ef826116c4565b9050919050565b6116ff816116e4565b811461170a57600080fd5b50565b60008135905061171c816116f6565b92915050565b6000819050919050565b61173581611722565b811461174057600080fd5b50565b6000813590506117528161172c565b92915050565b600080600080600060a08688031215611774576117736116bf565b5b60006117828882890161170d565b955050602061179388828901611743565b94505060406117a48882890161170d565b93505060606117b588828901611743565b92505060806117c688828901611743565b9150509295509295909350565b6117dc816116e4565b82525050565b60006020820190506117f760008301846117d3565b92915050565b60008115159050919050565b611812816117fd565b811461181d57600080fd5b50565b60008135905061182f81611809565b92915050565b600080600080600060a08688031215611851576118506116bf565b5b600061185f88828901611743565b955050602061187088828901611743565b94505060406118818882890161170d565b935050606061189288828901611743565b92505060806118a388828901611820565b9150509295509295909350565b6000819050919050565b6000819050919050565b60006118df6118da6118d5846118b0565b6118ba565b611722565b9050919050565b6118ef816118c4565b82525050565b600060208201905061190a60008301846118e6565b92915050565b60008151905061191f816116f6565b92915050565b60006020828403121561193b5761193a6116bf565b5b600061194984828501611910565b91505092915050565b600082825260208201905092915050565b7f646f75676856324473613a2065786563757465416374696f6e203a20756e726560008201527f676973746572656420636f6e6e6563746f725632466c6173686c6f616e000000602082015250565b60006119bf603d83611952565b91506119ca82611963565b604082019050919050565b600060208201905081810360008301526119ee816119b2565b9050919050565b7f77726f6e6720646f756768466c6173686c6f616e000000000000000000000000600082015250565b6000611a2b601483611952565b9150611a36826119f5565b602082019050919050565b60006020820190508181036000830152611a5a81611a1e565b9050919050565b7f666c6173686c6f616e526571203a20696e76616c69642d696400000000000000600082015250565b6000611a97601983611952565b9150611aa282611a61565b602082019050919050565b60006020820190508181036000830152611ac681611a8a565b9050919050565b611ad681611722565b82525050565b6000604082019050611af160008301856117d3565b611afe6020830184611acd565b9392505050565b600081519050611b1481611809565b92915050565b600060208284031215611b3057611b2f6116bf565b5b6000611b3e84828501611b05565b91505092915050565b6000819050919050565b600061ffff82169050919050565b6000611b7a611b75611b7084611b47565b6118ba565b611b51565b9050919050565b611b8a81611b5f565b82525050565b6000608082019050611ba560008301876117d3565b611bb26020830186611acd565b611bbf60408301856117d3565b611bcc6060830184611b81565b95945050505050565b600060a082019050611bea60008301886117d3565b611bf76020830187611acd565b611c0460408301866118e6565b611c116060830185611b81565b611c1e60808301846117d3565b9695505050505050565b600081519050611c378161172c565b92915050565b60008060008060008060c08789031215611c5a57611c596116bf565b5b6000611c6889828a01611c28565b9650506020611c7989828a01611c28565b9550506040611c8a89828a01611c28565b9450506060611c9b89828a01611c28565b9350506080611cac89828a01611c28565b92505060a0611cbd89828a01611c28565b9150509295509295509295565b60008060008060808587031215611ce457611ce36116bf565b5b6000611cf287828801611c28565b9450506020611d0387828801611c28565b9350506040611d1487828801611910565b9250506060611d2587828801611910565b91505092959194509250565b7f6572726f723a204865616c7468466163746f72203c3d2020686654726967676560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000611d8d602183611952565b9150611d9882611d31565b604082019050919050565b60006020820190508181036000830152611dbc81611d80565b9050919050565b6000608082019050611dd860008301876117d3565b611de56020830186611acd565b611df260408301856118e6565b611dff60608301846117d3565b95945050505050565b600060208284031215611e1e57611e1d6116bf565b5b6000611e2c84828501611c28565b91505092915050565b6000606082019050611e4a60008301866117d3565b611e576020830185611acd565b611e6460408301846117d3565b949350505050565b6000604082019050611e8160008301856117d3565b611e8e60208301846117d3565b9392505050565b600064ffffffffff82169050919050565b611eaf81611e95565b8114611eba57600080fd5b50565b600081519050611ecc81611ea6565b92915050565b60008060008060008060008060006101208a8c031215611ef557611ef46116bf565b5b6000611f038c828d01611c28565b9950506020611f148c828d01611c28565b9850506040611f258c828d01611c28565b9750506060611f368c828d01611c28565b9650506080611f478c828d01611c28565b95505060a0611f588c828d01611c28565b94505060c0611f698c828d01611c28565b93505060e0611f7a8c828d01611ebd565b925050610100611f8c8c828d01611b05565b9150509295985092959850929598565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260008201527f206f7220536869656c64206578656375746f7200000000000000000000000000602082015250565b6000611ff8603383611952565b915061200382611f9c565b604082019050919050565b6000602082019050818103600083015261202781611feb565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612064602083611952565b915061206f8261202e565b602082019050919050565b6000602082019050818103600083015261209381612057565b9050919050565b60006020820190506120af6000830184611acd565b92915050565b7f646f75676843616c6c3a20756e7265676973746572656420636f6e6e6563746f60008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612111602183611952565b915061211c826120b5565b604082019050919050565b6000602082019050818103600083015261214081612104565b9050919050565b612150816117fd565b82525050565b600060808201905061216b6000830187611acd565b61217860208301866117d3565b6121856040830185611acd565b6121926060830184612147565b95945050505050565b600081519050919050565b600081905092915050565b60005b838110156121cf5780820151818401526020810190506121b4565b838111156121de576000848401525b50505050565b60006121ef8261219b565b6121f981856121a6565b93506122098185602086016121b1565b80840191505092915050565b600061222182846121e4565b915081905092915050565b600060608201905061224160008301866117d3565b61224e60208301856117d3565b61225b6040830184611acd565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b60006122bf602a83611952565b91506122ca82612263565b604082019050919050565b600060208201905081810360008301526122ee816122b2565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b6000612351602683611952565b915061235c826122f5565b604082019050919050565b6000602082019050818103600083015261238081612344565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006123bd601d83611952565b91506123c882612387565b602082019050919050565b600060208201905081810360008301526123ec816123b0565b9050919050565b600081519050919050565b6000601f19601f8301169050919050565b600061241a826123f3565b6124248185611952565b93506124348185602086016121b1565b61243d816123fe565b840191505092915050565b60006020820190508181036000830152612462818461240f565b90509291505056fea2646970667358221220e1c585e9245d525591b9000452f2085f461a79cb89143f4a65c33333358d5aa364736f6c634300080a0033a2646970667358221220d46e68382bf6d2d077a2d38f136df65b31487270a22c761e2dd2c088c4dd00cf64736f6c634300080a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b97e7f9ee36a1e22ccfb0e013810c21e720a7b21
-----Decoded View---------------
Arg [0] : _treasury (address): 0xB97e7F9ee36A1e22ccfB0E013810c21e720a7B21
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b97e7f9ee36a1e22ccfb0e013810c21e720a7b21
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.