Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Set Strategist | 13591613 | 1115 days ago | IN | 0 ETH | 0.00395729 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
RouterStrategy030
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-09 */ /** *Submitted for verification at Etherscan.io on 2021-07-03 */ // SPDX-License-Identifier: AGPL-3.0 pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // Global Enums and Structs struct StrategyParams { uint256 performanceFee; uint256 activation; uint256 debtRatio; uint256 rateLimit; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; } // Part: OpenZeppelin/[email protected]/Address /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // Part: OpenZeppelin/[email protected]/IERC20 /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // Part: OpenZeppelin/[email protected]/Math /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // Part: OpenZeppelin/[email protected]/SafeMath /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // Part: IVault interface IVault is IERC20 { function token() external view returns (address); function decimals() external view returns (uint256); function deposit() external; function pricePerShare() external view returns (uint256); function withdraw( uint256 amount, address account, uint256 maxLoss ) external returns (uint256); } // Part: OpenZeppelin/[email protected]/SafeERC20 /** * @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 SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // Part: yearn/[email protected]/VaultAPI interface VaultAPI is IERC20 { function apiVersion() external view returns (string memory); function withdraw(uint256 shares, address recipient) external; function token() external view returns (address); function strategies(address _strategy) external view returns (StrategyParams memory); /** * View how much the Vault would increase this Strategy's borrow limit, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function creditAvailable() external view returns (uint256); /** * View how much the Vault would like to pull back from the Strategy, * based on its present performance (since its last report). Can be used to * determine expectedReturn in your Strategy. */ function debtOutstanding() external view returns (uint256); /** * View how much the Vault expect this Strategy to return at the current * block, based on its present performance (since its last report). Can be * used to determine expectedReturn in your Strategy. */ function expectedReturn() external view returns (uint256); /** * This is the main contact point where the Strategy interacts with the * Vault. It is critical that this call is handled as intended by the * Strategy. Therefore, this function will be called by BaseStrategy to * make sure the integration is correct. */ function report( uint256 _gain, uint256 _loss, uint256 _debtPayment ) external returns (uint256); /** * This function should only be used in the scenario where the Strategy is * being retired but no migration of the positions are possible, or in the * extreme scenario that the Strategy needs to be put into "Emergency Exit" * mode in order for it to exit as quickly as possible. The latter scenario * could be for any reason that is considered "critical" that the Strategy * exits its position as fast as possible, such as a sudden change in * market conditions leading to losses, or an imminent failure in an * external dependency. */ function revokeStrategy() external; /** * View the governance address of the Vault to assert privileged functions * can only be called by governance. The Strategy serves the Vault, so it * is subject to governance defined by the Vault. */ function governance() external view returns (address); } // Part: yearn/[email protected]/BaseStrategy /** * @title Yearn Base Strategy * @author yearn.finance * @notice * BaseStrategy implements all of the required functionality to interoperate * closely with the Vault contract. This contract should be inherited and the * abstract methods implemented to adapt the Strategy to the particular needs * it has to create a return. * * Of special interest is the relationship between `harvest()` and * `vault.report()'. `harvest()` may be called simply because enough time has * elapsed since the last report, and not because any funds need to be moved * or positions adjusted. This is critical so that the Vault may maintain an * accurate picture of the Strategy's performance. See `vault.report()`, * `harvest()`, and `harvestTrigger()` for further details. */ abstract contract BaseStrategy { using SafeMath for uint256; /** * @notice * Used to track which version of `StrategyAPI` this Strategy * implements. * @dev The Strategy's version must match the Vault's `API_VERSION`. * @return A string which holds the current API version of this contract. */ function apiVersion() public pure returns (string memory) { return "0.3.0"; } /** * @notice This Strategy's name. * @dev * You can use this field to manage the "version" of this Strategy, e.g. * `StrategySomethingOrOtherV1`. However, "API Version" is managed by * `apiVersion()` function above. * @return This Strategy's name. */ function name() external virtual view returns (string memory); /** * @notice * The amount (priced in want) of the total assets managed by this strategy should not count * towards Yearn's TVL calculations. * @dev * You can override this field to set it to a non-zero value if some of the assets of this * Strategy is somehow delegated inside another part of of Yearn's ecosystem e.g. another Vault. * Note that this value must be strictly less than or equal to the amount provided by * `estimatedTotalAssets()` below, as the TVL calc will be total assets minus delegated assets. * @return * The amount of assets this strategy manages that should not be included in Yearn's Total Value * Locked (TVL) calculation across it's ecosystem. */ function delegatedAssets() external virtual view returns (uint256) { return 0; } VaultAPI public vault; address public strategist; address public rewards; address public keeper; IERC20 public want; // So indexers can keep track of this event Harvested(uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding); event UpdatedStrategist(address newStrategist); event UpdatedKeeper(address newKeeper); event UpdatedRewards(address rewards); event UpdatedReportDelay(uint256 delay); event UpdatedProfitFactor(uint256 profitFactor); event UpdatedDebtThreshold(uint256 debtThreshold); event EmergencyExitEnabled(); // The maximum number of seconds between harvest calls. See // `setMaxReportDelay()` for more details. uint256 public maxReportDelay = 86400; // ~ once a day // The minimum multiple that `callCost` must be above the credit/profit to // be "justifiable". See `setProfitFactor()` for more details. uint256 public profitFactor = 100; // Use this to adjust the threshold at which running a debt causes a // harvest trigger. See `setDebtThreshold()` for more details. uint256 public debtThreshold = 0; // See note on `setEmergencyExit()`. bool public emergencyExit; // modifiers modifier onlyAuthorized() { require(msg.sender == strategist || msg.sender == governance(), "!authorized"); _; } modifier onlyStrategist() { require(msg.sender == strategist, "!strategist"); _; } modifier onlyGovernance() { require(msg.sender == governance(), "!authorized"); _; } modifier onlyKeepers() { require(msg.sender == keeper || msg.sender == strategist || msg.sender == governance(), "!authorized"); _; } /** * @notice * Initializes the Strategy, this is called only once, when the * contract is deployed. * @dev `_vault` should implement `VaultAPI`. * @param _vault The address of the Vault responsible for this Strategy. */ constructor(address _vault) public { vault = VaultAPI(_vault); want = IERC20(vault.token()); want.approve(_vault, uint256(-1)); // Give Vault unlimited access (might save gas) strategist = msg.sender; rewards = msg.sender; keeper = msg.sender; } /** * @notice * Used to change `strategist`. * * This may only be called by governance or the existing strategist. * @param _strategist The new address to assign as `strategist`. */ function setStrategist(address _strategist) external onlyAuthorized { require(_strategist != address(0)); strategist = _strategist; emit UpdatedStrategist(_strategist); } /** * @notice * Used to change `keeper`. * * `keeper` is the only address that may call `tend()` or `harvest()`, * other than `governance()` or `strategist`. However, unlike * `governance()` or `strategist`, `keeper` may *only* call `tend()` * and `harvest()`, and no other authorized functions, following the * principle of least privilege. * * This may only be called by governance or the strategist. * @param _keeper The new address to assign as `keeper`. */ function setKeeper(address _keeper) external onlyAuthorized { require(_keeper != address(0)); keeper = _keeper; emit UpdatedKeeper(_keeper); } /** * @notice * Used to change `rewards`. Any distributed rewards will cease flowing * to the old address and begin flowing to this address once the change * is in effect. * * This may only be called by the strategist. * @param _rewards The address to use for collecting rewards. */ function setRewards(address _rewards) external onlyStrategist { require(_rewards != address(0)); rewards = _rewards; emit UpdatedRewards(_rewards); } /** * @notice * Used to change `maxReportDelay`. `maxReportDelay` is the maximum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the maximum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The maximum number of seconds to wait between harvests. */ function setMaxReportDelay(uint256 _delay) external onlyAuthorized { maxReportDelay = _delay; emit UpdatedReportDelay(_delay); } /** * @notice * Used to change `profitFactor`. `profitFactor` is used to determine * if it's worthwhile to harvest, given gas costs. (See `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _profitFactor A ratio to multiply anticipated * `harvest()` gas cost against. */ function setProfitFactor(uint256 _profitFactor) external onlyAuthorized { profitFactor = _profitFactor; emit UpdatedProfitFactor(_profitFactor); } /** * @notice * Sets how far the Strategy can go into loss without a harvest and report * being required. * * By default this is 0, meaning any losses would cause a harvest which * will subsequently report the loss to the Vault for tracking. (See * `harvestTrigger()` for more details.) * * This may only be called by governance or the strategist. * @param _debtThreshold How big of a loss this Strategy may carry without * being required to report to the Vault. */ function setDebtThreshold(uint256 _debtThreshold) external onlyAuthorized { debtThreshold = _debtThreshold; emit UpdatedDebtThreshold(_debtThreshold); } /** * Resolve governance address from Vault contract, used to make assertions * on protected functions in the Strategy. */ function governance() internal view returns (address) { return vault.governance(); } /** * @notice * Provide an accurate estimate for the total amount of assets * (principle + return) that this Strategy is currently managing, * denominated in terms of `want` tokens. * * This total should be "realizable" e.g. the total value that could * *actually* be obtained from this Strategy if it were to divest its * entire position based on current on-chain conditions. * @dev * Care must be taken in using this function, since it relies on external * systems, which could be manipulated by the attacker to give an inflated * (or reduced) value produced by this function, based on current on-chain * conditions (e.g. this function is possible to influence through * flashloan attacks, oracle manipulations, or other DeFi attack * mechanisms). * * It is up to governance to use this function to correctly order this * Strategy relative to its peers in the withdrawal queue to minimize * losses for the Vault based on sudden withdrawals. This value should be * higher than the total debt of the Strategy and higher than its expected * value to be "safe". * @return The estimated total assets in this Strategy. */ function estimatedTotalAssets() public virtual view returns (uint256); /* * @notice * Provide an indication of whether this strategy is currently "active" * in that it is managing an active position, or will manage a position in * the future. This should correlate to `harvest()` activity, so that Harvest * events can be tracked externally by indexing agents. * @return True if the strategy is actively managing a position. */ function isActive() public view returns (bool) { return vault.strategies(address(this)).debtRatio > 0 || estimatedTotalAssets() > 0; } /** * Perform any Strategy unwinding or other calls necessary to capture the * "free return" this Strategy has generated since the last time its core * position(s) were adjusted. Examples include unwrapping extra rewards. * This call is only used during "normal operation" of a Strategy, and * should be optimized to minimize losses as much as possible. * * This method returns any realized profits and/or realized losses * incurred, and should return the total amounts of profits/losses/debt * payments (in `want` tokens) for the Vault's accounting (e.g. * `want.balanceOf(this) >= _debtPayment + _profit - _loss`). * * `_debtOutstanding` will be 0 if the Strategy is not past the configured * debt limit, otherwise its value will be how far past the debt limit * the Strategy is. The Strategy's debt limit is configured in the Vault. * * NOTE: `_debtPayment` should be less than or equal to `_debtOutstanding`. * It is okay for it to be less than `_debtOutstanding`, as that * should only used as a guide for how much is left to pay back. * Payments should be made to minimize loss from slippage, debt, * withdrawal fees, etc. * * See `vault.debtOutstanding()`. */ function prepareReturn(uint256 _debtOutstanding) internal virtual returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ); /** * Perform any adjustments to the core position(s) of this Strategy given * what change the Vault made in the "investable capital" available to the * Strategy. Note that all "free capital" in the Strategy after the report * was made is available for reinvestment. Also note that this number * could be 0, and you should handle that scenario accordingly. * * See comments regarding `_debtOutstanding` on `prepareReturn()`. */ function adjustPosition(uint256 _debtOutstanding) internal virtual; /** * Liquidate up to `_amountNeeded` of `want` of this strategy's positions, * irregardless of slippage. Any excess will be re-invested with `adjustPosition()`. * This function should return the amount of `want` tokens made available by the * liquidation. If there is a difference between them, `_loss` indicates whether the * difference is due to a realized loss, or if there is some other sitution at play * (e.g. locked funds). This function is used during emergency exit instead of * `prepareReturn()` to liquidate all of the Strategy's positions back to the Vault. * * NOTE: The invariant `_amountFreed + _loss <= _amountNeeded` should always be maintained */ function liquidatePosition(uint256 _amountNeeded) internal virtual returns (uint256 _liquidatedAmount, uint256 _loss); /** * `Harvest()` calls this function after shares are created during * `vault.report()`. You can customize this function to any share * distribution mechanism you want. * * See `vault.report()` for further details. */ function distributeRewards() internal virtual { // Transfer 100% of newly-minted shares awarded to this contract to the rewards address. uint256 balance = vault.balanceOf(address(this)); if (balance > 0) { vault.transfer(rewards, balance); } } /** * @notice * Provide a signal to the keeper that `tend()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `tend()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `tend()` is not called * shortly, then this can return `true` even if the keeper might be * "at a loss" (keepers are always reimbursed by Yearn). * @dev * `callCost` must be priced in terms of `want`. * * This call and `harvestTrigger()` should never return `true` at the same * time. * @param callCost The keeper's estimated cast cost to call `tend()`. * @return `true` if `tend()` should be called, `false` otherwise. */ function tendTrigger(uint256 callCost) public virtual view returns (bool) { // We usually don't need tend, but if there are positions that need // active maintainence, overriding this function is how you would // signal for that. return false; } /** * @notice * Adjust the Strategy's position. The purpose of tending isn't to * realize gains, but to maximize yield by reinvesting any returns. * * See comments on `adjustPosition()`. * * This may only be called by governance, the strategist, or the keeper. */ function tend() external onlyKeepers { // Don't take profits with this call, but adjust for better gains adjustPosition(vault.debtOutstanding()); } /** * @notice * Provide a signal to the keeper that `harvest()` should be called. The * keeper will provide the estimated gas cost that they would pay to call * `harvest()`, and this function should use that estimate to make a * determination if calling it is "worth it" for the keeper. This is not * the only consideration into issuing this trigger, for example if the * position would be negatively affected if `harvest()` is not called * shortly, then this can return `true` even if the keeper might be "at a * loss" (keepers are always reimbursed by Yearn). * @dev * `callCost` must be priced in terms of `want`. * * This call and `tendTrigger` should never return `true` at the * same time. * * See `maxReportDelay`, `profitFactor`, `debtThreshold` to adjust the * strategist-controlled parameters that will influence whether this call * returns `true` or not. These parameters will be used in conjunction * with the parameters reported to the Vault (see `params`) to determine * if calling `harvest()` is merited. * * It is expected that an external system will check `harvestTrigger()`. * This could be a script run off a desktop or cloud bot (e.g. * https://github.com/iearn-finance/yearn-vaults/blob/master/scripts/keep.py), * or via an integration with the Keep3r network (e.g. * https://github.com/Macarse/GenericKeep3rV2/blob/master/contracts/keep3r/GenericKeep3rV2.sol). * @param callCost The keeper's estimated cast cost to call `harvest()`. * @return `true` if `harvest()` should be called, `false` otherwise. */ function harvestTrigger(uint256 callCost) public virtual view returns (bool) { StrategyParams memory params = vault.strategies(address(this)); // Should not trigger if Strategy is not activated if (params.activation == 0) return false; // Should trigger if hasn't been called in a while if (block.timestamp.sub(params.lastReport) >= maxReportDelay) return true; // If some amount is owed, pay it back // NOTE: Since debt is based on deposits, it makes sense to guard against large // changes to the value from triggering a harvest directly through user // behavior. This should ensure reasonable resistance to manipulation // from user-initiated withdrawals as the outstanding debt fluctuates. uint256 outstanding = vault.debtOutstanding(); if (outstanding > debtThreshold) return true; // Check for profits and losses uint256 total = estimatedTotalAssets(); // Trigger if we have a loss to report if (total.add(debtThreshold) < params.totalDebt) return true; uint256 profit = 0; if (total > params.totalDebt) profit = total.sub(params.totalDebt); // We've earned a profit! // Otherwise, only trigger if it "makes sense" economically (gas cost // is <N% of value moved) uint256 credit = vault.creditAvailable(); return (profitFactor.mul(callCost) < credit.add(profit)); } /** * @notice * Harvests the Strategy, recognizing any profits or losses and adjusting * the Strategy's position. * * In the rare case the Strategy is in emergency shutdown, this will exit * the Strategy's position. * * This may only be called by governance, the strategist, or the keeper. * @dev * When `harvest()` is called, the Strategy reports to the Vault (via * `vault.report()`), so in some cases `harvest()` must be called in order * to take in profits, to borrow newly available funds from the Vault, or * otherwise adjust its position. In other cases `harvest()` must be * called to report to the Vault on the Strategy's position, especially if * any losses have occurred. */ function harvest() external onlyKeepers { uint256 profit = 0; uint256 loss = 0; uint256 debtOutstanding = vault.debtOutstanding(); uint256 debtPayment = 0; if (emergencyExit) { // Free up as much capital as possible uint256 totalAssets = estimatedTotalAssets(); // NOTE: use the larger of total assets or debt outstanding to book losses properly (debtPayment, loss) = liquidatePosition(totalAssets > debtOutstanding ? totalAssets : debtOutstanding); // NOTE: take up any remainder here as profit if (debtPayment > debtOutstanding) { profit = debtPayment.sub(debtOutstanding); debtPayment = debtOutstanding; } } else { // Free up returns for Vault to pull (profit, loss, debtPayment) = prepareReturn(debtOutstanding); } // Allow Vault to take up to the "harvested" balance of this contract, // which is the amount it has earned since the last time it reported to // the Vault. debtOutstanding = vault.report(profit, loss, debtPayment); // Distribute any reward shares earned by the strategy on this report distributeRewards(); // Check if free returns are left, and re-invest them adjustPosition(debtOutstanding); emit Harvested(profit, loss, debtPayment, debtOutstanding); } /** * @notice * Withdraws `_amountNeeded` to `vault`. * * This may only be called by the Vault. * @param _amountNeeded How much `want` to withdraw. * @return _loss Any realized losses */ function withdraw(uint256 _amountNeeded) external returns (uint256 _loss) { require(msg.sender == address(vault), "!vault"); // Liquidate as much as possible to `want`, up to `_amount` uint256 amountFreed; (amountFreed, _loss) = liquidatePosition(_amountNeeded); // Send it directly back (NOTE: Using `msg.sender` saves some gas here) want.transfer(msg.sender, amountFreed); // NOTE: Reinvest anything leftover on next `tend`/`harvest` } /** * Do anything necessary to prepare this Strategy for migration, such as * transferring any reserve or LP tokens, CDPs, or other tokens or stores of * value. */ function prepareMigration(address _newStrategy) internal virtual; /** * @notice * Transfers all `want` from this Strategy to `_newStrategy`. * * This may only be called by governance or the Vault. * @dev * The new Strategy's Vault must be the same as this Strategy's Vault. * @param _newStrategy The Strategy to migrate to. */ function migrate(address _newStrategy) external { require(msg.sender == address(vault) || msg.sender == governance()); require(BaseStrategy(_newStrategy).vault() == vault); prepareMigration(_newStrategy); want.transfer(_newStrategy, want.balanceOf(address(this))); } /** * @notice * Activates emergency exit. Once activated, the Strategy will exit its * position upon the next harvest, depositing all funds into the Vault as * quickly as is reasonable given on-chain conditions. * * This may only be called by governance or the strategist. * @dev * See `vault.setEmergencyShutdown()` and `harvest()` for further details. */ function setEmergencyExit() external onlyAuthorized { emergencyExit = true; vault.revokeStrategy(); emit EmergencyExitEnabled(); } /** * Override this to add all tokens/tokenized positions this contract * manages on a *persistent* basis (e.g. not just for swapping back to * want ephemerally). * * NOTE: Do *not* include `want`, already included in `sweep` below. * * Example: * * function protectedTokens() internal override view returns (address[] memory) { * address[] memory protected = new address[](3); * protected[0] = tokenA; * protected[1] = tokenB; * protected[2] = tokenC; * return protected; * } */ function protectedTokens() internal virtual view returns (address[] memory); /** * @notice * Removes tokens from this Strategy that are not the type of tokens * managed by this Strategy. This may be used in case of accidentally * sending the wrong kind of token to this Strategy. * * Tokens will be sent to `governance()`. * * This will fail if an attempt is made to sweep `want`, or any tokens * that are protected by this Strategy. * * This may only be called by governance. * @dev * Implement `protectedTokens()` to specify any additional tokens that * should be protected from sweeping in addition to `want`. * @param _token The token to transfer out of this vault. */ function sweep(address _token) external onlyGovernance { require(_token != address(want), "!want"); require(_token != address(vault), "!shares"); address[] memory _protectedTokens = protectedTokens(); for (uint256 i; i < _protectedTokens.length; i++) require(_token != _protectedTokens[i], "!protected"); IERC20(_token).transfer(governance(), IERC20(_token).balanceOf(address(this))); } } // File: RouterStrategy030.sol contract RouterStrategy030 is BaseStrategy { using SafeERC20 for IERC20; using Address for address; using SafeMath for uint256; string internal strategyName; IVault public yVault; uint256 public maxLoss; constructor( address _vault, address _yVault, string memory _strategyName ) public BaseStrategy(_vault) { _initializeThis(_yVault, _strategyName); } modifier onlyManagement() { require( msg.sender == governance() || msg.sender == address(0x16388463d60FFE0661Cf7F1f31a7D658aC790ff7) ); _; } function _initializeThis(address _yVault, string memory _strategyName) internal { yVault = IVault(_yVault); strategyName = _strategyName; } function name() external view override returns (string memory) { return strategyName; } function estimatedTotalAssets() public view override returns (uint256) { return balanceOfWant().add(valueOfInvestment()); } function prepareReturn(uint256 _debtOutstanding) internal override returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ) { uint256 _totalDebt = vault.strategies(address(this)).totalDebt; uint256 _totalAsset = estimatedTotalAssets(); // Estimate the profit we have so far if (_totalDebt <= _totalAsset) { _profit = _totalAsset.sub(_totalDebt); } // We take profit and debt uint256 _amountFreed; (_amountFreed, _loss) = liquidatePosition( _debtOutstanding.add(_profit) ); _debtPayment = Math.min(_debtOutstanding, _amountFreed); if (_loss > _profit) { // Example: // debtOutstanding 100, profit 50, _amountFreed 100, _loss 50 // loss should be 0, (50-50) // profit should endup in 0 _loss = _loss.sub(_profit); _profit = 0; } else { // Example: // debtOutstanding 100, profit 50, _amountFreed 140, _loss 10 // _profit should be 40, (50 profit - 10 loss) // loss should end up in be 0 _profit = _profit.sub(_loss); _loss = 0; } } function adjustPosition(uint256 _debtOutstanding) internal override { if (emergencyExit) { return; } uint256 balance = balanceOfWant(); if (balance > 0) { _checkAllowance(address(yVault), address(want), balance); yVault.deposit(); } } function liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _liquidatedAmount, uint256 _loss) { uint256 balance = balanceOfWant(); if (balance >= _amountNeeded) { return (_amountNeeded, 0); } uint256 toWithdraw = _amountNeeded.sub(balance); _withdrawFromYVault(toWithdraw); uint256 totalAssets = balanceOfWant(); if (_amountNeeded > totalAssets) { _liquidatedAmount = totalAssets; _loss = _amountNeeded.sub(totalAssets); } else { _liquidatedAmount = _amountNeeded; } } function _withdrawFromYVault(uint256 _amount) internal { if (_amount == 0) { return; } uint256 _balanceOfYShares = yVault.balanceOf(address(this)); uint256 sharesToWithdraw = Math.min(_investmentTokenToYShares(_amount), _balanceOfYShares); if (sharesToWithdraw == 0) { return; } yVault.withdraw(sharesToWithdraw, address(this), maxLoss); } function prepareMigration(address _newStrategy) internal override { IERC20(yVault).safeTransfer( _newStrategy, IERC20(yVault).balanceOf(address(this)) ); } function protectedTokens() internal view override returns (address[] memory ret) { ret = new address[](1); ret[0] = address(yVault); return ret; } function setMaxLoss(uint256 _maxLoss) public onlyManagement { maxLoss = _maxLoss; } function _checkAllowance( address _contract, address _token, uint256 _amount ) internal { if (IERC20(_token).allowance(address(this), _contract) < _amount) { IERC20(_token).safeApprove(_contract, 0); IERC20(_token).safeApprove(_contract, type(uint256).max); } } function balanceOfWant() public view returns (uint256) { return want.balanceOf(address(this)); } function _investmentTokenToYShares(uint256 amount) internal view returns (uint256) { return amount.mul(10**yVault.decimals()).div(yVault.pricePerShare()); } function valueOfInvestment() public view returns (uint256) { return yVault.balanceOf(address(this)).mul(yVault.pricePerShare()).div( 10**yVault.decimals() ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_yVault","type":"address"},{"internalType":"string","name":"_strategyName","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"EmergencyExitEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"loss","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtPayment","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"debtOutstanding","type":"uint256"}],"name":"Harvested","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"debtThreshold","type":"uint256"}],"name":"UpdatedDebtThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newKeeper","type":"address"}],"name":"UpdatedKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profitFactor","type":"uint256"}],"name":"UpdatedProfitFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"rewards","type":"address"}],"name":"UpdatedRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newStrategist","type":"address"}],"name":"UpdatedStrategist","type":"event"},{"inputs":[],"name":"apiVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debtThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delegatedAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyExit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"estimatedTotalAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"harvestTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"keeper","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxLoss","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"profitFactor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewards","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debtThreshold","type":"uint256"}],"name":"setDebtThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxLoss","type":"uint256"}],"name":"setMaxLoss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMaxReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_profitFactor","type":"uint256"}],"name":"setProfitFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rewards","type":"address"}],"name":"setRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCost","type":"uint256"}],"name":"tendTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"valueOfInvestment","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract VaultAPI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountNeeded","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"_loss","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"yVault","outputs":[{"internalType":"contract IVault","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405262015180600555606460065560006007553480156200002257600080fd5b5060405162004909380380620049098339818101604052810190620000489190620004da565b82806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fc0c546a6040518163ffffffff1660e01b815260040160206040518083038186803b158015620000f057600080fd5b505afa15801562000105573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200012b9190620004ae565b600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401620001ea92919062000597565b602060405180830381600087803b1580156200020557600080fd5b505af11580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000240919062000549565b5033600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200031782826200032060201b60201c565b505050620006d3565b81600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060099080519060200190620003799291906200037e565b505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003c157805160ff1916838001178555620003f2565b82800160010185558215620003f2579182015b82811115620003f1578251825591602001919060010190620003d4565b5b50905062000401919062000405565b5090565b5b808211156200042057600081600090555060010162000406565b5090565b60008151905062000435816200069f565b92915050565b6000815190506200044c81620006b9565b92915050565b600082601f8301126200046457600080fd5b81516200047b6200047582620005f2565b620005c4565b915080825260208301602083018583830111156200049857600080fd5b620004a583828462000669565b50505092915050565b600060208284031215620004c157600080fd5b6000620004d18482850162000424565b91505092915050565b600080600060608486031215620004f057600080fd5b6000620005008682870162000424565b9350506020620005138682870162000424565b925050604084015167ffffffffffffffff8111156200053157600080fd5b6200053f8682870162000452565b9150509250925092565b6000602082840312156200055c57600080fd5b60006200056c848285016200043b565b91505092915050565b62000580816200061f565b82525050565b62000591816200065f565b82525050565b6000604082019050620005ae600083018562000575565b620005bd602083018462000586565b9392505050565b6000604051905081810181811067ffffffffffffffff82111715620005e857600080fd5b8060405250919050565b600067ffffffffffffffff8211156200060a57600080fd5b601f19601f8301169050602081019050919050565b60006200062c826200063f565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620006895780820151818401526020810190506200066c565b8381111562000699576000848401525b50505050565b620006aa816200061f565b8114620006b657600080fd5b50565b620006c48162000633565b8114620006d057600080fd5b50565b61422680620006e36000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063650d18801161011a578063c7b9d530116100ad578063efbb5cb01161007c578063efbb5cb014610546578063f017c92f14610564578063f5f5ed1714610580578063fbfa77cf1461059e578063fcf2d0ad146105bc576101fb565b8063c7b9d530146104c2578063ce5494bb146104de578063ec38a862146104fa578063ed882c2b14610516576101fb565b806391397ab4116100e957806391397ab41461044c5780639ec5a89414610468578063aced166114610486578063c1a3d44c146104a4576101fb565b8063650d1880146103c4578063748747e6146103f45780638cdfe166146104105780638e6350e21461042e576101fb565b80632582941011610192578063440368a311610161578063440368a3146103745780634641257d1461037e5780635641ec03146103885780635783fe39146103a6576101fb565b806325829410146102ea57806328b7ccf7146103085780632e1a7d4d1461032657806333303f8e14610356576101fb565b80631f1fcd51116101ce5780631f1fcd51146102745780631fe4a6861461029257806322f3e2d4146102b057806324be6628146102ce576101fb565b806301681a621461020057806306fdde031461021c5780630f969b871461023a5780631d12f28b14610256575b600080fd5b61021a60048036038101906102159190613767565b6105c6565b005b610224610924565b6040516102319190613da5565b60405180910390f35b610254600480360381019061024f9190613835565b6109c6565b005b61025e610ad4565b60405161026b9190613f27565b60405180910390f35b61027c610ada565b6040516102899190613d54565b60405180910390f35b61029a610b00565b6040516102a79190613ca3565b60405180910390f35b6102b8610b26565b6040516102c59190613d39565b60405180910390f35b6102e860048036038101906102e39190613835565b610bef565b005b6102f2610c82565b6040516102ff9190613da5565b60405180910390f35b610310610cbf565b60405161031d9190613f27565b60405180910390f35b610340600480360381019061033b9190613835565b610cc5565b60405161034d9190613f27565b60405180910390f35b61035e610e1f565b60405161036b9190613d6f565b60405180910390f35b61037c610e45565b005b610386611012565b005b610390611361565b60405161039d9190613d39565b60405180910390f35b6103ae611374565b6040516103bb9190613f27565b60405180910390f35b6103de60048036038101906103d99190613835565b61137a565b6040516103eb9190613d39565b60405180910390f35b61040e60048036038101906104099190613767565b611381565b005b610418611503565b6040516104259190613f27565b60405180910390f35b610436611509565b6040516104439190613f27565b60405180910390f35b61046660048036038101906104619190613835565b61150e565b005b61047061161c565b60405161047d9190613ca3565b60405180910390f35b61048e611642565b60405161049b9190613ca3565b60405180910390f35b6104ac611668565b6040516104b99190613f27565b60405180910390f35b6104dc60048036038101906104d79190613767565b61171a565b005b6104f860048036038101906104f39190613767565b61189c565b005b610514600480360381019061050f9190613767565b611b6c565b005b610530600480360381019061052b9190613835565b611cb1565b60405161053d9190613d39565b60405180910390f35b61054e611f98565b60405161055b9190613f27565b60405180910390f35b61057e60048036038101906105799190613835565b611fc0565b005b6105886120ce565b6040516105959190613f27565b60405180910390f35b6105a66122e5565b6040516105b39190613d8a565b60405180910390f35b6105c4612309565b005b6105ce61249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290613ea7565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c390613de7565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561075b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075290613e67565b60405180910390fd5b6060610765612545565b905060005b81518110156108025781818151811061077f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ec90613ee7565b60405180910390fd5b808060010191505061076a565b508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61082761249f565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108609190613ca3565b60206040518083038186803b15801561087857600080fd5b505afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b0919061385e565b6040518363ffffffff1660e01b81526004016108cd929190613d10565b602060405180830381600087803b1580156108e757600080fd5b505af11580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f91906137b9565b505050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109bc5780601f10610991576101008083540402835291602001916109bc565b820191906000526020600020905b81548152906001019060200180831161099f57829003601f168201915b5050505050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a545750610a2561249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a90613ea7565b60405180910390fd5b806007819055507fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860081604051610ac99190613f27565b60405180910390a150565b60075481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339ebf823306040518263ffffffff1660e01b8152600401610b829190613ca3565b6101006040518083038186803b158015610b9b57600080fd5b505afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd3919061380b565b604001511180610bea57506000610be8611f98565b115b905090565b610bf761249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c6f57507316388463d60ffe0661cf7f1f31a7d658ac790ff773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610c7857600080fd5b80600b8190555050565b60606040518060400160405280600581526020017f302e332e30000000000000000000000000000000000000000000000000000000815250905090565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90613e47565b60405180910390fd5b6000610d61836125fe565b8093508192505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610dc6929190613cbe565b602060405180830381600087803b158015610de057600080fd5b505af1158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1891906137b9565b5050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610eee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610f2b5750610efc61249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190613ea7565b60405180910390fd5b61101060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd357600080fd5b505afa158015610fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100b919061385e565b61267f565b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110bb5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110f857506110c961249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e90613ea7565b60405180910390fd5b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db919061385e565b90506000600860009054906101000a900460ff16156112465760006111fe611f98565b90506112178382116112105783611212565b815b6125fe565b8095508193505050828211156112405761123a838361278590919063ffffffff16565b94508291505b5061125c565b61124f826127cf565b8093508195508296505050505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1d9bafc8585846040518463ffffffff1660e01b81526004016112b993929190613f79565b602060405180830381600087803b1580156112d357600080fd5b505af11580156112e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130b919061385e565b9150611315612929565b61131e8261267f565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516113539493929190613fb0565b60405180910390a150505050565b600860009054906101000a900460ff1681565b600b5481565b6000919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061140f57506113e061249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144590613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561148857600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe7154816040516114f89190613ca3565b60405180910390a150565b60065481565b600090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061159c575061156d61249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d290613ea7565b60405180910390fd5b806006819055507fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec298816040516116119190613f27565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116c59190613ca3565b60206040518083038186803b1580156116dd57600080fd5b505afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611715919061385e565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117a8575061177961249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561182157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b4816040516118919190613ca3565b60405180910390a150565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061192857506118f961249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61193157600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119ae57600080fd5b505afa1580156119c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e691906137e2565b73ffffffffffffffffffffffffffffffffffffffff1614611a0657600080fd5b611a0f81612ab4565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aa99190613ca3565b60206040518083038186803b158015611ac157600080fd5b505afa158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af9919061385e565b6040518363ffffffff1660e01b8152600401611b16929190613d10565b602060405180830381600087803b158015611b3057600080fd5b505af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6891906137b9565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390613dc7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c3657600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051611ca69190613ca3565b60405180910390a150565b6000611cbb6135de565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339ebf823306040518263ffffffff1660e01b8152600401611d149190613ca3565b6101006040518083038186803b158015611d2d57600080fd5b505afa158015611d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d65919061380b565b9050600081602001511415611d7e576000915050611f93565b600554611d9882608001514261278590919063ffffffff16565b10611da7576001915050611f93565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1057600080fd5b505afa158015611e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e48919061385e565b9050600754811115611e5f57600192505050611f93565b6000611e69611f98565b90508260a00151611e8560075483612bae90919063ffffffff16565b1015611e975760019350505050611f93565b60008360a00151821115611ebf57611ebc8460a001518361278590919063ffffffff16565b90505b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663112c1f9b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2857600080fd5b505afa158015611f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f60919061385e565b9050611f758282612bae90919063ffffffff16565b611f8a88600654612c0390919063ffffffff16565b10955050505050505b919050565b6000611fbb611fa56120ce565b611fad611668565b612bae90919063ffffffff16565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061204e575061201f61249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490613ea7565b60405180910390fd5b806005819055507f4aaf232568bff365c53cad69bdb6e83014e79df80216ceba8ee01769723dfd68816040516120c39190613f27565b60405180910390a150565b60006122e0600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561213b57600080fd5b505afa15801561214f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612173919061385e565b600a0a6122d2600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e157600080fd5b505afa1580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612219919061385e565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122749190613ca3565b60206040518083038186803b15801561228c57600080fd5b505afa1580156122a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c4919061385e565b612c0390919063ffffffff16565b612c7390919063ffffffff16565b905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612397575061236861249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90613ea7565b60405180910390fd5b6001600860006101000a81548160ff02191690831515021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0e4af9a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561245957600080fd5b505af115801561246d573d6000803e3d6000fd5b505050507f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b60405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561250857600080fd5b505afa15801561251c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125409190613790565b905090565b6060600167ffffffffffffffff8111801561255f57600080fd5b5060405190808252806020026020018201604052801561258e5781602001602082028036833780820191505090505b509050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816000815181106125c157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b600080600061260b611668565b905083811061262157836000925092505061267a565b6000612636828661278590919063ffffffff16565b905061264181612cbd565b600061264b611668565b9050808611156126725780945061266b818761278590919063ffffffff16565b9350612676565b8594505b5050505b915091565b600860009054906101000a900460ff161561269957612782565b60006126a3611668565b90506000811115612780576126fd600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612e5a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561276757600080fd5b505af115801561277b573d6000803e3d6000fd5b505050505b505b50565b60006127c783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f69565b905092915050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339ebf823306040518263ffffffff1660e01b815260040161282e9190613ca3565b6101006040518083038186803b15801561284757600080fd5b505afa15801561285b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287f919061380b565b60a001519050600061288f611f98565b90508082116128ae576128ab828261278590919063ffffffff16565b94505b60006128cb6128c68789612bae90919063ffffffff16565b6125fe565b80965081925050506128dd8782612fc4565b935085851115612905576128fa868661278590919063ffffffff16565b94506000955061291f565b612918858761278590919063ffffffff16565b9550600094505b5050509193909250565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016129859190613ca3565b60206040518083038186803b15801561299d57600080fd5b505afa1580156129b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d5919061385e565b90506000811115612ab15760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612a5d929190613d10565b602060405180830381600087803b158015612a7757600080fd5b505af1158015612a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aaf91906137b9565b505b50565b612bab81600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b139190613ca3565b60206040518083038186803b158015612b2b57600080fd5b505afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b63919061385e565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612fdd9092919063ffffffff16565b50565b600080828401905083811015612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090613e07565b60405180910390fd5b8091505092915050565b600080831415612c165760009050612c6d565b6000828402905082848281612c2757fe5b0414612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f90613e27565b60405180910390fd5b809150505b92915050565b6000612cb583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613063565b905092915050565b6000811415612ccb57612e57565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612d289190613ca3565b60206040518083038186803b158015612d4057600080fd5b505afa158015612d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d78919061385e565b90506000612d8e612d88846130c4565b83612fc4565b90506000811415612da0575050612e57565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e63697c88230600b546040518463ffffffff1660e01b8152600401612e0193929190613f42565b602060405180830381600087803b158015612e1b57600080fd5b505af1158015612e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e53919061385e565b5050505b50565b808273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b8152600401612e96929190613ce7565b60206040518083038186803b158015612eae57600080fd5b505afa158015612ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee6919061385e565b1015612f6457612f188360008473ffffffffffffffffffffffffffffffffffffffff166132339092919063ffffffff16565b612f63837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff166132339092919063ffffffff16565b5b505050565b6000838311158290612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa89190613da5565b60405180910390fd5b5060008385039050809150509392505050565b6000818310612fd35781612fd5565b825b905092915050565b61305e8363a9059cbb60e01b8484604051602401612ffc929190613d10565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613391565b505050565b600080831182906130aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a19190613da5565b60405180910390fd5b5060008385816130b657fe5b049050809150509392505050565b600061322c600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b15801561313157600080fd5b505afa158015613145573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613169919061385e565b61321e600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156131d457600080fd5b505afa1580156131e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320c919061385e565b600a0a85612c0390919063ffffffff16565b612c7390919063ffffffff16565b9050919050565b60008114806132cc575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161327a929190613ce7565b60206040518083038186803b15801561329257600080fd5b505afa1580156132a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ca919061385e565b145b61330b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330290613f07565b60405180910390fd5b61338c8363095ea7b360e01b848460405160240161332a929190613d10565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613391565b505050565b60606133f3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134589092919063ffffffff16565b9050600081511115613453578080602001905181019061341391906137b9565b613452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344990613ec7565b60405180910390fd5b5b505050565b60606134678484600085613470565b90509392505050565b606061347b85613593565b6134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b190613e87565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516134e49190613c8c565b60006040518083038185875af1925050503d8060008114613521576040519150601f19603f3d011682016040523d82523d6000602084013e613526565b606091505b5091509150811561353b57809250505061358b565b60008151111561354e5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135829190613da5565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156135d557506000801b8214155b92505050919050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60008135905061363281614194565b92915050565b60008151905061364781614194565b92915050565b60008151905061365c816141ab565b92915050565b600081519050613671816141c2565b92915050565b6000610100828403121561368a57600080fd5b613695610100613ff5565b905060006136a584828501613752565b60008301525060206136b984828501613752565b60208301525060406136cd84828501613752565b60408301525060606136e184828501613752565b60608301525060806136f584828501613752565b60808301525060a061370984828501613752565b60a08301525060c061371d84828501613752565b60c08301525060e061373184828501613752565b60e08301525092915050565b60008135905061374c816141d9565b92915050565b600081519050613761816141d9565b92915050565b60006020828403121561377957600080fd5b600061378784828501613623565b91505092915050565b6000602082840312156137a257600080fd5b60006137b084828501613638565b91505092915050565b6000602082840312156137cb57600080fd5b60006137d98482850161364d565b91505092915050565b6000602082840312156137f457600080fd5b600061380284828501613662565b91505092915050565b6000610100828403121561381e57600080fd5b600061382c84828501613677565b91505092915050565b60006020828403121561384757600080fd5b60006138558482850161373d565b91505092915050565b60006020828403121561387057600080fd5b600061387e84828501613752565b91505092915050565b613890816140ae565b82525050565b61389f81614054565b82525050565b6138ae81614066565b82525050565b60006138bf82614022565b6138c98185614038565b93506138d9818560208601614150565b80840191505092915050565b6138ee816140c0565b82525050565b6138fd816140e4565b82525050565b61390c81614108565b82525050565b600061391d8261402d565b6139278185614043565b9350613937818560208601614150565b61394081614183565b840191505092915050565b6000613958600b83614043565b91507f21737472617465676973740000000000000000000000000000000000000000006000830152602082019050919050565b6000613998600583614043565b91507f2177616e740000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006139d8601b83614043565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613a18602183614043565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a7e600683614043565b91507f217661756c7400000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000613abe600783614043565b91507f21736861726573000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000613afe601d83614043565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613b3e600b83614043565b91507f21617574686f72697a65640000000000000000000000000000000000000000006000830152602082019050919050565b6000613b7e602a83614043565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613be4600a83614043565b91507f2170726f746563746564000000000000000000000000000000000000000000006000830152602082019050919050565b6000613c24603683614043565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b613c86816140a4565b82525050565b6000613c9882846138b4565b915081905092915050565b6000602082019050613cb86000830184613896565b92915050565b6000604082019050613cd36000830185613887565b613ce06020830184613c7d565b9392505050565b6000604082019050613cfc6000830185613896565b613d096020830184613896565b9392505050565b6000604082019050613d256000830185613896565b613d326020830184613c7d565b9392505050565b6000602082019050613d4e60008301846138a5565b92915050565b6000602082019050613d6960008301846138e5565b92915050565b6000602082019050613d8460008301846138f4565b92915050565b6000602082019050613d9f6000830184613903565b92915050565b60006020820190508181036000830152613dbf8184613912565b905092915050565b60006020820190508181036000830152613de08161394b565b9050919050565b60006020820190508181036000830152613e008161398b565b9050919050565b60006020820190508181036000830152613e20816139cb565b9050919050565b60006020820190508181036000830152613e4081613a0b565b9050919050565b60006020820190508181036000830152613e6081613a71565b9050919050565b60006020820190508181036000830152613e8081613ab1565b9050919050565b60006020820190508181036000830152613ea081613af1565b9050919050565b60006020820190508181036000830152613ec081613b31565b9050919050565b60006020820190508181036000830152613ee081613b71565b9050919050565b60006020820190508181036000830152613f0081613bd7565b9050919050565b60006020820190508181036000830152613f2081613c17565b9050919050565b6000602082019050613f3c6000830184613c7d565b92915050565b6000606082019050613f576000830186613c7d565b613f646020830185613896565b613f716040830184613c7d565b949350505050565b6000606082019050613f8e6000830186613c7d565b613f9b6020830185613c7d565b613fa86040830184613c7d565b949350505050565b6000608082019050613fc56000830187613c7d565b613fd26020830186613c7d565b613fdf6040830185613c7d565b613fec6060830184613c7d565b95945050505050565b6000604051905081810181811067ffffffffffffffff8211171561401857600080fd5b8060405250919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061405f82614084565b9050919050565b60008115159050919050565b600061407d82614054565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006140b98261412c565b9050919050565b60006140cb826140d2565b9050919050565b60006140dd82614084565b9050919050565b60006140ef826140f6565b9050919050565b600061410182614084565b9050919050565b60006141138261411a565b9050919050565b600061412582614084565b9050919050565b60006141378261413e565b9050919050565b600061414982614084565b9050919050565b60005b8381101561416e578082015181840152602081019050614153565b8381111561417d576000848401525b50505050565b6000601f19601f8301169050919050565b61419d81614054565b81146141a857600080fd5b50565b6141b481614066565b81146141bf57600080fd5b50565b6141cb81614072565b81146141d657600080fd5b50565b6141e2816140a4565b81146141ed57600080fd5b5056fea2646970667358221220b8b23d5cd93364d0171a4b2a0fefc44e38c1914c67b213e87a8e58ec721ddd9864736f6c634300060c00330000000000000000000000005f18c75abdae578b483e5f43f12a39cf75b973a9000000000000000000000000a354f35829ae975e850e23e9615b11da1b3dc4de00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000015526f757465722d7976555344432d3033302d3034330000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063650d18801161011a578063c7b9d530116100ad578063efbb5cb01161007c578063efbb5cb014610546578063f017c92f14610564578063f5f5ed1714610580578063fbfa77cf1461059e578063fcf2d0ad146105bc576101fb565b8063c7b9d530146104c2578063ce5494bb146104de578063ec38a862146104fa578063ed882c2b14610516576101fb565b806391397ab4116100e957806391397ab41461044c5780639ec5a89414610468578063aced166114610486578063c1a3d44c146104a4576101fb565b8063650d1880146103c4578063748747e6146103f45780638cdfe166146104105780638e6350e21461042e576101fb565b80632582941011610192578063440368a311610161578063440368a3146103745780634641257d1461037e5780635641ec03146103885780635783fe39146103a6576101fb565b806325829410146102ea57806328b7ccf7146103085780632e1a7d4d1461032657806333303f8e14610356576101fb565b80631f1fcd51116101ce5780631f1fcd51146102745780631fe4a6861461029257806322f3e2d4146102b057806324be6628146102ce576101fb565b806301681a621461020057806306fdde031461021c5780630f969b871461023a5780631d12f28b14610256575b600080fd5b61021a60048036038101906102159190613767565b6105c6565b005b610224610924565b6040516102319190613da5565b60405180910390f35b610254600480360381019061024f9190613835565b6109c6565b005b61025e610ad4565b60405161026b9190613f27565b60405180910390f35b61027c610ada565b6040516102899190613d54565b60405180910390f35b61029a610b00565b6040516102a79190613ca3565b60405180910390f35b6102b8610b26565b6040516102c59190613d39565b60405180910390f35b6102e860048036038101906102e39190613835565b610bef565b005b6102f2610c82565b6040516102ff9190613da5565b60405180910390f35b610310610cbf565b60405161031d9190613f27565b60405180910390f35b610340600480360381019061033b9190613835565b610cc5565b60405161034d9190613f27565b60405180910390f35b61035e610e1f565b60405161036b9190613d6f565b60405180910390f35b61037c610e45565b005b610386611012565b005b610390611361565b60405161039d9190613d39565b60405180910390f35b6103ae611374565b6040516103bb9190613f27565b60405180910390f35b6103de60048036038101906103d99190613835565b61137a565b6040516103eb9190613d39565b60405180910390f35b61040e60048036038101906104099190613767565b611381565b005b610418611503565b6040516104259190613f27565b60405180910390f35b610436611509565b6040516104439190613f27565b60405180910390f35b61046660048036038101906104619190613835565b61150e565b005b61047061161c565b60405161047d9190613ca3565b60405180910390f35b61048e611642565b60405161049b9190613ca3565b60405180910390f35b6104ac611668565b6040516104b99190613f27565b60405180910390f35b6104dc60048036038101906104d79190613767565b61171a565b005b6104f860048036038101906104f39190613767565b61189c565b005b610514600480360381019061050f9190613767565b611b6c565b005b610530600480360381019061052b9190613835565b611cb1565b60405161053d9190613d39565b60405180910390f35b61054e611f98565b60405161055b9190613f27565b60405180910390f35b61057e60048036038101906105799190613835565b611fc0565b005b6105886120ce565b6040516105959190613f27565b60405180910390f35b6105a66122e5565b6040516105b39190613d8a565b60405180910390f35b6105c4612309565b005b6105ce61249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290613ea7565b60405180910390fd5b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c390613de7565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561075b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075290613e67565b60405180910390fd5b6060610765612545565b905060005b81518110156108025781818151811061077f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107ec90613ee7565b60405180910390fd5b808060010191505061076a565b508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb61082761249f565b8473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016108609190613ca3565b60206040518083038186803b15801561087857600080fd5b505afa15801561088c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108b0919061385e565b6040518363ffffffff1660e01b81526004016108cd929190613d10565b602060405180830381600087803b1580156108e757600080fd5b505af11580156108fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061091f91906137b9565b505050565b606060098054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156109bc5780601f10610991576101008083540402835291602001916109bc565b820191906000526020600020905b81548152906001019060200180831161099f57829003601f168201915b5050505050905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a545750610a2561249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610a93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8a90613ea7565b60405180910390fd5b806007819055507fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a860081604051610ac99190613f27565b60405180910390a150565b60075481565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339ebf823306040518263ffffffff1660e01b8152600401610b829190613ca3565b6101006040518083038186803b158015610b9b57600080fd5b505afa158015610baf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bd3919061380b565b604001511180610bea57506000610be8611f98565b115b905090565b610bf761249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c6f57507316388463d60ffe0661cf7f1f31a7d658ac790ff773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610c7857600080fd5b80600b8190555050565b60606040518060400160405280600581526020017f302e332e30000000000000000000000000000000000000000000000000000000815250905090565b60055481565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4d90613e47565b60405180910390fd5b6000610d61836125fe565b8093508192505050600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b8152600401610dc6929190613cbe565b602060405180830381600087803b158015610de057600080fd5b505af1158015610df4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1891906137b9565b5050919050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610eee5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b80610f2b5750610efc61249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6190613ea7565b60405180910390fd5b61101060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b158015610fd357600080fd5b505afa158015610fe7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061100b919061385e565b61267f565b565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110bb5750600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b806110f857506110c961249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e90613ea7565b60405180910390fd5b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b1580156111a357600080fd5b505afa1580156111b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111db919061385e565b90506000600860009054906101000a900460ff16156112465760006111fe611f98565b90506112178382116112105783611212565b815b6125fe565b8095508193505050828211156112405761123a838361278590919063ffffffff16565b94508291505b5061125c565b61124f826127cf565b8093508195508296505050505b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a1d9bafc8585846040518463ffffffff1660e01b81526004016112b993929190613f79565b602060405180830381600087803b1580156112d357600080fd5b505af11580156112e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061130b919061385e565b9150611315612929565b61131e8261267f565b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509848483856040516113539493929190613fb0565b60405180910390a150505050565b600860009054906101000a900460ff1681565b600b5481565b6000919050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061140f57506113e061249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61144e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144590613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561148857600080fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe7154816040516114f89190613ca3565b60405180910390a150565b60065481565b600090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061159c575061156d61249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6115db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d290613ea7565b60405180910390fd5b806006819055507fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec298816040516116119190613f27565b60405180910390a150565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016116c59190613ca3565b60206040518083038186803b1580156116dd57600080fd5b505afa1580156116f1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611715919061385e565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806117a8575061177961249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6117e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117de90613ea7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561182157600080fd5b80600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b4816040516118919190613ca3565b60405180910390a150565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061192857506118f961249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61193157600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663fbfa77cf6040518163ffffffff1660e01b815260040160206040518083038186803b1580156119ae57600080fd5b505afa1580156119c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e691906137e2565b73ffffffffffffffffffffffffffffffffffffffff1614611a0657600080fd5b611a0f81612ab4565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb82600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401611aa99190613ca3565b60206040518083038186803b158015611ac157600080fd5b505afa158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611af9919061385e565b6040518363ffffffff1660e01b8152600401611b16929190613d10565b602060405180830381600087803b158015611b3057600080fd5b505af1158015611b44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b6891906137b9565b5050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf390613dc7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c3657600080fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a06981604051611ca69190613ca3565b60405180910390a150565b6000611cbb6135de565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339ebf823306040518263ffffffff1660e01b8152600401611d149190613ca3565b6101006040518083038186803b158015611d2d57600080fd5b505afa158015611d41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d65919061380b565b9050600081602001511415611d7e576000915050611f93565b600554611d9882608001514261278590919063ffffffff16565b10611da7576001915050611f93565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b158015611e1057600080fd5b505afa158015611e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e48919061385e565b9050600754811115611e5f57600192505050611f93565b6000611e69611f98565b90508260a00151611e8560075483612bae90919063ffffffff16565b1015611e975760019350505050611f93565b60008360a00151821115611ebf57611ebc8460a001518361278590919063ffffffff16565b90505b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663112c1f9b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611f2857600080fd5b505afa158015611f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f60919061385e565b9050611f758282612bae90919063ffffffff16565b611f8a88600654612c0390919063ffffffff16565b10955050505050505b919050565b6000611fbb611fa56120ce565b611fad611668565b612bae90919063ffffffff16565b905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061204e575061201f61249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61208d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208490613ea7565b60405180910390fd5b806005819055507f4aaf232568bff365c53cad69bdb6e83014e79df80216ceba8ee01769723dfd68816040516120c39190613f27565b60405180910390a150565b60006122e0600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561213b57600080fd5b505afa15801561214f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612173919061385e565b600a0a6122d2600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e157600080fd5b505afa1580156121f5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612219919061385e565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016122749190613ca3565b60206040518083038186803b15801561228c57600080fd5b505afa1580156122a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c4919061385e565b612c0390919063ffffffff16565b612c7390919063ffffffff16565b905090565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612397575061236861249f565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6123d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123cd90613ea7565b60405180910390fd5b6001600860006101000a81548160ff02191690831515021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a0e4af9a6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561245957600080fd5b505af115801561246d573d6000803e3d6000fd5b505050507f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b60405160405180910390a1565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635aa6e6756040518163ffffffff1660e01b815260040160206040518083038186803b15801561250857600080fd5b505afa15801561251c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125409190613790565b905090565b6060600167ffffffffffffffff8111801561255f57600080fd5b5060405190808252806020026020018201604052801561258e5781602001602082028036833780820191505090505b509050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16816000815181106125c157fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505090565b600080600061260b611668565b905083811061262157836000925092505061267a565b6000612636828661278590919063ffffffff16565b905061264181612cbd565b600061264b611668565b9050808611156126725780945061266b818761278590919063ffffffff16565b9350612676565b8594505b5050505b915091565b600860009054906101000a900460ff161561269957612782565b60006126a3611668565b90506000811115612780576126fd600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612e5a565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d0e30db06040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561276757600080fd5b505af115801561277b573d6000803e3d6000fd5b505050505b505b50565b60006127c783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612f69565b905092915050565b60008060008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166339ebf823306040518263ffffffff1660e01b815260040161282e9190613ca3565b6101006040518083038186803b15801561284757600080fd5b505afa15801561285b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287f919061380b565b60a001519050600061288f611f98565b90508082116128ae576128ab828261278590919063ffffffff16565b94505b60006128cb6128c68789612bae90919063ffffffff16565b6125fe565b80965081925050506128dd8782612fc4565b935085851115612905576128fa868661278590919063ffffffff16565b94506000955061291f565b612918858761278590919063ffffffff16565b9550600094505b5050509193909250565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016129859190613ca3565b60206040518083038186803b15801561299d57600080fd5b505afa1580156129b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129d5919061385e565b90506000811115612ab15760008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401612a5d929190613d10565b602060405180830381600087803b158015612a7757600080fd5b505af1158015612a8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612aaf91906137b9565b505b50565b612bab81600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612b139190613ca3565b60206040518083038186803b158015612b2b57600080fd5b505afa158015612b3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b63919061385e565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16612fdd9092919063ffffffff16565b50565b600080828401905083811015612bf9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bf090613e07565b60405180910390fd5b8091505092915050565b600080831415612c165760009050612c6d565b6000828402905082848281612c2757fe5b0414612c68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c5f90613e27565b60405180910390fd5b809150505b92915050565b6000612cb583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613063565b905092915050565b6000811415612ccb57612e57565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401612d289190613ca3565b60206040518083038186803b158015612d4057600080fd5b505afa158015612d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d78919061385e565b90506000612d8e612d88846130c4565b83612fc4565b90506000811415612da0575050612e57565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e63697c88230600b546040518463ffffffff1660e01b8152600401612e0193929190613f42565b602060405180830381600087803b158015612e1b57600080fd5b505af1158015612e2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e53919061385e565b5050505b50565b808273ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30866040518363ffffffff1660e01b8152600401612e96929190613ce7565b60206040518083038186803b158015612eae57600080fd5b505afa158015612ec2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ee6919061385e565b1015612f6457612f188360008473ffffffffffffffffffffffffffffffffffffffff166132339092919063ffffffff16565b612f63837fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8473ffffffffffffffffffffffffffffffffffffffff166132339092919063ffffffff16565b5b505050565b6000838311158290612fb1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa89190613da5565b60405180910390fd5b5060008385039050809150509392505050565b6000818310612fd35781612fd5565b825b905092915050565b61305e8363a9059cbb60e01b8484604051602401612ffc929190613d10565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613391565b505050565b600080831182906130aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016130a19190613da5565b60405180910390fd5b5060008385816130b657fe5b049050809150509392505050565b600061322c600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166399530b066040518163ffffffff1660e01b815260040160206040518083038186803b15801561313157600080fd5b505afa158015613145573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613169919061385e565b61321e600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156131d457600080fd5b505afa1580156131e8573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061320c919061385e565b600a0a85612c0390919063ffffffff16565b612c7390919063ffffffff16565b9050919050565b60008114806132cc575060008373ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30856040518363ffffffff1660e01b815260040161327a929190613ce7565b60206040518083038186803b15801561329257600080fd5b505afa1580156132a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132ca919061385e565b145b61330b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330290613f07565b60405180910390fd5b61338c8363095ea7b360e01b848460405160240161332a929190613d10565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050613391565b505050565b60606133f3826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166134589092919063ffffffff16565b9050600081511115613453578080602001905181019061341391906137b9565b613452576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344990613ec7565b60405180910390fd5b5b505050565b60606134678484600085613470565b90509392505050565b606061347b85613593565b6134ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b190613e87565b60405180910390fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040516134e49190613c8c565b60006040518083038185875af1925050503d8060008114613521576040519150601f19603f3d011682016040523d82523d6000602084013e613526565b606091505b5091509150811561353b57809250505061358b565b60008151111561354e5780518082602001fd5b836040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135829190613da5565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156135d557506000801b8214155b92505050919050565b60405180610100016040528060008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b60008135905061363281614194565b92915050565b60008151905061364781614194565b92915050565b60008151905061365c816141ab565b92915050565b600081519050613671816141c2565b92915050565b6000610100828403121561368a57600080fd5b613695610100613ff5565b905060006136a584828501613752565b60008301525060206136b984828501613752565b60208301525060406136cd84828501613752565b60408301525060606136e184828501613752565b60608301525060806136f584828501613752565b60808301525060a061370984828501613752565b60a08301525060c061371d84828501613752565b60c08301525060e061373184828501613752565b60e08301525092915050565b60008135905061374c816141d9565b92915050565b600081519050613761816141d9565b92915050565b60006020828403121561377957600080fd5b600061378784828501613623565b91505092915050565b6000602082840312156137a257600080fd5b60006137b084828501613638565b91505092915050565b6000602082840312156137cb57600080fd5b60006137d98482850161364d565b91505092915050565b6000602082840312156137f457600080fd5b600061380284828501613662565b91505092915050565b6000610100828403121561381e57600080fd5b600061382c84828501613677565b91505092915050565b60006020828403121561384757600080fd5b60006138558482850161373d565b91505092915050565b60006020828403121561387057600080fd5b600061387e84828501613752565b91505092915050565b613890816140ae565b82525050565b61389f81614054565b82525050565b6138ae81614066565b82525050565b60006138bf82614022565b6138c98185614038565b93506138d9818560208601614150565b80840191505092915050565b6138ee816140c0565b82525050565b6138fd816140e4565b82525050565b61390c81614108565b82525050565b600061391d8261402d565b6139278185614043565b9350613937818560208601614150565b61394081614183565b840191505092915050565b6000613958600b83614043565b91507f21737472617465676973740000000000000000000000000000000000000000006000830152602082019050919050565b6000613998600583614043565b91507f2177616e740000000000000000000000000000000000000000000000000000006000830152602082019050919050565b60006139d8601b83614043565b91507f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006000830152602082019050919050565b6000613a18602183614043565b91507f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008301527f77000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613a7e600683614043565b91507f217661756c7400000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000613abe600783614043565b91507f21736861726573000000000000000000000000000000000000000000000000006000830152602082019050919050565b6000613afe601d83614043565b91507f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006000830152602082019050919050565b6000613b3e600b83614043565b91507f21617574686f72697a65640000000000000000000000000000000000000000006000830152602082019050919050565b6000613b7e602a83614043565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000613be4600a83614043565b91507f2170726f746563746564000000000000000000000000000000000000000000006000830152602082019050919050565b6000613c24603683614043565b91507f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60008301527f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000006020830152604082019050919050565b613c86816140a4565b82525050565b6000613c9882846138b4565b915081905092915050565b6000602082019050613cb86000830184613896565b92915050565b6000604082019050613cd36000830185613887565b613ce06020830184613c7d565b9392505050565b6000604082019050613cfc6000830185613896565b613d096020830184613896565b9392505050565b6000604082019050613d256000830185613896565b613d326020830184613c7d565b9392505050565b6000602082019050613d4e60008301846138a5565b92915050565b6000602082019050613d6960008301846138e5565b92915050565b6000602082019050613d8460008301846138f4565b92915050565b6000602082019050613d9f6000830184613903565b92915050565b60006020820190508181036000830152613dbf8184613912565b905092915050565b60006020820190508181036000830152613de08161394b565b9050919050565b60006020820190508181036000830152613e008161398b565b9050919050565b60006020820190508181036000830152613e20816139cb565b9050919050565b60006020820190508181036000830152613e4081613a0b565b9050919050565b60006020820190508181036000830152613e6081613a71565b9050919050565b60006020820190508181036000830152613e8081613ab1565b9050919050565b60006020820190508181036000830152613ea081613af1565b9050919050565b60006020820190508181036000830152613ec081613b31565b9050919050565b60006020820190508181036000830152613ee081613b71565b9050919050565b60006020820190508181036000830152613f0081613bd7565b9050919050565b60006020820190508181036000830152613f2081613c17565b9050919050565b6000602082019050613f3c6000830184613c7d565b92915050565b6000606082019050613f576000830186613c7d565b613f646020830185613896565b613f716040830184613c7d565b949350505050565b6000606082019050613f8e6000830186613c7d565b613f9b6020830185613c7d565b613fa86040830184613c7d565b949350505050565b6000608082019050613fc56000830187613c7d565b613fd26020830186613c7d565b613fdf6040830185613c7d565b613fec6060830184613c7d565b95945050505050565b6000604051905081810181811067ffffffffffffffff8211171561401857600080fd5b8060405250919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600061405f82614084565b9050919050565b60008115159050919050565b600061407d82614054565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006140b98261412c565b9050919050565b60006140cb826140d2565b9050919050565b60006140dd82614084565b9050919050565b60006140ef826140f6565b9050919050565b600061410182614084565b9050919050565b60006141138261411a565b9050919050565b600061412582614084565b9050919050565b60006141378261413e565b9050919050565b600061414982614084565b9050919050565b60005b8381101561416e578082015181840152602081019050614153565b8381111561417d576000848401525b50505050565b6000601f19601f8301169050919050565b61419d81614054565b81146141a857600080fd5b50565b6141b481614066565b81146141bf57600080fd5b50565b6141cb81614072565b81146141d657600080fd5b50565b6141e2816140a4565b81146141ed57600080fd5b5056fea2646970667358221220b8b23d5cd93364d0171a4b2a0fefc44e38c1914c67b213e87a8e58ec721ddd9864736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005f18c75abdae578b483e5f43f12a39cf75b973a9000000000000000000000000a354f35829ae975e850e23e9615b11da1b3dc4de00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000015526f757465722d7976555344432d3033302d3034330000000000000000000000
-----Decoded View---------------
Arg [0] : _vault (address): 0x5f18C75AbDAe578b483E5F43f12a39cF75b973a9
Arg [1] : _yVault (address): 0xa354F35829Ae975e850e23e9615b11Da1B3dC4DE
Arg [2] : _strategyName (string): Router-yvUSDC-030-043
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000005f18c75abdae578b483e5f43f12a39cf75b973a9
Arg [1] : 000000000000000000000000a354f35829ae975e850e23e9615b11da1b3dc4de
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000015
Arg [4] : 526f757465722d7976555344432d3033302d3034330000000000000000000000
Deployed Bytecode Sourcemap
48025:5354:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47544:440;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48881:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30747:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26023:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24999:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24908:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32946:148;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52377:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23548:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25629:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44138:505;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48210:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38196:170;;;:::i;:::-;;42412:1482;;;:::i;:::-;;26106:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48237:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37581:286;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28250:174;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25839:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24778:94;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30021:169;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24940:22;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24969:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52832:110;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27494:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45234:307;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28772:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40102:1504;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48990:137;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29470:151;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53160:216;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24880:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45970:164;;;:::i;:::-;;47544:440;26473:12;:10;:12::i;:::-;26459:26;;:10;:26;;;26451:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;47636:4:::1;;;;;;;;;;;47618:23;;:6;:23;;;;47610:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;47688:5;::::0;::::1;;;;;;;;47670:24;;:6;:24;;;;47662:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;47719:33;47755:17;:15;:17::i;:::-;47719:53;;47788:9;47783:102;47803:16;:23;47799:1;:27;47783:102;;;47851:16;47868:1;47851:19;;;;;;;;;;;;;;47841:29;;:6;:29;;;;47833:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;47828:3;;;;;;;47783:102;;;;47905:6;47898:23;;;47922:12;:10;:12::i;:::-;47943:6;47936:24;;;47969:4;47936:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47898:78;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26512:1;47544:440:::0;:::o;48881:101::-;48929:13;48962:12;48955:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48881:101;:::o;30747:175::-;26217:10;;;;;;;;;;;26203:24;;:10;:24;;;:54;;;;26245:12;:10;:12::i;:::-;26231:26;;:10;:26;;;26203:54;26195:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;30848:14:::1;30832:13;:30;;;;30878:36;30899:14;30878:36;;;;;;:::i;:::-;;;;;;;;30747:175:::0;:::o;26023:32::-;;;;:::o;24999:18::-;;;;;;;;;;;;;:::o;24908:25::-;;;;;;;;;;;;;:::o;32946:148::-;32987:4;33055:1;33011:5;;;;;;;;;;:16;;;33036:4;33011:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;33085:1;33060:22;:20;:22::i;:::-;:26;33011:75;33004:82;;32946:148;:::o;52377:97::-;48543:12;:10;:12::i;:::-;48529:26;;:10;:26;;;:129;;;;48615:42;48576:82;;:10;:82;;;48529:129;48507:162;;;;;;52458:8:::1;52448:7;:18;;;;52377:97:::0;:::o;23548:91::-;23591:13;23617:14;;;;;;;;;;;;;;;;;;;23548:91;:::o;25629:37::-;;;;:::o;44138:505::-;44197:13;44253:5;;;;;;;;;;;44231:28;;:10;:28;;;44223:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;44350:19;44403:32;44421:13;44403:17;:32::i;:::-;44380:55;;;;;;;;44527:4;;;;;;;;;;;:13;;;44541:10;44553:11;44527:38;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44138:505;;;;:::o;48210:20::-;;;;;;;;;;;;;:::o;38196:170::-;26585:6;;;;;;;;;;;26571:20;;:10;:20;;;:48;;;;26609:10;;;;;;;;;;;26595:24;;:10;:24;;;26571:48;:78;;;;26637:12;:10;:12::i;:::-;26623:26;;:10;:26;;;26571:78;26563:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;38319:39:::1;38334:5;::::0;::::1;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;38319:14;:39::i;:::-;38196:170::o:0;42412:1482::-;26585:6;;;;;;;;;;;26571:20;;:10;:20;;;:48;;;;26609:10;;;;;;;;;;;26595:24;;:10;:24;;;26571:48;:78;;;;26637:12;:10;:12::i;:::-;26623:26;;:10;:26;;;26571:78;26563:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;42463:14:::1;42492:12:::0;42519:23:::1;42545:5:::0;::::1;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42519:49;;42579:19;42617:13;;;;;;;;;;;42613:731;;;42699:19;42721:22;:20;:22::i;:::-;42699:44;;42877:80;42909:15;42895:11;:29;:61;;42941:15;42895:61;;;42927:11;42895:61;42877:17;:80::i;:::-;42855:102;;;;;;;;43049:15;43035:11;:29;43031:159;;;43094:32;43110:15;43094:11;:15;;:32;;;;:::i;:::-;43085:41;;43159:15;43145:29;;43031:159;42613:731;;;;43302:30;43316:15;43302:13;:30::i;:::-;43272:60;;;;;;;;;;;;42613:731;43558:5;::::0;::::1;;;;;;;;:12;;;43571:6;43579:4;43585:11;43558:39;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43540:57;;43689:19;:17;:19::i;:::-;43784:31;43799:15;43784:14;:31::i;:::-;43833:53;43843:6;43851:4;43857:11;43870:15;43833:53;;;;;;;;;:::i;:::-;;;;;;;;26676:1;;;;42412:1482::o:0;26106:25::-;;;;;;;;;;;;;:::o;48237:22::-;;;;:::o;37581:286::-;37649:4;37581:286;;;:::o;28250:174::-;26217:10;;;;;;;;;;;26203:24;;:10;:24;;;:54;;;;26245:12;:10;:12::i;:::-;26231:26;;:10;:26;;;26203:54;26195:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;28348:1:::1;28329:21;;:7;:21;;;;28321:30;;;::::0;::::1;;28371:7;28362:6;;:16;;;;;;;;;;;;;;;;;;28394:22;28408:7;28394:22;;;;;;:::i;:::-;;;;;;;;28250:174:::0;:::o;25839:33::-;;;;:::o;24778:94::-;24836:7;24778:94;:::o;30021:169::-;26217:10;;;;;;;;;;;26203:24;;:10;:24;;;:54;;;;26245:12;:10;:12::i;:::-;26231:26;;:10;:26;;;26203:54;26195:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;30119:13:::1;30104:12;:28;;;;30148:34;30168:13;30148:34;;;;;;:::i;:::-;;;;;;;;30021:169:::0;:::o;24940:22::-;;;;;;;;;;;;;:::o;24969:21::-;;;;;;;;;;;;;:::o;52832:110::-;52878:7;52905:4;;;;;;;;;;;:14;;;52928:4;52905:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52898:36;;52832:110;:::o;27494:202::-;26217:10;;;;;;;;;;;26203:24;;:10;:24;;;:54;;;;26245:12;:10;:12::i;:::-;26231:26;;:10;:26;;;26203:54;26195:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;27604:1:::1;27581:25;;:11;:25;;;;27573:34;;;::::0;::::1;;27631:11;27618:10;;:24;;;;;;;;;;;;;;;;;;27658:30;27676:11;27658:30;;;;;;:::i;:::-;;;;;;;;27494:202:::0;:::o;45234:307::-;45323:5;;;;;;;;;;45301:28;;:10;:28;;;:58;;;;45347:12;:10;:12::i;:::-;45333:26;;:10;:26;;;45301:58;45293:67;;;;;;45417:5;;;;;;;;;;45379:43;;45392:12;45379:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;45371:52;;;;;;45434:30;45451:12;45434:16;:30::i;:::-;45475:4;;;;;;;;;;;:13;;;45489:12;45503:4;;;;;;;;;;;:14;;;45526:4;45503:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45475:58;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;45234:307;:::o;28772:181::-;26360:10;;;;;;;;;;;26346:24;;:10;:24;;;26338:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;28873:1:::1;28853:22;;:8;:22;;;;28845:31;;;::::0;::::1;;28897:8;28887:7;;:18;;;;;;;;;;;;;;;;;;28921:24;28936:8;28921:24;;;;;;:::i;:::-;;;;;;;;28772:181:::0;:::o;40102:1504::-;40173:4;40190:28;;:::i;:::-;40221:5;;;;;;;;;;:16;;;40246:4;40221:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40190:62;;40350:1;40329:6;:17;;;:22;40325:40;;;40360:5;40353:12;;;;;40325:40;40484:14;;40442:38;40462:6;:17;;;40442:15;:19;;:38;;;;:::i;:::-;:56;40438:73;;40507:4;40500:11;;;;;40438:73;40919:19;40941:5;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;40919:45;;40993:13;;40979:11;:27;40975:44;;;41015:4;41008:11;;;;;;40975:44;41073:13;41089:22;:20;:22::i;:::-;41073:38;;41201:6;:16;;;41174:24;41184:13;;41174:5;:9;;:24;;;;:::i;:::-;:43;41170:60;;;41226:4;41219:11;;;;;;;41170:60;41243:14;41284:6;:16;;;41276:5;:24;41272:66;;;41311:27;41321:6;:16;;;41311:5;:9;;:27;;;;:::i;:::-;41302:36;;41272:66;41491:14;41508:5;;;;;;;;;;;:21;;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41491:40;;41579:18;41590:6;41579;:10;;:18;;;;:::i;:::-;41550:26;41567:8;41550:12;;:16;;:26;;;;:::i;:::-;:47;41542:56;;;;;;;40102:1504;;;;:::o;48990:137::-;49052:7;49079:40;49099:19;:17;:19::i;:::-;49079:15;:13;:15::i;:::-;:19;;:40;;;;:::i;:::-;49072:47;;48990:137;:::o;29470:151::-;26217:10;;;;;;;;;;;26203:24;;:10;:24;;;:54;;;;26245:12;:10;:12::i;:::-;26231:26;;:10;:26;;;26203:54;26195:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;29565:6:::1;29548:14;:23;;;;29587:26;29606:6;29587:26;;;;;;:::i;:::-;;;;;;;;29470:151:::0;:::o;53160:216::-;53210:7;53250:118;53336:6;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53332:2;:21;53250:59;53286:6;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53250:6;;;;;;;;;;;:16;;;53275:4;53250:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;:59;;;;:::i;:::-;:63;;:118;;;;:::i;:::-;53230:138;;53160:216;:::o;24880:21::-;;;;;;;;;;;;:::o;45970:164::-;26217:10;;;;;;;;;;;26203:24;;:10;:24;;;:54;;;;26245:12;:10;:12::i;:::-;26231:26;;:10;:26;;;26203:54;26195:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;46049:4:::1;46033:13;;:20;;;;;;;;;;;;;;;;;;46064:5;::::0;::::1;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;46104;;;;;;;;;;45970:164::o:0;31076:98::-;31121:7;31148:5;;;;;;;;;;;:16;;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31141:25;;31076:98;:::o;52150:219::-;52245:20;52303:1;52289:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52283:22;;52333:6;;;;;;;;;;;52316:3;52320:1;52316:6;;;;;;;;;;;;;:24;;;;;;;;;;;52150:219;:::o;50803:667::-;50907:25;50934:13;50965:15;50983;:13;:15::i;:::-;50965:33;;51024:13;51013:7;:24;51009:82;;51062:13;51077:1;51054:25;;;;;;;51009:82;51103:18;51124:26;51142:7;51124:13;:17;;:26;;;;:::i;:::-;51103:47;;51161:31;51181:10;51161:19;:31::i;:::-;51205:19;51227:15;:13;:15::i;:::-;51205:37;;51273:11;51257:13;:27;51253:210;;;51321:11;51301:31;;51355:30;51373:11;51355:13;:17;;:30;;;;:::i;:::-;51347:38;;51253:210;;;51438:13;51418:33;;51253:210;50803:667;;;;;;;:::o;50470:325::-;50553:13;;;;;;;;;;;50549:52;;;50583:7;;50549:52;50613:15;50631;:13;:15::i;:::-;50613:33;;50671:1;50661:7;:11;50657:131;;;50689:56;50713:6;;;;;;;;;;;50730:4;;;;;;;;;;;50737:7;50689:15;:56::i;:::-;50760:6;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50657:131;50470:325;;;:::o;11630:136::-;11688:7;11715:43;11719:1;11722;11715:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;11708:50;;11630:136;;;;:::o;49135:1327::-;49252:15;49282:13;49310:20;49358:18;49379:5;;;;;;;;;;:16;;;49404:4;49379:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;49358:62;;49431:19;49453:22;:20;:22::i;:::-;49431:44;;49553:11;49539:10;:25;49535:95;;49591:27;49607:10;49591:11;:15;;:27;;;;:::i;:::-;49581:37;;49535:95;49678:20;49733:72;49765:29;49786:7;49765:16;:20;;:29;;;;:::i;:::-;49733:17;:72::i;:::-;49709:96;;;;;;;;49831:40;49840:16;49858:12;49831:8;:40::i;:::-;49816:55;;49896:7;49888:5;:15;49884:571;;;50111:18;50121:7;50111:5;:9;;:18;;;;:::i;:::-;50103:26;;50154:1;50144:11;;49884:571;;;50401:18;50413:5;50401:7;:11;;:18;;;;:::i;:::-;50391:28;;50442:1;50434:9;;49884:571;49135:1327;;;;;;;;:::o;36328:297::-;36483:15;36501:5;;;;;;;;;;;:15;;;36525:4;36501:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36483:48;;36556:1;36546:7;:11;36542:76;;;36574:5;;;;;;;;;;:14;;;36589:7;;;;;;;;;;;36598;36574:32;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;36542:76;36328:297;:::o;51938:204::-;52015:119;52057:12;52091:6;;;;;;;;;;;52084:24;;;52117:4;52084:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52022:6;;;;;;;;;;;52015:27;;;;:119;;;;;:::i;:::-;51938:204;:::o;11166:181::-;11224:7;11244:9;11260:1;11256;:5;11244:17;;11285:1;11280;:6;;11272:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;11338:1;11331:8;;;11166:181;;;;:::o;12520:471::-;12578:7;12828:1;12823;:6;12819:47;;;12853:1;12846:8;;;;12819:47;12878:9;12894:1;12890;:5;12878:17;;12923:1;12918;12914;:5;;;;;;:10;12906:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;12982:1;12975:8;;;12520:471;;;;;:::o;13467:132::-;13525:7;13552:39;13556:1;13559;13552:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;13545:46;;13467:132;;;;:::o;51478:452::-;51559:1;51548:7;:12;51544:51;;;51577:7;;51544:51;51607:25;51635:6;;;;;;;;;;;:16;;;51660:4;51635:31;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51607:59;;51677:24;51717:63;51726:34;51752:7;51726:25;:34::i;:::-;51762:17;51717:8;:63::i;:::-;51677:103;;51817:1;51797:16;:21;51793:60;;;51835:7;;;;51793:60;51865:6;;;;;;;;;;;:15;;;51881:16;51907:4;51914:7;;51865:57;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;51478:452;;;;:::o;52482:342::-;52670:7;52624:6;52617:24;;;52650:4;52657:9;52617:50;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;52613:204;;;52694:40;52721:9;52732:1;52701:6;52694:26;;;;:40;;;;;:::i;:::-;52749:56;52776:9;52787:17;52756:6;52749:26;;;;:56;;;;;:::i;:::-;52613:204;52482:342;;;:::o;12069:192::-;12155:7;12188:1;12183;:6;;12191:12;12175:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;12215:9;12231:1;12227;:5;12215:17;;12252:1;12245:8;;;12069:192;;;;;:::o;9838:106::-;9896:7;9927:1;9923;:5;:13;;9935:1;9923:13;;;9931:1;9923:13;9916:20;;9838:106;;;;:::o;16656:177::-;16739:86;16759:5;16789:23;;;16814:2;16818:5;16766:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16739:19;:86::i;:::-;16656:177;;;:::o;14095:278::-;14181:7;14213:1;14209;:5;14216:12;14201:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;14240:9;14256:1;14252;:5;;;;;;14240:17;;14364:1;14357:8;;;14095:278;;;;;:::o;52950:202::-;53051:7;53083:61;53121:6;;;;;;;;;;;:20;;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53083:33;53098:6;;;;;;;;;;;:15;;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53094:2;:21;53083:6;:10;;:33;;;;:::i;:::-;:37;;:61;;;;:::i;:::-;53076:68;;52950:202;;;:::o;17315:622::-;17694:1;17685:5;:10;17684:62;;;;17744:1;17701:5;:15;;;17725:4;17732:7;17701:39;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;17684:62;17676:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;17839:90;17859:5;17889:22;;;17913:7;17922:5;17866:62;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17839:19;:90::i;:::-;17315:622;;;:::o;18961:761::-;19385:23;19411:69;19439:4;19411:69;;;;;;;;;;;;;;;;;19419:5;19411:27;;;;:69;;;;;:::i;:::-;19385:95;;19515:1;19495:10;:17;:21;19491:224;;;19637:10;19626:30;;;;;;;;;;;;:::i;:::-;19618:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;19491:224;18961:761;;;:::o;4295:196::-;4398:12;4430:53;4453:6;4461:4;4467:1;4470:12;4430:22;:53::i;:::-;4423:60;;4295:196;;;;;:::o;5672:979::-;5802:12;5835:18;5846:6;5835:10;:18::i;:::-;5827:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;5961:12;5975:23;6002:6;:11;;6022:8;6033:4;6002:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5960:78;;;;6053:7;6049:595;;;6084:10;6077:17;;;;;;6049:595;6218:1;6198:10;:17;:21;6194:439;;;6461:10;6455:17;6522:15;6509:10;6505:2;6501:19;6494:44;6409:148;6604:12;6597:20;;;;;;;;;;;:::i;:::-;;;;;;;;5672:979;;;;;;;:::o;1180:619::-;1240:4;1502:16;1529:19;1551:66;1529:88;;;;1720:7;1708:20;1696:32;;1760:11;1748:8;:23;;:42;;;;;1787:3;1775:15;;:8;:15;;1748:42;1740:51;;;;1180:619;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130::-;;85:6;72:20;63:29;;97:33;124:5;97:33;:::i;:::-;57:78;;;;:::o;142:134::-;;226:6;220:13;211:22;;238:33;265:5;238:33;:::i;:::-;205:71;;;;:::o;283:128::-;;364:6;358:13;349:22;;376:30;400:5;376:30;:::i;:::-;343:68;;;;:::o;418:166::-;;518:6;512:13;503:22;;530:49;573:5;530:49;:::i;:::-;497:87;;;;:::o;619:1490::-;;749:6;737:9;732:3;728:19;724:32;721:2;;;769:1;766;759:12;721:2;787:22;802:6;787:22;:::i;:::-;778:31;;869:1;901:60;957:3;948:6;937:9;933:22;901:60;:::i;:::-;894:4;887:5;883:16;876:86;819:154;1029:2;1062:60;1118:3;1109:6;1098:9;1094:22;1062:60;:::i;:::-;1055:4;1048:5;1044:16;1037:86;983:151;1189:2;1222:60;1278:3;1269:6;1258:9;1254:22;1222:60;:::i;:::-;1215:4;1208:5;1204:16;1197:86;1144:150;1349:2;1382:60;1438:3;1429:6;1418:9;1414:22;1382:60;:::i;:::-;1375:4;1368:5;1364:16;1357:86;1304:150;1510:3;1544:60;1600:3;1591:6;1580:9;1576:22;1544:60;:::i;:::-;1537:4;1530:5;1526:16;1519:86;1464:152;1671:3;1705:60;1761:3;1752:6;1741:9;1737:22;1705:60;:::i;:::-;1698:4;1691:5;1687:16;1680:86;1626:151;1832:3;1866:60;1922:3;1913:6;1902:9;1898:22;1866:60;:::i;:::-;1859:4;1852:5;1848:16;1841:86;1787:151;1993:3;2027:60;2083:3;2074:6;2063:9;2059:22;2027:60;:::i;:::-;2020:4;2013:5;2009:16;2002:86;1948:151;715:1394;;;;:::o;2116:130::-;;2196:6;2183:20;2174:29;;2208:33;2235:5;2208:33;:::i;:::-;2168:78;;;;:::o;2253:134::-;;2337:6;2331:13;2322:22;;2349:33;2376:5;2349:33;:::i;:::-;2316:71;;;;:::o;2394:241::-;;2498:2;2486:9;2477:7;2473:23;2469:32;2466:2;;;2514:1;2511;2504:12;2466:2;2549:1;2566:53;2611:7;2602:6;2591:9;2587:22;2566:53;:::i;:::-;2556:63;;2528:97;2460:175;;;;:::o;2642:263::-;;2757:2;2745:9;2736:7;2732:23;2728:32;2725:2;;;2773:1;2770;2763:12;2725:2;2808:1;2825:64;2881:7;2872:6;2861:9;2857:22;2825:64;:::i;:::-;2815:74;;2787:108;2719:186;;;;:::o;2912:257::-;;3024:2;3012:9;3003:7;2999:23;2995:32;2992:2;;;3040:1;3037;3030:12;2992:2;3075:1;3092:61;3145:7;3136:6;3125:9;3121:22;3092:61;:::i;:::-;3082:71;;3054:105;2986:183;;;;:::o;3176:295::-;;3307:2;3295:9;3286:7;3282:23;3278:32;3275:2;;;3323:1;3320;3313:12;3275:2;3358:1;3375:80;3447:7;3438:6;3427:9;3423:22;3375:80;:::i;:::-;3365:90;;3337:124;3269:202;;;;:::o;3478:324::-;;3623:3;3611:9;3602:7;3598:23;3594:33;3591:2;;;3640:1;3637;3630:12;3591:2;3675:1;3692:94;3778:7;3769:6;3758:9;3754:22;3692:94;:::i;:::-;3682:104;;3654:138;3585:217;;;;:::o;3809:241::-;;3913:2;3901:9;3892:7;3888:23;3884:32;3881:2;;;3929:1;3926;3919:12;3881:2;3964:1;3981:53;4026:7;4017:6;4006:9;4002:22;3981:53;:::i;:::-;3971:63;;3943:97;3875:175;;;;:::o;4057:263::-;;4172:2;4160:9;4151:7;4147:23;4143:32;4140:2;;;4188:1;4185;4178:12;4140:2;4223:1;4240:64;4296:7;4287:6;4276:9;4272:22;4240:64;:::i;:::-;4230:74;;4202:108;4134:186;;;;:::o;4327:142::-;4418:45;4457:5;4418:45;:::i;:::-;4413:3;4406:58;4400:69;;:::o;4476:113::-;4559:24;4577:5;4559:24;:::i;:::-;4554:3;4547:37;4541:48;;:::o;4596:104::-;4673:21;4688:5;4673:21;:::i;:::-;4668:3;4661:34;4655:45;;:::o;4707:356::-;;4835:38;4867:5;4835:38;:::i;:::-;4885:88;4966:6;4961:3;4885:88;:::i;:::-;4878:95;;4978:52;5023:6;5018:3;5011:4;5004:5;5000:16;4978:52;:::i;:::-;5051:6;5046:3;5042:16;5035:23;;4815:248;;;;;:::o;5070:154::-;5167:51;5212:5;5167:51;:::i;:::-;5162:3;5155:64;5149:75;;:::o;5231:154::-;5328:51;5373:5;5328:51;:::i;:::-;5323:3;5316:64;5310:75;;:::o;5392:158::-;5491:53;5538:5;5491:53;:::i;:::-;5486:3;5479:66;5473:77;;:::o;5557:347::-;;5669:39;5702:5;5669:39;:::i;:::-;5720:71;5784:6;5779:3;5720:71;:::i;:::-;5713:78;;5796:52;5841:6;5836:3;5829:4;5822:5;5818:16;5796:52;:::i;:::-;5869:29;5891:6;5869:29;:::i;:::-;5864:3;5860:39;5853:46;;5649:255;;;;;:::o;5912:311::-;;6072:67;6136:2;6131:3;6072:67;:::i;:::-;6065:74;;6172:13;6168:1;6163:3;6159:11;6152:34;6214:2;6209:3;6205:12;6198:19;;6058:165;;;:::o;6232:304::-;;6392:66;6456:1;6451:3;6392:66;:::i;:::-;6385:73;;6491:7;6487:1;6482:3;6478:11;6471:28;6527:2;6522:3;6518:12;6511:19;;6378:158;;;:::o;6545:327::-;;6705:67;6769:2;6764:3;6705:67;:::i;:::-;6698:74;;6805:29;6801:1;6796:3;6792:11;6785:50;6863:2;6858:3;6854:12;6847:19;;6691:181;;;:::o;6881:370::-;;7041:67;7105:2;7100:3;7041:67;:::i;:::-;7034:74;;7141:34;7137:1;7132:3;7128:11;7121:55;7210:3;7205:2;7200:3;7196:12;7189:25;7242:2;7237:3;7233:12;7226:19;;7027:224;;;:::o;7260:305::-;;7420:66;7484:1;7479:3;7420:66;:::i;:::-;7413:73;;7519:8;7515:1;7510:3;7506:11;7499:29;7556:2;7551:3;7547:12;7540:19;;7406:159;;;:::o;7574:306::-;;7734:66;7798:1;7793:3;7734:66;:::i;:::-;7727:73;;7833:9;7829:1;7824:3;7820:11;7813:30;7871:2;7866:3;7862:12;7855:19;;7720:160;;;:::o;7889:329::-;;8049:67;8113:2;8108:3;8049:67;:::i;:::-;8042:74;;8149:31;8145:1;8140:3;8136:11;8129:52;8209:2;8204:3;8200:12;8193:19;;8035:183;;;:::o;8227:311::-;;8387:67;8451:2;8446:3;8387:67;:::i;:::-;8380:74;;8487:13;8483:1;8478:3;8474:11;8467:34;8529:2;8524:3;8520:12;8513:19;;8373:165;;;:::o;8547:379::-;;8707:67;8771:2;8766:3;8707:67;:::i;:::-;8700:74;;8807:34;8803:1;8798:3;8794:11;8787:55;8876:12;8871:2;8866:3;8862:12;8855:34;8917:2;8912:3;8908:12;8901:19;;8693:233;;;:::o;8935:310::-;;9095:67;9159:2;9154:3;9095:67;:::i;:::-;9088:74;;9195:12;9191:1;9186:3;9182:11;9175:33;9236:2;9231:3;9227:12;9220:19;;9081:164;;;:::o;9254:391::-;;9414:67;9478:2;9473:3;9414:67;:::i;:::-;9407:74;;9514:34;9510:1;9505:3;9501:11;9494:55;9583:24;9578:2;9573:3;9569:12;9562:46;9636:2;9631:3;9627:12;9620:19;;9400:245;;;:::o;9653:113::-;9736:24;9754:5;9736:24;:::i;:::-;9731:3;9724:37;9718:48;;:::o;9773:271::-;;9926:93;10015:3;10006:6;9926:93;:::i;:::-;9919:100;;10036:3;10029:10;;9907:137;;;;:::o;10051:222::-;;10178:2;10167:9;10163:18;10155:26;;10192:71;10260:1;10249:9;10245:17;10236:6;10192:71;:::i;:::-;10149:124;;;;:::o;10280:349::-;;10443:2;10432:9;10428:18;10420:26;;10457:79;10533:1;10522:9;10518:17;10509:6;10457:79;:::i;:::-;10547:72;10615:2;10604:9;10600:18;10591:6;10547:72;:::i;:::-;10414:215;;;;;:::o;10636:333::-;;10791:2;10780:9;10776:18;10768:26;;10805:71;10873:1;10862:9;10858:17;10849:6;10805:71;:::i;:::-;10887:72;10955:2;10944:9;10940:18;10931:6;10887:72;:::i;:::-;10762:207;;;;;:::o;10976:333::-;;11131:2;11120:9;11116:18;11108:26;;11145:71;11213:1;11202:9;11198:17;11189:6;11145:71;:::i;:::-;11227:72;11295:2;11284:9;11280:18;11271:6;11227:72;:::i;:::-;11102:207;;;;;:::o;11316:210::-;;11437:2;11426:9;11422:18;11414:26;;11451:65;11513:1;11502:9;11498:17;11489:6;11451:65;:::i;:::-;11408:118;;;;:::o;11533:250::-;;11674:2;11663:9;11659:18;11651:26;;11688:85;11770:1;11759:9;11755:17;11746:6;11688:85;:::i;:::-;11645:138;;;;:::o;11790:250::-;;11931:2;11920:9;11916:18;11908:26;;11945:85;12027:1;12016:9;12012:17;12003:6;11945:85;:::i;:::-;11902:138;;;;:::o;12047:254::-;;12190:2;12179:9;12175:18;12167:26;;12204:87;12288:1;12277:9;12273:17;12264:6;12204:87;:::i;:::-;12161:140;;;;:::o;12308:310::-;;12455:2;12444:9;12440:18;12432:26;;12505:9;12499:4;12495:20;12491:1;12480:9;12476:17;12469:47;12530:78;12603:4;12594:6;12530:78;:::i;:::-;12522:86;;12426:192;;;;:::o;12625:416::-;;12825:2;12814:9;12810:18;12802:26;;12875:9;12869:4;12865:20;12861:1;12850:9;12846:17;12839:47;12900:131;13026:4;12900:131;:::i;:::-;12892:139;;12796:245;;;:::o;13048:416::-;;13248:2;13237:9;13233:18;13225:26;;13298:9;13292:4;13288:20;13284:1;13273:9;13269:17;13262:47;13323:131;13449:4;13323:131;:::i;:::-;13315:139;;13219:245;;;:::o;13471:416::-;;13671:2;13660:9;13656:18;13648:26;;13721:9;13715:4;13711:20;13707:1;13696:9;13692:17;13685:47;13746:131;13872:4;13746:131;:::i;:::-;13738:139;;13642:245;;;:::o;13894:416::-;;14094:2;14083:9;14079:18;14071:26;;14144:9;14138:4;14134:20;14130:1;14119:9;14115:17;14108:47;14169:131;14295:4;14169:131;:::i;:::-;14161:139;;14065:245;;;:::o;14317:416::-;;14517:2;14506:9;14502:18;14494:26;;14567:9;14561:4;14557:20;14553:1;14542:9;14538:17;14531:47;14592:131;14718:4;14592:131;:::i;:::-;14584:139;;14488:245;;;:::o;14740:416::-;;14940:2;14929:9;14925:18;14917:26;;14990:9;14984:4;14980:20;14976:1;14965:9;14961:17;14954:47;15015:131;15141:4;15015:131;:::i;:::-;15007:139;;14911:245;;;:::o;15163:416::-;;15363:2;15352:9;15348:18;15340:26;;15413:9;15407:4;15403:20;15399:1;15388:9;15384:17;15377:47;15438:131;15564:4;15438:131;:::i;:::-;15430:139;;15334:245;;;:::o;15586:416::-;;15786:2;15775:9;15771:18;15763:26;;15836:9;15830:4;15826:20;15822:1;15811:9;15807:17;15800:47;15861:131;15987:4;15861:131;:::i;:::-;15853:139;;15757:245;;;:::o;16009:416::-;;16209:2;16198:9;16194:18;16186:26;;16259:9;16253:4;16249:20;16245:1;16234:9;16230:17;16223:47;16284:131;16410:4;16284:131;:::i;:::-;16276:139;;16180:245;;;:::o;16432:416::-;;16632:2;16621:9;16617:18;16609:26;;16682:9;16676:4;16672:20;16668:1;16657:9;16653:17;16646:47;16707:131;16833:4;16707:131;:::i;:::-;16699:139;;16603:245;;;:::o;16855:416::-;;17055:2;17044:9;17040:18;17032:26;;17105:9;17099:4;17095:20;17091:1;17080:9;17076:17;17069:47;17130:131;17256:4;17130:131;:::i;:::-;17122:139;;17026:245;;;:::o;17278:222::-;;17405:2;17394:9;17390:18;17382:26;;17419:71;17487:1;17476:9;17472:17;17463:6;17419:71;:::i;:::-;17376:124;;;;:::o;17507:444::-;;17690:2;17679:9;17675:18;17667:26;;17704:71;17772:1;17761:9;17757:17;17748:6;17704:71;:::i;:::-;17786:72;17854:2;17843:9;17839:18;17830:6;17786:72;:::i;:::-;17869;17937:2;17926:9;17922:18;17913:6;17869:72;:::i;:::-;17661:290;;;;;;:::o;17958:444::-;;18141:2;18130:9;18126:18;18118:26;;18155:71;18223:1;18212:9;18208:17;18199:6;18155:71;:::i;:::-;18237:72;18305:2;18294:9;18290:18;18281:6;18237:72;:::i;:::-;18320;18388:2;18377:9;18373:18;18364:6;18320:72;:::i;:::-;18112:290;;;;;;:::o;18409:556::-;;18620:3;18609:9;18605:19;18597:27;;18635:71;18703:1;18692:9;18688:17;18679:6;18635:71;:::i;:::-;18717:72;18785:2;18774:9;18770:18;18761:6;18717:72;:::i;:::-;18800;18868:2;18857:9;18853:18;18844:6;18800:72;:::i;:::-;18883;18951:2;18940:9;18936:18;18927:6;18883:72;:::i;:::-;18591:374;;;;;;;:::o;18972:256::-;;19034:2;19028:9;19018:19;;19072:4;19064:6;19060:17;19171:6;19159:10;19156:22;19135:18;19123:10;19120:34;19117:62;19114:2;;;19192:1;19189;19182:12;19114:2;19212:10;19208:2;19201:22;19012:216;;;;:::o;19235:121::-;;19328:5;19322:12;19312:22;;19293:63;;;:::o;19363:122::-;;19457:5;19451:12;19441:22;;19422:63;;;:::o;19493:144::-;;19628:3;19613:18;;19606:31;;;;:::o;19646:163::-;;19761:6;19756:3;19749:19;19798:4;19793:3;19789:14;19774:29;;19742:67;;;;:::o;19817:91::-;;19879:24;19897:5;19879:24;:::i;:::-;19868:35;;19862:46;;;:::o;19915:85::-;;19988:5;19981:13;19974:21;19963:32;;19957:43;;;:::o;20007:107::-;;20085:24;20103:5;20085:24;:::i;:::-;20074:35;;20068:46;;;:::o;20121:121::-;;20194:42;20187:5;20183:54;20172:65;;20166:76;;;:::o;20249:72::-;;20311:5;20300:16;;20294:27;;;:::o;20328:129::-;;20415:37;20446:5;20415:37;:::i;:::-;20402:50;;20396:61;;;:::o;20464:149::-;;20557:51;20602:5;20557:51;:::i;:::-;20544:64;;20538:75;;;:::o;20620:122::-;;20713:24;20731:5;20713:24;:::i;:::-;20700:37;;20694:48;;;:::o;20749:149::-;;20842:51;20887:5;20842:51;:::i;:::-;20829:64;;20823:75;;;:::o;20905:122::-;;20998:24;21016:5;20998:24;:::i;:::-;20985:37;;20979:48;;;:::o;21034:153::-;;21129:53;21176:5;21129:53;:::i;:::-;21116:66;;21110:77;;;:::o;21194:124::-;;21289:24;21307:5;21289:24;:::i;:::-;21276:37;;21270:48;;;:::o;21325:121::-;;21404:37;21435:5;21404:37;:::i;:::-;21391:50;;21385:61;;;:::o;21453:108::-;;21532:24;21550:5;21532:24;:::i;:::-;21519:37;;21513:48;;;:::o;21569:268::-;21634:1;21641:101;21655:6;21652:1;21649:13;21641:101;;;21731:1;21726:3;21722:11;21716:18;21712:1;21707:3;21703:11;21696:39;21677:2;21674:1;21670:10;21665:15;;21641:101;;;21757:6;21754:1;21751:13;21748:2;;;21822:1;21813:6;21808:3;21804:16;21797:27;21748:2;21618:219;;;;:::o;21845:97::-;;21933:2;21929:7;21924:2;21917:5;21913:14;21909:28;21899:38;;21893:49;;;:::o;21950:117::-;22019:24;22037:5;22019:24;:::i;:::-;22012:5;22009:35;21999:2;;22058:1;22055;22048:12;21999:2;21993:74;:::o;22074:111::-;22140:21;22155:5;22140:21;:::i;:::-;22133:5;22130:32;22120:2;;22176:1;22173;22166:12;22120:2;22114:71;:::o;22192:149::-;22277:40;22311:5;22277:40;:::i;:::-;22270:5;22267:51;22257:2;;22332:1;22329;22322:12;22257:2;22251:90;:::o;22348:117::-;22417:24;22435:5;22417:24;:::i;:::-;22410:5;22407:35;22397:2;;22456:1;22453;22446:12;22397:2;22391:74;:::o
Swarm Source
ipfs://b8b23d5cd93364d0171a4b2a0fefc44e38c1914c67b213e87a8e58ec721ddd98
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $1.11 | 2,582,936.1762 | $2,867,059.16 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.