Contract Address Details

0xEeB84a24e10502D8A5c97B11df381D1550B25b9d

Contract Name
ThorusMaster
Creator
0x999e77–18b7a6 at 0x14861f–914e0c
Balance
0 GLMR
Tokens
Fetching tokens...
Transactions
10,595 Transactions
Transfers
9,206 Transfers
Gas Used
992,655,881
Last Balance Update
2431506
Contract name:
ThorusMaster




Optimization enabled
false
Compiler version
v0.8.10+commit.fc410830




EVM Version
default




Verified at
2022-01-14 01:35:13.308388Z

Constructor Arguments

000000000000000000000000ae4aa155d2987b454c29450ef4f862cf00907b6100000000000000000000000000000000000000000000000003311fc80a5700000000000000000000000000000000000000000000000000000000000061e0bd00

Arg [0] (address) : 0xae4aa155d2987b454c29450ef4f862cf00907b61
Arg [1] (uint256) : 230000000000000000
Arg [2] (uint256) : 1642118400

              

Contract source code

// SPDX-License-Identifier: MIT
pragma solidity 0.8.10;
/*
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*
* The renounceOwnership removed to prevent accidents
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount) external returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender) external view returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(address indexed owner, address indexed spender, uint256 value);
}
/**
* @dev Collection of functions related to the address type
*/
library Address {
/**
* @dev Returns true if `account` is a contract.
*
* [IMPORTANT]
* ====
* It is unsafe to assume that an address for which this function returns
* false is an externally-owned account (EOA) and not a contract.
*
* Among others, `isContract` will return false for the following
* types of addresses:
*
* - an externally-owned account
* - a contract in construction
* - an address where a contract will be created
* - an address where a contract lived, but was destroyed
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize, which returns 0 for contracts in
// construction, since the code is only stored at the end of the
// constructor execution.
uint256 size;
assembly {
size := extcodesize(account)
}
return size > 0;
}
/**
* @dev Replacement for Solidity's `transfer`: sends `amount` wei to
* `recipient`, forwarding all available gas and reverting on errors.
*
* https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
* of certain opcodes, possibly making contracts go over the 2300 gas limit
* imposed by `transfer`, making them unable to receive funds via
* `transfer`. {sendValue} removes this limitation.
*
* https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
*
* IMPORTANT: because control is transferred to `recipient`, care must be
* taken to not create reentrancy vulnerabilities. Consider using
* {ReentrancyGuard} or the
* https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
*/
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
/**
* @dev Performs a Solidity function call using a low level `call`. A
* plain `call` is an unsafe replacement for a function call: use this
* function instead.
*
* If `target` reverts with a revert reason, it is bubbled up by this
* function (like regular Solidity function calls).
*
* Returns the raw returned data. To convert to the expected return value,
* use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
*
* Requirements:
*
* - `target` must be a contract.
* - calling `target` with `data` must not revert.
*
* _Available since v3.1._
*/
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCall(target, data, "Address: low-level call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
* `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value
) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
/**
* @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
* with `errorMessage` as a fallback revert reason when `target` reverts.
*
* _Available since v3.1._
*/
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
require(isContract(target), "Address: call to non-contract");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a static call.
*
* _Available since v3.3._
*/
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
require(isContract(target), "Address: static call to non-contract");
(bool success, bytes memory returndata) = target.staticcall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
require(isContract(target), "Address: delegate call to non-contract");
(bool success, bytes memory returndata) = target.delegatecall(data);
return _verifyCallResult(success, returndata, errorMessage);
}
function _verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) private pure returns (bytes memory) {
if (success) {
return returndata;
} else {
// Look for revert reason and bubble it up if present
if (returndata.length > 0) {
// The easiest way to bubble the revert reason is using memory via assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
}
/**
* @title SafeERC20
* @dev Wrappers around ERC20 operations that throw on failure (when the token
* contract returns false). Tokens that return no value (and instead revert or
* throw on failure) are also supported, non-reverting calls are assumed to be
* successful.
* To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
* which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
*/
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @dev Deprecated. This function has issues similar to the ones found in
* {IERC20-approve}, and its usage is discouraged.
*
* Whenever possible, use {safeIncreaseAllowance} and
* {safeDecreaseAllowance} instead.
*/
function safeApprove(
IERC20 token,
address spender,
uint256 value
) internal {
// safeApprove should only be called when setting an initial allowance,
// or when resetting it to zero. To increase and decrease it, use
// 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
uint256 newAllowance = token.allowance(address(this), spender) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
}
/**
* @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
* on the return value: the return value is optional (but if data is returned, it must not be false).
* @param token The token targeted by the call.
* @param data The call data (encoded using abi.encode or one of its variants).
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
// We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
// we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
// the target address contains contract code and also asserts for success in the low-level call.
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
if (returndata.length > 0) {
// Return data is optional
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and make it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
// On the first call to nonReentrant, _notEntered will be true
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
_;
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
}
interface IThorusToken is IERC20 {
function mint(address account, uint256 amount) external;
}
contract ThorusMaster is Ownable, ReentrancyGuard {
using SafeERC20 for IERC20;
struct UserInfo {
uint256 amount;
uint256 rewardDebt;
uint256 pendingRewards;
}
struct PoolInfo {
IERC20 lpToken;
uint256 allocPoint;
uint256 lastRewardSecond;
uint256 accThorusPerShare;
uint256 lpSupply;
}
IThorusToken public immutable thorus;
uint256 public thorusPerSecond;
uint256 internal constant MAX_EMISSION_RATE = 20 ether;
PoolInfo[] public poolInfo;
mapping(uint256 => mapping(address => UserInfo)) public userInfo;
uint256 public totalAllocPoint = 0;
uint256 public immutable startSecond;
event Deposit(address indexed user, uint256 indexed pid, uint256 amount);
event Withdraw(address indexed user, uint256 indexed pid, uint256 amount);
event Claim(address indexed user, uint256 indexed pid, uint256 amount);
event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount);
event Add(uint256 allocPoint, IERC20 lpToken);
event Set(uint256 pid, uint256 oldAllocPoint, uint256 newAllocPoint);
event SetThorusPerSecond(uint256 oldThorusPerSecond, uint256 newThorusPerSecond);
constructor(
IThorusToken _thorus,
uint256 _thorusPerSecond,
uint256 _startSecond
) {
thorus = _thorus;
thorusPerSecond = _thorusPerSecond;
startSecond = _startSecond;
}
function poolLength() external view returns (uint256) {
return poolInfo.length;
}
function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) {
return _to - _from;
}
function add(uint256 _allocPoint, IERC20 _lpToken) external onlyOwner {
massUpdatePools();
uint256 lastRewardSecond = block.timestamp > startSecond
? block.timestamp
: startSecond;
totalAllocPoint = totalAllocPoint + _allocPoint;
poolInfo.push(
PoolInfo({
lpToken: _lpToken,
allocPoint: _allocPoint,
lastRewardSecond: lastRewardSecond,
accThorusPerShare: 0,
lpSupply: 0
})
);
emit Add(_allocPoint, _lpToken);
}
function set(uint256 _pid, uint256 _allocPoint) external onlyOwner {
emit Set(_pid, poolInfo[_pid].allocPoint, _allocPoint);
massUpdatePools();
totalAllocPoint = totalAllocPoint - poolInfo[_pid].allocPoint + _allocPoint;
poolInfo[_pid].allocPoint = _allocPoint;
}
function pendingThorus(uint256 _pid, address _user) external view returns (uint256) {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][_user];
uint256 accThorusPerShare = pool.accThorusPerShare;
if (block.timestamp > pool.lastRewardSecond && pool.lpSupply != 0 && totalAllocPoint > 0) {
uint256 multiplier = getMultiplier(pool.lastRewardSecond, block.timestamp);
uint256 thorusReward = multiplier * thorusPerSecond * pool.allocPoint / totalAllocPoint;
accThorusPerShare = accThorusPerShare + (thorusReward * 1e18 / pool.lpSupply);
}
return (user.amount * accThorusPerShare / 1e18) - user.rewardDebt + user.pendingRewards;
}
function massUpdatePools() public {
uint256 length = poolInfo.length;
for (uint256 pid = 0; pid < length; ++pid) {
updatePool(pid);
}
}
function updatePool(uint256 _pid) public {
PoolInfo storage pool = poolInfo[_pid];
if (block.timestamp <= pool.lastRewardSecond) {
return;
}
if (pool.lpSupply == 0) {
pool.lastRewardSecond = block.timestamp;
return;
}
uint256 multiplier = getMultiplier(pool.lastRewardSecond, block.timestamp);
uint256 thorusReward = multiplier * thorusPerSecond * pool.allocPoint / totalAllocPoint;
thorus.mint(address(this), thorusReward);
pool.accThorusPerShare = pool.accThorusPerShare + (thorusReward * 1e18 / pool.lpSupply);
pool.lastRewardSecond = block.timestamp;
}
function deposit(uint256 _pid, uint256 _amount, bool _withdrawRewards) external nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
updatePool(_pid);
if (user.amount > 0) {
uint256 pending = (user.amount * pool.accThorusPerShare / 1e18) - user.rewardDebt;
uint256 totalPending = user.pendingRewards + pending;
if (_withdrawRewards) {
user.pendingRewards = 0;
safeThorusTransfer(msg.sender, totalPending);
emit Claim(msg.sender, _pid, totalPending);
} else {
user.pendingRewards = totalPending;
}
}
if (_amount > 0) {
uint256 balanceBefore = pool.lpToken.balanceOf(address(this));
pool.lpToken.safeTransferFrom(msg.sender, address(this), _amount);
_amount = pool.lpToken.balanceOf(address(this)) - balanceBefore;
user.amount = user.amount + _amount;
pool.lpSupply = pool.lpSupply + _amount;
}
user.rewardDebt = user.amount * pool.accThorusPerShare / 1e18;
emit Deposit(msg.sender, _pid, _amount);
}
function withdraw(uint256 _pid, uint256 _amount, bool _withdrawRewards) external nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
require(user.amount >= _amount, "withdraw: not good");
updatePool(_pid);
uint256 pending = (user.amount * pool.accThorusPerShare / 1e18) - user.rewardDebt;
uint256 totalPending = user.pendingRewards + pending;
if (_withdrawRewards) {
user.pendingRewards = 0;
safeThorusTransfer(msg.sender, totalPending);
emit Claim(msg.sender, _pid, totalPending);
} else {
user.pendingRewards = totalPending;
}
if (_amount > 0) {
user.amount = user.amount - _amount;
pool.lpSupply = pool.lpSupply - _amount;
pool.lpToken.safeTransfer(msg.sender, _amount);
}
user.rewardDebt = user.amount * pool.accThorusPerShare / 1e18;
emit Withdraw(msg.sender, _pid, _amount);
}
function emergencyWithdraw(uint256 _pid) external nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
pool.lpToken.safeTransfer(msg.sender, user.amount);
pool.lpSupply = pool.lpSupply - user.amount;
emit EmergencyWithdraw(msg.sender, _pid, user.amount);
user.amount = 0;
user.rewardDebt = 0;
user.pendingRewards = 0;
}
function claim(uint256 _pid) external nonReentrant {
PoolInfo storage pool = poolInfo[_pid];
UserInfo storage user = userInfo[_pid][msg.sender];
updatePool(_pid);
uint256 pending = (user.amount * pool.accThorusPerShare / 1e18) - user.rewardDebt;
if (pending > 0 || user.pendingRewards > 0) {
user.pendingRewards = user.pendingRewards + pending;
safeThorusTransfer(msg.sender, user.pendingRewards);
emit Claim(msg.sender, _pid, user.pendingRewards);
user.pendingRewards = 0;
}
user.rewardDebt = user.amount * pool.accThorusPerShare / 1e18;
}
function safeThorusTransfer(address _to, uint256 _amount) internal {
uint256 thorusBal = thorus.balanceOf(address(this));
if (_amount > thorusBal) {
thorus.transfer(_to, thorusBal);
} else {
thorus.transfer(_to, _amount);
}
}
function setThorusPerSecond(uint256 _thorusPerSecond) external onlyOwner {
require(_thorusPerSecond > 0, "!thorusPerSecond-0");
require(_thorusPerSecond <= MAX_EMISSION_RATE, "!thorusPerSecond-MAX");
massUpdatePools();
emit SetThorusPerSecond(thorusPerSecond, _thorusPerSecond);
thorusPerSecond = _thorusPerSecond;
}
}

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"_thorus","internalType":"contract IThorusToken"},{"type":"uint256","name":"_thorusPerSecond","internalType":"uint256"},{"type":"uint256","name":"_startSecond","internalType":"uint256"}]},{"type":"event","name":"Add","inputs":[{"type":"uint256","name":"allocPoint","internalType":"uint256","indexed":false},{"type":"address","name":"lpToken","internalType":"contract IERC20","indexed":false}],"anonymous":false},{"type":"event","name":"Claim","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Deposit","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"EmergencyWithdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"previousOwner","internalType":"address","indexed":true},{"type":"address","name":"newOwner","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Set","inputs":[{"type":"uint256","name":"pid","internalType":"uint256","indexed":false},{"type":"uint256","name":"oldAllocPoint","internalType":"uint256","indexed":false},{"type":"uint256","name":"newAllocPoint","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"SetThorusPerSecond","inputs":[{"type":"uint256","name":"oldThorusPerSecond","internalType":"uint256","indexed":false},{"type":"uint256","name":"newThorusPerSecond","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Withdraw","inputs":[{"type":"address","name":"user","internalType":"address","indexed":true},{"type":"uint256","name":"pid","internalType":"uint256","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"add","inputs":[{"type":"uint256","name":"_allocPoint","internalType":"uint256"},{"type":"address","name":"_lpToken","internalType":"contract IERC20"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"claim","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deposit","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"bool","name":"_withdrawRewards","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"emergencyWithdraw","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"getMultiplier","inputs":[{"type":"uint256","name":"_from","internalType":"uint256"},{"type":"uint256","name":"_to","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"massUpdatePools","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"owner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"pendingThorus","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"address","name":"_user","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"lpToken","internalType":"contract IERC20"},{"type":"uint256","name":"allocPoint","internalType":"uint256"},{"type":"uint256","name":"lastRewardSecond","internalType":"uint256"},{"type":"uint256","name":"accThorusPerShare","internalType":"uint256"},{"type":"uint256","name":"lpSupply","internalType":"uint256"}],"name":"poolInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"poolLength","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"set","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_allocPoint","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setThorusPerSecond","inputs":[{"type":"uint256","name":"_thorusPerSecond","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startSecond","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IThorusToken"}],"name":"thorus","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"thorusPerSecond","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalAllocPoint","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newOwner","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"updatePool","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"amount","internalType":"uint256"},{"type":"uint256","name":"rewardDebt","internalType":"uint256"},{"type":"uint256","name":"pendingRewards","internalType":"uint256"}],"name":"userInfo","inputs":[{"type":"uint256","name":"","internalType":"uint256"},{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"withdraw","inputs":[{"type":"uint256","name":"_pid","internalType":"uint256"},{"type":"uint256","name":"_amount","internalType":"uint256"},{"type":"bool","name":"_withdrawRewards","internalType":"bool"}]}]
            

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061012c5760003560e01c806343a0d066116100ad5780636c916077116100715780636c916077146102e55780638da5cb5b146103155780638dbb1e3a1461033357806393f1a40b14610363578063f2fde38b146103955761012c565b806343a0d0661461026b578063486992081461028757806351eb05a6146102a35780635312ea8e146102bf578063630b5ba1146102db5761012c565b80631ab06ee5116100f45780631ab06ee5146101dd5780632b8bbbe8146101f957806333cfcd3b14610215578063366e39a614610231578063379607f51461024f5761012c565b8063027651a014610131578063081e3eda1461014f5780630cc3f6bd1461016d5780631526fe271461018b57806317caf6f1146101bf575b600080fd5b6101396103b1565b6040516101469190611eea565b60405180910390f35b6101576103d5565b6040516101649190611f1e565b60405180910390f35b6101756103e2565b6040516101829190611f1e565b60405180910390f35b6101a560048036038101906101a09190611f6a565b610406565b6040516101b6959493929190611fb8565b60405180910390f35b6101c761046c565b6040516101d49190611f1e565b60405180910390f35b6101f760048036038101906101f2919061200b565b610472565b005b610213600480360381019061020e919061209b565b6105c8565b005b61022f600480360381019061022a9190612113565b6107cc565b005b610239610ac1565b6040516102469190611f1e565b60405180910390f35b61026960048036038101906102649190611f6a565b610ac7565b005b61028560048036038101906102809190612113565b610caa565b005b6102a1600480360381019061029c9190611f6a565b6110b6565b005b6102bd60048036038101906102b89190611f6a565b61120e565b005b6102d960048036038101906102d49190611f6a565b611378565b005b6102e361152c565b005b6102ff60048036038101906102fa9190612192565b61155f565b60405161030c9190611f1e565b60405180910390f35b61031d6116cd565b60405161032a91906121e1565b60405180910390f35b61034d6004803603810190610348919061200b565b6116f6565b60405161035a9190611f1e565b60405180910390f35b61037d60048036038101906103789190612192565b61170c565b60405161038c939291906121fc565b60405180910390f35b6103af60048036038101906103aa9190612233565b611743565b005b7f000000000000000000000000ae4aa155d2987b454c29450ef4f862cf00907b6181565b6000600380549050905090565b7f0000000000000000000000000000000000000000000000000000000061e0bd0081565b6003818154811061041657600080fd5b90600052602060002090600502016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154908060040154905085565b60055481565b61047a61183b565b73ffffffffffffffffffffffffffffffffffffffff166104986116cd565b73ffffffffffffffffffffffffffffffffffffffff16146104ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104e5906122bd565b60405180910390fd5b7f0b21d5252af0bf3501a80676d626577e67cf86107154a76664b5b7994cc8fd8c8260038481548110610524576105236122dd565b5b90600052602060002090600502016001015483604051610546939291906121fc565b60405180910390a161055661152c565b806003838154811061056b5761056a6122dd565b5b90600052602060002090600502016001015460055461058a919061233b565b610594919061236f565b60058190555080600383815481106105af576105ae6122dd565b5b9060005260206000209060050201600101819055505050565b6105d061183b565b73ffffffffffffffffffffffffffffffffffffffff166105ee6116cd565b73ffffffffffffffffffffffffffffffffffffffff1614610644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063b906122bd565b60405180910390fd5b61064c61152c565b60007f0000000000000000000000000000000000000000000000000000000061e0bd00421161069b577f0000000000000000000000000000000000000000000000000000000061e0bd0061069d565b425b9050826005546106ad919061236f565b60058190555060036040518060a001604052808473ffffffffffffffffffffffffffffffffffffffff168152602001858152602001838152602001600081526020016000815250908060018154018082558091505060019003906000526020600020906005020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020155606082015181600301556080820151816004015550507f1c482cb20f653d55406cc8aa89ebf482b8603c0ffebcf7e6182ff8ac1849d12d83836040516107bf9291906123c5565b60405180910390a1505050565b60026001541415610812576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108099061243a565b60405180910390fd5b60026001819055506000600384815481106108305761082f6122dd565b5b9060005260206000209060050201905060006004600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905083816000015410156108db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d2906124a6565b60405180910390fd5b6108e48561120e565b60008160010154670de0b6b3a76400008460030154846000015461090891906124c6565b610912919061254f565b61091c919061233b565b90506000818360020154610930919061236f565b905084156109a0576000836002018190555061094c3382611843565b863373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf7836040516109939190611f1e565b60405180910390a36109aa565b8083600201819055505b6000861115610a33578583600001546109c3919061233b565b83600001819055508584600401546109db919061233b565b8460040181905550610a3233878660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a329092919063ffffffff16565b5b670de0b6b3a764000084600301548460000154610a5091906124c6565b610a5a919061254f565b8360010181905550863373ffffffffffffffffffffffffffffffffffffffff167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b56888604051610aa99190611f1e565b60405180910390a35050505060018081905550505050565b60025481565b60026001541415610b0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b049061243a565b60405180910390fd5b6002600181905550600060038281548110610b2b57610b2a6122dd565b5b9060005260206000209060050201905060006004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610b988361120e565b60008160010154670de0b6b3a764000084600301548460000154610bbc91906124c6565b610bc6919061254f565b610bd0919061233b565b90506000811180610be5575060008260020154115b15610c6e57808260020154610bfa919061236f565b8260020181905550610c10338360020154611843565b833373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf78460020154604051610c5b9190611f1e565b60405180910390a3600082600201819055505b670de0b6b3a764000083600301548360000154610c8b91906124c6565b610c95919061254f565b82600101819055505050506001808190555050565b60026001541415610cf0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce79061243a565b60405180910390fd5b6002600181905550600060038481548110610d0e57610d0d6122dd565b5b9060005260206000209060050201905060006004600086815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050610d7b8561120e565b600081600001541115610e515760008160010154670de0b6b3a764000084600301548460000154610dac91906124c6565b610db6919061254f565b610dc0919061233b565b90506000818360020154610dd4919061236f565b90508415610e445760008360020181905550610df03382611843565b863373ffffffffffffffffffffffffffffffffffffffff167f34fcbac0073d7c3d388e51312faf357774904998eeb8fca628b9e6f65ee1cbf783604051610e379190611f1e565b60405180910390a3610e4e565b8083600201819055505b50505b600084111561102a5760008260000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610eb991906121e1565b602060405180830381865afa158015610ed6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610efa9190612595565b9050610f4d3330878660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ab8909392919063ffffffff16565b808360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fab91906121e1565b602060405180830381865afa158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec9190612595565b610ff6919061233b565b9450848260000154611008919061236f565b8260000181905550848360040154611020919061236f565b8360040181905550505b670de0b6b3a76400008260030154826000015461104791906124c6565b611051919061254f565b8160010181905550843373ffffffffffffffffffffffffffffffffffffffff167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15866040516110a09190611f1e565b60405180910390a3505060018081905550505050565b6110be61183b565b73ffffffffffffffffffffffffffffffffffffffff166110dc6116cd565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906122bd565b60405180910390fd5b60008111611175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116c9061260e565b60405180910390fd5b6801158e460913d000008111156111c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b89061267a565b60405180910390fd5b6111c961152c565b7f1a2762a2753242723e84c9cee139867176ef18d734a840923a687537380d6581600254826040516111fc92919061269a565b60405180910390a18060028190555050565b600060038281548110611224576112236122dd565b5b90600052602060002090600502019050806002015442116112455750611375565b6000816004015414156112615742816002018190555050611375565b60006112718260020154426116f6565b9050600060055483600101546002548461128b91906124c6565b61129591906124c6565b61129f919061254f565b90507f000000000000000000000000ae4aa155d2987b454c29450ef4f862cf00907b6173ffffffffffffffffffffffffffffffffffffffff166340c10f1930836040518363ffffffff1660e01b81526004016112fc9291906126c3565b600060405180830381600087803b15801561131657600080fd5b505af115801561132a573d6000803e3d6000fd5b505050508260040154670de0b6b3a76400008261134791906124c6565b611351919061254f565b8360030154611360919061236f565b83600301819055504283600201819055505050505b50565b600260015414156113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061243a565b60405180910390fd5b60026001819055506000600382815481106113dc576113db6122dd565b5b9060005260206000209060050201905060006004600084815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506114933382600001548460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611a329092919063ffffffff16565b806000015482600401546114a7919061233b565b8260040181905550823373ffffffffffffffffffffffffffffffffffffffff167fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059583600001546040516114fa9190611f1e565b60405180910390a360008160000181905550600081600101819055506000816002018190555050506001808190555050565b6000600380549050905060005b8181101561155b5761154a8161120e565b80611554906126ec565b9050611539565b5050565b60008060038481548110611576576115756122dd565b5b9060005260206000209060050201905060006004600086815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000826003015490508260020154421180156115fb57506000836004015414155b801561160957506000600554115b1561168157600061161e8460020154426116f6565b9050600060055485600101546002548461163891906124c6565b61164291906124c6565b61164c919061254f565b90508460040154670de0b6b3a76400008261166791906124c6565b611671919061254f565b8361167c919061236f565b925050505b81600201548260010154670de0b6b3a76400008385600001546116a491906124c6565b6116ae919061254f565b6116b8919061233b565b6116c2919061236f565b935050505092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008282611704919061233b565b905092915050565b6004602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b61174b61183b565b73ffffffffffffffffffffffffffffffffffffffff166117696116cd565b73ffffffffffffffffffffffffffffffffffffffff16146117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b6906122bd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561182f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611826906127a7565b60405180910390fd5b61183881611b41565b50565b600033905090565b60007f000000000000000000000000ae4aa155d2987b454c29450ef4f862cf00907b6173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161189e91906121e1565b602060405180830381865afa1580156118bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118df9190612595565b90508082111561198d577f000000000000000000000000ae4aa155d2987b454c29450ef4f862cf00907b6173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b81526004016119449291906126c3565b6020604051808303816000875af1158015611963573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061198791906127dc565b50611a2d565b7f000000000000000000000000ae4aa155d2987b454c29450ef4f862cf00907b6173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b81526004016119e89291906126c3565b6020604051808303816000875af1158015611a07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a2b91906127dc565b505b505050565b611ab38363a9059cbb60e01b8484604051602401611a519291906126c3565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bfe565b505050565b611b3b846323b872dd60e01b858585604051602401611ad993929190612809565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611bfe565b50505050565b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000611c60826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611cc59092919063ffffffff16565b9050600081511115611cc05780806020019051810190611c8091906127dc565b611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb6906128b2565b60405180910390fd5b5b505050565b6060611cd48484600085611cdd565b90509392505050565b606082471015611d22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1990612944565b60405180910390fd5b611d2b85611df1565b611d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d61906129b0565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff168587604051611d939190612a4a565b60006040518083038185875af1925050503d8060008114611dd0576040519150601f19603f3d011682016040523d82523d6000602084013e611dd5565b606091505b5091509150611de5828286611e04565b92505050949350505050565b600080823b905060008111915050919050565b60608315611e1457829050611e64565b600083511115611e275782518084602001fd5b816040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5b9190612ab6565b60405180910390fd5b9392505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000611eb0611eab611ea684611e6b565b611e8b565b611e6b565b9050919050565b6000611ec282611e95565b9050919050565b6000611ed482611eb7565b9050919050565b611ee481611ec9565b82525050565b6000602082019050611eff6000830184611edb565b92915050565b6000819050919050565b611f1881611f05565b82525050565b6000602082019050611f336000830184611f0f565b92915050565b600080fd5b611f4781611f05565b8114611f5257600080fd5b50565b600081359050611f6481611f3e565b92915050565b600060208284031215611f8057611f7f611f39565b5b6000611f8e84828501611f55565b91505092915050565b6000611fa282611eb7565b9050919050565b611fb281611f97565b82525050565b600060a082019050611fcd6000830188611fa9565b611fda6020830187611f0f565b611fe76040830186611f0f565b611ff46060830185611f0f565b6120016080830184611f0f565b9695505050505050565b6000806040838503121561202257612021611f39565b5b600061203085828601611f55565b925050602061204185828601611f55565b9150509250929050565b600061205682611e6b565b9050919050565b60006120688261204b565b9050919050565b6120788161205d565b811461208357600080fd5b50565b6000813590506120958161206f565b92915050565b600080604083850312156120b2576120b1611f39565b5b60006120c085828601611f55565b92505060206120d185828601612086565b9150509250929050565b60008115159050919050565b6120f0816120db565b81146120fb57600080fd5b50565b60008135905061210d816120e7565b92915050565b60008060006060848603121561212c5761212b611f39565b5b600061213a86828701611f55565b935050602061214b86828701611f55565b925050604061215c868287016120fe565b9150509250925092565b61216f8161204b565b811461217a57600080fd5b50565b60008135905061218c81612166565b92915050565b600080604083850312156121a9576121a8611f39565b5b60006121b785828601611f55565b92505060206121c88582860161217d565b9150509250929050565b6121db8161204b565b82525050565b60006020820190506121f660008301846121d2565b92915050565b60006060820190506122116000830186611f0f565b61221e6020830185611f0f565b61222b6040830184611f0f565b949350505050565b60006020828403121561224957612248611f39565b5b60006122578482850161217d565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006122a7602083612260565b91506122b282612271565b602082019050919050565b600060208201905081810360008301526122d68161229a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061234682611f05565b915061235183611f05565b9250828210156123645761236361230c565b5b828203905092915050565b600061237a82611f05565b915061238583611f05565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156123ba576123b961230c565b5b828201905092915050565b60006040820190506123da6000830185611f0f565b6123e76020830184611fa9565b9392505050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000612424601f83612260565b915061242f826123ee565b602082019050919050565b6000602082019050818103600083015261245381612417565b9050919050565b7f77697468647261773a206e6f7420676f6f640000000000000000000000000000600082015250565b6000612490601283612260565b915061249b8261245a565b602082019050919050565b600060208201905081810360008301526124bf81612483565b9050919050565b60006124d182611f05565b91506124dc83611f05565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156125155761251461230c565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061255a82611f05565b915061256583611f05565b92508261257557612574612520565b5b828204905092915050565b60008151905061258f81611f3e565b92915050565b6000602082840312156125ab576125aa611f39565b5b60006125b984828501612580565b91505092915050565b7f2174686f7275735065725365636f6e642d300000000000000000000000000000600082015250565b60006125f8601283612260565b9150612603826125c2565b602082019050919050565b60006020820190508181036000830152612627816125eb565b9050919050565b7f2174686f7275735065725365636f6e642d4d4158000000000000000000000000600082015250565b6000612664601483612260565b915061266f8261262e565b602082019050919050565b6000602082019050818103600083015261269381612657565b9050919050565b60006040820190506126af6000830185611f0f565b6126bc6020830184611f0f565b9392505050565b60006040820190506126d860008301856121d2565b6126e56020830184611f0f565b9392505050565b60006126f782611f05565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561272a5761272961230c565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612791602683612260565b915061279c82612735565b604082019050919050565b600060208201905081810360008301526127c081612784565b9050919050565b6000815190506127d6816120e7565b92915050565b6000602082840312156127f2576127f1611f39565b5b6000612800848285016127c7565b91505092915050565b600060608201905061281e60008301866121d2565b61282b60208301856121d2565b6128386040830184611f0f565b949350505050565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b600061289c602a83612260565b91506128a782612840565b604082019050919050565b600060208201905081810360008301526128cb8161288f565b9050919050565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b600061292e602683612260565b9150612939826128d2565b604082019050919050565b6000602082019050818103600083015261295d81612921565b9050919050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b600061299a601d83612260565b91506129a582612964565b602082019050919050565b600060208201905081810360008301526129c98161298d565b9050919050565b600081519050919050565b600081905092915050565b60005b83811015612a045780820151818401526020810190506129e9565b83811115612a13576000848401525b50505050565b6000612a24826129d0565b612a2e81856129db565b9350612a3e8185602086016129e6565b80840191505092915050565b6000612a568284612a19565b915081905092915050565b600081519050919050565b6000601f19601f8301169050919050565b6000612a8882612a61565b612a928185612260565b9350612aa28185602086016129e6565b612aab81612a6c565b840191505092915050565b60006020820190508181036000830152612ad08184612a7d565b90509291505056fea2646970667358221220c41d8cbfd465a7a06f7bc9bf5d094ffc71df8f3d7083f17f1abc4965a87ab64464736f6c634300080a0033