Overview
S Balance
S Value
$0.72 (@ $0.72/S)More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
NavigatorStrategyColors
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at SonicScan.org on 2025-02-26 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.12; // OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol) /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 amount) external returns (bool); } // OpenZeppelin Contracts (last updated v4.9.4) (token/ERC20/extensions/IERC20Permit.sol) /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * * Furthermore, `isContract` will also return true if the target contract within * the same transaction is already scheduled for destruction by `SELFDESTRUCT`, * which only has an effect at the end of a transaction. * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // OpenZeppelin Contracts (last updated v4.9.3) (token/ERC20/utils/SafeERC20.sol) /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value)); } /** * @dev Decrease the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value)); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0)); _callOptionalReturn(token, approvalCall); } } /** * @dev Use a ERC-2612 signature to set the `owner` approval toward `spender` on `token`. * Revert on invalid signature. */ function safePermit( IERC20Permit token, address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) internal { uint256 nonceBefore = token.nonces(owner); token.permit(owner, spender, value, deadline, v, r, s); uint256 nonceAfter = token.nonces(owner); require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token)); } } // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol) // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @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) { return a + b; } /** * @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 a - b; } /** * @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) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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 a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting 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) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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) { unchecked { require(b > 0, errorMessage); return a % b; } } } // OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.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 meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol) /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == _ENTERED; } } // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.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. */ abstract contract Pausable is Context { /** * @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. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { 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()); } } interface IStrategy { // Total want tokens managed by strategy function wantLockedTotal() external view returns (uint256); // Sum of all shares of users to wantLockedTotal function sharesTotal() external view returns (uint256); function wantAddress() external view returns (address); function token0Address() external view returns (address); function token1Address() external view returns (address); function earnedAddress() external view returns (address); function getPricePerFullShare() external view returns (uint256); // Main want token compounding function function earn() external; // Transfer want tokens autoFarm -> strategy function deposit(address _userAddress, uint256 _wantAmt) external returns (uint256); // Transfer want tokens strategy -> autoFarm function withdraw(address _userAddress, uint256 _wantAmt) external returns (uint256); function migrateFrom(address _oldStrategy, uint256 _oldWantLockedTotal, uint256 _oldSharesTotal) external; function inCaseTokensGetStuck(address _token, uint256 _amount) external; function inFarmBalance() external view returns (uint256); function totalBalance() external view returns (uint256); } interface IFarmChef { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingReward(uint256 _pid, address _user) external view returns (uint256); function getBribingSonicToHarvest(uint256 _pid, address _user) external view returns (uint256); function getRedPriceInSonic() external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256 amount, uint256 rewardDebt); function harvest(uint256 _pid) external payable; function pegStabilityModuleFee() external view returns (uint256); } interface IRouter { function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); 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 swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function swapExactTokensForS( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); } contract NavigatorStrategyColors is IStrategy, Ownable, ReentrancyGuard, Pausable { using SafeMath for uint256; using SafeERC20 for IERC20; address public farmContractAddress; uint256 public pid; address public override wantAddress; address public override token0Address; address public override token1Address; address public override earnedAddress; address public dexRouterAddress; // mapping(address => mapping(address => address[])) public tokenPaths; address public constant WS = address(0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38); address public controller; address public strategist; address public timelock; uint256 public lastEarnTime = 0; uint256 public autoEarnLimit = 10 * 1e18; // 10 S uint256 public override wantLockedTotal = 0; uint256 public override sharesTotal = 0; uint256 public totalEarned = 0; uint256 public minSCollateralAmount = 100 * 1e18; // 100 S uint256 public adjustSlippageFee = 10; //10% uint256 public adjustSlippageFeeUL = 50; //5% uint256 public controllerFee = 50; //5% uint256 public constant controllerFeeMax = 1000; // 10 = 1% uint256 public constant controllerFeeUL = 20; address public treasuryAddress; event Deposit(uint256 amount); event Withdraw(uint256 amount); event Farm(uint256 amount); event Compound(address token0Address, uint256 token0Amt, address token1Address, uint256 token1Amt); event Earned(address earnedAddress, uint256 earnedAmt); event BuyBack(address earnedAddress, uint earnedAmt, uint256 buyBackAmt, address receiver); event DistributeFee(address earnedAddress, uint256 fee, address receiver); event InCaseTokensGetStuck(address tokenAddress, uint256 tokenAmt, address receiver); event ExecuteTransaction(address indexed target, uint256 value, string signature, bytes data); event DepositS(address indexed user, uint256 amount); event WithdrawS(address indexed user, uint256 amount); event UnwrappedWS(uint256 amount); event Fees(uint256 pegStabilityModuleFee, uint256 adjustSlippageFee, uint256 controllerFee); constructor( address _controller, address _timelock, address _treasuryAddress, address _farmContractAddress, address _dexRouterAddress, uint256 _pid, address _wantAddress, address _earnedAddress, address _token0, address _token1 ) { controller = _controller; strategist = msg.sender; timelock = _timelock; treasuryAddress = _treasuryAddress; // to call earn if public not allowed farmContractAddress = _farmContractAddress; dexRouterAddress = _dexRouterAddress; wantAddress = _wantAddress; token0Address = _token0; token1Address = _token1; pid = _pid; earnedAddress = _earnedAddress; } modifier onlyController() { require(controller == msg.sender, "caller is not the controller"); _; } modifier onlyStrategist() { require(strategist == msg.sender || owner() == msg.sender, "Strategy: caller is not the strategist"); _; } modifier onlyTimelock() { require(timelock == msg.sender, "Strategy: caller is not timelock"); _; } function isAuthorised(address _account) public view returns (bool) { return (_account == owner()) || (msg.sender == strategist) || (msg.sender == timelock); } function requiredSToHarvest() public view returns (uint256) { uint256 pendingReward = pendingHarvest(); uint256 _pendingHarvestSValue = pendingReward.mul(IFarmChef(farmContractAddress).getRedPriceInSonic().div(1e18)); uint256 pegStabilityModuleFee = IFarmChef(farmContractAddress).pegStabilityModuleFee(); return _pendingHarvestSValue.mul(pegStabilityModuleFee + adjustSlippageFee).div(1000); } function autoEarn() public onlyStrategist { uint256 _pendingHarvestSValue = pendingHarvestSValue(); require(_pendingHarvestSValue >= autoEarnLimit, "too small"); uint256 requiredS = requiredSToHarvest(); require(address(this).balance >= requiredS, "not enough S collateral"); earn(); } function inFarmBalance() public override view returns (uint256) { (uint256 amount,) = IFarmChef(farmContractAddress).userInfo(pid, address(this)); return amount; } function totalBalance() external override view returns (uint256) { return IERC20(wantAddress).balanceOf(address(this)) + inFarmBalance(); } function getPricePerFullShare() external override view returns (uint256) { return (sharesTotal == 0) ? 1e18 : wantLockedTotal.mul(1e18).div(sharesTotal); } function increaseAllowance(address token, address spender, uint256 addedValue) internal { // increase allowance IERC20(token).safeIncreaseAllowance(spender, addedValue); } // Receives new deposits from user function deposit(address, uint256 _wantAmt) external override onlyController nonReentrant whenNotPaused returns (uint256) { IERC20(wantAddress).safeTransferFrom(address(msg.sender), address(this), _wantAmt); uint256 sharesAdded = _wantAmt; if (wantLockedTotal > 0 && sharesTotal > 0) { sharesAdded = _wantAmt.mul(sharesTotal).div(wantLockedTotal); } sharesTotal = sharesTotal.add(sharesAdded); _farm(); emit Deposit(_wantAmt); return sharesAdded; } function farm() public onlyOwner { _farm(); } function harvestReward() public onlyOwner { _harvest(); } function compound() public onlyOwner { _compound(); } function payFees() public onlyOwner { _payFees(); } function _farm() internal { IERC20 _want = IERC20(wantAddress); uint256 wantAmt = _want.balanceOf(address(this)); wantLockedTotal = wantLockedTotal.add(wantAmt); if (wantAmt > 0) { increaseAllowance(wantAddress, farmContractAddress, wantAmt); IFarmChef(farmContractAddress).deposit(pid, wantAmt); emit Farm(wantAmt); } } function withdraw(address, uint256 _wantAmt) external override onlyController nonReentrant returns (uint256) { require(_wantAmt > 0, "Strategy: !_wantAmt"); IFarmChef(farmContractAddress).withdraw(pid, _wantAmt); uint256 wantAmt = IERC20(wantAddress).balanceOf(address(this)); if (_wantAmt > wantAmt) { _wantAmt = wantAmt; } if (wantLockedTotal < _wantAmt) { _wantAmt = wantLockedTotal; } uint256 sharesRemoved = _wantAmt.mul(sharesTotal).div(wantLockedTotal); if (sharesRemoved > sharesTotal) { sharesRemoved = sharesTotal; } sharesTotal = sharesTotal.sub(sharesRemoved); wantLockedTotal = wantLockedTotal.sub(_wantAmt); IERC20(wantAddress).safeTransfer(address(msg.sender), _wantAmt); emit Withdraw(_wantAmt); return sharesRemoved; } function _harvest() internal { // Get pending rewards from farm contract uint256 pendingReward = IFarmChef(farmContractAddress).pendingReward(pid, address(this)); uint256 pegStabilityModuleFee = IFarmChef(farmContractAddress).pegStabilityModuleFee(); uint256 twapREDPriceInSonic = IFarmChef(farmContractAddress).getRedPriceInSonic(); uint256 amountSonicToPay = (twapREDPriceInSonic.mul(pendingReward).div(1e18)).mul(pegStabilityModuleFee + adjustSlippageFee).div(1000); require(amountSonicToPay <= address(this).balance, "not enough sonic collateral"); //add adjustSlippageFee amountSonicToPay += amountSonicToPay.div(1000).mul(1000 + adjustSlippageFee); // Harvest farm rewards before compounding, sending required Sonic (S) IFarmChef(farmContractAddress).harvest{value: amountSonicToPay}(pid); } function _payFees() internal { uint256 earnedAmount = IERC20(earnedAddress).balanceOf(address(this)); if (earnedAmount <= 0) { return; } emit Earned(earnedAddress, earnedAmount); //1. Swap token to repay S collateral (add adjustSlippageFee) and fees uint256 pegStabilityModuleFee = IFarmChef(farmContractAddress).pegStabilityModuleFee(); _swapTokenToS(earnedAddress, earnedAmount.mul(pegStabilityModuleFee + adjustSlippageFee + controllerFee).div(1000), address(this)); if (address(this).balance >= minSCollateralAmount.mul(120).div(100)) { (bool success, ) = payable(treasuryAddress).call{value: address(this).balance - minSCollateralAmount}(""); require(success, "transfer fee failed!"); } } function _compound() internal { //1. Convert earned token into want token uint256 earnedAmount = IERC20(earnedAddress).balanceOf(address(this)); // track totalEarned in S totalEarned = totalEarned.add(exchangeRate(earnedAddress, WS, earnedAmount)); if (earnedAddress != token0Address) { _swapTokenToToken(earnedAddress, token0Address, earnedAmount.div(2), address(this)); } if (earnedAddress != token1Address) { _swapTokenToToken(earnedAddress, token1Address, earnedAmount.div(2), address(this)); } // Get want tokens, ie. add liquidity uint256 token0Amt = IERC20(token0Address).balanceOf(address(this)); uint256 token1Amt = IERC20(token1Address).balanceOf(address(this)); if (token0Amt > 0 && token1Amt > 0) { _addLiquidity(token0Address, token1Address, token0Amt, token1Amt); emit Compound(token0Address, token0Amt, token1Address, token1Amt); } } // 1. Harvest farm tokens // 2. Converts farm tokens into want tokens // 3. Deposits want tokens function earn() public override whenNotPaused onlyStrategist { _harvest(); _payFees(); _compound(); _farm(); lastEarnTime = block.timestamp; } function exchangeRate(address _inputToken, address _outputToken, uint256 _tokenAmount) public view returns (uint256) { uint256[] memory amounts = IRouter(dexRouterAddress).getAmountsOut(_tokenAmount, tokenPaths[_inputToken][_outputToken]); return amounts[amounts.length - 1]; } function pendingHarvest() public view returns (uint256) { uint256 _earnedBal = IERC20(earnedAddress).balanceOf(address(this)); return IFarmChef(farmContractAddress).pendingReward(pid, address(this)).add(_earnedBal); } function pendingHarvestSValue() public view returns (uint256) { uint256 _pending = pendingHarvest(); return (_pending == 0) ? 0 : exchangeRate(earnedAddress, WS, _pending); } function pause() external onlyOwner { _pause(); } function unpause() external onlyOwner { _unpause(); } function setStrategist(address _strategist) external onlyOwner { strategist = _strategist; } function setFees(uint256 _controllerFee, uint256 _adjustSlippageFee) external onlyOwner { require(_controllerFee <= controllerFeeUL, "Strategy: too high"); controllerFee = _controllerFee; require(adjustSlippageFee <= adjustSlippageFeeUL, "Strategy: too high"); adjustSlippageFee = _adjustSlippageFee; } function setTreasuryAddress(address _treasuryAddress) external onlyOwner { require(_treasuryAddress != address(0), "zero"); treasuryAddress = _treasuryAddress; } function setDexRouterAddress(address _routerAddress) external onlyOwner { require(_routerAddress != address(0), "zero"); dexRouterAddress = _routerAddress; } function setAutoEarnLimit(uint256 _autoEarnLimit) external onlyOwner { autoEarnLimit = _autoEarnLimit; } function setMinSCollateralAmount(uint256 _minSCollateralAmount) external onlyOwner { minSCollateralAmount = _minSCollateralAmount; } function setMainPaths( address[] memory _earnedToToken0Path, address[] memory _earnedToToken1Path, address[] memory _earnedToSPath ) external onlyOwner { tokenPaths[earnedAddress][token0Address] = _earnedToToken0Path; tokenPaths[earnedAddress][token1Address] = _earnedToToken1Path; tokenPaths[earnedAddress][WS] = _earnedToSPath; } function setPaths(address _inputToken, address _outputToken, address[] memory _path) external onlyOwner { tokenPaths[_inputToken][_outputToken] = _path; } function _swapTokenToS(address _inputToken, uint256 _amount, address to) internal { increaseAllowance(_inputToken, dexRouterAddress, _amount); if (_inputToken != WS) { IRouter(dexRouterAddress).swapExactTokensForS(_amount, 0, tokenPaths[_inputToken][WS], to, block.timestamp.add(1800)); } } function _swapTokenToToken(address _inputToken, address _outputToken, uint256 _amount, address to) internal { increaseAllowance(_inputToken, dexRouterAddress, _amount); if (_inputToken != _outputToken) { IRouter(dexRouterAddress).swapExactTokensForTokens(_amount, 0, tokenPaths[_inputToken][_outputToken], to, block.timestamp.add(1800)); } } function _addLiquidity(address _tokenA, address _tokenB, uint256 _amountADesired, uint256 _amountBDesired) internal { increaseAllowance(_tokenA, dexRouterAddress, _amountADesired); increaseAllowance(_tokenB, dexRouterAddress, _amountBDesired); IRouter(dexRouterAddress).addLiquidity(_tokenA, _tokenB, _amountADesired, _amountBDesired, 0, 0, address(this), block.timestamp.add(1800)); } receive() external payable { } fallback() external payable { } function depositS() external payable { _depositS(); } function _depositS() internal { require(msg.value > 0, "Must send S"); emit DepositS(msg.sender, msg.value); } function withdrawS(uint256 amount) external onlyOwner { require(amount > 0, "Amount must be greater than zero"); require(address(this).balance >= amount, "Insufficient S balance in contract"); (bool success, ) = payable(treasuryAddress).call{value: amount}(""); require(success, "Withdraw failed"); emit WithdrawS(msg.sender, amount); } function inCaseTokensGetStuck(address _token, uint256 _amount) external override onlyOwner { require(_token != earnedAddress, "!safe"); require(_token != wantAddress, "!safe"); address _controller = controller; IERC20(_token).safeTransfer(_controller, _amount); emit InCaseTokensGetStuck(_token, _amount, _controller); } function togglePause() external onlyOwner { if (paused()) _unpause(); else _pause(); } function migrateFrom(address, uint256, uint256) external override onlyController { } /* ========== EMERGENCY ========== */ function setController(address _controller) external { require(_controller != address(0), "invalidAddress"); require(controller == msg.sender || timelock == msg.sender, "caller is not the controller nor timelock"); controller = _controller; } function setTimelock(address _timelock) external { require(timelock == msg.sender || (timelock == address(0) && owner() == msg.sender), "!timelock"); timelock = _timelock; } /** * @dev This is from Timelock contract. */ function executeTransaction(address target, uint256 value, string memory signature, bytes memory data) external onlyTimelock returns (bytes memory) { bytes memory callData; if (bytes(signature).length == 0) { callData = data; } else { callData = abi.encodePacked(bytes4(keccak256(bytes(signature))), data); } // solium-disable-next-line security/no-call-value (bool success, bytes memory returnData) = target.call{value : value}(callData); require(success, "Strategy::executeTransaction: Transaction execution reverted."); emit ExecuteTransaction(target, value, signature, data); return returnData; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_controller","type":"address"},{"internalType":"address","name":"_timelock","type":"address"},{"internalType":"address","name":"_treasuryAddress","type":"address"},{"internalType":"address","name":"_farmContractAddress","type":"address"},{"internalType":"address","name":"_dexRouterAddress","type":"address"},{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_wantAddress","type":"address"},{"internalType":"address","name":"_earnedAddress","type":"address"},{"internalType":"address","name":"_token0","type":"address"},{"internalType":"address","name":"_token1","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"earnedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"earnedAmt","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"buyBackAmt","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"BuyBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token0Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"token0Amt","type":"uint256"},{"indexed":false,"internalType":"address","name":"token1Address","type":"address"},{"indexed":false,"internalType":"uint256","name":"token1Amt","type":"uint256"}],"name":"Compound","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositS","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"earnedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"DistributeFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"earnedAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"earnedAmt","type":"uint256"}],"name":"Earned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"string","name":"signature","type":"string"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"ExecuteTransaction","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Farm","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pegStabilityModuleFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"adjustSlippageFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"controllerFee","type":"uint256"}],"name":"Fees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmt","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"InCaseTokensGetStuck","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnwrappedWS","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawS","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"WS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustSlippageFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adjustSlippageFeeUL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoEarn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoEarnLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controller","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFeeMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"controllerFeeUL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositS","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"dexRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"earnedAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address","name":"_outputToken","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"exchangeRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"string","name":"signature","type":"string"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"executeTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farm","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"farmContractAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvestReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"inCaseTokensGetStuck","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"inFarmBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"isAuthorised","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastEarnTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"migrateFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minSCollateralAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","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":"payFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pendingHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingHarvestSValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"requiredSToHarvest","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_autoEarnLimit","type":"uint256"}],"name":"setAutoEarnLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_controller","type":"address"}],"name":"setController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_routerAddress","type":"address"}],"name":"setDexRouterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_controllerFee","type":"uint256"},{"internalType":"uint256","name":"_adjustSlippageFee","type":"uint256"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_earnedToToken0Path","type":"address[]"},{"internalType":"address[]","name":"_earnedToToken1Path","type":"address[]"},{"internalType":"address[]","name":"_earnedToSPath","type":"address[]"}],"name":"setMainPaths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minSCollateralAmount","type":"uint256"}],"name":"setMinSCollateralAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_inputToken","type":"address"},{"internalType":"address","name":"_outputToken","type":"address"},{"internalType":"address[]","name":"_path","type":"address[]"}],"name":"setPaths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_strategist","type":"address"}],"name":"setStrategist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_timelock","type":"address"}],"name":"setTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryAddress","type":"address"}],"name":"setTreasuryAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sharesTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"strategist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timelock","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token0Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token1Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenPaths","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEarned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wantAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wantLockedTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"_wantAmt","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526000600d55678ac7230489e80000600e556000600f556000601055600060115568056bc75e2d63100000601255600a601355603260145560326015553480156200004d57600080fd5b5060405162003a3f38038062003a3f8339810160408190526200007091620001ae565b6200007b3362000141565b6001805560028054600a80546001600160a01b039d8e166001600160a01b031991821617909155600b8054821633179055600c80549c8e169c82169c909c17909b55601680549a8d169a8c169a909a17909955968a16610100026001600160a81b031990981697909717909555600880549489169488169490941790935560048054918816918716919091179055600580549387169386169390931790925560068054938616938516939093179092556003556007805491909316911617905562000274565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620001a957600080fd5b919050565b6000806000806000806000806000806101408b8d031215620001cf57600080fd5b620001da8b62000191565b9950620001ea60208c0162000191565b9850620001fa60408c0162000191565b97506200020a60608c0162000191565b96506200021a60808c0162000191565b955060a08b015194506200023160c08c0162000191565b93506200024160e08c0162000191565b9250620002526101008c0162000191565b9150620002636101208c0162000191565b90509295989b9194979a5092959850565b6137bb80620002846000396000f3fe6080604052600436106103815760003560e01c80638da5cb5b116101cf578063c6d758cb11610101578063e7a036791161009a578063f2fde38b1161006c578063f2fde38b146109df578063f3fef3a3146109ff578063f69e204614610a1f578063f77c479114610a3457005b8063e7a0367914610973578063e7f67fb114610993578063e96c8bcf146109b3578063f1068454146109c957005b8063d7cb416f116100d3578063d7cb416f14610909578063db7a3c0f14610929578063e68b53641461093e578063e71984741461095357005b8063c6d758cb14610894578063c7b9d530146108b4578063d33219b4146108d4578063d389800f146108f457005b8063aeaad0dc11610173578063c0762e5e11610145578063c0762e5e1461081f578063c11b61c71461083f578063c4ae31681461085f578063c5f956af1461087457005b8063aeaad0dc146107cc578063ba0c108f146107d4578063bb97517e146107ea578063bdacb303146107ff57005b80639fc33a9f116101ac5780639fc33a9f14610767578063a0fab1191461078c578063ad7a672f146107a2578063ae335695146107b757005b80638da5cb5b1461071357806392eefe9b146107315780639b9713bb1461075157005b80635afbbaab116102b357806370a3cb111161024c5780637ff36fbe1161021e5780637ff36fbe146106a85780638456cb59146106c8578063856b6dc1146106dd57806385f02dd6146106fd57005b806370a3cb111461063e578063715018a61461065e57806376f2892f1461067357806377c7b8fc1461069357005b80636605bfda116102855780636605bfda146105d357806367d03db8146105f35780636dfa8d9914610608578063701f66041461061e57005b80635afbbaab146105685780635c975abb1461057e5780635d4093591461059657806362779e15146105be57005b806327d9e85e1161032557806344a3955e116102f757806344a3955e146104ed57806347e7ef241461050357806351b699cd146105235780635a34928e1461055357005b806327d9e85e1461048d57806336e9332d146104ad5780633f4ba83a146104c257806342da4eb3146104d757005b80631fe4a6861161035e5780631fe4a686146103f25780632224fa251461042a57806325baef53146104575780632717eff31461047757005b8063061c7d481461038a5780630b78f9c0146103b25780631a2315b8146103d257005b3661038857005b005b34801561039657600080fd5b5061039f601481565b6040519081526020015b60405180910390f35b3480156103be57600080fd5b506103886103cd366004613009565b610a54565b3480156103de57600080fd5b506103886103ed36600461302b565b610afb565b3480156103fe57600080fd5b50600b54610412906001600160a01b031681565b6040516001600160a01b0390911681526020016103a9565b34801561043657600080fd5b5061044a6104453660046130ff565b610c7c565b6040516103a99190613200565b34801561046357600080fd5b50610388610472366004613213565b610e40565b34801561048357600080fd5b5061039f6103e881565b34801561049957600080fd5b506103886104a83660046132dc565b610e6f565b3480156104b957600080fd5b50610388610f3c565b3480156104ce57600080fd5b50610388610f4e565b3480156104e357600080fd5b5061039f600f5481565b3480156104f957600080fd5b5061039f60105481565b34801561050f57600080fd5b5061039f61051e366004613364565b610f5e565b34801561052f57600080fd5b5061054361053e36600461338e565b61104d565b60405190151581526020016103a9565b34801561055f57600080fd5b5061038861108e565b34801561057457600080fd5b5061039f60135481565b34801561058a57600080fd5b5060025460ff16610543565b3480156105a257600080fd5b5061041273039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b3480156105ca57600080fd5b5061038861109e565b3480156105df57600080fd5b506103886105ee36600461338e565b6110ae565b3480156105ff57600080fd5b5061039f611117565b34801561061457600080fd5b5061039f60115481565b34801561062a57600080fd5b5061039f6106393660046133a9565b611163565b34801561064a57600080fd5b5061038861065936600461302b565b61122c565b34801561066a57600080fd5b50610388611239565b34801561067f57600080fd5b5061038861068e3660046133e5565b61124b565b34801561069f57600080fd5b5061039f611288565b3480156106b457600080fd5b50600554610412906001600160a01b031681565b3480156106d457600080fd5b506103886112c9565b3480156106e957600080fd5b506103886106f836600461302b565b6112d9565b34801561070957600080fd5b5061039f60155481565b34801561071f57600080fd5b506000546001600160a01b0316610412565b34801561073d57600080fd5b5061038861074c36600461338e565b6112e6565b34801561075d57600080fd5b5061039f60145481565b34801561077357600080fd5b506002546104129061010090046001600160a01b031681565b34801561079857600080fd5b5061039f600e5481565b3480156107ae57600080fd5b5061039f6113d0565b3480156107c357600080fd5b50610388611451565b610388611551565b3480156107e057600080fd5b5061039f600d5481565b3480156107f657600080fd5b5061039f611559565b34801561080b57600080fd5b5061038861081a36600461338e565b6115df565b34801561082b57600080fd5b5061038861083a36600461338e565b61167f565b34801561084b57600080fd5b5061041261085a3660046133a9565b6116e8565b34801561086b57600080fd5b5061038861172d565b34801561088057600080fd5b50601654610412906001600160a01b031681565b3480156108a057600080fd5b506103886108af366004613364565b611748565b3480156108c057600080fd5b506103886108cf36600461338e565b61184c565b3480156108e057600080fd5b50600c54610412906001600160a01b031681565b34801561090057600080fd5b50610388611876565b34801561091557600080fd5b50600654610412906001600160a01b031681565b34801561093557600080fd5b5061039f6118f2565b34801561094a57600080fd5b5061039f6119ec565b34801561095f57600080fd5b50600754610412906001600160a01b031681565b34801561097f57600080fd5b50600454610412906001600160a01b031681565b34801561099f57600080fd5b50600854610412906001600160a01b031681565b3480156109bf57600080fd5b5061039f60125481565b3480156109d557600080fd5b5061039f60035481565b3480156109eb57600080fd5b506103886109fa36600461338e565b611b2b565b348015610a0b57600080fd5b5061039f610a1a366004613364565b611ba4565b348015610a2b57600080fd5b50610388611dbe565b348015610a4057600080fd5b50600a54610412906001600160a01b031681565b610a5c611dce565b6014821115610aa75760405162461bcd60e51b81526020600482015260126024820152710a6e8e4c2e8cacef27440e8dede40d0d2ced60731b60448201526064015b60405180910390fd5b60158290556014546013541115610af55760405162461bcd60e51b81526020600482015260126024820152710a6e8e4c2e8cacef27440e8dede40d0d2ced60731b6044820152606401610a9e565b60135550565b610b03611dce565b60008111610b535760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a9e565b80471015610bae5760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e7420532062616c616e636520696e20636f6e74726160448201526118dd60f21b6064820152608401610a9e565b6016546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610bfb576040519150601f19603f3d011682016040523d82523d6000602084013e610c00565b606091505b5050905080610c435760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610a9e565b60405182815233907f3ab94c2d450999c961d10ed65cef0fc04929ce8a38e411793ca2cb0fef9036279060200160405180910390a25050565b600c546060906001600160a01b03163314610cd95760405162461bcd60e51b815260206004820181905260248201527f53747261746567793a2063616c6c6572206973206e6f742074696d656c6f636b6044820152606401610a9e565b6060835160001415610cec575081610d18565b838051906020012083604051602001610d06929190613439565b60405160208183030381529060405290505b600080876001600160a01b03168784604051610d34919061346a565b60006040518083038185875af1925050503d8060008114610d71576040519150601f19603f3d011682016040523d82523d6000602084013e610d76565b606091505b509150915081610dee5760405162461bcd60e51b815260206004820152603d60248201527f53747261746567793a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e0000006064820152608401610a9e565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051610e2b93929190613486565b60405180910390a2925050505b949350505050565b600a546001600160a01b03163314610e6a5760405162461bcd60e51b8152600401610a9e906134bb565b505050565b610e77611dce565b6007546001600160a01b03908116600090815260096020908152604080832060055490941683529281529190208451610eb292860190612f8f565b506007546001600160a01b03908116600090815260096020908152604080832060065490941683529281529190208351610eee92850190612f8f565b506007546001600160a01b0316600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad38845282529091208251610f3692840190612f8f565b50505050565b610f44611dce565b610f4c611e28565b565b610f56611dce565b610f4c611f7f565b600a546000906001600160a01b03163314610f8b5760405162461bcd60e51b8152600401610a9e906134bb565b610f93611fd1565b610f9b61202b565b600454610fb3906001600160a01b0316333085612071565b600f54829015801590610fc857506000601054115b15610ff157610fee600f54610fe8601054866120dc90919063ffffffff16565b906120ef565b90505b601054610ffe90826120fb565b601055611009611e28565b6040518381527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a1905061104760018055565b92915050565b600080546001600160a01b03838116911614806110745750600b546001600160a01b031633145b806110475750600c546001600160a01b0316331492915050565b611096611dce565b610f4c612107565b6110a6611dce565b610f4c61239c565b6110b6611dce565b6001600160a01b0381166110f55760405162461bcd60e51b8152600401610a9e906020808252600490820152637a65726f60e01b604082015260600190565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000806111226118f2565b9050801561115a57600754611155906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883611163565b61115d565b60005b91505090565b6008546001600160a01b0384811660009081526009602090815260408083208785168452909152808220905163d06ca61f60e01b815291938493169163d06ca61f916111b49187919060040161353b565b600060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111f99190810190613554565b9050806001825161120a91906135f0565b8151811061121a5761121a613607565b60200260200101519150509392505050565b611234611dce565b600e55565b611241611dce565b610f4c60006125e8565b611253611dce565b6001600160a01b03808416600090815260096020908152604080832093861683529281529190208251610f3692840190612f8f565b60006010546000146112bc576112b7601054610fe8670de0b6b3a7640000600f546120dc90919063ffffffff16565b905090565b50670de0b6b3a764000090565b6112d1611dce565b610f4c612638565b6112e1611dce565b601255565b6001600160a01b03811661132d5760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69644164647265737360901b6044820152606401610a9e565b600a546001600160a01b03163314806113505750600c546001600160a01b031633145b6113ae5760405162461bcd60e51b815260206004820152602960248201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c6572206e6f726044820152682074696d656c6f636b60b81b6064820152608401610a9e565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006113da611559565b600480546040516370a0823160e01b815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611447919061361d565b6112b79190613636565b600b546001600160a01b03163314806114835750336114786000546001600160a01b031690565b6001600160a01b0316145b61149f5760405162461bcd60e51b8152600401610a9e9061364e565b60006114a9611117565b9050600e548110156114e95760405162461bcd60e51b81526020600482015260096024820152681d1bdbc81cdb585b1b60ba1b6044820152606401610a9e565b60006114f36119ec565b9050804710156115455760405162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f756768205320636f6c6c61746572616c0000000000000000006044820152606401610a9e565b61154d611876565b5050565b610f4c612675565b6002546003546040516393f1a40b60e01b8152600481019190915230602482015260009182916101009091046001600160a01b0316906393f1a40b906044016040805180830381865afa1580156115b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d89190613694565b5092915050565b600c546001600160a01b03163314806116255750600c546001600160a01b031615801561162557503361161a6000546001600160a01b031690565b6001600160a01b0316145b61165d5760405162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b6044820152606401610a9e565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611687611dce565b6001600160a01b0381166116c65760405162461bcd60e51b8152600401610a9e906020808252600490820152637a65726f60e01b604082015260600190565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6009602052826000526040600020602052816000526040600020818154811061171057600080fd5b6000918252602090912001546001600160a01b0316925083915050565b611735611dce565b60025460ff16156112d157610f4c611f7f565b611750611dce565b6007546001600160a01b03838116911614156117965760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610a9e565b6004546001600160a01b03838116911614156117dc5760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610a9e565b600a546001600160a01b03908116906117f890841682846126ea565b604080516001600160a01b038086168252602082018590528316918101919091527f22f92dfb4f608ea5db1e9bb08c0b4f5518af93b1259d335fe05900056096ab2c906060015b60405180910390a1505050565b611854611dce565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b61187e61202b565b600b546001600160a01b03163314806118b05750336118a56000546001600160a01b031690565b6001600160a01b0316145b6118cc5760405162461bcd60e51b8152600401610a9e9061364e565b6118d4612107565b6118dc61239c565b6118e461271a565b6118ec611e28565b42600d55565b6007546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561193f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611963919061361d565b600254600354604051634c4b4f4160e11b8152600481019190915230602482015291925061115d91839161010090046001600160a01b0316906398969e8290604401602060405180830381865afa1580156119c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e6919061361d565b906120fb565b6000806119f76118f2565b90506000611a88611a81670de0b6b3a7640000600260019054906101000a90046001600160a01b03166001600160a01b0316631a0e75646040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe8919061361d565b83906120dc565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b03919061361d565b9050611b236103e8610fe860135484611b1c9190613636565b85906120dc565b935050505090565b611b33611dce565b6001600160a01b038116611b985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a9e565b611ba1816125e8565b50565b600a546000906001600160a01b03163314611bd15760405162461bcd60e51b8152600401610a9e906134bb565b611bd9611fd1565b60008211611c1f5760405162461bcd60e51b815260206004820152601360248201527214dd1c985d1959de4e880857ddd85b9d105b5d606a1b6044820152606401610a9e565b600254600354604051630441a3e760e41b81526004810191909152602481018490526101009091046001600160a01b03169063441a3e7090604401600060405180830381600087803b158015611c7457600080fd5b505af1158015611c88573d6000803e3d6000fd5b5050600480546040516370a0823160e01b81523092810192909252600093506001600160a01b031691506370a0823190602401602060405180830381865afa158015611cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfc919061361d565b905080831115611d0a578092505b82600f541015611d1a57600f5492505b6000611d37600f54610fe8601054876120dc90919063ffffffff16565b9050601054811115611d4857506010545b601054611d5590826129aa565b601055600f54611d6590856129aa565b600f55600454611d7f906001600160a01b031633866126ea565b6040518481527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a191505061104760018055565b611dc6611dce565b610f4c61271a565b6000546001600160a01b03163314610f4c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a9e565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a919061361d565b600f54909150611eaa90826120fb565b600f55801561154d57600454600254611ed5916001600160a01b0390811691610100900416836129b6565b600254600354604051631c57762b60e31b81526004810191909152602481018390526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b158015611f2a57600080fd5b505af1158015611f3e573d6000803e3d6000fd5b505050507fc217459869eed80bfbe5c11e78ab58912eedfd106342671821b6e96d1615dc7f81604051611f7391815260200190565b60405180910390a15050565b611f876129ca565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015414156120245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a9e565b6002600155565b60025460ff1615610f4c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a9e565b6040516001600160a01b0380851660248301528316604482015260648101829052610f369085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612a13565b60006120e882846136b8565b9392505050565b60006120e882846136d7565b60006120e88284613636565b600254600354604051634c4b4f4160e11b8152600481019190915230602482015260009161010090046001600160a01b0316906398969e8290604401602060405180830381865afa158015612160573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612184919061361d565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ff919061361d565b90506000600260019054906101000a90046001600160a01b03166001600160a01b0316631a0e75646040518163ffffffff1660e01b8152600401602060405180830381865afa158015612256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227a919061361d565b905060006122b16103e8610fe8601354866122959190613636565b6122ab670de0b6b3a7640000610fe8888b6120dc565b906120dc565b9050478111156123035760405162461bcd60e51b815260206004820152601b60248201527f6e6f7420656e6f75676820736f6e696320636f6c6c61746572616c00000000006044820152606401610a9e565b6123226013546103e86123169190613636565b6122ab836103e86120ef565b61232c9082613636565b600254600354604051636ee3193160e11b8152600481019190915291925061010090046001600160a01b03169063ddc632629083906024016000604051808303818588803b15801561237d57600080fd5b505af1158015612391573d6000803e3d6000fd5b505050505050505050565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156123e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612409919061361d565b9050600081116124165750565b600754604080516001600160a01b039092168252602082018390527f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a910160405180910390a16000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d5919061361d565b9050612521600760009054906101000a90046001600160a01b031661251b6103e8610fe86015546013548761250a9190613636565b6125149190613636565b87906120dc565b30612ae8565b61253c6064610fe860786012546120dc90919063ffffffff16565b471061154d576016546012546000916001600160a01b03169061255f90476135f0565b604051600081818185875af1925050503d806000811461259b576040519150601f19603f3d011682016040523d82523d6000602084013e6125a0565b606091505b5050905080610e6a5760405162461bcd60e51b81526020600482015260146024820152737472616e7366657220666565206661696c65642160601b6044820152606401610a9e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61264061202b565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fb43390565b600034116126b35760405162461bcd60e51b815260206004820152600b60248201526a4d7573742073656e64205360a81b6044820152606401610a9e565b60405134815233907ff44da3c8956831d752012b0342d6776727f73af732575ff65ace4dc45068e3719060200160405180910390a2565b6040516001600160a01b038316602482015260448101829052610e6a90849063a9059cbb60e01b906064016120a5565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612787919061361d565b6007549091506127c2906127b9906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3884611163565b601154906120fb565b6011556005546007546001600160a01b0390811691161461280557600754600554612805916001600160a01b0390811691166127ff8460026120ef565b30612be1565b6006546007546001600160a01b0390811691161461283f5760075460065461283f916001600160a01b0390811691166127ff8460026120ef565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ac919061361d565b6006546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156128fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291e919061361d565b90506000821180156129305750600081115b15610e6a57600554600654612953916001600160a01b0390811691168484612cc4565b600554600654604080516001600160a01b039384168152602081018690529290911690820152606081018290527f44552da03f807ace3e5f27e98e694712dfe668c743514b28d4d9f5ab70574b0f9060800161183f565b60006120e882846135f0565b610e6a6001600160a01b0384168383612dc2565b60025460ff16610f4c5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a9e565b6000612a68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e6f9092919063ffffffff16565b9050805160001480612a89575080806020019051810190612a8991906136f9565b610e6a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a9e565b600854612b009084906001600160a01b0316846129b6565b6001600160a01b03831673039e2fb66102314ce7b64ce5ce3e5183bc94ad3814610e6a576008546001600160a01b03848116600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad3884529091528120919092169163ee2b38369185919085612b7a426107086120fb565b6040518663ffffffff1660e01b8152600401612b9a95949392919061371b565b6000604051808303816000875af1158015612bb9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f369190810190613554565b600854612bf99085906001600160a01b0316846129b6565b826001600160a01b0316846001600160a01b031614610f36576008546001600160a01b0385811660009081526009602090815260408083208885168452909152812091909216916338ed17399185919085612c56426107086120fb565b6040518663ffffffff1660e01b8152600401612c7695949392919061371b565b6000604051808303816000875af1158015612c95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612cbd9190810190613554565b5050505050565b600854612cdc9085906001600160a01b0316846129b6565b600854612cf49084906001600160a01b0316836129b6565b6008546001600160a01b031663e8e337008585858560008030612d19426107086120fb565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015612d95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db99190613757565b50505050505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612e12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e36919061361d565b9050610f368463095ea7b360e01b85612e4f8686613636565b6040516001600160a01b03909216602483015260448201526064016120a5565b6060610e38848460008585600080866001600160a01b03168587604051612e96919061346a565b60006040518083038185875af1925050503d8060008114612ed3576040519150601f19603f3d011682016040523d82523d6000602084013e612ed8565b606091505b5091509150612ee987838387612ef4565b979650505050505050565b60608315612f60578251612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a9e565b5081610e38565b610e388383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401610a9e9190613200565b828054828255906000526020600020908101928215612fe4579160200282015b82811115612fe457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612faf565b50612ff0929150612ff4565b5090565b5b80821115612ff05760008155600101612ff5565b6000806040838503121561301c57600080fd5b50508035926020909101359150565b60006020828403121561303d57600080fd5b5035919050565b80356001600160a01b038116811461305b57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561309f5761309f613060565b604052919050565b600067ffffffffffffffff8311156130c1576130c1613060565b6130d4601f8401601f1916602001613076565b90508281528383830111156130e857600080fd5b828260208301376000602084830101529392505050565b6000806000806080858703121561311557600080fd5b61311e85613044565b935060208501359250604085013567ffffffffffffffff8082111561314257600080fd5b818701915087601f83011261315657600080fd5b613165888335602085016130a7565b9350606087013591508082111561317b57600080fd5b508501601f8101871361318d57600080fd5b61319c878235602084016130a7565b91505092959194509250565b60005b838110156131c35781810151838201526020016131ab565b83811115610f365750506000910152565b600081518084526131ec8160208601602086016131a8565b601f01601f19169290920160200192915050565b6020815260006120e860208301846131d4565b60008060006060848603121561322857600080fd5b61323184613044565b95602085013595506040909401359392505050565b600067ffffffffffffffff82111561326057613260613060565b5060051b60200190565b600082601f83011261327b57600080fd5b8135602061329061328b83613246565b613076565b82815260059290921b840181019181810190868411156132af57600080fd5b8286015b848110156132d1576132c481613044565b83529183019183016132b3565b509695505050505050565b6000806000606084860312156132f157600080fd5b833567ffffffffffffffff8082111561330957600080fd5b6133158783880161326a565b9450602086013591508082111561332b57600080fd5b6133378783880161326a565b9350604086013591508082111561334d57600080fd5b5061335a8682870161326a565b9150509250925092565b6000806040838503121561337757600080fd5b61338083613044565b946020939093013593505050565b6000602082840312156133a057600080fd5b6120e882613044565b6000806000606084860312156133be57600080fd5b6133c784613044565b92506133d560208501613044565b9150604084013590509250925092565b6000806000606084860312156133fa57600080fd5b61340384613044565b925061341160208501613044565b9150604084013567ffffffffffffffff81111561342d57600080fd5b61335a8682870161326a565b6001600160e01b031983168152815160009061345c8160048501602087016131a8565b919091016004019392505050565b6000825161347c8184602087016131a8565b9190910192915050565b83815260606020820152600061349f60608301856131d4565b82810360408401526134b181856131d4565b9695505050505050565b6020808252601c908201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c657200000000604082015260600190565b6000815480845260208085019450836000528060002060005b838110156135305781546001600160a01b03168752958201956001918201910161350b565b509495945050505050565b828152604060208201526000610e3860408301846134f2565b6000602080838503121561356757600080fd5b825167ffffffffffffffff81111561357e57600080fd5b8301601f8101851361358f57600080fd5b805161359d61328b82613246565b81815260059190911b820183019083810190878311156135bc57600080fd5b928401925b82841015612ee9578351825292840192908401906135c1565b634e487b7160e01b600052601160045260246000fd5b600082821015613602576136026135da565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561362f57600080fd5b5051919050565b60008219821115613649576136496135da565b500190565b60208082526026908201527f53747261746567793a2063616c6c6572206973206e6f742074686520737472616040820152651d1959da5cdd60d21b606082015260800190565b600080604083850312156136a757600080fd5b505080516020909101519092909150565b60008160001904831182151516156136d2576136d26135da565b500290565b6000826136f457634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561370b57600080fd5b815180151581146120e857600080fd5b85815284602082015260a06040820152600061373a60a08301866134f2565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561376c57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212208cee5330c4b3634ccdc81220b33b400bb951e8d0ae2ba4afcae0cbe13729895d64736f6c634300080c0033000000000000000000000000ead049d2544e9b3d637d49a89f2669f109ab4e5800000000000000000000000064ae31f69b62f33f972a9f1b1dfd2181e7fdfa01000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e0000000000000000000000008252208f4dc4cdcdc723ace4c05c87348383ba6e000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c7250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b98eaa3f57c9c1671c4d7fa9cbe846bd39dff71a000000000000000000000000c52a41b03d1e5c68e9873effd29fdf71799c5ea0000000000000000000000000c52a41b03d1e5c68e9873effd29fdf71799c5ea0000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode
0x6080604052600436106103815760003560e01c80638da5cb5b116101cf578063c6d758cb11610101578063e7a036791161009a578063f2fde38b1161006c578063f2fde38b146109df578063f3fef3a3146109ff578063f69e204614610a1f578063f77c479114610a3457005b8063e7a0367914610973578063e7f67fb114610993578063e96c8bcf146109b3578063f1068454146109c957005b8063d7cb416f116100d3578063d7cb416f14610909578063db7a3c0f14610929578063e68b53641461093e578063e71984741461095357005b8063c6d758cb14610894578063c7b9d530146108b4578063d33219b4146108d4578063d389800f146108f457005b8063aeaad0dc11610173578063c0762e5e11610145578063c0762e5e1461081f578063c11b61c71461083f578063c4ae31681461085f578063c5f956af1461087457005b8063aeaad0dc146107cc578063ba0c108f146107d4578063bb97517e146107ea578063bdacb303146107ff57005b80639fc33a9f116101ac5780639fc33a9f14610767578063a0fab1191461078c578063ad7a672f146107a2578063ae335695146107b757005b80638da5cb5b1461071357806392eefe9b146107315780639b9713bb1461075157005b80635afbbaab116102b357806370a3cb111161024c5780637ff36fbe1161021e5780637ff36fbe146106a85780638456cb59146106c8578063856b6dc1146106dd57806385f02dd6146106fd57005b806370a3cb111461063e578063715018a61461065e57806376f2892f1461067357806377c7b8fc1461069357005b80636605bfda116102855780636605bfda146105d357806367d03db8146105f35780636dfa8d9914610608578063701f66041461061e57005b80635afbbaab146105685780635c975abb1461057e5780635d4093591461059657806362779e15146105be57005b806327d9e85e1161032557806344a3955e116102f757806344a3955e146104ed57806347e7ef241461050357806351b699cd146105235780635a34928e1461055357005b806327d9e85e1461048d57806336e9332d146104ad5780633f4ba83a146104c257806342da4eb3146104d757005b80631fe4a6861161035e5780631fe4a686146103f25780632224fa251461042a57806325baef53146104575780632717eff31461047757005b8063061c7d481461038a5780630b78f9c0146103b25780631a2315b8146103d257005b3661038857005b005b34801561039657600080fd5b5061039f601481565b6040519081526020015b60405180910390f35b3480156103be57600080fd5b506103886103cd366004613009565b610a54565b3480156103de57600080fd5b506103886103ed36600461302b565b610afb565b3480156103fe57600080fd5b50600b54610412906001600160a01b031681565b6040516001600160a01b0390911681526020016103a9565b34801561043657600080fd5b5061044a6104453660046130ff565b610c7c565b6040516103a99190613200565b34801561046357600080fd5b50610388610472366004613213565b610e40565b34801561048357600080fd5b5061039f6103e881565b34801561049957600080fd5b506103886104a83660046132dc565b610e6f565b3480156104b957600080fd5b50610388610f3c565b3480156104ce57600080fd5b50610388610f4e565b3480156104e357600080fd5b5061039f600f5481565b3480156104f957600080fd5b5061039f60105481565b34801561050f57600080fd5b5061039f61051e366004613364565b610f5e565b34801561052f57600080fd5b5061054361053e36600461338e565b61104d565b60405190151581526020016103a9565b34801561055f57600080fd5b5061038861108e565b34801561057457600080fd5b5061039f60135481565b34801561058a57600080fd5b5060025460ff16610543565b3480156105a257600080fd5b5061041273039e2fb66102314ce7b64ce5ce3e5183bc94ad3881565b3480156105ca57600080fd5b5061038861109e565b3480156105df57600080fd5b506103886105ee36600461338e565b6110ae565b3480156105ff57600080fd5b5061039f611117565b34801561061457600080fd5b5061039f60115481565b34801561062a57600080fd5b5061039f6106393660046133a9565b611163565b34801561064a57600080fd5b5061038861065936600461302b565b61122c565b34801561066a57600080fd5b50610388611239565b34801561067f57600080fd5b5061038861068e3660046133e5565b61124b565b34801561069f57600080fd5b5061039f611288565b3480156106b457600080fd5b50600554610412906001600160a01b031681565b3480156106d457600080fd5b506103886112c9565b3480156106e957600080fd5b506103886106f836600461302b565b6112d9565b34801561070957600080fd5b5061039f60155481565b34801561071f57600080fd5b506000546001600160a01b0316610412565b34801561073d57600080fd5b5061038861074c36600461338e565b6112e6565b34801561075d57600080fd5b5061039f60145481565b34801561077357600080fd5b506002546104129061010090046001600160a01b031681565b34801561079857600080fd5b5061039f600e5481565b3480156107ae57600080fd5b5061039f6113d0565b3480156107c357600080fd5b50610388611451565b610388611551565b3480156107e057600080fd5b5061039f600d5481565b3480156107f657600080fd5b5061039f611559565b34801561080b57600080fd5b5061038861081a36600461338e565b6115df565b34801561082b57600080fd5b5061038861083a36600461338e565b61167f565b34801561084b57600080fd5b5061041261085a3660046133a9565b6116e8565b34801561086b57600080fd5b5061038861172d565b34801561088057600080fd5b50601654610412906001600160a01b031681565b3480156108a057600080fd5b506103886108af366004613364565b611748565b3480156108c057600080fd5b506103886108cf36600461338e565b61184c565b3480156108e057600080fd5b50600c54610412906001600160a01b031681565b34801561090057600080fd5b50610388611876565b34801561091557600080fd5b50600654610412906001600160a01b031681565b34801561093557600080fd5b5061039f6118f2565b34801561094a57600080fd5b5061039f6119ec565b34801561095f57600080fd5b50600754610412906001600160a01b031681565b34801561097f57600080fd5b50600454610412906001600160a01b031681565b34801561099f57600080fd5b50600854610412906001600160a01b031681565b3480156109bf57600080fd5b5061039f60125481565b3480156109d557600080fd5b5061039f60035481565b3480156109eb57600080fd5b506103886109fa36600461338e565b611b2b565b348015610a0b57600080fd5b5061039f610a1a366004613364565b611ba4565b348015610a2b57600080fd5b50610388611dbe565b348015610a4057600080fd5b50600a54610412906001600160a01b031681565b610a5c611dce565b6014821115610aa75760405162461bcd60e51b81526020600482015260126024820152710a6e8e4c2e8cacef27440e8dede40d0d2ced60731b60448201526064015b60405180910390fd5b60158290556014546013541115610af55760405162461bcd60e51b81526020600482015260126024820152710a6e8e4c2e8cacef27440e8dede40d0d2ced60731b6044820152606401610a9e565b60135550565b610b03611dce565b60008111610b535760405162461bcd60e51b815260206004820181905260248201527f416d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152606401610a9e565b80471015610bae5760405162461bcd60e51b815260206004820152602260248201527f496e73756666696369656e7420532062616c616e636520696e20636f6e74726160448201526118dd60f21b6064820152608401610a9e565b6016546040516000916001600160a01b03169083908381818185875af1925050503d8060008114610bfb576040519150601f19603f3d011682016040523d82523d6000602084013e610c00565b606091505b5050905080610c435760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a191c985dc819985a5b1959608a1b6044820152606401610a9e565b60405182815233907f3ab94c2d450999c961d10ed65cef0fc04929ce8a38e411793ca2cb0fef9036279060200160405180910390a25050565b600c546060906001600160a01b03163314610cd95760405162461bcd60e51b815260206004820181905260248201527f53747261746567793a2063616c6c6572206973206e6f742074696d656c6f636b6044820152606401610a9e565b6060835160001415610cec575081610d18565b838051906020012083604051602001610d06929190613439565b60405160208183030381529060405290505b600080876001600160a01b03168784604051610d34919061346a565b60006040518083038185875af1925050503d8060008114610d71576040519150601f19603f3d011682016040523d82523d6000602084013e610d76565b606091505b509150915081610dee5760405162461bcd60e51b815260206004820152603d60248201527f53747261746567793a3a657865637574655472616e73616374696f6e3a20547260448201527f616e73616374696f6e20657865637574696f6e2072657665727465642e0000006064820152608401610a9e565b876001600160a01b03167f88405ca50016c636e025868e263efe5a9f63bf11cc45404f7616394c7dc389d0888888604051610e2b93929190613486565b60405180910390a2925050505b949350505050565b600a546001600160a01b03163314610e6a5760405162461bcd60e51b8152600401610a9e906134bb565b505050565b610e77611dce565b6007546001600160a01b03908116600090815260096020908152604080832060055490941683529281529190208451610eb292860190612f8f565b506007546001600160a01b03908116600090815260096020908152604080832060065490941683529281529190208351610eee92850190612f8f565b506007546001600160a01b0316600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad38845282529091208251610f3692840190612f8f565b50505050565b610f44611dce565b610f4c611e28565b565b610f56611dce565b610f4c611f7f565b600a546000906001600160a01b03163314610f8b5760405162461bcd60e51b8152600401610a9e906134bb565b610f93611fd1565b610f9b61202b565b600454610fb3906001600160a01b0316333085612071565b600f54829015801590610fc857506000601054115b15610ff157610fee600f54610fe8601054866120dc90919063ffffffff16565b906120ef565b90505b601054610ffe90826120fb565b601055611009611e28565b6040518381527f4d6ce1e535dbade1c23defba91e23b8f791ce5edc0cc320257a2b364e4e384269060200160405180910390a1905061104760018055565b92915050565b600080546001600160a01b03838116911614806110745750600b546001600160a01b031633145b806110475750600c546001600160a01b0316331492915050565b611096611dce565b610f4c612107565b6110a6611dce565b610f4c61239c565b6110b6611dce565b6001600160a01b0381166110f55760405162461bcd60e51b8152600401610a9e906020808252600490820152637a65726f60e01b604082015260600190565b601680546001600160a01b0319166001600160a01b0392909216919091179055565b6000806111226118f2565b9050801561115a57600754611155906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3883611163565b61115d565b60005b91505090565b6008546001600160a01b0384811660009081526009602090815260408083208785168452909152808220905163d06ca61f60e01b815291938493169163d06ca61f916111b49187919060040161353b565b600060405180830381865afa1580156111d1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111f99190810190613554565b9050806001825161120a91906135f0565b8151811061121a5761121a613607565b60200260200101519150509392505050565b611234611dce565b600e55565b611241611dce565b610f4c60006125e8565b611253611dce565b6001600160a01b03808416600090815260096020908152604080832093861683529281529190208251610f3692840190612f8f565b60006010546000146112bc576112b7601054610fe8670de0b6b3a7640000600f546120dc90919063ffffffff16565b905090565b50670de0b6b3a764000090565b6112d1611dce565b610f4c612638565b6112e1611dce565b601255565b6001600160a01b03811661132d5760405162461bcd60e51b815260206004820152600e60248201526d696e76616c69644164647265737360901b6044820152606401610a9e565b600a546001600160a01b03163314806113505750600c546001600160a01b031633145b6113ae5760405162461bcd60e51b815260206004820152602960248201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c6572206e6f726044820152682074696d656c6f636b60b81b6064820152608401610a9e565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006113da611559565b600480546040516370a0823160e01b815230928101929092526001600160a01b0316906370a0823190602401602060405180830381865afa158015611423573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611447919061361d565b6112b79190613636565b600b546001600160a01b03163314806114835750336114786000546001600160a01b031690565b6001600160a01b0316145b61149f5760405162461bcd60e51b8152600401610a9e9061364e565b60006114a9611117565b9050600e548110156114e95760405162461bcd60e51b81526020600482015260096024820152681d1bdbc81cdb585b1b60ba1b6044820152606401610a9e565b60006114f36119ec565b9050804710156115455760405162461bcd60e51b815260206004820152601760248201527f6e6f7420656e6f756768205320636f6c6c61746572616c0000000000000000006044820152606401610a9e565b61154d611876565b5050565b610f4c612675565b6002546003546040516393f1a40b60e01b8152600481019190915230602482015260009182916101009091046001600160a01b0316906393f1a40b906044016040805180830381865afa1580156115b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d89190613694565b5092915050565b600c546001600160a01b03163314806116255750600c546001600160a01b031615801561162557503361161a6000546001600160a01b031690565b6001600160a01b0316145b61165d5760405162461bcd60e51b81526020600482015260096024820152682174696d656c6f636b60b81b6044820152606401610a9e565b600c80546001600160a01b0319166001600160a01b0392909216919091179055565b611687611dce565b6001600160a01b0381166116c65760405162461bcd60e51b8152600401610a9e906020808252600490820152637a65726f60e01b604082015260600190565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b6009602052826000526040600020602052816000526040600020818154811061171057600080fd5b6000918252602090912001546001600160a01b0316925083915050565b611735611dce565b60025460ff16156112d157610f4c611f7f565b611750611dce565b6007546001600160a01b03838116911614156117965760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610a9e565b6004546001600160a01b03838116911614156117dc5760405162461bcd60e51b8152602060048201526005602482015264217361666560d81b6044820152606401610a9e565b600a546001600160a01b03908116906117f890841682846126ea565b604080516001600160a01b038086168252602082018590528316918101919091527f22f92dfb4f608ea5db1e9bb08c0b4f5518af93b1259d335fe05900056096ab2c906060015b60405180910390a1505050565b611854611dce565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b61187e61202b565b600b546001600160a01b03163314806118b05750336118a56000546001600160a01b031690565b6001600160a01b0316145b6118cc5760405162461bcd60e51b8152600401610a9e9061364e565b6118d4612107565b6118dc61239c565b6118e461271a565b6118ec611e28565b42600d55565b6007546040516370a0823160e01b815230600482015260009182916001600160a01b03909116906370a0823190602401602060405180830381865afa15801561193f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611963919061361d565b600254600354604051634c4b4f4160e11b8152600481019190915230602482015291925061115d91839161010090046001600160a01b0316906398969e8290604401602060405180830381865afa1580156119c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119e6919061361d565b906120fb565b6000806119f76118f2565b90506000611a88611a81670de0b6b3a7640000600260019054906101000a90046001600160a01b03166001600160a01b0316631a0e75646040518163ffffffff1660e01b8152600401602060405180830381865afa158015611a5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fe8919061361d565b83906120dc565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611adf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b03919061361d565b9050611b236103e8610fe860135484611b1c9190613636565b85906120dc565b935050505090565b611b33611dce565b6001600160a01b038116611b985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a9e565b611ba1816125e8565b50565b600a546000906001600160a01b03163314611bd15760405162461bcd60e51b8152600401610a9e906134bb565b611bd9611fd1565b60008211611c1f5760405162461bcd60e51b815260206004820152601360248201527214dd1c985d1959de4e880857ddd85b9d105b5d606a1b6044820152606401610a9e565b600254600354604051630441a3e760e41b81526004810191909152602481018490526101009091046001600160a01b03169063441a3e7090604401600060405180830381600087803b158015611c7457600080fd5b505af1158015611c88573d6000803e3d6000fd5b5050600480546040516370a0823160e01b81523092810192909252600093506001600160a01b031691506370a0823190602401602060405180830381865afa158015611cd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cfc919061361d565b905080831115611d0a578092505b82600f541015611d1a57600f5492505b6000611d37600f54610fe8601054876120dc90919063ffffffff16565b9050601054811115611d4857506010545b601054611d5590826129aa565b601055600f54611d6590856129aa565b600f55600454611d7f906001600160a01b031633866126ea565b6040518481527f5b6b431d4476a211bb7d41c20d1aab9ae2321deee0d20be3d9fc9b1093fa6e3d9060200160405180910390a191505061104760018055565b611dc6611dce565b610f4c61271a565b6000546001600160a01b03163314610f4c5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a9e565b600480546040516370a0823160e01b815230928101929092526001600160a01b03169060009082906370a0823190602401602060405180830381865afa158015611e76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9a919061361d565b600f54909150611eaa90826120fb565b600f55801561154d57600454600254611ed5916001600160a01b0390811691610100900416836129b6565b600254600354604051631c57762b60e31b81526004810191909152602481018390526101009091046001600160a01b03169063e2bbb15890604401600060405180830381600087803b158015611f2a57600080fd5b505af1158015611f3e573d6000803e3d6000fd5b505050507fc217459869eed80bfbe5c11e78ab58912eedfd106342671821b6e96d1615dc7f81604051611f7391815260200190565b60405180910390a15050565b611f876129ca565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600260015414156120245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a9e565b6002600155565b60025460ff1615610f4c5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a9e565b6040516001600160a01b0380851660248301528316604482015260648101829052610f369085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152612a13565b60006120e882846136b8565b9392505050565b60006120e882846136d7565b60006120e88284613636565b600254600354604051634c4b4f4160e11b8152600481019190915230602482015260009161010090046001600160a01b0316906398969e8290604401602060405180830381865afa158015612160573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612184919061361d565b90506000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ff919061361d565b90506000600260019054906101000a90046001600160a01b03166001600160a01b0316631a0e75646040518163ffffffff1660e01b8152600401602060405180830381865afa158015612256573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061227a919061361d565b905060006122b16103e8610fe8601354866122959190613636565b6122ab670de0b6b3a7640000610fe8888b6120dc565b906120dc565b9050478111156123035760405162461bcd60e51b815260206004820152601b60248201527f6e6f7420656e6f75676820736f6e696320636f6c6c61746572616c00000000006044820152606401610a9e565b6123226013546103e86123169190613636565b6122ab836103e86120ef565b61232c9082613636565b600254600354604051636ee3193160e11b8152600481019190915291925061010090046001600160a01b03169063ddc632629083906024016000604051808303818588803b15801561237d57600080fd5b505af1158015612391573d6000803e3d6000fd5b505050505050505050565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156123e5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612409919061361d565b9050600081116124165750565b600754604080516001600160a01b039092168252602082018390527f053fa1fc52294a40b4ff1a988765bd298c00caa24d685cc3f767dcfde254ef9a910160405180910390a16000600260019054906101000a90046001600160a01b03166001600160a01b031663ba44a45a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156124b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124d5919061361d565b9050612521600760009054906101000a90046001600160a01b031661251b6103e8610fe86015546013548761250a9190613636565b6125149190613636565b87906120dc565b30612ae8565b61253c6064610fe860786012546120dc90919063ffffffff16565b471061154d576016546012546000916001600160a01b03169061255f90476135f0565b604051600081818185875af1925050503d806000811461259b576040519150601f19603f3d011682016040523d82523d6000602084013e6125a0565b606091505b5050905080610e6a5760405162461bcd60e51b81526020600482015260146024820152737472616e7366657220666565206661696c65642160601b6044820152606401610a9e565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b61264061202b565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611fb43390565b600034116126b35760405162461bcd60e51b815260206004820152600b60248201526a4d7573742073656e64205360a81b6044820152606401610a9e565b60405134815233907ff44da3c8956831d752012b0342d6776727f73af732575ff65ace4dc45068e3719060200160405180910390a2565b6040516001600160a01b038316602482015260448101829052610e6a90849063a9059cbb60e01b906064016120a5565b6007546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612763573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612787919061361d565b6007549091506127c2906127b9906001600160a01b031673039e2fb66102314ce7b64ce5ce3e5183bc94ad3884611163565b601154906120fb565b6011556005546007546001600160a01b0390811691161461280557600754600554612805916001600160a01b0390811691166127ff8460026120ef565b30612be1565b6006546007546001600160a01b0390811691161461283f5760075460065461283f916001600160a01b0390811691166127ff8460026120ef565b6005546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612888573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ac919061361d565b6006546040516370a0823160e01b81523060048201529192506000916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156128fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061291e919061361d565b90506000821180156129305750600081115b15610e6a57600554600654612953916001600160a01b0390811691168484612cc4565b600554600654604080516001600160a01b039384168152602081018690529290911690820152606081018290527f44552da03f807ace3e5f27e98e694712dfe668c743514b28d4d9f5ab70574b0f9060800161183f565b60006120e882846135f0565b610e6a6001600160a01b0384168383612dc2565b60025460ff16610f4c5760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a9e565b6000612a68826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e6f9092919063ffffffff16565b9050805160001480612a89575080806020019051810190612a8991906136f9565b610e6a5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610a9e565b600854612b009084906001600160a01b0316846129b6565b6001600160a01b03831673039e2fb66102314ce7b64ce5ce3e5183bc94ad3814610e6a576008546001600160a01b03848116600090815260096020908152604080832073039e2fb66102314ce7b64ce5ce3e5183bc94ad3884529091528120919092169163ee2b38369185919085612b7a426107086120fb565b6040518663ffffffff1660e01b8152600401612b9a95949392919061371b565b6000604051808303816000875af1158015612bb9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610f369190810190613554565b600854612bf99085906001600160a01b0316846129b6565b826001600160a01b0316846001600160a01b031614610f36576008546001600160a01b0385811660009081526009602090815260408083208885168452909152812091909216916338ed17399185919085612c56426107086120fb565b6040518663ffffffff1660e01b8152600401612c7695949392919061371b565b6000604051808303816000875af1158015612c95573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612cbd9190810190613554565b5050505050565b600854612cdc9085906001600160a01b0316846129b6565b600854612cf49084906001600160a01b0316836129b6565b6008546001600160a01b031663e8e337008585858560008030612d19426107086120fb565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af1158015612d95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db99190613757565b50505050505050565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015612e12573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e36919061361d565b9050610f368463095ea7b360e01b85612e4f8686613636565b6040516001600160a01b03909216602483015260448201526064016120a5565b6060610e38848460008585600080866001600160a01b03168587604051612e96919061346a565b60006040518083038185875af1925050503d8060008114612ed3576040519150601f19603f3d011682016040523d82523d6000602084013e612ed8565b606091505b5091509150612ee987838387612ef4565b979650505050505050565b60608315612f60578251612f59576001600160a01b0385163b612f595760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610a9e565b5081610e38565b610e388383815115612f755781518083602001fd5b8060405162461bcd60e51b8152600401610a9e9190613200565b828054828255906000526020600020908101928215612fe4579160200282015b82811115612fe457825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612faf565b50612ff0929150612ff4565b5090565b5b80821115612ff05760008155600101612ff5565b6000806040838503121561301c57600080fd5b50508035926020909101359150565b60006020828403121561303d57600080fd5b5035919050565b80356001600160a01b038116811461305b57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561309f5761309f613060565b604052919050565b600067ffffffffffffffff8311156130c1576130c1613060565b6130d4601f8401601f1916602001613076565b90508281528383830111156130e857600080fd5b828260208301376000602084830101529392505050565b6000806000806080858703121561311557600080fd5b61311e85613044565b935060208501359250604085013567ffffffffffffffff8082111561314257600080fd5b818701915087601f83011261315657600080fd5b613165888335602085016130a7565b9350606087013591508082111561317b57600080fd5b508501601f8101871361318d57600080fd5b61319c878235602084016130a7565b91505092959194509250565b60005b838110156131c35781810151838201526020016131ab565b83811115610f365750506000910152565b600081518084526131ec8160208601602086016131a8565b601f01601f19169290920160200192915050565b6020815260006120e860208301846131d4565b60008060006060848603121561322857600080fd5b61323184613044565b95602085013595506040909401359392505050565b600067ffffffffffffffff82111561326057613260613060565b5060051b60200190565b600082601f83011261327b57600080fd5b8135602061329061328b83613246565b613076565b82815260059290921b840181019181810190868411156132af57600080fd5b8286015b848110156132d1576132c481613044565b83529183019183016132b3565b509695505050505050565b6000806000606084860312156132f157600080fd5b833567ffffffffffffffff8082111561330957600080fd5b6133158783880161326a565b9450602086013591508082111561332b57600080fd5b6133378783880161326a565b9350604086013591508082111561334d57600080fd5b5061335a8682870161326a565b9150509250925092565b6000806040838503121561337757600080fd5b61338083613044565b946020939093013593505050565b6000602082840312156133a057600080fd5b6120e882613044565b6000806000606084860312156133be57600080fd5b6133c784613044565b92506133d560208501613044565b9150604084013590509250925092565b6000806000606084860312156133fa57600080fd5b61340384613044565b925061341160208501613044565b9150604084013567ffffffffffffffff81111561342d57600080fd5b61335a8682870161326a565b6001600160e01b031983168152815160009061345c8160048501602087016131a8565b919091016004019392505050565b6000825161347c8184602087016131a8565b9190910192915050565b83815260606020820152600061349f60608301856131d4565b82810360408401526134b181856131d4565b9695505050505050565b6020808252601c908201527f63616c6c6572206973206e6f742074686520636f6e74726f6c6c657200000000604082015260600190565b6000815480845260208085019450836000528060002060005b838110156135305781546001600160a01b03168752958201956001918201910161350b565b509495945050505050565b828152604060208201526000610e3860408301846134f2565b6000602080838503121561356757600080fd5b825167ffffffffffffffff81111561357e57600080fd5b8301601f8101851361358f57600080fd5b805161359d61328b82613246565b81815260059190911b820183019083810190878311156135bc57600080fd5b928401925b82841015612ee9578351825292840192908401906135c1565b634e487b7160e01b600052601160045260246000fd5b600082821015613602576136026135da565b500390565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561362f57600080fd5b5051919050565b60008219821115613649576136496135da565b500190565b60208082526026908201527f53747261746567793a2063616c6c6572206973206e6f742074686520737472616040820152651d1959da5cdd60d21b606082015260800190565b600080604083850312156136a757600080fd5b505080516020909101519092909150565b60008160001904831182151516156136d2576136d26135da565b500290565b6000826136f457634e487b7160e01b600052601260045260246000fd5b500490565b60006020828403121561370b57600080fd5b815180151581146120e857600080fd5b85815284602082015260a06040820152600061373a60a08301866134f2565b6001600160a01b0394909416606083015250608001529392505050565b60008060006060848603121561376c57600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212208cee5330c4b3634ccdc81220b33b400bb951e8d0ae2ba4afcae0cbe13729895d64736f6c634300080c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ead049d2544e9b3d637d49a89f2669f109ab4e5800000000000000000000000064ae31f69b62f33f972a9f1b1dfd2181e7fdfa01000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e0000000000000000000000008252208f4dc4cdcdc723ace4c05c87348383ba6e000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c7250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000b98eaa3f57c9c1671c4d7fa9cbe846bd39dff71a000000000000000000000000c52a41b03d1e5c68e9873effd29fdf71799c5ea0000000000000000000000000c52a41b03d1e5c68e9873effd29fdf71799c5ea0000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
-----Decoded View---------------
Arg [0] : _controller (address): 0xEAd049d2544e9b3d637D49A89F2669F109ab4E58
Arg [1] : _timelock (address): 0x64AE31f69B62f33f972A9f1B1dfD2181E7FdFa01
Arg [2] : _treasuryAddress (address): 0xc547E8dD3844fb5BC178120a121b365Ea790774E
Arg [3] : _farmContractAddress (address): 0x8252208F4Dc4CDcdC723ace4C05C87348383BA6e
Arg [4] : _dexRouterAddress (address): 0xC159D904cA8C2449df0AE4836197278f2f68C725
Arg [5] : _pid (uint256): 0
Arg [6] : _wantAddress (address): 0xB98eAa3f57C9C1671c4d7Fa9CBe846bd39dFF71A
Arg [7] : _earnedAddress (address): 0xc52A41B03d1E5C68E9873EfFd29fDf71799C5eA0
Arg [8] : _token0 (address): 0xc52A41B03d1E5C68E9873EfFd29fDf71799C5eA0
Arg [9] : _token1 (address): 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 000000000000000000000000ead049d2544e9b3d637d49a89f2669f109ab4e58
Arg [1] : 00000000000000000000000064ae31f69b62f33f972a9f1b1dfd2181e7fdfa01
Arg [2] : 000000000000000000000000c547e8dd3844fb5bc178120a121b365ea790774e
Arg [3] : 0000000000000000000000008252208f4dc4cdcdc723ace4c05c87348383ba6e
Arg [4] : 000000000000000000000000c159d904ca8c2449df0ae4836197278f2f68c725
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000b98eaa3f57c9c1671c4d7fa9cbe846bd39dff71a
Arg [7] : 000000000000000000000000c52a41b03d1e5c68e9873effd29fdf71799c5ea0
Arg [8] : 000000000000000000000000c52a41b03d1e5c68e9873effd29fdf71799c5ea0
Arg [9] : 000000000000000000000000039e2fb66102314ce7b64ce5ce3e5183bc94ad38
Deployed Bytecode Sourcemap
42097:16850:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43301:44;;;;;;;;;;;;43343:2;43301:44;;;;;160:25:1;;;148:2;133:18;43301:44:0;;;;;;;;53585:343;;;;;;;;;;-1:-1:-1;53585:343:0;;;;;:::i;:::-;;:::i;56642:388::-;;;;;;;;;;-1:-1:-1;56642:388:0;;;;;:::i;:::-;;:::i;42732:25::-;;;;;;;;;;-1:-1:-1;42732:25:0;;;;-1:-1:-1;;;;;42732:25:0;;;;;;-1:-1:-1;;;;;798:32:1;;;780:51;;768:2;753:18;42732:25:0;634:203:1;58224:720:0;;;;;;;;;;-1:-1:-1;58224:720:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;57533:89::-;;;;;;;;;;-1:-1:-1;57533:89:0;;;;;:::i;:::-;;:::i;43236:47::-;;;;;;;;;;;;43279:4;43236:47;;54596:395;;;;;;;;;;-1:-1:-1;54596:395:0;;;;;:::i;:::-;;:::i;47823:59::-;;;;;;;;;;;;;:::i;53396:67::-;;;;;;;;;;;;;:::i;42891:43::-;;;;;;;;;;;;;;;;42941:39;;;;;;;;;;;;;;;;47269:546;;;;;;;;;;-1:-1:-1;47269:546:0;;;;;:::i;:::-;;:::i;45526:172::-;;;;;;;;;;-1:-1:-1;45526:172:0;;;;;:::i;:::-;;:::i;:::-;;;6168:14:1;;6161:22;6143:41;;6131:2;6116:18;45526:172:0;6003:187:1;47890:71:0;;;;;;;;;;;;;:::i;43090:37::-;;;;;;;;;;;;;;;;38230:86;;;;;;;;;;-1:-1:-1;38301:7:0;;;;38230:86;;42611:80;;;;;;;;;;;;42648:42;42611:80;;48044:65;;;;;;;;;;;;;:::i;53936:184::-;;;;;;;;;;-1:-1:-1;53936:184:0;;;;;:::i;:::-;;:::i;53120:197::-;;;;;;;;;;;;;:::i;42987:30::-;;;;;;;;;;;;;;;;52564:300;;;;;;;;;;-1:-1:-1;52564:300:0;;;;;:::i;:::-;;:::i;54316:118::-;;;;;;;;;;-1:-1:-1;54316:118:0;;;;;:::i;:::-;;:::i;32683:103::-;;;;;;;;;;;;;:::i;54999:168::-;;;;;;;;;;-1:-1:-1;54999:168:0;;;;;:::i;:::-;;:::i;46850:169::-;;;;;;;;;;;;;:::i;42362:37::-;;;;;;;;;;-1:-1:-1;42362:37:0;;;;-1:-1:-1;;;;;42362:37:0;;;53325:63;;;;;;;;;;;;;:::i;54442:146::-;;;;;;;;;;-1:-1:-1;54442:146:0;;;;;:::i;:::-;;:::i;43191:33::-;;;;;;;;;;;;;;;;32042:87;;;;;;;;;;-1:-1:-1;32088:7:0;32115:6;-1:-1:-1;;;;;32115:6:0;32042:87;;57675:274;;;;;;;;;;-1:-1:-1;57675:274:0;;;;;:::i;:::-;;:::i;43140:39::-;;;;;;;;;;;;;;;;42254:34;;;;;;;;;;-1:-1:-1;42254:34:0;;;;;;;-1:-1:-1;;;;;42254:34:0;;;42834:40;;;;;;;;;;;;;;;;46689:153;;;;;;;;;;;;;:::i;46149:338::-;;;;;;;;;;;;;:::i;56426:67::-;;;:::i;42796:31::-;;;;;;;;;;;;;;;;46495:186;;;;;;;;;;;;;:::i;57957:196::-;;;;;;;;;;-1:-1:-1;57957:196:0;;;;;:::i;:::-;;:::i;54128:180::-;;;;;;;;;;-1:-1:-1;54128:180:0;;;;;:::i;:::-;;:::i;42535:67::-;;;;;;;;;;-1:-1:-1;42535:67:0;;;;;:::i;:::-;;:::i;57416:109::-;;;;;;;;;;;;;:::i;43354:30::-;;;;;;;;;;-1:-1:-1;43354:30:0;;;;-1:-1:-1;;;;;43354:30:0;;;57038:370;;;;;;;;;;-1:-1:-1;57038:370:0;;;;;:::i;:::-;;:::i;53471:106::-;;;;;;;;;;-1:-1:-1;53471:106:0;;;;;:::i;:::-;;:::i;42764:23::-;;;;;;;;;;-1:-1:-1;42764:23:0;;;;-1:-1:-1;;;;;42764:23:0;;;52356:200;;;;;;;;;;;;;:::i;42406:37::-;;;;;;;;;;-1:-1:-1;42406:37:0;;;;-1:-1:-1;;;;;42406:37:0;;;52872:240;;;;;;;;;;;;;:::i;45706:435::-;;;;;;;;;;;;;:::i;42450:37::-;;;;;;;;;;-1:-1:-1;42450:37:0;;;;-1:-1:-1;;;;;42450:37:0;;;42320:35;;;;;;;;;;-1:-1:-1;42320:35:0;;;;-1:-1:-1;;;;;42320:35:0;;;42494:31;;;;;;;;;;-1:-1:-1;42494:31:0;;;;-1:-1:-1;;;;;42494:31:0;;;43026:48;;;;;;;;;;;;;;;;42295:18;;;;;;;;;;;;;;;;32941:201;;;;;;;;;;-1:-1:-1;32941:201:0;;;;;:::i;:::-;;:::i;48534:928::-;;;;;;;;;;-1:-1:-1;48534:928:0;;;;;:::i;:::-;;:::i;47969:67::-;;;;;;;;;;;;;:::i;42700:25::-;;;;;;;;;;-1:-1:-1;42700:25:0;;;;-1:-1:-1;;;;;42700:25:0;;;53585:343;31928:13;:11;:13::i;:::-;43343:2:::1;53692:14;:33;;53684:64;;;::::0;-1:-1:-1;;;53684:64:0;;7231:2:1;53684:64:0::1;::::0;::::1;7213:21:1::0;7270:2;7250:18;;;7243:30;-1:-1:-1;;;7289:18:1;;;7282:48;7347:18;;53684:64:0::1;;;;;;;;;53759:13;:30:::0;;;53829:19:::1;::::0;53808:17:::1;::::0;:40:::1;;53800:71;;;::::0;-1:-1:-1;;;53800:71:0;;7231:2:1;53800:71:0::1;::::0;::::1;7213:21:1::0;7270:2;7250:18;;;7243:30;-1:-1:-1;;;7289:18:1;;;7282:48;7347:18;;53800:71:0::1;7029:342:1::0;53800:71:0::1;53882:17;:38:::0;-1:-1:-1;53585:343:0:o;56642:388::-;31928:13;:11;:13::i;:::-;56724:1:::1;56715:6;:10;56707:55;;;::::0;-1:-1:-1;;;56707:55:0;;7578:2:1;56707:55:0::1;::::0;::::1;7560:21:1::0;;;7597:18;;;7590:30;7656:34;7636:18;;;7629:62;7708:18;;56707:55:0::1;7376:356:1::0;56707:55:0::1;56806:6;56781:21;:31;;56773:78;;;::::0;-1:-1:-1;;;56773:78:0;;7939:2:1;56773:78:0::1;::::0;::::1;7921:21:1::0;7978:2;7958:18;;;7951:30;8017:34;7997:18;;;7990:62;-1:-1:-1;;;8068:18:1;;;8061:32;8110:19;;56773:78:0::1;7737:398:1::0;56773:78:0::1;56891:15;::::0;56883:48:::1;::::0;56865:12:::1;::::0;-1:-1:-1;;;;;56891:15:0::1;::::0;56920:6;;56865:12;56883:48;56865:12;56883:48;56920:6;56891:15;56883:48:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56864:67;;;56950:7;56942:35;;;::::0;-1:-1:-1;;;56942:35:0;;8552:2:1;56942:35:0::1;::::0;::::1;8534:21:1::0;8591:2;8571:18;;;8564:30;-1:-1:-1;;;8610:18:1;;;8603:45;8665:18;;56942:35:0::1;8350:339:1::0;56942:35:0::1;56993:29;::::0;160:25:1;;;57003:10:0::1;::::0;56993:29:::1;::::0;148:2:1;133:18;56993:29:0::1;;;;;;;56696:334;56642:388:::0;:::o;58224:720::-;45439:8;;58358:12;;-1:-1:-1;;;;;45439:8:0;45451:10;45439:22;45431:67;;;;-1:-1:-1;;;45431:67:0;;8896:2:1;45431:67:0;;;8878:21:1;;;8915:18;;;8908:30;8974:34;8954:18;;;8947:62;9026:18;;45431:67:0;8694:356:1;45431:67:0;58383:21:::1;58427:9;58421:23;58448:1;58421:28;58417:179;;;-1:-1:-1::0;58477:4:0;58417:179:::1;;;58565:9;58549:27;;;;;;58579:4;58525:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58514:70;;58417:179;58669:12;58683:23:::0;58710:6:::1;-1:-1:-1::0;;;;;58710:11:0::1;58730:5;58737:8;58710:36;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58668:78;;;;58765:7;58757:81;;;::::0;-1:-1:-1;;;58757:81:0;;9912:2:1;58757:81:0::1;::::0;::::1;9894:21:1::0;9951:2;9931:18;;;9924:30;9990:34;9970:18;;;9963:62;10061:31;10041:18;;;10034:59;10110:19;;58757:81:0::1;9710:425:1::0;58757:81:0::1;58875:6;-1:-1:-1::0;;;;;58856:50:0::1;;58883:5;58890:9;58901:4;58856:50;;;;;;;;:::i;:::-;;;;;;;;58926:10:::0;-1:-1:-1;;;45509:1:0::1;58224:720:::0;;;;;;:::o;57533:89::-;45146:10;;-1:-1:-1;;;;;45146:10:0;45160;45146:24;45138:65;;;;-1:-1:-1;;;45138:65:0;;;;;;;:::i;:::-;57533:89;;;:::o;54596:395::-;31928:13;:11;:13::i;:::-;54802::::1;::::0;-1:-1:-1;;;;;54802:13:0;;::::1;54791:25;::::0;;;:10:::1;:25;::::0;;;;;;;54817:13:::1;::::0;;;::::1;54791:40:::0;;;;;;;;:62;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;54875:13:0::1;::::0;-1:-1:-1;;;;;54875:13:0;;::::1;54864:25;::::0;;;:10:::1;:25;::::0;;;;;;;54890:13:::1;::::0;;;::::1;54864:40:::0;;;;;;;;:62;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;54948:13:0::1;::::0;-1:-1:-1;;;;;54948:13:0::1;54937:25;::::0;;;:10:::1;:25;::::0;;;;;;;42648:42:::1;54937:29:::0;;;;;;;:46;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;54596:395:::0;;;:::o;47823:59::-;31928:13;:11;:13::i;:::-;47867:7:::1;:5;:7::i;:::-;47823:59::o:0;53396:67::-;31928:13;:11;:13::i;:::-;53445:10:::1;:8;:10::i;47269:546::-:0;45146:10;;47382:7;;-1:-1:-1;;;;;45146:10:0;45160;45146:24;45138:65;;;;-1:-1:-1;;;45138:65:0;;;;;;;:::i;:::-;35751:21:::1;:19;:21::i;:::-;37835:19:::2;:17;:19::i;:::-;47409:11:::3;::::0;47402:82:::3;::::0;-1:-1:-1;;;;;47409:11:0::3;47447:10;47468:4;47475:8:::0;47402:36:::3;:82::i;:::-;47542:15;::::0;47519:8;;47542:19;;;;:38:::3;;;47579:1;47565:11;;:15;47542:38;47538:131;;;47611:46;47641:15;;47611:25;47624:11;;47611:8;:12;;:25;;;;:::i;:::-;:29:::0;::::3;:46::i;:::-;47597:60;;47538:131;47693:11;::::0;:28:::3;::::0;47709:11;47693:15:::3;:28::i;:::-;47679:11;:42:::0;47734:7:::3;:5;:7::i;:::-;47759:17;::::0;160:25:1;;;47759:17:0::3;::::0;148:2:1;133:18;47759:17:0::3;;;;;;;47796:11:::0;-1:-1:-1;35795:20:0::1;35189:1:::0;36315:22;;36132:213;35795:20:::1;47269:546:::0;;;;:::o;45526:172::-;45587:4;32115:6;;-1:-1:-1;;;;;45612:19:0;;;32115:6;;45612:19;;45611:51;;-1:-1:-1;45651:10:0;;-1:-1:-1;;;;;45651:10:0;45637;:24;45611:51;:79;;;-1:-1:-1;45681:8:0;;-1:-1:-1;;;;;45681:8:0;45667:10;:22;45604:86;45526:172;-1:-1:-1;;45526:172:0:o;47890:71::-;31928:13;:11;:13::i;:::-;47943:10:::1;:8;:10::i;48044:65::-:0;31928:13;:11;:13::i;:::-;48091:10:::1;:8;:10::i;53936:184::-:0;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;54028:30:0;::::1;54020:47;;;;-1:-1:-1::0;;;54020:47:0::1;;;;;;11154:2:1::0;11136:21;;;11193:1;11173:18;;;11166:29;-1:-1:-1;;;11226:2:1;11211:18;;11204:34;11270:2;11255:18;;10952:327;54020:47:0::1;54078:15;:34:::0;;-1:-1:-1;;;;;;54078:34:0::1;-1:-1:-1::0;;;;;54078:34:0;;;::::1;::::0;;;::::1;::::0;;53936:184::o;53120:197::-;53173:7;53193:16;53212;:14;:16::i;:::-;53193:35;-1:-1:-1;53247:13:0;;53246:63;;53281:13;;53268:41;;-1:-1:-1;;;;;53281:13:0;42648:42;53300:8;53268:12;:41::i;:::-;53246:63;;;53264:1;53246:63;53239:70;;;53120:197;:::o;52564:300::-;52727:16;;-1:-1:-1;;;;;52773:23:0;;;52672:7;52773:23;;;:10;:23;;;;;;;;:37;;;;;;;;;;;52719:92;;-1:-1:-1;;;52719:92:0;;52672:7;;;;52727:16;;52719:39;;:92;;52759:12;;52773:37;52719:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;52719:92:0;;;;;;;;;;;;:::i;:::-;52692:119;;52829:7;52854:1;52837:7;:14;:18;;;;:::i;:::-;52829:27;;;;;;;;:::i;:::-;;;;;;;52822:34;;;52564:300;;;;;:::o;54316:118::-;31928:13;:11;:13::i;:::-;54396::::1;:30:::0;54316:118::o;32683:103::-;31928:13;:11;:13::i;:::-;32748:30:::1;32775:1;32748:18;:30::i;54999:168::-:0;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;55114:23:0;;::::1;;::::0;;;:10:::1;:23;::::0;;;;;;;:37;;::::1;::::0;;;;;;;;:45;;::::1;::::0;;::::1;::::0;::::1;:::i;46850:169::-:0;46914:7;46942:11;;46957:1;46942:16;46941:70;;46969:42;46999:11;;46969:25;46989:4;46969:15;;:19;;:25;;;;:::i;:42::-;46934:77;;46850:169;:::o;46941:70::-;-1:-1:-1;46962:4:0;;46850:169::o;53325:63::-;31928:13;:11;:13::i;:::-;53372:8:::1;:6;:8::i;54442:146::-:0;31928:13;:11;:13::i;:::-;54536:20:::1;:44:::0;54442:146::o;57675:274::-;-1:-1:-1;;;;;57747:25:0;;57739:52;;;;-1:-1:-1;;;57739:52:0;;13608:2:1;57739:52:0;;;13590:21:1;13647:2;13627:18;;;13620:30;-1:-1:-1;;;13666:18:1;;;13659:44;13720:18;;57739:52:0;13406:338:1;57739:52:0;57810:10;;-1:-1:-1;;;;;57810:10:0;57824;57810:24;;:50;;-1:-1:-1;57838:8:0;;-1:-1:-1;;;;;57838:8:0;57850:10;57838:22;57810:50;57802:104;;;;-1:-1:-1;;;57802:104:0;;13951:2:1;57802:104:0;;;13933:21:1;13990:2;13970:18;;;13963:30;14029:34;14009:18;;;14002:62;-1:-1:-1;;;14080:18:1;;;14073:39;14129:19;;57802:104:0;13749:405:1;57802:104:0;57917:10;:24;;-1:-1:-1;;;;;;57917:24:0;-1:-1:-1;;;;;57917:24:0;;;;;;;;;;57675:274::o;46689:153::-;46745:7;46819:15;:13;:15::i;:::-;46779:11;;;46772:44;;-1:-1:-1;;;46772:44:0;;46810:4;46772:44;;;780:51:1;;;;-1:-1:-1;;;;;46779:11:0;;46772:29;;753:18:1;;46772:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;;;;:::i;46149:338::-;45276:10;;-1:-1:-1;;;;;45276:10:0;45290;45276:24;;:49;;-1:-1:-1;45315:10:0;45304:7;32088;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;45304:7;-1:-1:-1;;;;;45304:21:0;;45276:49;45268:100;;;;-1:-1:-1;;;45268:100:0;;;;;;;:::i;:::-;46202:29:::1;46234:22;:20;:22::i;:::-;46202:54;;46300:13;;46275:21;:38;;46267:60;;;::::0;-1:-1:-1;;;46267:60:0;;15090:2:1;46267:60:0::1;::::0;::::1;15072:21:1::0;15129:1;15109:18;;;15102:29;-1:-1:-1;;;15147:18:1;;;15140:39;15196:18;;46267:60:0::1;14888:332:1::0;46267:60:0::1;46338:17;46359:20;:18;:20::i;:::-;46338:41;;46425:9;46400:21;:34;;46392:70;;;::::0;-1:-1:-1;;;46392:70:0;;15427:2:1;46392:70:0::1;::::0;::::1;15409:21:1::0;15466:2;15446:18;;;15439:30;15505:25;15485:18;;;15478:53;15548:18;;46392:70:0::1;15225:347:1::0;46392:70:0::1;46473:6;:4;:6::i;:::-;46191:296;;46149:338::o:0;56426:67::-;56474:11;:9;:11::i;46495:186::-;46600:19;;46630:3;;46590:59;;-1:-1:-1;;;46590:59:0;;;;;15751:25:1;;;;46643:4:0;15792:18:1;;;15785:60;46550:7:0;;;;46600:19;;;;-1:-1:-1;;;;;46600:19:0;;46590:39;;15724:18:1;;46590:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;46570:79:0;46495:186;-1:-1:-1;;46495:186:0:o;57957:196::-;58025:8;;-1:-1:-1;;;;;58025:8:0;58037:10;58025:22;;:75;;-1:-1:-1;58052:8:0;;-1:-1:-1;;;;;58052:8:0;:22;:47;;;;-1:-1:-1;58089:10:0;58078:7;32088;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;58078:7;-1:-1:-1;;;;;58078:21:0;;58052:47;58017:97;;;;-1:-1:-1;;;58017:97:0;;16308:2:1;58017:97:0;;;16290:21:1;16347:1;16327:18;;;16320:29;-1:-1:-1;;;16365:18:1;;;16358:39;16414:18;;58017:97:0;16106:332:1;58017:97:0;58125:8;:20;;-1:-1:-1;;;;;;58125:20:0;-1:-1:-1;;;;;58125:20:0;;;;;;;;;;57957:196::o;54128:180::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;54219:28:0;::::1;54211:45;;;;-1:-1:-1::0;;;54211:45:0::1;;;;;;11154:2:1::0;11136:21;;;11193:1;11173:18;;;11166:29;-1:-1:-1;;;11226:2:1;11211:18;;11204:34;11270:2;11255:18;;10952:327;54211:45:0::1;54267:16;:33:::0;;-1:-1:-1;;;;;;54267:33:0::1;-1:-1:-1::0;;;;;54267:33:0;;;::::1;::::0;;;::::1;::::0;;54128:180::o;42535:67::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42535:67:0;;-1:-1:-1;42535:67:0;;-1:-1:-1;;42535:67:0:o;57416:109::-;31928:13;:11;:13::i;:::-;38301:7;;;;57469:48:::1;;;57483:10;:8;:10::i;57038:370::-:0;31928:13;:11;:13::i;:::-;57158::::1;::::0;-1:-1:-1;;;;;57148:23:0;;::::1;57158:13:::0;::::1;57148:23;;57140:41;;;::::0;-1:-1:-1;;;57140:41:0;;16645:2:1;57140:41:0::1;::::0;::::1;16627:21:1::0;16684:1;16664:18;;;16657:29;-1:-1:-1;;;16702:18:1;;;16695:35;16747:18;;57140:41:0::1;16443:328:1::0;57140:41:0::1;57210:11;::::0;-1:-1:-1;;;;;57200:21:0;;::::1;57210:11:::0;::::1;57200:21;;57192:39;;;::::0;-1:-1:-1;;;57192:39:0;;16645:2:1;57192:39:0::1;::::0;::::1;16627:21:1::0;16684:1;16664:18;;;16657:29;-1:-1:-1;;;16702:18:1;;;16695:35;16747:18;;57192:39:0::1;16443:328:1::0;57192:39:0::1;57264:10;::::0;-1:-1:-1;;;;;57264:10:0;;::::1;::::0;57285:49:::1;::::0;:27;::::1;57264:10:::0;57326:7;57285:27:::1;:49::i;:::-;57350:50;::::0;;-1:-1:-1;;;;;17034:15:1;;;17016:34;;17081:2;17066:18;;17059:34;;;17129:15;;17109:18;;;17102:43;;;;57350:50:0::1;::::0;16966:2:1;16951:18;57350:50:0::1;;;;;;;;57129:279;57038:370:::0;;:::o;53471:106::-;31928:13;:11;:13::i;:::-;53545:10:::1;:24:::0;;-1:-1:-1;;;;;;53545:24:0::1;-1:-1:-1::0;;;;;53545:24:0;;;::::1;::::0;;;::::1;::::0;;53471:106::o;52356:200::-;37835:19;:17;:19::i;:::-;45276:10:::1;::::0;-1:-1:-1;;;;;45276:10:0::1;45290;45276:24;::::0;:49:::1;;-1:-1:-1::0;45315:10:0::1;45304:7;32088::::0;32115:6;-1:-1:-1;;;;;32115:6:0;;32042:87;45304:7:::1;-1:-1:-1::0;;;;;45304:21:0::1;;45276:49;45268:100;;;;-1:-1:-1::0;;;45268:100:0::1;;;;;;;:::i;:::-;52428:10:::2;:8;:10::i;:::-;52451;:8;:10::i;:::-;52474:11;:9;:11::i;:::-;52498:7;:5;:7::i;:::-;52533:15;52518:12;:30:::0;52356:200::o;52872:240::-;52967:13;;52960:46;;-1:-1:-1;;;52960:46:0;;53000:4;52960:46;;;780:51:1;52919:7:0;;;;-1:-1:-1;;;;;52967:13:0;;;;52960:31;;753:18:1;;52960:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53034:19;;53069:3;;53024:64;;-1:-1:-1;;;53024:64:0;;;;;15751:25:1;;;;53082:4:0;15792:18:1;;;15785:60;52939:67:0;;-1:-1:-1;53024:80:0;;52939:67;;53034:19;;;-1:-1:-1;;;;;53034:19:0;;53024:44;;15724:18:1;;53024:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;:80::i;45706:435::-;45757:7;45777:21;45801:16;:14;:16::i;:::-;45777:40;;45828:29;45860:80;45878:61;45934:4;45888:19;;;;;;;;;-1:-1:-1;;;;;45888:19:0;-1:-1:-1;;;;;45878:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:61::-;45860:13;;:17;:80::i;:::-;45828:112;;45951:29;45993:19;;;;;;;;;-1:-1:-1;;;;;45993:19:0;-1:-1:-1;;;;;45983:52:0;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;45951:86;;46055:78;46128:4;46055:68;46105:17;;46081:21;:41;;;;:::i;:::-;46055:21;;:25;:68::i;:78::-;46048:85;;;;;45706:435;:::o;32941:201::-;31928:13;:11;:13::i;:::-;-1:-1:-1;;;;;33030:22:0;::::1;33022:73;;;::::0;-1:-1:-1;;;33022:73:0;;17358:2:1;33022:73:0::1;::::0;::::1;17340:21:1::0;17397:2;17377:18;;;17370:30;17436:34;17416:18;;;17409:62;-1:-1:-1;;;17487:18:1;;;17480:36;17533:19;;33022:73:0::1;17156:402:1::0;33022:73:0::1;33106:28;33125:8;33106:18;:28::i;:::-;32941:201:::0;:::o;48534:928::-;45146:10;;48634:7;;-1:-1:-1;;;;;45146:10:0;45160;45146:24;45138:65;;;;-1:-1:-1;;;45138:65:0;;;;;;;:::i;:::-;35751:21:::1;:19;:21::i;:::-;48673:1:::2;48662:8;:12;48654:44;;;::::0;-1:-1:-1;;;48654:44:0;;17765:2:1;48654:44:0::2;::::0;::::2;17747:21:1::0;17804:2;17784:18;;;17777:30;-1:-1:-1;;;17823:18:1;;;17816:49;17882:18;;48654:44:0::2;17563:343:1::0;48654:44:0::2;48721:19;::::0;48751:3:::2;::::0;48711:54:::2;::::0;-1:-1:-1;;;48711:54:0;;::::2;::::0;::::2;18085:25:1::0;;;;18126:18;;;18119:34;;;48721:19:0::2;::::0;;::::2;-1:-1:-1::0;;;;;48721:19:0::2;::::0;48711:39:::2;::::0;18058:18:1;;48711:54:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;48803:11:0::2;::::0;;48796:44:::2;::::0;-1:-1:-1;;;48796:44:0;;48834:4:::2;48796:44:::0;;::::2;780:51:1::0;;;;48778:15:0::2;::::0;-1:-1:-1;;;;;;48803:11:0::2;::::0;-1:-1:-1;48796:29:0::2;::::0;753:18:1;;48796:44:0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48778:62;;48866:7;48855:8;:18;48851:69;;;48901:7;48890:18;;48851:69;48954:8;48936:15;;:26;48932:85;;;48990:15;;48979:26;;48932:85;49029:21;49053:46;49083:15;;49053:25;49066:11;;49053:8;:12;;:25;;;;:::i;:46::-;49029:70;;49130:11;;49114:13;:27;49110:87;;;-1:-1:-1::0;49174:11:0::2;::::0;49110:87:::2;49221:11;::::0;:30:::2;::::0;49237:13;49221:15:::2;:30::i;:::-;49207:11;:44:::0;49280:15:::2;::::0;:29:::2;::::0;49300:8;49280:19:::2;:29::i;:::-;49262:15;:47:::0;49329:11:::2;::::0;49322:63:::2;::::0;-1:-1:-1;;;;;49329:11:0::2;49363:10;49376:8:::0;49322:32:::2;:63::i;:::-;49403:18;::::0;160:25:1;;;49403:18:0::2;::::0;148:2:1;133:18;49403::0::2;;;;;;;49441:13:::0;-1:-1:-1;;35795:20:0::1;35189:1:::0;36315:22;;36132:213;47969:67;31928:13;:11;:13::i;:::-;48017:11:::1;:9;:11::i;32207:132::-:0;32088:7;32115:6;-1:-1:-1;;;;;32115:6:0;30652:10;32271:23;32263:68;;;;-1:-1:-1;;;32263:68:0;;18366:2:1;32263:68:0;;;18348:21:1;;;18385:18;;;18378:30;18444:34;18424:18;;;18417:62;18496:18;;32263:68:0;18164:356:1;48117:409:0;48176:11;;;48217:30;;-1:-1:-1;;;48217:30:0;;48241:4;48217:30;;;780:51:1;;;;-1:-1:-1;;;;;48176:11:0;;48154:12;;48176:11;;48217:15;;753:18:1;;48217:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48276:15;;48199:48;;-1:-1:-1;48276:28:0;;48199:48;48276:19;:28::i;:::-;48258:15;:46;48319:11;;48315:204;;48365:11;;48378:19;;48347:60;;-1:-1:-1;;;;;48365:11:0;;;;;48378:19;;;48399:7;48347:17;:60::i;:::-;48432:19;;48461:3;;48422:52;;-1:-1:-1;;;48422:52:0;;;;;18085:25:1;;;;18126:18;;;18119:34;;;48432:19:0;;;;-1:-1:-1;;;;;48432:19:0;;48422:38;;18058:18:1;;48422:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48494:13;48499:7;48494:13;;;;160:25:1;;148:2;133:18;;14:177;48494:13:0;;;;;;;;48143:383;;48117:409::o;39085:120::-;38094:16;:14;:16::i;:::-;39144:7:::1;:15:::0;;-1:-1:-1;;39144:15:0::1;::::0;;39175:22:::1;30652:10:::0;39184:12:::1;39175:22;::::0;-1:-1:-1;;;;;798:32:1;;;780:51;;768:2;753:18;39175:22:0::1;;;;;;;39085:120::o:0;35831:293::-;35233:1;35965:7;;:19;;35957:63;;;;-1:-1:-1;;;35957:63:0;;18727:2:1;35957:63:0;;;18709:21:1;18766:2;18746:18;;;18739:30;18805:33;18785:18;;;18778:61;18856:18;;35957:63:0;18525:355:1;35957:63:0;35233:1;36098:7;:18;35831:293::o;38389:108::-;38301:7;;;;38459:9;38451:38;;;;-1:-1:-1;;;38451:38:0;;19087:2:1;38451:38:0;;;19069:21:1;19126:2;19106:18;;;19099:30;-1:-1:-1;;;19145:18:1;;;19138:46;19201:18;;38451:38:0;18885:340:1;17420:205:0;17548:68;;-1:-1:-1;;;;;19488:15:1;;;17548:68:0;;;19470:34:1;19540:15;;19520:18;;;19513:43;19572:18;;;19565:34;;;17521:96:0;;17541:5;;-1:-1:-1;;;17571:27:0;19405:18:1;;17548:68:0;;;;-1:-1:-1;;17548:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17548:68:0;-1:-1:-1;;;;;;17548:68:0;;;;;;;;;;17521:19;:96::i;26636:98::-;26694:7;26721:5;26725:1;26721;:5;:::i;:::-;26714:12;26636:98;-1:-1:-1;;;26636:98:0:o;27035:::-;27093:7;27120:5;27124:1;27120;:5;:::i;25898:98::-;25956:7;25983:5;25987:1;25983;:5;:::i;49470:900::-;49595:19;;49630:3;;49585:64;;-1:-1:-1;;;49585:64:0;;;;;15751:25:1;;;;49643:4:0;15792:18:1;;;15785:60;49561:21:0;;49595:19;;;-1:-1:-1;;;;;49595:19:0;;49585:44;;15724:18:1;;49585:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49561:88;;49660:29;49702:19;;;;;;;;;-1:-1:-1;;;;;49702:19:0;-1:-1:-1;;;;;49692:52:0;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49660:86;;49759:27;49799:19;;;;;;;;;-1:-1:-1;;;;;49799:19:0;-1:-1:-1;;;;;49789:49:0;;:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49759:81;;49853:24;49880:107;49982:4;49880:97;49959:17;;49935:21;:41;;;;:::i;:::-;49881:48;49924:4;49881:38;:19;49905:13;49881:23;:38::i;:48::-;49880:54;;:97::i;:107::-;49853:134;;50026:21;50006:16;:41;;49998:81;;;;-1:-1:-1;;;49998:81:0;;20207:2:1;49998:81:0;;;20189:21:1;20246:2;20226:18;;;20219:30;20285:29;20265:18;;;20258:57;20332:18;;49998:81:0;20005:351:1;49998:81:0;50145:56;50183:17;;50176:4;:24;;;;:::i;:::-;50145:26;:16;50166:4;50145:20;:26::i;:56::-;50125:76;;;;:::i;:::-;50304:19;;50358:3;;50294:68;;-1:-1:-1;;;50294:68:0;;;;;160:25:1;;;;50125:76:0;;-1:-1:-1;50304:19:0;;;-1:-1:-1;;;;;50304:19:0;;50294:38;;50125:76;;133:18:1;;50294:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49499:871;;;;49470:900::o;50378:822::-;50448:13;;50441:46;;-1:-1:-1;;;50441:46:0;;50481:4;50441:46;;;780:51:1;50418:20:0;;-1:-1:-1;;;;;50448:13:0;;50441:31;;753:18:1;;50441:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50418:69;;50518:1;50502:12;:17;50498:56;;50536:7;50378:822::o;50498:56::-;50576:13;;50569:35;;;-1:-1:-1;;;;;50576:13:0;;;20535:51:1;;20617:2;20602:18;;20595:34;;;50569:35:0;;20508:18:1;50569:35:0;;;;;;;50697:29;50739:19;;;;;;;;;-1:-1:-1;;;;;50739:19:0;-1:-1:-1;;;;;50729:52:0;;:54;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50697:86;;50794:130;50808:13;;;;;;;;;-1:-1:-1;;;;;50808:13:0;50823:85;50903:4;50823:75;50884:13;;50864:17;;50840:21;:41;;;;:::i;:::-;:57;;;;:::i;:::-;50823:12;;:16;:75::i;:85::-;50918:4;50794:13;:130::i;:::-;50966:38;51000:3;50966:29;50991:3;50966:20;;:24;;:29;;;;:::i;:38::-;50941:21;:63;50937:256;;51048:15;;51101:20;;51022:12;;-1:-1:-1;;;;;51048:15:0;;51077:44;;:21;:44;:::i;:::-;51040:86;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51021:105;;;51149:7;51141:40;;;;-1:-1:-1;;;51141:40:0;;20842:2:1;51141:40:0;;;20824:21:1;20881:2;20861:18;;;20854:30;-1:-1:-1;;;20900:18:1;;;20893:50;20960:18;;51141:40:0;20640:344:1;33302:191:0;33376:16;33395:6;;-1:-1:-1;;;;;33412:17:0;;;-1:-1:-1;;;;;;33412:17:0;;;;;;33445:40;;33395:6;;;;;;;33445:40;;33376:16;33445:40;33365:128;33302:191;:::o;38826:118::-;37835:19;:17;:19::i;:::-;38886:7:::1;:14:::0;;-1:-1:-1;;38886:14:0::1;38896:4;38886:14;::::0;;38916:20:::1;38923:12;30652:10:::0;;30572:98;56501:133;56562:1;56550:9;:13;56542:37;;;;-1:-1:-1;;;56542:37:0;;21191:2:1;56542:37:0;;;21173:21:1;21230:2;21210:18;;;21203:30;-1:-1:-1;;;21249:18:1;;;21242:41;21300:18;;56542:37:0;20989:335:1;56542:37:0;56595:31;;56616:9;160:25:1;;56604:10:0;;56595:31;;148:2:1;133:18;56595:31:0;;;;;;;56501:133::o;16998:177::-;17108:58;;-1:-1:-1;;;;;20553:32:1;;17108:58:0;;;20535:51:1;20602:18;;;20595:34;;;17081:86:0;;17101:5;;-1:-1:-1;;;17131:23:0;20508:18:1;;17108:58:0;20361:274:1;51208:1030:0;51330:13;;51323:46;;-1:-1:-1;;;51323:46:0;;51363:4;51323:46;;;780:51:1;51300:20:0;;-1:-1:-1;;;;;51330:13:0;;51323:31;;753:18:1;;51323:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51460:13;;51300:69;;-1:-1:-1;51431:62:0;;51447:45;;-1:-1:-1;;;;;51460:13:0;42648:42;51300:69;51447:12;:45::i;:::-;51431:11;;;:15;:62::i;:::-;51417:11;:76;51527:13;;51510;;-1:-1:-1;;;;;51510:13:0;;;51527;;51510:30;51506:146;;51575:13;;51590;;51557:83;;-1:-1:-1;;;;;51575:13:0;;;;51590;51605:19;:12;51622:1;51605:16;:19::i;:::-;51634:4;51557:17;:83::i;:::-;51685:13;;51668;;-1:-1:-1;;;;;51668:13:0;;;51685;;51668:30;51664:146;;51733:13;;51748;;51715:83;;-1:-1:-1;;;;;51733:13:0;;;;51748;51763:19;:12;51780:1;51763:16;:19::i;51715:83::-;51896:13;;51889:46;;-1:-1:-1;;;51889:46:0;;51929:4;51889:46;;;780:51:1;51869:17:0;;-1:-1:-1;;;;;51896:13:0;;51889:31;;753:18:1;;51889:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51973:13;;51966:46;;-1:-1:-1;;;51966:46:0;;52006:4;51966:46;;;780:51:1;51869:66:0;;-1:-1:-1;51946:17:0;;-1:-1:-1;;;;;51973:13:0;;;;51966:31;;753:18:1;;51966:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51946:66;;52039:1;52027:9;:13;:30;;;;;52056:1;52044:9;:13;52027:30;52023:208;;;52088:13;;52103;;52074:65;;-1:-1:-1;;;;;52088:13:0;;;;52103;52118:9;52129;52074:13;:65::i;:::-;52168:13;;52194;;52159:60;;;-1:-1:-1;;;;;52168:13:0;;;21598:34:1;;21663:2;21648:18;;21641:34;;;52194:13:0;;;;21691:18:1;;;21684:43;21758:2;21743:18;;21736:34;;;52159:60:0;;21547:3:1;21532:19;52159:60:0;21329:447:1;26279:98:0;26337:7;26364:5;26368:1;26364;:5;:::i;47027:194::-;47157:56;-1:-1:-1;;;;;47157:35:0;;47193:7;47202:10;47157:35;:56::i;38574:108::-;38301:7;;;;38633:41;;;;-1:-1:-1;;;38633:41:0;;21983:2:1;38633:41:0;;;21965:21:1;22022:2;22002:18;;;21995:30;-1:-1:-1;;;22041:18:1;;;22034:50;22101:18;;38633:41:0;21781:344:1;21344:649:0;21768:23;21794:69;21822:4;21794:69;;;;;;;;;;;;;;;;;21802:5;-1:-1:-1;;;;;21794:27:0;;;:69;;;;;:::i;:::-;21768:95;;21882:10;:17;21903:1;21882:22;:56;;;;21919:10;21908:30;;;;;;;;;;;;:::i;:::-;21874:111;;;;-1:-1:-1;;;21874:111:0;;22614:2:1;21874:111:0;;;22596:21:1;22653:2;22633:18;;;22626:30;22692:34;22672:18;;;22665:62;-1:-1:-1;;;22743:18:1;;;22736:40;22793:19;;21874:111:0;22412:406:1;55177:335:0;55301:16;;55270:57;;55288:11;;-1:-1:-1;;;;;55301:16:0;55319:7;55270:17;:57::i;:::-;-1:-1:-1;;;;;55342:17:0;;42648:42;55342:17;55338:167;;55384:16;;-1:-1:-1;;;;;55434:23:0;;;55384:16;55434:23;;;:10;:23;;;;;;;;42648:42;55434:27;;;;;;;55384:16;;;;;55376:45;;55422:7;;55384:16;55463:2;55467:25;:15;55487:4;55467:19;:25::i;:::-;55376:117;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55376:117:0;;;;;;;;;;;;:::i;55520:386::-;55670:16;;55639:57;;55657:11;;-1:-1:-1;;;;;55670:16:0;55688:7;55639:17;:57::i;:::-;55726:12;-1:-1:-1;;;;;55711:27:0;:11;-1:-1:-1;;;;;55711:27:0;;55707:192;;55763:16;;-1:-1:-1;;;;;55818:23:0;;;55763:16;55818:23;;;:10;:23;;;;;;;;:37;;;;;;;;;;55763:16;;;;;55755:50;;55806:7;;55763:16;55857:2;55861:25;:15;55881:4;55861:19;:25::i;:::-;55755:132;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55755:132:0;;;;;;;;;;;;:::i;:::-;;55520:386;;;;:::o;55914:417::-;56068:16;;56041:61;;56059:7;;-1:-1:-1;;;;;56068:16:0;56086:15;56041:17;:61::i;:::-;56140:16;;56113:61;;56131:7;;-1:-1:-1;;;;;56140:16:0;56158:15;56113:17;:61::i;:::-;56193:16;;-1:-1:-1;;;;;56193:16:0;56185:38;56224:7;56233;56242:15;56259;56193:16;;56290:4;56297:25;:15;56317:4;56297:19;:25::i;:::-;56185:138;;;;;;-1:-1:-1;;;;;;56185:138:0;;;-1:-1:-1;;;;;23830:15:1;;;56185:138:0;;;23812:34:1;23882:15;;;23862:18;;;23855:43;23914:18;;;23907:34;;;;23957:18;;;23950:34;;;;24000:19;;;23993:35;;;;24044:19;;;24037:35;24109:15;;;24088:19;;;24081:44;24141:19;;;24134:35;;;;23746:19;;56185:138:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;55914:417;;;;:::o;18673:283::-;18793:39;;-1:-1:-1;;;18793:39:0;;18817:4;18793:39;;;24703:34:1;-1:-1:-1;;;;;24773:15:1;;;24753:18;;;24746:43;18770:20:0;;18793:15;;;;;;24638:18:1;;18793:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18770:62;-1:-1:-1;18843:105:0;18863:5;-1:-1:-1;;;18917:7:0;18926:20;18941:5;18770:62;18926:20;:::i;:::-;18870:77;;-1:-1:-1;;;;;20553:32:1;;;18870:77:0;;;20535:51:1;20602:18;;;20595:34;20508:18;;18870:77:0;20361:274:1;10795:229:0;10932:12;10964:52;10986:6;10994:4;11000:1;11003:12;10932;12169;12183:23;12210:6;-1:-1:-1;;;;;12210:11:0;12229:5;12236:4;12210:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12168:73;;;;12259:69;12286:6;12294:7;12303:10;12315:12;12259:26;:69::i;:::-;12252:76;11881:455;-1:-1:-1;;;;;;;11881:455:0:o;14454:644::-;14639:12;14668:7;14664:427;;;14696:17;;14692:290;;-1:-1:-1;;;;;8335:19:0;;;14906:60;;;;-1:-1:-1;;;14906:60:0;;25409:2:1;14906:60:0;;;25391:21:1;25448:2;25428:18;;;25421:30;25487:31;25467:18;;;25460:59;25536:18;;14906:60:0;25207:353:1;14906:60:0;-1:-1:-1;15003:10:0;14996:17;;14664:427;15046:33;15054:10;15066:12;15801:17;;:21;15797:388;;16033:10;16027:17;16090:15;16077:10;16073:2;16069:19;16062:44;15797:388;16160:12;16153:20;;-1:-1:-1;;;16153:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:248:1;264:6;272;325:2;313:9;304:7;300:23;296:32;293:52;;;341:1;338;331:12;293:52;-1:-1:-1;;364:23:1;;;434:2;419:18;;;406:32;;-1:-1:-1;196:248:1:o;449:180::-;508:6;561:2;549:9;540:7;536:23;532:32;529:52;;;577:1;574;567:12;529:52;-1:-1:-1;600:23:1;;449:180;-1:-1:-1;449:180:1:o;842:173::-;910:20;;-1:-1:-1;;;;;959:31:1;;949:42;;939:70;;1005:1;1002;995:12;939:70;842:173;;;:::o;1020:127::-;1081:10;1076:3;1072:20;1069:1;1062:31;1112:4;1109:1;1102:15;1136:4;1133:1;1126:15;1152:275;1223:2;1217:9;1288:2;1269:13;;-1:-1:-1;;1265:27:1;1253:40;;1323:18;1308:34;;1344:22;;;1305:62;1302:88;;;1370:18;;:::i;:::-;1406:2;1399:22;1152:275;;-1:-1:-1;1152:275:1:o;1432:407::-;1497:5;1531:18;1523:6;1520:30;1517:56;;;1553:18;;:::i;:::-;1591:57;1636:2;1615:15;;-1:-1:-1;;1611:29:1;1642:4;1607:40;1591:57;:::i;:::-;1582:66;;1671:6;1664:5;1657:21;1711:3;1702:6;1697:3;1693:16;1690:25;1687:45;;;1728:1;1725;1718:12;1687:45;1777:6;1772:3;1765:4;1758:5;1754:16;1741:43;1831:1;1824:4;1815:6;1808:5;1804:18;1800:29;1793:40;1432:407;;;;;:::o;1844:943::-;1949:6;1957;1965;1973;2026:3;2014:9;2005:7;2001:23;1997:33;1994:53;;;2043:1;2040;2033:12;1994:53;2066:29;2085:9;2066:29;:::i;:::-;2056:39;;2142:2;2131:9;2127:18;2114:32;2104:42;;2197:2;2186:9;2182:18;2169:32;2220:18;2261:2;2253:6;2250:14;2247:34;;;2277:1;2274;2267:12;2247:34;2315:6;2304:9;2300:22;2290:32;;2360:7;2353:4;2349:2;2345:13;2341:27;2331:55;;2382:1;2379;2372:12;2331:55;2405:74;2471:7;2466:2;2453:16;2448:2;2444;2440:11;2405:74;:::i;:::-;2395:84;;2532:2;2521:9;2517:18;2504:32;2488:48;;2561:2;2551:8;2548:16;2545:36;;;2577:1;2574;2567:12;2545:36;-1:-1:-1;2600:24:1;;2655:4;2647:13;;2643:27;-1:-1:-1;2633:55:1;;2684:1;2681;2674:12;2633:55;2707:74;2773:7;2768:2;2755:16;2750:2;2746;2742:11;2707:74;:::i;:::-;2697:84;;;1844:943;;;;;;;:::o;2792:258::-;2864:1;2874:113;2888:6;2885:1;2882:13;2874:113;;;2964:11;;;2958:18;2945:11;;;2938:39;2910:2;2903:10;2874:113;;;3005:6;3002:1;2999:13;2996:48;;;-1:-1:-1;;3040:1:1;3022:16;;3015:27;2792:258::o;3055:257::-;3096:3;3134:5;3128:12;3161:6;3156:3;3149:19;3177:63;3233:6;3226:4;3221:3;3217:14;3210:4;3203:5;3199:16;3177:63;:::i;:::-;3294:2;3273:15;-1:-1:-1;;3269:29:1;3260:39;;;;3301:4;3256:50;;3055:257;-1:-1:-1;;3055:257:1:o;3317:217::-;3464:2;3453:9;3446:21;3427:4;3484:44;3524:2;3513:9;3509:18;3501:6;3484:44;:::i;3539:322::-;3616:6;3624;3632;3685:2;3673:9;3664:7;3660:23;3656:32;3653:52;;;3701:1;3698;3691:12;3653:52;3724:29;3743:9;3724:29;:::i;:::-;3714:39;3800:2;3785:18;;3772:32;;-1:-1:-1;3851:2:1;3836:18;;;3823:32;;3539:322;-1:-1:-1;;;3539:322:1:o;3866:183::-;3926:4;3959:18;3951:6;3948:30;3945:56;;;3981:18;;:::i;:::-;-1:-1:-1;4026:1:1;4022:14;4038:4;4018:25;;3866:183::o;4054:668::-;4108:5;4161:3;4154:4;4146:6;4142:17;4138:27;4128:55;;4179:1;4176;4169:12;4128:55;4215:6;4202:20;4241:4;4265:60;4281:43;4321:2;4281:43;:::i;:::-;4265:60;:::i;:::-;4359:15;;;4445:1;4441:10;;;;4429:23;;4425:32;;;4390:12;;;;4469:15;;;4466:35;;;4497:1;4494;4487:12;4466:35;4533:2;4525:6;4521:15;4545:148;4561:6;4556:3;4553:15;4545:148;;;4627:23;4646:3;4627:23;:::i;:::-;4615:36;;4671:12;;;;4578;;4545:148;;;-1:-1:-1;4711:5:1;4054:668;-1:-1:-1;;;;;;4054:668:1:o;4727:821::-;4879:6;4887;4895;4948:2;4936:9;4927:7;4923:23;4919:32;4916:52;;;4964:1;4961;4954:12;4916:52;5004:9;4991:23;5033:18;5074:2;5066:6;5063:14;5060:34;;;5090:1;5087;5080:12;5060:34;5113:61;5166:7;5157:6;5146:9;5142:22;5113:61;:::i;:::-;5103:71;;5227:2;5216:9;5212:18;5199:32;5183:48;;5256:2;5246:8;5243:16;5240:36;;;5272:1;5269;5262:12;5240:36;5295:63;5350:7;5339:8;5328:9;5324:24;5295:63;:::i;:::-;5285:73;;5411:2;5400:9;5396:18;5383:32;5367:48;;5440:2;5430:8;5427:16;5424:36;;;5456:1;5453;5446:12;5424:36;;5479:63;5534:7;5523:8;5512:9;5508:24;5479:63;:::i;:::-;5469:73;;;4727:821;;;;;:::o;5553:254::-;5621:6;5629;5682:2;5670:9;5661:7;5657:23;5653:32;5650:52;;;5698:1;5695;5688:12;5650:52;5721:29;5740:9;5721:29;:::i;:::-;5711:39;5797:2;5782:18;;;;5769:32;;-1:-1:-1;;;5553:254:1:o;5812:186::-;5871:6;5924:2;5912:9;5903:7;5899:23;5895:32;5892:52;;;5940:1;5937;5930:12;5892:52;5963:29;5982:9;5963:29;:::i;6195:328::-;6272:6;6280;6288;6341:2;6329:9;6320:7;6316:23;6312:32;6309:52;;;6357:1;6354;6347:12;6309:52;6380:29;6399:9;6380:29;:::i;:::-;6370:39;;6428:38;6462:2;6451:9;6447:18;6428:38;:::i;:::-;6418:48;;6513:2;6502:9;6498:18;6485:32;6475:42;;6195:328;;;;;:::o;6528:496::-;6630:6;6638;6646;6699:2;6687:9;6678:7;6674:23;6670:32;6667:52;;;6715:1;6712;6705:12;6667:52;6738:29;6757:9;6738:29;:::i;:::-;6728:39;;6786:38;6820:2;6809:9;6805:18;6786:38;:::i;:::-;6776:48;;6875:2;6864:9;6860:18;6847:32;6902:18;6894:6;6891:30;6888:50;;;6934:1;6931;6924:12;6888:50;6957:61;7010:7;7001:6;6990:9;6986:22;6957:61;:::i;9055:371::-;-1:-1:-1;;;;;;9240:33:1;;9228:46;;9297:13;;9210:3;;9319:61;9297:13;9369:1;9360:11;;9353:4;9341:17;;9319:61;:::i;:::-;9400:16;;;;9418:1;9396:24;;9055:371;-1:-1:-1;;;9055:371:1:o;9431:274::-;9560:3;9598:6;9592:13;9614:53;9660:6;9655:3;9648:4;9640:6;9636:17;9614:53;:::i;:::-;9683:16;;;;;9431:274;-1:-1:-1;;9431:274:1:o;10140:450::-;10363:6;10352:9;10345:25;10406:2;10401;10390:9;10386:18;10379:30;10326:4;10432:44;10472:2;10461:9;10457:18;10449:6;10432:44;:::i;:::-;10524:9;10516:6;10512:22;10507:2;10496:9;10492:18;10485:50;10552:32;10577:6;10569;10552:32;:::i;:::-;10544:40;10140:450;-1:-1:-1;;;;;;10140:450:1:o;10595:352::-;10797:2;10779:21;;;10836:2;10816:18;;;10809:30;10875;10870:2;10855:18;;10848:58;10938:2;10923:18;;10595:352::o;11284:495::-;11345:3;11383:5;11377:12;11410:6;11405:3;11398:19;11436:4;11465:2;11460:3;11456:12;11449:19;;11487:5;11484:1;11477:16;11529:2;11526:1;11516:16;11550:1;11560:194;11574:6;11571:1;11568:13;11560:194;;;11639:13;;-1:-1:-1;;;;;11635:39:1;11623:52;;11695:12;;;;11671:1;11730:14;;;;11589:9;11560:194;;;-1:-1:-1;11770:3:1;;11284:495;-1:-1:-1;;;;;11284:495:1:o;11784:337::-;11988:6;11977:9;11970:25;12031:2;12026;12015:9;12011:18;12004:30;11951:4;12051:64;12111:2;12100:9;12096:18;12088:6;12051:64;:::i;12126:881::-;12221:6;12252:2;12295;12283:9;12274:7;12270:23;12266:32;12263:52;;;12311:1;12308;12301:12;12263:52;12344:9;12338:16;12377:18;12369:6;12366:30;12363:50;;;12409:1;12406;12399:12;12363:50;12432:22;;12485:4;12477:13;;12473:27;-1:-1:-1;12463:55:1;;12514:1;12511;12504:12;12463:55;12543:2;12537:9;12566:60;12582:43;12622:2;12582:43;:::i;12566:60::-;12660:15;;;12742:1;12738:10;;;;12730:19;;12726:28;;;12691:12;;;;12766:19;;;12763:39;;;12798:1;12795;12788:12;12763:39;12822:11;;;;12842:135;12858:6;12853:3;12850:15;12842:135;;;12924:10;;12912:23;;12875:12;;;;12955;;;;12842:135;;13012:127;13073:10;13068:3;13064:20;13061:1;13054:31;13104:4;13101:1;13094:15;13128:4;13125:1;13118:15;13144:125;13184:4;13212:1;13209;13206:8;13203:34;;;13217:18;;:::i;:::-;-1:-1:-1;13254:9:1;;13144:125::o;13274:127::-;13335:10;13330:3;13326:20;13323:1;13316:31;13366:4;13363:1;13356:15;13390:4;13387:1;13380:15;14159:184;14229:6;14282:2;14270:9;14261:7;14257:23;14253:32;14250:52;;;14298:1;14295;14288:12;14250:52;-1:-1:-1;14321:16:1;;14159:184;-1:-1:-1;14159:184:1:o;14348:128::-;14388:3;14419:1;14415:6;14412:1;14409:13;14406:39;;;14425:18;;:::i;:::-;-1:-1:-1;14461:9:1;;14348:128::o;14481:402::-;14683:2;14665:21;;;14722:2;14702:18;;;14695:30;14761:34;14756:2;14741:18;;14734:62;-1:-1:-1;;;14827:2:1;14812:18;;14805:36;14873:3;14858:19;;14481:402::o;15856:245::-;15935:6;15943;15996:2;15984:9;15975:7;15971:23;15967:32;15964:52;;;16012:1;16009;16002:12;15964:52;-1:-1:-1;;16035:16:1;;16091:2;16076:18;;;16070:25;16035:16;;16070:25;;-1:-1:-1;15856:245:1:o;19610:168::-;19650:7;19716:1;19712;19708:6;19704:14;19701:1;19698:21;19693:1;19686:9;19679:17;19675:45;19672:71;;;19723:18;;:::i;:::-;-1:-1:-1;19763:9:1;;19610:168::o;19783:217::-;19823:1;19849;19839:132;;19893:10;19888:3;19884:20;19881:1;19874:31;19928:4;19925:1;19918:15;19956:4;19953:1;19946:15;19839:132;-1:-1:-1;19985:9:1;;19783:217::o;22130:277::-;22197:6;22250:2;22238:9;22229:7;22225:23;22221:32;22218:52;;;22266:1;22263;22256:12;22218:52;22298:9;22292:16;22351:5;22344:13;22337:21;22330:5;22327:32;22317:60;;22373:1;22370;22363:12;22823:587;23119:6;23108:9;23101:25;23162:6;23157:2;23146:9;23142:18;23135:34;23205:3;23200:2;23189:9;23185:18;23178:31;23082:4;23226:65;23286:3;23275:9;23271:19;23263:6;23226:65;:::i;:::-;-1:-1:-1;;;;;23327:32:1;;;;23322:2;23307:18;;23300:60;-1:-1:-1;23391:3:1;23376:19;23369:35;23218:73;22823:587;-1:-1:-1;;;22823:587:1:o;24180:306::-;24268:6;24276;24284;24337:2;24325:9;24316:7;24312:23;24308:32;24305:52;;;24353:1;24350;24343:12;24305:52;24382:9;24376:16;24366:26;;24432:2;24421:9;24417:18;24411:25;24401:35;;24476:2;24465:9;24461:18;24455:25;24445:35;;24180:306;;;;;:::o
Swarm Source
ipfs://8cee5330c4b3634ccdc81220b33b400bb951e8d0ae2ba4afcae0cbe13729895d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.