Polygon Sponsored slots available. Book your slot here!
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Contract Name:
XVMCtimeDeposit
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-06-05 */ // File: xvmc-contracts/libs/poolLibraries.sol pragma solidity 0.6.12; //openZeppelin contracts(also used by Pancakeswap). //modified IERC20 and SafeERC20(using transferXVMC instead of standard transferFrom) // File: @openzeppelin/contracts/utils/Context.sol /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @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 () internal { _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; } } // File: @openzeppelin/contracts/math/SafeMath.sol /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { 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) { 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) { // 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) { 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) { 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) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); 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) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); 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) { require(b > 0, "SafeMath: modulo by zero"); 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) { 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. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); 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) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol /** * @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); //transfers XVMC without allowance function transferXVMC(address _sender, address _recipient, uint256 _amount) external returns (bool); //returns owner address function owner() external view returns (address); /** * @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); } // File: @openzeppelin/contracts/utils/Address.sol /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ 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; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferXVMC.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: xvmc-contracts/pools/6month.sol pragma solidity 0.6.12; interface IMasterChef { function deposit(uint256 _pid, uint256 _amount) external; function withdraw(uint256 _pid, uint256 _amount) external; function pendingEgg(uint256 _pid, address _user) external view returns (uint256); function userInfo(uint256 _pid, address _user) external view returns (uint256, uint256); function emergencyWithdraw(uint256 _pid) external; function feeAddress() external view returns (address); function owner() external view returns (address); } interface IacPool { function hopDeposit(uint256 _amount, address _recipientAddress, uint256 previousLastDepositedTime, uint256 _mandatoryTime) external; function getUserShares(address wallet) external view returns (uint256); function getNrOfStakes(address _user) external view returns (uint256); function giftDeposit(uint256 _amount, address _toAddress, uint256 _minToServeInSecs) external; } interface IGovernance { function costToVote() external view returns (uint256); function rebalancePools() external; function getRollBonus(address _bonusForPool) external view returns (uint256); function stakeRolloverBonus(address _toAddress, address _depositToPool, uint256 _bonusToPay, uint256 _stakeID) external; function treasuryWallet() external view returns (address); } interface IVoting { function addCredit(uint256 amount, address _beneficiary) external; } /** * XVMC time-locked deposit * Auto-compounding pool * !!! Warning: !!! Licensed under Business Source License 1.1 (BSL 1.1) */ contract XVMCtimeDeposit is ReentrancyGuard { using SafeERC20 for IERC20; using SafeMath for uint256; struct UserInfo { uint256 shares; // number of shares for a user uint256 lastDepositedTime; // keeps track of deposited time for potential penalty uint256 xvmcAtLastUserAction; // keeps track of XVMC deposited at the last user action uint256 lastUserActionTime; // keeps track of the last user action time uint256 mandatoryTimeToServe; // optional: disables early withdraw } //allows stakes to be transferred, similar to token transfers struct StakeTransfer { uint256 shares; // ALLOWANCE of shares uint256 lastDepositedTime; uint256 mandatoryTimeToServe; } IERC20 public immutable token; // XVMC token IERC20 public immutable oldToken = IERC20(0x6d0c966c8A09e354Df9C48b446A474CE3343D912); IERC20 public immutable dummyToken; IMasterChef public masterchef; uint256 public immutable withdrawFeePeriod = 183 days; uint256 public immutable gracePeriod = 7 days; mapping(address => UserInfo[]) public userInfo; mapping(address => uint256) public userVote; //the ID the user is voting for mapping(uint256 => uint256) public totalVotesForID; //total votes for a given ID mapping(address => address) public userDelegate; //user can delegate their voting to another wallet mapping(address => bool) public trustedSender; //Pools with shorter lockup duration(trustedSender(contracts) can transfer into this pool) mapping(address => bool) public trustedPool; //Pools with longer lockup duration(can transfer from this pool into trustedPool(contracts)) mapping(address => mapping(address => StakeTransfer[])) private _stakeAllowances; //similar to token allowances, difference being it's not for amount of tokens, but for a specific stake defined by shares, latdeposittime and mandatorytime uint256 public poolID; uint256 public totalShares; address public admin; //admin = governing contract! address public treasury; //penalties go to this address address public migrationPool; //if pools are to change address public votingCreditAddress; uint256 public minimumGift = 1000000 * 1e18; bool public updateMinGiftGovernor = true; //allows automatic update by anybody to costToVote from governing contract uint256 public callFee = 5; // call fee paid for rebalancing pools bool public allowStakeTransfer = true; //enable/disable transferring of stakes to another wallet bool public allowStakeTransferFrom = false; //allow third party transfers(disabled initially) bool public partialWithdrawals = true; //partial withdrawals from stakes bool public partialTransfers = true; //allows transferring a portion of a stake bool public allowOrigin = true; //(dis)allows tx.origin for voting //safe to use tx.origin IMO. Can be disabled and use msg.sender instead //it allows the voting and delegating in a single transaction for all pools through a proxy contract // Easier to verify (opposed to checking event logs) uint256 public trustedSenderCount; uint256 public trustedPoolCount; event Deposit(address indexed sender, uint256 amount, uint256 shares, uint256 lastDepositedTime); event GiftDeposit(address indexed sender, address indexed recipient, uint256 amount, uint256 shares, uint256 lastDepositedTime); event AddAndExtendStake(address indexed sender, address indexed recipient, uint256 amount, uint256 stakeID, uint256 shares, uint256 lastDepositedTime); event Withdraw(address indexed sender, uint256 amount, uint256 penalty, uint256 shares); event TransferStake(address indexed sender, address indexed recipient, uint256 shares, uint256 stakeID); event HopPool(address indexed sender, uint256 XVMCamount, uint256 shares, address indexed newPool); event MigrateStake(address indexed goodSamaritan, uint256 XVMCamount, uint256 shares, address indexed recipient); event HopDeposit(address indexed recipient, uint256 amount, uint256 shares, uint256 previousLastDepositedTime, uint256 mandatoryTime); event RemoveVotes(address indexed voter, uint256 proposalID, uint256 change); event AddVotes(address indexed voter, uint256 proposalID, uint256 change); event TrustedSender(address contractAddress, bool setting); event TrustedPool(address contractAddress, bool setting); event StakeApproval(address owner, address spender, uint256 allowanceID, uint256 shareAllowance, uint256 lastDeposit, uint256 mandatoryTime); event StakeAllowanceRevoke(address owner, address spender, uint256 allowanceID); event TransferStakeFrom(address _from, address _to, uint256 _stakeID, uint256 _allowanceID); event SetDelegate(address userDelegating, address delegatee); /** * @notice Constructor * @param _token: XVMC token contract * @param _dummyToken: Dummy token contract * @param _masterchef: MasterChef contract * @param _admin: address of the admin * @param _treasury: address of the treasury (collects fees) */ constructor( IERC20 _token, IERC20 _dummyToken, IMasterChef _masterchef, address _admin, address _treasury, uint256 _poolID ) public { token = _token; dummyToken = _dummyToken; masterchef = _masterchef; admin = _admin; treasury = _treasury; poolID = _poolID; IERC20(_dummyToken).safeApprove(address(_masterchef), uint256(-1)); } /** * @notice Checks if the msg.sender is the admin */ modifier adminOnly() { require(msg.sender == admin, "admin: wut?"); _; } /** * @notice Deposits funds into the XVMC time-locked vault * @param _amount: number of tokens to deposit (in XVMC) * * Creates a NEW stake */ function deposit(uint256 _amount) external nonReentrant { require(_amount > 0, "Nothing to deposit"); uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[msg.sender].push( UserInfo(currentShares, block.timestamp, _amount, block.timestamp, 0) ); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingAddDiff(msg.sender, votingFor, currentShares); } emit Deposit(msg.sender, _amount, currentShares, block.timestamp); } /** * Equivalent to Deposit * Instead of crediting the msg.sender, it credits custom recipient * A mechanism to gift a time-locked stake to another wallet * Users can withdraw at any time(but will pay a penalty) * Optionally stake can be irreversibly locked for a minimum period of time(minToServe) */ function giftDeposit(uint256 _amount, address _toAddress, uint256 _minToServeInSecs) external nonReentrant { require(_amount >= minimumGift, "Below Minimum Gift"); uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[_toAddress].push( UserInfo(currentShares, block.timestamp, _amount, block.timestamp, _minToServeInSecs) ); uint256 votingFor = userVote[_toAddress]; if(votingFor != 0) { _updateVotingAddDiff(_toAddress, votingFor, currentShares); } emit GiftDeposit(msg.sender, _toAddress, _amount, currentShares, block.timestamp); } /** * @notice Deposits funds into the XVMC time-locked vault * @param _amount: number of tokens to deposit (in XVMC) * * Deposits into existing stake, effectively extending the stake * It's used for rolling over stakes by the governor(admin) as well * Mandatory Lock Up period can only be Increased * It can be Decreased if stake is being extended(after it matures) */ function addAndExtendStake(address _recipientAddr, uint256 _amount, uint256 _stakeID, uint256 _lockUpTokensInSeconds) external nonReentrant { require(_amount > 0, "Nothing to deposit"); require(userInfo[_recipientAddr].length > _stakeID, "wrong Stake ID"); if(msg.sender != admin) { require(_recipientAddr == msg.sender, "can only extend your own stake"); } uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } UserInfo storage user = userInfo[_recipientAddr][_stakeID]; user.shares = user.shares.add(currentShares); totalShares = totalShares.add(currentShares); if(_lockUpTokensInSeconds > user.mandatoryTimeToServe || block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod)) { user.mandatoryTimeToServe = _lockUpTokensInSeconds; } user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; user.lastDepositedTime = block.timestamp; uint256 votingFor = userVote[_recipientAddr]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddr, votingFor, currentShares); } emit AddAndExtendStake(msg.sender, _recipientAddr, _amount, _stakeID, currentShares, block.timestamp); } function withdrawAll(uint256 _stakeID) external { withdraw(userInfo[msg.sender][_stakeID].shares, _stakeID); } /** * Harvest pending rewards from masterchef * Governor pays the rewards for harvesting and rebalancing */ function harvest() external { IMasterChef(masterchef).withdraw(poolID, 0); } /** * @notice Sets admin address and treasury * If new governor is set, anyone can pay the gas to update the addresses * Masterchef owns the token, the governor owns the Masterchef * Treasury is feeAddress from masterchef(which collects fees from deposits into masterchef) * Currently all penalties are going to fee address(currently governing contract) * Alternatively, fee address can be set as a separate contract, which would re-distribute * The tokens back into pool(so honest stakers would directly receive penalties from prematurely ended stakes) * Alternatively could also split: a portion to honest stakers, a portion into governing contract. * With initial setting, all penalties are going towards governing contract */ function setAdmin() external { admin = IMasterChef(masterchef).owner(); treasury = IMasterChef(masterchef).feeAddress(); } //updates minimum gift to costToVote from Governing contract function updateMinimumGift() external { require(updateMinGiftGovernor, "automatic update disabled"); minimumGift = IGovernance(admin).costToVote(); } /** * @notice Withdraws from funds from the XVMC time-locked vault * @param _shares: Number of shares to withdraw */ function withdraw(uint256 _shares, uint256 _stakeID) public { require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares > 0, "Nothing to withdraw"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); require(block.timestamp > user.lastDepositedTime.add(user.mandatoryTimeToServe), "must serve mandatory time"); if(!partialWithdrawals) { require(_shares == user.shares, "must transfer full stake"); } uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); uint256 currentWithdrawFee = 0; if (block.timestamp < user.lastDepositedTime.add(withdrawFeePeriod)) { uint256 withdrawFee = uint256(4200).sub(((block.timestamp - user.lastDepositedTime).div(86400)).mul(231).div(10)); currentWithdrawFee = currentAmount.mul(withdrawFee).div(10000); token.safeTransfer(treasury, currentWithdrawFee); currentAmount = currentAmount.sub(currentWithdrawFee); } else if(block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod)) { uint256 withdrawFee = block.timestamp.sub(user.lastDepositedTime.add(withdrawFeePeriod)).div(86400).mul(231).div(10); if(withdrawFee > 4200) { withdrawFee = 4200; } currentWithdrawFee = currentAmount.mul(withdrawFee).div(10000); token.safeTransfer(treasury, currentWithdrawFee); currentAmount = currentAmount.sub(currentWithdrawFee); } if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf().sub(currentAmount)).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } emit Withdraw(msg.sender, currentAmount, currentWithdrawFee, _shares); token.safeTransfer(msg.sender, currentAmount); } /** * Users can transfer their stake to another pool * Can only transfer to pool with longer lock-up period(trusted pools) * Equivalent to withdrawing, but it deposits the stake into another pool as hopDeposit * Users can transfer stake without penalty * Time served gets transferred * The pool is "registered" as a "trustedSender" to another pool */ function hopStakeToAnotherPool(uint256 _shares, uint256 _stakeID, address _poolAddress) public { require(_shares > 0, "Nothing to withdraw"); require(_stakeID < userInfo[msg.sender].length, "wrong stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares <= user.shares, "Withdraw amount exceeds balance"); if(!partialWithdrawals) { require(_shares == user.shares, "must transfer full stake"); } uint256 _lastDepositedTime = user.lastDepositedTime; if(trustedPool[_poolAddress]) { if(block.timestamp > _lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod)) { _lastDepositedTime = block.timestamp; //if after grace period, resets timer } } else { //can only hop into trusted Pools or into trusted sender(lower pool) after time has been served within grace period //only meant for stakeRollover. After hop, stake is extended and timer reset require(trustedSender[_poolAddress] && block.timestamp > _lastDepositedTime.add(withdrawFeePeriod) && block.timestamp < _lastDepositedTime.add(withdrawFeePeriod).add(gracePeriod), "can only hop into pre-set Pools"); } uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } IacPool(_poolAddress).hopDeposit(currentAmount, msg.sender, _lastDepositedTime, user.mandatoryTimeToServe); //_poolAddress can only be trusted pool(contract) if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } emit HopPool(msg.sender, currentAmount, _shares, _poolAddress); } /** * hopDeposit is equivalent to gift deposit, exception being that the time served can be passed * The msg.sender can only be a trusted contract * The checks are already made in the hopStakeToAnotherPool function * msg sender can only be trusted senders */ function hopDeposit(uint256 _amount, address _recipientAddress, uint256 previousLastDepositedTime, uint256 _mandatoryTime) external { require(trustedSender[msg.sender] || trustedPool[msg.sender], "only trusted senders(other pools)"); //only trustedSenders allowed. TrustedPools are under condition that the stake has matured(hopStake checks condition) uint256 pool = balanceOf(); token.safeTransferFrom(msg.sender, address(this), _amount); uint256 currentShares = 0; if (totalShares != 0) { currentShares = (_amount.mul(totalShares)).div(pool); } else { currentShares = _amount; } totalShares = totalShares.add(currentShares); userInfo[_recipientAddress].push( UserInfo(currentShares, previousLastDepositedTime, _amount, block.timestamp, _mandatoryTime) ); uint256 votingFor = userVote[_recipientAddress]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddress, votingFor, currentShares); } emit HopDeposit(_recipientAddress, _amount, currentShares, previousLastDepositedTime, _mandatoryTime); } /** * Users are encouraged to keep staking * Governor pays bonuses to re-commit and roll over your stake * Higher bonuses available for hopping into pools with longer lockup period */ function stakeRollover(address _poolInto, uint256 _stakeID) external { require(userInfo[msg.sender].length > _stakeID, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(block.timestamp > user.lastDepositedTime.add(withdrawFeePeriod), "stake not yet mature"); uint256 currentAmount = (balanceOf().mul(user.shares)).div(totalShares); uint256 toPay = currentAmount.mul(IGovernance(admin).getRollBonus(_poolInto)).div(10000); require(IERC20(token).balanceOf(admin) >= toPay, "governor reserves are currently insufficient"); if(_poolInto == address(this)) { IGovernance(admin).stakeRolloverBonus(msg.sender, _poolInto, toPay, _stakeID); //gov sends tokens to extend the stake } else { hopStakeToAnotherPool(user.shares, _stakeID, _poolInto); //will revert if pool is wrong IGovernance(admin).stakeRolloverBonus(msg.sender, _poolInto, toPay, IacPool(_poolInto).getNrOfStakes(msg.sender) - 1); //extends latest stake } } /** * Transfer stake to another account(another wallet address) */ function transferStakeToAnotherWallet(uint256 _shares, uint256 _stakeID, address _recipientAddress) external { require(allowStakeTransfer, "transfers disabled"); require(_recipientAddress != msg.sender, "can't transfer to self"); require(_stakeID < userInfo[msg.sender].length, "wrong stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; uint256 _tokensTransferred = _shares.mul(balanceOf()).div(totalShares); require(_tokensTransferred >= minimumGift, "Below minimum threshold"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); if(!partialTransfers) { require(_shares == user.shares, "must transfer full stake"); } user.shares = user.shares.sub(_shares); uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } votingFor = userVote[_recipientAddress]; if(votingFor != 0) { _updateVotingAddDiff(_recipientAddress, votingFor, _shares); } userInfo[_recipientAddress].push( UserInfo(_shares, user.lastDepositedTime, _tokensTransferred, block.timestamp, user.mandatoryTimeToServe) ); if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf()).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } emit TransferStake(msg.sender, _recipientAddress, _shares, _stakeID); } /** * user delegates their shares to cast a vote on a proposal * casting to proposal ID = 0 is basically neutral position (not voting) * Is origin is allowed, proxy contract can be used to vote in all pools in a single tx */ function voteForProposal(uint256 proposalID) external { address _wallet; allowOrigin ? _wallet = tx.origin : _wallet = msg.sender; uint256 votingFor = userVote[_wallet]; //the ID the user is voting for(before change) if(proposalID != votingFor) { // do nothing if false(already voting for that ID) uint256 userTotalShares = getUserTotalShares(_wallet); if(userTotalShares > 0) { //if false, no shares, thus just assign proposal ID to userVote if(proposalID != 0) { // Allocates vote to an ID if(votingFor == 0) { //starts voting, adds votes _updateVotingAddDiff(_wallet, proposalID, userTotalShares); } else { //removes from previous vote, adds to new _updateVotingSubDiff(_wallet, votingFor, userTotalShares); _updateVotingAddDiff(_wallet, proposalID, userTotalShares); } } else { //stops voting (previously voted, now going into neutral (=0) _updateVotingSubDiff(_wallet, votingFor, userTotalShares); } } userVote[_wallet] = proposalID; } } /* * delegatee can vote with shares of another user */ function delegateeVote(address[] calldata votingAddress, uint256 proposalID) external { for(uint256 i = 0; i < votingAddress.length; i++) { if(userDelegate[votingAddress[i]] == msg.sender) { uint256 votingFor = userVote[votingAddress[i]]; //the ID the user is voting for(before change) if(proposalID != votingFor){ uint256 userTotalShares = getUserTotalShares(votingAddress[i]); if(userTotalShares > 0) { if(proposalID != 0) { if(votingFor == 0) { _updateVotingAddDiff(votingAddress[i], proposalID, userTotalShares); } else { _updateVotingSubDiff(votingAddress[i], votingFor, userTotalShares); _updateVotingAddDiff(votingAddress[i], proposalID, userTotalShares); } } else { _updateVotingSubDiff(votingAddress[i], votingFor, userTotalShares); } } userVote[votingAddress[i]] = proposalID; } } } } /** * Users can delegate their shares */ function setDelegate(address _delegate) external { address _wallet; allowOrigin ? _wallet=tx.origin : _wallet=msg.sender; userDelegate[_wallet] = _delegate; emit SetDelegate(_wallet, _delegate); } //allows third party stake transfer(stake IDs can be changed, so instead of being identified through ID, it's identified by shares, lastdeposit and mandatory time function giveStakeAllowance(address spender, uint256 _stakeID) external { UserInfo storage user = userInfo[msg.sender][_stakeID]; require(user.shares.mul(balanceOf()).div(totalShares) >= minimumGift, "below minimum threshold"); uint256 _allowanceID = _stakeAllowances[msg.sender][spender].length; _stakeAllowances[msg.sender][spender].push( StakeTransfer(user.shares, user.lastDepositedTime, user.mandatoryTimeToServe) ); emit StakeApproval(msg.sender, spender, _allowanceID, user.shares, user.lastDepositedTime, user.mandatoryTimeToServe); } //Note: allowanceID (and not ID of the stake!) function revokeStakeAllowance(address spender, uint256 allowanceID) external { StakeTransfer[] storage allowances = _stakeAllowances[msg.sender][spender]; uint256 lastAllowanceID = allowances.length.sub(1); if(allowanceID != lastAllowanceID) { allowances[allowanceID] = allowances[lastAllowanceID]; } allowances.pop(); emit StakeAllowanceRevoke(msg.sender, spender, allowanceID); } function nrOfstakeAllowances(address owner, address spender) public view returns (uint256) { return _stakeAllowances[owner][spender].length; } function stakeAllowances(address owner, address spender, uint256 allowanceID) public view returns (uint256, uint256, uint256) { StakeTransfer storage stakeStore = _stakeAllowances[owner][spender][allowanceID]; return (stakeStore.shares, stakeStore.lastDepositedTime, stakeStore.mandatoryTimeToServe); } /** * A third party can transfer the stake(allowance required) * Allows smart contract inter-operability similar to how regular tokens work * Can only transfer full stake (You can split the stake through other methods) * Bad: makes illiquid stakes liquid * I think best is to have the option, but leave it unavailable unless desired */ function transferStakeFrom(address _from, uint256 _stakeID, uint256 allowanceID, address _to) external returns (bool) { require(allowStakeTransferFrom, "third party stake transfers disabled"); require(_from != _to, "can't transfer to self"); require(_stakeID < userInfo[_from].length, "wrong stake ID"); UserInfo storage user = userInfo[_from][_stakeID]; (uint256 _shares, uint256 _lastDeposit, uint256 _mandatoryTime) = stakeAllowances(_from, msg.sender, allowanceID); //since stake ID can change, the stake to transfer is identified through number of shares, last deposit and mandatory time //checks if stake allowance(for allowanceID) matches the actual stake of a user require(_shares == user.shares, "incorrect stake or allowance"); require(_lastDeposit == user.lastDepositedTime, "incorrect stake or allowance"); require(_mandatoryTime == user.mandatoryTimeToServe, "incorrect stake or allowance"); uint256 votingFor = userVote[_from]; if(votingFor != 0) { _updateVotingSubDiff(_from, votingFor, _shares); } votingFor = userVote[_to]; if(votingFor != 0) { _updateVotingAddDiff(_to, votingFor, _shares); } _removeStake(_from, _stakeID); //transfer from must transfer full stake _revokeStakeAllowance(_from, allowanceID); userInfo[_to].push( UserInfo(_shares, _lastDeposit, _shares.mul(balanceOf()).div(totalShares), block.timestamp, _mandatoryTime) ); emit TransferStakeFrom(_from, _to, _stakeID, allowanceID); return true; } /** * Ability to withdraw tokens from the stake, and add voting credit * At the time of launch there is no option(voting with credit), but can be added later on */ function votingCredit(uint256 _shares, uint256 _stakeID) public { require(votingCreditAddress != address(0), "disabled"); require(_stakeID < userInfo[msg.sender].length, "invalid stake ID"); UserInfo storage user = userInfo[msg.sender][_stakeID]; require(_shares > 0, "Nothing to withdraw"); require(_shares <= user.shares, "Withdraw amount exceeds balance"); uint256 currentAmount = (balanceOf().mul(_shares)).div(totalShares); user.shares = user.shares.sub(_shares); totalShares = totalShares.sub(_shares); if (user.shares > 0) { user.xvmcAtLastUserAction = user.shares.mul(balanceOf().sub(currentAmount)).div(totalShares); user.lastUserActionTime = block.timestamp; } else { _removeStake(msg.sender, _stakeID); //delete the stake } uint256 votingFor = userVote[msg.sender]; if(votingFor != 0) { _updateVotingSubDiff(msg.sender, votingFor, _shares); } emit Withdraw(votingCreditAddress, currentAmount, 0, _shares); token.safeTransfer(votingCreditAddress, currentAmount); IVoting(votingCreditAddress).addCredit(currentAmount, msg.sender); //in the votingCreditAddress regulate how much is credited, depending on where it's coming from (msg.sender) } /** * Allows the pools to be changed to new contracts * if migration Pool is set * anyone can be a "good Samaritan" * and transfer the stake of another user to the new pool */ function migrateStake(address _staker, uint256 _stakeID) public { require(migrationPool != address(0), "migration not activated"); require(_stakeID < userInfo[_staker].length, "invalid stake ID"); UserInfo storage user = userInfo[_staker][_stakeID]; require(user.shares > 0, "no balance"); uint256 currentAmount = (balanceOf().mul(user.shares)).div(totalShares); totalShares = totalShares.sub(user.shares); user.shares = 0; // equivalent to deleting the stake. Pools are no longer to be used, //setting user shares to 0 is sufficient IacPool(migrationPool).hopDeposit(currentAmount, _staker, user.lastDepositedTime, user.mandatoryTimeToServe); emit MigrateStake(msg.sender, currentAmount, user.shares, _staker); } /** * loop and migrate all user stakes * could run out of gas if too many stakes */ function migrateAllStakes(address _staker) external { UserInfo[] storage user = userInfo[_staker]; uint256 userStakes = user.length; for(uint256 i=0; i < userStakes; i++) { migrateStake(_staker, i); } } /** * Returns number of stakes for a user */ function getNrOfStakes(address _user) external view returns (uint256) { return userInfo[_user].length; } /** * Returns all shares for a user */ function getUserTotalShares(address _user) public view returns (uint256) { UserInfo[] storage _stake = userInfo[_user]; uint256 nrOfUserStakes = _stake.length; uint256 countShares = 0; for(uint256 i=0; i < nrOfUserStakes; i++) { countShares += _stake[i].shares; } return countShares; } /** * @notice Calculates the expected harvest reward from third party * @return Expected reward to collect in XVMC */ function calculateHarvestXVMCRewards() external view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); uint256 currentCallFee = amount.mul(callFee).div(10000); return currentCallFee; } /** * @return Returns total pending xvmc rewards */ function calculateTotalPendingXVMCRewards() external view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); return amount; } /** * @notice Calculates the price per share */ function getPricePerFullShare() external view returns (uint256) { return totalShares == 0 ? 1e18 : balanceOf().mul(1e18).div(totalShares); } /** * @notice returns number of shares for a certain stake of an user */ function getUserShares(address _wallet, uint256 _stakeID) public view returns (uint256) { return userInfo[_wallet][_stakeID].shares; } /** * @notice Calculates the total underlying tokens * @dev It includes tokens held by the contract and held in MasterChef */ function balanceOf() public view returns (uint256) { uint256 amount = IMasterChef(masterchef).pendingEgg(poolID, address(this)); return token.balanceOf(address(this)).add(amount); } //enables or disables ability to draw stake from another wallet(allowance required) function enableDisableStakeTransferFrom(bool _setting) external adminOnly { allowStakeTransferFrom = _setting; } /** * @notice Sets call fee * @dev Only callable by the contract admin. */ function setCallFee(uint256 _callFee) external adminOnly { callFee = _callFee; } /* * set trusted senders, other pools that we can receive from (that can hopDeposit) * guaranteed to be trusted (they rely lastDepositTime) */ function setTrustedSender(address _sender, bool _setting) external adminOnly { if(trustedSender[_sender] != _setting) { trustedSender[_sender] = _setting; _setting ? trustedSenderCount++ : trustedSenderCount--; emit TrustedSender(_sender, _setting); } } /** * set trusted pools, the smart contracts that we can send the tokens to without penalty * NOTICE: new pool must be set as trusted contract(to be able to draw balance without allowance) */ function setTrustedPool(address _pool, bool _setting) external adminOnly { if(trustedPool[_pool] != _setting) { trustedPool[_pool] = _setting; _setting ? trustedPoolCount++ : trustedPoolCount--; emit TrustedPool(_pool, _setting); } } /** * set address of new pool that we can migrate into * !!! NOTICE !!! * new pool must be set as trusted contract in the token contract by the governor(to be able to draw balance without allowance) */ function setMigrationPool(address _newPool) external adminOnly { migrationPool = _newPool; } /** * Enable or disable partial withdrawals from stakes */ function modifyPartialWithdrawals(bool _decision) external adminOnly { partialWithdrawals = _decision; } function modifyPartialTransfers(bool _decision) external adminOnly { partialTransfers = _decision; } function enableDisableStakeTransfer(bool _setting) external adminOnly { allowStakeTransfer = _setting; } /** * @notice Withdraws from MasterChef to Vault without caring about rewards. * @dev EMERGENCY ONLY. Only callable by the contract admin. */ function emergencyWithdraw() external adminOnly { IMasterChef(masterchef).emergencyWithdraw(poolID); token.safeTransfer(admin, token.balanceOf(address(this))); } /* * Unlikely, but Masterchef can be changed if needed to be used without changing pools * masterchef = IMasterChef(token.owner()); * Must stop earning first(withdraw tokens from old chef) */ function setMasterChefAddress(IMasterChef _masterchef, uint256 _newPoolID) external adminOnly { masterchef = _masterchef; poolID = _newPoolID; //in case pool ID changes uint256 _dummyAllowance = IERC20(dummyToken).allowance(address(this), address(masterchef)); if(_dummyAllowance == 0) { IERC20(dummyToken).safeApprove(address(_masterchef), type(uint256).max); } } /** * When contract is launched, dummyToken shall be deposited to start earning rewards */ function startEarning() external adminOnly { IMasterChef(masterchef).deposit(poolID, dummyToken.balanceOf(address(this))); } /** * Dummy token can be withdrawn if ever needed(allows for flexibility) */ function stopEarning(uint256 _withdrawAmount) external adminOnly { if(_withdrawAmount == 0) { IMasterChef(masterchef).withdraw(poolID, dummyToken.balanceOf(address(masterchef))); } else { IMasterChef(masterchef).withdraw(poolID, _withdrawAmount); } } /** * Withdraws dummyToken to owner(who can burn it if needed) */ function withdrawDummy(uint256 _amount) external adminOnly { if(_amount == 0) { dummyToken.safeTransfer(admin, dummyToken.balanceOf(address(this))); } else { dummyToken.safeTransfer(admin, _amount); } } function allowTxOrigin(bool _setting) external adminOnly { allowOrigin = _setting; } //sets minimum amount(for sending gift, transferring to another wallet,...) //if setting is enabled, minimumGift can be auto-updated to costToVote from governor by anybody function setMinimumGiftDeposit(uint256 _amount, bool _setting) external adminOnly { minimumGift = _amount; updateMinGiftGovernor = _setting; } function regulateVotingCredit(address _newAddress) external adminOnly { votingCreditAddress = _newAddress; } /** * option to withdraw wrongfully sent tokens(but requires change of the governing contract to do so) * If you send wrong tokens to the contract address, consider them lost. Though there is possibility of recovery */ function withdrawStuckTokens(address _tokenAddress) external adminOnly { require(_tokenAddress != address(token), "wrong token"); require(_tokenAddress != address(dummyToken), "wrong token"); IERC20(_tokenAddress).safeTransfer(IGovernance(admin).treasuryWallet(), IERC20(_tokenAddress).balanceOf(address(this))); } //Note: allowanceID (and not ID of the stake!) function _revokeStakeAllowance(address owner, uint256 allowanceID) private { StakeTransfer[] storage allowances = _stakeAllowances[owner][msg.sender]; uint256 lastAllowanceID = allowances.length.sub(1); if(allowanceID != lastAllowanceID) { allowances[allowanceID] = allowances[lastAllowanceID]; } allowances.pop(); emit StakeAllowanceRevoke(owner, msg.sender, allowanceID); } /** * updates votes(whenever there is transfer of funds) */ function _updateVotingAddDiff(address voter, uint256 proposalID, uint256 diff) private { totalVotesForID[proposalID] = totalVotesForID[proposalID].add(diff); emit AddVotes(voter, proposalID, diff); } function _updateVotingSubDiff(address voter, uint256 proposalID, uint256 diff) private { totalVotesForID[proposalID] = totalVotesForID[proposalID].sub(diff); emit RemoveVotes(voter, proposalID, diff); } /** * removes the stake */ function _removeStake(address _staker, uint256 _stakeID) private { UserInfo[] storage stakes = userInfo[_staker]; uint256 lastStakeID = stakes.length - 1; if(_stakeID != lastStakeID) { stakes[_stakeID] = stakes[lastStakeID]; } stakes.pop(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"contract IERC20","name":"_dummyToken","type":"address"},{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"uint256","name":"_poolID","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"AddAndExtendStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"AddVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDepositedTime","type":"uint256"}],"name":"GiftDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"HopDeposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"XVMCamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"newPool","type":"address"}],"name":"HopPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"goodSamaritan","type":"address"},{"indexed":false,"internalType":"uint256","name":"XVMCamount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"}],"name":"MigrateStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"voter","type":"address"},{"indexed":false,"internalType":"uint256","name":"proposalID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"change","type":"uint256"}],"name":"RemoveVotes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userDelegating","type":"address"},{"indexed":false,"internalType":"address","name":"delegatee","type":"address"}],"name":"SetDelegate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"StakeAllowanceRevoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"allowanceID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shareAllowance","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lastDeposit","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mandatoryTime","type":"uint256"}],"name":"StakeApproval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeID","type":"uint256"}],"name":"TransferStake","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_from","type":"address"},{"indexed":false,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_stakeID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_allowanceID","type":"uint256"}],"name":"TransferStakeFrom","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":false,"internalType":"bool","name":"setting","type":"bool"}],"name":"TrustedSender","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"penalty","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_recipientAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"_lockUpTokensInSeconds","type":"uint256"}],"name":"addAndExtendStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"admin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowOrigin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowStakeTransferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"allowTxOrigin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateHarvestXVMCRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateTotalPendingXVMCRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"callFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"votingAddress","type":"address[]"},{"internalType":"uint256","name":"proposalID","type":"uint256"}],"name":"delegateeVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dummyToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_setting","type":"bool"}],"name":"enableDisableStakeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getNrOfStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPricePerFullShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"getUserShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getUserTotalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_toAddress","type":"address"},{"internalType":"uint256","name":"_minToServeInSecs","type":"uint256"}],"name":"giftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"giveStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"harvest","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"},{"internalType":"uint256","name":"previousLastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"_mandatoryTime","type":"uint256"}],"name":"hopDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_poolAddress","type":"address"}],"name":"hopStakeToAnotherPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"masterchef","outputs":[{"internalType":"contract IMasterChef","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"migrateAllStakes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"migrateStake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrationPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumGift","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_decision","type":"bool"}],"name":"modifyPartialWithdrawals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"nrOfstakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"partialWithdrawals","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"regulateVotingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"revokeStakeAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_callFee","type":"uint256"}],"name":"setCallFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IMasterChef","name":"_masterchef","type":"address"},{"internalType":"uint256","name":"_newPoolID","type":"uint256"}],"name":"setMasterChefAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newPool","type":"address"}],"name":"setMigrationPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setMinimumGiftDeposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pool","type":"address"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"bool","name":"_setting","type":"bool"}],"name":"setTrustedSender","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowanceID","type":"uint256"}],"name":"stakeAllowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_poolInto","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"stakeRollover","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_withdrawAmount","type":"uint256"}],"name":"stopEarning","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"totalVotesForID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"uint256","name":"allowanceID","type":"uint256"},{"internalType":"address","name":"_to","type":"address"}],"name":"transferStakeFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"},{"internalType":"address","name":"_recipientAddress","type":"address"}],"name":"transferStakeToAnotherWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedPool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedPoolCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"trustedSender","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"trustedSenderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinGiftGovernor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"updateMinimumGift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userDelegate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"lastDepositedTime","type":"uint256"},{"internalType":"uint256","name":"xvmcAtLastUserAction","type":"uint256"},{"internalType":"uint256","name":"lastUserActionTime","type":"uint256"},{"internalType":"uint256","name":"mandatoryTimeToServe","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userVote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"proposalID","type":"uint256"}],"name":"voteForProposal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"votingCredit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"votingCreditAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_shares","type":"uint256"},{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeID","type":"uint256"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"withdrawStuckTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101206040527f6d0c966c8a09e354df9c48b446a474ce3343d91200000000000000000000000060a05262f1428060e05262093a806101005269d3c21bcecceda1000000600f5560108054600160ff1991821681179092556005601155601280546401000000006301000000620100009290941690941762ffff0019161763ff00000019169190911760ff60201b1916919091179055348015620000a257600080fd5b5060405162005ead38038062005ead833981810160405260c0811015620000c857600080fd5b508051602080830151604084015160608086015160808088015160a090980151600160008190556001600160601b031989861b81169093529386901b90911660c05282546001600160a01b038086166001600160a01b031992831617909455600b8054858516908316179055600c8054858b16921691909117905560098190559596939592949093929162000170919087169086906000199062004d766200017c821b17901c565b5050505050506200058f565b80158062000206575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015620001d657600080fd5b505afa158015620001eb573d6000803e3d6000fd5b505050506040513d60208110156200020257600080fd5b5051155b620002435760405162461bcd60e51b815260040180806020018281038252603681526020018062005e776036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b179091526200029b918591620002a016565b505050565b6060620002fc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200035c60201b62004e89179092919060201c565b8051909150156200029b578080602001905160208110156200031d57600080fd5b50516200029b5760405162461bcd60e51b815260040180806020018281038252602a81526020018062005e4d602a913960400191505060405180910390fd5b60606200036d848460008562000377565b90505b9392505050565b606082471015620003ba5760405162461bcd60e51b815260040180806020018281038252602681526020018062005e276026913960400191505060405180910390fd5b620003c585620004df565b62000417576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310620004585780518252601f19909201916020918201910162000437565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114620004bc576040519150601f19603f3d011682016040523d82523d6000602084013e620004c1565b606091505b509092509050620004d4828286620004e5565b979650505050505050565b3b151590565b60608315620004f657508162000370565b825115620005075782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156200055357818101518382015260200162000539565b50505050905090810190601f168015620005815780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b60805160601c60a05160601c60c05160601c60e051610100516157af6200067860003980610f3e5280610ff85280611e565280612e99525080610f635280610fc5528061101d5280611d915280611e7a5280611ece528061362d52806139a75280614c2a52508061132452806113a352806113e052806124a652806126b55280612a085280612a905280612f39528061449d52508061339b525080611e165280611f3c5280612028528061233852806125775280612b7b528061356152806137da5280613af65280614428528061491f5280614b335280614bb25280614d5452506157af6000f3fe608060405234801561001057600080fd5b50600436106104495760003560e01c806390321e1a11610241578063ca208adb1161013b578063ddd9d045116100c3578063e89bfdab11610087578063e89bfdab14610ca4578063f5ba1c8714610cac578063f851a44014610cd2578063fb1db27814610cda578063fc0c546a14610ce257610449565b8063ddd9d04514610c25578063ded6275e14610c51578063df10b4e614610c59578063e56d607d14610c61578063e5ea69ff14610c7e57610449565b8063d693f8341161010a578063d693f83414610b8f578063d6d3774b14610bb5578063d6fe340514610bd8578063d71a4bc214610bf7578063db2e21bc14610c1d57610449565b8063ca208adb14610af6578063ca5eb5e114610b24578063cb96372814610b4a578063cc7c7dec14610b7057610449565b8063b330fc53116101c9578063ba1797871161018d578063ba179787146109f6578063bbb224f014610a66578063bdcd9c8014610a6e578063be50baa914610a9a578063c721308f14610aee57610449565b8063b330fc5314610947578063b3f5f6551461096d578063b6b55f25146109a5578063b7cdbed3146109c2578063b949103b146109ee57610449565b8063a06db7dc11610210578063a06db7dc146108f5578063a36e40fc146108fd578063a56924bd14610905578063aaa9603a1461090d578063b31c710a1461093f57610449565b806390321e1a146108a9578063955afa6c146108b1578063958e2d31146108b95780639f6a9283146108d657610449565b80633b500bcb1161035257806364f5c072116102da578063800b2f341161029e578063800b2f34146107e95780638482b20214610815578063859f267f146108415780638d934485146108735780638ffdce691461087b57610449565b806364f5c072146107ac57806367479ec5146107b4578063722713f7146107bc57806377c7b8fc146107c45780637eb3f084146107cc57610449565b8063527cc2f111610321578063527cc2f1146106df57806352d816471461070b57806359a8fd981461072a57806361d027b314610750578063626718971461077457610449565b80633b500bcb146106545780633f6ba4151461068e578063441a3e70146106b45780634641257d146106d757610449565b806321ce919d116103d55780632cae2096116103a45780632cae2096146106065780632e8ba0391461060e578063341d609f14610616578063343d927e146106445780633a98ef391461064c57610449565b806321ce919d14610582578063221665e5146105d957806325c6ea1f146105e157806326465826146105e957610449565b8063159ad8cd1161041c578063159ad8cd146104e45780631718e21114610501578063174628d11461051b578063182c1da1146105555780631de8e5921461055d57610449565b8063045c6ce01461044e578063062d5ed41461046d5780630b799acf1461049f5780630cf57ace146104be575b600080fd5b61046b6004803603602081101561046457600080fd5b5035610cea565b005b61046b6004803603606081101561048357600080fd5b50803590602081013590604001356001600160a01b0316610da2565b61046b600480360360208110156104b557600080fd5b503515156111fd565b61046b600480360360208110156104d457600080fd5b50356001600160a01b031661126a565b61046b600480360360208110156104fa57600080fd5b50356112a7565b61050961140c565b60408051918252519081900360200190f35b6105416004803603602081101561053157600080fd5b50356001600160a01b0316611412565b604080519115158252519081900360200190f35b610541611427565b61046b6004803603604081101561057357600080fd5b50803590602001351515611430565b6105ae6004803603604081101561059857600080fd5b506001600160a01b038135169060200135611496565b6040805195865260208601949094528484019290925260608401526080830152519081900360a00190f35b61046b6114e1565b6105096115b7565b61046b600480360360208110156105ff57600080fd5b50356115bd565b61046b61160f565b61054161172f565b6105096004803603604081101561062c57600080fd5b506001600160a01b0381358116916020013516611738565b610509611765565b61050961176b565b6105416004803603608081101561066a57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516611771565b610541600480360360208110156106a457600080fd5b50356001600160a01b0316611b63565b61046b600480360360408110156106ca57600080fd5b5080359060200135611b78565b61046b612057565b61046b600480360360408110156106f557600080fd5b506001600160a01b0381351690602001356120c1565b61046b6004803603602081101561072157600080fd5b503515156121ce565b61046b6004803603602081101561074057600080fd5b50356001600160a01b0316612239565b6107586122a8565b604080516001600160a01b039092168252519081900360200190f35b61046b6004803603608081101561078a57600080fd5b508035906001600160a01b0360208201351690604081013590606001356122b7565b610541612493565b6107586124a4565b6105096124c8565b6105096125f6565b61046b600480360360208110156107e257600080fd5b5035612630565b61046b600480360360408110156107ff57600080fd5b506001600160a01b0381351690602001356127fe565b61046b6004803603604081101561082b57600080fd5b506001600160a01b038135169060200135612973565b61046b6004803603606081101561085757600080fd5b508035906001600160a01b036020820135169060400135612ab9565b610509612cd7565b61046b6004803603604081101561089157600080fd5b506001600160a01b0381351690602001351515612cdd565b610509612de1565b610758612de7565b61046b600480360360208110156108cf57600080fd5b5035612df6565b61046b600480360360208110156108ec57600080fd5b50351515612e2e565b610509612e97565b61046b612ebb565b610541612ff4565b61046b6004803603606081101561092357600080fd5b50803590602081013590604001356001600160a01b0316613002565b610758613399565b6107586004803603602081101561095d57600080fd5b50356001600160a01b03166133bd565b61046b6004803603608081101561098357600080fd5b506001600160a01b0381351690602081013590604081013590606001356133d8565b61046b600480360360208110156109bb57600080fd5b503561371d565b61046b600480360360408110156109d857600080fd5b506001600160a01b038135169060200135613921565b610541613d65565b61046b60048036036040811015610a0c57600080fd5b810190602081018135640100000000811115610a2757600080fd5b820183602082011115610a3957600080fd5b80359060200191846020830284011164010000000083111715610a5b57600080fd5b919350915035613d74565b610509613f0b565b61046b60048036036040811015610a8457600080fd5b506001600160a01b038135169060200135613f97565b610ad060048036036060811015610ab057600080fd5b506001600160a01b038135811691602081013590911690604001356141d1565b60408051938452602084019290925282820152519081900360600190f35b610541614237565b61046b60048036036040811015610b0c57600080fd5b506001600160a01b0381351690602001351515614247565b61046b60048036036020811015610b3a57600080fd5b50356001600160a01b031661434a565b61046b60048036036020811015610b6057600080fd5b50356001600160a01b03166143d9565b61046b60048036036020811015610b8657600080fd5b50351515614605565b61046b60048036036020811015610ba557600080fd5b50356001600160a01b031661466c565b61046b60048036036040811015610bcb57600080fd5b50803590602001356146db565b61046b60048036036020811015610bee57600080fd5b5035151561499b565b61050960048036036020811015610c0d57600080fd5b50356001600160a01b03166149fb565b61046b614a53565b61050960048036036040811015610c3b57600080fd5b506001600160a01b038135169060200135614bdb565b610758614c19565b610509614c28565b61050960048036036020811015610c7757600080fd5b5035614c4c565b61050960048036036020811015610c9457600080fd5b50356001600160a01b0316614c5e565b610509614c79565b61050960048036036020811015610cc257600080fd5b50356001600160a01b0316614d22565b610758614d34565b610758614d43565b610758614d52565b601254600090640100000000900460ff16610d0757503380610d0b565b5032805b506001600160a01b038116600090815260036020526040902054828114610d9d576000610d37836149fb565b90508015610d80578315610d755781610d5a57610d55838583614ea2565b610d70565b610d65838383614f17565b610d70838583614ea2565b610d80565b610d80838383614f17565b506001600160a01b03821660009081526003602052604090208390555b505050565b60008311610ded576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b336000908152600260205260409020548210610e41576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b336000908152600260205260408120805484908110610e5c57fe5b906000526020600020906005020190508060000154841115610eb3576040805162461bcd60e51b815260206004820152601f6024820152600080516020615694833981519152604482015290519081900360640190fd5b60125462010000900460ff16610f135780548414610f13576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b60018101546001600160a01b03831660009081526007602052604090205460ff1615610f9c57610f8d7f0000000000000000000000000000000000000000000000000000000000000000610f87837f0000000000000000000000000000000000000000000000000000000000000000614f8c565b90614f8c565b421115610f975750425b611095565b6001600160a01b03831660009081526006602052604090205460ff168015610fec5750610fe9817f0000000000000000000000000000000000000000000000000000000000000000614f8c565b42115b801561104457506110417f0000000000000000000000000000000000000000000000000000000000000000610f87837f0000000000000000000000000000000000000000000000000000000000000000614f8c565b42105b611095576040805162461bcd60e51b815260206004820152601f60248201527f63616e206f6e6c7920686f7020696e746f207072652d73657420506f6f6c7300604482015290519081900360640190fd5b60006110b5600a546110af886110a96124c8565b90614fe6565b9061503f565b83549091506110c490876150a6565b8355600a546110d390876150a6565b600a553360009081526003602052604090205480156110f7576110f7338289614f17565b60048085015460408051636267189760e01b8152928301859052336024840152604483018690526064830191909152516001600160a01b03871691636267189791608480830192600092919082900301818387803b15801561115857600080fd5b505af115801561116c573d6000803e3d6000fd5b505085541591506111a2905057611192600a546110af61118a6124c8565b875490614fe6565b60028501554260038501556111ac565b6111ac3387615103565b604080518381526020810189905281516001600160a01b0388169233927f2391574aca0f6cc92f9588562ee00a7c2d33f83d17d01d8fa177ba4423740f44929081900390910190a350505050505050565b600b546001600160a01b0316331461124a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601280549115156401000000000264ff0000000019909216919091179055565b6001600160a01b0381166000908152600260205260408120805490915b818110156112a1576112998482613f97565b600101611287565b50505050565b600b546001600160a01b031633146112f4576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b806113cf57600b54604080516370a0823160e01b815230600482015290516113ca926001600160a01b03908116927f0000000000000000000000000000000000000000000000000000000000000000909116916370a0823191602480820192602092909190829003018186803b15801561136d57600080fd5b505afa158015611381573d6000803e3d6000fd5b505050506040513d602081101561139757600080fd5b50516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906151d5565b611409565b600b54611409906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116836151d5565b50565b600f5481565b60076020526000908152604090205460ff1681565b60125460ff1681565b600b546001600160a01b0316331461147d576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600f919091556010805460ff1916911515919091179055565b600260205281600052604060002081815481106114af57fe5b600091825260209091206005909102018054600182015460028301546003840154600490940154929550909350919085565b60105460ff16611538576040805162461bcd60e51b815260206004820152601960248201527f6175746f6d61746963207570646174652064697361626c656400000000000000604482015290519081900360640190fd5b600b60009054906101000a90046001600160a01b03166001600160a01b03166351a41dec6040518163ffffffff1660e01b815260040160206040518083038186803b15801561158657600080fd5b505afa15801561159a573d6000803e3d6000fd5b505050506040513d60208110156115b057600080fd5b5051600f55565b60145481565b600b546001600160a01b0316331461160a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601155565b600160009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561165d57600080fd5b505afa158015611671573d6000803e3d6000fd5b505050506040513d602081101561168757600080fd5b5051600b80546001600160a01b0319166001600160a01b0392831617905560015460408051630824ea6b60e31b8152905191909216916341275358916004808301926020929190829003018186803b1580156116e257600080fd5b505afa1580156116f6573d6000803e3d6000fd5b505050506040513d602081101561170c57600080fd5b5051600c80546001600160a01b0319166001600160a01b03909216919091179055565b60105460ff1681565b6001600160a01b038083166000908152600860209081526040808320938516835292905220545b92915050565b60135481565b600a5481565b601254600090610100900460ff166117ba5760405162461bcd60e51b81526004018080602001828103825260248152602001806157566024913960400191505060405180910390fd5b816001600160a01b0316856001600160a01b0316141561181a576040805162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b604482015290519081900360640190fd5b6001600160a01b0385166000908152600260205260409020548410611877576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b6001600160a01b038516600090815260026020526040812080548690811061189b57fe5b9060005260206000209060050201905060008060006118bb8933896141d1565b92509250925083600001548314611919576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b83600101548214611971576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b836004015481146119c9576040805162461bcd60e51b815260206004820152601c60248201527f696e636f7272656374207374616b65206f7220616c6c6f77616e636500000000604482015290519081900360640190fd5b6001600160a01b03891660009081526003602052604090205480156119f3576119f38a8286614f17565b506001600160a01b0386166000908152600360205260409020548015611a1e57611a1e878286614ea2565b611a288a8a615103565b611a328a89615227565b60026000886001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405280868152602001858152602001611a86600a546110af611a7f6124c8565b8a90614fe6565b8152602001428152602001848152509080600181540180825580915050600190039060005260206000209060050201600090919091909150600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015550507f017cb7d605aa3dcd304a9eb2a4df6075576ccc4a5dc2fe0b518c558e8f75338d8a888b8b60405180856001600160a01b03168152602001846001600160a01b0316815260200183815260200182815260200194505050505060405180910390a15060019998505050505050505050565b60066020526000908152604090205460ff1681565b336000908152600260205260409020548110611bce576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b336000908152600260205260408120805483908110611be957fe5b9060005260206000209060050201905060008311611c44576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b8054831115611c88576040805162461bcd60e51b815260206004820152601f6024820152600080516020615694833981519152604482015290519081900360640190fd5b60048101546001820154611c9b91614f8c565b4211611cee576040805162461bcd60e51b815260206004820152601960248201527f6d757374207365727665206d616e6461746f72792074696d6500000000000000604482015290519081900360640190fd5b60125462010000900460ff16611d4e5780548314611d4e576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b6000611d62600a546110af866110a96124c8565b8254909150611d7190856150a6565b8255600a54611d8090856150a6565b600a556001820154600090611db5907f0000000000000000000000000000000000000000000000000000000000000000614f8c565b421015611e51576000611df0611de7600a6110af60e76110a9620151808a60010154420361503f90919063ffffffff16565b611068906150a6565b9050611e026127106110af8584614fe6565b600c54909250611e3f906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d5565b611e4983836150a6565b925050611f73565b611eac7f0000000000000000000000000000000000000000000000000000000000000000610f877f00000000000000000000000000000000000000000000000000000000000000008660010154614f8c90919063ffffffff16565b421115611f73576000611f07600a6110af60e76110a9620151806110af611f007f00000000000000000000000000000000000000000000000000000000000000008c60010154614f8c90919063ffffffff16565b42906150a6565b9050611068811115611f1857506110685b611f286127106110af8584614fe6565b600c54909250611f65906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d5565b611f6f83836150a6565b9250505b825415611fad57611f9d600a546110af611f9585611f8f6124c8565b906150a6565b865490614fe6565b6002840155426003840155611fb7565b611fb73385615103565b336000908152600360205260409020548015611fd857611fd8338288614f17565b6040805184815260208101849052808201889052905133917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca94919081900360600190a261204f6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633856151d5565b505050505050565b60015460095460408051630441a3e760e41b8152600481019290925260006024830181905290516001600160a01b039093169263441a3e7092604480820193929182900301818387803b1580156120ad57600080fd5b505af11580156112a1573d6000803e3d6000fd5b3360009081526008602090815260408083206001600160a01b0386168452909152812080549091906120f49060016150a6565b905080831461214c5781818154811061210957fe5b906000526020600020906003020182848154811061212357fe5b600091825260209091208254600390920201908155600180830154908201556002918201549101555b8180548061215657fe5b6000828152602080822060036000199094019384020182815560018101839055600201919091559155604080513381526001600160a01b03871692810192909252818101859052517f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e9181900360600190a150505050565b600b546001600160a01b0316331461221b576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6012805491151563010000000263ff00000019909216919091179055565b600b546001600160a01b03163314612286576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600c546001600160a01b031681565b3360009081526006602052604090205460ff16806122e457503360009081526007602052604090205460ff165b61231f5760405162461bcd60e51b81526004018080602001828103825260218152602001806156b46021913960400191505060405180910390fd5b60006123296124c8565b90506123606001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333088615334565b6000600a5460001461238c57612385826110af600a5489614fe690919063ffffffff16565b905061238f565b50845b600a5461239c9082614f8c565b600a556001600160a01b0385166000818152600260208181526040808420815160a0810183528781528084018b81528184018e81524260608401908152608084018d8152855460018181018855968b52888b2095516005909102909501948555925194840194909455519582019590955590516003808301919091559351600490910155938352522054801561243757612437868284614ea2565b60408051888152602081018490528082018790526060810186905290516001600160a01b038816917fb66a80ae2ebf4737952b9c2b57a9d34ef56806ab937f481b75197ae991d81afb919081900360800190a250505050505050565b601254640100000000900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b15801561252257600080fd5b505afa158015612536573d6000803e3d6000fd5b505050506040513d602081101561254c57600080fd5b5051604080516370a0823160e01b815230600482015290519192506125f09183916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b1580156125be57600080fd5b505afa1580156125d2573d6000803e3d6000fd5b505050506040513d60208110156125e857600080fd5b505190614f8c565b91505090565b6000600a546000146126215761261c600a546110af670de0b6b3a76400006110a96124c8565b61262b565b670de0b6b3a76400005b905090565b600b546001600160a01b0316331461267d576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b8061278c57600154600954604080516370a0823160e01b81526001600160a01b03938416600482018190529151919363441a3e7093927f0000000000000000000000000000000000000000000000000000000000000000909116916370a08231916024808301926020929190829003018186803b1580156126fd57600080fd5b505afa158015612711573d6000803e3d6000fd5b505050506040513d602081101561272757600080fd5b5051604080516001600160e01b031960e086901b1681526004810193909352602483019190915251604480830192600092919082900301818387803b15801561276f57600080fd5b505af1158015612783573d6000803e3d6000fd5b50505050611409565b60015460095460408051630441a3e760e41b8152600481019290925260248201849052516001600160a01b039092169163441a3e709160448082019260009290919082900301818387803b1580156127e357600080fd5b505af11580156127f7573d6000803e3d6000fd5b5050505050565b33600090815260026020526040812080548390811061281957fe5b90600052602060002090600502019050600f54612845600a546110af61283d6124c8565b855490614fe6565b1015612898576040805162461bcd60e51b815260206004820152601760248201527f62656c6f77206d696e696d756d207468726573686f6c64000000000000000000604482015290519081900360640190fd5b3360008181526008602090815260408083206001600160a01b0388168085528184528285208054928552835160608082018652895482526001808b018054848a0190815260048d018054868b01908152848a018855968c529a8a90209451600389029095019485555191840191909155925160029092019190915588549154965485519889529588019290925286840183905290860152608085019390935260a08401919091525190917f13356b03fc409456fbfbc8b432cb402b7841b3114d1d159625eb0f3d4e3a4681919081900360c00190a150505050565b600b546001600160a01b031633146129c0576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b038481169190911791829055600983905560408051636eb1769f60e11b81523060048201529282166024840152516000927f00000000000000000000000000000000000000000000000000000000000000009092169163dd62ed3e916044808301926020929190829003018186803b158015612a5057600080fd5b505afa158015612a64573d6000803e3d6000fd5b505050506040513d6020811015612a7a57600080fd5b5051905080610d9d57610d9d6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001684600019614d76565b60026000541415612b11576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055600f54831015612b62576040805162461bcd60e51b815260206004820152601260248201527110995b1bddc8135a5b9a5b5d5b4811da599d60721b604482015290519081900360640190fd5b6000612b6c6124c8565b9050612ba36001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087615334565b6000600a54600014612bcf57612bc8826110af600a5488614fe690919063ffffffff16565b9050612bd2565b50835b600a54612bdf9082614f8c565b600a556001600160a01b0384166000818152600260208181526040808420815160a081018352878152428185018181528285018e815260608401928352608084018d8152855460018181018855968b52888b2095516005909102909501948555915194840194909455925195820195909555935160038086019190915590516004909401939093559383525220548015612c7e57612c7e858284614ea2565b6040805187815260208101849052428183015290516001600160a01b0387169133917f190f4e47df17911728b041870d3cd75008c166bb9d8cde694aaa68f73ad415829181900360600190a35050600160005550505050565b60095481565b600b546001600160a01b03163314612d2a576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6001600160a01b03821660009081526007602052604090205460ff16151581151514612ddd576001600160a01b0382166000908152600760205260409020805460ff191682151517905580612d8a57601480546000198101909155612d96565b60148054600181019091555b50604080516001600160a01b0384168152821515602082015281517f808293acec1c44217eccd857d5abb88ff31456d23bf3a000d2f5aee5f92f4c19929181900390910190a15b5050565b60115481565b600d546001600160a01b031681565b3360009081526002602052604090208054611409919083908110612e1657fe5b90600052602060002090600502016000015482611b78565b600b546001600160a01b03163314612e7b576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60128054911515620100000262ff000019909216919091179055565b7f000000000000000000000000000000000000000000000000000000000000000081565b600b546001600160a01b03163314612f08576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600154600954604080516370a0823160e01b815230600482015290516001600160a01b039384169363e2bbb15893927f0000000000000000000000000000000000000000000000000000000000000000909116916370a0823191602480820192602092909190829003018186803b158015612f8257600080fd5b505afa158015612f96573d6000803e3d6000fd5b505050506040513d6020811015612fac57600080fd5b5051604080516001600160e01b031960e086901b1681526004810193909352602483019190915251604480830192600092919082900301818387803b1580156120ad57600080fd5b601254610100900460ff1681565b60125460ff1661304e576040805162461bcd60e51b81526020600482015260126024820152711d1c985b9cd9995c9cc8191a5cd8589b195960721b604482015290519081900360640190fd5b6001600160a01b0381163314156130a5576040805162461bcd60e51b815260206004820152601660248201527531b0b713ba103a3930b739b332b9103a379039b2b63360511b604482015290519081900360640190fd5b3360009081526002602052604090205482106130f9576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c81cdd185ad948125160921b604482015290519081900360640190fd5b33600090815260026020526040812080548490811061311457fe5b90600052602060002090600502019050600061313e600a546110af6131376124c8565b8890614fe6565b9050600f54811015613197576040805162461bcd60e51b815260206004820152601760248201527f42656c6f77206d696e696d756d207468726573686f6c64000000000000000000604482015290519081900360640190fd5b81548511156131db576040805162461bcd60e51b815260206004820152601f6024820152600080516020615694833981519152604482015290519081900360640190fd5b6012546301000000900460ff1661323c578154851461323c576040805162461bcd60e51b81526020600482015260186024820152776d757374207472616e736665722066756c6c207374616b6560401b604482015290519081900360640190fd5b815461324890866150a6565b825533600090815260036020526040902054801561326b5761326b338288614f17565b506001600160a01b038316600090815260036020526040902054801561329657613296848288614ea2565b6001600160a01b0384166000908152600260208181526040808420815160a0810183528b81526001808a015482860190815293820189815242606084019081526004808d01546080860190815286548086018855968b5297909920935160059095029093019384559351908301559151938101939093555160038301555191015582541561333f5761332f600a546110af611f956124c8565b6002840155426003840155613349565b6133493386615103565b604080518781526020810187905281516001600160a01b0387169233927ff3f8af030ee2cfc3c3c4ea260e6bcdd578eb1558b6eb3d79f7d0617ddbdc5b78929081900390910190a3505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6005602052600090815260409020546001600160a01b031681565b60026000541415613430576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026000558261347c576040805162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b604482015290519081900360640190fd5b6001600160a01b03841660009081526002602052604090205482106134d9576040805162461bcd60e51b815260206004820152600e60248201526d1ddc9bdb99c814dd185ad948125160921b604482015290519081900360640190fd5b600b546001600160a01b03163314613548576001600160a01b0384163314613548576040805162461bcd60e51b815260206004820152601e60248201527f63616e206f6e6c7920657874656e6420796f7572206f776e207374616b650000604482015290519081900360640190fd5b60006135526124c8565b90506135896001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333087615334565b6000600a546000146135b5576135ae826110af600a5488614fe690919063ffffffff16565b90506135b8565b50835b6001600160a01b03861660009081526002602052604081208054869081106135dc57fe5b90600052602060002090600502019050613603828260000154614f8c90919063ffffffff16565b8155600a546136129083614f8c565b600a55600481015484118061365457506001810154613651907f0000000000000000000000000000000000000000000000000000000000000000614f8c565b42115b1561366157600481018490555b61367a600a546110af6136726124c8565b845490614fe6565b600282015542600380830182905560018301919091556001600160a01b0388166000908152602091909152604090205480156136bb576136bb888285614ea2565b604080518881526020810188905280820185905242606082015290516001600160a01b038a169133917f7f65dfb94bab62e0708845150044cf7ad9c77fbfe6ba9e3c8c1f210e15aa953d9181900360800190a350506001600055505050505050565b60026000541415613775576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600055806137c1576040805162461bcd60e51b8152602060048201526012602482015271139bdd1a1a5b99c81d1bc819195c1bdcda5d60721b604482015290519081900360640190fd5b60006137cb6124c8565b90506138026001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085615334565b6000600a5460001461382e57613827826110af600a5486614fe690919063ffffffff16565b9050613831565b50815b600a5461383e9082614f8c565b600a55336000818152600260208181526040808420815160a081018352878152428185018181528285018c81526060840192835260808401898152855460018181018855968b52888b20955160059091029095019485559151948401949094559251958201959095559351600380860191909155905160049094019390935593835252205480156138d4576138d4338284614ea2565b60408051858152602081018490524281830152905133917f36af321ec8d3c75236829c5317affd40ddb308863a1236d2d277a4025cccee1e919081900360600190a2505060016000555050565b336000908152600260205260409020548110613977576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b33600090815260026020526040812080548390811061399257fe5b906000526020600020906005020190506139d97f00000000000000000000000000000000000000000000000000000000000000008260010154614f8c90919063ffffffff16565b4211613a23576040805162461bcd60e51b81526020600482015260146024820152737374616b65206e6f7420796574206d617475726560601b604482015290519081900360640190fd5b6000613a3b600a546110af84600001546110a96124c8565b600b546040805163ded6e1c960e01b81526001600160a01b0388811660048301529151939450600093613acc93612710936110af9391169163ded6e1c991602480820192602092909190829003018186803b158015613a9957600080fd5b505afa158015613aad573d6000803e3d6000fd5b505050506040513d6020811015613ac357600080fd5b50518590614fe6565b600b54604080516370a0823160e01b81526001600160a01b039283166004820152905192935083927f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191602480820192602092909190829003018186803b158015613b3f57600080fd5b505afa158015613b53573d6000803e3d6000fd5b505050506040513d6020811015613b6957600080fd5b50511015613ba85760405162461bcd60e51b815260040180806020018281038252602c815260200180615642602c913960400191505060405180910390fd5b6001600160a01b038516301415613c3857600b546040805163e5f59bc160e01b81523360048201526001600160a01b03888116602483015260448201859052606482018890529151919092169163e5f59bc191608480830192600092919082900301818387803b158015613c1b57600080fd5b505af1158015613c2f573d6000803e3d6000fd5b505050506127f7565b8254613c45908587610da2565b600b60009054906101000a90046001600160a01b03166001600160a01b031663e5f59bc133878460018a6001600160a01b031663e5ea69ff336040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b158015613cbb57600080fd5b505afa158015613ccf573d6000803e3d6000fd5b505050506040513d6020811015613ce557600080fd5b5051604080516001600160e01b031960e089901b1681526001600160a01b0396871660048201529490951660248501526044840192909252900360648201529051608480830192600092919082900301818387803b158015613d4657600080fd5b505af1158015613d5a573d6000803e3d6000fd5b505050505050505050565b60125462010000900460ff1681565b60005b828110156112a1573360056000868685818110613d9057fe5b6001600160a01b0360209182029390930135831684528301939093526040909101600020541691909114159050613f0357600060036000868685818110613dd357fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b03168152602001908152602001600020549050808314613f01576000613e33868685818110613e1e57fe5b905060200201356001600160a01b03166149fb565b90508015613eba578315613eab5781613e7157613e6c868685818110613e5557fe5b905060200201356001600160a01b03168583614ea2565b613ea6565b613e97868685818110613e8057fe5b905060200201356001600160a01b03168383614f17565b613ea6868685818110613e5557fe5b613eba565b613eba868685818110613e8057fe5b8360036000888887818110613ecb57fe5b905060200201356001600160a01b03166001600160a01b03166001600160a01b0316815260200190815260200160002081905550505b505b600101613d77565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b158015613f6557600080fd5b505afa158015613f79573d6000803e3d6000fd5b505050506040513d6020811015613f8f57600080fd5b505191505090565b600d546001600160a01b0316613ff4576040805162461bcd60e51b815260206004820152601760248201527f6d6967726174696f6e206e6f7420616374697661746564000000000000000000604482015290519081900360640190fd5b6001600160a01b0382166000908152600260205260409020548110614053576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b6001600160a01b038216600090815260026020526040812080548390811061407757fe5b9060005260206000209060050201905060008160000154116140cd576040805162461bcd60e51b815260206004820152600a6024820152696e6f2062616c616e636560b01b604482015290519081900360640190fd5b60006140e5600a546110af84600001546110a96124c8565b8254600a549192506140f791906150a6565b600a556000808355600d54600184015460048086015460408051636267189760e01b81529283018790526001600160a01b038a81166024850152604484019490945260648301919091525191909216926362671897926084808201939182900301818387803b15801561416957600080fd5b505af115801561417d573d6000803e3d6000fd5b5050835460408051858152602081019290925280516001600160a01b03891694503393507fe28c7cce19d5f22ab16a04ca1bb768f7533bf719280b5e40718b41c2641ac3099281900390910190a350505050565b6001600160a01b03808416600090815260086020908152604080832093861683529290529081208054829182918291908690811061420b57fe5b600091825260209091206003909102018054600182015460029092015490999198509650945050505050565b6012546301000000900460ff1681565b600b546001600160a01b03163314614294576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6001600160a01b03821660009081526006602052604090205460ff16151581151514612ddd576001600160a01b0382166000908152600660205260409020805460ff1916821515179055806142f457601380546000198101909155614300565b60138054600181019091555b50604080516001600160a01b0384168152821515602082015281517f68e0e16e4195f1bb5436073ae329e02686b513fd39cd623585b36d74785b21c1929181900390910190a15050565b601254600090640100000000900460ff166143675750338061436b565b5032805b506001600160a01b0381811660008181526005602090815260409182902080546001600160a01b0319169487169485179055815192835282019290925281517fbeebfeebc9d1af8057ca45af36b2171fea34cb5b251e394f0bc5fcabde119d7f929181900390910190a15050565b600b546001600160a01b03163314614426576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316141561449b576040805162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b03161415614510576040805162461bcd60e51b815260206004820152600b60248201526a3bb937b733903a37b5b2b760a91b604482015290519081900360640190fd5b600b5460408051634626402b60e01b81529051611409926001600160a01b031691634626402b916004808301926020929190829003018186803b15801561455657600080fd5b505afa15801561456a573d6000803e3d6000fd5b505050506040513d602081101561458057600080fd5b5051604080516370a0823160e01b815230600482015290516001600160a01b038516916370a08231916024808301926020929190829003018186803b1580156145c857600080fd5b505afa1580156145dc573d6000803e3d6000fd5b505050506040513d60208110156145f257600080fd5b50516001600160a01b03841691906151d5565b600b546001600160a01b03163314614652576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b601280549115156101000261ff0019909216919091179055565b600b546001600160a01b031633146146b9576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b600d80546001600160a01b0319166001600160a01b0392909216919091179055565b600e546001600160a01b0316614723576040805162461bcd60e51b8152602060048201526008602482015267191a5cd8589b195960c21b604482015290519081900360640190fd5b336000908152600260205260409020548110614779576040805162461bcd60e51b815260206004820152601060248201526f1a5b9d985b1a59081cdd185ad948125160821b604482015290519081900360640190fd5b33600090815260026020526040812080548390811061479457fe5b90600052602060002090600502019050600083116147ef576040805162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b604482015290519081900360640190fd5b8054831115614833576040805162461bcd60e51b815260206004820152601f6024820152600080516020615694833981519152604482015290519081900360640190fd5b6000614847600a546110af866110a96124c8565b825490915061485690856150a6565b8255600a5461486590856150a6565b600a5581541561489457614884600a546110af61283d84611f8f6124c8565b600283015542600383015561489e565b61489e3384615103565b3360009081526003602052604090205480156148bf576148bf338287614f17565b600e54604080518481526000602082015280820188905290516001600160a01b03909216917f02f25270a4d87bea75db541cdfe559334a275b4a233520ed6c0a2429667cca949181900360600190a2600e54614948906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169116846151d5565b600e546040805163364c781560e01b81526004810185905233602482015290516001600160a01b039092169163364c78159160448082019260009290919082900301818387803b158015613d4657600080fd5b600b546001600160a01b031633146149e8576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b6012805460ff1916911515919091179055565b6001600160a01b0381166000908152600260205260408120805482805b82811015614a4a57838181548110614a2c57fe5b60009182526020909120600590910201549190910190600101614a18565b50949350505050565b600b546001600160a01b03163314614aa0576040805162461bcd60e51b815260206004820152600b60248201526a61646d696e3a207775743f60a81b604482015290519081900360640190fd5b60015460095460408051632989754760e11b81526004810192909252516001600160a01b0390921691635312ea8e9160248082019260009290919082900301818387803b158015614af057600080fd5b505af1158015614b04573d6000803e3d6000fd5b5050600b54604080516370a0823160e01b81523060048201529051614bd994506001600160a01b0392831693507f0000000000000000000000000000000000000000000000000000000000000000909216916370a0823191602480820192602092909190829003018186803b158015614b7c57600080fd5b505afa158015614b90573d6000803e3d6000fd5b505050506040513d6020811015614ba657600080fd5b50516001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001691906151d5565b565b6001600160a01b0382166000908152600260205260408120805483908110614bff57fe5b906000526020600020906005020160000154905092915050565b600e546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b60046020526000908152604090205481565b6001600160a01b031660009081526002602052604090205490565b6001546009546040805163f456426f60e01b815260048101929092523060248301525160009283926001600160a01b039091169163f456426f91604480820192602092909190829003018186803b158015614cd357600080fd5b505afa158015614ce7573d6000803e3d6000fd5b505050506040513d6020811015614cfd57600080fd5b5051601154909150600090614d1b90612710906110af908590614fe6565b9250505090565b60036020526000908152604090205481565b600b546001600160a01b031681565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b801580614dfc575060408051636eb1769f60e11b81523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015614dce57600080fd5b505afa158015614de2573d6000803e3d6000fd5b505050506040513d6020811015614df857600080fd5b5051155b614e375760405162461bcd60e51b81526004018080602001828103825260368152602001806157206036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052610d9d90849061538a565b6060614e98848460008561543b565b90505b9392505050565b600082815260046020526040902054614ebb9082614f8c565b60008381526004602090815260409182902092909255805184815291820183905280516001600160a01b038616927fdb8549181d0331885cbb0e0d1e36bdd89e38e53990069f6f07a4090a15f74e5d92908290030190a2505050565b600082815260046020526040902054614f3090826150a6565b60008381526004602090815260409182902092909255805184815291820183905280516001600160a01b038616927f65b0f2fb4228364e2ac61c432687ae942c732095fc217265116bec6cc441683492908290030190a2505050565b600082820183811015614e9b576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b600082614ff55750600061175f565b8282028284828161500257fe5b0414614e9b5760405162461bcd60e51b81526004018080602001828103825260218152602001806156d56021913960400191505060405180910390fd5b6000808211615095576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b81838161509e57fe5b049392505050565b6000828211156150fd576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b6001600160a01b03821660009081526002602052604090208054600019018281146151925781818154811061513457fe5b906000526020600020906005020182848154811061514e57fe5b906000526020600020906005020160008201548160000155600182015481600101556002820154816002015560038201548160030155600482015481600401559050505b8180548061519c57fe5b60008281526020812060056000199093019283020181815560018101829055600281018290556003810182905560040155905550505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d9d90849061538a565b6001600160a01b03821660009081526008602090815260408083203384529091528120805490919061525a9060016150a6565b90508083146152b25781818154811061526f57fe5b906000526020600020906003020182848154811061528957fe5b600091825260209091208254600390920201908155600180830154908201556002918201549101555b818054806152bc57fe5b6000828152602080822060036000199094019384020182815560018101839055600201919091559155604080516001600160a01b03871681523392810192909252818101859052517f29fbfeb988fb99326ac41d70606334081c6be7e8518f6caa5b7b1bcbe7872a1e9181900360600190a150505050565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b0316630c3023b960e01b1790526112a19085905b60606153df826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614e899092919063ffffffff16565b805190915015610d9d578080602001905160208110156153fe57600080fd5b5051610d9d5760405162461bcd60e51b815260040180806020018281038252602a8152602001806156f6602a913960400191505060405180910390fd5b60608247101561547c5760405162461bcd60e51b815260040180806020018281038252602681526020018061566e6026913960400191505060405180910390fd5b61548585615597565b6154d6576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106155155780518252601f1990920191602091820191016154f6565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615577576040519150601f19603f3d011682016040523d82523d6000602084013e61557c565b606091505b509150915061558c82828661559d565b979650505050505050565b3b151590565b606083156155ac575081614e9b565b8251156155bc5782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156156065781810151838201526020016155ee565b50505050905090810190601f1680156156335780820380516001836020036101000a031916815260200191505b509250505060405180910390fdfe676f7665726e6f72207265736572766573206172652063757272656e746c7920696e73756666696369656e74416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c576974686472617720616d6f756e7420657863656564732062616c616e6365006f6e6c7920747275737465642073656e64657273286f7468657220706f6f6c7329536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e63657468697264207061727479207374616b65207472616e73666572732064697361626c6564a2646970667358221220349d5b5ed5e1791554df8eb97ac325151fda46713ad6351ad93c0f79da9bc18664736f6c634300060c0033416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c5361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee000000000000000000000000850f0e9a432c663b45f3b4187a7aa7e2eb49e5ac0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d0000000000000000000000000000000000000000000000000000000000000004
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee000000000000000000000000850f0e9a432c663b45f3b4187a7aa7e2eb49e5ac0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d0000000000000000000000000000000000000000000000000000000000000004
-----Decoded View---------------
Arg [0] : _token (address): 0x970ccee657dd831e9c37511aa3eb5302c1eb5eee
Arg [1] : _dummyToken (address): 0x850f0e9a432c663b45f3b4187a7aa7e2eb49e5ac
Arg [2] : _masterchef (address): 0x6ff40a8a1fe16075bd6008a48befb768be08b4b0
Arg [3] : _admin (address): 0xd5b7b040859e87bfbb7807599698786fc2367e2d
Arg [4] : _treasury (address): 0xd5b7b040859e87bfbb7807599698786fc2367e2d
Arg [5] : _poolID (uint256): 4
-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 000000000000000000000000970ccee657dd831e9c37511aa3eb5302c1eb5eee
Arg [1] : 000000000000000000000000850f0e9a432c663b45f3b4187a7aa7e2eb49e5ac
Arg [2] : 0000000000000000000000006ff40a8a1fe16075bd6008a48befb768be08b4b0
Arg [3] : 000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d
Arg [4] : 000000000000000000000000d5b7b040859e87bfbb7807599698786fc2367e2d
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Deployed ByteCode Sourcemap
28129:39555:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49777:1063;;;;;;;;;;;;;;;;-1:-1:-1;49777:1063:0;;:::i;:::-;;42769:2137;;;;;;;;;;;;;;;;-1:-1:-1;42769:2137:0;;;;;;;;;;;-1:-1:-1;;;;;42769:2137:0;;:::i;65110:89::-;;;;;;;;;;;;;;;;-1:-1:-1;65110:89:0;;;;:::i;58661:266::-;;;;;;;;;;;;;;;;-1:-1:-1;58661:266:0;-1:-1:-1;;;;;58661:266:0;;:::i;64872:232::-;;;;;;;;;;;;;;;;-1:-1:-1;64872:232:0;;:::i;30373:43::-;;;:::i;:::-;;;;;;;;;;;;;;;;29704;;;;;;;;;;;;;;;;-1:-1:-1;29704:43:0;-1:-1:-1;;;;;29704:43:0;;:::i;:::-;;;;;;;;;;;;;;;;;;30620:37;;;:::i;65381:150::-;;;;;;;;;;;;;;;;-1:-1:-1;65381:150:0;;;;;;;;;:::i;29241:46::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;29241:46:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39738:157;;;:::i;31320:31::-;;;:::i;61373:94::-;;;;;;;;;;;;;;;;-1:-1:-1;61373:94:0;;:::i;39524:145::-;;;:::i;30420:40::-;;;:::i;53446:156::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53446:156:0;;;;;;;;;;:::i;31283:33::-;;;:::i;30121:26::-;;;:::i;54310:1664::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;54310:1664:0;;;;;;;;;;;;;;;;;;;;:::i;29564:45::-;;;;;;;;;;;;;;;;-1:-1:-1;29564:45:0;-1:-1:-1;;;;;29564:45:0;;:::i;40043:2314::-;;;;;;;;;;;;;;;;-1:-1:-1;40043:2314:0;;;;;;;:::i;38645:90::-;;;:::i;52975:462::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52975:462:0;;;;;;;;:::i;62975:114::-;;;;;;;;;;;;;;;;-1:-1:-1;62975:114:0;;;;:::i;65537:122::-;;;;;;;;;;;;;;;;-1:-1:-1;65537:122:0;-1:-1:-1;;;;;65537:122:0;;:::i;30211:23::-;;;:::i;:::-;;;;-1:-1:-1;;;;;30211:23:0;;;;;;;;;;;;;;45221:1243;;;;;;;;;;;;;;;;-1:-1:-1;45221:1243:0;;;-1:-1:-1;;;;;45221:1243:0;;;;;;;;;;;;;;;:::i;30979:30::-;;;:::i;29039:34::-;;;:::i;60845:206::-;;;:::i;60283:154::-;;;:::i;64510:270::-;;;;;;;;;;;;;;;;-1:-1:-1;64510:270:0;;:::i;52338:579::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;52338:579:0;;;;;;;;:::i;63772:389::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;63772:389:0;;;;;;;;:::i;35374:984::-;;;;;;;;;;;;;;;;-1:-1:-1;35374:984:0;;;-1:-1:-1;;;;;35374:984:0;;;;;;;;;;:::i;30092:21::-;;;:::i;62156:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;62156:269:0;;;;;;;;;;:::i;30548:26::-;;;:::i;30272:28::-;;;:::i;38382:124::-;;;;;;;;;;;;;;;;-1:-1:-1;38382:124:0;;:::i;62854:118::-;;;;;;;;;;;;;;;;-1:-1:-1;62854:118:0;;;;:::i;29187:45::-;;;:::i;64278:132::-;;;:::i;30719:42::-;;;:::i;47880:1638::-;;;;;;;;;;;;;;;;-1:-1:-1;47880:1638:0;;;;;;;;;;;-1:-1:-1;;;;;47880:1638:0;;:::i;28941:85::-;;;:::i;29459:47::-;;;;;;;;;;;;;;;;-1:-1:-1;29459:47:0;-1:-1:-1;;;;;29459:47:0;;:::i;36790:1581::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36790:1581:0;;;;;;;;;;;;;;;;;;:::i;34136:887::-;;;;;;;;;;;;;;;;-1:-1:-1;34136:887:0;;:::i;46686:1098::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;46686:1098:0;;;;;;;;:::i;30818:37::-;;;:::i;50910:951::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50910:951:0;-1:-1:-1;50910:951:0;;:::i;60015:195::-;;;:::i;57732:814::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;57732:814:0;;;;;;;;:::i;53611:325::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;53611:325:0;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;30893:35;;;:::i;61642:289::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;61642:289:0;;;;;;;;;;:::i;51929:235::-;;;;;;;;;;;;;;;;-1:-1:-1;51929:235:0;-1:-1:-1;;;;;51929:235:0;;:::i;65895:329::-;;;;;;;;;;;;;;;;-1:-1:-1;65895:329:0;-1:-1:-1;;;;;65895:329:0;;:::i;61149:117::-;;;;;;;;;;;;;;;;-1:-1:-1;61149:117:0;;;;:::i;62665:100::-;;;;;;;;;;;;;;;;-1:-1:-1;62665:100:0;-1:-1:-1;;;;;62665:100:0;;:::i;56162:1352::-;;;;;;;;;;;;;;;;-1:-1:-1;56162:1352:0;;;;;;;:::i;63095:109::-;;;;;;;;;;;;;;;;-1:-1:-1;63095:109:0;;;;:::i;59190:334::-;;;;;;;;;;;;;;;;-1:-1:-1;59190:334:0;-1:-1:-1;;;;;59190:334:0;;:::i;63377:184::-;;;:::i;60539:148::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;60539:148:0;;;;;;;;:::i;30332:34::-;;;:::i;29127:53::-;;;:::i;29376:50::-;;;;;;;;;;;;;;;;-1:-1:-1;29376:50:0;;:::i;59004:118::-;;;;;;;;;;;;;;;;-1:-1:-1;59004:118:0;-1:-1:-1;;;;;59004:118:0;;:::i;59674:264::-;;;:::i;29294:43::-;;;;;;;;;;;;;;;;-1:-1:-1;29294:43:0;-1:-1:-1;;;;;29294:43:0;;:::i;30154:20::-;;;:::i;29083:29::-;;;:::i;28891:::-;;;:::i;49777:1063::-;49862:11;;49842:15;;49862:11;;;;;:56;;-1:-1:-1;49908:10:0;;49862:56;;;-1:-1:-1;49886:9:0;;49862:56;-1:-1:-1;;;;;;49949:17:0;;49929;49949;;;:8;:17;;;;;;50031:23;;;50028:805;;50116:23;50142:27;50161:7;50142:18;:27::i;:::-;50116:53;-1:-1:-1;50178:19:0;;50175:617;;50273:15;;50270:516;;50328:14;50325:313;;50381:58;50402:7;50411:10;50423:15;50381:20;:58::i;:::-;50325:313;;;50505:57;50526:7;50535:9;50546:15;50505:20;:57::i;:::-;50571:58;50592:7;50601:10;50613:15;50571:20;:58::i;:::-;50270:516;;;50721:57;50742:7;50751:9;50762:15;50721:20;:57::i;:::-;-1:-1:-1;;;;;;50797:17:0;;;;;;:8;:17;;;;;:30;;;50028:805;49777:1063;;;:::o;42769:2137::-;42893:1;42883:7;:11;42875:43;;;;;-1:-1:-1;;;42875:43:0;;;;;;;;;;;;-1:-1:-1;;;42875:43:0;;;;;;;;;;;;;;;42951:10;42942:20;;;;:8;:20;;;;;:27;42931:38;;42923:65;;;;;-1:-1:-1;;;42923:65:0;;;;;;;;;;;;-1:-1:-1;;;42923:65:0;;;;;;;;;;;;;;;43036:10;43003:21;43027:20;;;:8;:20;;;;;:30;;43048:8;;43027:30;;;;;;;;;;;;;;;;43003:54;;43081:4;:11;;;43070:7;:22;;43062:66;;;;;-1:-1:-1;;;43062:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;43062:66:0;;;;;;;;;;;;;;;43143:18;;;;;;;43139:88;;43184:11;;43173:22;;43165:59;;;;;-1:-1:-1;;;43165:59:0;;;;;;;;;;;;-1:-1:-1;;;43165:59:0;;;;;;;;;;;;;;;43271:22;;;;-1:-1:-1;;;;;43307:25:0;;43242:26;43307:25;;;:11;:25;;;;;;;;43304:734;;;43362:58;43408:11;43362:41;:18;43385:17;43362:22;:41::i;:::-;:45;;:58::i;:::-;43344:15;:76;43341:169;;;-1:-1:-1;43450:15:0;43341:169;43304:734;;;-1:-1:-1;;;;;43752:27:0;;;;;;:13;:27;;;;;;;;:90;;;;-1:-1:-1;43801:41:0;:18;43824:17;43801:22;:41::i;:::-;43783:15;:59;43752:90;:203;;;;-1:-1:-1;43897:58:0;43943:11;43897:41;:18;43920:17;43897:22;:41::i;:58::-;43879:15;:76;43752:203;43744:288;;;;;-1:-1:-1;;;43744:288:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;44050:21;44074:43;44105:11;;44075:24;44091:7;44075:11;:9;:11::i;:::-;:15;;:24::i;:::-;44074:30;;:43::i;:::-;44142:11;;44050:67;;-1:-1:-1;44142:24:0;;44158:7;44142:15;:24::i;:::-;44128:38;;44191:11;;:24;;44207:7;44191:15;:24::i;:::-;44177:11;:38;44253:10;44224:17;44244:20;;;:8;:20;;;;;;44278:14;;44275:98;;44309:52;44330:10;44342:9;44353:7;44309:20;:52::i;:::-;44461:25;;;;;44381:106;;;-1:-1:-1;;;44381:106:0;;;;;;;;44429:10;44381:106;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;44381:32:0;;;;;:106;;;;;-1:-1:-1;;44381:106:0;;;;;;;-1:-1:-1;44381:32:0;:106;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;44557:11:0;;:15;;-1:-1:-1;44553:263:0;;-1:-1:-1;44553:263:0;44617:45;44650:11;;44617:28;44633:11;:9;:11::i;:::-;44617;;;:15;:28::i;:45::-;44589:25;;;:73;44703:15;44677:23;;;:41;44553:263;;;44751:34;44764:10;44776:8;44751:12;:34::i;:::-;44841:57;;;;;;;;;;;;;;-1:-1:-1;;;;;44841:57:0;;;44849:10;;44841:57;;;;;;;;;;;42769:2137;;;;;;;:::o;65110:89::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;65172:11:::1;:22:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;65172:22:0;;::::1;::::0;;;::::1;::::0;;65110:89::o;58661:266::-;-1:-1:-1;;;;;58750:17:0;;58724:23;58750:17;;;:8;:17;;;;;58799:11;;58750:17;;58831:89;58852:10;58848:1;:14;58831:89;;;58884:24;58897:7;58906:1;58884:12;:24::i;:::-;58864:3;;58831:89;;;;58661:266;;;:::o;64872:232::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;64946:12;64943:154:::1;;64991:5;::::0;64998:35:::1;::::0;;-1:-1:-1;;;64998:35:0;;65027:4:::1;64998:35;::::0;::::1;::::0;;;64967:67:::1;::::0;-1:-1:-1;;;;;64991:5:0;;::::1;::::0;64998:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:20;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;64998:35:0;-1:-1:-1;;;;;64967:10:0::1;:23;::::0;:67;:23:::1;:67::i;:::-;64943:154;;;65076:5;::::0;65052:39:::1;::::0;-1:-1:-1;;;;;65052:10:0::1;:23:::0;::::1;::::0;65076:5:::1;65083:7:::0;65052:23:::1;:39::i;:::-;64872:232:::0;:::o;30373:43::-;;;;:::o;29704:::-;;;;;;;;;;;;;;;:::o;30620:37::-;;;;;;:::o;65381:150::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;65468:11:::1;:21:::0;;;;65494::::1;:32:::0;;-1:-1:-1;;65494:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;65381:150::o;29241:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29241:46:0;;-1:-1:-1;29241:46:0;;;:::o;39738:157::-;39789:21;;;;39781:59;;;;;-1:-1:-1;;;39781:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39871:5;;;;;;;;;-1:-1:-1;;;;;39871:5:0;-1:-1:-1;;;;;39859:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39859:31:0;39845:11;:45;39738:157::o;31320:31::-;;;;:::o;61373:94::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;61441:7:::1;:18:::0;61373:94::o;39524:145::-;39584:10;;;;;;;;;-1:-1:-1;;;;;39584:10:0;-1:-1:-1;;;;;39572:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39572:31:0;39564:5;:39;;-1:-1:-1;;;;;;39564:39:0;-1:-1:-1;;;;;39564:39:0;;;;;;-1:-1:-1;39637:10:0;39625:36;;;-1:-1:-1;;;39625:36:0;;;;39637:10;;;;;39625:34;;:36;;;;;39572:31;;39625:36;;;;;;;39637:10;39625:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39625:36:0;39614:8;:47;;-1:-1:-1;;;;;;39614:47:0;-1:-1:-1;;;;;39614:47:0;;;;;;;;;39524:145::o;30420:40::-;;;;;;:::o;53446:156::-;-1:-1:-1;;;;;53555:23:0;;;53528:7;53555:23;;;:16;:23;;;;;;;;:32;;;;;;;;;:39;53446:156;;;;;:::o;31283:33::-;;;;:::o;30121:26::-;;;;:::o;54310:1664::-;54447:22;;54422:4;;54447:22;;;;;54439:71;;;;-1:-1:-1;;;54439:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54536:3;-1:-1:-1;;;;;54527:12:0;:5;-1:-1:-1;;;;;54527:12:0;;;54519:47;;;;;-1:-1:-1;;;54519:47:0;;;;;;;;;;;;-1:-1:-1;;;54519:47:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54596:15:0;;;;;;:8;:15;;;;;:22;54585:33;;54577:60;;;;;-1:-1:-1;;;54577:60:0;;;;;;;;;;;;-1:-1:-1;;;54577:60:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;54672:15:0;;54648:21;54672:15;;;:8;:15;;;;;:25;;54688:8;;54672:25;;;;;;;;;;;;;;;;54648:49;;54707:15;54724:20;54746:22;54772:47;54788:5;54795:10;54807:11;54772:15;:47::i;:::-;54706:113;;;;;;55054:4;:11;;;55043:7;:22;55035:63;;;;;-1:-1:-1;;;55035:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55127:4;:22;;;55111:12;:38;55103:79;;;;;-1:-1:-1;;;55103:79:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55213:4;:25;;;55195:14;:43;55187:84;;;;;-1:-1:-1;;;55187:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55303:15:0;;55283:17;55303:15;;;:8;:15;;;;;;55332:14;;55329:93;;55363:47;55384:5;55391:9;55402:7;55363:20;:47::i;:::-;-1:-1:-1;;;;;;55438:13:0;;;;;;:8;:13;;;;;;55465:14;;55462:91;;55496:45;55517:3;55522:9;55533:7;55496:20;:45::i;:::-;55565:29;55578:5;55585:8;55565:12;:29::i;:::-;55640:41;55662:5;55669:11;55640:21;:41::i;:::-;55696:8;:13;55705:3;-1:-1:-1;;;;;55696:13:0;-1:-1:-1;;;;;55696:13:0;;;;;;;;;;;;55733:128;;;;;;;;55742:7;55733:128;;;;55751:12;55733:128;;;;55765:41;55794:11;;55765:24;55777:11;:9;:11::i;:::-;55765:7;;:11;:24::i;:41::-;55733:128;;;;55829:15;55733:128;;;;55846:14;55733:128;;;55696:180;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55894:52;55912:5;55919:3;55924:8;55934:11;55894:52;;;;-1:-1:-1;;;;;55894:52:0;;;;;;-1:-1:-1;;;;;55894:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55962:4:0;;54310:1664;-1:-1:-1;;;;;;;;;54310:1664:0:o;29564:45::-;;;;;;;;;;;;;;;:::o;40043:2314::-;40142:10;40133:20;;;;:8;:20;;;;;:27;40122:38;;40114:67;;;;;-1:-1:-1;;;40114:67:0;;;;;;;;;;;;-1:-1:-1;;;40114:67:0;;;;;;;;;;;;;;;40225:10;40192:21;40216:20;;;:8;:20;;;;;:30;;40237:8;;40216:30;;;;;;;;;;;;;;;;40192:54;;40275:1;40265:7;:11;40257:43;;;;;-1:-1:-1;;;40257:43:0;;;;;;;;;;;;-1:-1:-1;;;40257:43:0;;;;;;;;;;;;;;;40330:11;;40319:22;;;40311:66;;;;;-1:-1:-1;;;40311:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;40311:66:0;;;;;;;;;;;;;;;40441:25;;;;40414:22;;;;:53;;:26;:53::i;:::-;40396:15;:71;40388:109;;;;;-1:-1:-1;;;40388:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40512:18;;;;;;;40508:88;;40553:11;;40542:22;;40534:59;;;;;-1:-1:-1;;;40534:59:0;;;;;;;;;;;;-1:-1:-1;;;40534:59:0;;;;;;;;;;;;;;;40608:21;40632:43;40663:11;;40633:24;40649:7;40633:11;:9;:11::i;40632:43::-;40700:11;;40608:67;;-1:-1:-1;40700:24:0;;40716:7;40700:15;:24::i;:::-;40686:38;;40749:11;;:24;;40765:7;40749:15;:24::i;:::-;40735:11;:38;40859:22;;;;40786:26;;40859:45;;40886:17;40859:26;:45::i;:::-;40841:15;:63;40837:920;;;40920:19;40942:91;40960:72;41029:2;40960:64;41020:3;40961:53;41008:5;40980:4;:22;;;40962:15;:40;40961:46;;:53;;;;:::i;40960:72::-;40950:4;;40942:17;:91::i;:::-;40920:113;-1:-1:-1;41069:41:0;41104:5;41069:30;:13;40920:113;41069:17;:30::i;:41::-;41144:8;;41048:62;;-1:-1:-1;41125:48:0;;-1:-1:-1;;;;;41125:5:0;:18;;;41144:8;41048:62;41125:18;:48::i;:::-;41205:37;:13;41223:18;41205:17;:37::i;:::-;41189:53;;40837:920;;;;41281:62;41331:11;41281:45;41308:17;41281:4;:22;;;:26;;:45;;;;:::i;:62::-;41263:15;:80;41260:497;;;41360:19;41382:94;41473:2;41382:86;41464:3;41382:77;41453:5;41382:66;41402:45;41429:17;41402:4;:22;;;:26;;:45;;;;:::i;:::-;41382:15;;:19;:66::i;:94::-;41360:116;;41508:4;41494:11;:18;41491:46;;;-1:-1:-1;41530:4:0;41491:46;41572:41;41607:5;41572:30;:13;41590:11;41572:17;:30::i;:41::-;41647:8;;41551:62;;-1:-1:-1;41628:48:0;;-1:-1:-1;;;;;41628:5:0;:18;;;41647:8;41551:62;41628:18;:48::i;:::-;41708:37;:13;41726:18;41708:17;:37::i;:::-;41692:53;;41260:497;;41773:11;;:15;41769:282;;41833:64;41885:11;;41833:47;41849:30;41865:13;41849:11;:9;:11::i;:::-;:15;;:30::i;:::-;41833:11;;;:15;:47::i;:64::-;41805:25;;;:92;41938:15;41912:23;;;:41;41769:282;;;41986:34;41999:10;42011:8;41986:12;:34::i;:::-;42094:10;42065:17;42085:20;;;:8;:20;;;;;;42119:14;;42116:98;;42150:52;42171:10;42183:9;42194:7;42150:20;:52::i;:::-;42225:64;;;;;;;;;;;;;;;;;;;;42234:10;;42225:64;;;;;;;;;;42304:45;-1:-1:-1;;;;;42304:5:0;:18;42323:10;42335:13;42304:18;:45::i;:::-;40043:2314;;;;;;:::o;38645:90::-;38696:10;;38717:6;;38684:43;;;-1:-1:-1;;;38684:43:0;;;;;;;;;38696:10;38684:43;;;;;;;;-1:-1:-1;;;;;38696:10:0;;;;38684:32;;:43;;;;;38696:10;38684:43;;;;;;38696:10;;38684:43;;;;;;;;;;;;;;;;;;;;;;;;;;52975:462;53111:10;53057:34;53094:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;53094:37:0;;;;;;;;;53168:17;;53094:37;;53057:34;53168:24;;53190:1;53168:21;:24::i;:::-;53142:50;;53231:15;53216:11;:30;53213:115;;53289:10;53300:15;53289:27;;;;;;;;;;;;;;;;;;53263:10;53274:11;53263:23;;;;;;;;;;;;;;;;:53;;:23;;;;;:53;;;;;;;;;;;;;;;;;;;;53213:115;53348:10;:16;;;;;;;;;;;;;;;;-1:-1:-1;;53348:16:0;;;;;;;;;;;;;;;;;;;;;;;;53378:54;;;53399:10;53378:54;;-1:-1:-1;;;;;53378:54:0;;;;;;;;;;;;;;;;;;;;;;;;;52975:462;;;;:::o;62975:114::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;63053:16:::1;:28:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;63053:28:0;;::::1;::::0;;;::::1;::::0;;62975:114::o;65537:122::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;65618:19:::1;:33:::0;;-1:-1:-1;;;;;;65618:33:0::1;-1:-1:-1::0;;;;;65618:33:0;;;::::1;::::0;;;::::1;::::0;;65537:122::o;30211:23::-;;;-1:-1:-1;;;;;30211:23:0;;:::o;45221:1243::-;45386:10;45372:25;;;;:13;:25;;;;;;;;;:52;;-1:-1:-1;45413:10:0;45401:23;;;;:11;:23;;;;;;;;45372:52;45364:98;;;;-1:-1:-1;;;45364:98:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45604:12;45619:11;:9;:11::i;:::-;45604:26;-1:-1:-1;45641:58:0;-1:-1:-1;;;;;45641:5:0;:22;45664:10;45684:4;45691:7;45641:22;:58::i;:::-;45710:21;45750:11;;45765:1;45750:16;45746:157;;45799:36;45830:4;45800:24;45812:11;;45800:7;:11;;:24;;;;:::i;45799:36::-;45783:52;;45746:157;;;-1:-1:-1;45884:7:0;45746:157;45937:11;;:30;;45953:13;45937:15;:30::i;:::-;45923:11;:44;-1:-1:-1;;;;;45988:27:0;;;;;;:8;:27;;;;;;;;46039:113;;;;;;;;;;;;;;;;;;;;;;46120:15;46039:113;;;;;;;;;;;;45988:179;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46194:27;;;;;;46235:14;;46232:111;;46266:65;46287:17;46306:9;46317:13;46266:20;:65::i;:::-;46360:96;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46360:96:0;;;;;;;;;;;;;45221:1243;;;;;;;:::o;30979:30::-;;;;;;;;;:::o;29039:34::-;;;:::o;60845:206::-;60936:10;;60959:6;;60924:57;;;-1:-1:-1;;;60924:57:0;;;;;;;;;60975:4;60924:57;;;;;60887:7;;;;-1:-1:-1;;;;;60936:10:0;;;;60924:34;;:57;;;;;;;;;;;;;;;60936:10;60924:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60924:57:0;61000:30;;;-1:-1:-1;;;61000:30:0;;61024:4;61000:30;;;;;;60924:57;;-1:-1:-1;61000:42:0;;60924:57;;-1:-1:-1;;;;;61000:5:0;:15;;;;:30;;;;;60924:57;;61000:30;;;;;;;;:15;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61000:30:0;;:34;:42::i;:::-;60993:49;;;60845:206;:::o;60283:154::-;60338:7;60365:11;;60380:1;60365:16;:64;;60391:38;60417:11;;60391:21;60407:4;60391:11;:9;:11::i;:38::-;60365:64;;;60384:4;60365:64;60358:71;;60283:154;:::o;64510:270::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;64583:20;64580:196:::1;;64624:10;::::0;64645:6:::1;::::0;64653:41:::1;::::0;;-1:-1:-1;;;64653:41:0;;-1:-1:-1;;;;;64624:10:0;;::::1;64653:41;::::0;::::1;::::0;;;;;64624:10;;64612:32:::1;::::0;64645:6;64653:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:41;;;;;::::1;::::0;;;;;;;;:20;:41;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;64653:41:0;64612:83:::1;::::0;;-1:-1:-1;;;;;;64612:83:0::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;64612:83:0;;;;;;;-1:-1:-1;64612:83:0;;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64580:196;;;64725:10;::::0;64746:6:::1;::::0;64713:57:::1;::::0;;-1:-1:-1;;;64713:57:0;;::::1;::::0;::::1;::::0;;;;;;;;;;;-1:-1:-1;;;;;64725:10:0;;::::1;::::0;64713:32:::1;::::0;:57;;;;;64725:10:::1;::::0;64713:57;;;;;;;;64725:10;;64713:57;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;64510:270:::0;:::o;52338:579::-;52448:10;52415:21;52439:20;;;:8;:20;;;;;:30;;52460:8;;52439:30;;;;;;;;;;;;;;;;52415:54;;52531:11;;52482:45;52515:11;;52482:28;52498:11;:9;:11::i;:::-;52482;;;:15;:28::i;:45::-;:60;;52474:96;;;;;-1:-1:-1;;;52474:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52619:10;52579:20;52602:28;;;:16;:28;;;;;;;;-1:-1:-1;;;;;52602:37:0;;;;;;;;;;;:44;;52653:37;;;52701:77;;;;;;;;52715:11;;52701:77;;52728:22;;;;;;52701:77;;;;;;52752:25;;;;;52701:77;;;;;;52653:130;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52846:11;;52859:22;;52883:25;;52797:112;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52602:44;;52797:112;;;;;;;;;;52338:579;;;;:::o;63772:389::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;63871:10:::1;:24:::0;;-1:-1:-1;;;;;;63871:24:0::1;-1:-1:-1::0;;;;;63871:24:0;;::::1;::::0;;;::::1;::::0;;;;63900:6:::1;:19:::0;;;63980:64:::1;::::0;;-1:-1:-1;;;63980:64:0;;64017:4:::1;63980:64;::::0;::::1;::::0;64032:10;;::::1;63980:64:::0;;;;;-1:-1:-1;;63987:10:0::1;63980:28:::0;;::::1;::::0;::::1;::::0;:64;;;;;::::1;::::0;;;;;;;;:28;:64;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;63980:64:0;;-1:-1:-1;64052:20:0;64049:108:::1;;64080:71;-1:-1:-1::0;;;;;64087:10:0::1;64080:30;64119:11:::0;-1:-1:-1;;64080:30:0::1;:71::i;35374:984::-:0;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;35511:11:::1;::::0;35500:22;::::1;;35492:53;;;::::0;;-1:-1:-1;;;35492:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;35492:53:0;;;;;;;;;;;;;::::1;;35558:12;35573:11;:9;:11::i;:::-;35558:26:::0;-1:-1:-1;35595:58:0::1;-1:-1:-1::0;;;;;35595:5:0::1;:22;35618:10;35638:4;35645:7:::0;35595:22:::1;:58::i;:::-;35664:21;35704:11;;35719:1;35704:16;35700:157;;35753:36;35784:4;35754:24;35766:11;;35754:7;:11;;:24;;;;:::i;35753:36::-;35737:52;;35700:157;;;-1:-1:-1::0;35838:7:0;35700:157:::1;35891:11;::::0;:30:::1;::::0;35907:13;35891:15:::1;:30::i;:::-;35877:11;:44:::0;-1:-1:-1;;;;;35942:20:0;::::1;;::::0;;;:8:::1;:20;::::0;;;;;;;35986:85;;::::1;::::0;::::1;::::0;;;;;36010:15:::1;35986:85:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;35942:144;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;36122:20;;;;;;36156:14;;36153:104:::1;;36187:58;36208:10;36220:9;36231:13;36187:20;:58::i;:::-;36274:76;::::0;;;;;::::1;::::0;::::1;::::0;;;36334:15:::1;36274:76:::0;;;;;;-1:-1:-1;;;;;36274:76:0;::::1;::::0;36286:10:::1;::::0;36274:76:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;;;35374:984:0:o;30092:21::-;;;;:::o;62156:269::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;62243:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;;::::1;;:30;;::::0;::::1;;;62240:178;;-1:-1:-1::0;;;;;62281:18:0;::::1;;::::0;;;:11:::1;:18;::::0;;;;:29;;-1:-1:-1;;62281:29:0::1;::::0;::::1;;;::::0;;;62321:50:::1;;62353:16;:18:::0;;-1:-1:-1;;62353:18:0;;;;;62321:50:::1;;;62332:16;:18:::0;;::::1;::::0;::::1;::::0;;;62321:50:::1;-1:-1:-1::0;62384:28:0::1;::::0;;-1:-1:-1;;;;;62384:28:0;::::1;::::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;62240:178;62156:269:::0;;:::o;30548:26::-;;;;:::o;30272:28::-;;;-1:-1:-1;;;;;30272:28:0;;:::o;38382:124::-;38459:10;38450:20;;;;:8;:20;;;;;:30;;38441:57;;38450:20;38471:8;;38450:30;;;;;;;;;;;;;;;;:37;;;38489:8;38441;:57::i;62854:118::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;62934:18:::1;:30:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;62934:30:0;;::::1;::::0;;;::::1;::::0;;62854:118::o;29187:45::-;;;:::o;64278:132::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;64338:10:::1;::::0;64358:6:::1;::::0;64366:35:::1;::::0;;-1:-1:-1;;;64366:35:0;;64395:4:::1;64366:35;::::0;::::1;::::0;;;-1:-1:-1;;;;;64338:10:0;;::::1;::::0;64326:31:::1;::::0;64358:6;64366:10:::1;:20:::0;;::::1;::::0;::::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:20;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;64366:35:0;64326:76:::1;::::0;;-1:-1:-1;;;;;;64326:76:0::1;::::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;64326:76:0;;;;;;;-1:-1:-1;64326:76:0;;::::1;;::::0;::::1;;;;::::0;::::1;30719:42:::0;;;;;;;;;:::o;47880:1638::-;48008:18;;;;48000:49;;;;;-1:-1:-1;;;48000:49:0;;;;;;;;;;;;-1:-1:-1;;;48000:49:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;48062:31:0;;48083:10;48062:31;;48054:66;;;;;-1:-1:-1;;;48054:66:0;;;;;;;;;;;;-1:-1:-1;;;48054:66:0;;;;;;;;;;;;;;;48159:10;48150:20;;;;:8;:20;;;;;:27;48139:38;;48131:65;;;;;-1:-1:-1;;;48131:65:0;;;;;;;;;;;;-1:-1:-1;;;48131:65:0;;;;;;;;;;;;;;;48240:10;48207:21;48231:20;;;:8;:20;;;;;:30;;48252:8;;48231:30;;;;;;;;;;;;;;;;48207:54;;48266:26;48295:41;48324:11;;48295:24;48307:11;:9;:11::i;:::-;48295:7;;:11;:24::i;:41::-;48266:70;;48377:11;;48355:18;:33;;48347:69;;;;;-1:-1:-1;;;48347:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48446:11;;48435:22;;;48427:66;;;;;-1:-1:-1;;;48427:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;48427:66:0;;;;;;;;;;;;;;;48508:16;;;;;;;48504:86;;48547:11;;48536:22;;48528:59;;;;;-1:-1:-1;;;48528:59:0;;;;;;;;;;;;-1:-1:-1;;;48528:59:0;;;;;;;;;;;;;;;48624:11;;:24;;48640:7;48624:15;:24::i;:::-;48610:38;;48684:10;48610:11;48675:20;;;:8;:20;;;;;;48709:14;;48706:98;;48740:52;48761:10;48773:9;48784:7;48740:20;:52::i;:::-;-1:-1:-1;;;;;;48820:27:0;;;;;;:8;:27;;;;;;48861:14;;48858:105;;48892:59;48913:17;48932:9;48943:7;48892:20;:59::i;:::-;-1:-1:-1;;;;;48983:27:0;;;;;;:8;:27;;;;;;;;49034:105;;;;;;;;;;49052:22;;;;;49034:105;;;;;;;;;;;;49096:15;49034:105;;;;;;49113:25;;;;;49034:105;;;;;;48983:171;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49171:11;;:15;49167:263;;49231:45;49264:11;;49231:28;49247:11;:9;:11::i;49231:45::-;49203:25;;;:73;49317:15;49291:23;;;:41;49167:263;;;49365:34;49378:10;49390:8;49365:12;:34::i;:::-;49447:63;;;;;;;;;;;;;;-1:-1:-1;;;;;49447:63:0;;;49461:10;;49447:63;;;;;;;;;;;47880:1638;;;;;;:::o;28941:85::-;;;:::o;29459:47::-;;;;;;;;;;;;-1:-1:-1;;;;;29459:47:0;;:::o;36790:1581::-;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;36949:11;36941:42:::1;;;::::0;;-1:-1:-1;;;36941:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36941:42:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;37002:24:0;::::1;;::::0;;;:8:::1;:24;::::0;;;;:31;:42;-1:-1:-1;36994:69:0::1;;;::::0;;-1:-1:-1;;;36994:69:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36994:69:0;;;;;;;;;;;;;::::1;;37101:5;::::0;-1:-1:-1;;;;;37101:5:0::1;37087:10;:19;37084:100;;-1:-1:-1::0;;;;;37118:28:0;::::1;37136:10;37118:28;37110:71;;;::::0;;-1:-1:-1;;;37110:71:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;37196:12;37211:11;:9;:11::i;:::-;37196:26:::0;-1:-1:-1;37233:58:0::1;-1:-1:-1::0;;;;;37233:5:0::1;:22;37256:10;37276:4;37283:7:::0;37233:22:::1;:58::i;:::-;37302:21;37342:11;;37357:1;37342:16;37338:157;;37391:36;37422:4;37392:24;37404:11;;37392:7;:11;;:24;;;;:::i;37391:36::-;37375:52;;37338:157;;;-1:-1:-1::0;37476:7:0;37338:157:::1;-1:-1:-1::0;;;;;37529:24:0;::::1;37505:21;37529:24:::0;;;:8:::1;:24;::::0;;;;:34;;37554:8;;37529:34;::::1;;;;;;;;;;;;;;;37505:58;;37590:30;37606:13;37590:4;:11;;;:15;;:30;;;;:::i;:::-;37576:44:::0;;37645:11:::1;::::0;:30:::1;::::0;37661:13;37645:15:::1;:30::i;:::-;37631:11;:44:::0;37724:25:::1;::::0;::::1;::::0;37699:50;::::1;::::0;:123:::1;;-1:-1:-1::0;37777:22:0::1;::::0;::::1;::::0;:45:::1;::::0;37804:17:::1;37777:26;:45::i;:::-;37759:15;:63;37699:123;37696:192;;;37831:25;::::0;::::1;:50:::0;;;37696:192:::1;37930:45;37963:11;;37930:28;37946:11;:9;:11::i;:::-;37930::::0;;;:15:::1;:28::i;:45::-;37902:25;::::0;::::1;:73:::0;38012:15:::1;37986:23;::::0;;::::1;:41:::0;;;38032:22:::1;::::0;::::1;:40:::0;;;;-1:-1:-1;;;;;38107:24:0;::::1;-1:-1:-1::0;38107:24:0;;;::::1;::::0;;;;;;;;38145:14;;38142:108:::1;;38176:62;38197:14;38213:9;38224:13;38176:20;:62::i;:::-;38267:96;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;38347:15:::1;38267:96:::0;;;;;;-1:-1:-1;;;;;38267:96:0;::::1;::::0;38285:10:::1;::::0;38267:96:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;;;;;36790:1581:0:o;34136:887::-;2824:1;3430:7;;:19;;3422:63;;;;;-1:-1:-1;;;3422:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;2824:1;3563:7;:18;34208:11;34200:42:::1;;;::::0;;-1:-1:-1;;;34200:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;34200:42:0;;;;;;;;;;;;;::::1;;34256:12;34271:11;:9;:11::i;:::-;34256:26:::0;-1:-1:-1;34293:58:0::1;-1:-1:-1::0;;;;;34293:5:0::1;:22;34316:10;34336:4;34343:7:::0;34293:22:::1;:58::i;:::-;34362:21;34402:11;;34417:1;34402:16;34398:157;;34451:36;34482:4;34452:24;34464:11;;34452:7;:11;;:24;;;;:::i;34451:36::-;34435:52;;34398:157;;;-1:-1:-1::0;34536:7:0;34398:157:::1;34589:11;::::0;:30:::1;::::0;34605:13;34589:15:::1;:30::i;:::-;34575:11;:44:::0;34649:10:::1;34640:20;::::0;;;:8:::1;:20;::::0;;;;;;;34684:69;;::::1;::::0;::::1;::::0;;;;;34708:15:::1;34684:69:::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;34640:128;;::::1;::::0;;::::1;::::0;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;34803:20;;;;;;34837:14;;34834:104:::1;;34868:58;34889:10;34901:9;34912:13;34868:20;:58::i;:::-;34955:60;::::0;;;;;::::1;::::0;::::1;::::0;;;34999:15:::1;34955:60:::0;;;;;;34963:10:::1;::::0;34955:60:::1;::::0;;;;;;;;::::1;-1:-1:-1::0;;2780:1:0;3742:7;:22;-1:-1:-1;;34136:887:0:o;46686:1098::-;46783:10;46774:20;;;;:8;:20;;;;;:27;:38;-1:-1:-1;46766:67:0;;;;;-1:-1:-1;;;46766:67:0;;;;;;;;;;;;-1:-1:-1;;;46766:67:0;;;;;;;;;;;;;;;46887:10;46854:21;46878:20;;;:8;:20;;;;;:30;;46899:8;;46878:30;;;;;;;;;;;;;;;;46854:54;;46955:45;46982:17;46955:4;:22;;;:26;;:45;;;;:::i;:::-;46937:15;:63;46929:96;;;;;-1:-1:-1;;;46929:96:0;;;;;;;;;;;;-1:-1:-1;;;46929:96:0;;;;;;;;;;;;;;;47046:21;47070:47;47105:11;;47071:28;47087:4;:11;;;47071;:9;:11::i;47070:47::-;47175:5;;47163:42;;;-1:-1:-1;;;47163:42:0;;-1:-1:-1;;;;;47163:42:0;;;;;;;;;47046:71;;-1:-1:-1;47129:13:0;;47145:72;;47211:5;;47145:61;;47175:5;;;47163:31;;:42;;;;;;;;;;;;;;;47175:5;47163:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47163:42:0;47145:13;;:17;:61::i;:72::-;47262:5;;47238:30;;;-1:-1:-1;;;47238:30:0;;-1:-1:-1;;;;;47262:5:0;;;47238:30;;;;;;47129:88;;-1:-1:-1;47129:88:0;;47245:5;47238:23;;;;;;:30;;;;;;;;;;;;;;;:23;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47238:30:0;:39;;47230:96;;;;-1:-1:-1;;;47230:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47350:26:0;;47371:4;47350:26;47347:430;;;47405:5;;47393:77;;;-1:-1:-1;;;47393:77:0;;47431:10;47393:77;;;;-1:-1:-1;;;;;47393:77:0;;;;;;;;;;;;;;;;;;;;;47405:5;;;;;47393:37;;:77;;;;;47405:5;;47393:77;;;;;;;47405:5;;47393:77;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47347:430;;;47555:11;;47533:55;;47568:8;47578:9;47533:21;:55::i;:::-;47637:5;;;;;;;;;-1:-1:-1;;;;;47637:5:0;-1:-1:-1;;;;;47625:37:0;;47663:10;47675:9;47686:5;47740:1;47701:9;-1:-1:-1;;;;;47693:32:0;;47726:10;47693:44;;;;;;;;;;;;;-1:-1:-1;;;;;47693:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47693:44:0;47625:117;;;-1:-1:-1;;;;;;47625:117:0;;;;;;;-1:-1:-1;;;;;47625:117:0;;;;;;;;;;;;;;;;;;;;;;47693:48;;47625:117;;;;;;;;;;;-1:-1:-1;;47625:117:0;;;;;;;-1:-1:-1;47625:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46686:1098;;;;;:::o;30818:37::-;;;;;;;;;:::o;50910:951::-;51011:9;51007:847;51026:24;;;51007:847;;;51100:10;51066:12;:30;51079:13;;51093:1;51079:16;;;;;;;-1:-1:-1;;;;;51079:16:0;;;;;;;;;;;51066:30;;;;;;;;;;;;-1:-1:-1;51066:30:0;;;:44;;;;51063:786;;-1:-1:-1;51063:786:0;;51119:17;51139:8;:26;51148:13;;51162:1;51148:16;;;;;;;;;;;;;-1:-1:-1;;;;;51148:16:0;-1:-1:-1;;;;;51139:26:0;-1:-1:-1;;;;;51139:26:0;;;;;;;;;;;;;51119:46;;51242:9;51228:10;:23;51225:618;;51266:23;51292:36;51311:13;;51325:1;51311:16;;;;;;;;;;;;;-1:-1:-1;;;;;51311:16:0;51292:18;:36::i;:::-;51266:62;-1:-1:-1;51339:19:0;;51336:453;;51372:15;;51369:412;;51403:14;51400:280;;51430:67;51451:13;;51465:1;51451:16;;;;;;;;;;;;;-1:-1:-1;;;;;51451:16:0;51469:10;51481:15;51430:20;:67::i;:::-;51400:280;;;51525:66;51546:13;;51560:1;51546:16;;;;;;;;;;;;;-1:-1:-1;;;;;51546:16:0;51564:9;51575:15;51525:20;:66::i;:::-;51602:67;51623:13;;51637:1;51623:16;;;;;;51602:67;51369:412;;;51705:66;51726:13;;51740:1;51726:16;;;;;;51705:66;51825:10;51796:8;:26;51805:13;;51819:1;51805:16;;;;;;;;;;;;;-1:-1:-1;;;;;51805:16:0;-1:-1:-1;;;;;51796:26:0;-1:-1:-1;;;;;51796:26:0;;;;;;;;;;;;:39;;;;51225:618;;51063:786;;51052:3;;51007:847;;60015:195;60131:10;;60154:6;;60119:57;;;-1:-1:-1;;;60119:57:0;;;;;;;;;60170:4;60119:57;;;;;60082:7;;;;-1:-1:-1;;;;;60131:10:0;;;;60119:34;;:57;;;;;;;;;;;;;;;60131:10;60119:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60119:57:0;;-1:-1:-1;;60015:195:0;:::o;57732:814::-;57815:13;;-1:-1:-1;;;;;57815:13:0;57807:63;;;;;-1:-1:-1;;;57807:63:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57900:17:0;;;;;;:8;:17;;;;;:24;57889:35;;57881:64;;;;;-1:-1:-1;;;57881:64:0;;;;;;;;;;;;-1:-1:-1;;;57881:64:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;57980:17:0;;57956:21;57980:17;;;:8;:17;;;;;:27;;57998:8;;57980:27;;;;;;;;;;;;;;;;57956:51;;58034:1;58020:4;:11;;;:15;58012:38;;;;;-1:-1:-1;;;58012:38:0;;;;;;;;;;;;-1:-1:-1;;;58012:38:0;;;;;;;;;;;;;;;58071:21;58095:47;58130:11;;58096:28;58112:4;:11;;;58096;:9;:11::i;58095:47::-;58183:11;;58167;;58071:71;;-1:-1:-1;58167:28:0;;:11;:15;:28::i;:::-;58153:11;:42;58224:1;58210:15;;;58359:13;;;58409:22;;;58433:25;;;;;58351:108;;;-1:-1:-1;;;58351:108:0;;;;;;;;-1:-1:-1;;;;;58351:108:0;;;;;;;;;;;;;;;;;;;;;;58359:13;;;;;58351:33;;:108;;;;;;;;;;;58224:1;58359:13;58351:108;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;58517:11:0;;58477:61;;;;;;;;;;;;;;;-1:-1:-1;;;;;58477:61:0;;;-1:-1:-1;58490:10:0;;-1:-1:-1;58477:61:0;;;;;;;;;;57732:814;;;;:::o;53611:325::-;-1:-1:-1;;;;;53783:23:0;;;53710:7;53783:23;;;:16;:23;;;;;;;;:32;;;;;;;;;;;:45;;53710:7;;;;;;53783:32;53816:11;;53783:45;;;;;;;;;;;;;;;;;;;53847:17;;53866:28;;;;53896:31;;;;;53847:17;;53866:28;;-1:-1:-1;53896:31:0;-1:-1:-1;53611:325:0;-1:-1:-1;;;;;53611:325:0:o;30893:35::-;;;;;;;;;:::o;61642:289::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;61733:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;;::::1;;:34;;::::0;::::1;;;61730:194;;-1:-1:-1::0;;;;;61775:22:0;::::1;;::::0;;;:13:::1;:22;::::0;;;;:33;;-1:-1:-1;;61775:33:0::1;::::0;::::1;;;::::0;;;61819:54:::1;;61853:18;:20:::0;;-1:-1:-1;;61853:20:0;;;;;61819:54:::1;;;61830:18;:20:::0;;::::1;::::0;::::1;::::0;;;61819:54:::1;-1:-1:-1::0;61886:32:0::1;::::0;;-1:-1:-1;;;;;61886:32:0;::::1;::::0;;;::::1;;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;61642:289:::0;;:::o;51929:235::-;52009:11;;51989:15;;52009:11;;;;;:52;;-1:-1:-1;52051:10:0;;52009:52;;;-1:-1:-1;52031:9:0;;52009:52;-1:-1:-1;;;;;;52072:21:0;;;;;;;:12;:21;;;;;;;;;:33;;-1:-1:-1;;;;;;52072:33:0;;;;;;;;;52125:31;;;;;;;;;;;;;;;;;;;;;;;;51929:235;;:::o;65895:329::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;66004:5:::1;-1:-1:-1::0;;;;;65979:31:0::1;:13;-1:-1:-1::0;;;;;65979:31:0::1;;;65971:55;;;::::0;;-1:-1:-1;;;65971:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;65971:55:0;;;;;;;;;;;;;::::1;;66064:10;-1:-1:-1::0;;;;;66039:36:0::1;:13;-1:-1:-1::0;;;;;66039:36:0::1;;;66031:60;;;::::0;;-1:-1:-1;;;66031:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;66031:60:0;;;;;;;;;;;;;::::1;;66147:5;::::0;66135:35:::1;::::0;;-1:-1:-1;;;66135:35:0;;;;66100:119:::1;::::0;-1:-1:-1;;;;;66147:5:0::1;::::0;66135:33:::1;::::0;:35:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;66147:5;66135:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;66135:35:0;66172:46:::1;::::0;;-1:-1:-1;;;66172:46:0;;66212:4:::1;66172:46;::::0;::::1;::::0;;;-1:-1:-1;;;;;66172:31:0;::::1;::::0;::::1;::::0;:46;;;;;66135:35:::1;::::0;66172:46;;;;;;;:31;:46;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;66172:46:0;-1:-1:-1;;;;;66100:34:0;::::1;::::0;:119;:34:::1;:119::i;61149:117::-:0;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;61228:22:::1;:33:::0;;;::::1;;;;-1:-1:-1::0;;61228:33:0;;::::1;::::0;;;::::1;::::0;;61149:117::o;62665:100::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;62733:13:::1;:24:::0;;-1:-1:-1;;;;;;62733:24:0::1;-1:-1:-1::0;;;;;62733:24:0;;;::::1;::::0;;;::::1;::::0;;62665:100::o;56162:1352::-;56245:19;;-1:-1:-1;;;;;56245:19:0;56237:54;;;;;-1:-1:-1;;;56237:54:0;;;;;;;;;;;;-1:-1:-1;;;56237:54:0;;;;;;;;;;;;;;;56330:10;56321:20;;;;:8;:20;;;;;:27;56310:38;;56302:67;;;;;-1:-1:-1;;;56302:67:0;;;;;;;;;;;;-1:-1:-1;;;56302:67:0;;;;;;;;;;;;;;;56413:10;56380:21;56404:20;;;:8;:20;;;;;:30;;56425:8;;56404:30;;;;;;;;;;;;;;;;56380:54;;56463:1;56453:7;:11;56445:43;;;;;-1:-1:-1;;;56445:43:0;;;;;;;;;;;;-1:-1:-1;;;56445:43:0;;;;;;;;;;;;;;;56518:11;;56507:22;;;56499:66;;;;;-1:-1:-1;;;56499:66:0;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;56499:66:0;;;;;;;;;;;;;;;56578:21;56602:43;56633:11;;56603:24;56619:7;56603:11;:9;:11::i;56602:43::-;56670:11;;56578:67;;-1:-1:-1;56670:24:0;;56686:7;56670:15;:24::i;:::-;56656:38;;56719:11;;:24;;56735:7;56719:15;:24::i;:::-;56705:11;:38;56760:11;;:15;56756:282;;56820:64;56872:11;;56820:47;56836:30;56852:13;56836:11;:9;:11::i;56820:64::-;56792:25;;;:92;56925:15;56899:23;;;:41;56756:282;;;56973:34;56986:10;56998:8;56973:12;:34::i;:::-;57073:10;57044:17;57064:20;;;:8;:20;;;;;;57098:14;;57095:98;;57129:52;57150:10;57162:9;57173:7;57129:20;:52::i;:::-;57213:19;;57204:56;;;;;;57213:19;57204:56;;;;;;;;;;;;-1:-1:-1;;;;;57213:19:0;;;;57204:56;;;;;;;;;57292:19;;57273:54;;-1:-1:-1;;;;;57273:5:0;:18;;;57292:19;57313:13;57273:18;:54::i;:::-;57340:19;;57332:65;;;-1:-1:-1;;;57332:65:0;;;;;;;;57386:10;57332:65;;;;;;-1:-1:-1;;;;;57340:19:0;;;;57332:38;;:65;;;;;57340:19;;57332:65;;;;;;;;57340:19;;57332:65;;;;;;;;;;63095:109;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;63170:18:::1;:29:::0;;-1:-1:-1;;63170:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63095:109::o;59190:334::-;-1:-1:-1;;;;;59302:15:0;;59254:7;59302:15;;;:8;:15;;;;;59353:13;;59254:7;;59405:85;59426:14;59422:1;:18;59405:85;;;59468:6;59475:1;59468:9;;;;;;;;;;;;;;;;;;;;;:16;59453:31;;;;;59442:3;;59405:85;;;-1:-1:-1;59505:11:0;59190:334;-1:-1:-1;;;;59190:334:0:o;63377:184::-;33906:5;;-1:-1:-1;;;;;33906:5:0;33892:10;:19;33884:43;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;-1:-1:-1;;;33884:43:0;;;;;;;;;;;;;;;63448:10:::1;::::0;63478:6:::1;::::0;63436:49:::1;::::0;;-1:-1:-1;;;63436:49:0;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;;;;;63448:10:0;;::::1;::::0;63436:41:::1;::::0;:49;;;;;63448:10:::1;::::0;63436:49;;;;;;;;63448:10;;63436:49;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;63515:5:0::1;::::0;63522:30:::1;::::0;;-1:-1:-1;;;63522:30:0;;63546:4:::1;63522:30;::::0;::::1;::::0;;;63496:57:::1;::::0;-1:-1:-1;;;;;;63515:5:0;;::::1;::::0;-1:-1:-1;63522:5:0::1;:15:::0;;::::1;::::0;::::1;::::0;:30;;;;;::::1;::::0;;;;;;;;;:15;:30;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;63522:30:0;-1:-1:-1;;;;;63496:5:0::1;:18;::::0;:57;:18:::1;:57::i;:::-;63377:184::o:0;60539:148::-;-1:-1:-1;;;;;60645:17:0;;60618:7;60645:17;;;:8;:17;;;;;:27;;60663:8;;60645:27;;;;;;;;;;;;;;;;:34;;;60638:41;;60539:148;;;;:::o;30332:34::-;;;-1:-1:-1;;;;;30332:34:0;;:::o;29127:53::-;;;:::o;29376:50::-;;;;;;;;;;;;;:::o;59004:118::-;-1:-1:-1;;;;;59092:15:0;59065:7;59092:15;;;:8;:15;;;;;:22;;59004:118::o;59674:264::-;59785:10;;59808:6;;59773:57;;;-1:-1:-1;;;59773:57:0;;;;;;;;;59824:4;59773:57;;;;;59736:7;;;;-1:-1:-1;;;;;59785:10:0;;;;59773:34;;:57;;;;;;;;;;;;;;;59785:10;59773:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59773:57:0;59877:7;;59773:57;;-1:-1:-1;59841:22:0;;59866:30;;59890:5;;59866:19;;59773:57;;59866:10;:19::i;:30::-;59841:55;-1:-1:-1;;;59674:264:0;:::o;29294:43::-;;;;;;;;;;;;;:::o;30154:20::-;;;-1:-1:-1;;;;;30154:20:0;;:::o;29083:29::-;;;-1:-1:-1;;;;;29083:29:0;;:::o;28891:::-;;;:::o;23935:670::-;24353:10;;;24352:62;;-1:-1:-1;24369:39:0;;;-1:-1:-1;;;24369:39:0;;24393:4;24369:39;;;;-1:-1:-1;;;;;24369:39:0;;;;;;;;;:15;;;;;;:39;;;;;;;;;;;;;;;:15;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24369:39:0;:44;24352:62;24330:166;;;;-1:-1:-1;;;24330:166:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24534:62;;;-1:-1:-1;;;;;24534:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24534:62:0;-1:-1:-1;;;24534:62:0;;;24507:90;;24527:5;;24507:19;:90::i;18025:229::-;18162:12;18194:52;18216:6;18224:4;18230:1;18233:12;18194:21;:52::i;:::-;18187:59;;18025:229;;;;;;:::o;66827:232::-;66955:27;;;;:15;:27;;;;;;:37;;66987:4;66955:31;:37::i;:::-;66925:27;;;;:15;:27;;;;;;;;;:67;;;;67018:33;;;;;;;;;;;;;-1:-1:-1;;;;;67018:33:0;;;;;;;;;;;;66827:232;;;:::o;67065:235::-;67193:27;;;;:15;:27;;;;;;:37;;67225:4;67193:31;:37::i;:::-;67163:27;;;;:15;:27;;;;;;;;;:67;;;;67256:36;;;;;;;;;;;;;-1:-1:-1;;;;;67256:36:0;;;;;;;;;;;;67065:235;;;:::o;6539:179::-;6597:7;6629:5;;;6653:6;;;;6645:46;;;;;-1:-1:-1;;;6645:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;7418:220;7476:7;7500:6;7496:20;;-1:-1:-1;7515:1:0;7508:8;;7496:20;7539:5;;;7543:1;7539;:5;:1;7563:5;;;;;:10;7555:56;;;;-1:-1:-1;;;7555:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8116:153;8174:7;8206:1;8202;:5;8194:44;;;;;-1:-1:-1;;;8194:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8260:1;8256;:5;;;;;;;8116:153;-1:-1:-1;;;8116:153:0:o;7001:158::-;7059:7;7092:1;7087;:6;;7079:49;;;;;-1:-1:-1;;;7079:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7146:5:0;;;7001:158::o;67356:325::-;-1:-1:-1;;;;;67460:17:0;;67432:25;67460:17;;;:8;:17;;;;;67510:13;;-1:-1:-1;;67510:17:0;67551:23;;;67548:93;;67610:6;67617:11;67610:19;;;;;;;;;;;;;;;;;;67591:6;67598:8;67591:16;;;;;;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67548:93;67661:6;:12;;;;;;;;;;;;;;;-1:-1:-1;;67661:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;67356:325:0:o;23199:211::-;23343:58;;;-1:-1:-1;;;;;23343:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23343:58:0;-1:-1:-1;;;23343:58:0;;;23316:86;;23336:5;;23316:19;:86::i;66285:456::-;-1:-1:-1;;;;;66402:23:0;;66365:34;66402:23;;;:16;:23;;;;;;;;66426:10;66402:35;;;;;;;66474:17;;66402:35;;66365:34;66474:24;;66496:1;66474:21;:24::i;:::-;66448:50;;66537:15;66522:11;:30;66519:115;;66595:10;66606:15;66595:27;;;;;;;;;;;;;;;;;;66569:10;66580:11;66569:23;;;;;;;;;;;;;;;;:53;;:23;;;;;:53;;;;;;;;;;;;;;;;;;;;66519:115;66654:10;:16;;;;;;;;;;;;;;;;-1:-1:-1;;66654:16:0;;;;;;;;;;;;;;;;;;;;;;;;66684:52;;;-1:-1:-1;;;;;66684:52:0;;;;66712:10;66684:52;;;;;;;;;;;;;;;;;;;;;;;66285:456;;;;:::o;23418:248::-;23589:68;;;-1:-1:-1;;;;;23589:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23589:68:0;-1:-1:-1;;;23589:68:0;;;23562:96;;23582:5;;25710:774;26134:23;26160:69;26188:4;26160:69;;;;;;;;;;;;;;;;;26168:5;-1:-1:-1;;;;;26160:27:0;;;:69;;;;;:::i;:::-;26244:17;;26134:95;;-1:-1:-1;26244:21:0;26240:237;;26399:10;26388:30;;;;;;;;;;;;;;;-1:-1:-1;26388:30:0;26380:85;;;;-1:-1:-1;;;26380:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19145:571;19315:12;19373:5;19348:21;:30;;19340:81;;;;-1:-1:-1;;;19340:81:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19440:18;19451:6;19440:10;:18::i;:::-;19432:60;;;;;-1:-1:-1;;;19432:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19566:12;19580:23;19607:6;-1:-1:-1;;;;;19607:11:0;19626:5;19633:4;19607:31;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19607:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19565:73;;;;19656:52;19674:7;19683:10;19695:12;19656:17;:52::i;:::-;19649:59;19145:571;-1:-1:-1;;;;;;;19145:571:0:o;15085:444::-;15465:20;15513:8;;;15085:444::o;21794:777::-;21944:12;21973:7;21969:595;;;-1:-1:-1;22004:10:0;21997:17;;21969:595;22118:17;;:21;22114:439;;22381:10;22375:17;22442:15;22429:10;22425:2;22421:19;22414:44;22329:148;22524:12;22517:20;;-1:-1:-1;;;22517:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Swarm Source
ipfs://349d5b5ed5e1791554df8eb97ac325151fda46713ad6351ad93c0f79da9bc186
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.