Source Code
Latest 25 from a total of 3,446 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Harvest Pool | 6725599 | 624 days ago | IN | 0 MOVR | 0.00032584 | ||||
| Harvest Pool | 6725598 | 624 days ago | IN | 0 MOVR | 0.00032584 | ||||
| Harvest Pool | 6725598 | 624 days ago | IN | 0 MOVR | 0.00032584 | ||||
| Harvest Pool | 6694394 | 628 days ago | IN | 0 MOVR | 0.00034374 | ||||
| Harvest Pool | 6694393 | 628 days ago | IN | 0 MOVR | 0.00034374 | ||||
| Harvest Pool | 6694391 | 628 days ago | IN | 0 MOVR | 0.00034374 | ||||
| Harvest Pool | 6168270 | 706 days ago | IN | 0 MOVR | 0.00033777 | ||||
| Harvest Pool | 6168269 | 706 days ago | IN | 0 MOVR | 0.00033777 | ||||
| Harvest Pool | 6168269 | 706 days ago | IN | 0 MOVR | 0.00033777 | ||||
| Harvest Pool | 6058441 | 723 days ago | IN | 0 MOVR | 0.00033777 | ||||
| Harvest Pool | 6058441 | 723 days ago | IN | 0 MOVR | 0.00028682 | ||||
| Harvest Pool | 6058433 | 723 days ago | IN | 0 MOVR | 0.00028682 | ||||
| Harvest Pool | 6058433 | 723 days ago | IN | 0 MOVR | 0.00044332 | ||||
| Harvest Pool | 5923906 | 744 days ago | IN | 0 MOVR | 0.00028682 | ||||
| Harvest Pool | 5862066 | 753 days ago | IN | 0 MOVR | 0.00033777 | ||||
| Harvest Pool | 5739282 | 771 days ago | IN | 0 MOVR | 0.00030742 | ||||
| Harvest Pool | 5739282 | 771 days ago | IN | 0 MOVR | 0.00013037 | ||||
| Harvest Pool | 5524677 | 803 days ago | IN | 0 MOVR | 0.00030211 | ||||
| Harvest Pool | 5524674 | 803 days ago | IN | 0 MOVR | 0.00030742 | ||||
| Harvest Pool | 5524671 | 803 days ago | IN | 0 MOVR | 0.00030742 | ||||
| Harvest Pool | 3798636 | 1049 days ago | IN | 0 MOVR | 0.000195 | ||||
| Harvest Pool | 3738324 | 1058 days ago | IN | 0 MOVR | 0.0002076 | ||||
| Harvest Pool | 3583604 | 1080 days ago | IN | 0 MOVR | 0.00019999 | ||||
| Harvest Pool | 3583603 | 1080 days ago | IN | 0 MOVR | 0.00019999 | ||||
| Harvest Pool | 3583602 | 1080 days ago | IN | 0 MOVR | 0.000195 |
View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CommonEclipse
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/**
*Submitted for verification at moonriver.moonscan.io on 2021-10-28
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @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() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_setOwner(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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return _verifyCallResult(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) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(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) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @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;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
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");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
/**
* @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 make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
// 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 no longer needed starting with Solidity 0.8. 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 substraction 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;
}
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface ISolarERC20 is IERC20 {
function mint(address to, uint256 amount) external;
}
contract SolarVault is Ownable, ReentrancyGuard {
address constant _trustedForwarder =
0x0D0b4862F5FfA3A47D04DDf0351356d20C830460; //Trusted forwarder
using SafeMath for uint256;
using SafeERC20 for IERC20;
// Info of each user.
struct UserInfo {
uint256 amount; // How many LP tokens the user has provided.
uint256 rewardDebt; // Reward debt. See explanation below.
uint256 rewardLockedUp; // Reward locked up.
uint256 nextHarvestUntil; // When can the user harvest again.
uint256 lastInteraction; // Last time when user deposited or claimed rewards, renewing the lock
}
// Info of each pool.
struct PoolInfo {
IERC20 lpToken; // Address of LP token contract
uint256 allocPoint; // How many allocation points assigned to this pool. Solar to distribute per block.
uint256 lastRewardBlock; // Last block number that Solar distribution occurs.
uint256 accSolarPerShare; // Accumulated Solar per share, times 1e12. See below.
uint16 depositFeeBP; // Deposit fee in basis points
uint256 harvestInterval; // Harvest interval in seconds
uint256 totalLp; // Total token in Pool
uint256 lockupDuration; // Amount of time the participant will be locked in the pool after depositing or claiming rewards
}
ISolarERC20 public solar;
// The operator can only update EmissionRate and AllocPoint to protect tokenomics
//i.e some wrong setting and a pools get too much allocation accidentally
address private _operator;
// Dev address.
address public devAddress;
// Deposit Fee address
address public feeAddress;
// Solar tokens created per block
uint256 public solarPerBlock;
// Max harvest interval: 14 days
uint256 public constant MAXIMUM_HARVEST_INTERVAL = 14 days;
// Maximum deposit fee rate: 10%
uint16 public constant MAXIMUM_DEPOSIT_FEE_RATE = 1000;
// Info of each pool
PoolInfo[] public poolInfo;
// Info of each user that stakes LP tokens.
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
// Total allocation points. Must be the sum of all allocation points in all pools.
uint256 public totalAllocPoint = 0;
// The block number when Solar mining starts.
uint256 public startBlock;
// Total locked up rewards
uint256 public totalLockedUpRewards;
// Total Solar in Solar Pools (can be multiple pools)
uint256 public totalSolarInPools = 0;
// Control support for EIP-2771 Meta Transactions
bool public metaTxnsEnabled = false;
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(
address indexed user,
uint256 indexed pid,
uint256 amount
);
event EmissionRateUpdated(
address indexed caller,
uint256 previousAmount,
uint256 newAmount
);
event RewardLockedUp(
address indexed user,
uint256 indexed pid,
uint256 amountLockedUp
);
event OperatorTransferred(
address indexed previousOperator,
address indexed newOperator
);
event DevAddressChanged(
address indexed caller,
address oldAddress,
address newAddress
);
event FeeAddressChanged(
address indexed caller,
address oldAddress,
address newAddress
);
event AllocPointsUpdated(
address indexed caller,
uint256 previousAmount,
uint256 newAmount
);
event MetaTxnsEnabled(address indexed caller);
event MetaTxnsDisabled(address indexed caller);
modifier onlyOperator() {
require(
_operator == msg.sender,
"Operator: caller is not the operator"
);
_;
}
constructor(ISolarERC20 _solar, uint256 _solarPerBlock) {
//StartBlock always many years later from contract construct, will be set later in StartFarming function
startBlock = block.number + (10 * 365 * 24 * 60 * 60);
solar = _solar;
solarPerBlock = _solarPerBlock;
devAddress = msg.sender;
feeAddress = msg.sender;
_operator = msg.sender;
emit OperatorTransferred(address(0), _operator);
}
function isTrustedForwarder(address forwarder)
public
view
virtual
returns (bool)
{
return metaTxnsEnabled && forwarder == _trustedForwarder;
}
function _msgSender()
internal
view
virtual
override
returns (address sender)
{
if (isTrustedForwarder(msg.sender)) {
// The assembly code is more direct than the Solidity version using `abi.decode`.
assembly {
sender := shr(96, calldataload(sub(calldatasize(), 20)))
}
} else {
return super._msgSender();
}
}
function _msgData()
internal
view
virtual
override
returns (bytes calldata)
{
if (isTrustedForwarder(msg.sender)) {
return msg.data[:msg.data.length - 20];
} else {
return super._msgData();
}
}
function operator() public view returns (address) {
return _operator;
}
// Return reward multiplier over the given _from to _to block.
function getMultiplier(uint256 _from, uint256 _to)
public
pure
returns (uint256)
{
return _to.sub(_from);
}
function transferOperator(address newOperator) public onlyOperator {
require(
newOperator != address(0),
"TransferOperator: new operator is the zero address"
);
emit OperatorTransferred(_operator, newOperator);
_operator = newOperator;
}
// Set farming start, can call only once
function startFarming() public onlyOwner {
require(block.number < startBlock, "Error: farm started already");
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
PoolInfo storage pool = poolInfo[pid];
pool.lastRewardBlock = block.number;
}
startBlock = block.number;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
// Add a new lp to the pool. Can only be called by the owner.
// Can add multiple pool with same lp token without messing up rewards, because each pool's balance is tracked using its own totalLp
function add(
uint256 _allocPoint,
IERC20 _lpToken,
uint16 _depositFeeBP,
uint256 _harvestInterval,
uint256 _lockupDuration,
bool _withUpdate
) public onlyOwner {
require(
_depositFeeBP <= MAXIMUM_DEPOSIT_FEE_RATE,
"Add: deposit fee too high"
);
require(
_harvestInterval <= MAXIMUM_HARVEST_INTERVAL,
"Add: invalid harvest interval"
);
if (_withUpdate) {
massUpdatePools();
}
uint256 lastRewardBlock = block.number > startBlock
? block.number
: startBlock;
totalAllocPoint = totalAllocPoint.add(_allocPoint);
poolInfo.push(
PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardBlock: lastRewardBlock,
accSolarPerShare: 0,
depositFeeBP: _depositFeeBP,
harvestInterval: _harvestInterval,
totalLp: 0,
lockupDuration: _lockupDuration
})
);
}
// View function to see pending Solar on frontend.
function pendingSolar(uint256 _pid, address _user)
external
view
returns (uint256)
{
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accSolarPerShare = pool.accSolarPerShare;
uint256 lpSupply = pool.lpToken.balanceOf(address(this));
if (block.number > pool.lastRewardBlock && lpSupply != 0) {
uint256 multiplier = getMultiplier(
pool.lastRewardBlock,
block.number
);
uint256 solarReward = multiplier
.mul(solarPerBlock)
.mul(pool.allocPoint)
.div(totalAllocPoint);
accSolarPerShare = accSolarPerShare.add(
solarReward.mul(1e12).div(lpSupply)
);
}
uint256 pending = user.amount.mul(accSolarPerShare).div(1e12).sub(
user.rewardDebt
);
return pending.add(user.rewardLockedUp);
}
// View function to see when user will be unlocked from pool
function userLockedUntil(uint256 _pid, address _user)
public
view
returns (uint256)
{
UserInfo storage user = userInfo[_pid][_user];
PoolInfo storage pool = poolInfo[_pid];
return user.lastInteraction + pool.lockupDuration;
}
// View function to see if user can harvest Solar.
function canHarvest(uint256 _pid, address _user)
public
view
returns (bool)
{
UserInfo storage user = userInfo[_pid][_user];
return
block.number >= startBlock &&
block.timestamp >= user.nextHarvestUntil;
}
// Update reward vairables for all pools. Be careful of gas spending!
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
// Update reward variables of the given pool to be up-to-date.
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.number <= pool.lastRewardBlock) {
return;
}
uint256 lpSupply = pool.totalLp;
if (lpSupply == 0 || pool.allocPoint == 0) {
pool.lastRewardBlock = block.number;
return;
}
uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number);
uint256 solarReward = multiplier
.mul(solarPerBlock)
.mul(pool.allocPoint)
.div(totalAllocPoint);
solar.mint(devAddress, solarReward.div(10));
solar.mint(address(this), solarReward);
pool.accSolarPerShare = pool.accSolarPerShare.add(
solarReward.mul(1e12).div(pool.totalLp)
);
pool.lastRewardBlock = block.number;
}
// Deposit LP tokens to SolarVault for Solar allocation
function deposit(uint256 _pid, uint256 _amount) public nonReentrant {
require(
block.number >= startBlock,
"SolarVault: cannot deposit before farming start"
);
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_msgSender()];
updatePool(_pid);
payOrLockupPendingSolar(_pid);
if (_amount > 0) {
uint256 beforeDeposit = pool.lpToken.balanceOf(address(this));
pool.lpToken.safeTransferFrom(_msgSender(), address(this), _amount);
uint256 afterDeposit = pool.lpToken.balanceOf(address(this));
_amount = afterDeposit.sub(beforeDeposit);
if (pool.depositFeeBP > 0) {
uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000);
pool.lpToken.safeTransfer(feeAddress, depositFee);
_amount = _amount.sub(depositFee);
}
user.amount = user.amount.add(_amount);
pool.totalLp = pool.totalLp.add(_amount);
if (address(pool.lpToken) == address(solar)) {
totalSolarInPools = totalSolarInPools.add(_amount);
}
}
user.rewardDebt = user.amount.mul(pool.accSolarPerShare).div(1e12);
user.lastInteraction = block.timestamp;
emit Deposit(_msgSender(), _pid, _amount);
}
// Withdraw tokens
function withdraw(uint256 _pid, uint256 _amount) public nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_msgSender()];
//this will make sure that user can only withdraw from his pool
require(user.amount >= _amount, "Withdraw: user amount is not enough");
//Cannot withdraw more than pool's balance
require(pool.totalLp >= _amount, "Withdraw: pool total is not enough");
//Cannot withdraw before lock time
require(
block.timestamp > user.lastInteraction + pool.lockupDuration,
"Withdraw: you cannot withdraw yet"
);
updatePool(_pid);
payOrLockupPendingSolar(_pid);
if (_amount > 0) {
user.amount = user.amount.sub(_amount);
pool.totalLp = pool.totalLp.sub(_amount);
if (address(pool.lpToken) == address(solar)) {
totalSolarInPools = totalSolarInPools.sub(_amount);
}
pool.lpToken.safeTransfer(_msgSender(), _amount);
}
user.rewardDebt = user.amount.mul(pool.accSolarPerShare).div(1e12);
user.lastInteraction = block.timestamp;
emit Withdraw(_msgSender(), _pid, _amount);
}
// Pay or lockup pending Solar.
function payOrLockupPendingSolar(uint256 _pid) internal {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_msgSender()];
if (user.nextHarvestUntil == 0 && block.number >= startBlock) {
user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval);
}
uint256 pending = user.amount.mul(pool.accSolarPerShare).div(1e12).sub(
user.rewardDebt
);
if (canHarvest(_pid, _msgSender())) {
if (pending > 0 || user.rewardLockedUp > 0) {
uint256 totalRewards = pending.add(user.rewardLockedUp);
// reset lockup
totalLockedUpRewards = totalLockedUpRewards.sub(
user.rewardLockedUp
);
user.rewardLockedUp = 0;
user.lastInteraction = block.timestamp;
user.nextHarvestUntil = block.timestamp.add(
pool.harvestInterval
);
// send rewards
safeSolarTransfer(_msgSender(), totalRewards);
}
} else if (pending > 0) {
user.rewardLockedUp = user.rewardLockedUp.add(pending);
user.lastInteraction = block.timestamp;
totalLockedUpRewards = totalLockedUpRewards.add(pending);
emit RewardLockedUp(_msgSender(), _pid, pending);
}
}
// Safe Solar transfer function, just in case if rounding error causes pool do not have enough Solar.
function safeSolarTransfer(address _to, uint256 _amount) internal {
if (solar.balanceOf(address(this)) > totalSolarInPools) {
//SolarBal = total Solar in SolarVault - total Solar in Solar pools, this will make sure that SolarVault never transfer rewards from deposited Solar pools
uint256 SolarBal = solar.balanceOf(address(this)).sub(
totalSolarInPools
);
if (_amount >= SolarBal) {
solar.transfer(_to, SolarBal);
} else if (_amount > 0) {
solar.transfer(_to, _amount);
}
}
}
// Update dev address by the previous dev.
function setDevAddress(address _devAddress) public {
require(_msgSender() == devAddress, "setDevAddress: FORBIDDEN");
require(_devAddress != address(0), "setDevAddress: ZERO");
emit DevAddressChanged(_msgSender(), devAddress, _devAddress);
devAddress = _devAddress;
}
function setFeeAddress(address _feeAddress) public {
require(_msgSender() == feeAddress, "setFeeAddress: FORBIDDEN");
require(_feeAddress != address(0), "setFeeAddress: ZERO");
emit FeeAddressChanged(_msgSender(), feeAddress, _feeAddress);
feeAddress = _feeAddress;
}
// Pancake has to add hidden dummy pools in order to alter the emission, here we make it simple and transparent to all.
function updateEmissionRate(uint256 _solarPerBlock) public onlyOperator {
massUpdatePools();
emit EmissionRateUpdated(msg.sender, solarPerBlock, _solarPerBlock);
solarPerBlock = _solarPerBlock;
}
function updateAllocPoint(
uint256 _pid,
uint256 _allocPoint,
bool _withUpdate
) public onlyOperator {
if (_withUpdate) {
massUpdatePools();
}
emit AllocPointsUpdated(
_msgSender(),
poolInfo[_pid].allocPoint,
_allocPoint
);
totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(
_allocPoint
);
poolInfo[_pid].allocPoint = _allocPoint;
}
// Enable support for meta transactions
function enableMetaTxns() public onlyOperator {
require(
!metaTxnsEnabled,
"SolarVault: meta transactions are already enabled"
);
metaTxnsEnabled = true;
emit MetaTxnsEnabled(_msgSender());
}
// Disable support for meta transactions
function disableMetaTxns() public onlyOperator {
require(
metaTxnsEnabled,
"SolarVault: meta transactions are already disabled"
);
metaTxnsEnabled = false;
emit MetaTxnsDisabled(_msgSender());
}
}
/** @title ICommonEclipse
* @notice It is an interface for CommonEclipse.sol
*/
abstract contract ICommonEclipse {
/**
* @notice It sets parameters for pool
* @param _offeringAmountPool: offering amount (in tokens)
* @param _raisingAmountPool: raising amount (in LP tokens)
* @param _baseLimitInLP: base limit per user (in LP tokens)
* @param _hasTax: if the pool has a tax
* @param _pid: poolId
* @dev This function is only callable by owner.
*/
function setPool(
uint256 _offeringAmountPool,
uint256 _raisingAmountPool,
uint256 _baseLimitInLP,
bool _hasTax,
uint8 _pid
) external virtual;
/**
* @notice It allows users to deposit LP tokens to pool
* @param _amount: the number of LP token used (18 decimals)
* @param _pid: pool id
*/
function depositPool(uint256 _amount, uint8 _pid) external virtual;
/**
* @notice It allows users to harvest from pool
* @param _pid: pool id
* @param _harvestPeriod: chosen harvest period to claim
*/
function harvestPool(uint8 _pid, uint8 _harvestPeriod) external virtual;
/**
* @notice It allows owner to update start and end blocks of the sale
* @param _startBlock: block number sale starts
* @param _endBlock: block number sale ends
*/
function updateStartAndEndBlocks(uint256 _startBlock, uint256 _endBlock)
external
virtual;
/**
* @notice It allows owner to set the multiplier information
* @param _multipliers: encoded multipliers for zero, seven and thirty day vaults
* @dev encoded args are (uint8,uint8,uint8,uint8[2][3],uint8[2][3],uint8[2][3])
* (0 decimals)
*/
function setMultipliers(bytes memory _multipliers) public virtual;
/**
* @notice It allows owner to set the threshold for eligibility
* @param _eligibilityThreshold: amount of solar staked in vaults to be eligibile
*/
function setEligibilityThreshold(uint256 _eligibilityThreshold)
public
virtual;
/**
* @notice It allows the admin to withdraw funds
* @param _lpAmount: the number of LP token to withdraw (18 decimals)
* @param _offerAmount: the number of offering amount to withdraw
* @dev This function is only callable by owner.
*/
function finalWithdraw(uint256 _lpAmount, uint256 _offerAmount)
external
virtual;
/**
* @notice It returns the tax overflow rate calculated for a pool
* @dev 100,000,000,000 means 0.1 (10%) / 1 means 0.0000000000001 (0.0000001%) / 1,000,000,000,000 means 1 (100%)
* @param _pid: poolId
* @return It returns the tax percentage
*/
function viewPoolTaxRateOverflow(uint256 _pid)
external
virtual
returns (uint256);
/**
* @notice External view function to see user allocations for both pools
* @param _user: user address
* @param _pids[]: array of pids
*/
function viewUserAllocationPools(address _user, uint8[] calldata _pids)
external
virtual
returns (uint256[] memory);
/**
* @notice External view function to see user offering and refunding amounts for both pools
* @param _user: user address
* @param _pids: array of pids
*/
function viewUserOfferingAndRefundingAmountsForPools(
address _user,
uint8[] calldata _pids
) external virtual returns (uint256[3][] memory);
/**
* @notice It allows users to withdraw LP tokens to pool
* @param _amount: the number of LP token used (18 decimals)
* @param _pid: pool id
*/
function withdrawPool(uint256 _amount, uint8 _pid) external virtual;
/**
* @notice It allows the admin to end sale and start claim
* @dev This function is only callable by owner.
*/
function enableClaim() external virtual;
}
contract CommonEclipse is ICommonEclipse, ReentrancyGuard, Ownable {
using SafeERC20 for IERC20;
/*///////////////////////////////////////////////////////////////
STORAGE
//////////////////////////////////////////////////////////////*/
IERC20 public lpToken;
IERC20 public offeringToken;
SolarVault public vault;
uint8 public constant HARVEST_PERIODS = 4; // number of periods to split offering token to vest.
uint8 public constant NUMBER_VAULT_POOLS = 3; // number of solar vault pools to check for stake.
uint8 public constant NUMBER_THRESHOLDS = 3; // number of solar staked threshold for multipliers per pool.
uint256[HARVEST_PERIODS] public harvestReleaseBlocks;
uint256[HARVEST_PERIODS] public harvestReleasePercent;
uint256 public startBlock;
uint256 public endBlock;
uint256 public eligibilityThreshold; // minimum solar staked to be eligible.
bool public claimEnabled = false; // flag to enable harvests after liquidity is added.
/**
* @dev The struct stores the each pools base multiplier, and additional
* multipliers based on meeting staked threshold requirements.
*/
struct Multipliers {
uint16[NUMBER_THRESHOLDS] poolThresholds;
uint8[NUMBER_VAULT_POOLS] poolBaseMult;
uint8[NUMBER_THRESHOLDS][NUMBER_VAULT_POOLS] poolMultipliers;
}
struct UserInfo {
uint256 amount; // How many tokens the user has provided for pool
uint256 allocPoints; // Used to weight user allocation based on amount locked in solar vaults
bool[HARVEST_PERIODS] claimed; // Whether the user has claimed (default: false) for pool
bool isRefunded; // Wheter the user has been refunded or not.
}
struct PoolInfo {
uint256 raisingAmount; // amount of tokens raised for the pool (in LP tokens)
uint256 offeringAmount; // amount of tokens offered for the pool (in offeringTokens)
uint256 baseLimitInLP; // base limit of tokens per eligible user (if 0, it is ignored)
bool hasTax; // if a pool is to be taxed on overflow or not
uint256 totalAmountPool; // total amount pool deposited (in LP tokens)
uint256 sumTaxesOverflow; // total taxes collected (starts at 0, increases with each harvest if overflow)
uint256 totalAllocPoints;
}
uint8 public constant numberPools = 2; // max number of pools that are to be created.
mapping(address => mapping(uint8 => UserInfo)) public userInfo;
PoolInfo[numberPools] public poolInfo;
Multipliers private _multiplierInfo;
/*///////////////////////////////////////////////////////////////
EVENTS
//////////////////////////////////////////////////////////////*/
event Deposit(address indexed user, uint256 amount, uint256 indexed pid);
event Withdraw(address indexed user, uint256 amount, uint256 indexed pid);
event Harvest(address indexed user, uint256 offeringAmount, uint256 excessAmount, uint8 indexed pid);
event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock);
event PoolParametersSet(uint256 raisingAmount, uint256 offeringAmount, uint8 pid);
event MultiplierParametersSet(
uint16[NUMBER_THRESHOLDS] poolStakedThresholds,
uint8[NUMBER_VAULT_POOLS] poolBaseMultiplier,
uint8[NUMBER_THRESHOLDS][NUMBER_VAULT_POOLS] poolStakedMultipliers
);
event AdminWithdraw(uint256 amountLP, uint256 amountOfferingToken);
event AdminTokenRecovery(address token, uint256 amount);
event ClaimEnabled();
/*///////////////////////////////////////////////////////////////
MODIFIERS
//////////////////////////////////////////////////////////////*/
/**
* @notice It checks if the current block is within the sale period.
*/
modifier onlyWhenActive() {
require(
block.number >= startBlock && block.number < endBlock,
"Sale not active"
);
_;
}
/**
* @notice It checks if sale ended and claim is enabled
*/
modifier onlyFinished() {
require(block.number >= endBlock && claimEnabled, "sale not finished");
_;
}
/*///////////////////////////////////////////////////////////////
CONSTRUCTOR
//////////////////////////////////////////////////////////////*/
constructor(
IERC20 _lpToken,
IERC20 _offeringToken,
uint256 _startBlock,
uint256 _endBlock,
uint256 _vestingBlockOffset, // Number of Blocks to offset for each harvest period
uint256 _eligibilityThreshold, // (1e18)
address _solarVault,
uint256[] memory _harvestReleasePercent,
bytes memory _multipliers
){
require(_lpToken.totalSupply() >= 0);
require(_offeringToken.totalSupply() >= 0);
require(_lpToken != _offeringToken, "Tokens must be different");
require(_harvestReleasePercent.length == HARVEST_PERIODS, "harvest schedule must match");
uint256 totalPercent = 0;
for (uint256 i = 0; i < _harvestReleasePercent.length; i++) {
totalPercent += _harvestReleasePercent[i];
}
require(totalPercent == 10000, "harvest percent must total 10000");
lpToken = _lpToken;
offeringToken = _offeringToken;
startBlock = _startBlock;
endBlock = _endBlock;
eligibilityThreshold = _eligibilityThreshold;
vault = SolarVault(_solarVault);
_setMultipliers(_multipliers);
for (uint256 i = 0; i < HARVEST_PERIODS; i++) {
harvestReleaseBlocks[i] = endBlock + (_vestingBlockOffset * i);
harvestReleasePercent[i] = _harvestReleasePercent[i];
}
}
function setOfferingToken(IERC20 _offeringToken) public onlyOwner {
require(block.number < startBlock, "sale is already active");
require(_offeringToken.totalSupply() >= 0);
offeringToken = _offeringToken;
}
/*///////////////////////////////////////////////////////////////
POOL MANAGEMENT
//////////////////////////////////////////////////////////////*/
/**
* @notice It sets the threshold of solar staked to be eligible to participate.
* @param _eligibilityThreshold: Number of solar staked to be eligibile. (1e18)
*/
function setEligibilityThreshold(uint256 _eligibilityThreshold) public override onlyOwner {
require(block.number < startBlock, "sale is already active");
eligibilityThreshold = _eligibilityThreshold;
}
/**
* @notice It sets the multiplier matrix.
* @param _multipliers: abi encoded arrays
*/
function setMultipliers(bytes memory _multipliers) public override onlyOwner {
require(block.number < startBlock, "sale is already active");
_setMultipliers(_multipliers);
}
/**
* @notice Private helper to set multiplier matrix.
*/
function _setMultipliers(bytes memory _multipliers) private {
(
uint16[] memory thresholds,
uint8[] memory base,
uint8[][] memory mults
) = abi.decode(_multipliers,(
uint16[],
uint8[],
uint8[][]
));
require(
base.length == NUMBER_VAULT_POOLS && mults.length == NUMBER_VAULT_POOLS,
"bad vault pool length"
);
require(thresholds.length == NUMBER_THRESHOLDS ,"bad threshold length");
for (uint8 i = 0; i < NUMBER_THRESHOLDS; i++) {
_multiplierInfo.poolThresholds[i] = thresholds[i];
}
for (uint8 i = 0; i < NUMBER_VAULT_POOLS; i++){
_multiplierInfo.poolBaseMult[i] = base[i];
require(mults[i].length == NUMBER_THRESHOLDS, "bad threshold length");
for ( uint8 j = 0; j < NUMBER_THRESHOLDS; j++) {
_multiplierInfo.poolMultipliers[i][j] = mults[i][j];
}
}
emit MultiplierParametersSet(
_multiplierInfo.poolThresholds,
_multiplierInfo.poolBaseMult,
_multiplierInfo.poolMultipliers
);
}
/**
* @notice It creates a pool.
* @dev If _baseLimitInLP is set to zero, the allocation will be weighted by allocation points. (see below)
* @param _raisingAmount: amount of LP token the pool aims to raise (1e18)
* @param _offeringAmount: amount of IDO tokens the pool is offering (1e18)
* @param _baseLimitInLP: base limit of tokens per eligible user (if 0, it is ignored) (1e18)
* @param _hasTax: true if a pool is to be taxed on overflow
* @param _pid: pool identification number
*/
function setPool(
uint256 _raisingAmount,
uint256 _offeringAmount,
uint256 _baseLimitInLP,
bool _hasTax,
uint8 _pid
) external override onlyOwner{
require(block.number < startBlock, "sale is already active");
require(_pid < numberPools, "pool does not exist");
poolInfo[_pid].raisingAmount = _raisingAmount;
poolInfo[_pid].offeringAmount = _offeringAmount;
poolInfo[_pid].baseLimitInLP = _baseLimitInLP;
poolInfo[_pid].hasTax = _hasTax;
emit PoolParametersSet(_offeringAmount, _raisingAmount, _pid);
}
/**
* @notice It sets the start and end blocks of the sale.
*/
function updateStartAndEndBlocks(uint256 _startBlock, uint256 _endBlock) external override onlyOwner {
require(block.number < startBlock, "sale is already active");
require(_startBlock < _endBlock, "new startBlock must be lower than new endBlock");
require(block.number < _startBlock, "New startBlock must be higher than current block");
startBlock = _startBlock;
endBlock = _endBlock;
emit NewStartAndEndBlocks(_startBlock, _endBlock);
}
/**
* @notice It allows the owner to withdraw LPtokens and Offering tokens after the sale
* @dev can only withdraw after the sale is finished
* @param _lpAmount: amount of LP token to withdraw
* @param _offerAmount: amount of IDO tokens to withdraw
*/
function finalWithdraw(uint256 _lpAmount, uint256 _offerAmount) external override onlyOwner {
require(block.number > endBlock, "sale has not finished");
require(_lpAmount <= lpToken.balanceOf(address(this)), "Not enough LP tokens");
require(_offerAmount <= offeringToken.balanceOf(address(this)), "Not enough offering tokens");
if (_lpAmount > 0) {
lpToken.safeTransfer(address(msg.sender), _lpAmount);
}
if (_offerAmount > 0) {
offeringToken.safeTransfer(address(msg.sender), _offerAmount);
}
emit AdminWithdraw(_lpAmount, _offerAmount);
}
/**
* @notice It allows the owner to withdraw ERC20 tokens
* @dev cannot withdraw LP tokens or Offering tokens
* @param _tokenAddress: address of ERC20 token to withdraw
* @param _amount: amount to withdraw
*/
function sweep(address _tokenAddress, uint256 _amount) external onlyOwner {
require(
_tokenAddress != address(lpToken) && _tokenAddress != address(offeringToken),
"Cannot be LP or Offering token"
);
IERC20(_tokenAddress).safeTransfer(address(msg.sender), _amount);
emit AdminTokenRecovery(_tokenAddress, _amount);
}
/*///////////////////////////////////////////////////////////////
DEPOSIT LOGIC
//////////////////////////////////////////////////////////////*/
/**
* @notice It lets users deposit into a pool for a share of offering tokens
* @dev cannot withdraw LP tokens or Offering tokens
* @param _amount: amount of LP tokens to deposit
* @param _pid: pool to depoist in
*/
function depositPool(uint256 _amount, uint8 _pid) external override onlyWhenActive nonReentrant {
UserInfo storage user = userInfo[msg.sender][_pid];
require(_pid < numberPools, "pool does not exist");
require(
poolInfo[_pid].offeringAmount > 0 && poolInfo[_pid].raisingAmount > 0,
"Pool not set"
);
for (uint8 i = 0; i < numberPools; i++) {
if (i != _pid) {
require(userInfo[msg.sender][i].amount == 0, "already commited in another pool");
}
}
for (uint256 i=0; i<NUMBER_VAULT_POOLS; i++) {
vault.deposit(i,0);
}
(bool success) = getUserEligibility(address(msg.sender));
require(success, "user not eligible");
lpToken.safeTransferFrom(address(msg.sender), address(this), _amount);
user.amount += _amount;
if (poolInfo[_pid].baseLimitInLP > 0) {
(uint16 multiplier) = getUserMultiplier(msg.sender);
require(
user.amount <= (poolInfo[_pid].baseLimitInLP * uint256(multiplier)), "New amount above user limit"
);
} else {
(uint16 multiplier) = getUserMultiplier(msg.sender);
poolInfo[_pid].totalAllocPoints -= userInfo[msg.sender][_pid].allocPoints;
userInfo[msg.sender][_pid].allocPoints = user.amount * uint256(multiplier);
poolInfo[_pid].totalAllocPoints += userInfo[msg.sender][_pid].allocPoints;
}
poolInfo[_pid].totalAmountPool += _amount;
emit Deposit(msg.sender,_amount,_pid);
}
function getUserEligibility(address _user) public view returns(bool) {
uint256 amount;
for (uint256 i=0; i<NUMBER_VAULT_POOLS; i++) {
(amount,,,,) = vault.userInfo(i,_user);
if(amount >= eligibilityThreshold) {
return true;
}
}
return false;
}
function getUserMultiplier(address _user) public view returns(uint16) {
uint16 userMult;
uint16 mult;
uint256 amount;
for (uint8 i=0; i<NUMBER_VAULT_POOLS; i++) {
(amount,,,,) = vault.userInfo(i,_user);
for (uint8 j=0; j<NUMBER_THRESHOLDS; j++) {
mult = uint16(_multiplierInfo.poolBaseMult[i]) * uint16(_multiplierInfo.poolMultipliers[i][j]);
if(amount >= uint256(_multiplierInfo.poolThresholds[j])*1e18) {
if(mult > userMult) {
userMult = mult;
}
}
}
}
return (userMult);
}
/*///////////////////////////////////////////////////////////////
WITHDRAW LOGIC
//////////////////////////////////////////////////////////////*/
function withdrawPool(uint256 _amount, uint8 _pid)
external
override
nonReentrant
onlyWhenActive
{
UserInfo storage user = userInfo[msg.sender][_pid];
require(_pid < numberPools, "pool does not exist");
require(
poolInfo[_pid].offeringAmount > 0 &&
poolInfo[_pid].raisingAmount > 0,
"pool not set"
);
require(
_amount > 0 && user.amount > 0 && user.amount >= _amount,
"withdraw: amount higher than user balance"
);
user.amount -= _amount;
poolInfo[_pid].totalAmountPool -= _amount;
if (poolInfo[_pid].baseLimitInLP == 0) {
(uint16 multiplier) = getUserMultiplier(msg.sender);
poolInfo[_pid].totalAllocPoints -= userInfo[msg.sender][_pid].allocPoints;
userInfo[msg.sender][_pid].allocPoints = user.amount * uint256(multiplier);
poolInfo[_pid].totalAllocPoints += userInfo[msg.sender][_pid].allocPoints;
}
lpToken.safeTransfer(address(msg.sender), _amount);
emit Withdraw(msg.sender, _amount, _pid);
}
/*///////////////////////////////////////////////////////////////
HARVEST LOGIC
//////////////////////////////////////////////////////////////*/
function harvestPool(uint8 _pid, uint8 _harvestPeriod) external override nonReentrant onlyFinished {
require(_pid < numberPools, "pool does not exist");
require(_harvestPeriod < HARVEST_PERIODS, "harvest period out of range");
require(block.number > harvestReleaseBlocks[_harvestPeriod], "not harvest time");
require(userInfo[msg.sender][_pid].amount > 0, "did not participate");
require(!userInfo[msg.sender][_pid].claimed[_harvestPeriod], "harvest for period already claimed");
userInfo[msg.sender][_pid].claimed[_harvestPeriod] = true;
uint256 offeringTokenAmount;
uint256 refundingTokenAmount;
uint256 userTaxOverflow;
(offeringTokenAmount, refundingTokenAmount, userTaxOverflow) = _calcOfferingAndRefundingAmounts(
msg.sender,
_pid
);
if (userTaxOverflow > 0 && !userInfo[msg.sender][_pid].isRefunded) {
poolInfo[_pid].sumTaxesOverflow += userTaxOverflow;
}
if (refundingTokenAmount > 0 && !userInfo[msg.sender][_pid].isRefunded) {
userInfo[msg.sender][_pid].isRefunded = true;
lpToken.safeTransfer(address(msg.sender), refundingTokenAmount);
}
uint256 offeringTokenAmountPerPeriod;
if (offeringTokenAmount > 0) {
offeringTokenAmountPerPeriod = offeringTokenAmount * harvestReleasePercent[_harvestPeriod] / 1e4;
offeringToken.safeTransfer(address(msg.sender), offeringTokenAmountPerPeriod);
}
userInfo[msg.sender][_pid].claimed[_harvestPeriod] = true;
emit Harvest(msg.sender, offeringTokenAmountPerPeriod, refundingTokenAmount,_pid);
}
function _calcOfferingAndRefundingAmounts(address _user, uint8 _pid)
internal
view
returns (
uint256,
uint256,
uint256
)
{
uint256 userOfferingAmount;
uint256 userRefundingAmount;
uint256 taxAmount;
if (poolInfo[_pid].totalAmountPool > poolInfo[_pid].raisingAmount) {
uint256 allocation = _getUserAllocation(_user,_pid);
userOfferingAmount = poolInfo[_pid].offeringAmount * allocation / 1e12;
uint256 payAmount = poolInfo[_pid].raisingAmount * userInfo[_user][_pid].amount * 1e18 / poolInfo[_pid].totalAmountPool / 1e18;
userRefundingAmount = userInfo[_user][_pid].amount - payAmount;
if (poolInfo[_pid].hasTax) {
uint256 taxOverflow =
_calculateTaxOverflow(
poolInfo[_pid].totalAmountPool,
poolInfo[_pid].raisingAmount
);
taxAmount = userRefundingAmount * taxOverflow / 1e12;
userRefundingAmount -= taxAmount;
}
} else {
userRefundingAmount = 0;
taxAmount = 0;
if (poolInfo[_pid].baseLimitInLP > 0) {
userOfferingAmount = userInfo[_user][_pid].amount * poolInfo[_pid].offeringAmount / poolInfo[_pid].raisingAmount;
} else {
userOfferingAmount = poolInfo[_pid].offeringAmount * _getUserAllocation(_user,_pid) / 1e12;
}
}
return (userOfferingAmount, userRefundingAmount, taxAmount);
}
/**
* @notice It returns the user allocation for pool
* @dev (1e8) 10,000,000 means 0.1 (10%) / 1 means 0.000000001 (0.0000001%) / 100,000,000 means 1 (100%)
* @param _user: user address
* @param _pid: pool id
* @return it returns the user's share of pool
*/
function _getUserAllocation(address _user, uint8 _pid) view internal returns (uint256) {
if (poolInfo[_pid].totalAmountPool > 0) {
if(poolInfo[_pid].baseLimitInLP > 0) {
return userInfo[_user][_pid].amount * 1e18 / poolInfo[_pid].totalAmountPool / 1e6;
} else {
return userInfo[_user][_pid].allocPoints * 1e18 / poolInfo[_pid].totalAllocPoints / 1e6;
}
} else {
return 0;
}
}
/**
* @notice It calculates the tax overflow given the raisingAmountPool and the totalAmountPool.
* @dev 100,000,000,000 means 0.1 (10%) / 1 means 0.0000000000001 (0.0000001%) / 1,000,000,000,000 means 1 (100%)
* @return It returns the tax percentage
*/
function _calculateTaxOverflow(uint256 _totalAmountPool, uint256 _raisingAmountPool)
internal
pure
returns (uint256)
{
uint256 ratioOverflow = _totalAmountPool / _raisingAmountPool;
if (ratioOverflow >= 500) {
return 2000000000; // 0.2%
} else if (ratioOverflow >= 250) {
return 2500000000; // 0.25%
} else if (ratioOverflow >= 100) {
return 3000000000; // 0.3%
} else if (ratioOverflow >= 50) {
return 5000000000; // 0.5%
} else {
return 10000000000; // 1%
}
}
/*///////////////////////////////////////////////////////////////
PUBLIC GETTERS
//////////////////////////////////////////////////////////////*/
function hasHarvested(address _user, uint8 _pid, uint8 _harvestPeriod) public view returns (bool) {
return userInfo[_user][_pid].claimed[_harvestPeriod];
}
/**
* @notice It returns the tax overflow rate calculated for a pool
* @dev 100,000,000,000 means 0.1 (10%) / 1 means 0.0000000000001 (0.0000001%) / 1,000,000,000,000 means 1 (100%)
* @param _pid: poolId
* @return It returns the tax percentage
*/
function viewPoolTaxRateOverflow(uint256 _pid) external view override returns (uint256) {
if (!poolInfo[_pid].hasTax) {
return 0;
} else {
return
_calculateTaxOverflow(poolInfo[_pid].totalAmountPool, poolInfo[_pid].raisingAmount);
}
}
/**
* @notice External view function to see user allocations for both pools
* @param _user: user address
* @param _pids[]: array of pids
* @return
*/
function viewUserAllocationPools(address _user, uint8[] calldata _pids)
external
view
override
returns (uint256[] memory)
{
uint256[] memory allocationPools = new uint256[](_pids.length);
for (uint8 i = 0; i < _pids.length; i++) {
allocationPools[i] = _getUserAllocation(_user, _pids[i]);
}
return allocationPools;
}
/**
* @notice External view function to see user offering and refunding amounts for both pools
* @param _user: user address
* @param _pids: array of pids
*/
function viewUserOfferingAndRefundingAmountsForPools(address _user, uint8[] calldata _pids)
external
view
override
returns (uint256[3][] memory)
{
uint256[3][] memory amountPools = new uint256[3][](_pids.length);
for (uint8 i = 0; i < _pids.length; i++) {
uint256 userOfferingAmountPool;
uint256 userRefundingAmountPool;
uint256 userTaxAmountPool;
if (poolInfo[_pids[i]].raisingAmount > 0) {
(
userOfferingAmountPool,
userRefundingAmountPool,
userTaxAmountPool
) = _calcOfferingAndRefundingAmounts(_user, _pids[i]);
}
amountPools[i] = [userOfferingAmountPool, userRefundingAmountPool, userTaxAmountPool];
}
return amountPools;
}
function viewMultipliers()
public
view
returns(
uint16[] memory,
uint8[] memory,
uint8[][] memory
)
{
uint16[] memory _poolThresholds = new uint16[](_multiplierInfo.poolThresholds.length);
for (uint16 i = 0; i < _multiplierInfo.poolThresholds.length ;i++) {
_poolThresholds[i] = _multiplierInfo.poolThresholds[i];
}
uint8[] memory _poolBaseMult = new uint8[](_multiplierInfo.poolBaseMult.length);
for (uint8 i = 0; i < _multiplierInfo.poolBaseMult.length ;i++) {
_poolBaseMult[i] = _multiplierInfo.poolBaseMult[i];
}
uint8[][] memory _poolMultipliers = new uint8[][](_multiplierInfo.poolMultipliers.length);
for (uint8 i = 0; i < _multiplierInfo.poolMultipliers.length;i++) {
_poolMultipliers[i] = new uint8[](_multiplierInfo.poolMultipliers[i].length);
for (uint8 j = 0;j < _multiplierInfo.poolMultipliers[i].length;j++) {
_poolMultipliers[i][j] = _multiplierInfo.poolMultipliers[i][j];
}
}
return(
_poolThresholds,
_poolBaseMult,
_poolMultipliers
);
}
function enableClaim() external override onlyOwner {
require(block.number >= endBlock, "sale still active");
require(!claimEnabled, "claim is already enabled");
claimEnabled = true;
emit ClaimEnabled();
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"contract IERC20","name":"_offeringToken","type":"address"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"},{"internalType":"uint256","name":"_vestingBlockOffset","type":"uint256"},{"internalType":"uint256","name":"_eligibilityThreshold","type":"uint256"},{"internalType":"address","name":"_solarVault","type":"address"},{"internalType":"uint256[]","name":"_harvestReleasePercent","type":"uint256[]"},{"internalType":"bytes","name":"_multipliers","type":"bytes"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amountLP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOfferingToken","type":"uint256"}],"name":"AdminWithdraw","type":"event"},{"anonymous":false,"inputs":[],"name":"ClaimEnabled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"offeringAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"excessAmount","type":"uint256"},{"indexed":true,"internalType":"uint8","name":"pid","type":"uint8"}],"name":"Harvest","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16[3]","name":"poolStakedThresholds","type":"uint16[3]"},{"indexed":false,"internalType":"uint8[3]","name":"poolBaseMultiplier","type":"uint8[3]"},{"indexed":false,"internalType":"uint8[3][3]","name":"poolStakedMultipliers","type":"uint8[3][3]"}],"name":"MultiplierParametersSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewStartAndEndBlocks","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":"uint256","name":"raisingAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"offeringAmount","type":"uint256"},{"indexed":false,"internalType":"uint8","name":"pid","type":"uint8"}],"name":"PoolParametersSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"HARVEST_PERIODS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUMBER_THRESHOLDS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NUMBER_VAULT_POOLS","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_pid","type":"uint8"}],"name":"depositPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eligibilityThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpAmount","type":"uint256"},{"internalType":"uint256","name":"_offerAmount","type":"uint256"}],"name":"finalWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserEligibility","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserMultiplier","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"uint8","name":"_harvestPeriod","type":"uint8"}],"name":"harvestPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"harvestReleaseBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"harvestReleasePercent","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint8","name":"_pid","type":"uint8"},{"internalType":"uint8","name":"_harvestPeriod","type":"uint8"}],"name":"hasHarvested","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numberPools","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"offeringToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint256","name":"raisingAmount","type":"uint256"},{"internalType":"uint256","name":"offeringAmount","type":"uint256"},{"internalType":"uint256","name":"baseLimitInLP","type":"uint256"},{"internalType":"bool","name":"hasTax","type":"bool"},{"internalType":"uint256","name":"totalAmountPool","type":"uint256"},{"internalType":"uint256","name":"sumTaxesOverflow","type":"uint256"},{"internalType":"uint256","name":"totalAllocPoints","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eligibilityThreshold","type":"uint256"}],"name":"setEligibilityThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"_multipliers","type":"bytes"}],"name":"setMultipliers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_offeringToken","type":"address"}],"name":"setOfferingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_raisingAmount","type":"uint256"},{"internalType":"uint256","name":"_offeringAmount","type":"uint256"},{"internalType":"uint256","name":"_baseLimitInLP","type":"uint256"},{"internalType":"bool","name":"_hasTax","type":"bool"},{"internalType":"uint8","name":"_pid","type":"uint8"}],"name":"setPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sweep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_endBlock","type":"uint256"}],"name":"updateStartAndEndBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint8","name":"","type":"uint8"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"allocPoints","type":"uint256"},{"internalType":"bool","name":"isRefunded","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract SolarVault","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"viewMultipliers","outputs":[{"internalType":"uint16[]","name":"","type":"uint16[]"},{"internalType":"uint8[]","name":"","type":"uint8[]"},{"internalType":"uint8[][]","name":"","type":"uint8[][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"viewPoolTaxRateOverflow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint8[]","name":"_pids","type":"uint8[]"}],"name":"viewUserAllocationPools","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint8[]","name":"_pids","type":"uint8[]"}],"name":"viewUserOfferingAndRefundingAmountsForPools","outputs":[{"internalType":"uint256[3][]","name":"","type":"uint256[3][]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_pid","type":"uint8"}],"name":"withdrawPool","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60806040526010805460ff191690553480156200001b57600080fd5b50604051620055f2380380620055f28339810160408190526200003e9162000a89565b60016000556200004e33620003a6565b6000896001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200008a57600080fd5b505afa1580156200009f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c5919062000b5a565b1015620000d157600080fd5b6000886001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156200010d57600080fd5b505afa15801562000122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000148919062000b5a565b10156200015457600080fd5b876001600160a01b0316896001600160a01b03161415620001bc5760405162461bcd60e51b815260206004820152601860248201527f546f6b656e73206d75737420626520646966666572656e74000000000000000060448201526064015b60405180910390fd5b81516004146200020f5760405162461bcd60e51b815260206004820152601b60248201527f68617276657374207363686564756c65206d757374206d6174636800000000006044820152606401620001b3565b6000805b83518110156200025e5783818151811062000232576200023262000d0b565b60200260200101518262000247919062000c77565b915080620002558162000cb4565b91505062000213565b508061271014620002b25760405162461bcd60e51b815260206004820181905260248201527f686172766573742070657263656e74206d75737420746f74616c2031303030306044820152606401620001b3565b600280546001600160a01b03808d166001600160a01b031992831617909255600380548c8416908316179055600d8a9055600e899055600f87905560048054928716929091169190911790556200030982620003f8565b60005b6004811015620003955762000322818862000c92565b600e5462000331919062000c77565b6005826004811062000347576200034762000d0b565b0155835184908290811062000360576200036062000d0b565b6020026020010151600982600481106200037e576200037e62000d0b565b0155806200038c8162000cb4565b9150506200030c565b505050505050505050505062000d50565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060008380602001905181019062000413919062000983565b925092509250600360ff1682511480156200042f575080516003145b6200047d5760405162461bcd60e51b815260206004820152601560248201527f626164207661756c7420706f6f6c206c656e67746800000000000000000000006044820152606401620001b3565b8251600314620004d05760405162461bcd60e51b815260206004820152601460248201527f626164207468726573686f6c64206c656e6774680000000000000000000000006044820152606401620001b3565b60005b600360ff821610156200055757838160ff1681518110620004f857620004f862000d0b565b602002602001015160206000018260ff16600381106200051c576200051c62000d0b565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555080806200054e9062000cd2565b915050620004d3565b5060005b600360ff821610156200070857828160ff168151811062000580576200058062000d0b565b602002602001015160206001018260ff1660038110620005a457620005a462000d0b565b602091828204019190066101000a81548160ff021916908360ff160217905550600360ff16828260ff1681518110620005e157620005e162000d0b565b60200260200101515114620006395760405162461bcd60e51b815260206004820152601460248201527f626164207468726573686f6c64206c656e6774680000000000000000000000006044820152606401620001b3565b60005b600360ff82161015620006f257828260ff168151811062000661576200066162000d0b565b60200260200101518160ff168151811062000680576200068062000d0b565b602002602001015160206002018360ff1660038110620006a457620006a462000d0b565b018260ff1660038110620006bc57620006bc62000d0b565b602091828204019190066101000a81548160ff021916908360ff1602179055508080620006e99062000cd2565b9150506200063c565b5080620006ff8162000cd2565b9150506200055b565b506040517fbfd876ad455399d10dc2d1788e56b9526a9ca9d32b9e5c6dc9b7a8d63f8d2ef190620007429060209060219060229062000b74565b60405180910390a150505050565b80516200075d8162000d37565b919050565b600082601f8301126200077457600080fd5b815160206200078d620007878362000c51565b62000c1e565b80838252828201915082860187848660051b8901011115620007ae57600080fd5b6000805b86811015620007f55782516001600160401b03811115620007d1578283fd5b620007e18b88838d010162000877565b8652509385019391850191600101620007b2565b509198975050505050505050565b600082601f8301126200081557600080fd5b8151602062000828620007878362000c51565b80838252828201915082860187848660051b89010111156200084957600080fd5b60005b858110156200086a578151845292840192908401906001016200084c565b5090979650505050505050565b600082601f8301126200088957600080fd5b815160206200089c620007878362000c51565b80838252828201915082860187848660051b8901011115620008bd57600080fd5b6000805b86811015620007f557825160ff81168114620008db578283fd5b85529385019391850191600101620008c1565b600082601f8301126200090057600080fd5b81516001600160401b038111156200091c576200091c62000d21565b602062000932601f8301601f1916820162000c1e565b82815285828487010111156200094757600080fd5b60005b83811015620009675785810183015182820184015282016200094a565b83811115620009795760008385840101525b5095945050505050565b6000806000606084860312156200099957600080fd5b83516001600160401b0380821115620009b157600080fd5b818601915086601f830112620009c657600080fd5b81516020620009d9620007878362000c51565b8083825282820191508286018b848660051b8901011115620009fa57600080fd5b600096505b8487101562000a3057805161ffff8116811462000a1b57600080fd5b835260019690960195918301918301620009ff565b509189015191975090935050508082111562000a4b57600080fd5b62000a598783880162000877565b9350604086015191508082111562000a7057600080fd5b5062000a7f8682870162000762565b9150509250925092565b60008060008060008060008060006101208a8c03121562000aa957600080fd5b895162000ab68162000d37565b60208b015190995062000ac98162000d37565b8098505060408a0151965060608a0151955060808a0151945060a08a0151935062000af760c08b0162000750565b60e08b01519093506001600160401b038082111562000b1557600080fd5b62000b238d838e0162000803565b93506101008c015191508082111562000b3b57600080fd5b5062000b4a8c828d01620008ee565b9150509295985092959850929598565b60006020828403121562000b6d57600080fd5b5051919050565b60006101e082019050845461ffff8082168452808260101c166020850152808260201c1660408501525050606062000bce81840186805460ff8116835260ff8160081c16602084015260ff8160101c166040840152505050565b60c083018460005b600381101562000c1257815460ff8082168552600882901c8116602086015260109190911c166040840152918301916001918201910162000bd6565b50505050949350505050565b604051601f8201601f191681016001600160401b038111828210171562000c495762000c4962000d21565b604052919050565b60006001600160401b0382111562000c6d5762000c6d62000d21565b5060051b60200190565b6000821982111562000c8d5762000c8d62000cf5565b500190565b600081600019048311821515161562000caf5762000caf62000cf5565b500290565b600060001982141562000ccb5762000ccb62000cf5565b5060010190565b600060ff821660ff81141562000cec5762000cec62000cf5565b60010192915050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811462000d4d57600080fd5b50565b6148928062000d606000396000f3fe608060405234801561001057600080fd5b506004361061025c5760003560e01c80638da5cb5b11610145578063b7813607116100bd578063dc8d31b61161008c578063f2fde38b11610071578063f2fde38b14610587578063f9cd5c121461059a578063fbfa77cf146105ba57600080fd5b8063dc8d31b61461056b578063efccd9ac1461057457600080fd5b8063b781360714610505578063c5e22f3f14610525578063ca463ca41461054b578063d08d66bd1461045e57600080fd5b80639f1b524811610114578063b1c97194116100f9578063b1c9719414610490578063b2151071146104ea578063b42392f1146104fd57600080fd5b80639f1b524814610466578063a330ebc01461047957600080fd5b80638da5cb5b1461041a5780639513997f14610438578063973540d91461044b5780639ccb28341461045e57600080fd5b8063362b297c116101d857806348cd4cb1116101a75780636ea056a91161018c5780636ea056a9146103ec578063715018a6146103ff5780637f1bdd761461040757600080fd5b806348cd4cb11461039e5780635fcbd285146103a757600080fd5b8063362b297c1461035257806337f859b8146103655780633c7d0d961461037857806345b8bf911461038b57600080fd5b80631526fe271161022f5780632799d8df116102145780632799d8df1461031a5780632866ed211461033d57806328dae6e31461034a57600080fd5b80631526fe27146102bf5780631adad1a11461030757600080fd5b8063083c632314610261578063089a6fb81461027d5780630e1da786146102925780631025bff8146102ac575b600080fd5b61026a600e5481565b6040519081526020015b60405180910390f35b61029061028b366004614275565b6105da565b005b61029a600481565b60405160ff9091168152602001610274565b61026a6102ba36600461418b565b610a46565b6102d26102cd36600461418b565b610a5d565b604080519788526020880196909652948601939093529015156060850152608084015260a083015260c082015260e001610274565b61026a61031536600461418b565b610aa4565b61032d610328366004613f79565b610ab4565b6040519015158152602001610274565b60105461032d9060ff1681565b610290610b1d565b6102906103603660046140d8565b610ccd565b61026a61037336600461418b565b610dc5565b61029061038636600461418b565b610e32565b6102906103993660046141df565b610f23565b61026a600d5481565b6002546103c79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610274565b6102906103fa366004613f14565b611174565b610290611316565b610290610415366004614275565b6113a3565b60015473ffffffffffffffffffffffffffffffffffffffff166103c7565b6102906104463660046141bd565b6119da565b6102906104593660046142b7565b611c24565b61029a600381565b6102906104743660046141bd565b61225f565b6104816125e9565b60405161027493929190614440565b6104cd61049e366004613f40565b601160209081526000928352604080842090915290825290208054600182015460039092015490919060ff1683565b604080519384526020840192909252151590820152606001610274565b61032d6104f8366004613e6f565b61289a565b61029a600281565b6003546103c79073ffffffffffffffffffffffffffffffffffffffff1681565b610538610533366004613e6f565b612987565b60405161ffff9091168152602001610274565b61055e610559366004613e8c565b612b69565b604051610274919061432f565b61026a600f5481565b610290610582366004613e6f565b612cb5565b610290610595366004613e6f565b612e73565b6105ad6105a8366004613e8c565b612fa0565b6040516102749190614510565b6004546103c79073ffffffffffffffffffffffffffffffffffffffff1681565b6002600054141561064c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600055600d5443108015906106645750600e5443105b6106ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f53616c65206e6f742061637469766500000000000000000000000000000000006044820152606401610643565b33600090815260116020908152604080832060ff8516808552925290912090600211610752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610643565b600060128360ff166002811061076a5761076a6147bf565b60070201600101541180156107995750600060128360ff1660028110610792576107926147bf565b6007020154115b6107ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f706f6f6c206e6f742073657400000000000000000000000000000000000000006044820152606401610643565b60008311801561080f5750805415155b801561081c575080548311155b6108a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f77697468647261773a20616d6f756e7420686967686572207468616e2075736560448201527f722062616c616e636500000000000000000000000000000000000000000000006064820152608401610643565b828160000160008282546108bc91906146d2565b90915550839050601260ff8416600281106108d9576108d96147bf565b6007020160040160008282546108ef91906146d2565b909155506012905060ff83166002811061090b5761090b6147bf565b6007020160020154600014156109de57600061092633612987565b33600090815260116020908152604080832060ff88168085529252909120600101549192506012906002811061095e5761095e6147bf565b60070201600601600082825461097491906146d2565b9091555050815461098a9061ffff831690614695565b33600090815260116020908152604080832060ff88168085529252909120600101829055601290600281106109c1576109c16147bf565b6007020160060160008282546109d79190614618565b9091555050505b600254610a029073ffffffffffffffffffffffffffffffffffffffff16338561305c565b60405183815260ff83169033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35050600160005550565b60058160048110610a5657600080fd5b0154905081565b60128160028110610a6d57600080fd5b600702018054600182015460028301546003840154600485015460058601546006909601549496509294919360ff90911692919087565b60098160048110610a5657600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260116020908152604080832060ff80871685529252822060020190831660048110610afd57610afd6147bf565b602081049091015460ff601f9092166101000a90041690505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600e54431015610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73616c65207374696c6c206163746976650000000000000000000000000000006044820152606401610643565b60105460ff1615610c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f636c61696d20697320616c726561647920656e61626c656400000000000000006044820152606401610643565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517fca666f7745697e47f1359d151c9445641549379e821785dd1fa6c38f7f8bc3da90600090a1565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d544310610db9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b610dc281613135565b50565b600060128260028110610dda57610dda6147bf565b600702016003015460ff16610df157506000919050565b610e2c60128360028110610e0757610e076147bf565b600702016004015460128460028110610e2257610e226147bf565b60070201546134a9565b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610eb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d544310610f1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b600f55565b60015473ffffffffffffffffffffffffffffffffffffffff163314610fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d54431061100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b600260ff82161061107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610643565b8460128260ff1660028110611093576110936147bf565b600702015583601260ff8316600281106110af576110af6147bf565b60070201600101819055508260128260ff16600281106110d1576110d16147bf565b60070201600201819055508160128260ff16600281106110f3576110f36147bf565b6007020160030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055604080518581526020810187905260ff8316918101919091527fddaf243a142670be60c19ff7116b5d8b124717b29bb4cc03cead42161614105b9060600160405180910390a15050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b60025473ffffffffffffffffffffffffffffffffffffffff83811691161480159061123b575060035473ffffffffffffffffffffffffffffffffffffffff838116911614155b6112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f43616e6e6f74206265204c50206f72204f66666572696e6720746f6b656e00006044820152606401610643565b6112c273ffffffffffffffffffffffffffffffffffffffff8316338361305c565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b6113a1600061351c565b565b600d5443101580156113b65750600e5443105b61141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f53616c65206e6f742061637469766500000000000000000000000000000000006044820152606401610643565b60026000541415611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610643565b6002600081815533815260116020908152604080832060ff861680855292529091209111611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610643565b600060128360ff166002811061152b5761152b6147bf565b600702016001015411801561155a5750600060128360ff1660028110611553576115536147bf565b6007020154115b6115c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f506f6f6c206e6f742073657400000000000000000000000000000000000000006044820152606401610643565b60005b600260ff82161015611673578260ff168160ff16146116615733600090815260116020908152604080832060ff8516845290915290205415611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f616c726561647920636f6d6d6974656420696e20616e6f7468657220706f6f6c6044820152606401610643565b8061166b81614770565b9150506115c3565b5060005b600381101561171c57600480546040517fe2bbb1580000000000000000000000000000000000000000000000000000000081529182018390526000602483015273ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b1580156116f157600080fd5b505af1158015611705573d6000803e3d6000fd5b50505050808061171490614737565b915050611677565b5060006117283361289a565b905080611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f75736572206e6f7420656c696769626c650000000000000000000000000000006044820152606401610643565b6002546117b69073ffffffffffffffffffffffffffffffffffffffff16333087613593565b838260000160008282546117ca9190614618565b9091555060009050601260ff8516600281106117e8576117e86147bf565b600702016002015411156118a057600061180133612987565b90508061ffff1660128560ff166002811061181e5761181e6147bf565b60070201600201546118309190614695565b8354111561189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e657720616d6f756e742061626f76652075736572206c696d697400000000006044820152606401610643565b50611963565b60006118ab33612987565b33600090815260116020908152604080832060ff8916808552925290912060010154919250601290600281106118e3576118e36147bf565b6007020160060160008282546118f991906146d2565b9091555050825461190f9061ffff831690614695565b33600090815260116020908152604080832060ff8916808552925290912060010182905560129060028110611946576119466147bf565b60070201600601600082825461195c9190614618565b9091555050505b8360128460ff166002811061197a5761197a6147bf565b6007020160040160008282546119909190614618565b909155505060405184815260ff84169033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505060016000555050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d544310611ac6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b808210611b55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f6e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201527f6e206e657720656e64426c6f636b0000000000000000000000000000000000006064820152608401610643565b814310611be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201527f616e2063757272656e7420626c6f636b000000000000000000000000000000006064820152608401610643565b600d829055600e81905560408051838152602081018390527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce06910161130a565b60026000541415611c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610643565b6002600055600e544310801590611caa575060105460ff165b611d10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73616c65206e6f742066696e69736865640000000000000000000000000000006044820152606401610643565b600260ff831610611d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610643565b600460ff821610611dea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6861727665737420706572696f64206f7574206f662072616e676500000000006044820152606401610643565b60058160ff1660048110611e0057611e006147bf565b01544311611e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6e6f7420686172766573742074696d65000000000000000000000000000000006044820152606401610643565b33600090815260116020908152604080832060ff86168452909152902054611eee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f646964206e6f74207061727469636970617465000000000000000000000000006044820152606401610643565b33600090815260116020908152604080832060ff8087168552925290912060020190821660048110611f2257611f226147bf565b602081049091015460ff601f9092166101000a90041615611fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f6861727665737420666f7220706572696f6420616c726561647920636c61696d60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610643565b33600090815260116020908152604080832060ff80871685529252909120600191600290910190831660048110611ffe57611ffe6147bf565b602091828204019190066101000a81548160ff021916908315150217905550600080600061202c33866135f7565b919450925090508015801590612062575033600090815260116020908152604080832060ff808a16855292529091206003015416155b1561209a578060128660ff166002811061207e5761207e6147bf565b6007020160050160008282546120949190614618565b90915550505b6000821180156120ca575033600090815260116020908152604080832060ff808a16855292529091206003015416155b1561213f5733600081815260116020908152604080832060ff8a168452909152902060030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560025461213f9173ffffffffffffffffffffffffffffffffffffffff91909116908461305c565b6000831561219d5761271060098660ff1660048110612160576121606147bf565b015461216c9086614695565b6121769190614630565b60035490915061219d9073ffffffffffffffffffffffffffffffffffffffff16338361305c565b33600090815260116020908152604080832060ff808b16855292529091206001916002909101908716600481106121d6576121d66147bf565b602091828204019190066101000a81548160ff0219169083151502179055508560ff163373ffffffffffffffffffffffffffffffffffffffff167f51524c2e5edfedf8b01b29719c661e4fbe27e71734e7cd773dabb7cb712fb3b3838660405161224a929190918252602082015260400190565b60405180910390a35050600160005550505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146122e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600e54431161234b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f73616c6520686173206e6f742066696e697368656400000000000000000000006044820152606401610643565b6002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b1580156123b457600080fd5b505afa1580156123c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ec91906141a4565b821115612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f7420656e6f756768204c5020746f6b656e730000000000000000000000006044820152606401610643565b6003546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b1580156124be57600080fd5b505afa1580156124d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f691906141a4565b81111561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f7420656e6f756768206f66666572696e6720746f6b656e730000000000006044820152606401610643565b8115612589576002546125899073ffffffffffffffffffffffffffffffffffffffff16338461305c565b80156125b3576003546125b39073ffffffffffffffffffffffffffffffffffffffff16338361305c565b60408051838152602081018390527f94ebb62a252249c867ecb758d386f50a95be7e8df9e1c52917c9cf494327dd7d910161130a565b60408051600380825260808201909252606091829182916000919060208201848036833701905050905060005b60038161ffff16101561268f57602061ffff82166003811061263a5761263a6147bf565b601091828204019190066002029054906101000a900461ffff16828261ffff168151811061266a5761266a6147bf565b61ffff909216602092830291909101909101528061268781614715565b915050612616565b50604080516003808252608082019092526000916020820160608036833701905050905060005b60038160ff16101561272757602160ff8216600381106126d8576126d86147bf565b602091828204019190069054906101000a900460ff16828260ff1681518110612703576127036147bf565b60ff909216602092830291909101909101528061271f81614770565b9150506126b6565b5060408051600380825260808201909252600091816020015b606081526020019060019003908161274057905050905060005b60038160ff16101561288d57602260ff82166003811061277c5761277c6147bf565b505060408051600380825260808201909252906020820160608036833701905050828260ff16815181106127b2576127b26147bf565b602002602001018190525060005b602260ff8316600381106127d6576127d66147bf565b505060038160ff16101561287a57602260ff8316600381106127fa576127fa6147bf565b018160ff166003811061280f5761280f6147bf565b602091828204019190069054906101000a900460ff16838360ff168151811061283a5761283a6147bf565b60200260200101518260ff1681518110612856576128566147bf565b60ff909216602092830291909101909101528061287281614770565b9150506127c0565b508061288581614770565b91505061275a565b5091959094509092509050565b60008060005b600381101561297d57600480546040517f93f1a40b00000000000000000000000000000000000000000000000000000000815291820183905273ffffffffffffffffffffffffffffffffffffffff868116602484015216906393f1a40b9060440160a06040518083038186803b15801561291957600080fd5b505afa15801561292d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129519190614235565b5050600f549294505050821061296b575060019392505050565b8061297581614737565b9150506128a0565b5060009392505050565b60008060008060005b600360ff82161015612b5f57600480546040517f93f1a40b00000000000000000000000000000000000000000000000000000000815260ff84169281019290925273ffffffffffffffffffffffffffffffffffffffff888116602484015216906393f1a40b9060440160a06040518083038186803b158015612a1157600080fd5b505afa158015612a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a499190614235565b509294506000925050505b600360ff82161015612b4c57602260ff831660038110612a7657612a766147bf565b018160ff1660038110612a8b57612a8b6147bf565b602081049091015460ff601f9092166101000a9004811690602190841660038110612ab857612ab86147bf565b602081049190910154612ad79291601f166101000a900460ff1661466b565b9350602060ff821660038110612aef57612aef6147bf565b601091828204019190066002029054906101000a900461ffff1661ffff16670de0b6b3a7640000612b209190614695565b8310612b3a578461ffff168461ffff161115612b3a578394505b80612b4481614770565b915050612a54565b5080612b5781614770565b915050612990565b5091949350505050565b606060008267ffffffffffffffff811115612b8657612b866147ee565b604051908082528060200260200182016040528015612bbf57816020015b612bac613d44565b815260200190600190039081612ba45790505b50905060005b60ff8116841115612cac57600080600080601289898760ff16818110612bed57612bed6147bf565b9050602002016020810190612c02919061429a565b60ff1660028110612c1557612c156147bf565b60070201541115612c5b57612c538989898760ff16818110612c3957612c396147bf565b9050602002016020810190612c4e919061429a565b6135f7565b919450925090505b604051806060016040528084815260200183815260200182815250858560ff1681518110612c8b57612c8b6147bf565b60200260200101819052505050508080612ca490614770565b915050612bc5565b50949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314612d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d544310612da1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612de957600080fd5b505afa158015612dfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2191906141a4565b1015612e2c57600080fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314612ef4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b73ffffffffffffffffffffffffffffffffffffffff8116612f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610643565b610dc28161351c565b606060008267ffffffffffffffff811115612fbd57612fbd6147ee565b604051908082528060200260200182016040528015612fe6578160200160208202803683370190505b50905060005b60ff8116841115612cac5761302a8686868460ff16818110613010576130106147bf565b9050602002016020810190613025919061429a565b61390b565b828260ff168151811061303f5761303f6147bf565b60209081029190910101528061305481614770565b915050612fec565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526131309084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613a4e565b505050565b60008060008380602001905181019061314e9190613fc4565b925092509250600360ff168251148015613169575080516003145b6131cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f626164207661756c7420706f6f6c206c656e67746800000000000000000000006044820152606401610643565b825160031461323a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f626164207468726573686f6c64206c656e6774680000000000000000000000006044820152606401610643565b60005b600360ff821610156132b757838160ff168151811061325e5761325e6147bf565b602002602001015160206000018260ff166003811061327f5761327f6147bf565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555080806132af90614770565b91505061323d565b5060005b600360ff8216101561346357828160ff16815181106132dc576132dc6147bf565b602002602001015160206001018260ff16600381106132fd576132fd6147bf565b602091828204019190066101000a81548160ff021916908360ff160217905550600360ff16828260ff1681518110613337576133376147bf565b602002602001015151146133a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f626164207468726573686f6c64206c656e6774680000000000000000000000006044820152606401610643565b60005b600360ff8216101561345057828260ff16815181106133cb576133cb6147bf565b60200260200101518160ff16815181106133e7576133e76147bf565b602002602001015160206002018360ff1660038110613408576134086147bf565b018260ff166003811061341d5761341d6147bf565b602091828204019190066101000a81548160ff021916908360ff160217905550808061344890614770565b9150506133aa565b508061345b81614770565b9150506132bb565b506040517fbfd876ad455399d10dc2d1788e56b9526a9ca9d32b9e5c6dc9b7a8d63f8d2ef19061349b90602090602190602290614399565b60405180910390a150505050565b6000806134b68385614630565b90506101f481106134ce576377359400915050610e2c565b60fa81106134e357639502f900915050610e2c565b606481106134f85763b2d05e00915050610e2c565b6032811061350e5764012a05f200915050610e2c565b506402540be4009392505050565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135f19085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016130ae565b50505050565b60008060008060008060128760ff1660028110613616576136166147bf565b6007020154601260ff891660028110613631576136316147bf565b6007020160040154111561380557600061364b898961390b565b905064e8d4a510008160128a60ff166002811061366a5761366a6147bf565b600702016001015461367c9190614695565b6136869190614630565b93506000670de0b6b3a764000060128a60ff16600281106136a9576136a96147bf565b600702016004015473ffffffffffffffffffffffffffffffffffffffff8c16600090815260116020908152604080832060ff8f1680855292529091205490601290600281106136fa576136fa6147bf565b60070201546137099190614695565b61371b90670de0b6b3a7640000614695565b6137259190614630565b61372f9190614630565b73ffffffffffffffffffffffffffffffffffffffff8b16600090815260116020908152604080832060ff8e1684529091529020549091506137719082906146d2565b935060128960ff1660028110613789576137896147bf565b600702016003015460ff16156137fe5760006137d260128b60ff16600281106137b4576137b46147bf565b600702016004015460128c60ff1660028110610e2257610e226147bf565b905064e8d4a510006137e48287614695565b6137ee9190614630565b93506137fa84866146d2565b9450505b50506138fd565b50600090508080601260ff891660028110613822576138226147bf565b600702016002015411156138b85760128760ff1660028110613846576138466147bf565b6007020154601260ff891660028110613861576138616147bf565b600702016001015473ffffffffffffffffffffffffffffffffffffffff8a16600090815260116020908152604080832060ff8d1684529091529020546138a79190614695565b6138b19190614630565b92506138fd565b64e8d4a510006138c8898961390b565b60128960ff16600281106138de576138de6147bf565b60070201600101546138f09190614695565b6138fa9190614630565b92505b919450925090509250925092565b60008060128360ff1660028110613924576139246147bf565b60070201600401541115613a4657600060128360ff166002811061394a5761394a6147bf565b600702016002015411156139db57620f424060128360ff1660028110613972576139726147bf565b600702016004015473ffffffffffffffffffffffffffffffffffffffff8516600090815260116020908152604080832060ff881684529091529020546139c090670de0b6b3a7640000614695565b6139ca9190614630565b6139d49190614630565b9050610e2c565b620f424060128360ff16600281106139f5576139f56147bf565b600702016006015473ffffffffffffffffffffffffffffffffffffffff8516600090815260116020908152604080832060ff881684529091529020600101546139c090670de0b6b3a7640000614695565b506000610e2c565b6000613ab0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613b5a9092919063ffffffff16565b8051909150156131305780806020019051810190613ace91906140bb565b613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610643565b6060613b698484600085613b71565b949350505050565b606082471015613c03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610643565b843b613c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610643565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c949190614313565b60006040518083038185875af1925050503d8060008114613cd1576040519150601f19603f3d011682016040523d82523d6000602084013e613cd6565b606091505b5091509150613ce6828286613cf1565b979650505050505050565b60608315613d00575081610b16565b825115613d105782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106439190614554565b60405180606001604052806003906020820280368337509192915050565b600082601f830112613d7357600080fd5b81516020613d88613d83836145f4565b6145a5565b80838252828201915082860187848660051b8901011115613da857600080fd5b6000805b86811015613deb57825167ffffffffffffffff811115613dca578283fd5b613dd88b88838d0101613df9565b8652509385019391850191600101613dac565b509198975050505050505050565b600082601f830112613e0a57600080fd5b81516020613e1a613d83836145f4565b80838252828201915082860187848660051b8901011115613e3a57600080fd5b60005b85811015613e62578151613e508161484d565b84529284019290840190600101613e3d565b5090979650505050505050565b600060208284031215613e8157600080fd5b8135610b168161481d565b600080600060408486031215613ea157600080fd5b8335613eac8161481d565b9250602084013567ffffffffffffffff80821115613ec957600080fd5b818601915086601f830112613edd57600080fd5b813581811115613eec57600080fd5b8760208260051b8501011115613f0157600080fd5b6020830194508093505050509250925092565b60008060408385031215613f2757600080fd5b8235613f328161481d565b946020939093013593505050565b60008060408385031215613f5357600080fd5b8235613f5e8161481d565b91506020830135613f6e8161484d565b809150509250929050565b600080600060608486031215613f8e57600080fd5b8335613f998161481d565b92506020840135613fa98161484d565b91506040840135613fb98161484d565b809150509250925092565b600080600060608486031215613fd957600080fd5b835167ffffffffffffffff80821115613ff157600080fd5b818601915086601f83011261400557600080fd5b81516020614015613d83836145f4565b8083825282820191508286018b848660051b890101111561403557600080fd5b600096505b8487101561406857805161ffff8116811461405457600080fd5b83526001969096019591830191830161403a565b509189015191975090935050508082111561408257600080fd5b61408e87838801613df9565b935060408601519150808211156140a457600080fd5b506140b186828701613d62565b9150509250925092565b6000602082840312156140cd57600080fd5b8151610b168161483f565b600060208083850312156140eb57600080fd5b823567ffffffffffffffff8082111561410357600080fd5b818501915085601f83011261411757600080fd5b813581811115614129576141296147ee565b614159847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016145a5565b9150808252868482850101111561416f57600080fd5b8084840185840137600090820190930192909252509392505050565b60006020828403121561419d57600080fd5b5035919050565b6000602082840312156141b657600080fd5b5051919050565b600080604083850312156141d057600080fd5b50508035926020909101359150565b600080600080600060a086880312156141f757600080fd5b85359450602086013593506040860135925060608601356142178161483f565b915060808601356142278161484d565b809150509295509295909350565b600080600080600060a0868803121561424d57600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000806040838503121561428857600080fd5b823591506020830135613f6e8161484d565b6000602082840312156142ac57600080fd5b8135610b168161484d565b600080604083850312156142ca57600080fd5b8235613f5e8161484d565b600081518084526020808501945080840160005b8381101561430857815160ff16875295820195908201906001016142e9565b509495945050505050565b600082516143258184602087016146e9565b9190910192915050565b602080825282518282018190526000919084820190604085019084805b8281101561438c57845184835b600381101561437657825182529188019190880190600101614359565b505050938501936060939093019260010161434c565b5091979650505050505050565b60006101e082019050845461ffff8082168452808260101c166020850152808260201c166040850152505060606143f281840186805460ff8116835260ff8160081c16602084015260ff8160101c166040840152505050565b60c083018460005b600381101561443457815460ff8082168552600882901c8116602086015260109190911c16604084015291830191600191820191016143fa565b50505050949350505050565b606080825284519082018190526000906020906080840190828801845b8281101561447d57815161ffff168452928401929084019060010161445d565b5050508381038285015261449181876142d5565b905083810360408501528085518083528383019150838160051b84010184880160005b83811015614500577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526144ee8383516142d5565b948701949250908601906001016144b4565b50909a9950505050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156145485783518352928401929184019160010161452c565b50909695505050505050565b60208152600082518060208401526145738160408501602087016146e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156145ec576145ec6147ee565b604052919050565b600067ffffffffffffffff82111561460e5761460e6147ee565b5060051b60200190565b6000821982111561462b5761462b614790565b500190565b600082614666577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600061ffff8083168185168183048111821515161561468c5761468c614790565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146cd576146cd614790565b500290565b6000828210156146e4576146e4614790565b500390565b60005b838110156147045781810151838201526020016146ec565b838111156135f15750506000910152565b600061ffff8083168181141561472d5761472d614790565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561476957614769614790565b5060010190565b600060ff821660ff81141561478757614787614790565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610dc257600080fd5b8015158114610dc257600080fd5b60ff81168114610dc257600080fdfea2646970667358221220b76543ee55fddcee9e0e4f716bc106539b94eb44bf7fd4845c5b8a4801f51fd064736f6c634300080700330000000000000000000000007eda899b3522683636746a2f3a7814e6ffca75e10000000000000000000000001e0f2a75be02c025bd84177765f89200c04337da00000000000000000000000000000000000000000000000000000000000c5a0800000000000000000000000000000000000000000000000000000000000c5fd0000000000000000000000000000000000000000000000000000000000002b57e000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000007e6e03822d0077f3c417d33caeac900fc2645679000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000091d000000000000000000000000000000000000000000000000000000000000091d000000000000000000000000000000000000000000000000000000000000091e0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061025c5760003560e01c80638da5cb5b11610145578063b7813607116100bd578063dc8d31b61161008c578063f2fde38b11610071578063f2fde38b14610587578063f9cd5c121461059a578063fbfa77cf146105ba57600080fd5b8063dc8d31b61461056b578063efccd9ac1461057457600080fd5b8063b781360714610505578063c5e22f3f14610525578063ca463ca41461054b578063d08d66bd1461045e57600080fd5b80639f1b524811610114578063b1c97194116100f9578063b1c9719414610490578063b2151071146104ea578063b42392f1146104fd57600080fd5b80639f1b524814610466578063a330ebc01461047957600080fd5b80638da5cb5b1461041a5780639513997f14610438578063973540d91461044b5780639ccb28341461045e57600080fd5b8063362b297c116101d857806348cd4cb1116101a75780636ea056a91161018c5780636ea056a9146103ec578063715018a6146103ff5780637f1bdd761461040757600080fd5b806348cd4cb11461039e5780635fcbd285146103a757600080fd5b8063362b297c1461035257806337f859b8146103655780633c7d0d961461037857806345b8bf911461038b57600080fd5b80631526fe271161022f5780632799d8df116102145780632799d8df1461031a5780632866ed211461033d57806328dae6e31461034a57600080fd5b80631526fe27146102bf5780631adad1a11461030757600080fd5b8063083c632314610261578063089a6fb81461027d5780630e1da786146102925780631025bff8146102ac575b600080fd5b61026a600e5481565b6040519081526020015b60405180910390f35b61029061028b366004614275565b6105da565b005b61029a600481565b60405160ff9091168152602001610274565b61026a6102ba36600461418b565b610a46565b6102d26102cd36600461418b565b610a5d565b604080519788526020880196909652948601939093529015156060850152608084015260a083015260c082015260e001610274565b61026a61031536600461418b565b610aa4565b61032d610328366004613f79565b610ab4565b6040519015158152602001610274565b60105461032d9060ff1681565b610290610b1d565b6102906103603660046140d8565b610ccd565b61026a61037336600461418b565b610dc5565b61029061038636600461418b565b610e32565b6102906103993660046141df565b610f23565b61026a600d5481565b6002546103c79073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610274565b6102906103fa366004613f14565b611174565b610290611316565b610290610415366004614275565b6113a3565b60015473ffffffffffffffffffffffffffffffffffffffff166103c7565b6102906104463660046141bd565b6119da565b6102906104593660046142b7565b611c24565b61029a600381565b6102906104743660046141bd565b61225f565b6104816125e9565b60405161027493929190614440565b6104cd61049e366004613f40565b601160209081526000928352604080842090915290825290208054600182015460039092015490919060ff1683565b604080519384526020840192909252151590820152606001610274565b61032d6104f8366004613e6f565b61289a565b61029a600281565b6003546103c79073ffffffffffffffffffffffffffffffffffffffff1681565b610538610533366004613e6f565b612987565b60405161ffff9091168152602001610274565b61055e610559366004613e8c565b612b69565b604051610274919061432f565b61026a600f5481565b610290610582366004613e6f565b612cb5565b610290610595366004613e6f565b612e73565b6105ad6105a8366004613e8c565b612fa0565b6040516102749190614510565b6004546103c79073ffffffffffffffffffffffffffffffffffffffff1681565b6002600054141561064c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064015b60405180910390fd5b6002600055600d5443108015906106645750600e5443105b6106ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f53616c65206e6f742061637469766500000000000000000000000000000000006044820152606401610643565b33600090815260116020908152604080832060ff8516808552925290912090600211610752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610643565b600060128360ff166002811061076a5761076a6147bf565b60070201600101541180156107995750600060128360ff1660028110610792576107926147bf565b6007020154115b6107ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f706f6f6c206e6f742073657400000000000000000000000000000000000000006044820152606401610643565b60008311801561080f5750805415155b801561081c575080548311155b6108a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f77697468647261773a20616d6f756e7420686967686572207468616e2075736560448201527f722062616c616e636500000000000000000000000000000000000000000000006064820152608401610643565b828160000160008282546108bc91906146d2565b90915550839050601260ff8416600281106108d9576108d96147bf565b6007020160040160008282546108ef91906146d2565b909155506012905060ff83166002811061090b5761090b6147bf565b6007020160020154600014156109de57600061092633612987565b33600090815260116020908152604080832060ff88168085529252909120600101549192506012906002811061095e5761095e6147bf565b60070201600601600082825461097491906146d2565b9091555050815461098a9061ffff831690614695565b33600090815260116020908152604080832060ff88168085529252909120600101829055601290600281106109c1576109c16147bf565b6007020160060160008282546109d79190614618565b9091555050505b600254610a029073ffffffffffffffffffffffffffffffffffffffff16338561305c565b60405183815260ff83169033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35050600160005550565b60058160048110610a5657600080fd5b0154905081565b60128160028110610a6d57600080fd5b600702018054600182015460028301546003840154600485015460058601546006909601549496509294919360ff90911692919087565b60098160048110610a5657600080fd5b73ffffffffffffffffffffffffffffffffffffffff8316600090815260116020908152604080832060ff80871685529252822060020190831660048110610afd57610afd6147bf565b602081049091015460ff601f9092166101000a90041690505b9392505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610b9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600e54431015610c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73616c65207374696c6c206163746976650000000000000000000000000000006044820152606401610643565b60105460ff1615610c77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f636c61696d20697320616c726561647920656e61626c656400000000000000006044820152606401610643565b601080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517fca666f7745697e47f1359d151c9445641549379e821785dd1fa6c38f7f8bc3da90600090a1565b60015473ffffffffffffffffffffffffffffffffffffffff163314610d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d544310610db9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b610dc281613135565b50565b600060128260028110610dda57610dda6147bf565b600702016003015460ff16610df157506000919050565b610e2c60128360028110610e0757610e076147bf565b600702016004015460128460028110610e2257610e226147bf565b60070201546134a9565b92915050565b60015473ffffffffffffffffffffffffffffffffffffffff163314610eb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d544310610f1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b600f55565b60015473ffffffffffffffffffffffffffffffffffffffff163314610fa4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d54431061100f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b600260ff82161061107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610643565b8460128260ff1660028110611093576110936147bf565b600702015583601260ff8316600281106110af576110af6147bf565b60070201600101819055508260128260ff16600281106110d1576110d16147bf565b60070201600201819055508160128260ff16600281106110f3576110f36147bf565b6007020160030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055604080518581526020810187905260ff8316918101919091527fddaf243a142670be60c19ff7116b5d8b124717b29bb4cc03cead42161614105b9060600160405180910390a15050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146111f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b60025473ffffffffffffffffffffffffffffffffffffffff83811691161480159061123b575060035473ffffffffffffffffffffffffffffffffffffffff838116911614155b6112a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f43616e6e6f74206265204c50206f72204f66666572696e6720746f6b656e00006044820152606401610643565b6112c273ffffffffffffffffffffffffffffffffffffffff8316338361305c565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b6113a1600061351c565b565b600d5443101580156113b65750600e5443105b61141c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f53616c65206e6f742061637469766500000000000000000000000000000000006044820152606401610643565b60026000541415611489576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610643565b6002600081815533815260116020908152604080832060ff861680855292529091209111611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610643565b600060128360ff166002811061152b5761152b6147bf565b600702016001015411801561155a5750600060128360ff1660028110611553576115536147bf565b6007020154115b6115c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f506f6f6c206e6f742073657400000000000000000000000000000000000000006044820152606401610643565b60005b600260ff82161015611673578260ff168160ff16146116615733600090815260116020908152604080832060ff8516845290915290205415611661576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f616c726561647920636f6d6d6974656420696e20616e6f7468657220706f6f6c6044820152606401610643565b8061166b81614770565b9150506115c3565b5060005b600381101561171c57600480546040517fe2bbb1580000000000000000000000000000000000000000000000000000000081529182018390526000602483015273ffffffffffffffffffffffffffffffffffffffff169063e2bbb15890604401600060405180830381600087803b1580156116f157600080fd5b505af1158015611705573d6000803e3d6000fd5b50505050808061171490614737565b915050611677565b5060006117283361289a565b905080611791576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f75736572206e6f7420656c696769626c650000000000000000000000000000006044820152606401610643565b6002546117b69073ffffffffffffffffffffffffffffffffffffffff16333087613593565b838260000160008282546117ca9190614618565b9091555060009050601260ff8516600281106117e8576117e86147bf565b600702016002015411156118a057600061180133612987565b90508061ffff1660128560ff166002811061181e5761181e6147bf565b60070201600201546118309190614695565b8354111561189a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4e657720616d6f756e742061626f76652075736572206c696d697400000000006044820152606401610643565b50611963565b60006118ab33612987565b33600090815260116020908152604080832060ff8916808552925290912060010154919250601290600281106118e3576118e36147bf565b6007020160060160008282546118f991906146d2565b9091555050825461190f9061ffff831690614695565b33600090815260116020908152604080832060ff8916808552925290912060010182905560129060028110611946576119466147bf565b60070201600601600082825461195c9190614618565b9091555050505b8360128460ff166002811061197a5761197a6147bf565b6007020160040160008282546119909190614618565b909155505060405184815260ff84169033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159060200160405180910390a3505060016000555050565b60015473ffffffffffffffffffffffffffffffffffffffff163314611a5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d544310611ac6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b808210611b55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f6e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201527f6e206e657720656e64426c6f636b0000000000000000000000000000000000006064820152608401610643565b814310611be4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201527f616e2063757272656e7420626c6f636b000000000000000000000000000000006064820152608401610643565b600d829055600e81905560408051838152602081018390527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce06910161130a565b60026000541415611c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610643565b6002600055600e544310801590611caa575060105460ff165b611d10576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f73616c65206e6f742066696e69736865640000000000000000000000000000006044820152606401610643565b600260ff831610611d7d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f706f6f6c20646f6573206e6f74206578697374000000000000000000000000006044820152606401610643565b600460ff821610611dea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6861727665737420706572696f64206f7574206f662072616e676500000000006044820152606401610643565b60058160ff1660048110611e0057611e006147bf565b01544311611e6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6e6f7420686172766573742074696d65000000000000000000000000000000006044820152606401610643565b33600090815260116020908152604080832060ff86168452909152902054611eee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f646964206e6f74207061727469636970617465000000000000000000000000006044820152606401610643565b33600090815260116020908152604080832060ff8087168552925290912060020190821660048110611f2257611f226147bf565b602081049091015460ff601f9092166101000a90041615611fc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f6861727665737420666f7220706572696f6420616c726561647920636c61696d60448201527f65640000000000000000000000000000000000000000000000000000000000006064820152608401610643565b33600090815260116020908152604080832060ff80871685529252909120600191600290910190831660048110611ffe57611ffe6147bf565b602091828204019190066101000a81548160ff021916908315150217905550600080600061202c33866135f7565b919450925090508015801590612062575033600090815260116020908152604080832060ff808a16855292529091206003015416155b1561209a578060128660ff166002811061207e5761207e6147bf565b6007020160050160008282546120949190614618565b90915550505b6000821180156120ca575033600090815260116020908152604080832060ff808a16855292529091206003015416155b1561213f5733600081815260116020908152604080832060ff8a168452909152902060030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560025461213f9173ffffffffffffffffffffffffffffffffffffffff91909116908461305c565b6000831561219d5761271060098660ff1660048110612160576121606147bf565b015461216c9086614695565b6121769190614630565b60035490915061219d9073ffffffffffffffffffffffffffffffffffffffff16338361305c565b33600090815260116020908152604080832060ff808b16855292529091206001916002909101908716600481106121d6576121d66147bf565b602091828204019190066101000a81548160ff0219169083151502179055508560ff163373ffffffffffffffffffffffffffffffffffffffff167f51524c2e5edfedf8b01b29719c661e4fbe27e71734e7cd773dabb7cb712fb3b3838660405161224a929190918252602082015260400190565b60405180910390a35050600160005550505050565b60015473ffffffffffffffffffffffffffffffffffffffff1633146122e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600e54431161234b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f73616c6520686173206e6f742066696e697368656400000000000000000000006044820152606401610643565b6002546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b1580156123b457600080fd5b505afa1580156123c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123ec91906141a4565b821115612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4e6f7420656e6f756768204c5020746f6b656e730000000000000000000000006044820152606401610643565b6003546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b1580156124be57600080fd5b505afa1580156124d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f691906141a4565b81111561255f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f4e6f7420656e6f756768206f66666572696e6720746f6b656e730000000000006044820152606401610643565b8115612589576002546125899073ffffffffffffffffffffffffffffffffffffffff16338461305c565b80156125b3576003546125b39073ffffffffffffffffffffffffffffffffffffffff16338361305c565b60408051838152602081018390527f94ebb62a252249c867ecb758d386f50a95be7e8df9e1c52917c9cf494327dd7d910161130a565b60408051600380825260808201909252606091829182916000919060208201848036833701905050905060005b60038161ffff16101561268f57602061ffff82166003811061263a5761263a6147bf565b601091828204019190066002029054906101000a900461ffff16828261ffff168151811061266a5761266a6147bf565b61ffff909216602092830291909101909101528061268781614715565b915050612616565b50604080516003808252608082019092526000916020820160608036833701905050905060005b60038160ff16101561272757602160ff8216600381106126d8576126d86147bf565b602091828204019190069054906101000a900460ff16828260ff1681518110612703576127036147bf565b60ff909216602092830291909101909101528061271f81614770565b9150506126b6565b5060408051600380825260808201909252600091816020015b606081526020019060019003908161274057905050905060005b60038160ff16101561288d57602260ff82166003811061277c5761277c6147bf565b505060408051600380825260808201909252906020820160608036833701905050828260ff16815181106127b2576127b26147bf565b602002602001018190525060005b602260ff8316600381106127d6576127d66147bf565b505060038160ff16101561287a57602260ff8316600381106127fa576127fa6147bf565b018160ff166003811061280f5761280f6147bf565b602091828204019190069054906101000a900460ff16838360ff168151811061283a5761283a6147bf565b60200260200101518260ff1681518110612856576128566147bf565b60ff909216602092830291909101909101528061287281614770565b9150506127c0565b508061288581614770565b91505061275a565b5091959094509092509050565b60008060005b600381101561297d57600480546040517f93f1a40b00000000000000000000000000000000000000000000000000000000815291820183905273ffffffffffffffffffffffffffffffffffffffff868116602484015216906393f1a40b9060440160a06040518083038186803b15801561291957600080fd5b505afa15801561292d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129519190614235565b5050600f549294505050821061296b575060019392505050565b8061297581614737565b9150506128a0565b5060009392505050565b60008060008060005b600360ff82161015612b5f57600480546040517f93f1a40b00000000000000000000000000000000000000000000000000000000815260ff84169281019290925273ffffffffffffffffffffffffffffffffffffffff888116602484015216906393f1a40b9060440160a06040518083038186803b158015612a1157600080fd5b505afa158015612a25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a499190614235565b509294506000925050505b600360ff82161015612b4c57602260ff831660038110612a7657612a766147bf565b018160ff1660038110612a8b57612a8b6147bf565b602081049091015460ff601f9092166101000a9004811690602190841660038110612ab857612ab86147bf565b602081049190910154612ad79291601f166101000a900460ff1661466b565b9350602060ff821660038110612aef57612aef6147bf565b601091828204019190066002029054906101000a900461ffff1661ffff16670de0b6b3a7640000612b209190614695565b8310612b3a578461ffff168461ffff161115612b3a578394505b80612b4481614770565b915050612a54565b5080612b5781614770565b915050612990565b5091949350505050565b606060008267ffffffffffffffff811115612b8657612b866147ee565b604051908082528060200260200182016040528015612bbf57816020015b612bac613d44565b815260200190600190039081612ba45790505b50905060005b60ff8116841115612cac57600080600080601289898760ff16818110612bed57612bed6147bf565b9050602002016020810190612c02919061429a565b60ff1660028110612c1557612c156147bf565b60070201541115612c5b57612c538989898760ff16818110612c3957612c396147bf565b9050602002016020810190612c4e919061429a565b6135f7565b919450925090505b604051806060016040528084815260200183815260200182815250858560ff1681518110612c8b57612c8b6147bf565b60200260200101819052505050508080612ca490614770565b915050612bc5565b50949350505050565b60015473ffffffffffffffffffffffffffffffffffffffff163314612d36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b600d544310612da1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f73616c6520697320616c726561647920616374697665000000000000000000006044820152606401610643565b60008173ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015612de957600080fd5b505afa158015612dfd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e2191906141a4565b1015612e2c57600080fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60015473ffffffffffffffffffffffffffffffffffffffff163314612ef4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610643565b73ffffffffffffffffffffffffffffffffffffffff8116612f97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610643565b610dc28161351c565b606060008267ffffffffffffffff811115612fbd57612fbd6147ee565b604051908082528060200260200182016040528015612fe6578160200160208202803683370190505b50905060005b60ff8116841115612cac5761302a8686868460ff16818110613010576130106147bf565b9050602002016020810190613025919061429a565b61390b565b828260ff168151811061303f5761303f6147bf565b60209081029190910101528061305481614770565b915050612fec565b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526131309084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152613a4e565b505050565b60008060008380602001905181019061314e9190613fc4565b925092509250600360ff168251148015613169575080516003145b6131cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f626164207661756c7420706f6f6c206c656e67746800000000000000000000006044820152606401610643565b825160031461323a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f626164207468726573686f6c64206c656e6774680000000000000000000000006044820152606401610643565b60005b600360ff821610156132b757838160ff168151811061325e5761325e6147bf565b602002602001015160206000018260ff166003811061327f5761327f6147bf565b601091828204019190066002026101000a81548161ffff021916908361ffff16021790555080806132af90614770565b91505061323d565b5060005b600360ff8216101561346357828160ff16815181106132dc576132dc6147bf565b602002602001015160206001018260ff16600381106132fd576132fd6147bf565b602091828204019190066101000a81548160ff021916908360ff160217905550600360ff16828260ff1681518110613337576133376147bf565b602002602001015151146133a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f626164207468726573686f6c64206c656e6774680000000000000000000000006044820152606401610643565b60005b600360ff8216101561345057828260ff16815181106133cb576133cb6147bf565b60200260200101518160ff16815181106133e7576133e76147bf565b602002602001015160206002018360ff1660038110613408576134086147bf565b018260ff166003811061341d5761341d6147bf565b602091828204019190066101000a81548160ff021916908360ff160217905550808061344890614770565b9150506133aa565b508061345b81614770565b9150506132bb565b506040517fbfd876ad455399d10dc2d1788e56b9526a9ca9d32b9e5c6dc9b7a8d63f8d2ef19061349b90602090602190602290614399565b60405180910390a150505050565b6000806134b68385614630565b90506101f481106134ce576377359400915050610e2c565b60fa81106134e357639502f900915050610e2c565b606481106134f85763b2d05e00915050610e2c565b6032811061350e5764012a05f200915050610e2c565b506402540be4009392505050565b6001805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526135f19085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016130ae565b50505050565b60008060008060008060128760ff1660028110613616576136166147bf565b6007020154601260ff891660028110613631576136316147bf565b6007020160040154111561380557600061364b898961390b565b905064e8d4a510008160128a60ff166002811061366a5761366a6147bf565b600702016001015461367c9190614695565b6136869190614630565b93506000670de0b6b3a764000060128a60ff16600281106136a9576136a96147bf565b600702016004015473ffffffffffffffffffffffffffffffffffffffff8c16600090815260116020908152604080832060ff8f1680855292529091205490601290600281106136fa576136fa6147bf565b60070201546137099190614695565b61371b90670de0b6b3a7640000614695565b6137259190614630565b61372f9190614630565b73ffffffffffffffffffffffffffffffffffffffff8b16600090815260116020908152604080832060ff8e1684529091529020549091506137719082906146d2565b935060128960ff1660028110613789576137896147bf565b600702016003015460ff16156137fe5760006137d260128b60ff16600281106137b4576137b46147bf565b600702016004015460128c60ff1660028110610e2257610e226147bf565b905064e8d4a510006137e48287614695565b6137ee9190614630565b93506137fa84866146d2565b9450505b50506138fd565b50600090508080601260ff891660028110613822576138226147bf565b600702016002015411156138b85760128760ff1660028110613846576138466147bf565b6007020154601260ff891660028110613861576138616147bf565b600702016001015473ffffffffffffffffffffffffffffffffffffffff8a16600090815260116020908152604080832060ff8d1684529091529020546138a79190614695565b6138b19190614630565b92506138fd565b64e8d4a510006138c8898961390b565b60128960ff16600281106138de576138de6147bf565b60070201600101546138f09190614695565b6138fa9190614630565b92505b919450925090509250925092565b60008060128360ff1660028110613924576139246147bf565b60070201600401541115613a4657600060128360ff166002811061394a5761394a6147bf565b600702016002015411156139db57620f424060128360ff1660028110613972576139726147bf565b600702016004015473ffffffffffffffffffffffffffffffffffffffff8516600090815260116020908152604080832060ff881684529091529020546139c090670de0b6b3a7640000614695565b6139ca9190614630565b6139d49190614630565b9050610e2c565b620f424060128360ff16600281106139f5576139f56147bf565b600702016006015473ffffffffffffffffffffffffffffffffffffffff8516600090815260116020908152604080832060ff881684529091529020600101546139c090670de0b6b3a7640000614695565b506000610e2c565b6000613ab0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16613b5a9092919063ffffffff16565b8051909150156131305780806020019051810190613ace91906140bb565b613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610643565b6060613b698484600085613b71565b949350505050565b606082471015613c03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610643565b843b613c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610643565b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051613c949190614313565b60006040518083038185875af1925050503d8060008114613cd1576040519150601f19603f3d011682016040523d82523d6000602084013e613cd6565b606091505b5091509150613ce6828286613cf1565b979650505050505050565b60608315613d00575081610b16565b825115613d105782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106439190614554565b60405180606001604052806003906020820280368337509192915050565b600082601f830112613d7357600080fd5b81516020613d88613d83836145f4565b6145a5565b80838252828201915082860187848660051b8901011115613da857600080fd5b6000805b86811015613deb57825167ffffffffffffffff811115613dca578283fd5b613dd88b88838d0101613df9565b8652509385019391850191600101613dac565b509198975050505050505050565b600082601f830112613e0a57600080fd5b81516020613e1a613d83836145f4565b80838252828201915082860187848660051b8901011115613e3a57600080fd5b60005b85811015613e62578151613e508161484d565b84529284019290840190600101613e3d565b5090979650505050505050565b600060208284031215613e8157600080fd5b8135610b168161481d565b600080600060408486031215613ea157600080fd5b8335613eac8161481d565b9250602084013567ffffffffffffffff80821115613ec957600080fd5b818601915086601f830112613edd57600080fd5b813581811115613eec57600080fd5b8760208260051b8501011115613f0157600080fd5b6020830194508093505050509250925092565b60008060408385031215613f2757600080fd5b8235613f328161481d565b946020939093013593505050565b60008060408385031215613f5357600080fd5b8235613f5e8161481d565b91506020830135613f6e8161484d565b809150509250929050565b600080600060608486031215613f8e57600080fd5b8335613f998161481d565b92506020840135613fa98161484d565b91506040840135613fb98161484d565b809150509250925092565b600080600060608486031215613fd957600080fd5b835167ffffffffffffffff80821115613ff157600080fd5b818601915086601f83011261400557600080fd5b81516020614015613d83836145f4565b8083825282820191508286018b848660051b890101111561403557600080fd5b600096505b8487101561406857805161ffff8116811461405457600080fd5b83526001969096019591830191830161403a565b509189015191975090935050508082111561408257600080fd5b61408e87838801613df9565b935060408601519150808211156140a457600080fd5b506140b186828701613d62565b9150509250925092565b6000602082840312156140cd57600080fd5b8151610b168161483f565b600060208083850312156140eb57600080fd5b823567ffffffffffffffff8082111561410357600080fd5b818501915085601f83011261411757600080fd5b813581811115614129576141296147ee565b614159847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116016145a5565b9150808252868482850101111561416f57600080fd5b8084840185840137600090820190930192909252509392505050565b60006020828403121561419d57600080fd5b5035919050565b6000602082840312156141b657600080fd5b5051919050565b600080604083850312156141d057600080fd5b50508035926020909101359150565b600080600080600060a086880312156141f757600080fd5b85359450602086013593506040860135925060608601356142178161483f565b915060808601356142278161484d565b809150509295509295909350565b600080600080600060a0868803121561424d57600080fd5b5050835160208501516040860151606087015160809097015192989197509594509092509050565b6000806040838503121561428857600080fd5b823591506020830135613f6e8161484d565b6000602082840312156142ac57600080fd5b8135610b168161484d565b600080604083850312156142ca57600080fd5b8235613f5e8161484d565b600081518084526020808501945080840160005b8381101561430857815160ff16875295820195908201906001016142e9565b509495945050505050565b600082516143258184602087016146e9565b9190910192915050565b602080825282518282018190526000919084820190604085019084805b8281101561438c57845184835b600381101561437657825182529188019190880190600101614359565b505050938501936060939093019260010161434c565b5091979650505050505050565b60006101e082019050845461ffff8082168452808260101c166020850152808260201c166040850152505060606143f281840186805460ff8116835260ff8160081c16602084015260ff8160101c166040840152505050565b60c083018460005b600381101561443457815460ff8082168552600882901c8116602086015260109190911c16604084015291830191600191820191016143fa565b50505050949350505050565b606080825284519082018190526000906020906080840190828801845b8281101561447d57815161ffff168452928401929084019060010161445d565b5050508381038285015261449181876142d5565b905083810360408501528085518083528383019150838160051b84010184880160005b83811015614500577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08684030185526144ee8383516142d5565b948701949250908601906001016144b4565b50909a9950505050505050505050565b6020808252825182820181905260009190848201906040850190845b818110156145485783518352928401929184019160010161452c565b50909695505050505050565b60208152600082518060208401526145738160408501602087016146e9565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156145ec576145ec6147ee565b604052919050565b600067ffffffffffffffff82111561460e5761460e6147ee565b5060051b60200190565b6000821982111561462b5761462b614790565b500190565b600082614666577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b600061ffff8083168185168183048111821515161561468c5761468c614790565b02949350505050565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146cd576146cd614790565b500290565b6000828210156146e4576146e4614790565b500390565b60005b838110156147045781810151838201526020016146ec565b838111156135f15750506000910152565b600061ffff8083168181141561472d5761472d614790565b6001019392505050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561476957614769614790565b5060010190565b600060ff821660ff81141561478757614787614790565b60010192915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff81168114610dc257600080fd5b8015158114610dc257600080fd5b60ff81168114610dc257600080fdfea2646970667358221220b76543ee55fddcee9e0e4f716bc106539b94eb44bf7fd4845c5b8a4801f51fd064736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007eda899b3522683636746a2f3a7814e6ffca75e10000000000000000000000001e0f2a75be02c025bd84177765f89200c04337da00000000000000000000000000000000000000000000000000000000000c5a0800000000000000000000000000000000000000000000000000000000000c5fd0000000000000000000000000000000000000000000000000000000000002b57e000000000000000000000000000000000000000000000002b5e3af16b18800000000000000000000000000007e6e03822d0077f3c417d33caeac900fc2645679000000000000000000000000000000000000000000000000000000000000012000000000000000000000000000000000000000000000000000000000000001c000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000bb8000000000000000000000000000000000000000000000000000000000000091d000000000000000000000000000000000000000000000000000000000000091d000000000000000000000000000000000000000000000000000000000000091e0000000000000000000000000000000000000000000000000000000000000360000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a
-----Decoded View---------------
Arg [0] : _lpToken (address): 0x7eDA899b3522683636746a2f3a7814e6fFca75e1
Arg [1] : _offeringToken (address): 0x1e0F2A75Be02c025Bd84177765F89200c04337Da
Arg [2] : _startBlock (uint256): 809480
Arg [3] : _endBlock (uint256): 810960
Arg [4] : _vestingBlockOffset (uint256): 177534
Arg [5] : _eligibilityThreshold (uint256): 50000000000000000000
Arg [6] : _solarVault (address): 0x7e6E03822D0077F3C417D33caeAc900Fc2645679
Arg [7] : _harvestReleasePercent (uint256[]): 3000,2333,2333,2334
Arg [8] : _multipliers (bytes): 0x000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000009600000000000000000000000000000000000000000000000000000000000001f4000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000a
-----Encoded View---------------
42 Constructor Arguments found :
Arg [0] : 0000000000000000000000007eda899b3522683636746a2f3a7814e6ffca75e1
Arg [1] : 0000000000000000000000001e0f2a75be02c025bd84177765f89200c04337da
Arg [2] : 00000000000000000000000000000000000000000000000000000000000c5a08
Arg [3] : 00000000000000000000000000000000000000000000000000000000000c5fd0
Arg [4] : 000000000000000000000000000000000000000000000000000000000002b57e
Arg [5] : 000000000000000000000000000000000000000000000002b5e3af16b1880000
Arg [6] : 0000000000000000000000007e6e03822d0077f3c417d33caeac900fc2645679
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [8] : 00000000000000000000000000000000000000000000000000000000000001c0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000bb8
Arg [11] : 000000000000000000000000000000000000000000000000000000000000091d
Arg [12] : 000000000000000000000000000000000000000000000000000000000000091d
Arg [13] : 000000000000000000000000000000000000000000000000000000000000091e
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000360
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [16] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000032
Arg [20] : 0000000000000000000000000000000000000000000000000000000000000096
Arg [21] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [23] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [24] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [25] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [26] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [27] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [28] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [29] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [30] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [31] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [32] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [33] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [34] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [35] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [36] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [37] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [38] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [39] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [40] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [41] : 000000000000000000000000000000000000000000000000000000000000000a
Deployed Bytecode Sourcemap
49346:25810:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50210:23;;;;;;;;;27971:25:1;;;27959:2;27944:18;50210:23:0;;;;;;;;64476:1184;;;;;;:::i;:::-;;:::i;:::-;;49733:41;;49773:1;49733:41;;;;;30282:4:1;30270:17;;;30252:36;;30240:2;30225:18;49733:41:0;30110:184:1;50055:52:0;;;;;;:::i;:::-;;:::i;51941:37::-;;;;;;:::i;:::-;;:::i;:::-;;;;29466:25:1;;;29522:2;29507:18;;29500:34;;;;29550:18;;;29543:34;;;;29620:14;;29613:22;29608:2;29593:18;;29586:50;29667:3;29652:19;;29645:35;29711:3;29696:19;;29689:35;29755:3;29740:19;;29733:35;29453:3;29438:19;51941:37:0;29157:617:1;50114:53:0;;;;;;:::i;:::-;;:::i;71165:169::-;;;;;;:::i;:::-;;:::i;:::-;;;15720:14:1;;15713:22;15695:41;;15683:2;15668:18;71165:169:0;15555:187:1;50326:32:0;;;;;;;;;74902:249;;;:::i;56287:196::-;;;;;;:::i;:::-;;:::i;71624:309::-;;;;;;:::i;:::-;;:::i;55944:224::-;;;;;;:::i;:::-;;:::i;58357:623::-;;;;;;:::i;:::-;;:::i;50176:25::-;;;;;;49637:21;;;;;;;;;;;;10514:42:1;10502:55;;;10484:74;;10472:2;10457:18;49637:21:0;10338:226:1;60760:384:0;;;;;;:::i;:::-;;:::i;2374:94::-;;;:::i;61588:1641::-;;;;;;:::i;:::-;;:::i;1723:87::-;1796:6;;;;1723:87;;59066:501;;;;;;:::i;:::-;;:::i;65852:1729::-;;;;;;:::i;:::-;;:::i;49837:44::-;;49880:1;49837:44;;59860:649;;;;;;:::i;:::-;;:::i;73630:1264::-;;;:::i;:::-;;;;;;;;;:::i;51870:62::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29019:25:1;;;29075:2;29060:18;;29053:34;;;;29130:14;29123:22;29103:18;;;29096:50;29007:2;28992:18;51870:62:0;28823:329:1;63239:342:0;;;;;;:::i;:::-;;:::i;51777:37::-;;51813:1;51777:37;;49665:27;;;;;;;;;63593:690;;;;;;:::i;:::-;;:::i;:::-;;;27806:6:1;27794:19;;;27776:38;;27764:2;27749:18;63593:690:0;27632:188:1;72731:891:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;50242:35::-;;;;;;55315:247;;;;;;:::i;:::-;;:::i;2623:192::-;;;;;;:::i;:::-;;:::i;72126:411::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49701:23::-;;;;;;;;;64476:1184;19036:1;19632:7;;:19;;19624:63;;;;;;;27115:2:1;19624:63:0;;;27097:21:1;27154:2;27134:18;;;27127:30;27193:33;27173:18;;;27166:61;27244:18;;19624:63:0;;;;;;;;;19036:1;19765:7;:18;53387:10:::1;::::0;53371:12:::1;:26;::::0;::::1;::::0;:53:::1;;;53416:8;;53401:12;:23;53371:53;53349:118;;;::::0;::::1;::::0;;19465:2:1;53349:118:0::1;::::0;::::1;19447:21:1::0;19504:2;19484:18;;;19477:30;19543:17;19523:18;;;19516:45;19578:18;;53349:118:0::1;19263:339:1::0;53349:118:0::1;64658:10:::2;64625:21;64649:20:::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;::::2;::::0;;;;;;;;;51813:1:::2;-1:-1:-1::0;64686:50:0::2;;;::::0;::::2;::::0;;23492:2:1;64686:50:0::2;::::0;::::2;23474:21:1::0;23531:2;23511:18;;;23504:30;23570:21;23550:18;;;23543:49;23609:18;;64686:50:0::2;23290:343:1::0;64686:50:0::2;64801:1;64769:8;64778:4;64769:14;;;;;;;;;:::i;:::-;;;;:29;;;:33;:86;;;;;64854:1;64823:8;64832:4;64823:14;;;;;;;;;:::i;:::-;;;;:28:::0;:32:::2;64769:86;64747:148;;;::::0;::::2;::::0;;24543:2:1;64747:148:0::2;::::0;::::2;24525:21:1::0;24582:2;24562:18;;;24555:30;24621:14;24601:18;;;24594:42;24653:18;;64747:148:0::2;24341:336:1::0;64747:148:0::2;64940:1;64930:7;:11;:30;;;;-1:-1:-1::0;64945:11:0;;:15;;64930:30:::2;:56;;;;-1:-1:-1::0;64964:11:0;;:22;-1:-1:-1;64964:22:0::2;64930:56;64908:147;;;::::0;::::2;::::0;;19809:2:1;64908:147:0::2;::::0;::::2;19791:21:1::0;19848:2;19828:18;;;19821:30;19887:34;19867:18;;;19860:62;19958:11;19938:18;;;19931:39;19987:19;;64908:147:0::2;19607:405:1::0;64908:147:0::2;65083:7;65068:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;65135:7:0;;-1:-1:-1;65101:8:0::2;:14;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;;;:30;;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;65159:8:0::2;::::0;-1:-1:-1;65159:14:0::2;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;;;:28;;;65191:1;65159:33;65155:382;;;65210:17;65231:29;65249:10;65231:17;:29::i;:::-;65319:10;65310:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;::::2;::::0;;;;;;;;:38:::2;;::::0;65209:51;;-1:-1:-1;65275:8:0::2;::::0;:14:::2;::::0;::::2;;;;;:::i;:::-;;;;:31;;;:73;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;65404:11:0;;:33:::2;::::0;65418:19:::2;::::0;::::2;::::0;65404:33:::2;:::i;:::-;65372:10;65363:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;::::2;::::0;;;;;;;;:38:::2;;:74:::0;;;65452:8:::2;::::0;:14:::2;::::0;::::2;;;;;:::i;:::-;;;;:31;;;:73;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;65155:382:0::2;65549:7;::::0;:50:::2;::::0;:7:::2;;65578:10;65591:7:::0;65549:20:::2;:50::i;:::-;65617:35;::::0;27971:25:1;;;65617:35:0::2;::::0;::::2;::::0;65626:10:::2;::::0;65617:35:::2;::::0;27959:2:1;27944:18;65617:35:0::2;;;;;;;-1:-1:-1::0;;18992:1:0;19944:7;:22;-1:-1:-1;64476:1184:0:o;50055:52::-;;;;;;;;;;;;;;;-1:-1:-1;50055:52:0;:::o;51941:37::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;51941:37:0;;;;;;;;;;;;:::o;50114:53::-;;;;;;;;;;;71165:169;71281:15;;;71257:4;71281:15;;;:8;:15;;;;;;;;:21;;;;;;;;;;:29;;;:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;71165:169:0;;;;;;:::o;74902:249::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;74988:8:::1;;74972:12;:24;;74964:54;;;::::0;::::1;::::0;;24884:2:1;74964:54:0::1;::::0;::::1;24866:21:1::0;24923:2;24903:18;;;24896:30;24962:19;24942:18;;;24935:47;24999:18;;74964:54:0::1;24682:341:1::0;74964:54:0::1;75038:12;::::0;::::1;;75037:13;75029:50;;;::::0;::::1;::::0;;25580:2:1;75029:50:0::1;::::0;::::1;25562:21:1::0;25619:2;25599:18;;;25592:30;25658:26;25638:18;;;25631:54;25702:18;;75029:50:0::1;25378:348:1::0;75029:50:0::1;75092:12;:19:::0;;;::::1;75107:4;75092:19;::::0;;75129:14:::1;::::0;::::1;::::0;75092:12:::1;::::0;75129:14:::1;74902:249::o:0;56287:196::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;56398:10:::1;;56383:12;:25;56375:60;;;::::0;::::1;::::0;;23141:2:1;56375:60:0::1;::::0;::::1;23123:21:1::0;23180:2;23160:18;;;23153:30;23219:24;23199:18;;;23192:52;23261:18;;56375:60:0::1;22939:346:1::0;56375:60:0::1;56446:29;56462:12;56446:15;:29::i;:::-;56287:196:::0;:::o;71624:309::-;71703:7;71728:8;71737:4;71728:14;;;;;;;:::i;:::-;;;;:21;;;;;71723:203;;-1:-1:-1;71773:1:0;;71624:309;-1:-1:-1;71624:309:0:o;71723:203::-;71831:83;71853:8;71862:4;71853:14;;;;;;;:::i;:::-;;;;:30;;;71885:8;71894:4;71885:14;;;;;;;:::i;:::-;;;;:28;71831:21;:83::i;:::-;71807:107;71624:309;-1:-1:-1;;71624:309:0:o;55944:224::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;56068:10:::1;;56053:12;:25;56045:60;;;::::0;::::1;::::0;;23141:2:1;56045:60:0::1;::::0;::::1;23123:21:1::0;23180:2;23160:18;;;23153:30;23219:24;23199:18;;;23192:52;23261:18;;56045:60:0::1;22939:346:1::0;56045:60:0::1;56116:20;:44:::0;55944:224::o;58357:623::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;58586:10:::1;;58571:12;:25;58563:60;;;::::0;::::1;::::0;;23141:2:1;58563:60:0::1;::::0;::::1;23123:21:1::0;23180:2;23160:18;;;23153:30;23219:24;23199:18;;;23192:52;23261:18;;58563:60:0::1;22939:346:1::0;58563:60:0::1;51813:1;58642:18;::::0;::::1;;58634:50;;;::::0;::::1;::::0;;23492:2:1;58634:50:0::1;::::0;::::1;23474:21:1::0;23531:2;23511:18;;;23504:30;23570:21;23550:18;;;23543:49;23609:18;;58634:50:0::1;23290:343:1::0;58634:50:0::1;58728:14;58697:8;58706:4;58697:14;;;;;;;;;:::i;:::-;;;;:45:::0;58785:15;58753:8:::1;:14;::::0;::::1;;::::0;::::1;;;;;:::i;:::-;;;;:29;;:47;;;;58842:14;58811:8;58820:4;58811:14;;;;;;;;;:::i;:::-;;;;:28;;:45;;;;58891:7;58867:8;58876:4;58867:14;;;;;;;;;:::i;:::-;;;;:21;;:31:::0;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;58916:56:::1;::::0;;29977:25:1;;;30033:2;30018:18;;30011:34;;;58867:31:0::1;30081:17:1::0;;30061:18;;;30054:45;;;;58916:56:0::1;::::0;29965:2:1;29950:18;58916:56:0::1;;;;;;;58357:623:::0;;;;;:::o;60760:384::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;60892:7:::1;::::0;::::1;60867:33:::0;;::::1;60892:7:::0;::::1;60867:33;::::0;::::1;::::0;:76:::1;;-1:-1:-1::0;60929:13:0::1;::::0;::::1;60904:39:::0;;::::1;60929:13:::0;::::1;60904:39;;60867:76;60845:156;;;::::0;::::1;::::0;;27475:2:1;60845:156:0::1;::::0;::::1;27457:21:1::0;27514:2;27494:18;;;27487:30;27553:32;27533:18;;;27526:60;27603:18;;60845:156:0::1;27273:354:1::0;60845:156:0::1;61012:64;:34;::::0;::::1;61055:10;61068:7:::0;61012:34:::1;:64::i;:::-;61094:42;::::0;;11176::1;11164:55;;11146:74;;11251:2;11236:18;;11229:34;;;61094:42:0::1;::::0;11119:18:1;61094:42:0::1;;;;;;;;60760:384:::0;;:::o;2374:94::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;2439:21:::1;2457:1;2439:9;:21::i;:::-;2374:94::o:0;61588:1641::-;53387:10;;53371:12;:26;;:53;;;;;53416:8;;53401:12;:23;53371:53;53349:118;;;;;;;19465:2:1;53349:118:0;;;19447:21:1;19504:2;19484:18;;;19477:30;19543:17;19523:18;;;19516:45;19578:18;;53349:118:0;19263:339:1;53349:118:0;19036:1:::1;19632:7;;:19;;19624:63;;;::::0;::::1;::::0;;27115:2:1;19624:63:0::1;::::0;::::1;27097:21:1::0;27154:2;27134:18;;;27127:30;27193:33;27173:18;;;27166:61;27244:18;;19624:63:0::1;26913:355:1::0;19624:63:0::1;19036:1;19765:7;:18:::0;;;61728:10:::2;61719:20:::0;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;::::2;::::0;;;;;;;;;-1:-1:-1;61758:50:0::2;;;::::0;::::2;::::0;;23492:2:1;61758:50:0::2;::::0;::::2;23474:21:1::0;23531:2;23511:18;;;23504:30;23570:21;23550:18;;;23543:49;23609:18;;61758:50:0::2;23290:343:1::0;61758:50:0::2;61875:1;61843:8;61852:4;61843:14;;;;;;;;;:::i;:::-;;;;:29;;;:33;:69;;;;;61911:1;61880:8;61889:4;61880:14;;;;;;;;;:::i;:::-;;;;:28:::0;:32:::2;61843:69;61821:131;;;::::0;::::2;::::0;;22102:2:1;61821:131:0::2;::::0;::::2;22084:21:1::0;22141:2;22121:18;;;22114:30;22180:14;22160:18;;;22153:42;22212:18;;61821:131:0::2;21900:336:1::0;61821:131:0::2;61970:7;61965:188;51813:1;61983:15;::::0;::::2;;61965:188;;;62027:4;62022:9;;:1;:9;;;62018:124;;62065:10;62056:20;::::0;;;:8:::2;:20;::::0;;;;;;;:23:::2;::::0;::::2;::::0;;;;;;;:30;:35;62048:80:::2;;;::::0;::::2;::::0;;17999:2:1;62048:80:0::2;::::0;::::2;17981:21:1::0;;;18018:18;;;18011:30;18077:34;18057:18;;;18050:62;18129:18;;62048:80:0::2;17797:356:1::0;62048:80:0::2;62000:3:::0;::::2;::::0;::::2;:::i;:::-;;;;61965:188;;;;62170:9;62165:90;49880:1;62183:20:::0;::::2;62165:90;;;62225:5;::::0;;:18:::2;::::0;;;;;;::::2;28491:25:1::0;;;62225:5:0::2;28532:18:1::0;;;28525:34;62225:5:0::2;;::::0;:13:::2;::::0;28464:18:1;;62225::0::2;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;62205:3;;;;;:::i;:::-;;;;62165:90;;;;62266:12;62282:39;62309:10;62282:18;:39::i;:::-;62265:56;;62340:7;62332:37;;;::::0;::::2;::::0;;17653:2:1;62332:37:0::2;::::0;::::2;17635:21:1::0;17692:2;17672:18;;;17665:30;17731:19;17711:18;;;17704:47;17768:18;;62332:37:0::2;17451:341:1::0;62332:37:0::2;62382:7;::::0;:69:::2;::::0;:7:::2;;62415:10;62436:4;62443:7:::0;62382:24:::2;:69::i;:::-;62479:7;62464:4;:11;;;:22;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;62534:1:0::2;::::0;-1:-1:-1;62503:8:0::2;:14;::::0;::::2;;::::0;::::2;;;;;:::i;:::-;;;;:28;;;:32;62499:619;;;62553:17;62574:29;62592:10;62574:17;:29::i;:::-;62552:51;;62699:10;62691:19;;62660:8;62669:4;62660:14;;;;;;;;;:::i;:::-;;;;:28;;;:50;;;;:::i;:::-;62644:11:::0;;:67:::2;;62618:139;;;::::0;::::2;::::0;;20219:2:1;62618:139:0::2;::::0;::::2;20201:21:1::0;20258:2;20238:18;;;20231:30;20297:29;20277:18;;;20270:57;20344:18;;62618:139:0::2;20017:351:1::0;62618:139:0::2;62537:232;62499:619;;;62791:17;62812:29;62830:10;62812:17;:29::i;:::-;62900:10;62891:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;::::2;::::0;;;;;;;;:38:::2;;::::0;62790:51;;-1:-1:-1;62856:8:0::2;::::0;:14:::2;::::0;::::2;;;;;:::i;:::-;;;;:31;;;:73;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;62985:11:0;;:33:::2;::::0;62999:19:::2;::::0;::::2;::::0;62985:33:::2;:::i;:::-;62953:10;62944:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;::::2;::::0;;;;;;;;:38:::2;;:74:::0;;;63033:8:::2;::::0;:14:::2;::::0;::::2;;;;;:::i;:::-;;;;:31;;;:73;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;62499:619:0::2;63162:7;63128:8;63137:4;63128:14;;;;;;;;;:::i;:::-;;;;:30;;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;63187:32:0::2;::::0;27971:25:1;;;63187:32:0::2;::::0;::::2;::::0;63195:10:::2;::::0;63187:32:::2;::::0;27959:2:1;27944:18;63187:32:0::2;;;;;;;-1:-1:-1::0;;18992:1:0::1;19944:7;:22:::0;-1:-1:-1;;61588:1641:0:o;59066:501::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;59201:10:::1;;59186:12;:25;59178:60;;;::::0;::::1;::::0;;23141:2:1;59178:60:0::1;::::0;::::1;23123:21:1::0;23180:2;23160:18;;;23153:30;23219:24;23199:18;;;23192:52;23261:18;;59178:60:0::1;22939:346:1::0;59178:60:0::1;59271:9;59257:11;:23;59249:82;;;::::0;::::1;::::0;;26700:2:1;59249:82:0::1;::::0;::::1;26682:21:1::0;26739:2;26719:18;;;26712:30;26778:34;26758:18;;;26751:62;26849:16;26829:18;;;26822:44;26883:19;;59249:82:0::1;26498:410:1::0;59249:82:0::1;59365:11;59350:12;:26;59342:87;;;::::0;::::1;::::0;;20978:2:1;59342:87:0::1;::::0;::::1;20960:21:1::0;21017:2;20997:18;;;20990:30;21056:34;21036:18;;;21029:62;21127:18;21107;;;21100:46;21163:19;;59342:87:0::1;20776:412:1::0;59342:87:0::1;59442:10;:24:::0;;;59477:8:::1;:20:::0;;;59515:44:::1;::::0;;28491:25:1;;;28547:2;28532:18;;28525:34;;;59515:44:0::1;::::0;28464:18:1;59515:44:0::1;28309:256:1::0;65852:1729:0;19036:1;19632:7;;:19;;19624:63;;;;;;;27115:2:1;19624:63:0;;;27097:21:1;27154:2;27134:18;;;27127:30;27193:33;27173:18;;;27166:61;27244:18;;19624:63:0;26913:355:1;19624:63:0;19036:1;19765:7;:18;53631:8:::1;::::0;53615:12:::1;:24;::::0;::::1;::::0;:40:::1;;-1:-1:-1::0;53643:12:0::1;::::0;::::1;;53615:40;53607:70;;;::::0;::::1;::::0;;21395:2:1;53607:70:0::1;::::0;::::1;21377:21:1::0;21434:2;21414:18;;;21407:30;21473:19;21453:18;;;21446:47;21510:18;;53607:70:0::1;21193:341:1::0;53607:70:0::1;51813:1:::2;65970:18;::::0;::::2;;65962:50;;;::::0;::::2;::::0;;23492:2:1;65962:50:0::2;::::0;::::2;23474:21:1::0;23531:2;23511:18;;;23504:30;23570:21;23550:18;;;23543:49;23609:18;;65962:50:0::2;23290:343:1::0;65962:50:0::2;49773:1;66031:32;::::0;::::2;;66023:72;;;::::0;::::2;::::0;;26344:2:1;66023:72:0::2;::::0;::::2;26326:21:1::0;26383:2;26363:18;;;26356:30;26422:29;26402:18;;;26395:57;26469:18;;66023:72:0::2;26142:351:1::0;66023:72:0::2;66129:20;66150:14;66129:36;;;;;;;;;:::i;:::-;;;66114:12;:51;66106:80;;;::::0;::::2;::::0;;23840:2:1;66106:80:0::2;::::0;::::2;23822:21:1::0;23879:2;23859:18;;;23852:30;23918:18;23898;;;23891:46;23954:18;;66106:80:0::2;23638:340:1::0;66106:80:0::2;66214:10;66241:1;66205:20:::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;::::2;::::0;;;;;;;:33;66197:69:::2;;;::::0;::::2;::::0;;22443:2:1;66197:69:0::2;::::0;::::2;22425:21:1::0;22482:2;22462:18;;;22455:30;22521:21;22501:18;;;22494:49;22560:18;;66197:69:0::2;22241:343:1::0;66197:69:0::2;66295:10;66286:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;;::::2;::::0;;;;;;;:34:::2;;::::0;:50;::::2;;::::0;::::2;;;;;:::i;:::-;;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;;;::::2;;::::0;::::2;;66285:51;66277:98;;;::::0;::::2;::::0;;20575:2:1;66277:98:0::2;::::0;::::2;20557:21:1::0;20614:2;20594:18;;;20587:30;20653:34;20633:18;;;20626:62;20724:4;20704:18;;;20697:32;20746:19;;66277:98:0::2;20373:398:1::0;66277:98:0::2;66397:10;66388:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;;::::2;::::0;;;;;;;66441:4:::2;::::0;66388:34:::2;::::0;;::::2;::::0;:50;::::2;;::::0;::::2;;;;;:::i;:::-;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;66458:27;66496:28:::0;66535:23:::2;66632:87;66679:10;66704:4;66632:32;:87::i;:::-;66569:150:::0;;-1:-1:-1;66569:150:0;-1:-1:-1;66569:150:0;-1:-1:-1;66734:19:0;;;;;:61:::2;;-1:-1:-1::0;66767:10:0::2;66758:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;;::::2;::::0;;;;;;;:37:::2;;::::0;::::2;66757:38;66734:61;66730:144;;;66847:15;66812:8;66821:4;66812:14;;;;;;;;;:::i;:::-;;;;:31;;;:50;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;66730:144:0::2;66911:1;66888:20;:24;:66;;;;-1:-1:-1::0;66926:10:0::2;66917:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;;::::2;::::0;;;;;;;:37:::2;;::::0;::::2;66916:38;66888:66;66884:221;;;66980:10;66971:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;::::2;::::0;;;;;;;:37:::2;;:44:::0;;;::::2;67011:4;66971:44;::::0;;67030:7:::2;::::0;:63:::2;::::0;66971:20:::2;67030:7:::0;;;::::2;::::0;67072:20;67030::::2;:63::i;:::-;67117:36;67168:23:::0;;67164:244:::2;;67301:3;67261:21;67283:14;67261:37;;;;;;;;;:::i;:::-;;::::0;67239:59:::2;::::0;:19;:59:::2;:::i;:::-;:65;;;;:::i;:::-;67319:13;::::0;67208:96;;-1:-1:-1;67319:77:0::2;::::0;:13:::2;;67354:10;67208:96:::0;67319:26:::2;:77::i;:::-;67427:10;67418:20;::::0;;;:8:::2;:20;::::0;;;;;;;:26:::2;::::0;;::::2;::::0;;;;;;;67471:4:::2;::::0;67418:34:::2;::::0;;::::2;::::0;:50;::::2;;::::0;::::2;;;;;:::i;:::-;;;;;;;;;;:57;;;;;;;;;;;;;;;;;;67564:4;67493:76;;67501:10;67493:76;;;67513:28;67543:20;67493:76;;;;;;28491:25:1::0;;;28547:2;28532:18;;28525:34;28479:2;28464:18;;28309:256;67493:76:0::2;;;;;;;;-1:-1:-1::0;;18992:1:0;19944:7;:22;-1:-1:-1;;;;65852:1729:0:o;59860:649::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;59986:8:::1;;59971:12;:23;59963:57;;;::::0;::::1;::::0;;22791:2:1;59963:57:0::1;::::0;::::1;22773:21:1::0;22830:2;22810:18;;;22803:30;22869:23;22849:18;;;22842:51;22910:18;;59963:57:0::1;22589:345:1::0;59963:57:0::1;60052:7;::::0;:32:::1;::::0;;;;60078:4:::1;60052:32;::::0;::::1;10484:74:1::0;60052:7:0::1;::::0;;::::1;::::0;:17:::1;::::0;10457:18:1;;60052:32:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60039:9;:45;;60031:78;;;::::0;::::1;::::0;;19116:2:1;60031:78:0::1;::::0;::::1;19098:21:1::0;19155:2;19135:18;;;19128:30;19194:22;19174:18;;;19167:50;19234:18;;60031:78:0::1;18914:344:1::0;60031:78:0::1;60144:13;::::0;:38:::1;::::0;;;;60176:4:::1;60144:38;::::0;::::1;10484:74:1::0;60144:13:0::1;::::0;;::::1;::::0;:23:::1;::::0;10457:18:1;;60144:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60128:12;:54;;60120:93;;;::::0;::::1;::::0;;16891:2:1;60120:93:0::1;::::0;::::1;16873:21:1::0;16930:2;16910:18;;;16903:30;16969:28;16949:18;;;16942:56;17015:18;;60120:93:0::1;16689:350:1::0;60120:93:0::1;60230:13:::0;;60226:98:::1;;60260:7;::::0;:52:::1;::::0;:7:::1;;60289:10;60302:9:::0;60260:20:::1;:52::i;:::-;60340:16:::0;;60336:110:::1;;60373:13;::::0;:61:::1;::::0;:13:::1;;60408:10;60421:12:::0;60373:26:::1;:61::i;:::-;60463:38;::::0;;28491:25:1;;;28547:2;28532:18;;28525:34;;;60463:38:0::1;::::0;28464:18:1;60463:38:0::1;28309:256:1::0;73630:1264:0;73855:51;;;73868:37;73855:51;;;;;;;;;73718:15;;;;;;73821:31;;73855:51;;;;73718:15;;73855:51;;;;;-1:-1:-1;73855:51:0;73821:85;;73922:8;73917:148;73940:37;73936:1;:41;;;73917:148;;;74020:15;:33;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;73999:15;74015:1;73999:18;;;;;;;;;;:::i;:::-;:54;;;;:18;;;;;;;;;;;:54;73979:3;;;;:::i;:::-;;;;73917:148;;;-1:-1:-1;74108:48:0;;;74120:35;74108:48;;;;;;;;;74077:28;;74108:48;;;;;;;;;;-1:-1:-1;74108:48:0;74077:79;;74172:7;74167:141;74189:35;74185:1;:39;;;74167:141;;;74265:28;:31;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;74246:13;74260:1;74246:16;;;;;;;;;;:::i;:::-;:50;;;;:16;;;;;;;;;;;:50;74226:3;;;;:::i;:::-;;;;74167:141;;;-1:-1:-1;74356:53:0;;;74370:38;74356:53;;;;;;;;;74320:33;;74356:53;;;;;;;;;;;;;;;;;;;;74320:89;;74425:7;74420:348;74442:38;74438:1;:42;;;74420:348;;;74535:31;:34;;;;;;;;;;:::i;:::-;-1:-1:-1;;74523:54:0;;;74535:41;74523:54;;;;;;;;;;;;;;;;;;;;-1:-1:-1;74523:54:0;74501:16;74518:1;74501:19;;;;;;;;;;:::i;:::-;;;;;;:76;;;;74597:7;74592:165;74613:31;:34;;;;;;;;;;:::i;:::-;;;:41;74609:1;:45;;;74592:165;;;74704:31;:34;;;;;;;;;;:::i;:::-;;74739:1;74704:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;74679:16;74696:1;74679:19;;;;;;;;;;:::i;:::-;;;;;;;74699:1;74679:22;;;;;;;;;;:::i;:::-;:62;;;;:22;;;;;;;;;;;:62;74655:3;;;;:::i;:::-;;;;74592:165;;;-1:-1:-1;74481:3:0;;;;:::i;:::-;;;;74420:348;;;-1:-1:-1;74801:15:0;;74831:13;;-1:-1:-1;74859:16:0;;-1:-1:-1;73630:1264:0;-1:-1:-1;73630:1264:0:o;63239:342::-;63302:4;63319:14;63351:9;63346:205;49880:1;63364:20;;63346:205;;;63421:5;;;:23;;;;;;;;28181:25:1;;;63421:5:0;28242:55:1;;;28222:18;;;28215:83;63421:5:0;;:14;;28154:18:1;;63421:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;63472:20:0;;63406:38;;-1:-1:-1;;;63462:30:0;;63459:81;;-1:-1:-1;63520:4:0;;63239:342;-1:-1:-1;;;63239:342:0:o;63459:81::-;63386:3;;;;:::i;:::-;;;;63346:205;;;-1:-1:-1;63568:5:0;;63239:342;-1:-1:-1;;;63239:342:0:o;63593:690::-;63655:6;63674:15;63700:11;63722:14;63752:7;63747:501;49880:1;63763:20;;;;63747:501;;;63820:5;;;:23;;;;;30501:4:1;30489:17;;63820:23:0;;;30471:36:1;;;;63820:5:0;30543:55:1;;;30523:18;;;30516:83;63820:5:0;;:14;;30444:18:1;;63820:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;63805:38:0;;-1:-1:-1;63863:7:0;;-1:-1:-1;;;63858:379:0;49983:1;63874:19;;;;63858:379;;;63975:31;:34;;;;;;;;;;:::i;:::-;;64010:1;63975:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;63933:28;;:31;;;;;;;;;:::i;:::-;;;;;;;;;63926:87;;;63933:31;;;;;;;;63926:87;:::i;:::-;63919:94;-1:-1:-1;64053:15:0;:33;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;64045:42;;64088:4;64045:47;;;;:::i;:::-;64035:6;:57;64032:190;;64127:8;64120:15;;:4;:15;;;64117:86;;;64175:4;64164:15;;64117:86;63895:3;;;;:::i;:::-;;;;63858:379;;;-1:-1:-1;63785:3:0;;;;:::i;:::-;;;;63747:501;;;-1:-1:-1;64266:8:0;;63593:690;-1:-1:-1;;;;63593:690:0:o;72731:891::-;72891:19;72928:31;72979:5;72962:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;72928:64;;73010:7;73005:581;73023:16;;;;-1:-1:-1;73005:581:0;;;73061:30;73106:31;73152:25;73233:1;73198:8;73207:5;;73213:1;73207:8;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;73198:18;;;;;;;;;:::i;:::-;;;;:32;:36;73194:279;;;73408:49;73441:5;73448;;73454:1;73448:8;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;73408:32;:49::i;:::-;73255:202;;-1:-1:-1;73255:202:0;-1:-1:-1;73255:202:0;-1:-1:-1;73194:279:0;73489:85;;;;;;;;73507:22;73489:85;;;;73531:23;73489:85;;;;73556:17;73489:85;;;:11;73501:1;73489:14;;;;;;;;;;:::i;:::-;;;;;;:85;;;;73046:540;;;73041:3;;;;;:::i;:::-;;;;73005:581;;;-1:-1:-1;73603:11:0;72731:891;-1:-1:-1;;;;72731:891:0:o;55315:247::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;55415:10:::1;;55400:12;:25;55392:60;;;::::0;::::1;::::0;;23141:2:1;55392:60:0::1;::::0;::::1;23123:21:1::0;23180:2;23160:18;;;23153:30;23219:24;23199:18;;;23192:52;23261:18;;55392:60:0::1;22939:346:1::0;55392:60:0::1;55511:1;55479:14;:26;;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;;55471:42;;;::::0;::::1;;55524:13;:30:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;55315:247::o;2623:192::-;1796:6;;1943:23;1796:6;679:10;1943:23;1935:68;;;;;;;21741:2:1;1935:68:0;;;21723:21:1;;;21760:18;;;21753:30;21819:34;21799:18;;;21792:62;21871:18;;1935:68:0;21539:356:1;1935:68:0;2712:22:::1;::::0;::::1;2704:73;;;::::0;::::1;::::0;;17246:2:1;2704:73:0::1;::::0;::::1;17228:21:1::0;17285:2;17265:18;;;17258:30;17324:34;17304:18;;;17297:62;17395:8;17375:18;;;17368:36;17421:19;;2704:73:0::1;17044:402:1::0;2704:73:0::1;2788:19;2798:8;2788:9;:19::i;72126:411::-:0;72266:16;72300:32;72349:5;72335:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;72335:27:0;;72300:62;;72378:7;72373:124;72391:16;;;;-1:-1:-1;72373:124:0;;;72450:35;72469:5;72476;;72482:1;72476:8;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;72450:18;:35::i;:::-;72429:15;72445:1;72429:18;;;;;;;;;;:::i;:::-;;;;;;;;;;:56;72409:3;;;;:::i;:::-;;;;72373:124;;14085:211;14229:58;;11176:42:1;11164:55;;14229:58:0;;;11146:74:1;11236:18;;;11229:34;;;14202:86:0;;14222:5;;14252:23;;11119:18:1;;14229:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14202:19;:86::i;:::-;14085:211;;;:::o;56564:1245::-;56650:26;56691:19;56725:22;56778:12;56767:121;;;;;;;;;;;;:::i;:::-;56635:253;;;;;;49880:1;56921:33;;:4;:11;:33;:71;;;;-1:-1:-1;56958:12:0;;49880:1;56958:34;56921:71;56899:142;;;;;;;25230:2:1;56899:142:0;;;25212:21:1;25269:2;25249:18;;;25242:30;25308:23;25288:18;;;25281:51;25349:18;;56899:142:0;25028:345:1;56899:142:0;57060:17;;49983:1;57060:38;57052:71;;;;;;;18767:2:1;57052:71:0;;;18749:21:1;18806:2;18786:18;;;18779:30;18845:22;18825:18;;;18818:50;18885:18;;57052:71:0;18565:344:1;57052:71:0;57141:7;57136:123;49983:1;57154:21;;;;57136:123;;;57234:10;57245:1;57234:13;;;;;;;;;;:::i;:::-;;;;;;;57197:15;:30;;57228:1;57197:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;:50;;;;;;;;;;;;;;;;;;57177:3;;;;;:::i;:::-;;;;57136:123;;;;57276:7;57271:345;49880:1;57289:22;;;;57271:345;;;57366:4;57371:1;57366:7;;;;;;;;;;:::i;:::-;;;;;;;57332:15;:28;;57361:1;57332:31;;;;;;;;;:::i;:::-;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;49983:1;57396:36;;:5;57402:1;57396:8;;;;;;;;;;:::i;:::-;;;;;;;:15;:36;57388:69;;;;;;;18767:2:1;57388:69:0;;;18749:21:1;18806:2;18786:18;;;18779:30;18845:22;18825:18;;;18818:50;18885:18;;57388:69:0;18565:344:1;57388:69:0;57478:7;57472:133;49983:1;57491:21;;;;57472:133;;;57578:5;57584:1;57578:8;;;;;;;;;;:::i;:::-;;;;;;;57587:1;57578:11;;;;;;;;;;:::i;:::-;;;;;;;57537:15;:31;;57569:1;57537:34;;;;;;;;;:::i;:::-;;57572:1;57537:37;;;;;;;;;:::i;:::-;;;;;;;;;;:52;;;;;;;;;;;;;;;;;;57514:3;;;;;:::i;:::-;;;;57472:133;;;-1:-1:-1;57313:3:0;;;;:::i;:::-;;;;57271:345;;;-1:-1:-1;57633:168:0;;;;;;57671:15;;57716:28;;57759:31;;57633:168;:::i;:::-;;;;;;;;56624:1185;;;56564:1245;:::o;70344:628::-;70479:7;;70528:37;70547:18;70528:16;:37;:::i;:::-;70504:61;;70599:3;70582:13;:20;70578:387;;70626:10;70619:17;;;;;70578:387;70683:3;70666:13;:20;70662:303;;70710:10;70703:17;;;;;70662:303;70768:3;70751:13;:20;70747:218;;70795:10;70788:17;;;;;70747:218;70852:2;70835:13;:19;70831:134;;70878:10;70871:17;;;;;70831:134;-1:-1:-1;70936:11:0;;70344:628;-1:-1:-1;;;70344:628:0:o;2823:173::-;2898:6;;;;2915:17;;;;;;;;;;;2948:40;;2898:6;;;2915:17;2898:6;;2948:40;;2879:16;;2948:40;2868:128;2823:173;:::o;14304:248::-;14475:68;;10781:42:1;10850:15;;;14475:68:0;;;10832:34:1;10902:15;;10882:18;;;10875:43;10934:18;;;10927:34;;;14448:96:0;;14468:5;;14498:27;;10744:18:1;;14475:68:0;10569:398:1;14448:96:0;14304:248;;;;:::o;67589:1664::-;67722:7;67744;67766;67801:26;67838:27;67876:17;67943:8;67952:4;67943:14;;;;;;;;;:::i;:::-;;;;:28;67910:8;:14;;;;;;;;;;:::i;:::-;;;;:30;;;:61;67906:1270;;;67990:18;68011:30;68030:5;68036:4;68011:18;:30::i;:::-;67990:51;;68124:4;68111:10;68079:8;68088:4;68079:14;;;;;;;;;:::i;:::-;;;;:29;;;:42;;;;:::i;:::-;:49;;;;:::i;:::-;68058:70;;68145:17;68268:4;68234:8;68243:4;68234:14;;;;;;;;;:::i;:::-;;;;:30;;;68196:15;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;;;:28;;68165:8;;:14;;;;;;;:::i;:::-;;;;:28;:59;;;;:::i;:::-;:66;;68227:4;68165:66;:::i;:::-;:99;;;;:::i;:::-;:107;;;;:::i;:::-;68311:15;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;;:28;68145:127;;-1:-1:-1;68311:40:0;;68145:127;;68311:40;:::i;:::-;68289:62;;68370:8;68379:4;68370:14;;;;;;;;;:::i;:::-;;;;:21;;;;;68366:385;;;68412:19;68455:156;68503:8;68512:4;68503:14;;;;;;;;;:::i;:::-;;;;:30;;;68560:8;68569:4;68560:14;;;;;;;;;:::i;68455:156::-;68412:199;-1:-1:-1;68678:4:0;68642:33;68412:199;68642:19;:33;:::i;:::-;:40;;;;:::i;:::-;68630:52;-1:-1:-1;68703:32:0;68630:52;68703:32;;:::i;:::-;;;68393:358;68366:385;67973:789;;67906:1270;;;-1:-1:-1;68805:1:0;;-1:-1:-1;68805:1:0;;68853:8;:14;;;;;;;;;;:::i;:::-;;;;:28;;;:32;68849:316;;;68990:8;68999:4;68990:14;;;;;;;;;:::i;:::-;;;;:28;68958:8;:14;;;;;;;;;;:::i;:::-;;;;:29;;;68927:15;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;;:28;:60;;68958:29;68927:60;:::i;:::-;:91;;;;:::i;:::-;68906:112;;68849:316;;;69145:4;69112:30;69131:5;69137:4;69112:18;:30::i;:::-;69080:8;69089:4;69080:14;;;;;;;;;:::i;:::-;;;;:29;;;:62;;;;:::i;:::-;:69;;;;:::i;:::-;69059:90;;68849:316;69194:18;;-1:-1:-1;69214:19:0;-1:-1:-1;69235:9:0;-1:-1:-1;67589:1664:0;;;;;:::o;69559:494::-;69638:7;69695:1;69662:8;69671:4;69662:14;;;;;;;;;:::i;:::-;;;;:30;;;:34;69658:388;;;69747:1;69716:8;69725:4;69716:14;;;;;;;;;:::i;:::-;;;;:28;;;:32;69713:281;;;69847:3;69814:8;69823:4;69814:14;;;;;;;;;:::i;:::-;;;;:30;;;69776:15;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;;:28;:35;;69807:4;69776:35;:::i;:::-;:68;;;;:::i;:::-;:74;;;;:::i;:::-;69769:81;;;;69713:281;69975:3;69941:8;69950:4;69941:14;;;;;;;;;:::i;:::-;;;;:31;;;69898:15;;;;;;;:8;:15;;;;;;;;:21;;;;;;;;;;:33;;;:40;;69934:4;69898:40;:::i;69658:388::-;-1:-1:-1;70033:1:0;70026:8;;16658:716;17082:23;17108:69;17136:4;17108:69;;;;;;;;;;;;;;;;;17116:5;17108:27;;;;:69;;;;;:::i;:::-;17192:17;;17082:95;;-1:-1:-1;17192:21:0;17188:179;;17289:10;17278:30;;;;;;;;;;;;:::i;:::-;17270:85;;;;;;;25933:2:1;17270:85:0;;;25915:21:1;25972:2;25952:18;;;25945:30;26011:34;25991:18;;;25984:62;26082:12;26062:18;;;26055:40;26112:19;;17270:85:0;25731:406:1;9245:229:0;9382:12;9414:52;9436:6;9444:4;9450:1;9453:12;9414:21;:52::i;:::-;9407:59;9245:229;-1:-1:-1;;;;9245:229:0:o;10365:511::-;10535:12;10593:5;10568:21;:30;;10560:81;;;;;;;18360:2:1;10560:81:0;;;18342:21:1;18399:2;18379:18;;;18372:30;18438:34;18418:18;;;18411:62;18509:8;18489:18;;;18482:36;18535:19;;10560:81:0;18158:402:1;10560:81:0;6762:20;;10652:60;;;;;;;24185:2:1;10652:60:0;;;24167:21:1;24224:2;24204:18;;;24197:30;24263:31;24243:18;;;24236:59;24312:18;;10652:60:0;23983:353:1;10652:60:0;10726:12;10740:23;10767:6;:11;;10786:5;10793:4;10767:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10725:73;;;;10816:52;10834:7;10843:10;10855:12;10816:17;:52::i;:::-;10809:59;10365:511;-1:-1:-1;;;;;;;10365:511:0:o;12834:712::-;12984:12;13013:7;13009:530;;;-1:-1:-1;13044:10:0;13037:17;;13009:530;13158:17;;:21;13154:374;;13356:10;13350:17;13417:15;13404:10;13400:2;13396:19;13389:44;13154:374;13499:12;13492:20;;;;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;:::o;14:890:1:-;87:5;140:3;133:4;125:6;121:17;117:27;107:55;;158:1;155;148:12;107:55;187:6;181:13;213:4;237:68;253:51;301:2;253:51;:::i;:::-;237:68;:::i;:::-;327:3;351:2;346:3;339:15;379:2;374:3;370:12;363:19;;414:2;406:6;402:15;466:3;461:2;455;452:1;448:10;440:6;436:23;432:32;429:41;426:61;;;483:1;480;473:12;426:61;505:1;526;536:339;552:2;547:3;544:11;536:339;;;626:3;620:10;662:18;649:11;646:35;643:55;;;694:1;691;684:12;643:55;723:77;796:3;791:2;777:11;769:6;765:24;761:33;723:77;:::i;:::-;711:90;;-1:-1:-1;821:12:1;;;;853;;;;574:1;565:11;536:339;;;-1:-1:-1;893:5:1;;14:890;-1:-1:-1;;;;;;;;14:890:1:o;909:749::-;972:5;1025:3;1018:4;1010:6;1006:17;1002:27;992:55;;1043:1;1040;1033:12;992:55;1072:6;1066:13;1098:4;1122:68;1138:51;1186:2;1138:51;:::i;1122:68::-;1212:3;1236:2;1231:3;1224:15;1264:2;1259:3;1255:12;1248:19;;1299:2;1291:6;1287:15;1351:3;1346:2;1340;1337:1;1333:10;1325:6;1321:23;1317:32;1314:41;1311:61;;;1368:1;1365;1358:12;1311:61;1390:1;1400:229;1414:2;1411:1;1408:9;1400:229;;;1478:3;1472:10;1495:29;1518:5;1495:29;:::i;:::-;1537:18;;1575:12;;;;1607;;;;1432:1;1425:9;1400:229;;;-1:-1:-1;1647:5:1;;909:749;-1:-1:-1;;;;;;;909:749:1:o;1663:247::-;1722:6;1775:2;1763:9;1754:7;1750:23;1746:32;1743:52;;;1791:1;1788;1781:12;1743:52;1830:9;1817:23;1849:31;1874:5;1849:31;:::i;1915:748::-;2008:6;2016;2024;2077:2;2065:9;2056:7;2052:23;2048:32;2045:52;;;2093:1;2090;2083:12;2045:52;2132:9;2119:23;2151:31;2176:5;2151:31;:::i;:::-;2201:5;-1:-1:-1;2257:2:1;2242:18;;2229:32;2280:18;2310:14;;;2307:34;;;2337:1;2334;2327:12;2307:34;2375:6;2364:9;2360:22;2350:32;;2420:7;2413:4;2409:2;2405:13;2401:27;2391:55;;2442:1;2439;2432:12;2391:55;2482:2;2469:16;2508:2;2500:6;2497:14;2494:34;;;2524:1;2521;2514:12;2494:34;2577:7;2572:2;2562:6;2559:1;2555:14;2551:2;2547:23;2543:32;2540:45;2537:65;;;2598:1;2595;2588:12;2537:65;2629:2;2625;2621:11;2611:21;;2651:6;2641:16;;;;;1915:748;;;;;:::o;2668:315::-;2736:6;2744;2797:2;2785:9;2776:7;2772:23;2768:32;2765:52;;;2813:1;2810;2803:12;2765:52;2852:9;2839:23;2871:31;2896:5;2871:31;:::i;:::-;2921:5;2973:2;2958:18;;;;2945:32;;-1:-1:-1;;;2668:315:1:o;2988:384::-;3054:6;3062;3115:2;3103:9;3094:7;3090:23;3086:32;3083:52;;;3131:1;3128;3121:12;3083:52;3170:9;3157:23;3189:31;3214:5;3189:31;:::i;:::-;3239:5;-1:-1:-1;3296:2:1;3281:18;;3268:32;3309:31;3268:32;3309:31;:::i;:::-;3359:7;3349:17;;;2988:384;;;;;:::o;3377:521::-;3450:6;3458;3466;3519:2;3507:9;3498:7;3494:23;3490:32;3487:52;;;3535:1;3532;3525:12;3487:52;3574:9;3561:23;3593:31;3618:5;3593:31;:::i;:::-;3643:5;-1:-1:-1;3700:2:1;3685:18;;3672:32;3713:31;3672:32;3713:31;:::i;:::-;3763:7;-1:-1:-1;3822:2:1;3807:18;;3794:32;3835:31;3794:32;3835:31;:::i;:::-;3885:7;3875:17;;;3377:521;;;;;:::o;3903:1510::-;4086:6;4094;4102;4155:2;4143:9;4134:7;4130:23;4126:32;4123:52;;;4171:1;4168;4161:12;4123:52;4204:9;4198:16;4233:18;4274:2;4266:6;4263:14;4260:34;;;4290:1;4287;4280:12;4260:34;4328:6;4317:9;4313:22;4303:32;;4373:7;4366:4;4362:2;4358:13;4354:27;4344:55;;4395:1;4392;4385:12;4344:55;4424:2;4418:9;4446:4;4470:68;4486:51;4534:2;4486:51;:::i;4470:68::-;4560:3;4584:2;4579:3;4572:15;4612:2;4607:3;4603:12;4596:19;;4643:2;4639;4635:11;4691:7;4686:2;4680;4677:1;4673:10;4669:2;4665:19;4661:28;4658:41;4655:61;;;4712:1;4709;4702:12;4655:61;4734:1;4725:10;;4744:257;4758:2;4755:1;4752:9;4744:257;;;4822:3;4816:10;4870:6;4863:5;4859:18;4852:5;4849:29;4839:57;;4892:1;4889;4882:12;4839:57;4909:18;;4776:1;4769:9;;;;;4947:12;;;;4979;;4744:257;;;-1:-1:-1;5056:18:1;;;5050:25;5020:5;;-1:-1:-1;5050:25:1;;-1:-1:-1;;;5087:16:1;;;5084:36;;;5116:1;5113;5106:12;5084:36;5139:72;5203:7;5192:8;5181:9;5177:24;5139:72;:::i;:::-;5129:82;;5257:2;5246:9;5242:18;5236:25;5220:41;;5286:2;5276:8;5273:16;5270:36;;;5302:1;5299;5292:12;5270:36;;5325:82;5399:7;5388:8;5377:9;5373:24;5325:82;:::i;:::-;5315:92;;;3903:1510;;;;;:::o;5418:245::-;5485:6;5538:2;5526:9;5517:7;5513:23;5509:32;5506:52;;;5554:1;5551;5544:12;5506:52;5586:9;5580:16;5605:28;5627:5;5605:28;:::i;5668:822::-;5736:6;5767:2;5810;5798:9;5789:7;5785:23;5781:32;5778:52;;;5826:1;5823;5816:12;5778:52;5866:9;5853:23;5895:18;5936:2;5928:6;5925:14;5922:34;;;5952:1;5949;5942:12;5922:34;5990:6;5979:9;5975:22;5965:32;;6035:7;6028:4;6024:2;6020:13;6016:27;6006:55;;6057:1;6054;6047:12;6006:55;6093:2;6080:16;6115:2;6111;6108:10;6105:36;;;6121:18;;:::i;:::-;6163:112;6271:2;6202:66;6195:4;6191:2;6187:13;6183:86;6179:95;6163:112;:::i;:::-;6150:125;;6298:2;6291:5;6284:17;6338:7;6333:2;6328;6324;6320:11;6316:20;6313:33;6310:53;;;6359:1;6356;6349:12;6310:53;6414:2;6409;6405;6401:11;6396:2;6389:5;6385:14;6372:45;6458:1;6437:14;;;6433:23;;;6426:34;;;;-1:-1:-1;6441:5:1;5668:822;-1:-1:-1;;;5668:822:1:o;6761:180::-;6820:6;6873:2;6861:9;6852:7;6848:23;6844:32;6841:52;;;6889:1;6886;6879:12;6841:52;-1:-1:-1;6912:23:1;;6761:180;-1:-1:-1;6761:180:1:o;6946:184::-;7016:6;7069:2;7057:9;7048:7;7044:23;7040:32;7037:52;;;7085:1;7082;7075:12;7037:52;-1:-1:-1;7108:16:1;;6946:184;-1:-1:-1;6946:184:1:o;7135:248::-;7203:6;7211;7264:2;7252:9;7243:7;7239:23;7235:32;7232:52;;;7280:1;7277;7270:12;7232:52;-1:-1:-1;;7303:23:1;;;7373:2;7358:18;;;7345:32;;-1:-1:-1;7135:248:1:o;7388:584::-;7478:6;7486;7494;7502;7510;7563:3;7551:9;7542:7;7538:23;7534:33;7531:53;;;7580:1;7577;7570:12;7531:53;7616:9;7603:23;7593:33;;7673:2;7662:9;7658:18;7645:32;7635:42;;7724:2;7713:9;7709:18;7696:32;7686:42;;7778:2;7767:9;7763:18;7750:32;7791:28;7813:5;7791:28;:::i;:::-;7838:5;-1:-1:-1;7895:3:1;7880:19;;7867:33;7909:31;7867:33;7909:31;:::i;:::-;7959:7;7949:17;;;7388:584;;;;;;;;:::o;7977:430::-;8083:6;8091;8099;8107;8115;8168:3;8156:9;8147:7;8143:23;8139:33;8136:53;;;8185:1;8182;8175:12;8136:53;-1:-1:-1;;8208:16:1;;8264:2;8249:18;;8243:25;8308:2;8293:18;;8287:25;8352:2;8337:18;;8331:25;8396:3;8381:19;;;8375:26;8208:16;;8243:25;;-1:-1:-1;8287:25:1;8331;-1:-1:-1;8375:26:1;;-1:-1:-1;7977:430:1;-1:-1:-1;7977:430:1:o;8412:311::-;8478:6;8486;8539:2;8527:9;8518:7;8514:23;8510:32;8507:52;;;8555:1;8552;8545:12;8507:52;8591:9;8578:23;8568:33;;8651:2;8640:9;8636:18;8623:32;8664:29;8687:5;8664:29;:::i;8728:243::-;8785:6;8838:2;8826:9;8817:7;8813:23;8809:32;8806:52;;;8854:1;8851;8844:12;8806:52;8893:9;8880:23;8912:29;8935:5;8912:29;:::i;8976:380::-;9040:6;9048;9101:2;9089:9;9080:7;9076:23;9072:32;9069:52;;;9117:1;9114;9107:12;9069:52;9156:9;9143:23;9175:29;9198:5;9175:29;:::i;9610:444::-;9661:3;9699:5;9693:12;9726:6;9721:3;9714:19;9752:4;9781:2;9776:3;9772:12;9765:19;;9818:2;9811:5;9807:14;9839:1;9849:180;9863:6;9860:1;9857:13;9849:180;;;9928:13;;9943:4;9924:24;9912:37;;9969:12;;;;10004:15;;;;9885:1;9878:9;9849:180;;;-1:-1:-1;10045:3:1;;9610:444;-1:-1:-1;;;;;9610:444:1:o;10059:274::-;10188:3;10226:6;10220:13;10242:53;10288:6;10283:3;10276:4;10268:6;10264:17;10242:53;:::i;:::-;10311:16;;;;;10059:274;-1:-1:-1;;10059:274:1:o;11274:1032::-;11491:2;11543:21;;;11613:13;;11516:18;;;11635:22;;;11462:4;;11491:2;11714:15;;;;11688:2;11673:18;;;11462:4;;11778:502;11794:6;11789:3;11786:15;11778:502;;;11857:13;;11896:3;11979:1;11993:205;12009:4;12004:3;12001:13;11993:205;;;12082:15;;12068:30;;12167:17;;;;12124:14;;;;12033:1;12024:11;11993:205;;;-1:-1:-1;;;12255:15:1;;;;12227:4;12218:14;;;;;11820:1;11811:11;11778:502;;;-1:-1:-1;12297:3:1;;11274:1032;-1:-1:-1;;;;;;;11274:1032:1:o;12311:970::-;12621:4;12663:3;12652:9;12648:19;12640:27;;12694:6;12688:13;12720:6;12763:2;12757:4;12753:13;12742:9;12735:32;12824:2;12817:4;12813:2;12809:13;12805:22;12798:4;12787:9;12783:20;12776:52;12885:2;12878:4;12872;12868:15;12864:24;12859:2;12848:9;12844:18;12837:52;;;12908:2;12919:58;12973:2;12962:9;12958:18;12950:6;9445:5;9439:12;9482:4;9476;9472:15;9467:3;9460:28;9538:4;9531;9528:1;9524:12;9520:23;9513:4;9508:3;9504:14;9497:47;9593:4;9586;9582:2;9578:13;9574:24;9569:2;9564:3;9560:12;9553:46;;9361:244;;;12919:58;13012:3;13001:9;12997:19;13058:6;13082:1;13092:183;13106:4;13103:1;13100:11;13092:183;;;9439:12;;9482:4;9472:15;;;9460:28;;9528:1;9524:12;;;9520:23;;9513:4;9504:14;;9497:47;9582:2;9578:13;;;;9574:24;9569:2;9560:12;;9553:46;13216:12;;;;13263:1;13251:14;;;;13119:9;13092:183;;;13096:3;;;;12311:970;;;;;;:::o;13286:1627::-;13672:2;13684:21;;;13754:13;;13657:18;;;13776:22;;;13624:4;;13852;;13829:3;13814:19;;;13879:15;;;13624:4;13922:182;13936:6;13933:1;13930:13;13922:182;;;14001:13;;14016:6;13997:26;13985:39;;14044:12;;;;14079:15;;;;13958:1;13951:9;13922:182;;;13926:3;;;14149:9;14144:3;14140:19;14135:2;14124:9;14120:18;14113:47;14183:39;14218:3;14210:6;14183:39;:::i;:::-;14169:53;;14270:9;14262:6;14258:22;14253:2;14242:9;14238:18;14231:50;14303:6;14340;14334:13;14371:8;14363:6;14356:24;14410:2;14402:6;14398:15;14389:24;;14471:2;14459:8;14456:1;14452:16;14444:6;14440:29;14436:38;14511:2;14503:6;14499:15;14534:1;14544:340;14560:8;14555:3;14552:17;14544:340;;;14654:66;14645:6;14637;14633:19;14629:92;14622:5;14615:107;14745:51;14789:6;14778:8;14772:15;14745:51;:::i;:::-;14860:14;;;;14735:61;-1:-1:-1;14821:17:1;;;;14588:1;14579:11;14544:340;;;-1:-1:-1;14901:6:1;;13286:1627;-1:-1:-1;;;;;;;;;;13286:1627:1:o;14918:632::-;15089:2;15141:21;;;15211:13;;15114:18;;;15233:22;;;15060:4;;15089:2;15312:15;;;;15286:2;15271:18;;;15060:4;15355:169;15369:6;15366:1;15363:13;15355:169;;;15430:13;;15418:26;;15499:15;;;;15464:12;;;;15391:1;15384:9;15355:169;;;-1:-1:-1;15541:3:1;;14918:632;-1:-1:-1;;;;;;14918:632:1:o;16242:442::-;16391:2;16380:9;16373:21;16354:4;16423:6;16417:13;16466:6;16461:2;16450:9;16446:18;16439:34;16482:66;16541:6;16536:2;16525:9;16521:18;16516:2;16508:6;16504:15;16482:66;:::i;:::-;16600:2;16588:15;16605:66;16584:88;16569:104;;;;16675:2;16565:113;;16242:442;-1:-1:-1;;16242:442:1:o;30610:334::-;30681:2;30675:9;30737:2;30727:13;;30742:66;30723:86;30711:99;;30840:18;30825:34;;30861:22;;;30822:62;30819:88;;;30887:18;;:::i;:::-;30923:2;30916:22;30610:334;;-1:-1:-1;30610:334:1:o;30949:191::-;31017:4;31050:18;31042:6;31039:30;31036:56;;;31072:18;;:::i;:::-;-1:-1:-1;31117:1:1;31113:14;31129:4;31109:25;;30949:191::o;31145:128::-;31185:3;31216:1;31212:6;31209:1;31206:13;31203:39;;;31222:18;;:::i;:::-;-1:-1:-1;31258:9:1;;31145:128::o;31278:274::-;31318:1;31344;31334:189;;31379:77;31376:1;31369:88;31480:4;31477:1;31470:15;31508:4;31505:1;31498:15;31334:189;-1:-1:-1;31537:9:1;;31278:274::o;31557:258::-;31596:7;31628:6;31661:2;31658:1;31654:10;31691:2;31688:1;31684:10;31747:3;31743:2;31739:12;31734:3;31731:21;31724:3;31717:11;31710:19;31706:47;31703:73;;;31756:18;;:::i;:::-;31796:13;;31557:258;-1:-1:-1;;;;31557:258:1:o;31820:228::-;31860:7;31986:1;31918:66;31914:74;31911:1;31908:81;31903:1;31896:9;31889:17;31885:105;31882:131;;;31993:18;;:::i;:::-;-1:-1:-1;32033:9:1;;31820:228::o;32053:125::-;32093:4;32121:1;32118;32115:8;32112:34;;;32126:18;;:::i;:::-;-1:-1:-1;32163:9:1;;32053:125::o;32183:258::-;32255:1;32265:113;32279:6;32276:1;32273:13;32265:113;;;32355:11;;;32349:18;32336:11;;;32329:39;32301:2;32294:10;32265:113;;;32396:6;32393:1;32390:13;32387:48;;;-1:-1:-1;;32431:1:1;32413:16;;32406:27;32183:258::o;32446:197::-;32484:3;32512:6;32553:2;32546:5;32542:14;32580:2;32571:7;32568:15;32565:41;;;32586:18;;:::i;:::-;32635:1;32622:15;;32446:197;-1:-1:-1;;;32446:197:1:o;32648:195::-;32687:3;32718:66;32711:5;32708:77;32705:103;;;32788:18;;:::i;:::-;-1:-1:-1;32835:1:1;32824:13;;32648:195::o;32848:175::-;32885:3;32929:4;32922:5;32918:16;32958:4;32949:7;32946:17;32943:43;;;32966:18;;:::i;:::-;33015:1;33002:15;;32848:175;-1:-1:-1;;32848:175:1:o;33028:184::-;33080:77;33077:1;33070:88;33177:4;33174:1;33167:15;33201:4;33198:1;33191:15;33217:184;33269:77;33266:1;33259:88;33366:4;33363:1;33356:15;33390:4;33387:1;33380:15;33406:184;33458:77;33455:1;33448:88;33555:4;33552:1;33545:15;33579:4;33576:1;33569:15;33595:154;33681:42;33674:5;33670:54;33663:5;33660:65;33650:93;;33739:1;33736;33729:12;33754:118;33840:5;33833:13;33826:21;33819:5;33816:32;33806:60;;33862:1;33859;33852:12;33877:114;33961:4;33954:5;33950:16;33943:5;33940:27;33930:55;;33981:1;33978;33971:12
Swarm Source
ipfs://b76543ee55fddcee9e0e4f716bc106539b94eb44bf7fd4845c5b8a4801f51fd0
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in MOVR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.