More Info
Private Name Tags
ContractCreator:
Sponsored
Latest 21 from a total of 21 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Harvest | 22583947 | 859 days ago | IN | 0 FTM | 0.36925371 | ||||
Harvest | 22583888 | 859 days ago | IN | 0 FTM | 0.34933386 | ||||
Tend | 22053943 | 865 days ago | IN | 0 FTM | 0.24167489 | ||||
Harvest | 20605047 | 879 days ago | IN | 0 FTM | 0.32218974 | ||||
Tend | 19990506 | 886 days ago | IN | 0 FTM | 0.22407473 | ||||
Harvest | 18884113 | 898 days ago | IN | 0 FTM | 0.62132864 | ||||
Harvest | 18386195 | 905 days ago | IN | 0 FTM | 0.73150244 | ||||
Harvest | 17865197 | 912 days ago | IN | 0 FTM | 0.08735601 | ||||
Harvest | 17696237 | 914 days ago | IN | 0 FTM | 0.42081574 | ||||
Harvest | 17693263 | 915 days ago | IN | 0 FTM | 0.40096104 | ||||
Harvest | 17672975 | 915 days ago | IN | 0 FTM | 0.63945045 | ||||
Harvest | 17637098 | 915 days ago | IN | 0 FTM | 0.6708726 | ||||
Harvest | 17607581 | 916 days ago | IN | 0 FTM | 0.62964827 | ||||
Harvest | 17607544 | 916 days ago | IN | 0 FTM | 0.64335903 | ||||
Set Rewards | 17550849 | 917 days ago | IN | 0 FTM | 0.01071851 | ||||
Harvest | 17546381 | 917 days ago | IN | 0 FTM | 0.86792301 | ||||
Harvest | 17493208 | 918 days ago | IN | 0 FTM | 1.2699642 | ||||
0xaa8c7890 | 17445019 | 919 days ago | IN | 0 FTM | 0.12575531 | ||||
0xaa8c7890 | 17444993 | 919 days ago | IN | 0 FTM | 0.17471197 | ||||
Harvest | 17433374 | 919 days ago | IN | 0 FTM | 0.54704016 | ||||
0x60806040 | 17386450 | 920 days ago | IN | Create: Strategy | 0 FTM | 1.41823028 |
Latest 3 internal transactions
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
17445019 | 919 days ago | Contract Creation | 0 FTM | |||
17444993 | 919 days ago | Contract Creation | 0 FTM | |||
17386450 | 920 days ago | Contract Creation | 0 FTM |
Loading...
Loading
Contract Name:
Strategy
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-09-20 */ // 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 minDebtPerHarvest; uint256 maxDebtPerHarvest; uint256 lastReport; uint256 totalDebt; uint256 totalGain; uint256 totalLoss; } // Part: IERC20Extended interface IERC20Extended { function decimals() external view returns (uint8); } // Part: ILendingPool interface ILendingPool { function exchangeRate() external returns (uint256); function exchangeRateLast() external view returns (uint256); function collateral() external view returns (address); function mint(address minter) external returns (uint256); function redeem(address redeemer) external returns (uint256); } // Part: IUniswapV2Router01 interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns ( uint256 amountA, uint256 amountB, uint256 liquidity ); function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ); function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountToken, uint256 amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountA, uint256 amountB); function removeLiquidityETHWithPermit( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountToken, uint256 amountETH); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure returns (uint256 amountB); function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountOut); function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure returns (uint256 amountIn); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); } // 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: iearn-finance/[email protected]/HealthCheck interface HealthCheck { function check( uint256 profit, uint256 loss, uint256 debtPayment, uint256 debtOutstanding, uint256 totalDebt ) external view returns (bool); } // Part: ILendingPoolToken interface ILendingPoolToken is ILendingPool, IERC20 {} // Part: IUniswapV2Router02 interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external returns (uint256 amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint256 amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external; } // 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: iearn-finance/[email protected]/VaultAPI interface VaultAPI is IERC20 { function name() external view returns (string calldata); function symbol() external view returns (string calldata); function decimals() external view returns (uint256); function apiVersion() external pure returns (string memory); function permit( address owner, address spender, uint256 amount, uint256 expiry, bytes calldata signature ) external returns (bool); // NOTE: Vyper produces multiple signatures for a given function with "default" args function deposit() external returns (uint256); function deposit(uint256 amount) external returns (uint256); function deposit(uint256 amount, address recipient) external returns (uint256); // NOTE: Vyper produces multiple signatures for a given function with "default" args function withdraw() external returns (uint256); function withdraw(uint256 maxShares) external returns (uint256); function withdraw(uint256 maxShares, address recipient) external returns (uint256); function token() external view returns (address); function strategies(address _strategy) external view returns (StrategyParams memory); function pricePerShare() external view returns (uint256); function totalAssets() external view returns (uint256); function depositLimit() external view returns (uint256); function maxAvailableShares() external view returns (uint256); /** * 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); /** * View the management address of the Vault to assert privileged functions * can only be called by management. The Strategy serves the Vault, so it * is subject to management defined by the Vault. */ function management() external view returns (address); /** * View the guardian address of the Vault to assert privileged functions * can only be called by guardian. The Strategy serves the Vault, so it * is subject to guardian defined by the Vault. */ function guardian() external view returns (address); } // Part: iearn-finance/[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; using SafeERC20 for IERC20; string public metadataURI; // health checks bool public doHealthCheck; address public healthCheck; /** * @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.4.3"; } /** * @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 view virtual 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. * Also note that this value is used to determine the total assets under management by this * strategy, for the purposes of computing the management fee in `Vault` * @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 view virtual 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 UpdatedMinReportDelay(uint256 delay); event UpdatedMaxReportDelay(uint256 delay); event UpdatedProfitFactor(uint256 profitFactor); event UpdatedDebtThreshold(uint256 debtThreshold); event EmergencyExitEnabled(); event UpdatedMetadataURI(string metadataURI); // The minimum number of seconds between harvest calls. See // `setMinReportDelay()` for more details. uint256 public minReportDelay; // The maximum number of seconds between harvest calls. See // `setMaxReportDelay()` for more details. uint256 public maxReportDelay; // The minimum multiple that `callCost` must be above the credit/profit to // be "justifiable". See `setProfitFactor()` for more details. uint256 public profitFactor; // Use this to adjust the threshold at which running a debt causes a // harvest trigger. See `setDebtThreshold()` for more details. uint256 public debtThreshold; // See note on `setEmergencyExit()`. bool public emergencyExit; // modifiers modifier onlyAuthorized() { require(msg.sender == strategist || msg.sender == governance(), "!authorized"); _; } modifier onlyEmergencyAuthorized() { require( msg.sender == strategist || msg.sender == governance() || msg.sender == vault.guardian() || msg.sender == vault.management(), "!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() || msg.sender == vault.guardian() || msg.sender == vault.management(), "!authorized" ); _; } modifier onlyVaultManagers() { require(msg.sender == vault.management() || msg.sender == governance(), "!authorized"); _; } constructor(address _vault) public { _initialize(_vault, msg.sender, msg.sender, msg.sender); } /** * @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. * @param _strategist The address to assign as `strategist`. * The strategist is able to change the reward address * @param _rewards The address to use for pulling rewards. * @param _keeper The adddress of the _keeper. _keeper * can harvest and tend a strategy. */ function _initialize( address _vault, address _strategist, address _rewards, address _keeper ) internal { require(address(want) == address(0), "Strategy already initialized"); vault = VaultAPI(_vault); want = IERC20(vault.token()); want.safeApprove(_vault, uint256(-1)); // Give Vault unlimited access (might save gas) strategist = _strategist; rewards = _rewards; keeper = _keeper; // initialize variables minReportDelay = 0; maxReportDelay = 86400; profitFactor = 100; debtThreshold = 0; vault.approve(rewards, uint256(-1)); // Allow rewards to be pulled } function setHealthCheck(address _healthCheck) external onlyVaultManagers { healthCheck = _healthCheck; } function setDoHealthCheck(bool _doHealthCheck) external onlyVaultManagers { doHealthCheck = _doHealthCheck; } /** * @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`. EOA or smart contract which has the permission * to pull rewards from the vault. * * This may only be called by the strategist. * @param _rewards The address to use for pulling rewards. */ function setRewards(address _rewards) external onlyStrategist { require(_rewards != address(0)); vault.approve(rewards, 0); rewards = _rewards; vault.approve(rewards, uint256(-1)); emit UpdatedRewards(_rewards); } /** * @notice * Used to change `minReportDelay`. `minReportDelay` is the minimum number * of blocks that should pass for `harvest()` to be called. * * For external keepers (such as the Keep3r network), this is the minimum * time between jobs to wait. (see `harvestTrigger()` * for more details.) * * This may only be called by governance or the strategist. * @param _delay The minimum number of seconds to wait between harvests. */ function setMinReportDelay(uint256 _delay) external onlyAuthorized { minReportDelay = _delay; emit UpdatedMinReportDelay(_delay); } /** * @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 UpdatedMaxReportDelay(_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); } /** * @notice * Used to change `metadataURI`. `metadataURI` is used to store the URI * of the file describing the strategy. * * This may only be called by governance or the strategist. * @param _metadataURI The URI that describe the strategy. */ function setMetadataURI(string calldata _metadataURI) external onlyAuthorized { metadataURI = _metadataURI; emit UpdatedMetadataURI(_metadataURI); } /** * 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 conversion from `_amtInWei` (denominated in wei) * to `want` (using the native decimal characteristics of `want`). * @dev * Care must be taken when working with decimals to assure that the conversion * is compatible. As an example: * * given 1e17 wei (0.1 ETH) as input, and want is USDC (6 decimals), * with USDC/ETH = 1800, this should give back 1800000000 (180 USDC) * * @param _amtInWei The amount (in wei/1e-18 ETH) to convert to `want` * @return The amount in `want` of `_amtInEth` converted to `want` **/ function ethToWant(uint256 _amtInWei) public view virtual returns (uint256); /** * @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 view virtual 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`). * * `_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) where the amount made available is less than what is needed. * * NOTE: The invariant `_liquidatedAmount + _loss <= _amountNeeded` should always be maintained */ function liquidatePosition(uint256 _amountNeeded) internal virtual returns (uint256 _liquidatedAmount, uint256 _loss); /** * Liquidate everything and returns the amount that got freed. * This function is used during emergency exit instead of `prepareReturn()` to * liquidate all of the Strategy's positions back to the Vault. */ function liquidateAllPositions() internal virtual returns (uint256 _amountFreed); /** * @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 * `callCostInWei` must be priced in terms of `wei` (1e-18 ETH). * * This call and `harvestTrigger()` should never return `true` at the same * time. * @param callCostInWei The keeper's estimated gas cost to call `tend()` (in wei). * @return `true` if `tend()` should be called, `false` otherwise. */ function tendTrigger(uint256 callCostInWei) public view virtual 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. // If your implementation uses the cost of the call in want, you can // use uint256 callCost = ethToWant(callCostInWei); 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 * `callCostInWei` must be priced in terms of `wei` (1e-18 ETH). * * This call and `tendTrigger` should never return `true` at the * same time. * * See `min/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/main/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 callCostInWei The keeper's estimated gas cost to call `harvest()` (in wei). * @return `true` if `harvest()` should be called, `false` otherwise. */ function harvestTrigger(uint256 callCostInWei) public view virtual returns (bool) { uint256 callCost = ethToWant(callCostInWei); StrategyParams memory params = vault.strategies(address(this)); // Should not trigger if Strategy is not activated if (params.activation == 0) return false; // Should not trigger if we haven't waited long enough since previous harvest if (block.timestamp.sub(params.lastReport) < minReportDelay) 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 amountFreed = liquidateAllPositions(); if (amountFreed < debtOutstanding) { loss = debtOutstanding.sub(amountFreed); } else if (amountFreed > debtOutstanding) { profit = amountFreed.sub(debtOutstanding); } debtPayment = debtOutstanding.sub(loss); } 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. uint256 totalDebt = vault.strategies(address(this)).totalDebt; debtOutstanding = vault.report(profit, loss, debtPayment); // Check if free returns are left, and re-invest them adjustPosition(debtOutstanding); // call healthCheck contract if (doHealthCheck && healthCheck != address(0)) { require(HealthCheck(healthCheck).check(profit, loss, debtPayment, debtOutstanding, totalDebt), "!healthcheck"); } else { doHealthCheck = true; } 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 `_amountNeeded` uint256 amountFreed; (amountFreed, _loss) = liquidatePosition(_amountNeeded); // Send it directly back (NOTE: Using `msg.sender` saves some gas here) want.safeTransfer(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 the Vault. * @dev * The new Strategy's Vault must be the same as this Strategy's Vault. * The migration process should be carefully performed to make sure all * the assets are migrated to the new address, which should have never * interacted with the vault before. * @param _newStrategy The Strategy to migrate to. */ function migrate(address _newStrategy) external { require(msg.sender == address(vault)); require(BaseStrategy(_newStrategy).vault() == vault); prepareMigration(_newStrategy); want.safeTransfer(_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 onlyEmergencyAuthorized { 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 view virtual 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).safeTransfer(governance(), IERC20(_token).balanceOf(address(this))); } } // File: Strategy.sol contract Strategy is BaseStrategy { using SafeERC20 for IERC20; using SafeERC20 for ILendingPoolToken; using Address for address; using SafeMath for uint256; struct PoolAlloc { address pool; uint256 alloc; } uint256 private constant BASIS_PRECISION = 10000; uint256 public minProfit; uint256 public minCredit; //Spookyswap as default IUniswapV2Router02 router = IUniswapV2Router02(0xF491e7B69E4244ad4002BC14e878a34207E38c29); address weth = router.WETH(); //This records the current pools and allocs PoolAlloc[] public alloc; event Cloned(address indexed clone); constructor(address _vault, PoolAlloc[] memory _alloc) public BaseStrategy(_vault) { _initializeStrat(_alloc); } function _initializeStrat(PoolAlloc[] memory _alloc) internal { // You can set these parameters on deployment to whatever you want maxReportDelay = 6300; profitFactor = 1500; uint256 _decimals = IERC20Extended(address(want)).decimals(); debtThreshold = 1_000_000 * 1e18; require(checkAllocTotal(_alloc), "Alloc total shouldnt be more than 10000"); _setAlloc(_alloc); addApprovals(); } function initialize( address _vault, address _strategist, address _rewards, address _keeper, PoolAlloc[] memory _alloc ) external { //note: initialise can only be called once. in _initialize in BaseStrategy we have: require(address(want) == address(0), "Strategy already initialized"); _initialize(_vault, _strategist, _rewards, _keeper); _initializeStrat(_alloc); } function cloneStrategy(address _vault, PoolAlloc[] memory _alloc) external returns (address newStrategy) { newStrategy = this.cloneStrategy(_vault, msg.sender, msg.sender, msg.sender, _alloc); } function cloneStrategy( address _vault, address _strategist, address _rewards, address _keeper, PoolAlloc[] memory _alloc ) external returns (address newStrategy) { // Copied from https://github.com/optionality/clone-factory/blob/master/contracts/CloneFactory.sol bytes20 addressBytes = bytes20(address(this)); assembly { // EIP-1167 bytecode let clone_code := mload(0x40) mstore(clone_code, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(clone_code, 0x14), addressBytes) mstore(add(clone_code, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) newStrategy := create(0, clone_code, 0x37) } Strategy(newStrategy).initialize(_vault, _strategist, _rewards, _keeper, _alloc); emit Cloned(newStrategy); } function name() external view override returns (string memory) { return "StrategyTarotLender"; } function wantTobToken(address _pool, uint256 _requiredWant) internal view returns (uint256 _amount) { if (_requiredWant == 0) return _requiredWant; // This gives us the price per share of xToken uint256 pps = ILendingPool(_pool).exchangeRateLast(); //Now calculate based on pps _amount = _requiredWant.mul(1e18).div(pps); } function bTokenToWant(address _pool, uint256 _bBal) public view returns (uint256 _amount) { if (_bBal == 0) return _bBal; // This gives us the price per share of xToken uint256 pps = ILendingPool(_pool).exchangeRateLast(); _amount = (_bBal * pps) / 1e18; } function balanceInPool(address _pool) internal view returns (uint256 bal) { bal = bTokenToWant(_pool, ILendingPoolToken(_pool).balanceOf(address(this))); } function balanceOfWant() public view returns (uint256) { return want.balanceOf(address(this)); } //Returns staked value function balanceOfStake() public view returns (uint256 total) { for (uint256 i = 0; i < alloc.length; i++) { total = total.add(balanceInPool(alloc[i].pool)); } } function pendingInterest() public view returns (uint256) { uint256 debt = vault.strategies(address(this)).totalDebt; uint256 lendBal = balanceOfStake(); if (debt < lendBal) { //This will add to profit return lendBal.sub(debt); } } function estimatedTotalAssets() public view override returns (uint256) { //Add the want balance and staked balance return balanceOfWant().add(balanceOfStake()); } function tendTrigger(uint256 callCostInWei) public view virtual override returns (bool) { return balanceOfWant() > minCredit; } function harvestTrigger(uint256 callCostInWei) public view virtual override returns (bool) { return pendingInterest() > minProfit || vault.creditAvailable() > minCredit; } function checkAllocTotal(PoolAlloc[] memory _alloc) internal pure returns (bool) { uint256 total = 0; for (uint256 i = 0; i < _alloc.length; i++) { total += _alloc[i].alloc; } return total <= BASIS_PRECISION; } function depositToPool(address _pool, uint256 _amount) internal { if (_amount > 0) { want.safeTransfer(_pool, _amount); require(ILendingPoolToken(_pool).mint(address(this)) >= 0, "No lend tokens minted"); } } function updateExchangeRates() internal { //Update all the rates before harvest for (uint256 i = 0; i < alloc.length; i++) { ILendingPool(alloc[i].pool).exchangeRate(); } } function calculatePTAmount(address _pool, uint256 _amount) internal returns (uint256 pAmount) { uint256 pBal = ILendingPoolToken(_pool).balanceOf(address(this)); pAmount = wantTobToken(_pool, _amount); if (pAmount > pBal) pAmount = pBal; } function _withdrawFrom(address _pool) internal { uint256 pAmount = ILendingPoolToken(_pool).balanceOf(address(this)); ILendingPoolToken(_pool).safeTransfer(_pool, pAmount); require(ILendingPoolToken(_pool).redeem(address(this)) > 0, "Not enough returned"); } function withdrawFromPool(address _pool, uint256 _amount) internal { uint256 liqAvail = want.balanceOf(_pool); _amount = Math.min(_amount, liqAvail); uint256 pAmount = calculatePTAmount(_pool, _amount); uint256 returnedAmount; if (pAmount > 0) { //Extra addition on liquidate position to cover edge cases of a few wei defecit ILendingPoolToken(_pool).safeTransfer(_pool, pAmount); returnedAmount = ILendingPoolToken(_pool).redeem(address(this)); } if (returnedAmount < _amount) { //Withdraw all and reinvest remaining uint256 toCover = _amount.sub(returnedAmount); pAmount = calculatePTAmount(_pool, _amount); if (pAmount > 0) { ILendingPoolToken(_pool).safeTransfer(_pool, pAmount); require(ILendingPoolToken(_pool).redeem(address(this)) >= toCover, "Not enough returned"); } } } function _deposit(uint256 _depositAmount) internal { for (uint256 i = 0; i < alloc.length; i++) { depositToPool(alloc[i].pool, calculateAllocFromBal(_depositAmount, alloc[i].alloc)); } } function _withdrawAll() internal { for (uint256 i = 0; i < alloc.length; i++) { _withdrawFrom(alloc[i].pool); } } function _withdraw(uint256 _withdrawAmount) internal { //Update before trying to withdraw updateExchangeRates(); for (uint256 i = 0; i < alloc.length; i++) { withdrawFromPool(alloc[i].pool, calculateAllocFromBal(_withdrawAmount, alloc[i].alloc)); } } function revokeApprovals() internal { for (uint256 i = 0; i < alloc.length; i++) { want.approve(alloc[i].pool, 0); } } function addApprovals() internal { for (uint256 i = 0; i < alloc.length; i++) { if (want.allowance(address(this), alloc[i].pool) == 0) want.approve(alloc[i].pool, type(uint256).max); } } function updateMinProfit(uint256 _minProfit) external onlyStrategist { minProfit = _minProfit; } function updateMinCredit(uint256 _minCredit) external onlyStrategist { minCredit = _minCredit; } function changeAllocs(PoolAlloc[] memory _newAlloc) external onlyGovernance { // Withdraw from all positions currently allocated if (balanceOfStake() > 0) { _withdrawAll(); revokeApprovals(); } require(checkAllocTotal(_newAlloc), "Alloc total shouldnt be more than 10000"); _setAlloc(_newAlloc); addApprovals(); _deposit(balanceOfWant()); } function _setAlloc(PoolAlloc[] memory _newAlloc) internal { //Delete old entries delete alloc; for (uint256 i = 0; i < _newAlloc.length; i++) { alloc.push(PoolAlloc({pool: _newAlloc[i].pool, alloc: _newAlloc[i].alloc})); } } function calculateAllocFromBal(uint256 _bal, uint256 _allocPoints) internal pure returns (uint256) { return _bal.mul(_allocPoints).div(BASIS_PRECISION); } function returnDebtOutstanding(uint256 _debtOutstanding) internal returns (uint256 _debtPayment, uint256 _loss) { // We might need to return want to the vault if (_debtOutstanding > 0) { uint256 _amountFreed = 0; (_amountFreed, _loss) = liquidatePosition(_debtOutstanding); _debtPayment = Math.min(_amountFreed, _debtOutstanding); } } function handleProfit() internal returns (uint256 _profit) { uint256 balanceOfWantBefore = balanceOfWant(); updateExchangeRates(); _profit = balanceOfWant().sub(balanceOfWantBefore); _profit += pendingInterest(); } function prepareReturn(uint256 _debtOutstanding) internal override returns ( uint256 _profit, uint256 _loss, uint256 _debtPayment ) { (_debtPayment, _loss) = returnDebtOutstanding(_debtOutstanding); _profit = handleProfit(); uint256 balanceAfter = balanceOfWant(); uint256 requiredWantBal = _profit + _debtPayment; if (balanceAfter < requiredWantBal) { //Withdraw enough to satisfy profit check _withdraw(requiredWantBal.sub(balanceAfter)); } } function adjustPosition(uint256 _debtOutstanding) internal override { uint256 _wantAvailable = balanceOfWant(); if (_debtOutstanding >= _wantAvailable) { return; } uint256 toInvest = _wantAvailable.sub(_debtOutstanding); if (toInvest > 0) { _deposit(toInvest); } } function liquidatePosition(uint256 _amountNeeded) internal override returns (uint256 _liquidatedAmount, uint256 _loss) { // NOTE: Maintain invariant `want.balanceOf(this) >= _liquidatedAmount` // NOTE: Maintain invariant `_liquidatedAmount + _loss <= _amountNeeded` uint256 balanceWant = balanceOfWant(); uint256 balanceStaked = balanceOfStake(); if (_amountNeeded > balanceWant) { uint256 amountToWithdraw = (Math.min(balanceStaked, _amountNeeded - balanceWant)); _withdraw(amountToWithdraw); } // Since we might free more than needed, let's send back the min _liquidatedAmount = Math.min(balanceOfWant(), _amountNeeded); _loss = _amountNeeded > _liquidatedAmount ? _amountNeeded.sub(_liquidatedAmount) : 0; } function getTokenOutPath(address _token_in, address _token_out) internal view returns (address[] memory _path) { bool is_weth = _token_in == address(weth) || _token_out == address(weth); _path = new address[](is_weth ? 2 : 3); _path[0] = _token_in; if (is_weth) { _path[1] = _token_out; } else { _path[1] = address(weth); _path[2] = _token_out; } } function quote( address _in, address _out, uint256 _amtIn ) internal view returns (uint256) { address[] memory path = getTokenOutPath(_in, _out); return router.getAmountsOut(_amtIn, path)[path.length - 1]; } function prepareMigration(address _newStrategy) internal override { _withdrawAll(); } function liquidateAllPositions() internal virtual override returns (uint256 _amountFreed) { _withdrawAll(); _amountFreed = balanceOfWant(); } function ethToWant(uint256 _amtInWei) public view virtual override returns (uint256) { return address(want) == address(weth) ? _amtInWei : quote(weth, address(want), _amtInWei); } // 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) function protectedTokens() internal view override returns (address[] memory) {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"internalType":"struct Strategy.PoolAlloc[]","name":"_alloc","type":"tuple[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"clone","type":"address"}],"name":"Cloned","type":"event"},{"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":"delay","type":"uint256"}],"name":"UpdatedMaxReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"metadataURI","type":"string"}],"name":"UpdatedMetadataURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"delay","type":"uint256"}],"name":"UpdatedMinReportDelay","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"profitFactor","type":"uint256"}],"name":"UpdatedProfitFactor","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"alloc","outputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"apiVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"uint256","name":"_bBal","type":"uint256"}],"name":"bTokenToWant","outputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfStake","outputs":[{"internalType":"uint256","name":"total","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"internalType":"struct Strategy.PoolAlloc[]","name":"_newAlloc","type":"tuple[]"}],"name":"changeAllocs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_rewards","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"internalType":"struct Strategy.PoolAlloc[]","name":"_alloc","type":"tuple[]"}],"name":"cloneStrategy","outputs":[{"internalType":"address","name":"newStrategy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"internalType":"struct Strategy.PoolAlloc[]","name":"_alloc","type":"tuple[]"}],"name":"cloneStrategy","outputs":[{"internalType":"address","name":"newStrategy","type":"address"}],"stateMutability":"nonpayable","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":"doHealthCheck","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"_amtInWei","type":"uint256"}],"name":"ethToWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"callCostInWei","type":"uint256"}],"name":"harvestTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"healthCheck","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_rewards","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"components":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256","name":"alloc","type":"uint256"}],"internalType":"struct Strategy.PoolAlloc[]","name":"_alloc","type":"tuple[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"maxReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newStrategy","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minCredit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minProfit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minReportDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingInterest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"bool","name":"_doHealthCheck","type":"bool"}],"name":"setDoHealthCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setEmergencyExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_healthCheck","type":"address"}],"name":"setHealthCheck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMaxReportDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_metadataURI","type":"string"}],"name":"setMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"setMinReportDelay","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":"callCostInWei","type":"uint256"}],"name":"tendTrigger","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minCredit","type":"uint256"}],"name":"updateMinCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minProfit","type":"uint256"}],"name":"updateMinProfit","outputs":[],"stateMutability":"nonpayable","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"}]
Contract Creation Code
60806040819052600e80546001600160a01b03191673f491e7b69e4244ad4002bc14e878a34207e38c2917908190556315ab88c960e31b82526001600160a01b03169063ad5c46489060849060209060048186803b1580156200006157600080fd5b505afa15801562000076573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200009c9190620009e7565b600f80546001600160a01b0319166001600160a01b0392909216919091179055348015620000c957600080fd5b5060405162004fee38038062004fee833981016040819052620000ec9162000a0c565b81620000fb813380806200010f565b506200010781620002f3565b505062000d88565b6006546001600160a01b031615620001445760405162461bcd60e51b81526004016200013b9062000bf9565b60405180910390fd5b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015620001a157600080fd5b505afa158015620001b6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001dc9190620009e7565b600680546001600160a01b0319166001600160a01b03928316179081905562000216911685600019620003d6602090811b620021c017901c565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b3936200029693911691600019910162000b64565b602060405180830381600087803b158015620002b157600080fd5b505af1158015620002c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002ec919062000ace565b5050505050565b61189c6008556105dc6009556006546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b1580156200034557600080fd5b505afa1580156200035a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000380919062000b09565b69d3c21bcecceda1000000600a5560ff1690506200039e82620004e4565b620003bd5760405162461bcd60e51b81526004016200013b9062000bb2565b620003c8826200052a565b620003d2620005dd565b5050565b801580620004655750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906200040f903090869060040162000b4a565b60206040518083038186803b1580156200042857600080fd5b505afa1580156200043d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000463919062000af0565b155b620004845760405162461bcd60e51b81526004016200013b9062000cb1565b620004df8363095ea7b360e01b8484604051602401620004a692919062000b64565b60408051808303601f190181529190526020810180516001600160e01b0319939093166001600160e01b03938416179052906200077216565b505050565b600080805b83518110156200051e578381815181106200050057fe5b602002602001015160200151820191508080600101915050620004e9565b50612710101592915050565b620005386010600062000933565b60005b8151811015620003d257601060405180604001604052808484815181106200055f57fe5b6020026020010151600001516001600160a01b031681526020018484815181106200058657fe5b602090810291909101810151810151909152825460018082018555600094855293829020835160029092020180546001600160a01b0319166001600160a01b0390921691909117815591015190820155016200053b565b60005b6010548110156200076f57600654601080546001600160a01b039092169163dd62ed3e913091859081106200061157fe5b60009182526020909120600290910201546040516001600160e01b031960e085901b1681526200064f92916001600160a01b03169060040162000b4a565b60206040518083038186803b1580156200066857600080fd5b505afa1580156200067d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620006a3919062000af0565b6200076657600654601080546001600160a01b039092169163095ea7b3919084908110620006cd57fe5b60009182526020909120600290910201546040516001600160e01b031960e084901b1681526200070e916001600160a01b0316906000199060040162000b64565b602060405180830381600087803b1580156200072957600080fd5b505af11580156200073e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000764919062000ace565b505b600101620005e0565b50565b6060620007ce826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200080e60201b620022bf179092919060201c565b805190915015620004df5780806020019051810190620007ef919062000ace565b620004df5760405162461bcd60e51b81526004016200013b9062000c67565b60606200081f848460008562000827565b949350505050565b60606200083485620008f9565b620008535760405162461bcd60e51b81526004016200013b9062000c30565b60006060866001600160a01b0316858760405162000872919062000b2c565b60006040518083038185875af1925050503d8060008114620008b1576040519150601f19603f3d011682016040523d82523d6000602084013e620008b6565b606091505b50915091508115620008cc5791506200081f9050565b805115620008dd5780518082602001fd5b8360405162461bcd60e51b81526004016200013b919062000b7d565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906200081f575050151592915050565b50805460008255600202906000526020600020908101906200076f91905b80821115620009785780546001600160a01b03191681556000600182015560020162000951565b5090565b80516001600160a01b03811681146200099457600080fd5b92915050565b600060408284031215620009ac578081fd5b620009b8604062000d0e565b82519091506001600160a01b0381168114620009d357600080fd5b808252506020820151602082015292915050565b600060208284031215620009f9578081fd5b62000a0583836200097c565b9392505050565b600080604080848603121562000a20578182fd5b62000a2c85856200097c565b602085810151919450906001600160401b0381111562000a4a578384fd5b8501601f8101871362000a5b578384fd5b805162000a7262000a6c8262000d35565b62000d0e565b81815283810190838501868402850186018b101562000a8f578788fd5b8794505b8385101562000abd5762000aa88b826200099a565b83526001949094019391850191860162000a93565b508096505050505050509250929050565b60006020828403121562000ae0578081fd5b8151801515811462000a05578182fd5b60006020828403121562000b02578081fd5b5051919050565b60006020828403121562000b1b578081fd5b815160ff8116811462000a05578182fd5b6000825162000b4081846020870162000d55565b9190910192915050565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015262000b9e81604085016020870162000d55565b601f01601f19169190910160400192915050565b60208082526027908201527f416c6c6f6320746f74616c2073686f756c646e74206265206d6f72652074686160408201526606e2031303030360cc1b606082015260800190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527f20746f206e6f6e2d7a65726f20616c6c6f77616e636500000000000000000000606082015260800190565b6040518181016001600160401b038111828210171562000d2d57600080fd5b604052919050565b60006001600160401b0382111562000d4b578081fd5b5060209081020190565b60005b8381101562000d7257818101518382015260200162000d58565b8381111562000d82576000848401525b50505050565b6142568062000d986000396000f3fe608060405234801561001057600080fd5b50600436106102d65760003560e01c8063748747e611610182578063ac00ff26116100e9578063d18e680d116100a2578063efbb5cb01161007c578063efbb5cb014610595578063f017c92f1461059d578063fbfa77cf146105b0578063fcf2d0ad146105b8576102d6565b8063d18e680d1461055c578063ec38a8621461056f578063ed882c2b14610582576102d6565b8063ac00ff261461050b578063aced16611461051e578063b252720b14610526578063c1a3d44c1461052e578063c7b9d53014610536578063ce5494bb14610549576102d6565b80638e6350e21161013b5780638e6350e2146104ba57806391397ab4146104c257806395e80c50146104d557806397a383ab146104dd5780639ec5a894146104f0578063aa8c7890146104f8576102d6565b8063748747e61461045e578063750521f51461047157806375c81ad014610484578063780022a01461048c57806389594e501461049f5780638cdfe166146104b2576102d6565b8063286a876b11610241578063440368a3116101fa57806350fa8221116101d457806350fa8221146104335780635641ec031461043b578063650d1880146104435780636718835f14610456576102d6565b8063440368a31461041b5780634641257d146104235780634fae279e1461042b576102d6565b8063286a876b146103bf57806328b7ccf7146103c75780632e1a7d4d146103cf578063331cd73c146103e257806339a172a8146103f55780633b42e5e214610408576102d6565b8063191ac2d211610293578063191ac2d21461034f5780631d12f28b146103705780631f1fcd51146103855780631fe4a6861461039a57806322f3e2d4146103a257806325829410146103b7576102d6565b806301681a62146102db57806303ee438c146102f057806306fdde031461030e5780630808db2a146103165780630f969b871461032957806311bc82451461033c575b600080fd5b6102ee6102e93660046138e3565b6105c0565b005b6102f861075f565b6040516103059190613d83565b60405180910390f35b6102f86107ed565b6102ee610324366004613c00565b61081b565b6102ee610337366004613c00565b61084a565b6102ee61034a3660046138e3565b6108d7565b61036261035d366004613c00565b6109d8565b604051610305929190613d30565b610378610a0d565b60405161030591906140d3565b61038d610a13565b6040516103059190613cbb565b61038d610a22565b6103aa610a31565b6040516103059190613d49565b6102f8610ad3565b610378610af2565b610378610b47565b6103786103dd366004613c00565b610b4d565b6102ee6103f0366004613a1a565b610ba8565b6102ee610403366004613c00565b610c49565b6102ee610416366004613c00565b610ccb565b6102ee610cfa565b6102ee610f23565b6103786113fc565b610378611402565b6103aa6114ba565b6103aa610451366004613c00565b6114c3565b6103aa6114d7565b6102ee61046c3660046138e3565b6114e0565b6102ee61047f366004613b15565b61158b565b610378611622565b61037861049a366004613c00565b611628565b6102ee6104ad36600461391b565b61166d565b610378611689565b61037861168f565b6102ee6104d0366004613c00565b611694565b610378611716565b61038d6104eb36600461391b565b61171c565b61038d61180c565b61038d6105063660046139a1565b61181b565b6102ee610519366004613add565b6118a2565b61038d61198e565b61038d61199d565b6103786119b1565b6102ee6105443660046138e3565b611a32565b6102ee6105573660046138e3565b611add565b61037861056a3660046139ef565b611c28565b6102ee61057d3660046138e3565b611cbf565b6103aa610590366004613c00565b611e52565b610378611eef565b6102ee6105ab366004613c00565b611f0a565b61038d611f8c565b6102ee611f9b565b6105c86122d6565b6001600160a01b0316336001600160a01b0316146106015760405162461bcd60e51b81526004016105f890613fbb565b60405180910390fd5b6006546001600160a01b038281169116141561062f5760405162461bcd60e51b81526004016105f890613ddb565b6002546001600160a01b038281169116141561065d5760405162461bcd60e51b81526004016105f890613f63565b6060610667612353565b905060005b81518110156106c25781818151811061068157fe5b60200260200101516001600160a01b0316836001600160a01b031614156106ba5760405162461bcd60e51b81526004016105f890614059565b60010161066c565b5061075b6106ce6122d6565b6040516370a0823160e01b81526001600160a01b038516906370a08231906106fa903090600401613cbb565b60206040518083038186803b15801561071257600080fd5b505afa158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a9190613c18565b6001600160a01b0385169190612358565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e55780601f106107ba576101008083540402835291602001916107e5565b820191906000526020600020905b8154815290600101906020018083116107c857829003601f168201915b505050505081565b60408051808201909152601381527229ba3930ba32b3bcaa30b937ba2632b73232b960691b60208201525b90565b6003546001600160a01b031633146108455760405162461bcd60e51b81526004016105f890613db6565b600d55565b6003546001600160a01b031633148061087b57506108666122d6565b6001600160a01b0316336001600160a01b0316145b6108975760405162461bcd60e51b81526004016105f890613fbb565b600a8190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600906108cc9083906140d3565b60405180910390a150565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561092557600080fd5b505afa158015610939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095d91906138ff565b6001600160a01b0316336001600160a01b03161480610994575061097f6122d6565b6001600160a01b0316336001600160a01b0316145b6109b05760405162461bcd60e51b81526004016105f890613fbb565b600180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b601081815481106109e557fe5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b600a5481565b6006546001600160a01b031681565b6003546001600160a01b031681565b6002546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610a66903090600401613cbb565b6101206040518083038186803b158015610a7f57600080fd5b505afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190613b82565b604001511180610ace57506000610acc611eef565b115b905090565b604080518082019091526005815264302e342e3360d81b602082015290565b6000805b601054811015610b4357610b39610b3260108381548110610b1357fe5b60009182526020909120600290910201546001600160a01b0316612377565b83906123f9565b9150600101610af6565b5090565b60085481565b6002546000906001600160a01b03163314610b7a5760405162461bcd60e51b81526004016105f890613f16565b6000610b858361241e565b600654909350909150610ba2906001600160a01b03163383612358565b50919050565b610bb06122d6565b6001600160a01b0316336001600160a01b031614610be05760405162461bcd60e51b81526004016105f890613fbb565b6000610bea610af2565b1115610c0057610bf8612490565b610c006124d4565b610c098161259d565b610c255760405162461bcd60e51b81526004016105f890613e31565b610c2e816125e0565b610c3661268d565b610c46610c416119b1565b61280e565b50565b6003546001600160a01b0316331480610c7a5750610c656122d6565b6001600160a01b0316336001600160a01b0316145b610c965760405162461bcd60e51b81526004016105f890613fbb565b60078190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b1906108cc9083906140d3565b6003546001600160a01b03163314610cf55760405162461bcd60e51b81526004016105f890613db6565b600c55565b6005546001600160a01b0316331480610d1d57506003546001600160a01b031633145b80610d405750610d2b6122d6565b6001600160a01b0316336001600160a01b0316145b80610de15750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9457600080fd5b505afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc91906138ff565b6001600160a01b0316336001600160a01b0316145b80610e825750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3557600080fd5b505afa158015610e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6d91906138ff565b6001600160a01b0316336001600160a01b0316145b610e9e5760405162461bcd60e51b81526004016105f890613fbb565b6002546040805163bf3759b560e01b81529051610f21926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015610ee457600080fd5b505afa158015610ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1c9190613c18565b612885565b565b6005546001600160a01b0316331480610f4657506003546001600160a01b031633145b80610f695750610f546122d6565b6001600160a01b0316336001600160a01b0316145b8061100a5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610fbd57600080fd5b505afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906138ff565b6001600160a01b0316336001600160a01b0316145b806110ab5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561105e57600080fd5b505afa158015611072573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109691906138ff565b6001600160a01b0316336001600160a01b0316145b6110c75760405162461bcd60e51b81526004016105f890613fbb565b6000806000600260009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561111a57600080fd5b505afa15801561112e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111529190613c18565b600b5490915060009060ff16156111af57600061116d6128bb565b9050828110156111885761118183826128cd565b935061119d565b8281111561119d5761119a81846128cd565b94505b6111a783856128cd565b9150506111c0565b6111b88261290f565b919550935090505b6002546040516339ebf82360e01b81526000916001600160a01b0316906339ebf823906111f1903090600401613cbb565b6101206040518083038186803b15801561120a57600080fd5b505afa15801561121e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112429190613b82565b60c001516002546040516328766ebf60e21b81529192506001600160a01b03169063a1d9bafc9061127b90889088908790600401614132565b602060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613c18565b92506112d883612885565b60015460ff1680156112f9575060015461010090046001600160a01b031615155b156113ab5760015460405163c70fa00b60e01b81526101009091046001600160a01b03169063c70fa00b9061133a9088908890879089908890600401614163565b60206040518083038186803b15801561135257600080fd5b505afa158015611366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138a9190613af9565b6113a65760405162461bcd60e51b81526004016105f890613e78565b6113b8565b6001805460ff1916811790555b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509858584866040516113ed9493929190614148565b60405180910390a15050505050565b600d5481565b6002546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390611437903090600401613cbb565b6101206040518083038186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114889190613b82565b60c0015190506000611498610af2565b9050808210156114b5576114ac81836128cd565b92505050610818565b505090565b600b5460ff1681565b6000600d546114d06119b1565b1192915050565b60015460ff1681565b6003546001600160a01b031633148061151157506114fc6122d6565b6001600160a01b0316336001600160a01b0316145b61152d5760405162461bcd60e51b81526004016105f890613fbb565b6001600160a01b03811661154057600080fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe7154906108cc908390613cbb565b6003546001600160a01b03163314806115bc57506115a76122d6565b6001600160a01b0316336001600160a01b0316145b6115d85760405162461bcd60e51b81526004016105f890613fbb565b6115e460008383613766565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda68282604051611616929190613d54565b60405180910390a15050565b600c5481565b600f546006546000916001600160a01b0391821691161461166557600f54600654611660916001600160a01b0390811691168461295d565b611667565b815b92915050565b61167985858585612a13565b61168281612bcc565b5050505050565b60095481565b600090565b6003546001600160a01b03163314806116c557506116b06122d6565b6001600160a01b0316336001600160a01b0316145b6116e15760405162461bcd60e51b81526004016105f890613fbb565b60098190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec298906108cc9083906140d3565b60075481565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81523060601b601482018190526e5af43d82803e903d91602b57fd5bf360881b602883015260009160378184f060405163089594e560e41b81529093506001600160a01b03841691506389594e509061179c908a908a908a908a908a90600401613ce9565b600060405180830381600087803b1580156117b657600080fd5b505af11580156117ca573d6000803e3d6000fd5b50506040516001600160a01b03851692507f783540fb4221a3238720dc7038937d0d79982bcf895274aa6ad179f82cf0d53c9150600090a25095945050505050565b6004546001600160a01b031681565b6040516397a383ab60e01b815260009030906397a383ab906118499086903390819081908990600401613ce9565b602060405180830381600087803b15801561186357600080fd5b505af1158015611877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189b91906138ff565b9392505050565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156118f057600080fd5b505afa158015611904573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192891906138ff565b6001600160a01b0316336001600160a01b0316148061195f575061194a6122d6565b6001600160a01b0316336001600160a01b0316145b61197b5760405162461bcd60e51b81526004016105f890613fbb565b6001805460ff1916911515919091179055565b6005546001600160a01b031681565b60015461010090046001600160a01b031681565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a08231906119e2903090600401613cbb565b60206040518083038186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190613c18565b6003546001600160a01b0316331480611a635750611a4e6122d6565b6001600160a01b0316336001600160a01b0316145b611a7f5760405162461bcd60e51b81526004016105f890613fbb565b6001600160a01b038116611a9257600080fd5b600380546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b4906108cc908390613cbb565b6002546001600160a01b03163314611af457600080fd5b6002546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611b3b57600080fd5b505afa158015611b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7391906138ff565b6001600160a01b031614611b8657600080fd5b611b8f81612c9e565b6006546040516370a0823160e01b8152610c469183916001600160a01b03909116906370a0823190611bc5903090600401613cbb565b60206040518083038186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c159190613c18565b6006546001600160a01b03169190612358565b600081611c36575080611667565b6000836001600160a01b031663be340e326040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7157600080fd5b505afa158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca99190613c18565b670de0b6b3a76400009084020491505092915050565b6003546001600160a01b03163314611ce95760405162461bcd60e51b81526004016105f890613db6565b6001600160a01b038116611cfc57600080fd5b6002546004805460405163095ea7b360e01b81526001600160a01b039384169363095ea7b393611d33939091169160009101613d30565b602060405180830381600087803b158015611d4d57600080fd5b505af1158015611d61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d859190613af9565b50600480546001600160a01b0319166001600160a01b038381169190911780835560025460405163095ea7b360e01b81529083169363095ea7b393611dd09316916000199101613d30565b602060405180830381600087803b158015611dea57600080fd5b505af1158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190613af9565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a069816040516108cc9190613cbb565b6000600c54611e5f611402565b11806116675750600d54600260009054906101000a90046001600160a01b03166001600160a01b031663112c1f9b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d09190613c18565b6000610ace611efc610af2565b611f046119b1565b906123f9565b6003546001600160a01b0316331480611f3b5750611f266122d6565b6001600160a01b0316336001600160a01b0316145b611f575760405162461bcd60e51b81526004016105f890613fbb565b60088190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c5906108cc9083906140d3565b6002546001600160a01b031681565b6003546001600160a01b0316331480611fcc5750611fb76122d6565b6001600160a01b0316336001600160a01b0316145b8061206d5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561202057600080fd5b505afa158015612034573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205891906138ff565b6001600160a01b0316336001600160a01b0316145b8061210e5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f991906138ff565b6001600160a01b0316336001600160a01b0316145b61212a5760405162461bcd60e51b81526004016105f890613fbb565b600b805460ff191660011790556002546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561217d57600080fd5b505af1158015612191573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806122485750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906121f69030908690600401613ccf565b60206040518083038186803b15801561220e57600080fd5b505afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190613c18565b155b6122645760405162461bcd60e51b81526004016105f89061407d565b6122ba8363095ea7b360e01b8484604051602401612283929190613d30565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ca6565b505050565b60606122ce8484600085612d35565b949350505050565b60025460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561231b57600080fd5b505afa15801561232f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace91906138ff565b606090565b6122ba8363a9059cbb60e01b8484604051602401612283929190613d30565b600061166782836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016123a99190613cbb565b60206040518083038186803b1580156123c157600080fd5b505afa1580156123d5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056a9190613c18565b60008282018381101561189b5760405162461bcd60e51b81526004016105f890613dfa565b600080600061242b6119b1565b90506000612437610af2565b90508185111561245c57600061244f82848803612df9565b905061245a81612e0f565b505b61246d6124676119b1565b86612df9565b935083851161247d576000612487565b61248785856128cd565b92505050915091565b60005b601054811015610c46576124cc601082815481106124ad57fe5b60009182526020909120600290910201546001600160a01b0316612e77565b600101612493565b60005b601054811015610c4657600654601080546001600160a01b039092169163095ea7b391908490811061250557fe5b600091825260208220600290910201546040516001600160e01b031960e085901b168152612542926001600160a01b039092169190600401613d30565b602060405180830381600087803b15801561255c57600080fd5b505af1158015612570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125949190613af9565b506001016124d7565b600080805b83518110156125d4578381815181106125b757fe5b6020026020010151602001518201915080806001019150506125a2565b50612710101592915050565b6125ec601060006137e0565b60005b815181101561075b576010604051806040016040528084848151811061261157fe5b6020026020010151600001516001600160a01b0316815260200184848151811061263757fe5b602090810291909101810151810151909152825460018082018555600094855293829020835160029092020180546001600160a01b0319166001600160a01b0390921691909117815591015190820155016125ef565b60005b601054811015610c4657600654601080546001600160a01b039092169163dd62ed3e913091859081106126bf57fe5b60009182526020909120600290910201546040516001600160e01b031960e085901b1681526126fb92916001600160a01b031690600401613ccf565b60206040518083038186803b15801561271357600080fd5b505afa158015612727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274b9190613c18565b61280657600654601080546001600160a01b039092169163095ea7b391908490811061277357fe5b60009182526020909120600290910201546040516001600160e01b031960e084901b1681526127b2916001600160a01b03169060001990600401613d30565b602060405180830381600087803b1580156127cc57600080fd5b505af11580156127e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128049190613af9565b505b600101612690565b60005b60105481101561075b5761287d6010828154811061282b57fe5b906000526020600020906002020160000160009054906101000a90046001600160a01b0316612878846010858154811061286157fe5b906000526020600020906002020160010154612faa565b612fc2565b600101612811565b600061288f6119b1565b905080821061289e5750610c46565b60006128aa82846128cd565b905080156122ba576122ba8161280e565b60006128c5612490565b610ace6119b1565b600061189b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061307e565b600080600061291d846130aa565b925090506129296130d5565b925060006129356119b1565b9050838201808210156129545761295461294f82846128cd565b612e0f565b50509193909250565b6000606061296b858561310e565b600e5460405163d06ca61f60e01b81529192506001600160a01b03169063d06ca61f9061299e90869085906004016140dc565b60006040518083038186803b1580156129b657600080fd5b505afa1580156129ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129f29190810190613a4d565b600182510381518110612a0157fe5b60200260200101519150509392505050565b6006546001600160a01b031615612a3c5760405162461bcd60e51b81526004016105f890613e9e565b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015612a9857600080fd5b505afa158015612aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad091906138ff565b600680546001600160a01b0319166001600160a01b039283161790819055612afc9116856000196121c0565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b393612b7a939116916000199101613d30565b602060405180830381600087803b158015612b9457600080fd5b505af1158015612ba8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116829190613af9565b61189c6008556105dc6009556006546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b158015612c1d57600080fd5b505afa158015612c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c559190613c30565b69d3c21bcecceda1000000600a5560ff169050612c718261259d565b612c8d5760405162461bcd60e51b81526004016105f890613e31565b612c96826125e0565b61075b61268d565b610c46612490565b6060612cfb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122bf9092919063ffffffff16565b8051909150156122ba5780806020019051810190612d199190613af9565b6122ba5760405162461bcd60e51b81526004016105f890613fe0565b6060612d408561326f565b612d5c5760405162461bcd60e51b81526004016105f890613f84565b60006060866001600160a01b03168587604051612d799190613c9f565b60006040518083038185875af1925050503d8060008114612db6576040519150601f19603f3d011682016040523d82523d6000602084013e612dbb565b606091505b50915091508115612dcf5791506122ce9050565b805115612ddf5780518082602001fd5b8360405162461bcd60e51b81526004016105f89190613d83565b6000818310612e08578161189b565b5090919050565b612e176132a8565b60005b60105481101561075b57612e6f60108281548110612e3457fe5b906000526020600020906002020160000160009054906101000a90046001600160a01b0316612e6a846010858154811061286157fe5b613362565b600101612e1a565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190612ea6903090600401613cbb565b60206040518083038186803b158015612ebe57600080fd5b505afa158015612ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef69190613c18565b9050612f0c6001600160a01b0383168383612358565b6040516395a2251f60e01b81526000906001600160a01b038416906395a2251f90612f3b903090600401613cbb565b602060405180830381600087803b158015612f5557600080fd5b505af1158015612f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8d9190613c18565b1161075b5760405162461bcd60e51b81526004016105f890613f36565b600061189b612710612fbc858561357e565b906135b8565b801561075b57600654612fdf906001600160a01b03168383612358565b6040516335313c2160e11b81526000906001600160a01b03841690636a6278429061300e903090600401613cbb565b602060405180830381600087803b15801561302857600080fd5b505af115801561303c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130609190613c18565b101561075b5760405162461bcd60e51b81526004016105f89061402a565b600081848411156130a25760405162461bcd60e51b81526004016105f89190613d83565b505050900390565b60008082156130d05760006130be8461241e565b925090506130cc8185612df9565b9250505b915091565b6000806130e06119b1565b90506130ea6132a8565b6130fc816130f66119b1565b906128cd565b9150613106611402565b820191505090565b600f546060906000906001600160a01b038581169116148061313d5750600f546001600160a01b038481169116145b90508061314b57600361314e565b60025b60ff1667ffffffffffffffff8111801561316757600080fd5b50604051908082528060200260200182016040528015613191578160200160208202803683370190505b50915083826000815181106131a257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505080156131fb5782826001815181106131d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613268565b600f5482516001600160a01b03909116908390600190811061321957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828260028151811061324757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b5092915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906122ce575050151592915050565b60005b601054811015610c4657601081815481106132c257fe5b906000526020600020906002020160000160009054906101000a90046001600160a01b03166001600160a01b0316633ba0b9a96040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561332157600080fd5b505af1158015613335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133599190613c18565b506001016132ab565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613393908690600401613cbb565b60206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e39190613c18565b90506133ef8282612df9565b915060006133fd84846135fa565b90506000811561349c5761341b6001600160a01b0386168684612358565b6040516395a2251f60e01b81526001600160a01b038616906395a2251f90613447903090600401613cbb565b602060405180830381600087803b15801561346157600080fd5b505af1158015613475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134999190613c18565b90505b838110156116825760006134b085836128cd565b90506134bc86866135fa565b92508215613576576134d86001600160a01b0387168785612358565b6040516395a2251f60e01b815281906001600160a01b038816906395a2251f90613506903090600401613cbb565b602060405180830381600087803b15801561352057600080fd5b505af1158015613534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135589190613c18565b10156135765760405162461bcd60e51b81526004016105f890613f36565b505050505050565b60008261358d57506000611667565b8282028284828161359a57fe5b041461189b5760405162461bcd60e51b81526004016105f890613ed5565b600061189b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613696565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016136299190613cbb565b60206040518083038186803b15801561364157600080fd5b505afa158015613655573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136799190613c18565b905061368584846136cd565b915080821115613268579392505050565b600081836136b75760405162461bcd60e51b81526004016105f89190613d83565b5060008385816136c357fe5b0495945050505050565b6000816136db575080611667565b6000836001600160a01b031663be340e326040518163ffffffff1660e01b815260040160206040518083038186803b15801561371657600080fd5b505afa15801561372a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374e9190613c18565b90506122ce81612fbc85670de0b6b3a764000061357e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106137a75782800160ff198235161785556137d4565b828001600101855582156137d4579182015b828111156137d45782358255916020019190600101906137b9565b50610b43929150613801565b5080546000825560020290600052602060002090810190610c469190613816565b5b80821115610b435760008155600101613802565b5b80821115610b435780546001600160a01b031916815560006001820155600201613817565b8035611667816141fd565b600082601f830112613857578081fd5b813561386a613865826141ad565b614186565b818152915060208083019084810160408085028701830188101561388d57600080fd5b6000805b868110156138d65782848b0312156138a7578182fd5b6138b083614186565b6138ba8b8661383c565b8152848601358682015286529484019492820192600101613891565b5050505050505092915050565b6000602082840312156138f4578081fd5b813561189b816141fd565b600060208284031215613910578081fd5b815161189b816141fd565b600080600080600060a08688031215613932578081fd5b853561393d816141fd565b9450602086013561394d816141fd565b9350604086013561395d816141fd565b9250606086013561396d816141fd565b9150608086013567ffffffffffffffff811115613988578182fd5b61399488828901613847565b9150509295509295909350565b600080604083850312156139b3578182fd5b82356139be816141fd565b9150602083013567ffffffffffffffff8111156139d9578182fd5b6139e585828601613847565b9150509250929050565b60008060408385031215613a01578182fd5b8235613a0c816141fd565b946020939093013593505050565b600060208284031215613a2b578081fd5b813567ffffffffffffffff811115613a41578182fd5b6122ce84828501613847565b60006020808385031215613a5f578182fd5b825167ffffffffffffffff811115613a75578283fd5b8301601f81018513613a85578283fd5b8051613a93613865826141ad565b8181528381019083850185840285018601891015613aaf578687fd5b8694505b83851015613ad1578051835260019490940193918501918501613ab3565b50979650505050505050565b600060208284031215613aee578081fd5b813561189b81614212565b600060208284031215613b0a578081fd5b815161189b81614212565b60008060208385031215613b27578081fd5b823567ffffffffffffffff80821115613b3e578283fd5b818501915085601f830112613b51578283fd5b813581811115613b5f578384fd5b866020828501011115613b70578384fd5b60209290920196919550909350505050565b6000610120808385031215613b95578182fd5b613b9e81614186565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b600060208284031215613c11578081fd5b5035919050565b600060208284031215613c29578081fd5b5051919050565b600060208284031215613c41578081fd5b815160ff8116811461189b578182fd5b6000815180845260208085019450808401835b83811015613c9457815180516001600160a01b031688528301518388015260409096019590820190600101613c64565b509495945050505050565b60008251613cb18184602087016141cd565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038681168252858116602083015284811660408301528316606082015260a060808201819052600090613d2590830184613c51565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082528251806020840152613da28160408501602087016141cd565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526027908201527f416c6c6f6320746f74616c2073686f756c646e74206265206d6f72652074686160408201526606e2031303030360cc1b606082015260800190565b6020808252600c908201526b216865616c7468636865636b60a01b604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b602080825260139082015272139bdd08195b9bdd59da081c995d1d5c9b9959606a1b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b602080825260159082015274139bc81b195b99081d1bdad95b9cc81b5a5b9d1959605a1b604082015260600190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b60006040820184835260206040818501528185518084526060860191508287019350845b818110156141255784516001600160a01b031683529383019391830191600101614100565b5090979650505050505050565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b60405181810167ffffffffffffffff811182821017156141a557600080fd5b604052919050565b600067ffffffffffffffff8211156141c3578081fd5b5060209081020190565b60005b838110156141e85781810151838201526020016141d0565b838111156141f7576000848401525b50505050565b6001600160a01b0381168114610c4657600080fd5b8015158114610c4657600080fdfea26469706673582212203c753e4f9430ec8c2936c4825af88f0be6544f41e4b8dd92f49d96b309604d1f64736f6c634300060c00330000000000000000000000000dec85e74a92c52b7f708c4b10207d9560cefaf00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009cded654472788a143c2285a6b2a580392510688000000000000000000000000000000000000000000000000000000000000044e000000000000000000000000df79ea5d777f28cab9fd42acda6208a228c71b590000000000000000000000000000000000000000000000000000000000000447000000000000000000000000f2d3ae45f8775ba0a729df47210164f921edc306000000000000000000000000000000000000000000000000000000000000043a00000000000000000000000037f6cf24ba9e781344ae4ac8923d9a0a3910bc6400000000000000000000000000000000000000000000000000000000000004340000000000000000000000000c60dbd5b78d1488f9f71163e598d90f8ede55e700000000000000000000000000000000000000000000000000000000000004280000000000000000000000004e4a8ae836cbe9576113706e166ae1194a7113e6000000000000000000000000000000000000000000000000000000000000041d00000000000000000000000000fb23c7169e0378a63d9cfe50ef40f944653c69000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000b566727f4edf30ba13939e304d828e30d4063c5900000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000d05f23002f6d09cf7b643b69f171cc2a3eacd0b300000000000000000000000000000000000000000000000000000000000003010000000000000000000000005dd76071f7b5f4599d4f2b7c08641843b746ace900000000000000000000000000000000000000000000000000000000000002fc
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102d65760003560e01c8063748747e611610182578063ac00ff26116100e9578063d18e680d116100a2578063efbb5cb01161007c578063efbb5cb014610595578063f017c92f1461059d578063fbfa77cf146105b0578063fcf2d0ad146105b8576102d6565b8063d18e680d1461055c578063ec38a8621461056f578063ed882c2b14610582576102d6565b8063ac00ff261461050b578063aced16611461051e578063b252720b14610526578063c1a3d44c1461052e578063c7b9d53014610536578063ce5494bb14610549576102d6565b80638e6350e21161013b5780638e6350e2146104ba57806391397ab4146104c257806395e80c50146104d557806397a383ab146104dd5780639ec5a894146104f0578063aa8c7890146104f8576102d6565b8063748747e61461045e578063750521f51461047157806375c81ad014610484578063780022a01461048c57806389594e501461049f5780638cdfe166146104b2576102d6565b8063286a876b11610241578063440368a3116101fa57806350fa8221116101d457806350fa8221146104335780635641ec031461043b578063650d1880146104435780636718835f14610456576102d6565b8063440368a31461041b5780634641257d146104235780634fae279e1461042b576102d6565b8063286a876b146103bf57806328b7ccf7146103c75780632e1a7d4d146103cf578063331cd73c146103e257806339a172a8146103f55780633b42e5e214610408576102d6565b8063191ac2d211610293578063191ac2d21461034f5780631d12f28b146103705780631f1fcd51146103855780631fe4a6861461039a57806322f3e2d4146103a257806325829410146103b7576102d6565b806301681a62146102db57806303ee438c146102f057806306fdde031461030e5780630808db2a146103165780630f969b871461032957806311bc82451461033c575b600080fd5b6102ee6102e93660046138e3565b6105c0565b005b6102f861075f565b6040516103059190613d83565b60405180910390f35b6102f86107ed565b6102ee610324366004613c00565b61081b565b6102ee610337366004613c00565b61084a565b6102ee61034a3660046138e3565b6108d7565b61036261035d366004613c00565b6109d8565b604051610305929190613d30565b610378610a0d565b60405161030591906140d3565b61038d610a13565b6040516103059190613cbb565b61038d610a22565b6103aa610a31565b6040516103059190613d49565b6102f8610ad3565b610378610af2565b610378610b47565b6103786103dd366004613c00565b610b4d565b6102ee6103f0366004613a1a565b610ba8565b6102ee610403366004613c00565b610c49565b6102ee610416366004613c00565b610ccb565b6102ee610cfa565b6102ee610f23565b6103786113fc565b610378611402565b6103aa6114ba565b6103aa610451366004613c00565b6114c3565b6103aa6114d7565b6102ee61046c3660046138e3565b6114e0565b6102ee61047f366004613b15565b61158b565b610378611622565b61037861049a366004613c00565b611628565b6102ee6104ad36600461391b565b61166d565b610378611689565b61037861168f565b6102ee6104d0366004613c00565b611694565b610378611716565b61038d6104eb36600461391b565b61171c565b61038d61180c565b61038d6105063660046139a1565b61181b565b6102ee610519366004613add565b6118a2565b61038d61198e565b61038d61199d565b6103786119b1565b6102ee6105443660046138e3565b611a32565b6102ee6105573660046138e3565b611add565b61037861056a3660046139ef565b611c28565b6102ee61057d3660046138e3565b611cbf565b6103aa610590366004613c00565b611e52565b610378611eef565b6102ee6105ab366004613c00565b611f0a565b61038d611f8c565b6102ee611f9b565b6105c86122d6565b6001600160a01b0316336001600160a01b0316146106015760405162461bcd60e51b81526004016105f890613fbb565b60405180910390fd5b6006546001600160a01b038281169116141561062f5760405162461bcd60e51b81526004016105f890613ddb565b6002546001600160a01b038281169116141561065d5760405162461bcd60e51b81526004016105f890613f63565b6060610667612353565b905060005b81518110156106c25781818151811061068157fe5b60200260200101516001600160a01b0316836001600160a01b031614156106ba5760405162461bcd60e51b81526004016105f890614059565b60010161066c565b5061075b6106ce6122d6565b6040516370a0823160e01b81526001600160a01b038516906370a08231906106fa903090600401613cbb565b60206040518083038186803b15801561071257600080fd5b505afa158015610726573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061074a9190613c18565b6001600160a01b0385169190612358565b5050565b6000805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156107e55780601f106107ba576101008083540402835291602001916107e5565b820191906000526020600020905b8154815290600101906020018083116107c857829003601f168201915b505050505081565b60408051808201909152601381527229ba3930ba32b3bcaa30b937ba2632b73232b960691b60208201525b90565b6003546001600160a01b031633146108455760405162461bcd60e51b81526004016105f890613db6565b600d55565b6003546001600160a01b031633148061087b57506108666122d6565b6001600160a01b0316336001600160a01b0316145b6108975760405162461bcd60e51b81526004016105f890613fbb565b600a8190556040517fa68ba126373d04c004c5748c300c9fca12bd444b3d4332e261f3bd2bac4a8600906108cc9083906140d3565b60405180910390a150565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561092557600080fd5b505afa158015610939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095d91906138ff565b6001600160a01b0316336001600160a01b03161480610994575061097f6122d6565b6001600160a01b0316336001600160a01b0316145b6109b05760405162461bcd60e51b81526004016105f890613fbb565b600180546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b601081815481106109e557fe5b6000918252602090912060029091020180546001909101546001600160a01b03909116915082565b600a5481565b6006546001600160a01b031681565b6003546001600160a01b031681565b6002546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390610a66903090600401613cbb565b6101206040518083038186803b158015610a7f57600080fd5b505afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190613b82565b604001511180610ace57506000610acc611eef565b115b905090565b604080518082019091526005815264302e342e3360d81b602082015290565b6000805b601054811015610b4357610b39610b3260108381548110610b1357fe5b60009182526020909120600290910201546001600160a01b0316612377565b83906123f9565b9150600101610af6565b5090565b60085481565b6002546000906001600160a01b03163314610b7a5760405162461bcd60e51b81526004016105f890613f16565b6000610b858361241e565b600654909350909150610ba2906001600160a01b03163383612358565b50919050565b610bb06122d6565b6001600160a01b0316336001600160a01b031614610be05760405162461bcd60e51b81526004016105f890613fbb565b6000610bea610af2565b1115610c0057610bf8612490565b610c006124d4565b610c098161259d565b610c255760405162461bcd60e51b81526004016105f890613e31565b610c2e816125e0565b610c3661268d565b610c46610c416119b1565b61280e565b50565b6003546001600160a01b0316331480610c7a5750610c656122d6565b6001600160a01b0316336001600160a01b0316145b610c965760405162461bcd60e51b81526004016105f890613fbb565b60078190556040517fbb2c369a0355a34b02ab5fce0643150c87e1c8dfe7c918d465591879f57948b1906108cc9083906140d3565b6003546001600160a01b03163314610cf55760405162461bcd60e51b81526004016105f890613db6565b600c55565b6005546001600160a01b0316331480610d1d57506003546001600160a01b031633145b80610d405750610d2b6122d6565b6001600160a01b0316336001600160a01b0316145b80610de15750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610d9457600080fd5b505afa158015610da8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dcc91906138ff565b6001600160a01b0316336001600160a01b0316145b80610e825750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b158015610e3557600080fd5b505afa158015610e49573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e6d91906138ff565b6001600160a01b0316336001600160a01b0316145b610e9e5760405162461bcd60e51b81526004016105f890613fbb565b6002546040805163bf3759b560e01b81529051610f21926001600160a01b03169163bf3759b5916004808301926020929190829003018186803b158015610ee457600080fd5b505afa158015610ef8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1c9190613c18565b612885565b565b6005546001600160a01b0316331480610f4657506003546001600160a01b031633145b80610f695750610f546122d6565b6001600160a01b0316336001600160a01b0316145b8061100a5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b158015610fbd57600080fd5b505afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906138ff565b6001600160a01b0316336001600160a01b0316145b806110ab5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b15801561105e57600080fd5b505afa158015611072573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061109691906138ff565b6001600160a01b0316336001600160a01b0316145b6110c75760405162461bcd60e51b81526004016105f890613fbb565b6000806000600260009054906101000a90046001600160a01b03166001600160a01b031663bf3759b56040518163ffffffff1660e01b815260040160206040518083038186803b15801561111a57600080fd5b505afa15801561112e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111529190613c18565b600b5490915060009060ff16156111af57600061116d6128bb565b9050828110156111885761118183826128cd565b935061119d565b8281111561119d5761119a81846128cd565b94505b6111a783856128cd565b9150506111c0565b6111b88261290f565b919550935090505b6002546040516339ebf82360e01b81526000916001600160a01b0316906339ebf823906111f1903090600401613cbb565b6101206040518083038186803b15801561120a57600080fd5b505afa15801561121e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112429190613b82565b60c001516002546040516328766ebf60e21b81529192506001600160a01b03169063a1d9bafc9061127b90889088908790600401614132565b602060405180830381600087803b15801561129557600080fd5b505af11580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd9190613c18565b92506112d883612885565b60015460ff1680156112f9575060015461010090046001600160a01b031615155b156113ab5760015460405163c70fa00b60e01b81526101009091046001600160a01b03169063c70fa00b9061133a9088908890879089908890600401614163565b60206040518083038186803b15801561135257600080fd5b505afa158015611366573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061138a9190613af9565b6113a65760405162461bcd60e51b81526004016105f890613e78565b6113b8565b6001805460ff1916811790555b7f4c0f499ffe6befa0ca7c826b0916cf87bea98de658013e76938489368d60d509858584866040516113ed9493929190614148565b60405180910390a15050505050565b600d5481565b6002546040516339ebf82360e01b815260009182916001600160a01b03909116906339ebf82390611437903090600401613cbb565b6101206040518083038186803b15801561145057600080fd5b505afa158015611464573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114889190613b82565b60c0015190506000611498610af2565b9050808210156114b5576114ac81836128cd565b92505050610818565b505090565b600b5460ff1681565b6000600d546114d06119b1565b1192915050565b60015460ff1681565b6003546001600160a01b031633148061151157506114fc6122d6565b6001600160a01b0316336001600160a01b0316145b61152d5760405162461bcd60e51b81526004016105f890613fbb565b6001600160a01b03811661154057600080fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f2f202ddb4a2e345f6323ed90f8fc8559d770a7abbbeee84dde8aca3351fe7154906108cc908390613cbb565b6003546001600160a01b03163314806115bc57506115a76122d6565b6001600160a01b0316336001600160a01b0316145b6115d85760405162461bcd60e51b81526004016105f890613fbb565b6115e460008383613766565b507f300e67d5a415b6d015a471d9c7b95dd58f3e8290af965e84e0f845de2996dda68282604051611616929190613d54565b60405180910390a15050565b600c5481565b600f546006546000916001600160a01b0391821691161461166557600f54600654611660916001600160a01b0390811691168461295d565b611667565b815b92915050565b61167985858585612a13565b61168281612bcc565b5050505050565b60095481565b600090565b6003546001600160a01b03163314806116c557506116b06122d6565b6001600160a01b0316336001600160a01b0316145b6116e15760405162461bcd60e51b81526004016105f890613fbb565b60098190556040517fd94596337df4c2f0f44d30a7fc5db1c7bb60d9aca4185ed77c6fd96eb45ec298906108cc9083906140d3565b60075481565b604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81523060601b601482018190526e5af43d82803e903d91602b57fd5bf360881b602883015260009160378184f060405163089594e560e41b81529093506001600160a01b03841691506389594e509061179c908a908a908a908a908a90600401613ce9565b600060405180830381600087803b1580156117b657600080fd5b505af11580156117ca573d6000803e3d6000fd5b50506040516001600160a01b03851692507f783540fb4221a3238720dc7038937d0d79982bcf895274aa6ad179f82cf0d53c9150600090a25095945050505050565b6004546001600160a01b031681565b6040516397a383ab60e01b815260009030906397a383ab906118499086903390819081908990600401613ce9565b602060405180830381600087803b15801561186357600080fd5b505af1158015611877573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061189b91906138ff565b9392505050565b600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156118f057600080fd5b505afa158015611904573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192891906138ff565b6001600160a01b0316336001600160a01b0316148061195f575061194a6122d6565b6001600160a01b0316336001600160a01b0316145b61197b5760405162461bcd60e51b81526004016105f890613fbb565b6001805460ff1916911515919091179055565b6005546001600160a01b031681565b60015461010090046001600160a01b031681565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a08231906119e2903090600401613cbb565b60206040518083038186803b1580156119fa57600080fd5b505afa158015611a0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace9190613c18565b6003546001600160a01b0316331480611a635750611a4e6122d6565b6001600160a01b0316336001600160a01b0316145b611a7f5760405162461bcd60e51b81526004016105f890613fbb565b6001600160a01b038116611a9257600080fd5b600380546001600160a01b0319166001600160a01b0383161790556040517f352ececae6d7d1e6d26bcf2c549dfd55be1637e9b22dc0cf3b71ddb36097a6b4906108cc908390613cbb565b6002546001600160a01b03163314611af457600080fd5b6002546040805163fbfa77cf60e01b815290516001600160a01b039283169284169163fbfa77cf916004808301926020929190829003018186803b158015611b3b57600080fd5b505afa158015611b4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7391906138ff565b6001600160a01b031614611b8657600080fd5b611b8f81612c9e565b6006546040516370a0823160e01b8152610c469183916001600160a01b03909116906370a0823190611bc5903090600401613cbb565b60206040518083038186803b158015611bdd57600080fd5b505afa158015611bf1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c159190613c18565b6006546001600160a01b03169190612358565b600081611c36575080611667565b6000836001600160a01b031663be340e326040518163ffffffff1660e01b815260040160206040518083038186803b158015611c7157600080fd5b505afa158015611c85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ca99190613c18565b670de0b6b3a76400009084020491505092915050565b6003546001600160a01b03163314611ce95760405162461bcd60e51b81526004016105f890613db6565b6001600160a01b038116611cfc57600080fd5b6002546004805460405163095ea7b360e01b81526001600160a01b039384169363095ea7b393611d33939091169160009101613d30565b602060405180830381600087803b158015611d4d57600080fd5b505af1158015611d61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d859190613af9565b50600480546001600160a01b0319166001600160a01b038381169190911780835560025460405163095ea7b360e01b81529083169363095ea7b393611dd09316916000199101613d30565b602060405180830381600087803b158015611dea57600080fd5b505af1158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e229190613af9565b507fafbb66abf8f3b719799940473a4052a3717cdd8e40fb6c8a3faadab316b1a069816040516108cc9190613cbb565b6000600c54611e5f611402565b11806116675750600d54600260009054906101000a90046001600160a01b03166001600160a01b031663112c1f9b6040518163ffffffff1660e01b815260040160206040518083038186803b158015611eb757600080fd5b505afa158015611ecb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114d09190613c18565b6000610ace611efc610af2565b611f046119b1565b906123f9565b6003546001600160a01b0316331480611f3b5750611f266122d6565b6001600160a01b0316336001600160a01b0316145b611f575760405162461bcd60e51b81526004016105f890613fbb565b60088190556040517f5430e11864ad7aa9775b07d12657fe52df9aa2ba734355bd8ef8747be2c800c5906108cc9083906140d3565b6002546001600160a01b031681565b6003546001600160a01b0316331480611fcc5750611fb76122d6565b6001600160a01b0316336001600160a01b0316145b8061206d5750600260009054906101000a90046001600160a01b03166001600160a01b031663452a93206040518163ffffffff1660e01b815260040160206040518083038186803b15801561202057600080fd5b505afa158015612034573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061205891906138ff565b6001600160a01b0316336001600160a01b0316145b8061210e5750600260009054906101000a90046001600160a01b03166001600160a01b03166388a8d6026040518163ffffffff1660e01b815260040160206040518083038186803b1580156120c157600080fd5b505afa1580156120d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f991906138ff565b6001600160a01b0316336001600160a01b0316145b61212a5760405162461bcd60e51b81526004016105f890613fbb565b600b805460ff191660011790556002546040805163507257cd60e11b815290516001600160a01b039092169163a0e4af9a9160048082019260009290919082900301818387803b15801561217d57600080fd5b505af1158015612191573d6000803e3d6000fd5b50506040517f97e963041e952738788b9d4871d854d282065b8f90a464928d6528f2e9a4fd0b925060009150a1565b8015806122485750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906121f69030908690600401613ccf565b60206040518083038186803b15801561220e57600080fd5b505afa158015612222573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122469190613c18565b155b6122645760405162461bcd60e51b81526004016105f89061407d565b6122ba8363095ea7b360e01b8484604051602401612283929190613d30565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612ca6565b505050565b60606122ce8484600085612d35565b949350505050565b60025460408051635aa6e67560e01b815290516000926001600160a01b031691635aa6e675916004808301926020929190829003018186803b15801561231b57600080fd5b505afa15801561232f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ace91906138ff565b606090565b6122ba8363a9059cbb60e01b8484604051602401612283929190613d30565b600061166782836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016123a99190613cbb565b60206040518083038186803b1580156123c157600080fd5b505afa1580156123d5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061056a9190613c18565b60008282018381101561189b5760405162461bcd60e51b81526004016105f890613dfa565b600080600061242b6119b1565b90506000612437610af2565b90508185111561245c57600061244f82848803612df9565b905061245a81612e0f565b505b61246d6124676119b1565b86612df9565b935083851161247d576000612487565b61248785856128cd565b92505050915091565b60005b601054811015610c46576124cc601082815481106124ad57fe5b60009182526020909120600290910201546001600160a01b0316612e77565b600101612493565b60005b601054811015610c4657600654601080546001600160a01b039092169163095ea7b391908490811061250557fe5b600091825260208220600290910201546040516001600160e01b031960e085901b168152612542926001600160a01b039092169190600401613d30565b602060405180830381600087803b15801561255c57600080fd5b505af1158015612570573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125949190613af9565b506001016124d7565b600080805b83518110156125d4578381815181106125b757fe5b6020026020010151602001518201915080806001019150506125a2565b50612710101592915050565b6125ec601060006137e0565b60005b815181101561075b576010604051806040016040528084848151811061261157fe5b6020026020010151600001516001600160a01b0316815260200184848151811061263757fe5b602090810291909101810151810151909152825460018082018555600094855293829020835160029092020180546001600160a01b0319166001600160a01b0390921691909117815591015190820155016125ef565b60005b601054811015610c4657600654601080546001600160a01b039092169163dd62ed3e913091859081106126bf57fe5b60009182526020909120600290910201546040516001600160e01b031960e085901b1681526126fb92916001600160a01b031690600401613ccf565b60206040518083038186803b15801561271357600080fd5b505afa158015612727573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061274b9190613c18565b61280657600654601080546001600160a01b039092169163095ea7b391908490811061277357fe5b60009182526020909120600290910201546040516001600160e01b031960e084901b1681526127b2916001600160a01b03169060001990600401613d30565b602060405180830381600087803b1580156127cc57600080fd5b505af11580156127e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128049190613af9565b505b600101612690565b60005b60105481101561075b5761287d6010828154811061282b57fe5b906000526020600020906002020160000160009054906101000a90046001600160a01b0316612878846010858154811061286157fe5b906000526020600020906002020160010154612faa565b612fc2565b600101612811565b600061288f6119b1565b905080821061289e5750610c46565b60006128aa82846128cd565b905080156122ba576122ba8161280e565b60006128c5612490565b610ace6119b1565b600061189b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061307e565b600080600061291d846130aa565b925090506129296130d5565b925060006129356119b1565b9050838201808210156129545761295461294f82846128cd565b612e0f565b50509193909250565b6000606061296b858561310e565b600e5460405163d06ca61f60e01b81529192506001600160a01b03169063d06ca61f9061299e90869085906004016140dc565b60006040518083038186803b1580156129b657600080fd5b505afa1580156129ca573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526129f29190810190613a4d565b600182510381518110612a0157fe5b60200260200101519150509392505050565b6006546001600160a01b031615612a3c5760405162461bcd60e51b81526004016105f890613e9e565b600280546001600160a01b0319166001600160a01b03868116919091179182905560408051637e062a3560e11b81529051929091169163fc0c546a91600480820192602092909190829003018186803b158015612a9857600080fd5b505afa158015612aac573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ad091906138ff565b600680546001600160a01b0319166001600160a01b039283161790819055612afc9116856000196121c0565b600380546001600160a01b038086166001600160a01b03199283161790925560048054858416908316178082556005805486861694169390931790925560006007819055620151806008556064600955600a5560025460405163095ea7b360e01b81529084169363095ea7b393612b7a939116916000199101613d30565b602060405180830381600087803b158015612b9457600080fd5b505af1158015612ba8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116829190613af9565b61189c6008556105dc6009556006546040805163313ce56760e01b815290516000926001600160a01b03169163313ce567916004808301926020929190829003018186803b158015612c1d57600080fd5b505afa158015612c31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c559190613c30565b69d3c21bcecceda1000000600a5560ff169050612c718261259d565b612c8d5760405162461bcd60e51b81526004016105f890613e31565b612c96826125e0565b61075b61268d565b610c46612490565b6060612cfb826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166122bf9092919063ffffffff16565b8051909150156122ba5780806020019051810190612d199190613af9565b6122ba5760405162461bcd60e51b81526004016105f890613fe0565b6060612d408561326f565b612d5c5760405162461bcd60e51b81526004016105f890613f84565b60006060866001600160a01b03168587604051612d799190613c9f565b60006040518083038185875af1925050503d8060008114612db6576040519150601f19603f3d011682016040523d82523d6000602084013e612dbb565b606091505b50915091508115612dcf5791506122ce9050565b805115612ddf5780518082602001fd5b8360405162461bcd60e51b81526004016105f89190613d83565b6000818310612e08578161189b565b5090919050565b612e176132a8565b60005b60105481101561075b57612e6f60108281548110612e3457fe5b906000526020600020906002020160000160009054906101000a90046001600160a01b0316612e6a846010858154811061286157fe5b613362565b600101612e1a565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190612ea6903090600401613cbb565b60206040518083038186803b158015612ebe57600080fd5b505afa158015612ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ef69190613c18565b9050612f0c6001600160a01b0383168383612358565b6040516395a2251f60e01b81526000906001600160a01b038416906395a2251f90612f3b903090600401613cbb565b602060405180830381600087803b158015612f5557600080fd5b505af1158015612f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f8d9190613c18565b1161075b5760405162461bcd60e51b81526004016105f890613f36565b600061189b612710612fbc858561357e565b906135b8565b801561075b57600654612fdf906001600160a01b03168383612358565b6040516335313c2160e11b81526000906001600160a01b03841690636a6278429061300e903090600401613cbb565b602060405180830381600087803b15801561302857600080fd5b505af115801561303c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130609190613c18565b101561075b5760405162461bcd60e51b81526004016105f89061402a565b600081848411156130a25760405162461bcd60e51b81526004016105f89190613d83565b505050900390565b60008082156130d05760006130be8461241e565b925090506130cc8185612df9565b9250505b915091565b6000806130e06119b1565b90506130ea6132a8565b6130fc816130f66119b1565b906128cd565b9150613106611402565b820191505090565b600f546060906000906001600160a01b038581169116148061313d5750600f546001600160a01b038481169116145b90508061314b57600361314e565b60025b60ff1667ffffffffffffffff8111801561316757600080fd5b50604051908082528060200260200182016040528015613191578160200160208202803683370190505b50915083826000815181106131a257fe5b60200260200101906001600160a01b031690816001600160a01b03168152505080156131fb5782826001815181106131d657fe5b60200260200101906001600160a01b031690816001600160a01b031681525050613268565b600f5482516001600160a01b03909116908390600190811061321957fe5b60200260200101906001600160a01b031690816001600160a01b031681525050828260028151811061324757fe5b60200260200101906001600160a01b031690816001600160a01b0316815250505b5092915050565b6000813f7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4708181148015906122ce575050151592915050565b60005b601054811015610c4657601081815481106132c257fe5b906000526020600020906002020160000160009054906101000a90046001600160a01b03166001600160a01b0316633ba0b9a96040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561332157600080fd5b505af1158015613335573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133599190613c18565b506001016132ab565b6006546040516370a0823160e01b81526000916001600160a01b0316906370a0823190613393908690600401613cbb565b60206040518083038186803b1580156133ab57600080fd5b505afa1580156133bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133e39190613c18565b90506133ef8282612df9565b915060006133fd84846135fa565b90506000811561349c5761341b6001600160a01b0386168684612358565b6040516395a2251f60e01b81526001600160a01b038616906395a2251f90613447903090600401613cbb565b602060405180830381600087803b15801561346157600080fd5b505af1158015613475573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134999190613c18565b90505b838110156116825760006134b085836128cd565b90506134bc86866135fa565b92508215613576576134d86001600160a01b0387168785612358565b6040516395a2251f60e01b815281906001600160a01b038816906395a2251f90613506903090600401613cbb565b602060405180830381600087803b15801561352057600080fd5b505af1158015613534573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135589190613c18565b10156135765760405162461bcd60e51b81526004016105f890613f36565b505050505050565b60008261358d57506000611667565b8282028284828161359a57fe5b041461189b5760405162461bcd60e51b81526004016105f890613ed5565b600061189b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250613696565b600080836001600160a01b03166370a08231306040518263ffffffff1660e01b81526004016136299190613cbb565b60206040518083038186803b15801561364157600080fd5b505afa158015613655573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136799190613c18565b905061368584846136cd565b915080821115613268579392505050565b600081836136b75760405162461bcd60e51b81526004016105f89190613d83565b5060008385816136c357fe5b0495945050505050565b6000816136db575080611667565b6000836001600160a01b031663be340e326040518163ffffffff1660e01b815260040160206040518083038186803b15801561371657600080fd5b505afa15801561372a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061374e9190613c18565b90506122ce81612fbc85670de0b6b3a764000061357e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106137a75782800160ff198235161785556137d4565b828001600101855582156137d4579182015b828111156137d45782358255916020019190600101906137b9565b50610b43929150613801565b5080546000825560020290600052602060002090810190610c469190613816565b5b80821115610b435760008155600101613802565b5b80821115610b435780546001600160a01b031916815560006001820155600201613817565b8035611667816141fd565b600082601f830112613857578081fd5b813561386a613865826141ad565b614186565b818152915060208083019084810160408085028701830188101561388d57600080fd5b6000805b868110156138d65782848b0312156138a7578182fd5b6138b083614186565b6138ba8b8661383c565b8152848601358682015286529484019492820192600101613891565b5050505050505092915050565b6000602082840312156138f4578081fd5b813561189b816141fd565b600060208284031215613910578081fd5b815161189b816141fd565b600080600080600060a08688031215613932578081fd5b853561393d816141fd565b9450602086013561394d816141fd565b9350604086013561395d816141fd565b9250606086013561396d816141fd565b9150608086013567ffffffffffffffff811115613988578182fd5b61399488828901613847565b9150509295509295909350565b600080604083850312156139b3578182fd5b82356139be816141fd565b9150602083013567ffffffffffffffff8111156139d9578182fd5b6139e585828601613847565b9150509250929050565b60008060408385031215613a01578182fd5b8235613a0c816141fd565b946020939093013593505050565b600060208284031215613a2b578081fd5b813567ffffffffffffffff811115613a41578182fd5b6122ce84828501613847565b60006020808385031215613a5f578182fd5b825167ffffffffffffffff811115613a75578283fd5b8301601f81018513613a85578283fd5b8051613a93613865826141ad565b8181528381019083850185840285018601891015613aaf578687fd5b8694505b83851015613ad1578051835260019490940193918501918501613ab3565b50979650505050505050565b600060208284031215613aee578081fd5b813561189b81614212565b600060208284031215613b0a578081fd5b815161189b81614212565b60008060208385031215613b27578081fd5b823567ffffffffffffffff80821115613b3e578283fd5b818501915085601f830112613b51578283fd5b813581811115613b5f578384fd5b866020828501011115613b70578384fd5b60209290920196919550909350505050565b6000610120808385031215613b95578182fd5b613b9e81614186565b9050825181526020830151602082015260408301516040820152606083015160608201526080830151608082015260a083015160a082015260c083015160c082015260e083015160e08201526101008084015181830152508091505092915050565b600060208284031215613c11578081fd5b5035919050565b600060208284031215613c29578081fd5b5051919050565b600060208284031215613c41578081fd5b815160ff8116811461189b578182fd5b6000815180845260208085019450808401835b83811015613c9457815180516001600160a01b031688528301518388015260409096019590820190600101613c64565b509495945050505050565b60008251613cb18184602087016141cd565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b038681168252858116602083015284811660408301528316606082015260a060808201819052600090613d2590830184613c51565b979650505050505050565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b60006020825282602083015282846040840137818301604090810191909152601f909201601f19160101919050565b6000602082528251806020840152613da28160408501602087016141cd565b601f01601f19169190910160400192915050565b6020808252600b908201526a085cdd1c985d1959da5cdd60aa1b604082015260600190565b602080825260059082015264085dd85b9d60da1b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526027908201527f416c6c6f6320746f74616c2073686f756c646e74206265206d6f72652074686160408201526606e2031303030360cc1b606082015260800190565b6020808252600c908201526b216865616c7468636865636b60a01b604082015260600190565b6020808252601c908201527f537472617465677920616c726561647920696e697469616c697a656400000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b602080825260139082015272139bdd08195b9bdd59da081c995d1d5c9b9959606a1b604082015260600190565b6020808252600790820152662173686172657360c81b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600b908201526a08585d5d1a1bdc9a5e995960aa1b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b602080825260159082015274139bc81b195b99081d1bdad95b9cc81b5a5b9d1959605a1b604082015260600190565b6020808252600a9082015269085c1c9bdd1958dd195960b21b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b60006040820184835260206040818501528185518084526060860191508287019350845b818110156141255784516001600160a01b031683529383019391830191600101614100565b5090979650505050505050565b9283526020830191909152604082015260600190565b93845260208401929092526040830152606082015260800190565b948552602085019390935260408401919091526060830152608082015260a00190565b60405181810167ffffffffffffffff811182821017156141a557600080fd5b604052919050565b600067ffffffffffffffff8211156141c3578081fd5b5060209081020190565b60005b838110156141e85781810151838201526020016141d0565b838111156141f7576000848401525b50505050565b6001600160a01b0381168114610c4657600080fd5b8015158114610c4657600080fdfea26469706673582212203c753e4f9430ec8c2936c4825af88f0be6544f41e4b8dd92f49d96b309604d1f64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000dec85e74a92c52b7f708c4b10207d9560cefaf00000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000009cded654472788a143c2285a6b2a580392510688000000000000000000000000000000000000000000000000000000000000044e000000000000000000000000df79ea5d777f28cab9fd42acda6208a228c71b590000000000000000000000000000000000000000000000000000000000000447000000000000000000000000f2d3ae45f8775ba0a729df47210164f921edc306000000000000000000000000000000000000000000000000000000000000043a00000000000000000000000037f6cf24ba9e781344ae4ac8923d9a0a3910bc6400000000000000000000000000000000000000000000000000000000000004340000000000000000000000000c60dbd5b78d1488f9f71163e598d90f8ede55e700000000000000000000000000000000000000000000000000000000000004280000000000000000000000004e4a8ae836cbe9576113706e166ae1194a7113e6000000000000000000000000000000000000000000000000000000000000041d00000000000000000000000000fb23c7169e0378a63d9cfe50ef40f944653c69000000000000000000000000000000000000000000000000000000000000040b000000000000000000000000b566727f4edf30ba13939e304d828e30d4063c5900000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000d05f23002f6d09cf7b643b69f171cc2a3eacd0b300000000000000000000000000000000000000000000000000000000000003010000000000000000000000005dd76071f7b5f4599d4f2b7c08641843b746ace900000000000000000000000000000000000000000000000000000000000002fc
-----Decoded View---------------
Arg [0] : _vault (address): 0x0DEC85e74A92c52b7F708c4B10207D9560CEFaf0
Arg [1] : _alloc (tuple[]): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput],System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 0000000000000000000000000dec85e74a92c52b7f708c4b10207d9560cefaf0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 0000000000000000000000009cded654472788a143c2285a6b2a580392510688
Arg [4] : 000000000000000000000000000000000000000000000000000000000000044e
Arg [5] : 000000000000000000000000df79ea5d777f28cab9fd42acda6208a228c71b59
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000447
Arg [7] : 000000000000000000000000f2d3ae45f8775ba0a729df47210164f921edc306
Arg [8] : 000000000000000000000000000000000000000000000000000000000000043a
Arg [9] : 00000000000000000000000037f6cf24ba9e781344ae4ac8923d9a0a3910bc64
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000434
Arg [11] : 0000000000000000000000000c60dbd5b78d1488f9f71163e598d90f8ede55e7
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000428
Arg [13] : 0000000000000000000000004e4a8ae836cbe9576113706e166ae1194a7113e6
Arg [14] : 000000000000000000000000000000000000000000000000000000000000041d
Arg [15] : 00000000000000000000000000fb23c7169e0378a63d9cfe50ef40f944653c69
Arg [16] : 000000000000000000000000000000000000000000000000000000000000040b
Arg [17] : 000000000000000000000000b566727f4edf30ba13939e304d828e30d4063c59
Arg [18] : 00000000000000000000000000000000000000000000000000000000000003c0
Arg [19] : 000000000000000000000000d05f23002f6d09cf7b643b69f171cc2a3eacd0b3
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000301
Arg [21] : 0000000000000000000000005dd76071f7b5f4599d4f2b7c08641843b746ace9
Arg [22] : 00000000000000000000000000000000000000000000000000000000000002fc
Deployed Bytecode Sourcemap
60428:13594:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59952:444;;;;;;:::i;:::-;;:::i;:::-;;31181:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63335:110;;;:::i;69058:::-;;;;;;:::i;:::-;;:::i;41554:175::-;;;;;;:::i;:::-;;:::i;37122:118::-;;;;;;:::i;:::-;;:::i;61026:24::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;34460:28::-;;;:::i;:::-;;;;;;;:::i;33208:18::-;;;:::i;:::-;;;;;;;:::i;33117:25::-;;;:::i;44956:148::-;;;:::i;:::-;;;;;;;:::i;31580:91::-;;;:::i;64462:197::-;;;:::i;34096:29::-;;;:::i;56356:515::-;;;;;;:::i;:::-;;:::i;69176:436::-;;;;;;:::i;:::-;;:::i;39603:154::-;;;;;;:::i;:::-;;:::i;68940:110::-;;;;;;:::i;:::-;;:::i;50053:170::-;;;:::i;54532:1580::-;;;:::i;60781:24::-;;;:::i;64667:297::-;;;:::i;34539:25::-;;;:::i;65165:141::-;;;;;;:::i;:::-;;:::i;31237:25::-;;;:::i;38360:174::-;;;;;;:::i;:::-;;:::i;42032:171::-;;;;;;:::i;:::-;;:::i;60750:24::-;;;:::i;73571:193::-;;;;;;:::i;:::-;;:::i;61706:448::-;;;;;;:::i;:::-;;:::i;34282:27::-;;;:::i;32987:94::-;;;:::i;40828:169::-;;;;;;:::i;:::-;;:::i;33945:29::-;;;:::i;62378:949::-;;;;;;:::i;:::-;;:::i;33149:22::-;;;:::i;62162:208::-;;;;;;:::i;:::-;;:::i;37248:123::-;;;;;;:::i;:::-;;:::i;33178:21::-;;;:::i;31269:26::-;;;:::i;64316:110::-;;;:::i;37604:202::-;;;;;;:::i;:::-;;:::i;57643:281::-;;;;;;:::i;:::-;;:::i;63834:297::-;;;;;;:::i;:::-;;:::i;38823:263::-;;;;;;:::i;:::-;;:::i;65314:185::-;;;;;;:::i;:::-;;:::i;64972:::-;;;:::i;40274:154::-;;;;;;:::i;:::-;;:::i;33089:21::-;;;:::i;58353:173::-;;;:::i;59952:444::-;35165:12;:10;:12::i;:::-;-1:-1:-1;;;;;35151:26:0;:10;-1:-1:-1;;;;;35151:26:0;;35143:50;;;;-1:-1:-1;;;35143:50:0;;;;;;;:::i;:::-;;;;;;;;;60044:4:::1;::::0;-1:-1:-1;;;;;60026:23:0;;::::1;60044:4:::0;::::1;60026:23;;60018:41;;;;-1:-1:-1::0;;;60018:41:0::1;;;;;;;:::i;:::-;60096:5;::::0;-1:-1:-1;;;;;60078:24:0;;::::1;60096:5:::0;::::1;60078:24;;60070:44;;;;-1:-1:-1::0;;;60070:44:0::1;;;;;;;:::i;:::-;60127:33;60163:17;:15;:17::i;:::-;60127:53;;60196:9;60191:102;60211:16;:23;60207:1;:27;60191:102;;;60259:16;60276:1;60259:19;;;;;;;;;;;;;;-1:-1:-1::0;;;;;60249:29:0::1;:6;-1:-1:-1::0;;;;;60249:29:0::1;;;60241:52;;;;-1:-1:-1::0;;;60241:52:0::1;;;;;;;:::i;:::-;60236:3;;60191:102;;;;60306:82;60334:12;:10;:12::i;:::-;60348:39;::::0;-1:-1:-1;;;60348:39:0;;-1:-1:-1;;;;;60348:24:0;::::1;::::0;::::1;::::0;:39:::1;::::0;60381:4:::1;::::0;60348:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;60306:27:0;::::1;::::0;:82;:27:::1;:82::i;:::-;35204:1;59952:444:::0;:::o;31181:25::-;;;;;;;;;;;;;;;-1:-1:-1;;31181:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63335:110::-;63409:28;;;;;;;;;;;;-1:-1:-1;;;63409:28:0;;;;63335:110;;:::o;69058:::-;35052:10;;-1:-1:-1;;;;;35052:10:0;35038;:24;35030:48;;;;-1:-1:-1;;;35030:48:0;;;;;;;:::i;:::-;69138:9:::1;:22:::0;69058:110::o;41554:175::-;34650:10;;-1:-1:-1;;;;;34650:10:0;34636;:24;;:54;;;34678:12;:10;:12::i;:::-;-1:-1:-1;;;;;34664:26:0;:10;-1:-1:-1;;;;;34664:26:0;;34636:54;34628:78;;;;-1:-1:-1;;;34628:78:0;;;;;;;:::i;:::-;41639:13:::1;:30:::0;;;41685:36:::1;::::0;::::1;::::0;::::1;::::0;41655:14;;41685:36:::1;:::i;:::-;;;;;;;;41554:175:::0;:::o;37122:118::-;35622:5;;;;;;;;;-1:-1:-1;;;;;35622:5:0;-1:-1:-1;;;;;35622:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35608:32:0;:10;-1:-1:-1;;;;;35608:32:0;;:62;;;;35658:12;:10;:12::i;:::-;-1:-1:-1;;;;;35644:26:0;:10;-1:-1:-1;;;;;35644:26:0;;35608:62;35600:86;;;;-1:-1:-1;;;35600:86:0;;;;;;;:::i;:::-;37206:11:::1;:26:::0;;-1:-1:-1;;;;;37206:26:0;;::::1;;;-1:-1:-1::0;;;;;;37206:26:0;;::::1;::::0;;;::::1;::::0;;37122:118::o;61026:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;61026:24:0;;;;-1:-1:-1;61026:24:0;:::o;34460:28::-;;;;:::o;33208:18::-;;;-1:-1:-1;;;;;33208:18:0;;:::o;33117:25::-;;;-1:-1:-1;;;;;33117:25:0;;:::o;44956:148::-;45021:5;;:31;;-1:-1:-1;;;45021:31:0;;44997:4;;;;-1:-1:-1;;;;;45021:5:0;;;;:16;;:31;;45046:4;;45021:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;:45;:75;;;;45095:1;45070:22;:20;:22::i;:::-;:26;45021:75;45014:82;;44956:148;:::o;31580:91::-;31649:14;;;;;;;;;;;;-1:-1:-1;;;31649:14:0;;;;31580:91;:::o;64462:197::-;64509:13;;64535:117;64559:5;:12;64555:16;;64535:117;;;64601:39;64611:28;64625:5;64631:1;64625:8;;;;;;;;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;64625:13:0;64611;:28::i;:::-;64601:5;;:9;:39::i;:::-;64593:47;-1:-1:-1;64573:3:0;;64535:117;;;;64462:197;:::o;34096:29::-;;;;:::o;56356:515::-;56471:5;;56415:13;;-1:-1:-1;;;;;56471:5:0;56449:10;:28;56441:47;;;;-1:-1:-1;;;56441:47:0;;;;;;;:::i;:::-;56574:19;56627:32;56645:13;56627:17;:32::i;:::-;56751:4;;56604:55;;-1:-1:-1;56604:55:0;;-1:-1:-1;56751:42:0;;-1:-1:-1;;;;;56751:4:0;56769:10;56604:55;56751:17;:42::i;:::-;56356:515;;;;:::o;69176:436::-;35165:12;:10;:12::i;:::-;-1:-1:-1;;;;;35151:26:0;:10;-1:-1:-1;;;;;35151:26:0;;35143:50;;;;-1:-1:-1;;;35143:50:0;;;;;;;:::i;:::-;69346:1:::1;69327:16;:14;:16::i;:::-;:20;69323:99;;;69364:14;:12;:14::i;:::-;69393:17;:15;:17::i;:::-;69440:26;69456:9;69440:15;:26::i;:::-;69432:78;;;;-1:-1:-1::0;;;69432:78:0::1;;;;;;;:::i;:::-;69523:20;69533:9;69523;:20::i;:::-;69554:14;:12;:14::i;:::-;69579:25;69588:15;:13;:15::i;:::-;69579:8;:25::i;:::-;69176:436:::0;:::o;39603:154::-;34650:10;;-1:-1:-1;;;;;34650:10:0;34636;:24;;:54;;;34678:12;:10;:12::i;:::-;-1:-1:-1;;;;;34664:26:0;:10;-1:-1:-1;;;;;34664:26:0;;34636:54;34628:78;;;;-1:-1:-1;;;34628:78:0;;;;;;;:::i;:::-;39681:14:::1;:23:::0;;;39720:29:::1;::::0;::::1;::::0;::::1;::::0;39698:6;;39720:29:::1;:::i;68940:110::-:0;35052:10;;-1:-1:-1;;;;;35052:10:0;35038;:24;35030:48;;;;-1:-1:-1;;;35030:48:0;;;;;;;:::i;:::-;69020:9:::1;:22:::0;68940:110::o;50053:170::-;35291:6;;-1:-1:-1;;;;;35291:6:0;35277:10;:20;;:65;;-1:-1:-1;35332:10:0;;-1:-1:-1;;;;;35332:10:0;35318;:24;35277:65;:112;;;;35377:12;:10;:12::i;:::-;-1:-1:-1;;;;;35363:26:0;:10;-1:-1:-1;;;;;35363:26:0;;35277:112;:163;;;;35424:5;;;;;;;;;-1:-1:-1;;;;;35424:5:0;-1:-1:-1;;;;;35424:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35410:30:0;:10;-1:-1:-1;;;;;35410:30:0;;35277:163;:216;;;;35475:5;;;;;;;;;-1:-1:-1;;;;;35475:5:0;-1:-1:-1;;;;;35475:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35461:32:0;:10;-1:-1:-1;;;;;35461:32:0;;35277:216;35255:277;;;;-1:-1:-1;;;35255:277:0;;;;;;;:::i;:::-;50191:5:::1;::::0;:23:::1;::::0;;-1:-1:-1;;;50191:23:0;;;;50176:39:::1;::::0;-1:-1:-1;;;;;50191:5:0::1;::::0;:21:::1;::::0;:23:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:5;:23;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50176:14;:39::i;:::-;50053:170::o:0;54532:1580::-;35291:6;;-1:-1:-1;;;;;35291:6:0;35277:10;:20;;:65;;-1:-1:-1;35332:10:0;;-1:-1:-1;;;;;35332:10:0;35318;:24;35277:65;:112;;;;35377:12;:10;:12::i;:::-;-1:-1:-1;;;;;35363:26:0;:10;-1:-1:-1;;;;;35363:26:0;;35277:112;:163;;;;35424:5;;;;;;;;;-1:-1:-1;;;;;35424:5:0;-1:-1:-1;;;;;35424:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35410:30:0;:10;-1:-1:-1;;;;;35410:30:0;;35277:163;:216;;;;35475:5;;;;;;;;;-1:-1:-1;;;;;35475:5:0;-1:-1:-1;;;;;35475:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35461:32:0;:10;-1:-1:-1;;;;;35461:32:0;;35277:216;35255:277;;;;-1:-1:-1;;;35255:277:0;;;;;;;:::i;:::-;54583:14:::1;54612:12:::0;54639:23:::1;54665:5;;;;;;;;;-1:-1:-1::0;;;;;54665:5:0::1;-1:-1:-1::0;;;;;54665:21:0::1;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54737:13;::::0;54639:49;;-1:-1:-1;54699:19:0::1;::::0;54737:13:::1;;54733:580;;;54819:19;54841:23;:21;:23::i;:::-;54819:45;;54897:15;54883:11;:29;54879:226;;;54940:32;:15:::0;54960:11;54940:19:::1;:32::i;:::-;54933:39;;54879:226;;;55012:15;54998:11;:29;54994:111;;;55057:32;:11:::0;55073:15;55057::::1;:32::i;:::-;55048:41;;54994:111;55133:25;:15:::0;55153:4;55133:19:::1;:25::i;:::-;55119:39;;54733:580;;;;55271:30;55285:15;55271:13;:30::i;:::-;55241:60:::0;;-1:-1:-1;55241:60:0;-1:-1:-1;55241:60:0;-1:-1:-1;54733:580:0::1;55529:5;::::0;:31:::1;::::0;-1:-1:-1;;;55529:31:0;;55509:17:::1;::::0;-1:-1:-1;;;;;55529:5:0::1;::::0;:16:::1;::::0;:31:::1;::::0;55554:4:::1;::::0;55529:31:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;::::0;55599:5:::1;::::0;:39:::1;::::0;-1:-1:-1;;;55599:39:0;;55529:41;;-1:-1:-1;;;;;;55599:5:0::1;::::0;:12:::1;::::0;:39:::1;::::0;55612:6;;55620:4;;55626:11;;55599:39:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55581:57;;55714:31;55729:15;55714:14;:31::i;:::-;55800:13;::::0;::::1;;:42:::0;::::1;;;-1:-1:-1::0;55817:11:0::1;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;55817:11:0::1;:25:::0;::::1;55800:42;55796:238;;;55879:11;::::0;55867:85:::1;::::0;-1:-1:-1;;;55867:85:0;;55879:11:::1;::::0;;::::1;-1:-1:-1::0;;;;;55879:11:0::1;::::0;55867:30:::1;::::0;:85:::1;::::0;55898:6;;55906:4;;55912:11;;55925:15;;55942:9;;55867:85:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55859:110;;;;-1:-1:-1::0;;;55859:110:0::1;;;;;;;:::i;:::-;55796:238;;;56018:4;56002:20:::0;;-1:-1:-1;;56002:20:0::1;::::0;::::1;::::0;;55796:238:::1;56051:53;56061:6;56069:4;56075:11;56088:15;56051:53;;;;;;;;;:::i;:::-;;;;;;;;35543:1;;;;;54532:1580::o:0;60781:24::-;;;;:::o;64667:297::-;64750:5;;:31;;-1:-1:-1;;;64750:31:0;;64715:7;;;;-1:-1:-1;;;;;64750:5:0;;;;:16;;:31;;64775:4;;64750:31;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:41;;;64735:56;;64802:15;64820:16;:14;:16::i;:::-;64802:34;;64858:7;64851:4;:14;64847:110;;;64928:17;:7;64940:4;64928:11;:17::i;:::-;64921:24;;;;;;64847:110;64667:297;;;:::o;34539:25::-;;;;;;:::o;65165:141::-;65247:4;65289:9;;65271:15;:13;:15::i;:::-;:27;;65165:141;-1:-1:-1;;65165:141:0:o;31237:25::-;;;;;;:::o;38360:174::-;34650:10;;-1:-1:-1;;;;;34650:10:0;34636;:24;;:54;;;34678:12;:10;:12::i;:::-;-1:-1:-1;;;;;34664:26:0;:10;-1:-1:-1;;;;;34664:26:0;;34636:54;34628:78;;;;-1:-1:-1;;;34628:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38439:21:0;::::1;38431:30;;;::::0;::::1;;38472:6;:16:::0;;-1:-1:-1;;;;;;38472:16:0::1;-1:-1:-1::0;;;;;38472:16:0;::::1;;::::0;;38504:22:::1;::::0;::::1;::::0;::::1;::::0;38472:16;;38504:22:::1;:::i;42032:171::-:0;34650:10;;-1:-1:-1;;;;;34650:10:0;34636;:24;;:54;;;34678:12;:10;:12::i;:::-;-1:-1:-1;;;;;34664:26:0;:10;-1:-1:-1;;;;;34664:26:0;;34636:54;34628:78;;;;-1:-1:-1;;;34628:78:0;;;;;;;:::i;:::-;42121:26:::1;:11;42135:12:::0;;42121:26:::1;:::i;:::-;;42163:32;42182:12;;42163:32;;;;;;;:::i;:::-;;;;;;;;42032:171:::0;;:::o;60750:24::-;;;;:::o;73571:193::-;73699:4;;73682;;73647:7;;-1:-1:-1;;;;;73682:4:0;;;73699;;73674:30;:82;;73725:4;;73739;;73719:37;;-1:-1:-1;;;;;73725:4:0;;;;73739;73746:9;73719:5;:37::i;:::-;73674:82;;;73707:9;73674:82;73667:89;73571:193;-1:-1:-1;;73571:193:0:o;61706:448::-;62060:51;62072:6;62080:11;62093:8;62103:7;62060:11;:51::i;:::-;62122:24;62139:6;62122:16;:24::i;:::-;61706:448;;;;;:::o;34282:27::-;;;;:::o;32987:94::-;33045:7;32987:94;:::o;40828:169::-;34650:10;;-1:-1:-1;;;;;34650:10:0;34636;:24;;:54;;;34678:12;:10;:12::i;:::-;-1:-1:-1;;;;;34664:26:0;:10;-1:-1:-1;;;;;34664:26:0;;34636:54;34628:78;;;;-1:-1:-1;;;34628:78:0;;;;;;;:::i;:::-;40911:12:::1;:28:::0;;;40955:34:::1;::::0;::::1;::::0;::::1;::::0;40926:13;;40955:34:::1;:::i;33945:29::-:0;;;;:::o;62378:949::-;62850:4;62844:11;-1:-1:-1;;;62869:86:0;;62749:4;62733:22;;62992:4;62976:21;;62969:43;;;-1:-1:-1;;;63049:4:0;63033:21;;63026:97;62570:19;;63174:4;62844:11;62570:19;63152:27;63202:80;;-1:-1:-1;;;63202:80:0;;63137:42;;-1:-1:-1;;;;;;63202:32:0;;;-1:-1:-1;63202:32:0;;:80;;63235:6;;63243:11;;63256:8;;63266:7;;63275:6;;63202:80;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63300:19:0;;-1:-1:-1;;;;;63300:19:0;;;-1:-1:-1;63300:19:0;;-1:-1:-1;63300:19:0;;;62378:949;;;;;;;;:::o;33149:22::-;;;-1:-1:-1;;;;;33149:22:0;;:::o;62162:208::-;62292:70;;-1:-1:-1;;;62292:70:0;;62246:19;;62292:4;;:18;;:70;;62311:6;;62319:10;;;;;;62355:6;;62292:70;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62278:84;62162:208;-1:-1:-1;;;62162:208:0:o;37248:123::-;35622:5;;;;;;;;;-1:-1:-1;;;;;35622:5:0;-1:-1:-1;;;;;35622:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35608:32:0;:10;-1:-1:-1;;;;;35608:32:0;;:62;;;;35658:12;:10;:12::i;:::-;-1:-1:-1;;;;;35644:26:0;:10;-1:-1:-1;;;;;35644:26:0;;35608:62;35600:86;;;;-1:-1:-1;;;35600:86:0;;;;;;;:::i;:::-;37333:13:::1;:30:::0;;-1:-1:-1;;37333:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;37248:123::o;33178:21::-;;;-1:-1:-1;;;;;33178:21:0;;:::o;31269:26::-;;;;;;-1:-1:-1;;;;;31269:26:0;;:::o;64316:110::-;64389:4;;:29;;-1:-1:-1;;;64389:29:0;;64362:7;;-1:-1:-1;;;;;64389:4:0;;:14;;:29;;64412:4;;64389:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;37604:202::-;34650:10;;-1:-1:-1;;;;;34650:10:0;34636;:24;;:54;;;34678:12;:10;:12::i;:::-;-1:-1:-1;;;;;34664:26:0;:10;-1:-1:-1;;;;;34664:26:0;;34636:54;34628:78;;;;-1:-1:-1;;;34628:78:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37691:25:0;::::1;37683:34;;;::::0;::::1;;37728:10;:24:::0;;-1:-1:-1;;;;;;37728:24:0::1;-1:-1:-1::0;;;;;37728:24:0;::::1;;::::0;;37768:30:::1;::::0;::::1;::::0;::::1;::::0;37728:24;;37768:30:::1;:::i;57643:281::-:0;57732:5;;-1:-1:-1;;;;;57732:5:0;57710:10;:28;57702:37;;;;;;57796:5;;57758:34;;;-1:-1:-1;;;57758:34:0;;;;-1:-1:-1;;;;;57796:5:0;;;;57758:32;;;;;:34;;;;;;;;;;;;;;:32;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;57758:43:0;;57750:52;;;;;;57813:30;57830:12;57813:16;:30::i;:::-;57886:4;;:29;;-1:-1:-1;;;57886:29:0;;57854:62;;57872:12;;-1:-1:-1;;;;;57886:4:0;;;;:14;;:29;;57909:4;;57886:29;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57854:4;;-1:-1:-1;;;;;57854:4:0;;:62;:17;:62::i;63834:297::-;63907:15;63939:10;63935:28;;-1:-1:-1;63958:5:0;63951:12;;63935:28;64030:11;64057:5;-1:-1:-1;;;;;64044:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64119:4;64104:11;;;64103:20;;-1:-1:-1;;63834:297:0;;;;:::o;38823:263::-;35052:10;;-1:-1:-1;;;;;35052:10:0;35038;:24;35030:48;;;;-1:-1:-1;;;35030:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38904:22:0;::::1;38896:31;;;::::0;::::1;;38938:5;::::0;38952:7:::1;::::0;;38938:25:::1;::::0;-1:-1:-1;;;38938:25:0;;-1:-1:-1;;;;;38938:5:0;;::::1;::::0;:13:::1;::::0;:25:::1;::::0;38952:7;;::::1;::::0;38938:5:::1;::::0;:25:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;38974:7:0::1;:18:::0;;-1:-1:-1;;;;;;38974:18:0::1;-1:-1:-1::0;;;;;38974:18:0;;::::1;::::0;;;::::1;::::0;;;39003:5:::1;::::0;:35:::1;::::0;-1:-1:-1;;;39003:35:0;;:5;;::::1;::::0;:13:::1;::::0;:35:::1;::::0;39017:7:::1;::::0;-1:-1:-1;;39034:2:0;39003:35:::1;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;39054:24;39069:8;39054:24;;;;;;:::i;65314:185::-:0;65399:4;65443:9;;65423:17;:15;:17::i;:::-;:29;:68;;;;65482:9;;65456:5;;;;;;;;;-1:-1:-1;;;;;65456:5:0;-1:-1:-1;;;;;65456:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;64972:185::-;65034:7;65112:37;65132:16;:14;:16::i;:::-;65112:15;:13;:15::i;:::-;:19;;:37::i;40274:154::-;34650:10;;-1:-1:-1;;;;;34650:10:0;34636;:24;;:54;;;34678:12;:10;:12::i;:::-;-1:-1:-1;;;;;34664:26:0;:10;-1:-1:-1;;;;;34664:26:0;;34636:54;34628:78;;;;-1:-1:-1;;;34628:78:0;;;;;;;:::i;:::-;40352:14:::1;:23:::0;;;40391:29:::1;::::0;::::1;::::0;::::1;::::0;40369:6;;40391:29:::1;:::i;33089:21::-:0;;;-1:-1:-1;;;;;33089:21:0;;:::o;58353:173::-;34816:10;;-1:-1:-1;;;;;34816:10:0;34802;:24;;:54;;;34844:12;:10;:12::i;:::-;-1:-1:-1;;;;;34830:26:0;:10;-1:-1:-1;;;;;34830:26:0;;34802:54;:88;;;;34874:5;;;;;;;;;-1:-1:-1;;;;;34874:5:0;-1:-1:-1;;;;;34874:14:0;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34860:30:0;:10;-1:-1:-1;;;;;34860:30:0;;34802:88;:124;;;;34908:5;;;;;;;;;-1:-1:-1;;;;;34908:5:0;-1:-1:-1;;;;;34908:16:0;;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34894:32:0;:10;-1:-1:-1;;;;;34894:32:0;;34802:124;34780:185;;;;-1:-1:-1;;;34780:185:0;;;;;;;:::i;:::-;58425:13:::1;:20:::0;;-1:-1:-1;;58425:20:0::1;58441:4;58425:20;::::0;;58456:5:::1;::::0;:22:::1;::::0;;-1:-1:-1;;;58456:22:0;;;;-1:-1:-1;;;;;58456:5:0;;::::1;::::0;:20:::1;::::0;:22:::1;::::0;;::::1;::::0;58425:13:::1;::::0;58456:22;;;;;;;;58425:13;58456:5;:22;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;58496:22:0::1;::::0;::::1;::::0;-1:-1:-1;58496:22:0;;-1:-1:-1;58496:22:0::1;58353:173::o:0;23416:622::-;23786:10;;;23785:62;;-1:-1:-1;23802:39:0;;-1:-1:-1;;;23802:39:0;;-1:-1:-1;;;;;23802:15:0;;;;;:39;;23826:4;;23833:7;;23802:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;23785:62;23777:152;;;;-1:-1:-1;;;23777:152:0;;;;;;;:::i;:::-;23940:90;23960:5;23990:22;;;24014:7;24023:5;23967:62;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;23967:62:0;;;;;;;;;;;;;;-1:-1:-1;;;;;23967:62:0;-1:-1:-1;;;;;;23967:62:0;;;;;;;;;;23940:19;:90::i;:::-;23416:622;;;:::o;9047:196::-;9150:12;9182:53;9205:6;9213:4;9219:1;9222:12;9182:22;:53::i;:::-;9175:60;9047:196;-1:-1:-1;;;;9047:196:0:o;42357:98::-;42429:5;;:18;;;-1:-1:-1;;;42429:18:0;;;;42402:7;;-1:-1:-1;;;;;42429:5:0;;:16;;:18;;;;;;;;;;;;;;:5;:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;73940:79::-;73999:16;73940:79;:::o;22757:177::-;22840:86;22860:5;22890:23;;;22915:2;22919:5;22867:58;;;;;;;;;:::i;64139:169::-;64200:11;64230:70;64243:5;64268;-1:-1:-1;;;;;64250:34:0;;64293:4;64250:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;15918:181::-;15976:7;16008:5;;;16032:6;;;;16024:46;;;;-1:-1:-1;;;16024:46:0;;;;;;;:::i;71738:822::-;71815:25;71842:13;72031:19;72053:15;:13;:15::i;:::-;72031:37;;72079:21;72103:16;:14;:16::i;:::-;72079:40;;72150:11;72134:13;:27;72130:183;;;72178:24;72206:52;72215:13;72246:11;72230:13;:27;72206:8;:52::i;:::-;72178:81;;72274:27;72284:16;72274:9;:27::i;:::-;72130:183;;72417:40;72426:15;:13;:15::i;:::-;72443:13;72417:8;:40::i;:::-;72397:60;;72492:17;72476:13;:33;:76;;72551:1;72476:76;;;72512:36;:13;72530:17;72512;:36::i;:::-;72468:84;;71738:822;;;;;:::o;68079:149::-;68128:9;68123:98;68147:5;:12;68143:16;;68123:98;;;68181:28;68195:5;68201:1;68195:8;;;;;;;;;;;;;;;;;;;;;:13;-1:-1:-1;;;;;68195:13:0;68181;:28::i;:::-;68161:3;;68123:98;;68548:154;68600:9;68595:100;68619:5;:12;68615:16;;68595:100;;;68653:4;;68666:5;:8;;-1:-1:-1;;;;;68653:4:0;;;;:12;;68666:5;68672:1;;68666:8;;;;;;;;;;;;;;;;;;:13;68653:30;;-1:-1:-1;;;;;;68653:30:0;;;;;;;;;-1:-1:-1;;;;;68666:13:0;;;;:8;68653:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;68633:3:0;;68595:100;;65507:264;65582:4;;;65627:95;65651:6;:13;65647:1;:17;65627:95;;;65695:6;65702:1;65695:9;;;;;;;;;;;;;;:15;;;65686:24;;;;65666:3;;;;;;;65627:95;;;-1:-1:-1;60736:5:0;-1:-1:-1;65739:24:0;;65507:264;-1:-1:-1;;65507:264:0:o;69620:278::-;69719:12;69726:5;;69719:12;:::i;:::-;69747:9;69742:149;69766:9;:16;69762:1;:20;69742:149;;;69804:5;69815:63;;;;;;;;69832:9;69842:1;69832:12;;;;;;;;;;;;;;:17;;;-1:-1:-1;;;;;69815:63:0;;;;;69858:9;69868:1;69858:12;;;;;;;;;;;;;;;;;;;:18;;;69815:63;;;69804:75;;;;;;;;-1:-1:-1;69804:75:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;69804:75:0;-1:-1:-1;;;;;69804:75:0;;;;;;;;;;;;;;;;69784:3;69742:149;;68710:222;68759:9;68754:171;68778:5;:12;68774:16;;68754:171;;;68816:4;;68846:5;:8;;-1:-1:-1;;;;;68816:4:0;;;;:14;;68839:4;;68852:1;;68846:8;;;;;;;;;;;;;;;;;;;:13;68816:44;;-1:-1:-1;;;;;;68816:44:0;;;;;;;;;;-1:-1:-1;;;;;68846:13:0;;68816:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68812:101;;68867:4;;68880:5;:8;;-1:-1:-1;;;;;68867:4:0;;;;:12;;68880:5;68886:1;;68880:8;;;;;;;;;;;;;;;;;;;:13;68867:46;;-1:-1:-1;;;;;;68867:46:0;;;;;;;;;-1:-1:-1;;;;;68880:13:0;;-1:-1:-1;;68895:17:0;68867:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;68812:101;68792:3;;68754:171;;67849:222;67916:9;67911:153;67935:5;:12;67931:16;;67911:153;;;67969:83;67983:5;67989:1;67983:8;;;;;;;;;;;;;;;;;;:13;;;;;;;;;;-1:-1:-1;;;;;67983:13:0;67998:53;68020:14;68036:5;68042:1;68036:8;;;;;;;;;;;;;;;;;;:14;;;67998:21;:53::i;:::-;67969:13;:83::i;:::-;67949:3;;67911:153;;71375:355;71454:22;71479:15;:13;:15::i;:::-;71454:40;;71531:14;71511:16;:34;71507:73;;71562:7;;;71507:73;71592:16;71611:36;:14;71630:16;71611:18;:36::i;:::-;71592:55;-1:-1:-1;71664:12:0;;71660:63;;71693:18;71702:8;71693;:18::i;73399:164::-;73467:20;73500:14;:12;:14::i;:::-;73540:15;:13;:15::i;16382:136::-;16440:7;16467:43;16471:1;16474;16467:43;;;;;;;;;;;;;;;;;:3;:43::i;70758:609::-;70875:15;70905:13;70933:20;71005:39;71027:16;71005:21;:39::i;:::-;70981:63;-1:-1:-1;70981:63:0;-1:-1:-1;71065:14:0;:12;:14::i;:::-;71055:24;;71090:20;71113:15;:13;:15::i;:::-;71090:38;-1:-1:-1;71165:22:0;;;71202:30;;;71198:162;;;71304:44;71314:33;:15;71334:12;71314:19;:33::i;:::-;71304:9;:44::i;:::-;70758:609;;;;;;;:::o;73022:262::-;73137:7;73157:21;73181:26;73197:3;73202:4;73181:15;:26::i;:::-;73225:6;;:34;;-1:-1:-1;;;73225:34:0;;73157:50;;-1:-1:-1;;;;;;73225:6:0;;:20;;:34;;73246:6;;73157:50;;73225:34;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;73225:34:0;;;;;;;;;;;;:::i;:::-;73274:1;73260:4;:11;:15;73225:51;;;;;;;;;;;;;;73218:58;;;73022:262;;;;;:::o;36387:727::-;36559:4;;-1:-1:-1;;;;;36559:4:0;36551:27;36543:68;;;;-1:-1:-1;;;36543:68:0;;;;;;;:::i;:::-;36624:5;:24;;-1:-1:-1;;;;;;36624:24:0;-1:-1:-1;;;;;36624:24:0;;;;;;;;;;;36673:13;;;-1:-1:-1;;;36673:13:0;;;;:5;;;;;:11;;:13;;;;;;;;;;;;;;;:5;:13;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36659:4;:28;;-1:-1:-1;;;;;;36659:28:0;-1:-1:-1;;;;;36659:28:0;;;;;;;;36698:37;;:4;36715:6;-1:-1:-1;;36698:16:0;:37::i;:::-;36794:10;:24;;-1:-1:-1;;;;;36794:24:0;;;-1:-1:-1;;;;;;36794:24:0;;;;;;;36829:7;:18;;;;;;;;;;;;36858:6;:16;;;;;;;;;;;;;;36794:10;36920:14;:18;;;36966:5;36949:14;:22;36997:3;36982:12;:18;37011:13;:17;37041:5;;:35;;-1:-1:-1;;;37041:35:0;;:5;;;;:13;;:35;;37055:7;;;-1:-1:-1;;;37041:35:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;61237:461::-;61403:4;61386:14;:21;61433:4;61418:12;:19;61491:4;;61468:40;;;-1:-1:-1;;;61468:40:0;;;;-1:-1:-1;;;;;;;61491:4:0;;61468:38;;:40;;;;;;;;;;;;;;61491:4;61468:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61535:16;61519:13;:32;61448:60;;;-1:-1:-1;61570:23:0;61586:6;61570:15;:23::i;:::-;61562:75;;;;-1:-1:-1;;;61562:75:0;;;;;;;:::i;:::-;61648:17;61658:6;61648:9;:17::i;:::-;61676:14;:12;:14::i;73292:99::-;73369:14;:12;:14::i;25062:761::-;25486:23;25512:69;25540:4;25512:69;;;;;;;;;;;;;;;;;25520:5;-1:-1:-1;;;;;25512:27:0;;;:69;;;;;:::i;:::-;25596:17;;25486:95;;-1:-1:-1;25596:21:0;25592:224;;25738:10;25727:30;;;;;;;;;;;;:::i;:::-;25719:85;;;;-1:-1:-1;;;25719:85:0;;;;;;;:::i;10424:979::-;10554:12;10587:18;10598:6;10587:10;:18::i;:::-;10579:60;;;;-1:-1:-1;;;10579:60:0;;;;;;;:::i;:::-;10713:12;10727:23;10754:6;-1:-1:-1;;;;;10754:11:0;10774:8;10785:4;10754:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10712:78;;;;10805:7;10801:595;;;10836:10;-1:-1:-1;10829:17:0;;-1:-1:-1;10829:17:0;10801:595;10950:17;;:21;10946:439;;11213:10;11207:17;11274:15;11261:10;11257:2;11253:19;11246:44;11161:148;11356:12;11349:20;;-1:-1:-1;;;11349:20:0;;;;;;;;:::i;14590:106::-;14648:7;14679:1;14675;:5;:13;;14687:1;14675:13;;;-1:-1:-1;14683:1:0;;14590:106;-1:-1:-1;14590:106:0:o;68236:304::-;68344:21;:19;:21::i;:::-;68381:9;68376:157;68400:5;:12;68396:16;;68376:157;;;68434:87;68451:5;68457:1;68451:8;;;;;;;;;;;;;;;;;;:13;;;;;;;;;;-1:-1:-1;;;;;68451:13:0;68466:54;68488:15;68505:5;68511:1;68505:8;;;;;;;68466:54;68434:16;:87::i;:::-;68414:3;;68376:157;;66548:290;66624:49;;-1:-1:-1;;;66624:49:0;;66606:15;;-1:-1:-1;;;;;66624:34:0;;;;;:49;;66667:4;;66624:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66606:67;-1:-1:-1;66684:53:0;-1:-1:-1;;;;;66684:37:0;;66722:5;66606:67;66684:37;:53::i;:::-;66756:46;;-1:-1:-1;;;66756:46:0;;66805:1;;-1:-1:-1;;;;;66756:31:0;;;;;:46;;66796:4;;66756:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;66748:82;;;;-1:-1:-1;;;66748:82:0;;;;;;;:::i;69906:168::-;69996:7;70023:43;60736:5;70023:22;:4;70032:12;70023:8;:22::i;:::-;:26;;:43::i;65779:257::-;65858:11;;65854:175;;65886:4;;:33;;-1:-1:-1;;;;;65886:4:0;65904:5;65911:7;65886:17;:33::i;:::-;65942:44;;-1:-1:-1;;;65942:44:0;;65990:1;;-1:-1:-1;;;;;65942:29:0;;;;;:44;;65980:4;;65942:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;65934:83;;;;-1:-1:-1;;;65934:83:0;;;;;;;:::i;16821:192::-;16907:7;16943:12;16935:6;;;;16927:29;;;;-1:-1:-1;;;16927:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;16979:5:0;;;16821:192::o;70082:405::-;70157:20;;70263;;70259:221;;70300:20;70363:35;70381:16;70363:17;:35::i;:::-;70339:59;-1:-1:-1;70339:59:0;-1:-1:-1;70428:40:0;70339:59;70451:16;70428:8;:40::i;:::-;70413:55;;70259:221;;70082:405;;;:::o;70495:255::-;70537:15;70565:27;70595:15;:13;:15::i;:::-;70565:45;;70621:21;:19;:21::i;:::-;70663:40;70683:19;70663:15;:13;:15::i;:::-;:19;;:40::i;:::-;70653:50;;70725:17;:15;:17::i;:::-;70714:28;;;;70495:255;;:::o;72568:446::-;72726:4;;72655:22;;72690:12;;-1:-1:-1;;;;;72705:26:0;;;72726:4;;72705:26;;:57;;-1:-1:-1;72757:4:0;;-1:-1:-1;;;;;72735:27:0;;;72757:4;;72735:27;72705:57;72690:72;;72795:7;:15;;72809:1;72795:15;;;72805:1;72795:15;72781:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72781:30:0;;72773:38;;72833:9;72822:5;72828:1;72822:8;;;;;;;;;;;;;:20;-1:-1:-1;;;;;72822:20:0;;;-1:-1:-1;;;;;72822:20:0;;;;;72857:7;72853:154;;;72892:10;72881:5;72887:1;72881:8;;;;;;;;;;;;;:21;-1:-1:-1;;;;;72881:21:0;;;-1:-1:-1;;;;;72881:21:0;;;;;72853:154;;;72954:4;;72935:8;;-1:-1:-1;;;;;72954:4:0;;;;72935:5;;72954:4;;72935:8;;;;;;;;;;;:24;-1:-1:-1;;;;;72935:24:0;;;-1:-1:-1;;;;;72935:24:0;;;;;72985:10;72974:5;72980:1;72974:8;;;;;;;;;;;;;:21;-1:-1:-1;;;;;72974:21:0;;;-1:-1:-1;;;;;72974:21:0;;;;;72853:154;72568:446;;;;;:::o;5932:619::-;5992:4;6460:20;;6303:66;6500:23;;;;;;:42;;-1:-1:-1;;6527:15:0;;;6492:51;-1:-1:-1;;5932:619:0:o;66044:217::-;66147:9;66142:112;66166:5;:12;66162:16;;66142:112;;;66213:5;66219:1;66213:8;;;;;;;;;;;;;;;;;;:13;;;;;;;;;;-1:-1:-1;;;;;66213:13:0;-1:-1:-1;;;;;66200:40:0;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;66180:3:0;;66142:112;;66846:995;66943:4;;:21;;-1:-1:-1;;;66943:21:0;;66924:16;;-1:-1:-1;;;;;66943:4:0;;:14;;:21;;66958:5;;66943:21;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66924:40;;66985:27;66994:7;67003:8;66985;:27::i;:::-;66975:37;;67023:15;67041:33;67059:5;67066:7;67041:17;:33::i;:::-;67023:51;-1:-1:-1;67085:22:0;67122:11;;67118:268;;67243:53;-1:-1:-1;;;;;67243:37:0;;67281:5;67288:7;67243:37;:53::i;:::-;67328:46;;-1:-1:-1;;;67328:46:0;;-1:-1:-1;;;;;67328:31:0;;;;;:46;;67368:4;;67328:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;67311:63;;67118:268;67417:7;67400:14;:24;67396:438;;;67492:15;67510:27;:7;67522:14;67510:11;:27::i;:::-;67492:45;;67562:33;67580:5;67587:7;67562:17;:33::i;:::-;67552:43;-1:-1:-1;67614:11:0;;67610:213;;67646:53;-1:-1:-1;;;;;67646:37:0;;67684:5;67691:7;67646:37;:53::i;:::-;67726:46;;-1:-1:-1;;;67726:46:0;;67776:7;;-1:-1:-1;;;;;67726:31:0;;;;;:46;;67766:4;;67726:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;;67718:89;;;;-1:-1:-1;;;67718:89:0;;;;;;;:::i;:::-;67396:438;66846:995;;;;;:::o;17272:471::-;17330:7;17575:6;17571:47;;-1:-1:-1;17605:1:0;17598:8;;17571:47;17642:5;;;17646:1;17642;:5;:1;17666:5;;;;;:10;17658:56;;;;-1:-1:-1;;;17658:56:0;;;;;;;:::i;18219:132::-;18277:7;18304:39;18308:1;18311;18304:39;;;;;;;;;;;;;;;;;:3;:39::i;66269:271::-;66346:15;66374:12;66407:5;-1:-1:-1;;;;;66389:34:0;;66432:4;66389:49;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66374:64;;66459:28;66472:5;66479:7;66459:12;:28::i;:::-;66449:38;;66512:4;66502:7;:14;66498:34;;;66528:4;66269:271;-1:-1:-1;;;66269:271:0:o;18847:278::-;18933:7;18968:12;18961:5;18953:28;;;;-1:-1:-1;;;18953:28:0;;;;;;;;:::i;:::-;;18992:9;19008:1;19004;:5;;;;;;;18847:278;-1:-1:-1;;;;;18847:278:0:o;63453:373::-;63536:15;63568:18;63564:44;;-1:-1:-1;63595:13:0;63588:20;;63564:44;63675:11;63702:5;-1:-1:-1;;;;;63689:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63675:52;-1:-1:-1;63786:32:0;63675:52;63786:23;:13;63804:4;63786:17;:23::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:130;72:20;;97:33;72:20;97:33;:::i;319:788::-;;463:3;456:4;448:6;444:17;440:27;430:2;;-1:-1;;471:12;430:2;518:6;505:20;540:107;555:91;639:6;555:91;:::i;:::-;540:107;:::i;:::-;675:21;;;531:116;-1:-1;719:4;732:14;;;;707:17;;;833:4;821:17;;;812:27;;;;809:36;-1:-1;806:2;;;858:1;;848:12;806:2;883:1;;868:233;893:6;890:1;887:13;868:233;;;833:4;2800:9;2795:3;2791:19;2787:30;2784:2;;;883:1;;2820:12;2784:2;2848:20;833:4;2848:20;:::i;:::-;2950:49;2995:3;2971:22;2950:49;:::i;:::-;2925:75;;3116:22;;;4944:20;3077:16;;;3070:75;961:77;;1052:14;;;;1080;;;;915:1;908:9;868:233;;;872:14;;;;;;;423:684;;;;:::o;5292:241::-;;5396:2;5384:9;5375:7;5371:23;5367:32;5364:2;;;-1:-1;;5402:12;5364:2;85:6;72:20;97:33;124:5;97:33;:::i;5540:263::-;;5655:2;5643:9;5634:7;5630:23;5626:32;5623:2;;;-1:-1;;5661:12;5623:2;226:6;220:13;238:33;265:5;238:33;:::i;5810:933::-;;;;;;6034:3;6022:9;6013:7;6009:23;6005:33;6002:2;;;-1:-1;;6041:12;6002:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6093:63;-1:-1;6193:2;6232:22;;72:20;97:33;72:20;97:33;:::i;:::-;6201:63;-1:-1;6301:2;6340:22;;72:20;97:33;72:20;97:33;:::i;:::-;6309:63;-1:-1;6409:2;6448:22;;72:20;97:33;72:20;97:33;:::i;:::-;6417:63;-1:-1;6545:3;6530:19;;6517:33;6570:18;6559:30;;6556:2;;;-1:-1;;6592:12;6556:2;6622:105;6719:7;6710:6;6699:9;6695:22;6622:105;:::i;:::-;6612:115;;;5996:747;;;;;;;;:::o;6750:556::-;;;6923:2;6911:9;6902:7;6898:23;6894:32;6891:2;;;-1:-1;;6929:12;6891:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;6981:63;-1:-1;7109:2;7094:18;;7081:32;7133:18;7122:30;;7119:2;;;-1:-1;;7155:12;7119:2;7185:105;7282:7;7273:6;7262:9;7258:22;7185:105;:::i;:::-;7175:115;;;6885:421;;;;;:::o;7313:366::-;;;7434:2;7422:9;7413:7;7409:23;7405:32;7402:2;;;-1:-1;;7440:12;7402:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;7492:63;7592:2;7631:22;;;;4944:20;;-1:-1;;;7396:283::o;7686:431::-;;7842:2;7830:9;7821:7;7817:23;7813:32;7810:2;;;-1:-1;;7848:12;7810:2;7906:17;7893:31;7944:18;7936:6;7933:30;7930:2;;;-1:-1;;7966:12;7930:2;7996:105;8093:7;8084:6;8073:9;8069:22;7996:105;:::i;8124:392::-;;8264:2;;8252:9;8243:7;8239:23;8235:32;8232:2;;;-1:-1;;8270:12;8232:2;8321:17;8315:24;8359:18;8351:6;8348:30;8345:2;;;-1:-1;;8381:12;8345:2;8468:22;;1254:4;1242:17;;1238:27;-1:-1;1228:2;;-1:-1;;1269:12;1228:2;1309:6;1303:13;1331:80;1346:64;1403:6;1346:64;:::i;1331:80::-;1439:21;;;1496:14;;;;1471:17;;;1585;;;1576:27;;;;1573:36;-1:-1;1570:2;;;-1:-1;;1612:12;1570:2;-1:-1;1638:10;;1632:217;1657:6;1654:1;1651:13;1632:217;;;5092:13;;1725:61;;1679:1;1672:9;;;;;1800:14;;;;1828;;1632:217;;;-1:-1;8401:99;8226:290;-1:-1;;;;;;;8226:290::o;8523:235::-;;8624:2;8612:9;8603:7;8599:23;8595:32;8592:2;;;-1:-1;;8630:12;8592:2;1940:6;1927:20;1952:30;1976:5;1952:30;:::i;8765:257::-;;8877:2;8865:9;8856:7;8852:23;8848:32;8845:2;;;-1:-1;;8883:12;8845:2;2075:6;2069:13;2087:30;2111:5;2087:30;:::i;9333:367::-;;;9457:2;9445:9;9436:7;9432:23;9428:32;9425:2;;;-1:-1;;9463:12;9425:2;9521:17;9508:31;9559:18;;9551:6;9548:30;9545:2;;;-1:-1;;9581:12;9545:2;9667:6;9656:9;9652:22;;;2434:3;2427:4;2419:6;2415:17;2411:27;2401:2;;-1:-1;;2442:12;2401:2;2485:6;2472:20;9559:18;2504:6;2501:30;2498:2;;;-1:-1;;2534:12;2498:2;2629:3;9457:2;2609:17;2570:6;2595:32;;2592:41;2589:2;;;-1:-1;;2636:12;2589:2;9457;2566:17;;;;;9601:83;;-1:-1;9419:281;;-1:-1;;;;9419:281::o;9707:324::-;;9852:3;;9840:9;9831:7;9827:23;9823:33;9820:2;;;-1:-1;;9859:12;9820:2;3369:22;9852:3;3369:22;:::i;:::-;3360:31;;3515:22;5092:13;3465:16;3458:86;3611:2;3680:9;3676:22;5092:13;3611:2;3630:5;3626:16;3619:86;3771:2;3840:9;3836:22;5092:13;3771:2;3790:5;3786:16;3779:86;3939:2;4008:9;4004:22;5092:13;3939:2;3958:5;3954:16;3947:86;4107:3;4177:9;4173:22;5092:13;4107:3;4127:5;4123:16;4116:86;4269:3;4339:9;4335:22;5092:13;4269:3;4289:5;4285:16;4278:86;4430:3;4500:9;4496:22;5092:13;4430:3;4450:5;4446:16;4439:86;4591:3;4661:9;4657:22;5092:13;4591:3;4611:5;4607:16;4600:86;4752:3;;4824:9;4820:22;5092:13;4752:3;4772:5;4768:18;4761:88;;9911:104;;;;9814:217;;;;:::o;10038:241::-;;10142:2;10130:9;10121:7;10117:23;10113:32;10110:2;;;-1:-1;;10148:12;10110:2;-1:-1;4944:20;;10104:175;-1:-1;10104:175::o;10286:263::-;;10401:2;10389:9;10380:7;10376:23;10372:32;10369:2;;;-1:-1;;10407:12;10369:2;-1:-1;5092:13;;10363:186;-1:-1;10363:186::o;10556:259::-;;10669:2;10657:9;10648:7;10644:23;10640:32;10637:2;;;-1:-1;;10675:12;10637:2;5237:6;5231:13;38644:4;40885:5;38633:16;40862:5;40859:33;40849:2;;-1:-1;;40896:12;12469:906;;12743:5;36609:12;37466:6;37461:3;37454:19;37503:4;;37498:3;37494:14;12755:120;;37503:4;12973:5;36278:14;-1:-1;13012:341;13037:6;13034:1;13031:13;13012:341;;;13098:13;;20728:23;;-1:-1;;;;;38428:54;11504:37;;20889:16;;20883:23;20960:14;;;21064:37;11275:4;11266:14;;;;37167;;;;6570:18;13052:9;13012:341;;;-1:-1;13359:10;;12647:728;-1:-1;;;;;12647:728::o;21233:271::-;;13654:5;36609:12;13765:52;13810:6;13805:3;13798:4;13791:5;13787:16;13765:52;:::i;:::-;13829:16;;;;;21367:137;-1:-1;;21367:137::o;21511:222::-;-1:-1;;;;;38428:54;;;;11504:37;;21638:2;21623:18;;21609:124::o;21740:333::-;-1:-1;;;;;38428:54;;;11504:37;;38428:54;;22059:2;22044:18;;11504:37;21895:2;21880:18;;21866:207::o;22080:972::-;-1:-1;;;;;38428:54;;;11504:37;;38428:54;;;22620:2;22605:18;;11373:58;38428:54;;;22711:2;22696:18;;11373:58;38428:54;;22802:2;22787:18;;11373:58;38439:42;22839:3;22824:19;;22817:49;;;22080:972;;22880:162;;22432:19;;23028:6;22880:162;:::i;:::-;22872:170;22418:634;-1:-1;;;;;;;22418:634::o;23990:349::-;-1:-1;;;;;38428:54;;;;11504:37;;24325:2;24310:18;;14264:58;24153:2;24138:18;;24124:215::o;24686:210::-;38225:13;;38218:21;13448:34;;24807:2;24792:18;;24778:118::o;25423:330::-;;25580:2;25601:17;25594:47;37466:6;25580:2;25569:9;25565:18;37454:19;39824:6;39819:3;37494:14;25569:9;37494:14;39801:30;39862:16;;;37494:14;39862:16;;;39855:27;;;;40257:7;40241:14;;;-1:-1;;40237:28;14614:39;;;25551:202;-1:-1;25551:202::o;25760:310::-;;25907:2;25928:17;25921:47;14812:5;36609:12;37466:6;25907:2;25896:9;25892:18;37454:19;14906:52;14951:6;37494:14;25896:9;37494:14;25907:2;14932:5;14928:16;14906:52;:::i;:::-;40257:7;40241:14;-1:-1;;40237:28;14970:39;;;;37494:14;14970:39;;25878:192;-1:-1;;25878:192::o;26077:416::-;26277:2;26291:47;;;15246:2;26262:18;;;37454:19;-1:-1;;;37494:14;;;15262:34;15315:12;;;26248:245::o;26500:416::-;26700:2;26714:47;;;15566:1;26685:18;;;37454:19;-1:-1;;;37494:14;;;15581:28;15628:12;;;26671:245::o;26923:416::-;27123:2;27137:47;;;15879:2;27108:18;;;37454:19;15915:29;37494:14;;;15895:50;15964:12;;;27094:245::o;27346:416::-;27546:2;27560:47;;;16215:2;27531:18;;;37454:19;16251:34;37494:14;;;16231:55;-1:-1;;;16306:12;;;16299:31;16349:12;;;27517:245::o;27769:416::-;27969:2;27983:47;;;16600:2;27954:18;;;37454:19;-1:-1;;;37494:14;;;16616:35;16670:12;;;27940:245::o;28192:416::-;28392:2;28406:47;;;16921:2;28377:18;;;37454:19;16957:30;37494:14;;;16937:51;17007:12;;;28363:245::o;28615:416::-;28815:2;28829:47;;;17258:2;28800:18;;;37454:19;17294:34;37494:14;;;17274:55;-1:-1;;;17349:12;;;17342:25;17386:12;;;28786:245::o;29038:416::-;29238:2;29252:47;;;17637:1;29223:18;;;37454:19;-1:-1;;;37494:14;;;17652:29;17700:12;;;29209:245::o;29461:416::-;29661:2;29675:47;;;17951:2;29646:18;;;37454:19;-1:-1;;;37494:14;;;17967:42;18028:12;;;29632:245::o;29884:416::-;30084:2;30098:47;;;18279:1;30069:18;;;37454:19;-1:-1;;;37494:14;;;18294:30;18343:12;;;30055:245::o;30307:416::-;30507:2;30521:47;;;18594:2;30492:18;;;37454:19;18630:31;37494:14;;;18610:52;18681:12;;;30478:245::o;30730:416::-;30930:2;30944:47;;;18932:2;30915:18;;;37454:19;-1:-1;;;37494:14;;;18948:34;19001:12;;;30901:245::o;31153:416::-;31353:2;31367:47;;;19252:2;31338:18;;;37454:19;19288:34;37494:14;;;19268:55;-1:-1;;;19343:12;;;19336:34;19389:12;;;31324:245::o;31576:416::-;31776:2;31790:47;;;19640:2;31761:18;;;37454:19;-1:-1;;;37494:14;;;19656:44;19719:12;;;31747:245::o;31999:416::-;32199:2;32213:47;;;19970:2;32184:18;;;37454:19;-1:-1;;;37494:14;;;19986:33;20038:12;;;32170:245::o;32422:416::-;32622:2;32636:47;;;20289:2;32607:18;;;37454:19;20325:34;37494:14;;;20305:55;-1:-1;;;20380:12;;;20373:46;20438:12;;;32593:245::o;32845:222::-;21064:37;;;32972:2;32957:18;;32943:124::o;33074:481::-;;33279:2;33268:9;33264:18;21094:5;21071:3;21064:37;33397:2;33279;33397;33386:9;33382:18;33375:48;33437:108;11897:5;36609:12;37466:6;37461:3;37454:19;37494:14;33268:9;37494:14;11909:93;;33397:2;12073:5;36278:14;12085:21;;-1:-1;12112:260;12137:6;12134:1;12131:13;12112:260;;;12198:13;;-1:-1;;;;;38428:54;11504:37;;37167:14;;;;10976;;;;6570:18;12152:9;12112:260;;;-1:-1;33429:116;;33250:305;-1:-1;;;;;;;33250:305::o;33562:444::-;21064:37;;;33909:2;33894:18;;21064:37;;;;33992:2;33977:18;;21064:37;33745:2;33730:18;;33716:290::o;34013:556::-;21064:37;;;34389:2;34374:18;;21064:37;;;;34472:2;34457:18;;21064:37;34555:2;34540:18;;21064:37;34224:3;34209:19;;34195:374::o;34576:668::-;21064:37;;;34980:2;34965:18;;21064:37;;;;35063:2;35048:18;;21064:37;;;;35146:2;35131:18;;21064:37;35229:3;35214:19;;21064:37;34815:3;34800:19;;34786:458::o;35251:256::-;35313:2;35307:9;35339:17;;;35414:18;35399:34;;35435:22;;;35396:62;35393:2;;;35471:1;;35461:12;35393:2;35313;35480:22;35291:216;;-1:-1;35291:216::o;35514:331::-;;35700:18;35692:6;35689:30;35686:2;;;-1:-1;;35722:12;35686:2;-1:-1;35767:4;35755:17;;;35820:15;;35623:222::o;39897:268::-;39962:1;39969:101;39983:6;39980:1;39977:13;39969:101;;;40050:11;;;40044:18;40031:11;;;40024:39;40005:2;39998:10;39969:101;;;40085:6;40082:1;40079:13;40076:2;;;39962:1;40141:6;40136:3;40132:16;40125:27;40076:2;;39946:219;;;:::o;40278:117::-;-1:-1;;;;;38428:54;;40337:35;;40327:2;;40386:1;;40376:12;40402:111;40483:5;38225:13;38218:21;40461:5;40458:32;40448:2;;40504:1;;40494:12
Swarm Source
ipfs://3c753e4f9430ec8c2936c4825af88f0be6544f41e4b8dd92f49d96b309604d1f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.