Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 11539513 | 1410 days ago | IN | 0 ETH | 0.19392122 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StrategySushiBadgerWbtc
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-28 */ // Dependency file: /Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol // SPDX-License-Identifier: MIT // pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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); } // Dependency file: /Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol // pragma solidity ^0.6.0; /** * @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 SafeMathUpgradeable { /** * @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; } } // Dependency file: /Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol // pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @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) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://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); } } } } // Dependency file: /Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol // pragma solidity ^0.6.0; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20Upgradeable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable 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(IERC20Upgradeable 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(IERC20Upgradeable 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(IERC20Upgradeable 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(IERC20Upgradeable 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"); } } } // Dependency file: /Users/present/code/super-sett/interfaces/uniswap/IUniswapRouterV2.sol // pragma solidity >=0.5.0 <0.8.0; interface IUniswapRouterV2 { 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 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); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint256[] memory amounts); } // Dependency file: /Users/present/code/super-sett/interfaces/badger/IBadgerGeyser.sol // pragma solidity >=0.5.0 <0.8.0; interface IBadgerGeyser { function stake(address) external returns (uint256); function signalTokenLock( address token, uint256 amount, uint256 durationSec, uint256 startTime ) external; } // Dependency file: /Users/present/code/super-sett/interfaces/sushi/ISushiChef.sol // pragma solidity ^0.6.0; interface ISushiChef { // ===== Write ===== function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function add( uint256 _allocPoint, address _lpToken, bool _withUpdate ) external; function updatePool(uint256 _pid) external; // ===== Read ===== function totalAllocPoint() external view returns (uint256); function poolLength() external view returns (uint256); function owner() external view returns (address); function poolInfo(uint256 _pid) external view returns ( address, uint256, uint256, uint256 ); function pendingSushi(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256); } // Dependency file: /Users/present/code/super-sett/interfaces/sushi/IxSushi.sol // pragma solidity ^0.6.0; interface IxSushi { function enter(uint256 _amount) external; function leave(uint256 _shares) external; } // Dependency file: /Users/present/code/super-sett/interfaces/badger/IController.sol // pragma solidity >=0.5.0 <0.8.0; interface IController { function withdraw(address, uint256) external; function balanceOf(address) external view returns (uint256); function earn(address, uint256) external; function want(address) external view returns (address); function rewards() external view returns (address); function vaults(address) external view returns (address); } // Dependency file: /Users/present/code/super-sett/interfaces/badger/IMintr.sol // pragma solidity >=0.5.0 <0.8.0; interface IMintr { function mint(address) external; } // Dependency file: /Users/present/code/super-sett/interfaces/badger/IStrategy.sol // pragma solidity >=0.5.0 <0.8.0; interface IStrategy { function want() external view returns (address); function deposit() external; // NOTE: must exclude any tokens used in the yield // Controller role - withdraw should return to Controller function withdrawOther(address) external returns (uint256 balance); // Controller | Vault role - withdraw should always return to Vault function withdraw(uint256) external; // Controller | Vault role - withdraw should always return to Vault function withdrawAll() external returns (uint256); function balanceOf() external view returns (uint256); function getName() external pure returns (string memory); function setStrategist(address _strategist) external; function setWithdrawalFee(uint256 _withdrawalFee) external; function setPerformanceFeeStrategist(uint256 _performanceFeeStrategist) external; function setPerformanceFeeGovernance(uint256 _performanceFeeGovernance) external; function setGovernance(address _governance) external; function setController(address _controller) external; } // Dependency file: /Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/proxy/Initializable.sol // pragma solidity >=0.4.24 <0.7.0; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; // solhint-disable-next-line no-inline-assembly assembly { cs := extcodesize(self) } return cs == 0; } } // Dependency file: /Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol // pragma solidity ^0.6.0; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; } // Dependency file: /Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol // pragma solidity ^0.6.0; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/GSN/ContextUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ contract PausableUpgradeable is Initializable, ContextUpgradeable { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ function __Pausable_init() internal initializer { __Context_init_unchained(); __Pausable_init_unchained(); } function __Pausable_init_unchained() internal initializer { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!_paused, "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(_paused, "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } uint256[49] private __gap; } // Dependency file: contracts/badger-sett/SettAccessControl.sol // pragma solidity ^0.6.11; // import "deps/@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; /* Common base for permissioned roles throughout Sett ecosystem */ contract SettAccessControl is Initializable { address public governance; address public strategist; address public keeper; // ===== MODIFIERS ===== function _onlyGovernance() internal view { require(msg.sender == governance, "onlyGovernance"); } function _onlyGovernanceOrStrategist() internal view { require(msg.sender == strategist || msg.sender == governance, "onlyGovernanceOrStrategist"); } function _onlyAuthorizedActors() internal view { require(msg.sender == keeper || msg.sender == governance, "onlyAuthorizedActors"); } // ===== PERMISSIONED ACTIONS ===== /// @notice Change strategist address /// @notice Can only be changed by governance itself function setStrategist(address _strategist) external { _onlyGovernance(); strategist = _strategist; } /// @notice Change keeper address /// @notice Can only be changed by governance itself function setKeeper(address _keeper) external { _onlyGovernance(); keeper = _keeper; } /// @notice Change governance address /// @notice Can only be changed by governance itself function setGovernance(address _governance) public { _onlyGovernance(); governance = _governance; } uint256[50] private __gap; } // Dependency file: /Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/math/MathUpgradeable.sol // pragma solidity ^0.6.0; /** * @dev Standard math utilities missing in the Solidity language. */ library MathUpgradeable { /** * @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); } } // Dependency file: contracts/badger-sett/strategies/BaseStrategy.sol // pragma solidity ^0.6.11; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/math/MathUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; // import "/Users/present/code/super-sett/interfaces/uniswap/IUniswapRouterV2.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IController.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IStrategy.sol"; // import "contracts/badger-sett/SettAccessControl.sol"; abstract contract BaseStrategy is PausableUpgradeable, SettAccessControl { using SafeERC20Upgradeable for IERC20Upgradeable; using AddressUpgradeable for address; using SafeMathUpgradeable for uint256; event Withdraw(uint256 amount); event WithdrawAll(uint256 balance); event WithdrawOther(address token, uint256 amount); event SetStrategist(address strategist); event SetGovernance(address governance); event SetController(address controller); event SetWithdrawalFee(uint256 withdrawalFee); event SetPerformanceFeeStrategist(uint256 performanceFeeStrategist); event SetPerformanceFeeGovernance(uint256 performanceFeeGovernance); event Harvest(uint256 harvested, uint256 indexed blockNumber); event Tend(uint256 tended); address public want; // Want: Curve.fi renBTC/wBTC (crvRenWBTC) LP token uint256 public performanceFeeGovernance; uint256 public performanceFeeStrategist; uint256 public withdrawalFee; uint256 public constant MAX_FEE = 10000; address public constant uniswap = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; // Uniswap Dex address public controller; address public guardian; uint256 public withdrawalMaxDeviationThreshold; function __BaseStrategy_init( address _governance, address _strategist, address _controller, address _keeper, address _guardian ) public initializer whenNotPaused { __Pausable_init(); governance = _governance; strategist = _strategist; keeper = _keeper; controller = _controller; guardian = _guardian; withdrawalMaxDeviationThreshold = 50; } // ===== Modifiers ===== function _onlyController() internal view { require(msg.sender == controller, "onlyController"); } function _onlyAuthorizedActorsOrController() internal view { require(msg.sender == keeper || msg.sender == governance || msg.sender == controller, "onlyAuthorizedActorsOrController"); } function _onlyAuthorizedPausers() internal view { require(msg.sender == guardian || msg.sender == governance, "onlyPausers"); } /// ===== View Functions ===== function baseStrategyVersion() public view returns (string memory) { return "1.1"; } /// @notice Get the balance of want held idle in the Strategy function balanceOfWant() public view returns (uint256) { return IERC20Upgradeable(want).balanceOf(address(this)); } /// @notice Get the total balance of want realized in the strategy, whether idle or active in Strategy positions. function balanceOf() public view virtual returns (uint256) { return balanceOfWant().add(balanceOfPool()); } function isTendable() public view virtual returns (bool) { return false; } /// ===== Permissioned Actions: Governance ===== function setGuardian(address _guardian) external { _onlyGovernance(); guardian = _guardian; } function setWithdrawalFee(uint256 _withdrawalFee) external { _onlyGovernance(); require(_withdrawalFee <= MAX_FEE, "base-strategy/excessive-withdrawal-fee"); withdrawalFee = _withdrawalFee; } function setPerformanceFeeStrategist(uint256 _performanceFeeStrategist) external { _onlyGovernance(); require(_performanceFeeStrategist <= MAX_FEE, "base-strategy/excessive-strategist-performance-fee"); performanceFeeStrategist = _performanceFeeStrategist; } function setPerformanceFeeGovernance(uint256 _performanceFeeGovernance) external { _onlyGovernance(); require(_performanceFeeGovernance <= MAX_FEE, "base-strategy/excessive-governance-performance-fee"); performanceFeeGovernance = _performanceFeeGovernance; } function setController(address _controller) external { _onlyGovernance(); controller = _controller; } function setWithdrawalMaxDeviationThreshold(uint256 _threshold) external { _onlyGovernance(); require(_threshold <= MAX_FEE, "base-strategy/excessive-max-deviation-threshold"); withdrawalMaxDeviationThreshold = _threshold; } function deposit() public virtual whenNotPaused { _onlyAuthorizedActorsOrController(); uint256 _want = IERC20Upgradeable(want).balanceOf(address(this)); if (_want > 0) { _deposit(_want); } _postDeposit(); } // ===== Permissioned Actions: Controller ===== /// @notice Controller-only function to Withdraw partial funds, normally used with a vault withdrawal function withdrawAll() external virtual whenNotPaused returns (uint256 balance) { _onlyController(); _withdrawAll(); _transferToVault(IERC20Upgradeable(want).balanceOf(address(this))); } /// @notice Withdraw partial funds from the strategy, unrolling from strategy positions as necessary /// @notice Processes withdrawal fee if present /// @dev If it fails to recover sufficient funds (defined by withdrawalMaxDeviationThreshold), the withdrawal should fail so that this unexpected behavior can be investigated function withdraw(uint256 _amount) external virtual whenNotPaused { _onlyController(); uint256 _balance = IERC20Upgradeable(want).balanceOf(address(this)); uint256 _withdrawn = 0; uint256 _postWithdraw = _balance; // Withdraw some from activities if idle want is not sufficient to cover withdrawal if (_balance < _amount) { _withdrawn = _withdrawSome(_amount.sub(_balance)); _postWithdraw = _withdrawn.add(_balance); // Sanity check: Ensure we were able to retrieve sufficent want from strategy positions // If we end up with less than the amount requested, make sure it does not deviate beyond a maximum threshold if (_postWithdraw < _amount) { uint256 diff = _diff(_amount, _postWithdraw); // Require that difference between expected and actual values is less than the deviation threshold percentage require( diff <= _amount.mul(withdrawalMaxDeviationThreshold).div(MAX_FEE), "base-strategy/withdraw-exceed-max-deviation-threshold" ); } } // Return the amount actually withdrawn if less than amount requested uint256 _toWithdraw = MathUpgradeable.min(_postWithdraw, _amount); // Process withdrawal fee uint256 _fee = _processWithdrawalFee(_toWithdraw); // Transfer remaining to Vault to handle withdrawal _transferToVault(_toWithdraw.sub(_fee)); } // NOTE: must exclude any tokens used in the yield // Controller role - withdraw should return to Controller function withdrawOther(address _asset) external virtual whenNotPaused returns (uint256 balance) { _onlyController(); _onlyNotProtectedTokens(_asset); balance = IERC20Upgradeable(_asset).balanceOf(address(this)); IERC20Upgradeable(_asset).safeTransfer(controller, balance); } /// ===== Permissioned Actions: Authoized Contract Pausers ===== function pause() external { _onlyAuthorizedPausers(); _pause(); } function unpause() external { _onlyGovernance(); _unpause(); } /// ===== Internal Helper Functions ===== /// @notice If withdrawal fee is active, take the appropriate amount from the given value and transfer to rewards recipient /// @return The withdrawal fee that was taken function _processWithdrawalFee(uint256 _amount) internal returns (uint256) { if (withdrawalFee == 0) { return 0; } uint256 fee = _amount.mul(withdrawalFee).div(MAX_FEE); IERC20Upgradeable(want).safeTransfer(IController(controller).rewards(), fee); return fee; } /// @dev Helper function to process an arbitrary fee /// @dev If the fee is active, transfers a given portion in basis points of the specified value to the recipient /// @return The fee that was taken function _processFee( address token, uint256 amount, uint256 feeBps, address recipient ) internal returns (uint256) { if (feeBps == 0) { return 0; } uint256 fee = amount.mul(feeBps).div(MAX_FEE); IERC20Upgradeable(token).safeTransfer(recipient, fee); return fee; } /// @dev Reset approval and approve exact amount function _safeApproveHelper( address token, address recipient, uint256 amount ) internal { IERC20Upgradeable(token).safeApprove(recipient, 0); IERC20Upgradeable(token).safeApprove(recipient, amount); } function _transferToVault(uint256 _amount) internal { address _vault = IController(controller).vaults(address(want)); require(_vault != address(0), "!vault"); // additional protection so we don't burn the funds IERC20Upgradeable(want).safeTransfer(_vault, _amount); } /// @notice Swap specified balance of given token on Uniswap with given path function _swap( address startToken, uint256 balance, address[] memory path ) internal { _safeApproveHelper(startToken, uniswap, balance); IUniswapRouterV2(uniswap).swapExactTokensForTokens(balance, 0, path, address(this), now); } function _swapEthIn(uint256 balance, address[] memory path) internal { IUniswapRouterV2(uniswap).swapExactETHForTokens{value: balance}(0, path, address(this), now); } function _swapEthOut( address startToken, uint256 balance, address[] memory path ) internal { _safeApproveHelper(startToken, uniswap, balance); IUniswapRouterV2(uniswap).swapExactTokensForETH(balance, 0, path, address(this), now); } /// @notice Add liquidity to uniswap for specified token pair, utilizing the maximum balance possible function _add_max_liquidity_uniswap(address token0, address token1) internal virtual { uint256 _token0Balance = IERC20Upgradeable(token0).balanceOf(address(this)); uint256 _token1Balance = IERC20Upgradeable(token1).balanceOf(address(this)); _safeApproveHelper(token0, uniswap, _token0Balance); _safeApproveHelper(token1, uniswap, _token1Balance); IUniswapRouterV2(uniswap).addLiquidity(token0, token1, _token0Balance, _token1Balance, 0, 0, address(this), block.timestamp); } /// @notice Utility function to diff two numbers, expects higher value in first position function _diff(uint256 a, uint256 b) internal pure returns (uint256) { require(a >= b, "diff/expected-higher-number-in-first-position"); return a.sub(b); } // ===== Abstract Functions: To be implemented by specific Strategies ===== /// @dev Internal deposit logic to be implemented by Stratgies function _deposit(uint256 _want) internal virtual; function _postDeposit() internal virtual { //no-op by default } /// @notice Specify tokens used in yield process, should not be available to withdraw via withdrawOther() function _onlyNotProtectedTokens(address _asset) internal virtual; function getProtectedTokens() external view virtual returns (address[] memory); /// @dev Internal logic for strategy migration. Should exit positions as efficiently as possible function _withdrawAll() internal virtual; /// @dev Internal logic for partial withdrawals. Should exit positions as efficiently as possible. /// @dev The withdraw() function shell automatically uses idle want in the strategy before attempting to withdraw more using this function _withdrawSome(uint256 _amount) internal virtual returns (uint256); /// @dev Realize returns from positions /// @dev Returns can be reinvested into positions, or distributed in another fashion /// @dev Performance fees should also be implemented in this function /// @dev Override function stub is removed as each strategy can have it's own return signature for STATICCALL // function harvest() external virtual; /// @dev User-friendly name for this strategy for purposes of convenient reading function getName() external pure virtual returns (string memory); /// @dev Balance of want currently held in strategy positions function balanceOfPool() public view virtual returns (uint256); uint256[50] private __gap; } // Dependency file: contracts/badger-sett/strategies/BaseStrategySwapper.sol // pragma solidity ^0.6.11; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/utils/PausableUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; // import "/Users/present/code/super-sett/interfaces/uniswap/IUniswapRouterV2.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IController.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IStrategy.sol"; // import "contracts/badger-sett/SettAccessControl.sol"; // import "contracts/badger-sett/strategies/BaseStrategy.sol"; /* Expands swapping functionality over base strategy - ETH in and ETH out Variants - Sushiswap support in addition to Uniswap */ abstract contract BaseStrategyMultiSwapper is BaseStrategy { using SafeERC20Upgradeable for IERC20Upgradeable; using AddressUpgradeable for address; using SafeMathUpgradeable for uint256; address public constant sushiswap = 0xd9e1cE17f2641f24aE83637ab66a2cca9C378B9F; // Sushiswap router /// @notice Swap specified balance of given token on Uniswap with given path function _swap_uniswap( address startToken, uint256 balance, address[] memory path ) internal { _safeApproveHelper(startToken, uniswap, balance); IUniswapRouterV2(uniswap).swapExactTokensForTokens(balance, 0, path, address(this), now); } /// @notice Swap specified balance of given token on Uniswap with given path function _swap_sushiswap( address startToken, uint256 balance, address[] memory path ) internal { _safeApproveHelper(startToken, sushiswap, balance); IUniswapRouterV2(sushiswap).swapExactTokensForTokens(balance, 0, path, address(this), now); } function _swapEthIn_uniswap(uint256 balance, address[] memory path) internal { IUniswapRouterV2(uniswap).swapExactETHForTokens{value: balance}(0, path, address(this), now); } function _swapEthIn_sushiswap(uint256 balance, address[] memory path) internal { IUniswapRouterV2(sushiswap).swapExactETHForTokens{value: balance}(0, path, address(this), now); } function _swapEthOut_uniswap( address startToken, uint256 balance, address[] memory path ) internal { _safeApproveHelper(startToken, uniswap, balance); IUniswapRouterV2(uniswap).swapExactTokensForETH(balance, 0, path, address(this), now); } function _swapEthOut_sushiswap( address startToken, uint256 balance, address[] memory path ) internal { _safeApproveHelper(startToken, sushiswap, balance); IUniswapRouterV2(sushiswap).swapExactTokensForETH(balance, 0, path, address(this), now); } /// @notice Add liquidity to uniswap for specified token pair, utilizing the maximum balance possible function _add_max_liquidity_sushiswap(address token0, address token1) internal { uint256 _token0Balance = IERC20Upgradeable(token0).balanceOf(address(this)); uint256 _token1Balance = IERC20Upgradeable(token1).balanceOf(address(this)); _safeApproveHelper(token0, sushiswap, _token0Balance); _safeApproveHelper(token1, sushiswap, _token1Balance); IUniswapRouterV2(sushiswap).addLiquidity(token0, token1, _token0Balance, _token1Balance, 0, 0, address(this), block.timestamp); } uint256[50] private __gap; } // Dependency file: /Users/present/code/super-sett/interfaces/badger/IStakingRewardsSignalOnly.sol // pragma solidity >=0.5.0 <0.8.0; interface IStakingRewardsSignalOnly { function stakingToken() external view returns (address); function rewardsToken() external view returns (address); function withdraw(uint256) external; function getReward() external; function earned(address account) external view returns (uint256); function stake(uint256) external; function balanceOf(address) external view returns (uint256); function exit() external; } // Root file: contracts/badger-sett/strategies/sushi/StrategySushiBadgerWbtc.sol pragma solidity ^0.6.11; pragma experimental ABIEncoderV2; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol"; // import "/Users/present/code/super-sett/deps/@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol"; // import "/Users/present/code/super-sett/interfaces/uniswap/IUniswapRouterV2.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IBadgerGeyser.sol"; // import "/Users/present/code/super-sett/interfaces/sushi/ISushiChef.sol"; // import "/Users/present/code/super-sett/interfaces/sushi/IxSushi.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IController.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IMintr.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IStrategy.sol"; // import "contracts/badger-sett/strategies/BaseStrategySwapper.sol"; // import "/Users/present/code/super-sett/interfaces/badger/IStakingRewardsSignalOnly.sol"; /* Strategy to compound badger rewards - Deposit Badger into the vault to receive more from a special rewards pool */ contract StrategySushiBadgerWbtc is BaseStrategyMultiSwapper { using SafeERC20Upgradeable for IERC20Upgradeable; using AddressUpgradeable for address; using SafeMathUpgradeable for uint256; address public geyser; address public badger; // BADGER Token address public constant wbtc = 0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599; // WBTC Token address public constant sushi = 0x6B3595068778DD592e39A122f4f5a5cF09C90fE2; // SUSHI token address public constant xsushi = 0x8798249c2E607446EfB7Ad49eC89dD1865Ff4272; // xSUSHI token address public constant chef = 0xc2EdaD668740f1aA35E4D8f227fB8E17dcA888Cd; // Master staking contract uint256 public constant pid = 73; // LP token pool ID address public badgerTree; event HarvestState( uint256 xSushiHarvested, uint256 totalxSushi, uint256 toStrategist, uint256 toGovernance, uint256 toBadgerTree, uint256 timestamp, uint256 blockNumber ); event HarvestBadgerState( uint256 badgerHarvested, uint256 badgerConvertedToWbtc, uint256 wtbcFromConversion, uint256 lpGained, uint256 timestamp, uint256 blockNumber ); struct HarvestData { uint256 badgerHarvested; uint256 xSushiHarvested; uint256 totalxSushi; uint256 toStrategist; uint256 toGovernance; uint256 toBadgerTree; uint256 badgerConvertedToWbtc; uint256 wtbcFromConversion; uint256 lpGained; } struct TendData { uint256 sushiTended; } event WithdrawState(uint256 toWithdraw, uint256 preWant, uint256 postWant, uint256 withdrawn); function initialize( address _governance, address _strategist, address _controller, address _keeper, address _guardian, address[4] memory _wantConfig, uint256[3] memory _feeConfig ) public initializer whenNotPaused { __BaseStrategy_init(_governance, _strategist, _controller, _keeper, _guardian); want = _wantConfig[0]; geyser = _wantConfig[1]; badger = _wantConfig[2]; badgerTree = _wantConfig[3]; performanceFeeGovernance = _feeConfig[0]; performanceFeeStrategist = _feeConfig[1]; withdrawalFee = _feeConfig[2]; // Approve Chef and xSushi (aka SushiBar) to use our sushi IERC20Upgradeable(want).approve(chef, uint256(-1)); IERC20Upgradeable(sushi).approve(xsushi, uint256(-1)); } /// ===== View Functions ===== function version() external pure returns (string memory) { return "1.1"; } function getName() external pure override returns (string memory) { return "StrategySushiBadgerWbtc"; } function balanceOfPool() public view override returns (uint256) { // Note: Our want balance is actually in the SushiChef, but it is also tracked in the geyser, which is easier to read return IStakingRewardsSignalOnly(geyser).balanceOf(address(this)); } function getProtectedTokens() external view override returns (address[] memory) { address[] memory protectedTokens = new address[](5); protectedTokens[0] = want; protectedTokens[1] = geyser; protectedTokens[2] = badger; protectedTokens[3] = sushi; protectedTokens[4] = xsushi; return protectedTokens; } function isTendable() public view override returns (bool) { return true; } /// ===== Internal Core Implementations ===== function _onlyNotProtectedTokens(address _asset) internal override { require(address(want) != _asset, "want"); require(address(sushi) != _asset, "sushi"); require(address(xsushi) != _asset, "xsushi"); require(address(geyser) != _asset, "geyser"); require(address(badger) != _asset, "badger"); } /// @dev Deposit Badger into the staking contract /// @dev Track balance in the StakingRewards function _deposit(uint256 _want) internal override { // Deposit all want in sushi chef ISushiChef(chef).deposit(pid, _want); // "Deposit" same want into personal staking rewards via signal (note: this is a SIGNAL ONLY - the staking rewards must be locked to just this account) IStakingRewardsSignalOnly(geyser).stake(_want); } /// @dev Unroll from all strategy positions, and transfer non-core tokens to controller rewards function _withdrawAll() internal override { (uint256 staked, ) = ISushiChef(chef).userInfo(pid, address(this)); // Withdraw all want from Chef ISushiChef(chef).withdraw(pid, staked); // === Transfer extra token: Sushi === // Withdraw all sushi from SushiBar uint256 _xsushi = IERC20Upgradeable(xsushi).balanceOf(address(this)); IxSushi(xsushi).leave(_xsushi); uint256 _sushi = IERC20Upgradeable(sushi).balanceOf(address(this)); // Send all Sushi to controller rewards IERC20Upgradeable(sushi).safeTransfer(IController(controller).rewards(), _sushi); // === Transfer extra token: Badger === // "Unstake" from badger rewards source and hrvest all badger rewards IStakingRewardsSignalOnly(geyser).exit(); // Send all badger rewards to controller rewards uint256 _badger = IERC20Upgradeable(badger).balanceOf(address(this)); IERC20Upgradeable(badger).safeTransfer(IController(controller).rewards(), _badger); // Note: All want is automatically withdrawn outside this "inner hook" in base strategy function } /// @dev Withdraw want from staking rewards, using earnings first function _withdrawSome(uint256 _amount) internal override returns (uint256) { // Get idle want in the strategy uint256 _preWant = IERC20Upgradeable(want).balanceOf(address(this)); // If we lack sufficient idle want, withdraw the difference from the strategy position if (_preWant < _amount) { uint256 _toWithdraw = _amount.sub(_preWant); ISushiChef(chef).withdraw(pid, _toWithdraw); // Note: Also signal withdraw from staking rewards IStakingRewardsSignalOnly(geyser).withdraw(_toWithdraw); // Note: Withdrawl process will earn sushi, this will be deposited into SushiBar on next tend() } // Confirm how much want we actually end up with uint256 _postWant = IERC20Upgradeable(want).balanceOf(address(this)); // Return the actual amount withdrawn if less than requested uint256 _withdrawn = MathUpgradeable.min(_postWant, _amount); emit WithdrawState(_amount, _preWant, _postWant, _withdrawn); return _withdrawn; } /// @notice Harvest sushi gains from Chef and deposit into SushiBar (xSushi) to increase gains /// @notice Any excess Sushi sitting in the Strategy will be staked as well /// @notice The more frequent the tend, the higher returns will be function tend() external whenNotPaused returns (TendData memory) { _onlyAuthorizedActors(); TendData memory tendData; // Note: Deposit of zero harvests rewards balance. ISushiChef(chef).deposit(pid, 0); tendData.sushiTended = IERC20Upgradeable(sushi).balanceOf(address(this)); // Stake any harvested sushi in SushiBar to increase returns if (tendData.sushiTended > 0) { IxSushi(xsushi).enter(tendData.sushiTended); } emit Tend(tendData.sushiTended); return tendData; } /// @dev Harvest accumulated badger rewards and convert them to LP tokens /// @dev Harvest accumulated sushi and send to the controller /// @dev Restake the gained LP tokens in the Geyser function harvest() external whenNotPaused returns (HarvestData memory) { _onlyAuthorizedActors(); HarvestData memory harvestData; uint256 _beforexSushi = IERC20Upgradeable(xsushi).balanceOf(address(this)); uint256 _beforeLp = IERC20Upgradeable(want).balanceOf(address(this)); uint256 _beforeBadger = IERC20Upgradeable(badger).balanceOf(address(this)); // ===== Harvest sushi rewards from Chef ===== // Note: Deposit of zero harvests rewards balance, but go ahead and deposit idle want if we have it ISushiChef(chef).deposit(pid, _beforeLp); // Put all sushi into xsushi uint256 _sushi = IERC20Upgradeable(sushi).balanceOf(address(this)); if (_sushi > 0) { IxSushi(xsushi).enter(_sushi); } uint256 _xsushi = IERC20Upgradeable(xsushi).balanceOf(address(this)); //all xsushi is profit harvestData.totalxSushi = _xsushi; //harvested is the xsushi gain since last tend harvestData.xSushiHarvested = _xsushi.sub(_beforexSushi); // Process performance fees //performance fees in xsushi harvestData.toStrategist = _processFee(xsushi, harvestData.totalxSushi, performanceFeeStrategist, strategist); harvestData.toGovernance = _processFee(xsushi, harvestData.totalxSushi, performanceFeeGovernance, IController(controller).rewards()); // Transfer remainder to Tree //tree gets xsushi instead of sushi so it keeps compounding harvestData.toBadgerTree = IERC20Upgradeable(xsushi).balanceOf(address(this)); IERC20Upgradeable(xsushi).safeTransfer(badgerTree, harvestData.toBadgerTree); // ===== Harvest all Badger rewards: Sell to underlying (no performance fees) ===== IStakingRewardsSignalOnly(geyser).getReward(); uint256 _afterBadger = IERC20Upgradeable(badger).balanceOf(address(this)); harvestData.badgerHarvested = _afterBadger.sub(_beforeBadger); // ===== Swap half of badger for wBTC in liquidity pool ===== if (harvestData.badgerHarvested > 0) { harvestData.badgerConvertedToWbtc = harvestData.badgerHarvested.div(2); if (harvestData.badgerConvertedToWbtc > 0) { address[] memory path = new address[](2); path[0] = badger; // Badger path[1] = wbtc; _swap_sushiswap(badger, harvestData.badgerConvertedToWbtc, path); // Add Badger and wBTC as liquidity if any to add _add_max_liquidity_sushiswap(badger, wbtc); } } // ===== Deposit gained LP position into Chef & staking rewards ===== uint256 _afterLp = IERC20Upgradeable(want).balanceOf(address(this)); harvestData.lpGained = _afterLp.sub(_beforeLp); if (harvestData.lpGained > 0) { _deposit(harvestData.lpGained); } emit HarvestState( harvestData.xSushiHarvested, harvestData.totalxSushi, harvestData.toStrategist, harvestData.toGovernance, harvestData.toBadgerTree, block.timestamp, block.number ); emit HarvestBadgerState( harvestData.badgerHarvested, harvestData.badgerConvertedToWbtc, harvestData.wtbcFromConversion, harvestData.lpGained, block.timestamp, block.number ); emit Harvest(harvestData.lpGained, block.number); return harvestData; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"harvested","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"badgerHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"badgerConvertedToWbtc","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wtbcFromConversion","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lpGained","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"HarvestBadgerState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"xSushiHarvested","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"totalxSushi","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toStrategist","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toGovernance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toBadgerTree","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"timestamp","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"HarvestState","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"controller","type":"address"}],"name":"SetController","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"governance","type":"address"}],"name":"SetGovernance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"performanceFeeGovernance","type":"uint256"}],"name":"SetPerformanceFeeGovernance","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"performanceFeeStrategist","type":"uint256"}],"name":"SetPerformanceFeeStrategist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"strategist","type":"address"}],"name":"SetStrategist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"withdrawalFee","type":"uint256"}],"name":"SetWithdrawalFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tended","type":"uint256"}],"name":"Tend","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"WithdrawAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawOther","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"toWithdraw","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"preWant","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"postWant","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"withdrawn","type":"uint256"}],"name":"WithdrawState","type":"event"},{"inputs":[],"name":"MAX_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"address","name":"_guardian","type":"address"}],"name":"__BaseStrategy_init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"badger","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"badgerTree","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfPool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"balanceOfWant","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseStrategyVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chef","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getProtectedTokens","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"geyser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governance","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"guardian","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[{"components":[{"internalType":"uint256","name":"badgerHarvested","type":"uint256"},{"internalType":"uint256","name":"xSushiHarvested","type":"uint256"},{"internalType":"uint256","name":"totalxSushi","type":"uint256"},{"internalType":"uint256","name":"toStrategist","type":"uint256"},{"internalType":"uint256","name":"toGovernance","type":"uint256"},{"internalType":"uint256","name":"toBadgerTree","type":"uint256"},{"internalType":"uint256","name":"badgerConvertedToWbtc","type":"uint256"},{"internalType":"uint256","name":"wtbcFromConversion","type":"uint256"},{"internalType":"uint256","name":"lpGained","type":"uint256"}],"internalType":"struct StrategySushiBadgerWbtc.HarvestData","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"},{"internalType":"address","name":"_strategist","type":"address"},{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_keeper","type":"address"},{"internalType":"address","name":"_guardian","type":"address"},{"internalType":"address[4]","name":"_wantConfig","type":"address[4]"},{"internalType":"uint256[3]","name":"_feeConfig","type":"uint256[3]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isTendable","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFeeGovernance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performanceFeeStrategist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_governance","type":"address"}],"name":"setGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_guardian","type":"address"}],"name":"setGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_keeper","type":"address"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFeeGovernance","type":"uint256"}],"name":"setPerformanceFeeGovernance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_performanceFeeStrategist","type":"uint256"}],"name":"setPerformanceFeeStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawalFee","type":"uint256"}],"name":"setWithdrawalFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_threshold","type":"uint256"}],"name":"setWithdrawalMaxDeviationThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushi","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sushiswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tend","outputs":[{"components":[{"internalType":"uint256","name":"sushiTended","type":"uint256"}],"internalType":"struct StrategySushiBadgerWbtc.TendData","name":"","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswap","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"want","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wbtc","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_asset","type":"address"}],"name":"withdrawOther","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalMaxDeviationThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xsushi","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50613dae806100206000396000f3fe608060405234801561001057600080fd5b50600436106102bb5760003560e01c806378ee9aa511610182578063aced1661116100e9578063d704ba9b116100a2578063f10684541161007c578063f10684541461050a578063f55462f414610512578063f77c479114610525578063fb883d0c1461052d576102bb565b8063d704ba9b146104e2578063e066ca13146103b5578063ed4bdce1146104f5576102bb565b8063aced1661146104a7578063aff0ba91146104af578063bc063e1a146104b7578063c1a3d44c146104bf578063c7b9d530146104c7578063d0e30db0146104da576102bb565b80638a0dac4a1161013b5780638a0dac4a1461044b5780638bc7e8c41461045e57806392eefe9b146104665780639be2878514610479578063ab033ea914610481578063ac1e502514610494576102bb565b806378ee9aa5146104105780637e744eea146104185780638456cb59146104205780638457213a14610428578063853828b61461043b5780638948369514610443576102bb565b80633f4ba83a116102265780635aa6e675116101df5780635aa6e675146103bd5780635c975abb146103c557806367963132146103da578063722713f7146103e257806372c987f1146103ea578063748747e6146103fd576102bb565b80633f4ba83a14610373578063440368a31461037b578063452a9320146103905780634641257d14610398578063504a1647146103ad57806354fd4d50146103b5576102bb565b80631fc8bc5d116102785780631fc8bc5d1461032b5780631fe4a686146103335780632681f7e41461033b5780632e1a7d4d146103435780633951f3df146103585780633cdc53891461036b576102bb565b80630a087903146102c057806311588086146102de57806315b18ddd146102f357806317d7de7c146102fb5780631bd43be3146103105780631f1fcd5114610323575b600080fd5b6102c8610535565b6040516102d5919061353e565b60405180910390f35b6102e661054d565b6040516102d59190613bf3565b6102e66105d5565b6103036105db565b6040516102d591906135ec565b6102e661031e366004613222565b610612565b6102c86106f0565b6102c86106ff565b6102c8610717565b6102c8610726565b61035661035136600461345f565b61073e565b005b61035661036636600461325a565b6108a4565b6102c86109b1565b6103566109c9565b6103836109db565b6040516102d59190613be9565b6102c8610bb4565b6103a0610bc3565b6040516102d59190613b84565b6102e66114a2565b6103036114a8565b6102c86114c5565b6103cd6114d4565b6040516102d591906135e1565b6102c86114dd565b6102e66114ed565b6103566103f83660046132ca565b611508565b61035661040b366004613222565b61175f565b6102c8611789565b6103cd61179b565b6103566117a0565b61035661043636600461345f565b6117b0565b6102e66117df565b6102c8611897565b610356610459366004613222565b6118a7565b6102e66118d1565b610356610474366004613222565b6118d7565b6102c8611901565b61035661048f366004613222565b611919565b6103566104a236600461345f565b611943565b6102c8611972565b6102c8611981565b6102e6611991565b6102e6611997565b6103566104d5366004613222565b6119c8565b6103566119f2565b6103566104f036600461345f565b611aba565b6104fd611ae9565b6040516102d591906135ce565b6102e6611c1c565b61035661052036600461345f565b611c21565b6102c8611c50565b6102e6611c5f565b736b3595068778dd592e39a122f4f5a5cf09c90fe281565b610105546040516370a0823160e01b81526000916001600160a01b0316906370a082319061057f90309060040161353e565b60206040518083038186803b15801561059757600080fd5b505afa1580156105ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cf9190613477565b90505b90565b609b5481565b60408051808201909152601781527f5374726174656779537573686942616467657257627463000000000000000000602082015290565b60335460009060ff16156106415760405162461bcd60e51b8152600401610638906138a9565b60405180910390fd5b610649611c65565b61065282611c8f565b6040516370a0823160e01b81526001600160a01b038316906370a082319061067e90309060040161353e565b60206040518083038186803b15801561069657600080fd5b505afa1580156106aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ce9190613477565b609e549091506106eb906001600160a01b03848116911683611d8f565b919050565b609a546001600160a01b031681565b73c2edad668740f1aa35e4d8f227fb8e17dca888cd81565b6066546001600160a01b031681565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60335460ff16156107615760405162461bcd60e51b8152600401610638906138a9565b610769611c65565b609a546040516370a0823160e01b81526000916001600160a01b0316906370a082319061079a90309060040161353e565b60206040518083038186803b1580156107b257600080fd5b505afa1580156107c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ea9190613477565b90506000818381101561086f576108096108048585611dea565b611e35565b9150610815828461207a565b90508381101561086f57600061082b858361209f565b905061084e61271061084860a054886120cb90919063ffffffff16565b90612105565b81111561086d5760405162461bcd60e51b81526004016106389061364d565b505b600061087b8286612147565b905060006108888261215d565b905061089c6108978383611dea565b61222d565b505050505050565b600054610100900460ff16806108bd57506108bd6122f8565b806108cb575060005460ff16155b6108e75760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff16158015610912576000805460ff1961ff0019909116610100171660011790555b60335460ff16156109355760405162461bcd60e51b8152600401610638906138a9565b61093d6122fe565b606580546001600160a01b03199081166001600160a01b0389811691909117909255606680548216888416179055606780548216868416179055609e80548216878416179055609f8054909116918416919091179055603260a055801561089c576000805461ff0019169055505050505050565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b6109d1612390565b6109d96123ba565b565b6109e361316a565b60335460ff1615610a065760405162461bcd60e51b8152600401610638906138a9565b610a0e612426565b610a1661316a565b604051631c57762b60e31b815273c2edad668740f1aa35e4d8f227fb8e17dca888cd9063e2bbb15890610a5190604990600090600401613c13565b600060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b50506040516370a0823160e01b8152736b3595068778dd592e39a122f4f5a5cf09c90fe292506370a082319150610aba90309060040161353e565b60206040518083038186803b158015610ad257600080fd5b505afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190613477565b80825215610b77578051604051632967cf8360e21b8152600080516020613d598339815191529163a59f3e0c91610b449190600401613bf3565b600060405180830381600087803b158015610b5e57600080fd5b505af1158015610b72573d6000803e3d6000fd5b505050505b80516040517f8ea01a73fd14904f3ff9411fca71994cb18c9118112c82f0c102bb3b1d1cedec91610ba791613bf3565b60405180910390a1905090565b609f546001600160a01b031681565b610bcb61317d565b60335460ff1615610bee5760405162461bcd60e51b8152600401610638906138a9565b610bf6612426565b610bfe61317d565b6040516370a0823160e01b8152600090600080516020613d59833981519152906370a0823190610c3290309060040161353e565b60206040518083038186803b158015610c4a57600080fd5b505afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190613477565b609a546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610cb890309060040161353e565b60206040518083038186803b158015610cd057600080fd5b505afa158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d089190613477565b610106546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610d3f90309060040161353e565b60206040518083038186803b158015610d5757600080fd5b505afa158015610d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8f9190613477565b604051631c57762b60e31b815290915073c2edad668740f1aa35e4d8f227fb8e17dca888cd9063e2bbb15890610dcc906049908690600401613c13565b600060405180830381600087803b158015610de657600080fd5b505af1158015610dfa573d6000803e3d6000fd5b50506040516370a0823160e01b815260009250736b3595068778dd592e39a122f4f5a5cf09c90fe291506370a0823190610e3890309060040161353e565b60206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190613477565b90508015610ef457604051632967cf8360e21b8152600080516020613d598339815191529063a59f3e0c90610ec1908490600401613bf3565b600060405180830381600087803b158015610edb57600080fd5b505af1158015610eef573d6000803e3d6000fd5b505050505b6040516370a0823160e01b8152600090600080516020613d59833981519152906370a0823190610f2890309060040161353e565b60206040518083038186803b158015610f4057600080fd5b505afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190613477565b604087018190529050610f8b8186611dea565b60208701526040860151609c54606654610fbf92600080516020613d598339815191529290916001600160a01b0316612465565b6060870152604080870151609b54609e5483516327b16a2560e21b8152935161106194600080516020613d598339815191529493926001600160a01b031691639ec5a89491600480820192602092909190829003018186803b15801561102457600080fd5b505afa158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c919061323e565b612465565b60808701526040516370a0823160e01b8152600080516020613d59833981519152906370a082319061109790309060040161353e565b60206040518083038186803b1580156110af57600080fd5b505afa1580156110c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e79190613477565b60a087018190526101075461111591600080516020613d59833981519152916001600160a01b031690611d8f565b61010560009054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561116657600080fd5b505af115801561117a573d6000803e3d6000fd5b5050610106546040516370a0823160e01b8152600093506001600160a01b0390911691506370a08231906111b290309060040161353e565b60206040518083038186803b1580156111ca57600080fd5b505afa1580156111de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112029190613477565b905061120e8185611dea565b80885215611307578651611223906002612105565b60c088018190521561130757604080516002808252606080830184529260208301908036833750506101065482519293506001600160a01b03169183915060009061126a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c599816001815181106112ac57fe5b6001600160a01b0392831660209182029290920101526101065460c08a01516112da929190911690836124a7565b61010654611305906001600160a01b0316732260fac5e5542a773aa44fbcfedf7c193bc2c599612562565b505b609a546040516370a0823160e01b81526000916001600160a01b0316906370a082319061133890309060040161353e565b60206040518083038186803b15801561135057600080fd5b505afa158015611364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113889190613477565b90506113948187611dea565b6101008901819052156113af576113af886101000151612741565b7f67a619370e37f3af4f694699d1acece0d7773651ff016db8771fa0a518067941886020015189604001518a606001518b608001518c60a0015142436040516113fe9796959493929190613ca0565b60405180910390a17fbc5e584fcd12bd738c4dfc44205952a9332b1f93e57c84e1b0c82fb56b41c11988600001518960c001518a60e001518b6101000151424360405161145096959493929190613c78565b60405180910390a1437f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c89610100015160405161148d9190613bf3565b60405180910390a25095965050505050505090565b609c5481565b604080518082019091526003815262312e3160e81b602082015290565b6065546001600160a01b031681565b60335460ff1690565b610105546001600160a01b031681565b60006105cf6114fa61054d565b611502611997565b9061207a565b600054610100900460ff168061152157506115216122f8565b8061152f575060005460ff16155b61154b5760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff16158015611576576000805460ff1961ff0019909116610100171660011790555b60335460ff16156115995760405162461bcd60e51b8152600401610638906138a9565b6115a688888888886108a4565b8251609a80546001600160a01b03199081166001600160a01b039384161791829055602080870151610105805484169186169190911790556040808801516101068054851691871691909117905560608801516101078054909416908616179092558551609b55850151609c5584810151609d555163095ea7b360e01b815291169063095ea7b3906116549073c2edad668740f1aa35e4d8f227fb8e17dca888cd90600019906004016135b5565b602060405180830381600087803b15801561166e57600080fd5b505af1158015611682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a6919061343f565b5060405163095ea7b360e01b8152736b3595068778dd592e39a122f4f5a5cf09c90fe29063095ea7b3906116f090600080516020613d5983398151915290600019906004016135b5565b602060405180830381600087803b15801561170a57600080fd5b505af115801561171e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611742919061343f565b508015611755576000805461ff00191690555b5050505050505050565b611767612390565b606780546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020613d5983398151915281565b600190565b6117a8612813565b6109d9612852565b6117b8612390565b6127108111156117da5760405162461bcd60e51b815260040161063890613a33565b609b55565b60335460009060ff16156118055760405162461bcd60e51b8152600401610638906138a9565b61180d611c65565b6118156128ab565b609a546040516370a0823160e01b81526105d2916001600160a01b0316906370a082319061184790309060040161353e565b60206040518083038186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108979190613477565b610107546001600160a01b031681565b6118af612390565b609f80546001600160a01b0319166001600160a01b0392909216919091179055565b609d5481565b6118df612390565b609e80546001600160a01b0319166001600160a01b0392909216919091179055565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b611921612390565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b61194b612390565b61271081111561196d5760405162461bcd60e51b815260040161063890613863565b609d55565b6067546001600160a01b031681565b610106546001600160a01b031681565b61271081565b609a546040516370a0823160e01b81526000916001600160a01b0316906370a082319061057f90309060040161353e565b6119d0612390565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60335460ff1615611a155760405162461bcd60e51b8152600401610638906138a9565b611a1d612d4e565b609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611a4e90309060040161353e565b60206040518083038186803b158015611a6657600080fd5b505afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190613477565b90508015611aaf57611aaf81612741565b611ab76109d9565b50565b611ac2612390565b612710811115611ae45760405162461bcd60e51b8152600401610638906139a0565b60a055565b60408051600580825260c082019092526060918291906020820160a0803683375050609a5482519293506001600160a01b031691839150600090611b2957fe5b6001600160a01b03928316602091820292909201015261010554825191169082906001908110611b5557fe5b6001600160a01b03928316602091820292909201015261010654825191169082906002908110611b8157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050736b3595068778dd592e39a122f4f5a5cf09c90fe281600381518110611bc357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613d5983398151915281600481518110611bff57fe5b6001600160a01b0390921660209283029190910190910152905090565b604981565b611c29612390565b612710811115611c4b5760405162461bcd60e51b815260040161063890613811565b609c55565b609e546001600160a01b031681565b60a05481565b609e546001600160a01b031633146109d95760405162461bcd60e51b815260040161063890613774565b609a546001600160a01b0382811691161415611cbd5760405162461bcd60e51b8152600401610638906138d3565b736b3595068778dd592e39a122f4f5a5cf09c90fe26001600160a01b0382161415611cfa5760405162461bcd60e51b815260040161063890613a14565b600080516020613d598339815191526001600160a01b0382161415611d315760405162461bcd60e51b81526004016106389061379c565b610105546001600160a01b0382811691161415611d605760405162461bcd60e51b8152600401610638906137f1565b610106546001600160a01b0382811691161415611ab75760405162461bcd60e51b81526004016106389061371d565b611de58363a9059cbb60e01b8484604051602401611dae9291906135b5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612da2565b505050565b6000611e2c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e31565b90505b92915050565b609a546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190611e6a90309060040161353e565b60206040518083038186803b158015611e8257600080fd5b505afa158015611e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eba9190613477565b905082811015611fa4576000611ed08483611dea565b604051630441a3e760e41b815290915073c2edad668740f1aa35e4d8f227fb8e17dca888cd9063441a3e7090611f0d906049908590600401613c13565b600060405180830381600087803b158015611f2757600080fd5b505af1158015611f3b573d6000803e3d6000fd5b505061010554604051632e1a7d4d60e01b81526001600160a01b039091169250632e1a7d4d9150611f70908490600401613bf3565b600060405180830381600087803b158015611f8a57600080fd5b505af1158015611f9e573d6000803e3d6000fd5b50505050505b609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611fd590309060040161353e565b60206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120259190613477565b905060006120338286612147565b90507f31c9c70d9d3f8c9d1c38dc84504d6e076ea17e0c2aebda9cf0610a3cdf3c3f6a8584848460405161206a9493929190613c5d565b60405180910390a1949350505050565b600082820183811015611e2c5760405162461bcd60e51b81526004016106389061373d565b6000818310156120c15760405162461bcd60e51b8152600401610638906136d0565b611e2c8383611dea565b6000826120da57506000611e2f565b828202828482816120e757fe5b0414611e2c5760405162461bcd60e51b81526004016106389061393f565b6000611e2c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e5d565b60008183106121565781611e2c565b5090919050565b6000609d5460001415612172575060006106eb565b600061218f612710610848609d54866120cb90919063ffffffff16565b9050611e2f609e60009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e257600080fd5b505afa1580156121f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221a919061323e565b609a546001600160a01b03169083611d8f565b609e54609a54604051632988bb9f60e21b81526000926001600160a01b039081169263a622ee7c92612265929091169060040161353e565b60206040518083038186803b15801561227d57600080fd5b505afa158015612291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b5919061323e565b90506001600160a01b0381166122dd5760405162461bcd60e51b815260040161063890613980565b609a546122f4906001600160a01b03168284611d8f565b5050565b303b1590565b600054610100900460ff168061231757506123176122f8565b80612325575060005460ff16155b6123415760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff1615801561236c576000805460ff1961ff0019909116610100171660011790555b612374612e94565b61237c612f15565b8015611ab7576000805461ff001916905550565b6065546001600160a01b031633146109d95760405162461bcd60e51b815260040161063890613b06565b60335460ff166123dc5760405162461bcd60e51b8152600401610638906136a2565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61240f612fa1565b60405161241c919061353e565b60405180910390a1565b6067546001600160a01b031633148061244957506065546001600160a01b031633145b6109d95760405162461bcd60e51b81526004016106389061361f565b6000826124745750600061249f565b600061248661271061084887876120cb565b905061249c6001600160a01b0387168483611d8f565b90505b949350505050565b6124c68373d9e1ce17f2641f24ae83637ab66a2cca9c378b9f84612fa5565b6040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990612506908590600090869030904290600401613c21565b600060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261255c91908101906133aa565b50505050565b6040516370a0823160e01b81526000906001600160a01b038416906370a082319061259190309060040161353e565b60206040518083038186803b1580156125a957600080fd5b505afa1580156125bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e19190613477565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612611919061353e565b60206040518083038186803b15801561262957600080fd5b505afa15801561263d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126619190613477565b90506126828473d9e1ce17f2641f24ae83637ab66a2cca9c378b9f84612fa5565b6126a18373d9e1ce17f2641f24ae83637ab66a2cca9c378b9f83612fa5565b60405162e8e33760e81b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063e8e33700906126e690879087908790879060009081903090429060040161356c565b606060405180830381600087803b15801561270057600080fd5b505af1158015612714573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273891906134b2565b50505050505050565b604051631c57762b60e31b815273c2edad668740f1aa35e4d8f227fb8e17dca888cd9063e2bbb1589061277b906049908590600401613c13565b600060405180830381600087803b15801561279557600080fd5b505af11580156127a9573d6000803e3d6000fd5b50506101055460405163534a7e1d60e11b81526001600160a01b03909116925063a694fc3a91506127de908490600401613bf3565b600060405180830381600087803b1580156127f857600080fd5b505af115801561280c573d6000803e3d6000fd5b5050505050565b609f546001600160a01b031633148061283657506065546001600160a01b031633145b6109d95760405162461bcd60e51b8152600401610638906139ef565b60335460ff16156128755760405162461bcd60e51b8152600401610638906138a9565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861240f612fa1565b6040516393f1a40b60e01b815260009073c2edad668740f1aa35e4d8f227fb8e17dca888cd906393f1a40b906128e8906049903090600401613bfc565b604080518083038186803b1580156128ff57600080fd5b505afa158015612913573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612937919061348f565b50604051630441a3e760e41b815290915073c2edad668740f1aa35e4d8f227fb8e17dca888cd9063441a3e7090612975906049908590600401613c13565b600060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b50506040516370a0823160e01b815260009250600080516020613d5983398151915291506370a08231906129db90309060040161353e565b60206040518083038186803b1580156129f357600080fd5b505afa158015612a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2b9190613477565b6040516367dfd4c960e01b8152909150600080516020613d59833981519152906367dfd4c990612a5f908490600401613bf3565b600060405180830381600087803b158015612a7957600080fd5b505af1158015612a8d573d6000803e3d6000fd5b50506040516370a0823160e01b815260009250736b3595068778dd592e39a122f4f5a5cf09c90fe291506370a0823190612acb90309060040161353e565b60206040518083038186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1b9190613477565b9050612bc2609e60009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b158015612b6e57600080fd5b505afa158015612b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba6919061323e565b736b3595068778dd592e39a122f4f5a5cf09c90fe29083611d8f565b61010560009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b5050610106546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190612c5f90309060040161353e565b60206040518083038186803b158015612c7757600080fd5b505afa158015612c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612caf9190613477565b905061255c609e60009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3a919061323e565b610106546001600160a01b03169083611d8f565b6067546001600160a01b0316331480612d7157506065546001600160a01b031633145b80612d865750609e546001600160a01b031633145b6109d95760405162461bcd60e51b8152600401610638906137bc565b6060612df7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fce9092919063ffffffff16565b805190915015611de55780806020019051810190612e15919061343f565b611de55760405162461bcd60e51b815260040161063890613abc565b60008184841115612e555760405162461bcd60e51b815260040161063891906135ec565b505050900390565b60008183612e7e5760405162461bcd60e51b815260040161063891906135ec565b506000838581612e8a57fe5b0495945050505050565b600054610100900460ff1680612ead5750612ead6122f8565b80612ebb575060005460ff16155b612ed75760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff1615801561237c576000805460ff1961ff0019909116610100171660011790558015611ab7576000805461ff001916905550565b600054610100900460ff1680612f2e5750612f2e6122f8565b80612f3c575060005460ff16155b612f585760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff16158015612f83576000805460ff1961ff0019909116610100171660011790555b6033805460ff191690558015611ab7576000805461ff001916905550565b3390565b612fba6001600160a01b038416836000612fdd565b611de56001600160a01b0384168383612fdd565b606061249f84846000856130a0565b8015806130655750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906130139030908690600401613552565b60206040518083038186803b15801561302b57600080fd5b505afa15801561303f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130639190613477565b155b6130815760405162461bcd60e51b815260040161063890613b2e565b611de58363095ea7b360e01b8484604051602401611dae9291906135b5565b60606130ab85613164565b6130c75760405162461bcd60e51b815260040161063890613a85565b60006060866001600160a01b031685876040516130e49190613522565b60006040518083038185875af1925050503d8060008114613121576040519150601f19603f3d011682016040523d82523d6000602084013e613126565b606091505b5091509150811561313a57915061249f9050565b80511561314a5780518082602001fd5b8360405162461bcd60e51b815260040161063891906135ec565b3b151590565b6040518060200160405280600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600082601f8301126131d9578081fd5b6131e36060613cd0565b90508082846060850111156131f757600080fd5b60005b60038110156132195781358352602092830192909101906001016131fa565b50505092915050565b600060208284031215613233578081fd5b8135611e2c81613d43565b60006020828403121561324f578081fd5b8151611e2c81613d43565b600080600080600060a08688031215613271578081fd5b853561327c81613d43565b9450602086013561328c81613d43565b9350604086013561329c81613d43565b925060608601356132ac81613d43565b915060808601356132bc81613d43565b809150509295509295909350565b6000806000806000806000610180888a0312156132e5578182fd5b87356132f081613d43565b965060208881013561330181613d43565b9650604089013561331181613d43565b9550606089013561332181613d43565b9450608089013561333181613d43565b935060bf89018a13613341578283fd5b61334b6080613cd0565b8060a08b016101208c018d811115613361578687fd5b865b600481101561338957823561337781613d43565b85529385019391850191600101613363565b508296506133978e826131c9565b9550505050505092959891949750929550565b600060208083850312156133bc578182fd5b825167ffffffffffffffff8111156133d2578283fd5b8301601f810185136133e2578283fd5b80516133f56133f082613cf7565b613cd0565b8181528381019083850185840285018601891015613411578687fd5b8694505b83851015613433578051835260019490940193918501918501613415565b50979650505050505050565b600060208284031215613450578081fd5b81518015158114611e2c578182fd5b600060208284031215613470578081fd5b5035919050565b600060208284031215613488578081fd5b5051919050565b600080604083850312156134a1578182fd5b505080516020909101519092909150565b6000806000606084860312156134c6578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156135175781516001600160a01b0316875295820195908201906001016134f2565b509495945050505050565b60008251613534818460208701613d17565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b03929092168252602082015260400190565b600060208252611e2c60208301846134df565b901515815260200190565b600060208252825180602084015261360b816040850160208701613d17565b601f01601f19169190910160400192915050565b6020808252601490820152736f6e6c79417574686f72697a65644163746f727360601b604082015260600190565b60208082526035908201527f626173652d73747261746567792f77697468647261772d6578636565642d6d616040820152741e0b59195d9a585d1a5bdb8b5d1a1c995cda1bdb19605a1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602d908201527f646966662f65787065637465642d6869676865722d6e756d6265722d696e2d6660408201526c34b939ba16b837b9b4ba34b7b760991b606082015260800190565b6020808252600690820152653130b233b2b960d11b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600e908201526d37b7363ca1b7b73a3937b63632b960911b604082015260600190565b60208082526006908201526578737573686960d01b604082015260600190565b6020808252818101527f6f6e6c79417574686f72697a65644163746f72734f72436f6e74726f6c6c6572604082015260600190565b60208082526006908201526533b2bcb9b2b960d11b604082015260600190565b60208082526032908201527f626173652d73747261746567792f6578636573736976652d737472617465676960408201527173742d706572666f726d616e63652d66656560701b606082015260800190565b60208082526026908201527f626173652d73747261746567792f6578636573736976652d7769746864726177604082015265616c2d66656560d01b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600490820152631dd85b9d60e21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252602f908201527f626173652d73747261746567792f6578636573736976652d6d61782d6465766960408201526e185d1a5bdb8b5d1a1c995cda1bdb19608a1b606082015260800190565b6020808252600b908201526a6f6e6c795061757365727360a81b604082015260600190565b602080825260059082015264737573686960d81b604082015260600190565b60208082526032908201527f626173652d73747261746567792f6578636573736976652d676f7665726e616e60408201527163652d706572666f726d616e63652d66656560701b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600e908201526d6f6e6c79476f7665726e616e636560901b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b600061012082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525092915050565b9051815260200190565b90815260200190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b600086825285602083015260a06040830152613c4060a08301866134df565b6001600160a01b0394909416606083015250608001529392505050565b93845260208401929092526040830152606082015260800190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60405181810167ffffffffffffffff81118282101715613cef57600080fd5b604052919050565b600067ffffffffffffffff821115613d0d578081fd5b5060209081020190565b60005b83811015613d32578181015183820152602001613d1a565b8381111561255c5750506000910152565b6001600160a01b0381168114611ab757600080fdfe0000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff4272a26469706673582212201039b6af8be11ed11705350bf4b2b95fe70efcb0de2683cc5e061485d905469e64736f6c634300060c0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102bb5760003560e01c806378ee9aa511610182578063aced1661116100e9578063d704ba9b116100a2578063f10684541161007c578063f10684541461050a578063f55462f414610512578063f77c479114610525578063fb883d0c1461052d576102bb565b8063d704ba9b146104e2578063e066ca13146103b5578063ed4bdce1146104f5576102bb565b8063aced1661146104a7578063aff0ba91146104af578063bc063e1a146104b7578063c1a3d44c146104bf578063c7b9d530146104c7578063d0e30db0146104da576102bb565b80638a0dac4a1161013b5780638a0dac4a1461044b5780638bc7e8c41461045e57806392eefe9b146104665780639be2878514610479578063ab033ea914610481578063ac1e502514610494576102bb565b806378ee9aa5146104105780637e744eea146104185780638456cb59146104205780638457213a14610428578063853828b61461043b5780638948369514610443576102bb565b80633f4ba83a116102265780635aa6e675116101df5780635aa6e675146103bd5780635c975abb146103c557806367963132146103da578063722713f7146103e257806372c987f1146103ea578063748747e6146103fd576102bb565b80633f4ba83a14610373578063440368a31461037b578063452a9320146103905780634641257d14610398578063504a1647146103ad57806354fd4d50146103b5576102bb565b80631fc8bc5d116102785780631fc8bc5d1461032b5780631fe4a686146103335780632681f7e41461033b5780632e1a7d4d146103435780633951f3df146103585780633cdc53891461036b576102bb565b80630a087903146102c057806311588086146102de57806315b18ddd146102f357806317d7de7c146102fb5780631bd43be3146103105780631f1fcd5114610323575b600080fd5b6102c8610535565b6040516102d5919061353e565b60405180910390f35b6102e661054d565b6040516102d59190613bf3565b6102e66105d5565b6103036105db565b6040516102d591906135ec565b6102e661031e366004613222565b610612565b6102c86106f0565b6102c86106ff565b6102c8610717565b6102c8610726565b61035661035136600461345f565b61073e565b005b61035661036636600461325a565b6108a4565b6102c86109b1565b6103566109c9565b6103836109db565b6040516102d59190613be9565b6102c8610bb4565b6103a0610bc3565b6040516102d59190613b84565b6102e66114a2565b6103036114a8565b6102c86114c5565b6103cd6114d4565b6040516102d591906135e1565b6102c86114dd565b6102e66114ed565b6103566103f83660046132ca565b611508565b61035661040b366004613222565b61175f565b6102c8611789565b6103cd61179b565b6103566117a0565b61035661043636600461345f565b6117b0565b6102e66117df565b6102c8611897565b610356610459366004613222565b6118a7565b6102e66118d1565b610356610474366004613222565b6118d7565b6102c8611901565b61035661048f366004613222565b611919565b6103566104a236600461345f565b611943565b6102c8611972565b6102c8611981565b6102e6611991565b6102e6611997565b6103566104d5366004613222565b6119c8565b6103566119f2565b6103566104f036600461345f565b611aba565b6104fd611ae9565b6040516102d591906135ce565b6102e6611c1c565b61035661052036600461345f565b611c21565b6102c8611c50565b6102e6611c5f565b736b3595068778dd592e39a122f4f5a5cf09c90fe281565b610105546040516370a0823160e01b81526000916001600160a01b0316906370a082319061057f90309060040161353e565b60206040518083038186803b15801561059757600080fd5b505afa1580156105ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105cf9190613477565b90505b90565b609b5481565b60408051808201909152601781527f5374726174656779537573686942616467657257627463000000000000000000602082015290565b60335460009060ff16156106415760405162461bcd60e51b8152600401610638906138a9565b60405180910390fd5b610649611c65565b61065282611c8f565b6040516370a0823160e01b81526001600160a01b038316906370a082319061067e90309060040161353e565b60206040518083038186803b15801561069657600080fd5b505afa1580156106aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ce9190613477565b609e549091506106eb906001600160a01b03848116911683611d8f565b919050565b609a546001600160a01b031681565b73c2edad668740f1aa35e4d8f227fb8e17dca888cd81565b6066546001600160a01b031681565b737a250d5630b4cf539739df2c5dacb4c659f2488d81565b60335460ff16156107615760405162461bcd60e51b8152600401610638906138a9565b610769611c65565b609a546040516370a0823160e01b81526000916001600160a01b0316906370a082319061079a90309060040161353e565b60206040518083038186803b1580156107b257600080fd5b505afa1580156107c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ea9190613477565b90506000818381101561086f576108096108048585611dea565b611e35565b9150610815828461207a565b90508381101561086f57600061082b858361209f565b905061084e61271061084860a054886120cb90919063ffffffff16565b90612105565b81111561086d5760405162461bcd60e51b81526004016106389061364d565b505b600061087b8286612147565b905060006108888261215d565b905061089c6108978383611dea565b61222d565b505050505050565b600054610100900460ff16806108bd57506108bd6122f8565b806108cb575060005460ff16155b6108e75760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff16158015610912576000805460ff1961ff0019909116610100171660011790555b60335460ff16156109355760405162461bcd60e51b8152600401610638906138a9565b61093d6122fe565b606580546001600160a01b03199081166001600160a01b0389811691909117909255606680548216888416179055606780548216868416179055609e80548216878416179055609f8054909116918416919091179055603260a055801561089c576000805461ff0019169055505050505050565b732260fac5e5542a773aa44fbcfedf7c193bc2c59981565b6109d1612390565b6109d96123ba565b565b6109e361316a565b60335460ff1615610a065760405162461bcd60e51b8152600401610638906138a9565b610a0e612426565b610a1661316a565b604051631c57762b60e31b815273c2edad668740f1aa35e4d8f227fb8e17dca888cd9063e2bbb15890610a5190604990600090600401613c13565b600060405180830381600087803b158015610a6b57600080fd5b505af1158015610a7f573d6000803e3d6000fd5b50506040516370a0823160e01b8152736b3595068778dd592e39a122f4f5a5cf09c90fe292506370a082319150610aba90309060040161353e565b60206040518083038186803b158015610ad257600080fd5b505afa158015610ae6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0a9190613477565b80825215610b77578051604051632967cf8360e21b8152600080516020613d598339815191529163a59f3e0c91610b449190600401613bf3565b600060405180830381600087803b158015610b5e57600080fd5b505af1158015610b72573d6000803e3d6000fd5b505050505b80516040517f8ea01a73fd14904f3ff9411fca71994cb18c9118112c82f0c102bb3b1d1cedec91610ba791613bf3565b60405180910390a1905090565b609f546001600160a01b031681565b610bcb61317d565b60335460ff1615610bee5760405162461bcd60e51b8152600401610638906138a9565b610bf6612426565b610bfe61317d565b6040516370a0823160e01b8152600090600080516020613d59833981519152906370a0823190610c3290309060040161353e565b60206040518083038186803b158015610c4a57600080fd5b505afa158015610c5e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c829190613477565b609a546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610cb890309060040161353e565b60206040518083038186803b158015610cd057600080fd5b505afa158015610ce4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d089190613477565b610106546040516370a0823160e01b81529192506000916001600160a01b03909116906370a0823190610d3f90309060040161353e565b60206040518083038186803b158015610d5757600080fd5b505afa158015610d6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d8f9190613477565b604051631c57762b60e31b815290915073c2edad668740f1aa35e4d8f227fb8e17dca888cd9063e2bbb15890610dcc906049908690600401613c13565b600060405180830381600087803b158015610de657600080fd5b505af1158015610dfa573d6000803e3d6000fd5b50506040516370a0823160e01b815260009250736b3595068778dd592e39a122f4f5a5cf09c90fe291506370a0823190610e3890309060040161353e565b60206040518083038186803b158015610e5057600080fd5b505afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190613477565b90508015610ef457604051632967cf8360e21b8152600080516020613d598339815191529063a59f3e0c90610ec1908490600401613bf3565b600060405180830381600087803b158015610edb57600080fd5b505af1158015610eef573d6000803e3d6000fd5b505050505b6040516370a0823160e01b8152600090600080516020613d59833981519152906370a0823190610f2890309060040161353e565b60206040518083038186803b158015610f4057600080fd5b505afa158015610f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f789190613477565b604087018190529050610f8b8186611dea565b60208701526040860151609c54606654610fbf92600080516020613d598339815191529290916001600160a01b0316612465565b6060870152604080870151609b54609e5483516327b16a2560e21b8152935161106194600080516020613d598339815191529493926001600160a01b031691639ec5a89491600480820192602092909190829003018186803b15801561102457600080fd5b505afa158015611038573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105c919061323e565b612465565b60808701526040516370a0823160e01b8152600080516020613d59833981519152906370a082319061109790309060040161353e565b60206040518083038186803b1580156110af57600080fd5b505afa1580156110c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110e79190613477565b60a087018190526101075461111591600080516020613d59833981519152916001600160a01b031690611d8f565b61010560009054906101000a90046001600160a01b03166001600160a01b0316633d18b9126040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561116657600080fd5b505af115801561117a573d6000803e3d6000fd5b5050610106546040516370a0823160e01b8152600093506001600160a01b0390911691506370a08231906111b290309060040161353e565b60206040518083038186803b1580156111ca57600080fd5b505afa1580156111de573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112029190613477565b905061120e8185611dea565b80885215611307578651611223906002612105565b60c088018190521561130757604080516002808252606080830184529260208301908036833750506101065482519293506001600160a01b03169183915060009061126a57fe5b60200260200101906001600160a01b031690816001600160a01b031681525050732260fac5e5542a773aa44fbcfedf7c193bc2c599816001815181106112ac57fe5b6001600160a01b0392831660209182029290920101526101065460c08a01516112da929190911690836124a7565b61010654611305906001600160a01b0316732260fac5e5542a773aa44fbcfedf7c193bc2c599612562565b505b609a546040516370a0823160e01b81526000916001600160a01b0316906370a082319061133890309060040161353e565b60206040518083038186803b15801561135057600080fd5b505afa158015611364573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113889190613477565b90506113948187611dea565b6101008901819052156113af576113af886101000151612741565b7f67a619370e37f3af4f694699d1acece0d7773651ff016db8771fa0a518067941886020015189604001518a606001518b608001518c60a0015142436040516113fe9796959493929190613ca0565b60405180910390a17fbc5e584fcd12bd738c4dfc44205952a9332b1f93e57c84e1b0c82fb56b41c11988600001518960c001518a60e001518b6101000151424360405161145096959493929190613c78565b60405180910390a1437f6c8433a8e155f0af04dba058d4e4695f7da554578963d876bdf4a6d8d6399d9c89610100015160405161148d9190613bf3565b60405180910390a25095965050505050505090565b609c5481565b604080518082019091526003815262312e3160e81b602082015290565b6065546001600160a01b031681565b60335460ff1690565b610105546001600160a01b031681565b60006105cf6114fa61054d565b611502611997565b9061207a565b600054610100900460ff168061152157506115216122f8565b8061152f575060005460ff16155b61154b5760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff16158015611576576000805460ff1961ff0019909116610100171660011790555b60335460ff16156115995760405162461bcd60e51b8152600401610638906138a9565b6115a688888888886108a4565b8251609a80546001600160a01b03199081166001600160a01b039384161791829055602080870151610105805484169186169190911790556040808801516101068054851691871691909117905560608801516101078054909416908616179092558551609b55850151609c5584810151609d555163095ea7b360e01b815291169063095ea7b3906116549073c2edad668740f1aa35e4d8f227fb8e17dca888cd90600019906004016135b5565b602060405180830381600087803b15801561166e57600080fd5b505af1158015611682573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116a6919061343f565b5060405163095ea7b360e01b8152736b3595068778dd592e39a122f4f5a5cf09c90fe29063095ea7b3906116f090600080516020613d5983398151915290600019906004016135b5565b602060405180830381600087803b15801561170a57600080fd5b505af115801561171e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611742919061343f565b508015611755576000805461ff00191690555b5050505050505050565b611767612390565b606780546001600160a01b0319166001600160a01b0392909216919091179055565b600080516020613d5983398151915281565b600190565b6117a8612813565b6109d9612852565b6117b8612390565b6127108111156117da5760405162461bcd60e51b815260040161063890613a33565b609b55565b60335460009060ff16156118055760405162461bcd60e51b8152600401610638906138a9565b61180d611c65565b6118156128ab565b609a546040516370a0823160e01b81526105d2916001600160a01b0316906370a082319061184790309060040161353e565b60206040518083038186803b15801561185f57600080fd5b505afa158015611873573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108979190613477565b610107546001600160a01b031681565b6118af612390565b609f80546001600160a01b0319166001600160a01b0392909216919091179055565b609d5481565b6118df612390565b609e80546001600160a01b0319166001600160a01b0392909216919091179055565b73d9e1ce17f2641f24ae83637ab66a2cca9c378b9f81565b611921612390565b606580546001600160a01b0319166001600160a01b0392909216919091179055565b61194b612390565b61271081111561196d5760405162461bcd60e51b815260040161063890613863565b609d55565b6067546001600160a01b031681565b610106546001600160a01b031681565b61271081565b609a546040516370a0823160e01b81526000916001600160a01b0316906370a082319061057f90309060040161353e565b6119d0612390565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60335460ff1615611a155760405162461bcd60e51b8152600401610638906138a9565b611a1d612d4e565b609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611a4e90309060040161353e565b60206040518083038186803b158015611a6657600080fd5b505afa158015611a7a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9e9190613477565b90508015611aaf57611aaf81612741565b611ab76109d9565b50565b611ac2612390565b612710811115611ae45760405162461bcd60e51b8152600401610638906139a0565b60a055565b60408051600580825260c082019092526060918291906020820160a0803683375050609a5482519293506001600160a01b031691839150600090611b2957fe5b6001600160a01b03928316602091820292909201015261010554825191169082906001908110611b5557fe5b6001600160a01b03928316602091820292909201015261010654825191169082906002908110611b8157fe5b60200260200101906001600160a01b031690816001600160a01b031681525050736b3595068778dd592e39a122f4f5a5cf09c90fe281600381518110611bc357fe5b60200260200101906001600160a01b031690816001600160a01b031681525050600080516020613d5983398151915281600481518110611bff57fe5b6001600160a01b0390921660209283029190910190910152905090565b604981565b611c29612390565b612710811115611c4b5760405162461bcd60e51b815260040161063890613811565b609c55565b609e546001600160a01b031681565b60a05481565b609e546001600160a01b031633146109d95760405162461bcd60e51b815260040161063890613774565b609a546001600160a01b0382811691161415611cbd5760405162461bcd60e51b8152600401610638906138d3565b736b3595068778dd592e39a122f4f5a5cf09c90fe26001600160a01b0382161415611cfa5760405162461bcd60e51b815260040161063890613a14565b600080516020613d598339815191526001600160a01b0382161415611d315760405162461bcd60e51b81526004016106389061379c565b610105546001600160a01b0382811691161415611d605760405162461bcd60e51b8152600401610638906137f1565b610106546001600160a01b0382811691161415611ab75760405162461bcd60e51b81526004016106389061371d565b611de58363a9059cbb60e01b8484604051602401611dae9291906135b5565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612da2565b505050565b6000611e2c83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612e31565b90505b92915050565b609a546040516370a0823160e01b815260009182916001600160a01b03909116906370a0823190611e6a90309060040161353e565b60206040518083038186803b158015611e8257600080fd5b505afa158015611e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611eba9190613477565b905082811015611fa4576000611ed08483611dea565b604051630441a3e760e41b815290915073c2edad668740f1aa35e4d8f227fb8e17dca888cd9063441a3e7090611f0d906049908590600401613c13565b600060405180830381600087803b158015611f2757600080fd5b505af1158015611f3b573d6000803e3d6000fd5b505061010554604051632e1a7d4d60e01b81526001600160a01b039091169250632e1a7d4d9150611f70908490600401613bf3565b600060405180830381600087803b158015611f8a57600080fd5b505af1158015611f9e573d6000803e3d6000fd5b50505050505b609a546040516370a0823160e01b81526000916001600160a01b0316906370a0823190611fd590309060040161353e565b60206040518083038186803b158015611fed57600080fd5b505afa158015612001573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120259190613477565b905060006120338286612147565b90507f31c9c70d9d3f8c9d1c38dc84504d6e076ea17e0c2aebda9cf0610a3cdf3c3f6a8584848460405161206a9493929190613c5d565b60405180910390a1949350505050565b600082820183811015611e2c5760405162461bcd60e51b81526004016106389061373d565b6000818310156120c15760405162461bcd60e51b8152600401610638906136d0565b611e2c8383611dea565b6000826120da57506000611e2f565b828202828482816120e757fe5b0414611e2c5760405162461bcd60e51b81526004016106389061393f565b6000611e2c83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612e5d565b60008183106121565781611e2c565b5090919050565b6000609d5460001415612172575060006106eb565b600061218f612710610848609d54866120cb90919063ffffffff16565b9050611e2f609e60009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b1580156121e257600080fd5b505afa1580156121f6573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061221a919061323e565b609a546001600160a01b03169083611d8f565b609e54609a54604051632988bb9f60e21b81526000926001600160a01b039081169263a622ee7c92612265929091169060040161353e565b60206040518083038186803b15801561227d57600080fd5b505afa158015612291573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b5919061323e565b90506001600160a01b0381166122dd5760405162461bcd60e51b815260040161063890613980565b609a546122f4906001600160a01b03168284611d8f565b5050565b303b1590565b600054610100900460ff168061231757506123176122f8565b80612325575060005460ff16155b6123415760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff1615801561236c576000805460ff1961ff0019909116610100171660011790555b612374612e94565b61237c612f15565b8015611ab7576000805461ff001916905550565b6065546001600160a01b031633146109d95760405162461bcd60e51b815260040161063890613b06565b60335460ff166123dc5760405162461bcd60e51b8152600401610638906136a2565b6033805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61240f612fa1565b60405161241c919061353e565b60405180910390a1565b6067546001600160a01b031633148061244957506065546001600160a01b031633145b6109d95760405162461bcd60e51b81526004016106389061361f565b6000826124745750600061249f565b600061248661271061084887876120cb565b905061249c6001600160a01b0387168483611d8f565b90505b949350505050565b6124c68373d9e1ce17f2641f24ae83637ab66a2cca9c378b9f84612fa5565b6040516338ed173960e01b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f906338ed173990612506908590600090869030904290600401613c21565b600060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261255c91908101906133aa565b50505050565b6040516370a0823160e01b81526000906001600160a01b038416906370a082319061259190309060040161353e565b60206040518083038186803b1580156125a957600080fd5b505afa1580156125bd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125e19190613477565b90506000826001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401612611919061353e565b60206040518083038186803b15801561262957600080fd5b505afa15801561263d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126619190613477565b90506126828473d9e1ce17f2641f24ae83637ab66a2cca9c378b9f84612fa5565b6126a18373d9e1ce17f2641f24ae83637ab66a2cca9c378b9f83612fa5565b60405162e8e33760e81b815273d9e1ce17f2641f24ae83637ab66a2cca9c378b9f9063e8e33700906126e690879087908790879060009081903090429060040161356c565b606060405180830381600087803b15801561270057600080fd5b505af1158015612714573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273891906134b2565b50505050505050565b604051631c57762b60e31b815273c2edad668740f1aa35e4d8f227fb8e17dca888cd9063e2bbb1589061277b906049908590600401613c13565b600060405180830381600087803b15801561279557600080fd5b505af11580156127a9573d6000803e3d6000fd5b50506101055460405163534a7e1d60e11b81526001600160a01b03909116925063a694fc3a91506127de908490600401613bf3565b600060405180830381600087803b1580156127f857600080fd5b505af115801561280c573d6000803e3d6000fd5b5050505050565b609f546001600160a01b031633148061283657506065546001600160a01b031633145b6109d95760405162461bcd60e51b8152600401610638906139ef565b60335460ff16156128755760405162461bcd60e51b8152600401610638906138a9565b6033805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861240f612fa1565b6040516393f1a40b60e01b815260009073c2edad668740f1aa35e4d8f227fb8e17dca888cd906393f1a40b906128e8906049903090600401613bfc565b604080518083038186803b1580156128ff57600080fd5b505afa158015612913573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612937919061348f565b50604051630441a3e760e41b815290915073c2edad668740f1aa35e4d8f227fb8e17dca888cd9063441a3e7090612975906049908590600401613c13565b600060405180830381600087803b15801561298f57600080fd5b505af11580156129a3573d6000803e3d6000fd5b50506040516370a0823160e01b815260009250600080516020613d5983398151915291506370a08231906129db90309060040161353e565b60206040518083038186803b1580156129f357600080fd5b505afa158015612a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a2b9190613477565b6040516367dfd4c960e01b8152909150600080516020613d59833981519152906367dfd4c990612a5f908490600401613bf3565b600060405180830381600087803b158015612a7957600080fd5b505af1158015612a8d573d6000803e3d6000fd5b50506040516370a0823160e01b815260009250736b3595068778dd592e39a122f4f5a5cf09c90fe291506370a0823190612acb90309060040161353e565b60206040518083038186803b158015612ae357600080fd5b505afa158015612af7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b1b9190613477565b9050612bc2609e60009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b158015612b6e57600080fd5b505afa158015612b82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ba6919061323e565b736b3595068778dd592e39a122f4f5a5cf09c90fe29083611d8f565b61010560009054906101000a90046001600160a01b03166001600160a01b031663e9fad8ee6040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612c1357600080fd5b505af1158015612c27573d6000803e3d6000fd5b5050610106546040516370a0823160e01b8152600093506001600160a01b0390911691506370a0823190612c5f90309060040161353e565b60206040518083038186803b158015612c7757600080fd5b505afa158015612c8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612caf9190613477565b905061255c609e60009054906101000a90046001600160a01b03166001600160a01b0316639ec5a8946040518163ffffffff1660e01b815260040160206040518083038186803b158015612d0257600080fd5b505afa158015612d16573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612d3a919061323e565b610106546001600160a01b03169083611d8f565b6067546001600160a01b0316331480612d7157506065546001600160a01b031633145b80612d865750609e546001600160a01b031633145b6109d95760405162461bcd60e51b8152600401610638906137bc565b6060612df7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612fce9092919063ffffffff16565b805190915015611de55780806020019051810190612e15919061343f565b611de55760405162461bcd60e51b815260040161063890613abc565b60008184841115612e555760405162461bcd60e51b815260040161063891906135ec565b505050900390565b60008183612e7e5760405162461bcd60e51b815260040161063891906135ec565b506000838581612e8a57fe5b0495945050505050565b600054610100900460ff1680612ead5750612ead6122f8565b80612ebb575060005460ff16155b612ed75760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff1615801561237c576000805460ff1961ff0019909116610100171660011790558015611ab7576000805461ff001916905550565b600054610100900460ff1680612f2e5750612f2e6122f8565b80612f3c575060005460ff16155b612f585760405162461bcd60e51b8152600401610638906138f1565b600054610100900460ff16158015612f83576000805460ff1961ff0019909116610100171660011790555b6033805460ff191690558015611ab7576000805461ff001916905550565b3390565b612fba6001600160a01b038416836000612fdd565b611de56001600160a01b0384168383612fdd565b606061249f84846000856130a0565b8015806130655750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e906130139030908690600401613552565b60206040518083038186803b15801561302b57600080fd5b505afa15801561303f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130639190613477565b155b6130815760405162461bcd60e51b815260040161063890613b2e565b611de58363095ea7b360e01b8484604051602401611dae9291906135b5565b60606130ab85613164565b6130c75760405162461bcd60e51b815260040161063890613a85565b60006060866001600160a01b031685876040516130e49190613522565b60006040518083038185875af1925050503d8060008114613121576040519150601f19603f3d011682016040523d82523d6000602084013e613126565b606091505b5091509150811561313a57915061249f9050565b80511561314a5780518082602001fd5b8360405162461bcd60e51b815260040161063891906135ec565b3b151590565b6040518060200160405280600081525090565b6040518061012001604052806000815260200160008152602001600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b600082601f8301126131d9578081fd5b6131e36060613cd0565b90508082846060850111156131f757600080fd5b60005b60038110156132195781358352602092830192909101906001016131fa565b50505092915050565b600060208284031215613233578081fd5b8135611e2c81613d43565b60006020828403121561324f578081fd5b8151611e2c81613d43565b600080600080600060a08688031215613271578081fd5b853561327c81613d43565b9450602086013561328c81613d43565b9350604086013561329c81613d43565b925060608601356132ac81613d43565b915060808601356132bc81613d43565b809150509295509295909350565b6000806000806000806000610180888a0312156132e5578182fd5b87356132f081613d43565b965060208881013561330181613d43565b9650604089013561331181613d43565b9550606089013561332181613d43565b9450608089013561333181613d43565b935060bf89018a13613341578283fd5b61334b6080613cd0565b8060a08b016101208c018d811115613361578687fd5b865b600481101561338957823561337781613d43565b85529385019391850191600101613363565b508296506133978e826131c9565b9550505050505092959891949750929550565b600060208083850312156133bc578182fd5b825167ffffffffffffffff8111156133d2578283fd5b8301601f810185136133e2578283fd5b80516133f56133f082613cf7565b613cd0565b8181528381019083850185840285018601891015613411578687fd5b8694505b83851015613433578051835260019490940193918501918501613415565b50979650505050505050565b600060208284031215613450578081fd5b81518015158114611e2c578182fd5b600060208284031215613470578081fd5b5035919050565b600060208284031215613488578081fd5b5051919050565b600080604083850312156134a1578182fd5b505080516020909101519092909150565b6000806000606084860312156134c6578283fd5b8351925060208401519150604084015190509250925092565b6000815180845260208085019450808401835b838110156135175781516001600160a01b0316875295820195908201906001016134f2565b509495945050505050565b60008251613534818460208701613d17565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b6001600160a01b03929092168252602082015260400190565b600060208252611e2c60208301846134df565b901515815260200190565b600060208252825180602084015261360b816040850160208701613d17565b601f01601f19169190910160400192915050565b6020808252601490820152736f6e6c79417574686f72697a65644163746f727360601b604082015260600190565b60208082526035908201527f626173652d73747261746567792f77697468647261772d6578636565642d6d616040820152741e0b59195d9a585d1a5bdb8b5d1a1c995cda1bdb19605a1b606082015260800190565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b6020808252602d908201527f646966662f65787065637465642d6869676865722d6e756d6265722d696e2d6660408201526c34b939ba16b837b9b4ba34b7b760991b606082015260800190565b6020808252600690820152653130b233b2b960d11b604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252600e908201526d37b7363ca1b7b73a3937b63632b960911b604082015260600190565b60208082526006908201526578737573686960d01b604082015260600190565b6020808252818101527f6f6e6c79417574686f72697a65644163746f72734f72436f6e74726f6c6c6572604082015260600190565b60208082526006908201526533b2bcb9b2b960d11b604082015260600190565b60208082526032908201527f626173652d73747261746567792f6578636573736976652d737472617465676960408201527173742d706572666f726d616e63652d66656560701b606082015260800190565b60208082526026908201527f626173652d73747261746567792f6578636573736976652d7769746864726177604082015265616c2d66656560d01b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b6020808252600490820152631dd85b9d60e21b604082015260600190565b6020808252602e908201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160408201526d191e481a5b9a5d1a585b1a5e995960921b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260069082015265085d985d5b1d60d21b604082015260600190565b6020808252602f908201527f626173652d73747261746567792f6578636573736976652d6d61782d6465766960408201526e185d1a5bdb8b5d1a1c995cda1bdb19608a1b606082015260800190565b6020808252600b908201526a6f6e6c795061757365727360a81b604082015260600190565b602080825260059082015264737573686960d81b604082015260600190565b60208082526032908201527f626173652d73747261746567792f6578636573736976652d676f7665726e616e60408201527163652d706572666f726d616e63652d66656560701b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252600e908201526d6f6e6c79476f7665726e616e636560901b604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b600061012082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525092915050565b9051815260200190565b90815260200190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b600086825285602083015260a06040830152613c4060a08301866134df565b6001600160a01b0394909416606083015250608001529392505050565b93845260208401929092526040830152606082015260800190565b958652602086019490945260408501929092526060840152608083015260a082015260c00190565b968752602087019590955260408601939093526060850191909152608084015260a083015260c082015260e00190565b60405181810167ffffffffffffffff81118282101715613cef57600080fd5b604052919050565b600067ffffffffffffffff821115613d0d578081fd5b5060209081020190565b60005b83811015613d32578181015183820152602001613d1a565b8381111561255c5750506000910152565b6001600160a01b0381168114611ab757600080fdfe0000000000000000000000008798249c2e607446efb7ad49ec89dd1865ff4272a26469706673582212201039b6af8be11ed11705350bf4b2b95fe70efcb0de2683cc5e061485d905469e64736f6c634300060c0033
Deployed Bytecode Sourcemap
54667:11705:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55045:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57546:275;;;:::i;:::-;;;;;;;:::i;36427:39::-;;;:::i;57421:117::-;;;:::i;:::-;;;;;;;:::i;42600:317::-;;;;;;:::i;:::-;;:::i;36347:19::-;;;:::i;55241:73::-;;;:::i;32099:25::-;;;:::i;36602:76::-;;;:::i;40898:1575::-;;;;;;:::i;:::-;;:::i;:::-;;36821:461;;;;;;:::i;:::-;;:::i;54951:73::-;;;:::i;43093:85::-;;;:::i;61906:586::-;;;:::i;:::-;;;;;;;:::i;36734:23::-;;;:::i;62703:3666::-;;;:::i;:::-;;;;;;;:::i;36473:39::-;;;:::i;57325:88::-;;;:::i;32067:25::-;;;:::i;30553:78::-;;;:::i;:::-;;;;;;;:::i;54879:21::-;;;:::i;38262:121::-;;;:::i;56422:859::-;;;;;;:::i;:::-;;:::i;33009:108::-;;;;;;:::i;:::-;;:::i;55141:75::-;;;:::i;58207:88::-;;;:::i;42997:::-;;;:::i;39196:290::-;;;;;;:::i;:::-;;:::i;40329:222::-;;;:::i;55409:25::-;;;:::i;38543:116::-;;;;;;:::i;:::-;;:::i;36519:28::-;;;:::i;39494:124::-;;;;;;:::i;:::-;;:::i;50024:78::-;;;:::i;33226:122::-;;;;;;:::i;:::-;;:::i;38667:223::-;;;;;;:::i;:::-;;:::i;32131:21::-;;;:::i;54907:::-;;;:::i;36556:39::-;;;:::i;38006:129::-;;;:::i;32780:124::-;;;;;;:::i;:::-;;:::i;39890:269::-;;;:::i;39626:256::-;;;;;;:::i;:::-;;:::i;57829:370::-;;;:::i;:::-;;;;;;;:::i;55348:32::-;;;:::i;38898:290::-;;;;;;:::i;:::-;;:::i;36702:25::-;;;:::i;36766:46::-;;;:::i;55045:74::-;55077:42;55045:74;:::o;57546:275::-;57781:6;;57755:58;;-1:-1:-1;;;57755:58:0;;57601:7;;-1:-1:-1;;;;;57781:6:0;;57755:43;;:58;;57807:4;;57755:58;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;57748:65;;57546:275;;:::o;36427:39::-;;;;:::o;57421:117::-;57498:32;;;;;;;;;;;;;;;;;57421:117;:::o;42600:317::-;30871:7;;42679:15;;30871:7;;30870:8;30862:37;;;;-1:-1:-1;;;30862:37:0;;;;;;;:::i;:::-;;;;;;;;;42707:17:::1;:15;:17::i;:::-;42735:31;42759:6;42735:23;:31::i;:::-;42789:50;::::0;-1:-1:-1;;;42789:50:0;;-1:-1:-1;;;;;42789:35:0;::::1;::::0;::::1;::::0;:50:::1;::::0;42833:4:::1;::::0;42789:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42889:10;::::0;42779:60;;-1:-1:-1;42850:59:0::1;::::0;-1:-1:-1;;;;;42850:38:0;;::::1;::::0;42889:10:::1;42779:60:::0;42850:38:::1;:59::i;:::-;42600:317:::0;;;:::o;36347:19::-;;;-1:-1:-1;;;;;36347:19:0;;:::o;55241:73::-;55272:42;55241:73;:::o;32099:25::-;;;-1:-1:-1;;;;;32099:25:0;;:::o;36602:76::-;36636:42;36602:76;:::o;40898:1575::-;30871:7;;;;30870:8;30862:37;;;;-1:-1:-1;;;30862:37:0;;;;;;;:::i;:::-;40975:17:::1;:15;:17::i;:::-;41042:4;::::0;41024:48:::1;::::0;-1:-1:-1;;;41024:48:0;;41005:16:::1;::::0;-1:-1:-1;;;;;41042:4:0::1;::::0;41024:33:::1;::::0;:48:::1;::::0;41066:4:::1;::::0;41024:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41005:67:::0;-1:-1:-1;41085:18:0::1;41005:67:::0;41260:18;;::::1;41256:843;;;41308:36;41322:21;:7:::0;41334:8;41322:11:::1;:21::i;:::-;41308:13;:36::i;:::-;41295:49:::0;-1:-1:-1;41375:24:0::1;41295:49:::0;41390:8;41375:14:::1;:24::i;:::-;41359:40;;41660:7;41644:13;:23;41640:448;;;41688:12;41703:29;41709:7;41718:13;41703:5;:29::i;:::-;41688:44;;41918:57;36590:5;41918:44;41930:31;;41918:7;:11;;:44;;;;:::i;:::-;:48:::0;::::1;:57::i;:::-;41910:4;:65;;41880:192;;;;-1:-1:-1::0;;;41880:192:0::1;;;;;;;:::i;:::-;41640:448;;42190:19;42212:43;42232:13;42247:7;42212:19;:43::i;:::-;42190:65;;42303:12;42318:34;42340:11;42318:21;:34::i;:::-;42303:49:::0;-1:-1:-1;42426:39:0::1;42443:21;:11:::0;42303:49;42443:15:::1;:21::i;:::-;42426:16;:39::i;:::-;30910:1;;;;;40898:1575:::0;:::o;36821:461::-;26514:13;;;;;;;;:33;;;26531:16;:14;:16::i;:::-;26514:50;;;-1:-1:-1;26552:12:0;;;;26551:13;26514:50;26506:109;;;;-1:-1:-1;;;26506:109:0;;;;;;;:::i;:::-;26628:19;26651:13;;;;;;26650:14;26675:101;;;;26710:13;:20;;-1:-1:-1;;;;26710:20:0;;;;;26745:19;26726:4;26745:19;;;26675:101;30871:7:::1;::::0;::::1;;30870:8;30862:37;;;;-1:-1:-1::0;;;30862:37:0::1;;;;;;;:::i;:::-;37045:17:::2;:15;:17::i;:::-;37073:10;:24:::0;;-1:-1:-1;;;;;;37073:24:0;;::::2;-1:-1:-1::0;;;;;37073:24:0;;::::2;::::0;;;::::2;::::0;;;37108:10:::2;:24:::0;;;::::2;::::0;;::::2;;::::0;;37143:6:::2;:16:::0;;;::::2;::::0;;::::2;;::::0;;37170:10:::2;:24:::0;;;::::2;::::0;;::::2;;::::0;;37205:8:::2;:20:::0;;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;37270:2:::2;37236:31;:36:::0;26802:68;;;;26853:5;26837:21;;-1:-1:-1;;26837:21:0;;;36821:461;;;;;;:::o;54951:73::-;54982:42;54951:73;:::o;43093:85::-;43132:17;:15;:17::i;:::-;43160:10;:8;:10::i;:::-;43093:85::o;61906:586::-;61954:15;;:::i;:::-;30871:7;;;;30870:8;30862:37;;;;-1:-1:-1;;;30862:37:0;;;;;;;:::i;:::-;61982:23:::1;:21;:23::i;:::-;62018:24;;:::i;:::-;62115:32;::::0;-1:-1:-1;;;62115:32:0;;55272:42:::1;::::0;62115:24:::1;::::0;:32:::1;::::0;55378:2:::1;::::0;62145:1:::1;::::0;62115:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;62183:49:0::1;::::0;-1:-1:-1;;;62183:49:0;;55077:42:::1;::::0;-1:-1:-1;62183:34:0::1;::::0;-1:-1:-1;62183:49:0::1;::::0;62226:4:::1;::::0;62183:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62160:72:::0;;;62319:24;62315:100:::1;;62382:20:::0;;62360:43:::1;::::0;-1:-1:-1;;;62360:43:0;;-1:-1:-1;;;;;;;;;;;55174:42:0;62360:21:::1;::::0;:43:::1;::::0;62382:20;62360:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;62315:100;62437:20:::0;;62432:26:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;;;;;;;;62476:8:::0;-1:-1:-1;61906:586:0;:::o;36734:23::-;;;-1:-1:-1;;;;;36734:23:0;;:::o;62703:3666::-;62754:18;;:::i;:::-;30871:7;;;;30870:8;30862:37;;;;-1:-1:-1;;;30862:37:0;;;;;;;:::i;:::-;62785:23:::1;:21;:23::i;:::-;62821:30;;:::i;:::-;62888:50;::::0;-1:-1:-1;;;62888:50:0;;62864:21:::1;::::0;-1:-1:-1;;;;;;;;;;;55174:42:0;62888:35:::1;::::0;:50:::1;::::0;62932:4:::1;::::0;62888:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62987:4;::::0;62969:48:::1;::::0;-1:-1:-1;;;62969:48:0;;62864:74;;-1:-1:-1;62949:17:0::1;::::0;-1:-1:-1;;;;;62987:4:0;;::::1;::::0;62969:33:::1;::::0;:48:::1;::::0;63011:4:::1;::::0;62969:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63072:6;::::0;63054:50:::1;::::0;-1:-1:-1;;;63054:50:0;;62949:68;;-1:-1:-1;63030:21:0::1;::::0;-1:-1:-1;;;;;63072:6:0;;::::1;::::0;63054:35:::1;::::0;:50:::1;::::0;63098:4:::1;::::0;63054:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63284:40;::::0;-1:-1:-1;;;63284:40:0;;63030:74;;-1:-1:-1;55272:42:0::1;::::0;63284:24:::1;::::0;:40:::1;::::0;55378:2:::1;::::0;63314:9;;63284:40:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;63392:49:0::1;::::0;-1:-1:-1;;;63392:49:0;;63375:14:::1;::::0;-1:-1:-1;55077:42:0::1;::::0;-1:-1:-1;63392:34:0::1;::::0;:49:::1;::::0;63435:4:::1;::::0;63392:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63375:66:::0;-1:-1:-1;63458:10:0;;63454:72:::1;;63485:29;::::0;-1:-1:-1;;;63485:29:0;;-1:-1:-1;;;;;;;;;;;55174:42:0;63485:21:::1;::::0;:29:::1;::::0;63507:6;;63485:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;63454:72;63556:50;::::0;-1:-1:-1;;;63556:50:0;;63538:15:::1;::::0;-1:-1:-1;;;;;;;;;;;55174:42:0;63556:35:::1;::::0;:50:::1;::::0;63600:4:::1;::::0;63556:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;63651:23;::::0;::::1;:33:::0;;;63538:68;-1:-1:-1;63781:26:0::1;63538:68:::0;63793:13;63781:11:::1;:26::i;:::-;63751:27;::::0;::::1;:56:::0;63942:23:::1;::::0;::::1;::::0;63967:24:::1;::::0;63993:10:::1;::::0;63922:82:::1;::::0;-1:-1:-1;;;;;;;;;;;55174:42:0;63942:23;;-1:-1:-1;;;;;63993:10:0::1;63922:11;:82::i;:::-;63895:24;::::0;::::1;:109:::0;64062:23:::1;::::0;;::::1;::::0;64087:24:::1;::::0;64125:10:::1;::::0;64113:33;;-1:-1:-1;;;64113:33:0;;;;64042:105:::1;::::0;-1:-1:-1;;;;;;;;;;;55174:42:0;64062:23;64087:24;-1:-1:-1;;;;;64125:10:0::1;::::0;64113:31:::1;::::0;:33:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;64125:10;64113:33;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64042:11;:105::i;:::-;64015:24;::::0;::::1;:132:::0;64295:50:::1;::::0;-1:-1:-1;;;64295:50:0;;-1:-1:-1;;;;;;;;;;;55174:42:0;64295:35:::1;::::0;:50:::1;::::0;64339:4:::1;::::0;64295:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64268:24;::::0;::::1;:77:::0;;;64395:10:::1;::::0;64356:76:::1;::::0;-1:-1:-1;;;;;;;;;;;55174:42:0;-1:-1:-1;;;;;64395:10:0::1;::::0;64356:38:::1;:76::i;:::-;64566:6;;;;;;;;;-1:-1:-1::0;;;;;64566:6:0::1;-1:-1:-1::0;;;;;64540:43:0::1;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;64639:6:0::1;::::0;64621:50:::1;::::0;-1:-1:-1;;;64621:50:0;;64598:20:::1;::::0;-1:-1:-1;;;;;;64639:6:0;;::::1;::::0;-1:-1:-1;64621:35:0::1;::::0;:50:::1;::::0;64665:4:::1;::::0;64621:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;64598:73:::0;-1:-1:-1;64712:31:0::1;64598:73:::0;64729:13;64712:16:::1;:31::i;:::-;64682:61:::0;;;64831:31;64827:559:::1;;64915:27:::0;;:34:::1;::::0;64947:1:::1;64915:31;:34::i;:::-;64879:33;::::0;::::1;:70:::0;;;64968:37;64964:411:::1;;65050:16;::::0;;65064:1:::1;65050:16:::0;;;65026:21:::1;65050:16:::0;;::::1;::::0;;65026:21;65050:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;65095:6:0::1;::::0;65085:7;;;;-1:-1:-1;;;;;;65095:6:0::1;::::0;65085:7;;-1:-1:-1;65095:6:0::1;::::0;65085:7:::1;;;;;;;;;:16;-1:-1:-1::0;;;;;65085:16:0::1;;;-1:-1:-1::0;;;;;65085:16:0::1;;;::::0;::::1;54982:42;65130:4;65135:1;65130:7;;;;;;;;-1:-1:-1::0;;;;;65130:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;65181:6:::1;::::0;65189:33:::1;::::0;::::1;::::0;65165:64:::1;::::0;65181:6;;;::::1;::::0;65224:4;65165:15:::1;:64::i;:::-;65346:6;::::0;65317:42:::1;::::0;-1:-1:-1;;;;;65346:6:0::1;54982:42;65317:28;:42::i;:::-;64964:411;;65514:4;::::0;65496:48:::1;::::0;-1:-1:-1;;;65496:48:0;;65477:16:::1;::::0;-1:-1:-1;;;;;65514:4:0::1;::::0;65496:33:::1;::::0;:48:::1;::::0;65538:4:::1;::::0;65496:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;65477:67:::0;-1:-1:-1;65578:23:0::1;65477:67:::0;65591:9;65578:12:::1;:23::i;:::-;65555:20;::::0;::::1;:46:::0;;;65618:24;65614:87:::1;;65659:30;65668:11;:20;;;65659:8;:30::i;:::-;65718:277;65745:11;:27;;;65787:11;:23;;;65825:11;:24;;;65864:11;:24;;;65903:11;:24;;;65942:15;65972:12;65718:277;;;;;;;;;;;;:::i;:::-;;;;;;;;66013:256;66046:11;:27;;;66088:11;:33;;;66136:11;:30;;;66181:11;:20;;;66216:15;66246:12;66013:256;;;;;;;;;;;:::i;:::-;;;;;;;;66317:12;66287:43;66295:11;:20;;;66287:43;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;66350:11:0;;-1:-1:-1;;;;;;;62703:3666:0;:::o;36473:39::-;;;;:::o;57325:88::-;57393:12;;;;;;;;;;;;-1:-1:-1;;;57393:12:0;;;;57325:88;:::o;32067:25::-;;;-1:-1:-1;;;;;32067:25:0;;:::o;30553:78::-;30616:7;;;;30553:78;:::o;54879:21::-;;;-1:-1:-1;;;;;54879:21:0;;:::o;38262:121::-;38312:7;38339:36;38359:15;:13;:15::i;:::-;38339;:13;:15::i;:::-;:19;;:36::i;56422:859::-;26514:13;;;;;;;;:33;;;26531:16;:14;:16::i;:::-;26514:50;;;-1:-1:-1;26552:12:0;;;;26551:13;26514:50;26506:109;;;;-1:-1:-1;;;26506:109:0;;;;;;;:::i;:::-;26628:19;26651:13;;;;;;26650:14;26675:101;;;;26710:13;:20;;-1:-1:-1;;;;26710:20:0;;;;;26745:19;26726:4;26745:19;;;26675:101;30871:7:::1;::::0;::::1;;30870:8;30862:37;;;;-1:-1:-1::0;;;30862:37:0::1;;;;;;;:::i;:::-;56716:78:::2;56736:11;56749;56762;56775:7;56784:9;56716:19;:78::i;:::-;56814:14:::0;;56807:4:::2;:21:::0;;-1:-1:-1;;;;;;56807:21:0;;::::2;-1:-1:-1::0;;;;;56807:21:0;;::::2;;::::0;;;;56814:14:::2;56848::::0;;::::2;::::0;56839:6:::2;:23:::0;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;56882:14;;;::::2;::::0;56873:6:::2;:23:::0;;;::::2;::::0;;::::2;::::0;;;::::2;::::0;;56920:14;;::::2;::::0;56907:10:::2;:27:::0;;;;::::2;::::0;;::::2;;::::0;;;56974:13;;56947:24:::2;:40:::0;57025:13;::::2;::::0;56998:24:::2;:40:::0;57065:13;;::::2;::::0;57049::::2;:29:::0;57159:50;-1:-1:-1;;;57159:50:0;;57177:4;::::2;::::0;57159:31:::2;::::0;:50:::2;::::0;55272:42:::2;::::0;-1:-1:-1;;;57159:50:0::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;57220:53:0::2;::::0;-1:-1:-1;;;57220:53:0;;55077:42:::2;::::0;57220:32:::2;::::0;:53:::2;::::0;-1:-1:-1;;;;;;;;;;;55174:42:0;-1:-1:-1;;57269:2:0;57220:53:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26806:14:::0;26802:68;;;26853:5;26837:21;;-1:-1:-1;;26837:21:0;;;26802:68;56422:859;;;;;;;;:::o;33009:108::-;33065:17;:15;:17::i;:::-;33093:6;:16;;-1:-1:-1;;;;;;33093:16:0;-1:-1:-1;;;;;33093:16:0;;;;;;;;;;33009:108::o;55141:75::-;-1:-1:-1;;;;;;;;;;;55141:75:0;:::o;58207:88::-;58283:4;58207:88;:::o;42997:::-;43034:24;:22;:24::i;:::-;43069:8;:6;:8::i;39196:290::-;39288:17;:15;:17::i;:::-;36590:5;39324:25;:36;;39316:99;;;;-1:-1:-1;;;39316:99:0;;;;;;;:::i;:::-;39426:24;:52;39196:290::o;40329:222::-;30871:7;;40392:15;;30871:7;;30870:8;30862:37;;;;-1:-1:-1;;;30862:37:0;;;;;;;:::i;:::-;40420:17:::1;:15;:17::i;:::-;40450:14;:12;:14::i;:::-;40512:4;::::0;40494:48:::1;::::0;-1:-1:-1;;;40494:48:0;;40477:66:::1;::::0;-1:-1:-1;;;;;40512:4:0::1;::::0;40494:33:::1;::::0;:48:::1;::::0;40536:4:::1;::::0;40494:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;55409:25::-:0;;;-1:-1:-1;;;;;55409:25:0;;:::o;38543:116::-;38603:17;:15;:17::i;:::-;38631:8;:20;;-1:-1:-1;;;;;;38631:20:0;-1:-1:-1;;;;;38631:20:0;;;;;;;;;;38543:116::o;36519:28::-;;;;:::o;39494:124::-;39558:17;:15;:17::i;:::-;39586:10;:24;;-1:-1:-1;;;;;;39586:24:0;-1:-1:-1;;;;;39586:24:0;;;;;;;;;;39494:124::o;50024:78::-;50060:42;50024:78;:::o;33226:122::-;33288:17;:15;:17::i;:::-;33316:10;:24;;-1:-1:-1;;;;;;33316:24:0;-1:-1:-1;;;;;33316:24:0;;;;;;;;;;33226:122::o;38667:223::-;38737:17;:15;:17::i;:::-;36590:5;38773:14;:25;;38765:76;;;;-1:-1:-1;;;38765:76:0;;;;;;;:::i;:::-;38852:13;:30;38667:223::o;32131:21::-;;;-1:-1:-1;;;;;32131:21:0;;:::o;54907:::-;;;-1:-1:-1;;;;;54907:21:0;;:::o;36556:39::-;36590:5;36556:39;:::o;38006:129::-;38097:4;;38079:48;;-1:-1:-1;;;38079:48:0;;38052:7;;-1:-1:-1;;;;;38097:4:0;;38079:33;;:48;;38121:4;;38079:48;;;:::i;32780:124::-;32844:17;:15;:17::i;:::-;32872:10;:24;;-1:-1:-1;;;;;;32872:24:0;-1:-1:-1;;;;;32872:24:0;;;;;;;;;;32780:124::o;39890:269::-;30871:7;;;;30870:8;30862:37;;;;-1:-1:-1;;;30862:37:0;;;;;;;:::i;:::-;39949:35:::1;:33;:35::i;:::-;40029:4;::::0;40011:48:::1;::::0;-1:-1:-1;;;40011:48:0;;39995:13:::1;::::0;-1:-1:-1;;;;;40029:4:0::1;::::0;40011:33:::1;::::0;:48:::1;::::0;40053:4:::1;::::0;40011:48:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39995:64:::0;-1:-1:-1;40074:9:0;;40070:57:::1;;40100:15;40109:5;40100:8;:15::i;:::-;40137:14;:12;:14::i;:::-;30910:1;39890:269::o:0;39626:256::-;39710:17;:15;:17::i;:::-;36590:5;39746:10;:21;;39738:81;;;;-1:-1:-1;;;39738:81:0;;;;;;;:::i;:::-;39830:31;:44;39626:256::o;57829:370::-;57955:16;;;57969:1;57955:16;;;;;;;;;57891;;;;57955;;;;;;;;;-1:-1:-1;;58003:4:0;;57982:18;;;;-1:-1:-1;;;;;;58003:4:0;;57982:18;;-1:-1:-1;58003:4:0;;57982:18;;;;-1:-1:-1;;;;;57982:25:0;;;:18;;;;;;;;;:25;58039:6;;58018:18;;58039:6;;;58018:15;;58039:6;;58018:18;;;;;;-1:-1:-1;;;;;58018:27:0;;;:18;;;;;;;;;:27;58077:6;;58056:18;;58077:6;;;58056:15;;58072:1;;58056:18;;;;;;;;;;;:27;-1:-1:-1;;;;;58056:27:0;;;-1:-1:-1;;;;;58056:27:0;;;;;55077:42;58094:15;58110:1;58094:18;;;;;;;;;;;;;:26;-1:-1:-1;;;;;58094:26:0;;;-1:-1:-1;;;;;58094:26:0;;;;;-1:-1:-1;;;;;;;;;;;58131:15:0;58147:1;58131:18;;;;;;;;-1:-1:-1;;;;;58131:27:0;;;:18;;;;;;;;;;;:27;58176:15;-1:-1:-1;57829:370:0;:::o;55348:32::-;55378:2;55348:32;:::o;38898:290::-;38990:17;:15;:17::i;:::-;36590:5;39026:25;:36;;39018:99;;;;-1:-1:-1;;;39018:99:0;;;;;;;:::i;:::-;39128:24;:52;38898:290::o;36702:25::-;;;-1:-1:-1;;;;;36702:25:0;;:::o;36766:46::-;;;;:::o;37322:111::-;37396:10;;-1:-1:-1;;;;;37396:10:0;37382;:24;37374:51;;;;-1:-1:-1;;;37374:51:0;;;;;;;:::i;58356:346::-;58450:4;;-1:-1:-1;;;;;58442:23:0;;;58450:4;;58442:23;;58434:40;;;;-1:-1:-1;;;58434:40:0;;;;;;;:::i;:::-;55077:42;-1:-1:-1;;;;;58493:24:0;;;;58485:42;;;;-1:-1:-1;;;58485:42:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;;;;;;;;;;;58546:25:0;;;;58538:44;;;;-1:-1:-1;;;58538:44:0;;;;;;;:::i;:::-;58611:6;;-1:-1:-1;;;;;58603:25:0;;;58611:6;;58603:25;;58595:44;;;;-1:-1:-1;;;58595:44:0;;;;;;;:::i;:::-;58666:6;;-1:-1:-1;;;;;58658:25:0;;;58666:6;;58658:25;;58650:44;;;;-1:-1:-1;;;58650:44:0;;;;;;;:::i;15637:188::-;15731:86;15751:5;15781:23;;;15806:2;15810:5;15758:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;15758:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;15758:58:0;-1:-1:-1;;;;;;15758:58:0;;;;;;;;;;15731:19;:86::i;:::-;15637:188;;;:::o;4394:136::-;4452:7;4479:43;4483:1;4486;4479:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4472:50;;4394:136;;;;;:::o;60549:1096::-;60715:4;;60697:48;;-1:-1:-1;;;60697:48:0;;60616:7;;;;-1:-1:-1;;;;;60715:4:0;;;;60697:33;;:48;;60739:4;;60697:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60678:67;;60869:7;60858:8;:18;60854:399;;;60893:19;60915:21;:7;60927:8;60915:11;:21::i;:::-;60953:43;;-1:-1:-1;;;60953:43:0;;60893;;-1:-1:-1;55272:42:0;;60953:25;;:43;;55378:2;;60893:43;;60953;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;61101:6:0;;61075:55;;-1:-1:-1;;;61075:55:0;;-1:-1:-1;;;;;61101:6:0;;;;-1:-1:-1;61075:42:0;;-1:-1:-1;61075:55:0;;61118:11;;61075:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60854:399;;61361:4;;61343:48;;-1:-1:-1;;;61343:48:0;;61323:17;;-1:-1:-1;;;;;61361:4:0;;61343:33;;:48;;61385:4;;61343:48;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;61323:68;;61474:18;61495:39;61515:9;61526:7;61495:19;:39::i;:::-;61474:60;;61552:55;61566:7;61575:8;61585:9;61596:10;61552:55;;;;;;;;;:::i;:::-;;;;;;;;61627:10;60549:1096;-1:-1:-1;;;;60549:1096:0:o;3930:181::-;3988:7;4020:5;;;4044:6;;;;4036:46;;;;-1:-1:-1;;;4036:46:0;;;;;;;:::i;46560:178::-;46620:7;46653:1;46648;:6;;46640:64;;;;-1:-1:-1;;;46640:64:0;;;;;;;:::i;:::-;46722:8;:1;46728;46722:5;:8::i;5284:471::-;5342:7;5587:6;5583:47;;-1:-1:-1;5617:1:0;5610:8;;5583:47;5654:5;;;5658:1;5654;:5;:1;5678:5;;;;;:10;5670:56;;;;-1:-1:-1;;;5670:56:0;;;;;;;:::i;6231:132::-;6289:7;6316:39;6320:1;6323;6316:39;;;;;;;;;;;;;;;;;:3;:39::i;33901:106::-;33959:7;33990:1;33986;:5;:13;;33998:1;33986:13;;;-1:-1:-1;33994:1:0;;33901:106;-1:-1:-1;33901:106:0:o;43415:326::-;43481:7;43505:13;;43522:1;43505:18;43501:59;;;-1:-1:-1;43547:1:0;43540:8;;43501:59;43572:11;43586:39;36590:5;43586:26;43598:13;;43586:7;:11;;:26;;;;:::i;:39::-;43572:53;;43636:76;43685:10;;;;;;;;;-1:-1:-1;;;;;43685:10:0;-1:-1:-1;;;;;43673:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43654:4;;-1:-1:-1;;;;;43654:4:0;;43708:3;43636:36;:76::i;44659:299::-;44751:10;;44778:4;;44739:45;;-1:-1:-1;;;44739:45:0;;44722:14;;-1:-1:-1;;;;;44751:10:0;;;;44739:30;;:45;;44778:4;;;;44739:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44722:62;-1:-1:-1;;;;;;44803:20:0;;44795:39;;;;-1:-1:-1;;;44795:39:0;;;;;;;:::i;:::-;44915:4;;44897:53;;-1:-1:-1;;;;;44915:4:0;44934:6;44942:7;44897:36;:53::i;:::-;44659:299;;:::o;26970:604::-;27412:4;27523:17;27559:7;26970:604;:::o;30222:131::-;26514:13;;;;;;;;:33;;;26531:16;:14;:16::i;:::-;26514:50;;;-1:-1:-1;26552:12:0;;;;26551:13;26514:50;26506:109;;;;-1:-1:-1;;;26506:109:0;;;;;;;:::i;:::-;26628:19;26651:13;;;;;;26650:14;26675:101;;;;26710:13;:20;;-1:-1:-1;;;;26710:20:0;;;;;26745:19;26726:4;26745:19;;;26675:101;30281:26:::1;:24;:26::i;:::-;30318:27;:25;:27::i;:::-;26806:14:::0;26802:68;;;26853:5;26837:21;;-1:-1:-1;;26837:21:0;;;30222:131;:::o;32191:111::-;32265:10;;-1:-1:-1;;;;;32265:10:0;32251;:24;32243:51;;;;-1:-1:-1;;;32243:51:0;;;;;;;:::i;31602:120::-;31147:7;;;;31139:40;;;;-1:-1:-1;;;31139:40:0;;;;;;;:::i;:::-;31661:7:::1;:15:::0;;-1:-1:-1;;31661:15:0::1;::::0;;31692:22:::1;31701:12;:10;:12::i;:::-;31692:22;;;;;;:::i;:::-;;;;;;;;31602:120::o:0;32481:147::-;32561:6;;-1:-1:-1;;;;;32561:6:0;32547:10;:20;;:48;;-1:-1:-1;32585:10:0;;-1:-1:-1;;;;;32585:10:0;32571;:24;32547:48;32539:81;;;;-1:-1:-1;;;32539:81:0;;;;;;;:::i;43965:368::-;44113:7;44137:11;44133:52;;-1:-1:-1;44172:1:0;44165:8;;44133:52;44195:11;44209:31;36590:5;44209:18;:6;44220;44209:10;:18::i;:31::-;44195:45;-1:-1:-1;44251:53:0;-1:-1:-1;;;;;44251:37:0;;44289:9;44195:45;44251:37;:53::i;:::-;44322:3;-1:-1:-1;43965:368:0;;;;;;;:::o;50595:298::-;50734:50;50753:10;50060:42;50776:7;50734:18;:50::i;:::-;50795:90;;-1:-1:-1;;;50795:90:0;;50060:42;;50795:52;;:90;;50848:7;;50857:1;;50860:4;;50874;;50881:3;;50795:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50795:90:0;;;;;;;;;;;;:::i;:::-;;50595:298;;;:::o;52016:528::-;52131:50;;-1:-1:-1;;;52131:50:0;;52106:22;;-1:-1:-1;;;;;52131:35:0;;;;;:50;;52175:4;;52131:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52106:75;;52192:22;52235:6;-1:-1:-1;;;;;52217:35:0;;52261:4;52217:50;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52192:75;;52280:53;52299:6;50060:42;52318:14;52280:18;:53::i;:::-;52344;52363:6;50060:42;52382:14;52344:18;:53::i;:::-;52410:126;;-1:-1:-1;;;52410:126:0;;50060:42;;52410:40;;:126;;52451:6;;52459;;52467:14;;52483;;52499:1;;;;52513:4;;52520:15;;52410:126;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;52016:528;;;;:::o;58815:369::-;58920:36;;-1:-1:-1;;;58920:36:0;;55272:42;;58920:24;;:36;;55378:2;;58950:5;;58920:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59156:6:0;;59130:46;;-1:-1:-1;;;59130:46:0;;-1:-1:-1;;;;;59156:6:0;;;;-1:-1:-1;59130:39:0;;-1:-1:-1;59130:46:0;;59170:5;;59130:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58815:369;:::o;37648:141::-;37729:8;;-1:-1:-1;;;;;37729:8:0;37715:10;:22;;:50;;-1:-1:-1;37755:10:0;;-1:-1:-1;;;;;37755:10:0;37741;:24;37715:50;37707:74;;;;-1:-1:-1;;;37707:74:0;;;;;;;:::i;31343:118::-;30871:7;;;;30870:8;30862:37;;;;-1:-1:-1;;;30862:37:0;;;;;;;:::i;:::-;31403:7:::1;:14:::0;;-1:-1:-1;;31403:14:0::1;31413:4;31403:14;::::0;;31433:20:::1;31440:12;:10;:12::i;59293:1177::-:0;59367:45;;-1:-1:-1;;;59367:45:0;;59347:14;;55272:42;;59367:25;;:45;;55378:2;;59406:4;;59367:45;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;59465:38:0;;-1:-1:-1;;;59465:38:0;;59346:66;;-1:-1:-1;55272:42:0;;59465:25;;:38;;55378:2;;59346:66;;59465:38;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59629:50:0;;-1:-1:-1;;;59629:50:0;;59611:15;;-1:-1:-1;;;;;;;;;;;;55174:42:0;-1:-1:-1;59629:35:0;;:50;;59673:4;;59629:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59690:30;;-1:-1:-1;;;59690:30:0;;59611:68;;-1:-1:-1;;;;;;;;;;;;55174:42:0;59690:21;;:30;;59611:68;;59690:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59748:49:0;;-1:-1:-1;;;59748:49:0;;59731:14;;-1:-1:-1;55077:42:0;;-1:-1:-1;59748:34:0;;:49;;59791:4;;59748:49;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59731:66;;59859:80;59909:10;;;;;;;;;-1:-1:-1;;;;;59909:10:0;-1:-1:-1;;;;;59897:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55077:42;;59932:6;59859:37;:80::i;:::-;60108:6;;;;;;;;;-1:-1:-1;;;;;60108:6:0;-1:-1:-1;;;;;60082:38:0;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60229:6:0;;60211:50;;-1:-1:-1;;;60211:50:0;;60193:15;;-1:-1:-1;;;;;;60229:6:0;;;;-1:-1:-1;60211:35:0;;:50;;60255:4;;60211:50;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60193:68;;60272:82;60323:10;;;;;;;;;-1:-1:-1;;;;;60323:10:0;-1:-1:-1;;;;;60311:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60290:6;;-1:-1:-1;;;;;60290:6:0;;60346:7;60272:38;:82::i;37441:199::-;37533:6;;-1:-1:-1;;;;;37533:6:0;37519:10;:20;;:48;;-1:-1:-1;37557:10:0;;-1:-1:-1;;;;;37557:10:0;37543;:24;37519:48;:76;;;-1:-1:-1;37585:10:0;;-1:-1:-1;;;;;37585:10:0;37571;:24;37519:76;37511:121;;;;-1:-1:-1;;;37511:121:0;;;;;;;:::i;17997:772::-;18432:23;18458:69;18486:4;18458:69;;;;;;;;;;;;;;;;;18466:5;-1:-1:-1;;;;;18458:27:0;;;:69;;;;;:::i;:::-;18542:17;;18432:95;;-1:-1:-1;18542:21:0;18538:224;;18684:10;18673:30;;;;;;;;;;;;:::i;:::-;18665:85;;;;-1:-1:-1;;;18665:85:0;;;;;;;:::i;4833:192::-;4919:7;4955:12;4947:6;;;;4939:29;;;;-1:-1:-1;;;4939:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;4991:5:0;;;4833:192::o;6859:278::-;6945:7;6980:12;6973:5;6965:28;;;;-1:-1:-1;;;6965:28:0;;;;;;;;:::i;:::-;;7004:9;7020:1;7016;:5;;;;;;;6859:278;-1:-1:-1;;;;;6859:278:0:o;28518:65::-;26514:13;;;;;;;;:33;;;26531:16;:14;:16::i;:::-;26514:50;;;-1:-1:-1;26552:12:0;;;;26551:13;26514:50;26506:109;;;;-1:-1:-1;;;26506:109:0;;;;;;;:::i;:::-;26628:19;26651:13;;;;;;26650:14;26675:101;;;;26710:13;:20;;-1:-1:-1;;;;26710:20:0;;;;;26745:19;26726:4;26745:19;;;26806:14;26802:68;;;26853:5;26837:21;;-1:-1:-1;;26837:21:0;;;28518:65;:::o;30361:92::-;26514:13;;;;;;;;:33;;;26531:16;:14;:16::i;:::-;26514:50;;;-1:-1:-1;26552:12:0;;;;26551:13;26514:50;26506:109;;;;-1:-1:-1;;;26506:109:0;;;;;;;:::i;:::-;26628:19;26651:13;;;;;;26650:14;26675:101;;;;26710:13;:20;;-1:-1:-1;;;;26710:20:0;;;;;26745:19;26726:4;26745:19;;;26675:101;30430:7:::1;:15:::0;;-1:-1:-1;;30430:15:0::1;::::0;;26802:68;;;;26853:5;26837:21;;-1:-1:-1;;26837:21:0;;;30361:92;:::o;28589:106::-;28677:10;28589:106;:::o;44395:256::-;44527:50;-1:-1:-1;;;;;44527:36:0;;44564:9;44575:1;44527:36;:50::i;:::-;44588:55;-1:-1:-1;;;;;44588:36:0;;44625:9;44636:6;44588:36;:55::i;12164:196::-;12267:12;12299:53;12322:6;12330:4;12336:1;12339:12;12299:22;:53::i;16318:633::-;16699:10;;;16698:62;;-1:-1:-1;16715:39:0;;-1:-1:-1;;;16715:39:0;;-1:-1:-1;;;;;16715:15:0;;;;;:39;;16739:4;;16746:7;;16715:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;16698:62;16690:152;;;;-1:-1:-1;;;16690:152:0;;;;;;;:::i;:::-;16853:90;16873:5;16903:22;;;16927:7;16936:5;16880:62;;;;;;;;;:::i;13541:979::-;13671:12;13704:18;13715:6;13704:10;:18::i;:::-;13696:60;;;;-1:-1:-1;;;13696:60:0;;;;;;;:::i;:::-;13830:12;13844:23;13871:6;-1:-1:-1;;;;;13871:11:0;13891:8;13902:4;13871:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13829:78;;;;13922:7;13918:595;;;13953:10;-1:-1:-1;13946:17:0;;-1:-1:-1;13946:17:0;13918:595;14067:17;;:21;14063:439;;14330:10;14324:17;14391:15;14378:10;14374:2;14370:19;14363:44;14278:148;14473:12;14466:20;;-1:-1:-1;;;14466:20:0;;;;;;;;:::i;9243:422::-;9610:20;9649:8;;;9243:422::o;-1:-1:-1:-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;945:616::-;;1060:3;1053:4;1045:6;1041:17;1037:27;1027:2;;-1:-1;;1068:12;1027:2;1121:78;40134:17;1121:78;:::i;:::-;1112:87;;1205:16;1264:17;1322:3;40134:17;1297:3;1293:27;1290:36;1287:2;;;1339:1;;1329:12;1287:2;1364:1;1349:206;1102:4;1371:1;1368:13;1349:206;;;2519:20;;1442:50;;40146:4;1506:14;;;;1534;;;;1396:1;1389:9;1349:206;;;1353:14;;;1020:541;;;;:::o;2730:241::-;;2834:2;2822:9;2813:7;2809:23;2805:32;2802:2;;;-1:-1;;2840:12;2802:2;85:6;72:20;97:33;124:5;97:33;:::i;2978:263::-;;3093:2;3081:9;3072:7;3068:23;3064:32;3061:2;;;-1:-1;;3099:12;3061:2;226:6;220:13;238:33;265:5;238:33;:::i;3248:743::-;;;;;;3420:3;3408:9;3399:7;3395:23;3391:33;3388:2;;;-1:-1;;3427:12;3388:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;3479:63;-1:-1;3579:2;3618:22;;72:20;97:33;72:20;97:33;:::i;:::-;3587:63;-1:-1;3687:2;3726:22;;72:20;97:33;72:20;97:33;:::i;:::-;3695:63;-1:-1;3795:2;3834:22;;72:20;97:33;72:20;97:33;:::i;:::-;3803:63;-1:-1;3903:3;3943:22;;72:20;97:33;72:20;97:33;:::i;:::-;3912:63;;;;3382:609;;;;;;;;:::o;3998:1087::-;;;;;;;;4250:3;4238:9;4229:7;4225:23;4221:33;4218:2;;;-1:-1;;4257:12;4218:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;4309:63;-1:-1;4409:2;4448:22;;;72:20;97:33;72:20;97:33;:::i;:::-;4417:63;-1:-1;4517:2;4556:22;;72:20;97:33;72:20;97:33;:::i;:::-;4525:63;-1:-1;4625:2;4664:22;;72:20;97:33;72:20;97:33;:::i;:::-;4633:63;-1:-1;4733:3;4773:22;;72:20;97:33;72:20;97:33;:::i;:::-;4742:63;-1:-1;398:17;;;394:27;-1:-1;384:2;;-1:-1;;425:12;384:2;478:78;4733:3;478:78;:::i;:::-;562:16;4842:3;4909:9;4905:22;650:27;4909:9;650:27;679:3;650:27;647:36;644:2;;;-1:-1;;686:12;644:2;-1:-1;706:206;459:4;728:1;725:13;706:206;;;85:6;72:20;97:33;124:5;97:33;:::i;:::-;799:50;;863:14;;;;891;;;;753:1;746:9;706:206;;;710:14;4851:86;;;4993:76;5061:7;5037:22;4993:76;:::i;:::-;4983:86;;;;;;;4212:873;;;;;;;;;;:::o;5092:392::-;;5232:2;;5220:9;5211:7;5207:23;5203:32;5200:2;;;-1:-1;;5238:12;5200:2;5289:17;5283:24;5327:18;5319:6;5316:30;5313:2;;;-1:-1;;5349:12;5313:2;5436:22;;1708:4;1696:17;;1692:27;-1:-1;1682:2;;-1:-1;;1723:12;1682:2;1763:6;1757:13;1785:80;1800:64;1857:6;1800:64;:::i;:::-;1785:80;:::i;:::-;1893:21;;;1950:14;;;;1925:17;;;2039;;;2030:27;;;;2027:36;-1:-1;2024:2;;;-1:-1;;2066:12;2024:2;-1:-1;2092:10;;2086:217;2111:6;2108:1;2105:13;2086:217;;;2667:13;;2179:61;;2133:1;2126:9;;;;;2254:14;;;;2282;;2086:217;;;-1:-1;5369:99;5194:290;-1:-1;;;;;;;5194:290::o;5491:257::-;;5603:2;5591:9;5582:7;5578:23;5574:32;5571:2;;;-1:-1;;5609:12;5571:2;2398:6;2392:13;43407:5;42085:13;42078:21;43385:5;43382:32;43372:2;;-1:-1;;43418:12;5755:241;;5859:2;5847:9;5838:7;5834:23;5830:32;5827:2;;;-1:-1;;5865:12;5827:2;-1:-1;2519:20;;5821:175;-1:-1;5821:175::o;6003:263::-;;6118:2;6106:9;6097:7;6093:23;6089:32;6086:2;;;-1:-1;;6124:12;6086:2;-1:-1;2667:13;;6080:186;-1:-1;6080:186::o;6273:399::-;;;6405:2;6393:9;6384:7;6380:23;6376:32;6373:2;;;-1:-1;;6411:12;6373:2;-1:-1;;2667:13;;6574:2;6624:22;;;2667:13;;;;;-1:-1;6367:305::o;6679:535::-;;;;6828:2;6816:9;6807:7;6803:23;6799:32;6796:2;;;-1:-1;;6834:12;6796:2;2673:6;2667:13;6886:74;;6997:2;7051:9;7047:22;2667:13;7005:74;;7116:2;7170:9;7166:22;2667:13;7124:74;;6790:424;;;;;:::o;7813:690::-;;8006:5;40996:12;41540:6;41535:3;41528:19;41577:4;;41572:3;41568:14;8018:93;;41577:4;8182:5;40850:14;-1:-1;8221:260;8246:6;8243:1;8240:13;8221:260;;;8307:13;;-1:-1;;;;;42173:54;7613:37;;7375:14;;;;41383;;;;5327:18;8261:9;8221:260;;;-1:-1;8487:10;;7937:566;-1:-1;;;;;7937:566::o;20666:271::-;;8782:5;40996:12;8893:52;8938:6;8933:3;8926:4;8919:5;8915:16;8893:52;:::i;:::-;8957:16;;;;;20800:137;-1:-1;;20800:137::o;20944:222::-;-1:-1;;;;;42173:54;;;;7613:37;;21071:2;21056:18;;21042:124::o;21418:333::-;-1:-1;;;;;42173:54;;;7613:37;;42173:54;;21737:2;21722:18;;7613:37;21573:2;21558:18;;21544:207::o;21758:1036::-;-1:-1;;;;;42173:54;;;7613:37;;42173:54;;;22262:2;22247:18;;7613:37;22345:2;22330:18;;20497:37;;;;22428:2;22413:18;;20497:37;;;;22519:3;22504:19;;9064:58;;;;42184:42;22596:19;;9064:58;42173:54;;;22695:3;22680:19;;7613:37;22779:3;22764:19;;20497:37;;;;22097:3;22082:19;;22068:726::o;22801:333::-;-1:-1;;;;;42173:54;;;;7613:37;;23120:2;23105:18;;20497:37;22956:2;22941:18;;22927:207::o;23141:370::-;;23318:2;23339:17;23332:47;23393:108;23318:2;23307:9;23303:18;23487:6;23393:108;:::i;23518:210::-;42085:13;;42078:21;8576:34;;23639:2;23624:18;;23610:118::o;23735:310::-;;23882:2;23903:17;23896:47;9279:5;40996:12;41540:6;23882:2;23871:9;23867:18;41528:19;9373:52;9418:6;41568:14;23871:9;41568:14;23882:2;9399:5;9395:16;9373:52;:::i;:::-;43181:7;43165:14;-1:-1;;43161:28;9437:39;;;;41568:14;9437:39;;23853:192;-1:-1;;23853:192::o;24052:416::-;24252:2;24266:47;;;9713:2;24237:18;;;41528:19;-1:-1;;;41568:14;;;9729:43;9791:12;;;24223:245::o;24475:416::-;24675:2;24689:47;;;10042:2;24660:18;;;41528:19;10078:34;41568:14;;;10058:55;-1:-1;;;10133:12;;;10126:45;10190:12;;;24646:245::o;24898:416::-;25098:2;25112:47;;;10441:2;25083:18;;;41528:19;-1:-1;;;41568:14;;;10457:43;10519:12;;;25069:245::o;25321:416::-;25521:2;25535:47;;;10770:2;25506:18;;;41528:19;10806:34;41568:14;;;10786:55;-1:-1;;;10861:12;;;10854:37;10910:12;;;25492:245::o;25744:416::-;25944:2;25958:47;;;11161:1;25929:18;;;41528:19;-1:-1;;;41568:14;;;11176:29;11224:12;;;25915:245::o;26167:416::-;26367:2;26381:47;;;11475:2;26352:18;;;41528:19;11511:29;41568:14;;;11491:50;11560:12;;;26338:245::o;26590:416::-;26790:2;26804:47;;;11811:2;26775:18;;;41528:19;-1:-1;;;41568:14;;;11827:37;11883:12;;;26761:245::o;27013:416::-;27213:2;27227:47;;;12134:1;27198:18;;;41528:19;-1:-1;;;41568:14;;;12149:29;12197:12;;;27184:245::o;27436:416::-;27636:2;27650:47;;;27621:18;;;41528:19;12484:34;41568:14;;;12464:55;12538:12;;;27607:245::o;27859:416::-;28059:2;28073:47;;;12789:1;28044:18;;;41528:19;-1:-1;;;41568:14;;;12804:29;12852:12;;;28030:245::o;28282:416::-;28482:2;28496:47;;;13103:2;28467:18;;;41528:19;13139:34;41568:14;;;13119:55;-1:-1;;;13194:12;;;13187:42;13248:12;;;28453:245::o;28705:416::-;28905:2;28919:47;;;13499:2;28890:18;;;41528:19;13535:34;41568:14;;;13515:55;-1:-1;;;13590:12;;;13583:30;13632:12;;;28876:245::o;29128:416::-;29328:2;29342:47;;;13883:2;29313:18;;;41528:19;-1:-1;;;41568:14;;;13899:39;13957:12;;;29299:245::o;29551:416::-;29751:2;29765:47;;;14208:1;29736:18;;;41528:19;-1:-1;;;41568:14;;;14223:27;14269:12;;;29722:245::o;29974:416::-;30174:2;30188:47;;;14520:2;30159:18;;;41528:19;14556:34;41568:14;;;14536:55;-1:-1;;;14611:12;;;14604:38;14661:12;;;30145:245::o;30397:416::-;30597:2;30611:47;;;14912:2;30582:18;;;41528:19;14948:34;41568:14;;;14928:55;-1:-1;;;15003:12;;;14996:25;15040:12;;;30568:245::o;30820:416::-;31020:2;31034:47;;;15291:1;31005:18;;;41528:19;-1:-1;;;41568:14;;;15306:29;15354:12;;;30991:245::o;31243:416::-;31443:2;31457:47;;;15605:2;31428:18;;;41528:19;15641:34;41568:14;;;15621:55;-1:-1;;;15696:12;;;15689:39;15747:12;;;31414:245::o;31666:416::-;31866:2;31880:47;;;15998:2;31851:18;;;41528:19;-1:-1;;;41568:14;;;16014:34;16067:12;;;31837:245::o;32089:416::-;32289:2;32303:47;;;16318:1;32274:18;;;41528:19;-1:-1;;;41568:14;;;16333:28;16380:12;;;32260:245::o;32512:416::-;32712:2;32726:47;;;16631:2;32697:18;;;41528:19;16667:34;41568:14;;;16647:55;-1:-1;;;16722:12;;;16715:42;16776:12;;;32683:245::o;32935:416::-;33135:2;33149:47;;;17027:2;33120:18;;;41528:19;17063:31;41568:14;;;17043:52;17114:12;;;33106:245::o;33358:416::-;33558:2;33572:47;;;17365:2;33543:18;;;41528:19;17401:34;41568:14;;;17381:55;-1:-1;;;17456:12;;;17449:34;17502:12;;;33529:245::o;33781:416::-;33981:2;33995:47;;;17753:2;33966:18;;;41528:19;-1:-1;;;41568:14;;;17769:37;17825:12;;;33952:245::o;34204:416::-;34404:2;34418:47;;;18076:2;34389:18;;;41528:19;18112:34;41568:14;;;18092:55;-1:-1;;;18167:12;;;18160:46;18225:12;;;34375:245::o;34627:339::-;;34812:3;34801:9;34797:19;34789:27;;18582:16;18576:23;20504:3;20497:37;18758:4;18751:5;18747:16;18741:23;18758:4;18822:3;18818:14;20497:37;18919:4;18912:5;18908:16;18902:23;18919:4;18983:3;18979:14;20497:37;19081:4;19074:5;19070:16;19064:23;19081:4;19145:3;19141:14;20497:37;19243:4;19236:5;19232:16;19226:23;19243:4;19307:3;19303:14;20497:37;19405:4;19398:5;19394:16;19388:23;19405:4;19469:3;19465:14;20497:37;19576:4;19569:5;19565:16;19559:23;19576:4;19640:3;19636:14;20497:37;19744:4;19737:5;19733:16;19727:23;19744:4;19808:3;19804:14;20497:37;19902:6;;19895:5;19891:18;19885:25;19902:6;19968:3;19964:16;20497:37;;34783:183;;;;:::o;34973:326::-;20316:23;;20497:37;;35152:2;35137:18;;35123:176::o;35306:222::-;20497:37;;;35433:2;35418:18;;35404:124::o;35535:333::-;20497:37;;;-1:-1;;;;;42173:54;35854:2;35839:18;;7613:37;35690:2;35675:18;;35661:207::o;35875:349::-;20497:37;;;36210:2;36195:18;;9064:58;36038:2;36023:18;;36009:215::o;36231:832::-;;20527:5;20504:3;20497:37;42541:24;36701:2;36690:9;36686:18;9064:58;36528:3;36738:2;36727:9;36723:18;36716:48;36778:108;36528:3;36517:9;36513:19;36872:6;36778:108;:::i;:::-;-1:-1;;;;;42173:54;;;;36965:2;36950:18;;7613:37;-1:-1;37048:3;37033:19;20497:37;36770:116;36499:564;-1:-1;;;36499:564::o;37410:556::-;20497:37;;;37786:2;37771:18;;20497:37;;;;37869:2;37854:18;;20497:37;37952:2;37937:18;;20497:37;37621:3;37606:19;;37592:374::o;37973:780::-;20497:37;;;38405:2;38390:18;;20497:37;;;;38488:2;38473:18;;20497:37;;;;38571:2;38556:18;;20497:37;38654:3;38639:19;;20497:37;38738:3;38723:19;;20497:37;38240:3;38225:19;;38211:542::o;38760:892::-;20497:37;;;39220:2;39205:18;;20497:37;;;;39303:2;39288:18;;20497:37;;;;39386:2;39371:18;;20497:37;;;;39469:3;39454:19;;20497:37;39553:3;39538:19;;20497:37;39637:3;39622:19;;20497:37;39055:3;39040:19;;39026:626::o;39659:256::-;39721:2;39715:9;39747:17;;;39822:18;39807:34;;39843:22;;;39804:62;39801:2;;;39879:1;;39869:12;39801:2;39721;39888:22;39699:216;;-1:-1;39699:216::o;40424:304::-;;40583:18;40575:6;40572:30;40569:2;;;-1:-1;;40605:12;40569:2;-1:-1;40650:4;40638:17;;;40703:15;;40506:222::o;42821:268::-;42886:1;42893:101;42907:6;42904:1;42901:13;42893:101;;;42974:11;;;42968:18;42955:11;;;42948:39;42929:2;42922:10;42893:101;;;43009:6;43006:1;43003:13;43000:2;;;-1:-1;;42886:1;43056:16;;43049:27;42870:219::o;43202:117::-;-1:-1;;;;;42173:54;;43261:35;;43251:2;;43310:1;;43300:12
Swarm Source
ipfs://1039b6af8be11ed11705350bf4b2b95fe70efcb0de2683cc5e061485d905469e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.