More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 32,035 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20442967 | 144 days ago | IN | 0 ETH | 0.00033169 | ||||
Deposit | 20442939 | 144 days ago | IN | 0 ETH | 0.00020564 | ||||
Deposit | 18588503 | 404 days ago | IN | 0 ETH | 0.00175624 | ||||
Deposit | 17729511 | 524 days ago | IN | 0 ETH | 0.00262508 | ||||
Withdraw | 17556336 | 548 days ago | IN | 0 ETH | 0.00114461 | ||||
Deposit | 17556320 | 548 days ago | IN | 0 ETH | 0.00162389 | ||||
Withdraw | 12328473 | 1336 days ago | IN | 0 ETH | 0.00245857 | ||||
Deposit | 12222549 | 1352 days ago | IN | 0 ETH | 0.00658572 | ||||
Deposit | 12169309 | 1361 days ago | IN | 0 ETH | 0.01376415 | ||||
Withdraw | 12166376 | 1361 days ago | IN | 0 ETH | 0.00831053 | ||||
Withdraw | 12159825 | 1362 days ago | IN | 0 ETH | 0.01156056 | ||||
Deposit | 12158754 | 1362 days ago | IN | 0 ETH | 0.01497153 | ||||
Deposit | 12158723 | 1362 days ago | IN | 0 ETH | 0.0132812 | ||||
Withdraw | 12158706 | 1362 days ago | IN | 0 ETH | 0.01098748 | ||||
Withdraw | 12136094 | 1366 days ago | IN | 0 ETH | 0.01098748 | ||||
Withdraw Node Od... | 12121736 | 1368 days ago | IN | 0 ETH | 0.00819603 | ||||
Withdraw | 12121690 | 1368 days ago | IN | 0 ETH | 0.0076872 | ||||
Deposit | 12120912 | 1368 days ago | IN | 0 ETH | 0.01509062 | ||||
Deposit | 12112247 | 1369 days ago | IN | 0 ETH | 0.01444516 | ||||
Deposit | 12111894 | 1369 days ago | IN | 0 ETH | 0.01295191 | ||||
Withdraw | 12111702 | 1370 days ago | IN | 0 ETH | 0.0109626 | ||||
Withdraw | 12111633 | 1370 days ago | IN | 0 ETH | 0.0109626 | ||||
Withdraw | 12109760 | 1370 days ago | IN | 0 ETH | 0.01156056 | ||||
Withdraw | 12109648 | 1370 days ago | IN | 0 ETH | 0.0087912 | ||||
Deposit | 12109648 | 1370 days ago | IN | 0 ETH | 0.01693175 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ODSMiner
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-12-02 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @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); } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/utils/Address.sol pragma solidity ^0.6.0; /** * @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 in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.6.0; /** * @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.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' // 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: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @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. */ 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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/ODSMiner.sol pragma solidity ^0.6.0; contract ODSMiner is Ownable { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 public constant ODS_TOTAL_SUPPLY = 4200000; struct UserInfo { uint256 amount; uint256 rewardDebt; } struct PoolInfo { IERC20 lpToken; uint256 allocPoint; uint256 lastRewardBlock; uint256 accOdsPerShare; uint256 totalSupply; } uint256 public odsPerBlock; PoolInfo[] public poolInfo; mapping(uint256 => mapping(address => UserInfo)) public userInfo; uint256 public totalAllocPoint = 0; uint256 public startBlock; uint256 private constant ODS_PREMINE = 10000; uint256 public premineAmount = 0; uint256 private tokenDecimals = 0; IERC20 private token; uint256 private contributionShare; struct NodeInfo { bool active; bool superNode; uint256 lastRewardBlock; uint256 amount; uint256 superNodeRewardCount; uint256 nodeRewardCount; } address[] public nodeList; mapping(address => NodeInfo) public nodeInfo; uint256 superNodeCount = 0; uint256 nodeCount = 0; uint256 private rewardPreSuperNode = 10000; uint256 private rewardShareForSuperNodes = 10000; uint256 private rewardPreNode = 0; uint256 private rewardShareForNodes = 0; uint256 private constant rewardDurationForNodes = 5760; uint256 private constant maxRewardCount = 100; mapping(address => bool) private _operators; event Deposit(address indexed user, uint256 indexed pid, uint256 amount, uint256 poolAccOdsPerShare, uint256 pending, uint256 userAmount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, uint256 poolAccOdsPerShare, uint256 pending, uint256 userAmount); uint256 private unlocked = 1; modifier lock() { require(unlocked == 1, "LOCKED"); unlocked = 0; _; unlocked = 1; } modifier onlyOperator() { require(_operators[msg.sender], "Ownable: caller is not the operator"); _; } constructor( IERC20 _token, uint256 _odsPerBlock, uint256 _startBlock ) public { token = _token; tokenDecimals = 18; odsPerBlock = _odsPerBlock; startBlock = _startBlock; _operators[msg.sender] = true; rewardPreSuperNode = rewardPreSuperNode.mul(10**tokenDecimals).div( 10000 ); rewardShareForSuperNodes = rewardShareForSuperNodes .mul(10**tokenDecimals) .div(10000); rewardPreNode = rewardPreNode.mul(10**tokenDecimals).div(10000); rewardShareForNodes = rewardShareForNodes.mul(10**tokenDecimals).div( 10000 ); } function init(uint256 totalSupply) public payable onlyOwner { require( totalSupply == ODS_TOTAL_SUPPLY.mul(10**tokenDecimals), "wrong total supply for ODS" ); uint256 allowance = token.allowance(msg.sender, address(this)); require(allowance >= totalSupply, "check the token allowance"); premineAmount = ODS_PREMINE.mul(10**tokenDecimals); token.transferFrom(msg.sender, address(this), totalSupply); } function initNode(address[] memory nodes, bool[] memory superNode) public onlyOwner { require(nodes.length == superNode.length, "initNode: length mismatch"); for (uint256 i = 0; i < nodes.length; i++) { nodeList.push(nodes[i]); nodeInfo[nodes[i]] = NodeInfo({ active: true, superNode: superNode[i], lastRewardBlock: block.number > startBlock ? block.number : startBlock, amount: 0, superNodeRewardCount: 0, nodeRewardCount: 0 }); if (superNode[i]) { superNodeCount = superNodeCount.add(1); } else { nodeCount = nodeCount.add(1); } } } function add( uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accOdsPerShare: 0, totalSupply: 0 }) ); } function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } function getMultiplier(uint256 _from, uint256 _to) private pure returns (uint256) { return _to.sub(_from); } function pendingOds(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accOdsPerShare = pool.accOdsPerShare; uint256 lpSupply = pool.totalSupply; if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 odsReward = multiplier.mul(odsPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); accOdsPerShare = accOdsPerShare.add( odsReward.mul(1e12).div(lpSupply) ); } return user.amount.mul(accOdsPerShare).div(1e12).sub(user.rewardDebt); } 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.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.totalSupply; if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 odsReward = multiplier.mul(odsPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); pool.accOdsPerShare = pool.accOdsPerShare.add( odsReward.mul(1e12).div(lpSupply) ); pool.lastRewardBlock = block.number; } function deposit(uint256 _pid, uint256 _amount) public lock { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); uint256 pending = 0; if (user.amount > 0) { pending = user.amount.mul(pool.accOdsPerShare).div(1e12).sub( user.rewardDebt ); if (pending > 0) { safeOdsTransfer(msg.sender, pending); } } if (_amount > 0) { user.amount = user.amount.add(_amount); pool.totalSupply = pool.totalSupply.add(_amount); pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); } user.rewardDebt = user.amount.mul(pool.accOdsPerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount, pool.accOdsPerShare, pending, user.amount); } function withdraw(uint256 _pid, uint256 _amount) public lock { 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.mul(pool.accOdsPerShare).div(1e12).sub(user.rewardDebt); if (pending > 0) { safeOdsTransfer(msg.sender, pending); } if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.totalSupply = pool.totalSupply.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accOdsPerShare).div(1e12); emit Withdraw(msg.sender, _pid, _amount, pool.accOdsPerShare, pending, user.amount); } function setNodeReward( uint256 _rewardPreSuperNode, uint256 _rewardShareForSuperNodes, uint256 _rewardPreNode, uint256 _rewardShareForNodes ) public onlyOperator { require( _rewardPreSuperNode >= 0 && _rewardPreSuperNode <= 1000000, "rewardPreSuperNode is invalid" ); require( _rewardShareForSuperNodes >= 0 && _rewardShareForSuperNodes <= 1000000, "rewardShareForSuperNodes is invalid" ); require( _rewardPreNode >= 0 && _rewardPreNode <= 1000000, "rewardPreNode is invalid" ); require( _rewardShareForNodes >= 0 && _rewardShareForNodes <= 1000000, "rewardShareForNodes is invalid" ); require( _rewardPreSuperNode > 0 || _rewardShareForSuperNodes > 0 || _rewardPreNode > 0 || _rewardShareForSuperNodes > 0, "invalid set for node reward" ); massUpdateNodes(); if (_rewardPreSuperNode > 0) rewardPreSuperNode = _rewardPreSuperNode.mul(10**tokenDecimals).div( 10000 ); if (_rewardShareForSuperNodes > 0) rewardShareForSuperNodes = _rewardShareForSuperNodes .mul(10**tokenDecimals) .div(10000); if (_rewardPreNode > 0) rewardPreNode = _rewardPreNode.mul(10**tokenDecimals).div(10000); if (_rewardShareForNodes > 0) rewardShareForNodes = _rewardShareForNodes .mul(10**tokenDecimals) .div(10000); } function massUpdateNodes() private { for (uint256 i = 0; i < nodeList.length; i++) { updateNode(nodeList[i]); } } function updateNode(address _node) private { (uint256 amount, uint256 rewardBlocks) = nodeReward(_node); if (amount > 0) { NodeInfo storage node = nodeInfo[_node]; node.amount = node.amount.add(amount); node.lastRewardBlock = node.lastRewardBlock.add( rewardBlocks.mul(rewardDurationForNodes) ); if (node.superNode) { node.superNodeRewardCount = node.superNodeRewardCount.add( rewardBlocks ); } else { node.nodeRewardCount = node.nodeRewardCount.add(rewardBlocks); } } } function nodeReward(address _node) private view returns (uint256, uint256) { NodeInfo storage node = nodeInfo[_node]; if ( (node.superNode && node.superNodeRewardCount >= maxRewardCount) || (!node.superNode && node.nodeRewardCount >= maxRewardCount) || block.number < startBlock ) { return (0, 0); } uint256 rewardBlocks = block.number > node.lastRewardBlock ? (block.number - node.lastRewardBlock) / rewardDurationForNodes : 0; if (rewardBlocks == 0) { return (0, 0); } if ( node.superNode && node.superNodeRewardCount.add(rewardBlocks) > maxRewardCount ) { rewardBlocks = maxRewardCount.sub(node.superNodeRewardCount); } else if ( !node.superNode && node.nodeRewardCount.add(rewardBlocks) > maxRewardCount ) { rewardBlocks = maxRewardCount.sub(node.nodeRewardCount); } (uint256 _superNodeCount, uint256 _nodeCount) = nodeCountInfo(); // node reward uint256 rewardAmount = 0; if (node.superNode) { // super node reward rewardAmount = rewardBlocks.mul(rewardPreSuperNode); // super node share reward rewardAmount = rewardBlocks .mul(rewardShareForSuperNodes) .div(_superNodeCount) .add(rewardAmount); } else { // node reward rewardAmount = rewardBlocks.mul(rewardPreNode); // node share rewardAmount = rewardBlocks .mul(rewardShareForNodes) .div(_nodeCount) .add(rewardAmount); } return (rewardAmount, rewardBlocks); } function nodeCountInfo() public view returns (uint256 _superNodeCount, uint256 _nodeCount) { _superNodeCount = superNodeCount; _nodeCount = nodeCount; } function isNode() external view returns (bool, bool) { NodeInfo storage node = nodeInfo[msg.sender]; if (!node.active) { return (false, false); } return (true, node.superNode); } function pendingNodeOds() external view returns (uint256) { NodeInfo storage node = nodeInfo[msg.sender]; if (!node.active) { return 0; } (uint256 amount, ) = nodeReward(msg.sender); return node.amount.add(amount); } function withdrawNodeOds(uint256 _amount) public { NodeInfo storage node = nodeInfo[msg.sender]; require(node.active, "invalid node"); updateNode(msg.sender); require(nodeInfo[msg.sender].amount >= _amount, "not enough balance"); nodeInfo[msg.sender].amount = nodeInfo[msg.sender].amount.sub(_amount); safeOdsTransfer(address(msg.sender), _amount); } function addNodes(address account, bool superNode) public onlyOperator { NodeInfo storage node = nodeInfo[account]; require(!node.active, "node is activated"); massUpdateNodes(); if (node.lastRewardBlock > 0) { // exist in map nodeList.push(account); node.active = true; node.lastRewardBlock = block.number > startBlock ? block.number : startBlock; node.superNode = superNode; } else { nodeList.push(account); nodeInfo[account] = NodeInfo({ active: true, superNode: superNode, lastRewardBlock: block.number > startBlock ? block.number : startBlock, amount: 0, superNodeRewardCount: 0, nodeRewardCount: 0 }); } if (superNode) { superNodeCount = superNodeCount.add(1); } else { nodeCount = nodeCount.add(1); } } function removeNodes(address account) public onlyOperator { NodeInfo storage node = nodeInfo[account]; require(node.active, "node is not activated"); massUpdateNodes(); for (uint256 i = 0; i < nodeList.length; i++) { if (nodeList[i] == account) { nodeList[i] = nodeList[nodeList.length - 1]; nodeList.pop(); break; } } if (node.superNode) { superNodeCount = superNodeCount.sub(1); } else { nodeCount = nodeCount.sub(1); } node.active = false; if (node.amount > 0) { uint256 amount = node.amount; node.amount = 0; safeOdsTransfer(account, amount); } } function getNodeRewardSetting() public view returns ( uint256 _rewardPreSuperNode, uint256 _rewardShareForSuperNodes, uint256 _rewardPreNode, uint256 _rewardShareForNodes ) { _rewardPreSuperNode = rewardPreSuperNode; _rewardPreNode = rewardPreNode; _rewardShareForSuperNodes = rewardShareForSuperNodes; _rewardShareForNodes = rewardShareForNodes; } function withdrawPreMine(uint256 _amount) public onlyOperator { require(_amount >= 0, "amount is zero"); require(premineAmount >= _amount, "not enough balance"); premineAmount = premineAmount.sub(_amount); token.transfer(msg.sender, _amount); } function contributionAmount() public view returns (uint256) { uint256 blocks = block.number > startBlock ? block.number - startBlock : 0; return odsPerBlock.mul(blocks).sub(contributionShare); } function contributionWithdraw(uint256 amount) public onlyOperator { require(amount >= 0, "amount is zero"); require(contributionAmount() >= amount, "not enough balance"); contributionShare = contributionShare.add(amount); token.transfer(msg.sender, amount); } function safeOdsTransfer(address _to, uint256 _amount) internal { uint256 balance = token .balanceOf(address(this)) .sub(ODS_PREMINE.mul(10**tokenDecimals)) .div(2); if (_amount > balance) { token.transfer(msg.sender, balance); } else { token.transfer(_to, _amount); } } function addOperator(address account) public onlyOwner { require(account != address(0), "invalid address"); require(!_operators[account], "account is already operator"); _operators[account] = true; } function removeOperator(address account) public onlyOwner { require(account != address(0), "invalid address"); require(_operators[account], "account is not operator"); _operators[account] = false; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"uint256","name":"_odsPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolAccOdsPerShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pending","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"poolAccOdsPerShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"pending","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"ODS_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"superNode","type":"bool"}],"name":"addNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contributionAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"contributionWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getNodeRewardSetting","outputs":[{"internalType":"uint256","name":"_rewardPreSuperNode","type":"uint256"},{"internalType":"uint256","name":"_rewardShareForSuperNodes","type":"uint256"},{"internalType":"uint256","name":"_rewardPreNode","type":"uint256"},{"internalType":"uint256","name":"_rewardShareForNodes","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"name":"init","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"nodes","type":"address[]"},{"internalType":"bool[]","name":"superNode","type":"bool[]"}],"name":"initNode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isNode","outputs":[{"internalType":"bool","name":"","type":"bool"},{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nodeCountInfo","outputs":[{"internalType":"uint256","name":"_superNodeCount","type":"uint256"},{"internalType":"uint256","name":"_nodeCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nodeInfo","outputs":[{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"superNode","type":"bool"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"superNodeRewardCount","type":"uint256"},{"internalType":"uint256","name":"nodeRewardCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nodeList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"odsPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingNodeOds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingOds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accOdsPerShare","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"premineAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeNodes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPreSuperNode","type":"uint256"},{"internalType":"uint256","name":"_rewardShareForSuperNodes","type":"uint256"},{"internalType":"uint256","name":"_rewardPreNode","type":"uint256"},{"internalType":"uint256","name":"_rewardShareForNodes","type":"uint256"}],"name":"setNodeReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawNodeOds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawPreMine","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526000600455600060065560006007556000600c556000600d55612710600e55612710600f556000601055600060115560016013553480156200004557600080fd5b506040516200336138038062003361833981810160405260608110156200006b57600080fd5b5080516020820151604090920151909190600062000088620001ec565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600880546001600160a01b0319166001600160a01b0385161790556012600781815560018481556005849055336000908152602093845260409020805460ff1916909117905554600e54620001559261271092620001419291600a9190910a90620001f0811b6200254817901c565b6200025760201b620025a81790919060201c565b600e819055506200018361271062000141600754600a0a600f54620001f060201b620025481790919060201c565b600f81905550620001b161271062000141600754600a0a601054620001f060201b620025481790919060201c565b601081905550620001df61271062000141600754600a0a601154620001f060201b620025481790919060201c565b6011555062000348915050565b3390565b600082620002015750600062000251565b828202828482816200020f57fe5b04146200024e5760405162461bcd60e51b8152600401808060200182810382526021815260200180620033406021913960400191505060405180910390fd5b90505b92915050565b60006200024e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620002a160201b60201c565b60008183620003315760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015620002f5578181015183820152602001620002db565b50505050905090810190601f168015620003235780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385816200033e57fe5b0495945050505050565b612fe880620003586000396000f3fe6080604052600436106101f95760003560e01c80636f1bde501161010d578063a62bfc74116100a0578063c03994741161006f578063c039947414610823578063e2bbb1581461085e578063e9ff0a3f1461088e578063f2cc86f6146108c9578063f2fde38b146108de576101f9565b8063a62bfc7414610794578063ac8a584a146107a9578063af135236146107dc578063b7b0422d14610806576101f9565b80638652489e116100dc5780638652489e146106e55780638da5cb5b146106fa57806393f1a40b1461070f5780639870d7fe14610761576101f9565b80636f1bde5014610554578063715018a6146106885780637aec97091461069d5780638280f508146106b2576101f9565b8063441a3e70116101905780635fa0b65f1161015f5780635fa0b65f14610489578063630b5ba11461049e57806364482f79146104b357806364ecf753146104eb57806367a53be314610524576101f9565b8063441a3e70146103de57806348cd4cb11461040e57806351eb05a614610423578063568ff4971461044d576101f9565b80631eaaa045116101cc5780631eaaa045146102c5578063208f2a311461030657806323c2e2bc1461034c5780633fdc699e146103b4576101f9565b80630dc93285146101fe578063144f86c2146102255780631526fe271461025157806317caf6f1146102b0575b600080fd5b34801561020a57600080fd5b50610213610911565b60408051918252519081900360200190f35b34801561023157600080fd5b5061024f6004803603602081101561024857600080fd5b5035610917565b005b34801561025d57600080fd5b5061027b6004803603602081101561027457600080fd5b5035610a11565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156102bc57600080fd5b50610213610a59565b3480156102d157600080fd5b5061024f600480360360608110156102e857600080fd5b508035906001600160a01b0360208201351690604001351515610a5f565b34801561031257600080fd5b506103306004803603602081101561032957600080fd5b5035610c07565b604080516001600160a01b039092168252519081900360200190f35b34801561035857600080fd5b5061037f6004803603602081101561036f57600080fd5b50356001600160a01b0316610c2e565b6040805196151587529415156020870152858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156103c057600080fd5b5061024f600480360360208110156103d757600080fd5b5035610c65565b3480156103ea57600080fd5b5061024f6004803603604081101561040157600080fd5b5080359060200135610d92565b34801561041a57600080fd5b50610213610f6c565b34801561042f57600080fd5b5061024f6004803603602081101561044657600080fd5b5035610f72565b34801561045957600080fd5b5061024f6004803603608081101561047057600080fd5b508035906020810135906040810135906060013561102f565b34801561049557600080fd5b506102136112eb565b3480156104aa57600080fd5b5061024f611328565b3480156104bf57600080fd5b5061024f600480360360608110156104d657600080fd5b50803590602081013590604001351515611347565b3480156104f757600080fd5b506102136004803603604081101561050e57600080fd5b50803590602001356001600160a01b0316611418565b34801561053057600080fd5b50610539611512565b60408051921515835290151560208301528051918290030190f35b34801561056057600080fd5b5061024f6004803603604081101561057757600080fd5b81019060208101813564010000000081111561059257600080fd5b8201836020820111156105a457600080fd5b803590602001918460208302840111640100000000831117156105c657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561061657600080fd5b82018360208201111561062857600080fd5b8035906020019184602083028401116401000000008311171561064a57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061154e945050505050565b34801561069457600080fd5b5061024f61177b565b3480156106a957600080fd5b5061021361181d565b3480156106be57600080fd5b5061024f600480360360208110156106d557600080fd5b50356001600160a01b0316611823565b3480156106f157600080fd5b50610213611a1d565b34801561070657600080fd5b50610330611a24565b34801561071b57600080fd5b506107486004803603604081101561073257600080fd5b50803590602001356001600160a01b0316611a33565b6040805192835260208301919091528051918290030190f35b34801561076d57600080fd5b5061024f6004803603602081101561078457600080fd5b50356001600160a01b0316611a57565b3480156107a057600080fd5b50610748611b8e565b3480156107b557600080fd5b5061024f600480360360208110156107cc57600080fd5b50356001600160a01b0316611b98565b3480156107e857600080fd5b5061024f600480360360208110156107ff57600080fd5b5035611ccb565b61024f6004803603602081101561081c57600080fd5b5035611dce565b34801561082f57600080fd5b5061024f6004803603604081101561084657600080fd5b506001600160a01b0381351690602001351515611ffb565b34801561086a57600080fd5b5061024f6004803603604081101561088157600080fd5b508035906020013561226a565b34801561089a57600080fd5b506108a36123f6565b604080519485526020850193909352838301919091526060830152519081900360800190f35b3480156108d557600080fd5b50610213612409565b3480156108ea57600080fd5b5061024f6004803603602081101561090157600080fd5b50356001600160a01b0316612450565b60015481565b336000908152600b60205260409020805460ff1661096b576040805162461bcd60e51b815260206004820152600c60248201526b696e76616c6964206e6f646560a01b604482015290519081900360640190fd5b610974336125ea565b336000908152600b60205260409020600201548211156109d0576040805162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b604482015290519081900360640190fd5b336000908152600b60205260409020600201546109ed908361268e565b336000818152600b6020526040902060020191909155610a0d90836126d0565b5050565b60028181548110610a1e57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60045481565b610a67612888565b6000546001600160a01b03908116911614610ab7576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b8015610ac557610ac5611328565b60006005544311610ad857600554610ada565b435b600454909150610aea908561288c565b6004556040805160a0810182526001600160a01b039485168152602081019586529081019182526000606082018181526080830182815260028054600181018255935292517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590930292830180546001600160a01b031916919097161790955594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf86015590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad085015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad184015550517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad290910155565b600a8181548110610c1457fe5b6000918252602090912001546001600160a01b0316905081565b600b602052600090815260409020805460018201546002830154600384015460049094015460ff8085169561010090950416939086565b3360009081526012602052604090205460ff16610cb35760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b806006541015610cff576040805162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b604482015290519081900360640190fd5b600654610d0c908261268e565b6006556008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015610d6357600080fd5b505af1158015610d77573d6000803e3d6000fd5b505050506040513d6020811015610d8d57600080fd5b505050565b601354600114610dd2576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b600060138190556002805484908110610de757fe5b600091825260208083208684526003825260408085203386529092529220805460059092029092019250831115610e5a576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b610e6384610f72565b6000610e9d8260010154610e9764e8d4a51000610e918760030154876000015461254890919063ffffffff16565b906125a8565b9061268e565b90508015610eaf57610eaf33826126d0565b8315610eed578154610ec1908561268e565b82556004830154610ed2908561268e565b60048401558254610eed906001600160a01b031633866128e6565b60038301548254610f089164e8d4a5100091610e9191612548565b600183015560038301548254604080518781526020810193909352828101849052606083019190915251869133917fb7ee00edafdb5db3a1b52a5789a6b562eb48268842d113dbfe860b6f86e5f5959181900360800190a350506001601355505050565b60055481565b600060028281548110610f8157fe5b9060005260206000209060050201905080600201544311610fa2575061102c565b600481015480610fb957504360029091015561102c565b6000610fc9836002015443612938565b90506000610ff6600454610e918660010154610ff06001548761254890919063ffffffff16565b90612548565b905061101961100e84610e918464e8d4a51000612548565b60038601549061288c565b6003850155505043600290920191909155505b50565b3360009081526012602052604090205460ff1661107d5760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b620f42408411156110d5576040805162461bcd60e51b815260206004820152601d60248201527f72657761726450726553757065724e6f646520697320696e76616c6964000000604482015290519081900360640190fd5b620f42408311156111175760405162461bcd60e51b8152600401808060200182810382526023815260200180612f906023913960400191505060405180910390fd5b620f424082111561116f576040805162461bcd60e51b815260206004820152601860248201527f7265776172645072654e6f646520697320696e76616c69640000000000000000604482015290519081900360640190fd5b620f42408111156111c7576040805162461bcd60e51b815260206004820152601e60248201527f7265776172645368617265466f724e6f64657320697320696e76616c69640000604482015290519081900360640190fd5b60008411806111d65750600083115b806111e15750600082115b806111ec5750600083115b61123d576040805162461bcd60e51b815260206004820152601b60248201527f696e76616c69642073657420666f72206e6f6465207265776172640000000000604482015290519081900360640190fd5b611245612944565b831561126d57611269612710610e91600754600a0a8761254890919063ffffffff16565b600e555b821561129557611291612710610e91600754600a0a8661254890919063ffffffff16565b600f555b81156112bd576112b9612710610e91600754600a0a8561254890919063ffffffff16565b6010555b80156112e5576112e1612710610e91600754600a0a8461254890919063ffffffff16565b6011555b50505050565b60008060055443116112fe576000611304565b60055443035b9050611321600954610e978360015461254890919063ffffffff16565b9150505b90565b60025460005b81811015610a0d5761133f81610f72565b60010161132e565b61134f612888565b6000546001600160a01b0390811691161461139f576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b80156113ad576113ad611328565b6113ea826113e4600286815481106113c157fe5b90600052602060002090600502016001015460045461268e90919063ffffffff16565b9061288c565b60048190555081600284815481106113fe57fe5b906000526020600020906005020160010181905550505050565b6000806002848154811061142857fe5b60009182526020808320878452600380835260408086206001600160a01b038a168752909352919093206005909202909201918201546004830154600284015493945091929091904311801561147d57508015155b156114dd576000611492856002015443612938565b905060006114b9600454610e918860010154610ff06001548761254890919063ffffffff16565b90506114d86114d184610e918464e8d4a51000612548565b859061288c565b935050505b6115058360010154610e9764e8d4a51000610e9186886000015461254890919063ffffffff16565b9450505050505b92915050565b336000908152600b60205260408120805482919060ff1661153a57600080925092505061154a565b5460019250610100900460ff1690505b9091565b611556612888565b6000546001600160a01b039081169116146115a6576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b80518251146115fc576040805162461bcd60e51b815260206004820152601960248201527f696e69744e6f64653a206c656e677468206d69736d6174636800000000000000604482015290519081900360640190fd5b60005b8251811015610d8d57600a83828151811061161657fe5b6020908102919091018101518254600180820185556000948552938390200180546001600160a01b0319166001600160a01b039092169190911790556040805160c0810190915291825283519082019084908490811061167257fe5b602002602001015115158152602001600554431161169257600554611694565b435b815260200160008152602001600081526020016000815250600b60008584815181106116bc57fe5b6020908102919091018101516001600160a01b03168252818101929092526040908101600020835181549385015115156101000261ff001991151560ff1990951694909417169290921782558201516001820155606082015160028201556080820151600382015560a090910151600490910155815182908290811061173e57fe5b60200260200101511561176157600c5461175990600161288c565b600c55611773565b600d5461176f90600161288c565b600d555b6001016115ff565b611783612888565b6000546001600160a01b039081169116146117d3576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60065481565b3360009081526012602052604090205460ff166118715760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b6001600160a01b0381166000908152600b60205260409020805460ff166118d7576040805162461bcd60e51b81526020600482015260156024820152741b9bd919481a5cc81b9bdd081858dd1a5d985d1959605a1b604482015290519081900360640190fd5b6118df612944565b60005b600a548110156119be57826001600160a01b0316600a828154811061190357fe5b6000918252602090912001546001600160a01b031614156119b657600a8054600019810190811061193057fe5b600091825260209091200154600a80546001600160a01b03909216918390811061195657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600a80548061198f57fe5b600082815260209020810160001990810180546001600160a01b03191690550190556119be565b6001016118e2565b508054610100900460ff16156119e457600c546119dc90600161268e565b600c556119f6565b600d546119f290600161268e565b600d555b805460ff19168155600281015415610a0d576002810180546000909155610d8d83826126d0565b6240164081565b6000546001600160a01b031690565b60036020908152600092835260408084209091529082529020805460019091015482565b611a5f612888565b6000546001600160a01b03908116911614611aaf576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b6001600160a01b038116611afc576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b03811660009081526012602052604090205460ff1615611b6a576040805162461bcd60e51b815260206004820152601b60248201527f6163636f756e7420697320616c7265616479206f70657261746f720000000000604482015290519081900360640190fd5b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b600c54600d549091565b611ba0612888565b6000546001600160a01b03908116911614611bf0576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b6001600160a01b038116611c3d576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b03811660009081526012602052604090205460ff16611caa576040805162461bcd60e51b815260206004820152601760248201527f6163636f756e74206973206e6f74206f70657261746f72000000000000000000604482015290519081900360640190fd5b6001600160a01b03166000908152601260205260409020805460ff19169055565b3360009081526012602052604090205460ff16611d195760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b80611d226112eb565b1015611d6a576040805162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b604482015290519081900360640190fd5b600954611d77908261288c565b6009556008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015610d6357600080fd5b611dd6612888565b6000546001600160a01b03908116911614611e26576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b600754611e3a906240164090600a0a612548565b8114611e8d576040805162461bcd60e51b815260206004820152601a60248201527f77726f6e6720746f74616c20737570706c7920666f72204f4453000000000000604482015290519081900360640190fd5b60085460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d6020811015611f0857600080fd5b5051905081811015611f61576040805162461bcd60e51b815260206004820152601960248201527f636865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604482015290519081900360640190fd5b600754611f749061271090600a0a612548565b600655600854604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611fd157600080fd5b505af1158015611fe5573d6000803e3d6000fd5b505050506040513d60208110156112e557600080fd5b3360009081526012602052604090205460ff166120495760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b6001600160a01b0382166000908152600b60205260409020805460ff16156120ac576040805162461bcd60e51b81526020600482015260116024820152701b9bd919481a5cc81858dd1a5d985d1959607a1b604482015290519081900360640190fd5b6120b4612944565b60018101541561214157600a8054600180820183556000929092527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038616179055815460ff1916178155600554431161212457600554612126565b435b6001820155805461ff00191661010083151502178155612238565b600a8054600180820183556000929092527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0386161790556040805160c08101825291825283151560208301526005549082019043116121b7576005546121b9565b435b815260006020808301829052604080840183905260609384018390526001600160a01b0388168352600b825291829020845181549286015115156101000261ff001991151560ff1990941693909317169190911781559083015160018201559082015160028201556080820151600382015560a0909101516004909101555b811561225457600c5461224c90600161288c565b600c55610d8d565b600d5461226290600161288c565b600d55505050565b6013546001146122aa576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601381905560028054849081106122bf57fe5b600091825260208083208684526003825260408085203386529092529220600590910290910191506122f084610f72565b805460009015612338576123268260010154610e9764e8d4a51000610e918760030154876000015461254890919063ffffffff16565b905080156123385761233833826126d0565b831561237757815461234a908561288c565b8255600483015461235b908561288c565b60048401558254612377906001600160a01b0316333087612983565b600383015482546123929164e8d4a5100091610e9191612548565b600183015560038301548254604080518781526020810193909352828101849052606083019190915251869133917ff943cf10ef4d1e3239f4716ddecdf546e8ba8ab0e41deafd9a71a99936827e459181900360800190a350506001601355505050565b600e54601054600f546011549293909290565b336000908152600b60205260408120805460ff1661242b576000915050611325565b6000612436336129dd565b506002830154909150612449908261288c565b9250505090565b612458612888565b6000546001600160a01b039081169116146124a8576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b6001600160a01b0381166124ed5760405162461bcd60e51b8152600401808060200182810382526026815260200180612edc6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000826125575750600061150c565b8282028284828161256457fe5b04146125a15760405162461bcd60e51b8152600401808060200182810382526021815260200180612f026021913960400191505060405180910390fd5b9392505050565b60006125a183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ba4565b6000806125f6836129dd565b90925090508115610d8d576001600160a01b0383166000908152600b602052604090206002810154612628908461288c565b600282015561264761263c83611680612548565b60018301549061288c565b60018201558054610100900460ff161561267457600381015461266a908361288c565b60038201556112e5565b6004810154612683908361288c565b600482015550505050565b60006125a183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c46565b60006127716002610e916126f4600754600a0a61271061254890919063ffffffff16565b600854604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561273f57600080fd5b505afa158015612753573d6000803e3d6000fd5b505050506040513d602081101561276957600080fd5b50519061268e565b905080821115612801576008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156127cf57600080fd5b505af11580156127e3573d6000803e3d6000fd5b505050506040513d60208110156127f957600080fd5b50610d8d9050565b6008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561285757600080fd5b505af115801561286b573d6000803e3d6000fd5b505050506040513d602081101561288157600080fd5b5050505050565b3390565b6000828201838110156125a1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d8d908490612ca0565b60006125a1828461268e565b60005b600a5481101561102c5761297b600a828154811061296157fe5b6000918252602090912001546001600160a01b03166125ea565b600101612947565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526112e5908590612ca0565b6001600160a01b0381166000908152600b602052604081208054829190610100900460ff168015612a1357506064816003015410155b80612a3557508054610100900460ff16158015612a3557506064816004015410155b80612a41575060055443105b15612a53576000809250925050612b9f565b600081600101544311612a67576000612a7a565b6116808260010154430381612a7857fe5b045b905080612a8f57600080935093505050612b9f565b8154610100900460ff168015612ab457506003820154606490612ab2908361288c565b115b15612ad1576003820154612aca9060649061268e565b9050612b10565b8154610100900460ff16158015612af757506004820154606490612af5908361288c565b115b15612b10576004820154612b0d9060649061268e565b90505b600080612b1b611b8e565b85549193509150600090610100900460ff1615612b6657600e54612b40908590612548565b9050612b5f816113e485610e91600f548961254890919063ffffffff16565b9050612b96565b601054612b74908590612548565b9050612b93816113e484610e916011548961254890919063ffffffff16565b90505b95509193505050505b915091565b60008183612c305760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bf5578181015183820152602001612bdd565b50505050905090810190601f168015612c225780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c3c57fe5b0495945050505050565b60008184841115612c985760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bf5578181015183820152602001612bdd565b505050900390565b6060612cf5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d519092919063ffffffff16565b805190915015610d8d57808060200190516020811015612d1457600080fd5b5051610d8d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612f43602a913960400191505060405180910390fd5b6060612d608484600085612d68565b949350505050565b6060612d7385612ed5565b612dc4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612e035780518252601f199092019160209182019101612de4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612e65576040519150601f19603f3d011682016040523d82523d6000602084013e612e6a565b606091505b50915091508115612e7e579150612d609050565b805115612e8e5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612bf5578181015183820152602001612bdd565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a2063616c6c6572206973206e6f7420746865206f70657261746f727265776172645368617265466f7253757065724e6f64657320697320696e76616c6964a264697066735822122047e06ad6f13db450a5ace4789145ce62dbc91b89d12308d8e22d11b4ef276b4564736f6c634300060c0033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f770000000000000000000000005b5a48d22da47773716d750a91bd7d53a91bd2400000000000000000000000000000000000000000000000000040c3549bb7d2aa0000000000000000000000000000000000000000000000000000000000ad9fc8
Deployed Bytecode
0x6080604052600436106101f95760003560e01c80636f1bde501161010d578063a62bfc74116100a0578063c03994741161006f578063c039947414610823578063e2bbb1581461085e578063e9ff0a3f1461088e578063f2cc86f6146108c9578063f2fde38b146108de576101f9565b8063a62bfc7414610794578063ac8a584a146107a9578063af135236146107dc578063b7b0422d14610806576101f9565b80638652489e116100dc5780638652489e146106e55780638da5cb5b146106fa57806393f1a40b1461070f5780639870d7fe14610761576101f9565b80636f1bde5014610554578063715018a6146106885780637aec97091461069d5780638280f508146106b2576101f9565b8063441a3e70116101905780635fa0b65f1161015f5780635fa0b65f14610489578063630b5ba11461049e57806364482f79146104b357806364ecf753146104eb57806367a53be314610524576101f9565b8063441a3e70146103de57806348cd4cb11461040e57806351eb05a614610423578063568ff4971461044d576101f9565b80631eaaa045116101cc5780631eaaa045146102c5578063208f2a311461030657806323c2e2bc1461034c5780633fdc699e146103b4576101f9565b80630dc93285146101fe578063144f86c2146102255780631526fe271461025157806317caf6f1146102b0575b600080fd5b34801561020a57600080fd5b50610213610911565b60408051918252519081900360200190f35b34801561023157600080fd5b5061024f6004803603602081101561024857600080fd5b5035610917565b005b34801561025d57600080fd5b5061027b6004803603602081101561027457600080fd5b5035610a11565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b3480156102bc57600080fd5b50610213610a59565b3480156102d157600080fd5b5061024f600480360360608110156102e857600080fd5b508035906001600160a01b0360208201351690604001351515610a5f565b34801561031257600080fd5b506103306004803603602081101561032957600080fd5b5035610c07565b604080516001600160a01b039092168252519081900360200190f35b34801561035857600080fd5b5061037f6004803603602081101561036f57600080fd5b50356001600160a01b0316610c2e565b6040805196151587529415156020870152858501939093526060850191909152608084015260a0830152519081900360c00190f35b3480156103c057600080fd5b5061024f600480360360208110156103d757600080fd5b5035610c65565b3480156103ea57600080fd5b5061024f6004803603604081101561040157600080fd5b5080359060200135610d92565b34801561041a57600080fd5b50610213610f6c565b34801561042f57600080fd5b5061024f6004803603602081101561044657600080fd5b5035610f72565b34801561045957600080fd5b5061024f6004803603608081101561047057600080fd5b508035906020810135906040810135906060013561102f565b34801561049557600080fd5b506102136112eb565b3480156104aa57600080fd5b5061024f611328565b3480156104bf57600080fd5b5061024f600480360360608110156104d657600080fd5b50803590602081013590604001351515611347565b3480156104f757600080fd5b506102136004803603604081101561050e57600080fd5b50803590602001356001600160a01b0316611418565b34801561053057600080fd5b50610539611512565b60408051921515835290151560208301528051918290030190f35b34801561056057600080fd5b5061024f6004803603604081101561057757600080fd5b81019060208101813564010000000081111561059257600080fd5b8201836020820111156105a457600080fd5b803590602001918460208302840111640100000000831117156105c657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561061657600080fd5b82018360208201111561062857600080fd5b8035906020019184602083028401116401000000008311171561064a57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061154e945050505050565b34801561069457600080fd5b5061024f61177b565b3480156106a957600080fd5b5061021361181d565b3480156106be57600080fd5b5061024f600480360360208110156106d557600080fd5b50356001600160a01b0316611823565b3480156106f157600080fd5b50610213611a1d565b34801561070657600080fd5b50610330611a24565b34801561071b57600080fd5b506107486004803603604081101561073257600080fd5b50803590602001356001600160a01b0316611a33565b6040805192835260208301919091528051918290030190f35b34801561076d57600080fd5b5061024f6004803603602081101561078457600080fd5b50356001600160a01b0316611a57565b3480156107a057600080fd5b50610748611b8e565b3480156107b557600080fd5b5061024f600480360360208110156107cc57600080fd5b50356001600160a01b0316611b98565b3480156107e857600080fd5b5061024f600480360360208110156107ff57600080fd5b5035611ccb565b61024f6004803603602081101561081c57600080fd5b5035611dce565b34801561082f57600080fd5b5061024f6004803603604081101561084657600080fd5b506001600160a01b0381351690602001351515611ffb565b34801561086a57600080fd5b5061024f6004803603604081101561088157600080fd5b508035906020013561226a565b34801561089a57600080fd5b506108a36123f6565b604080519485526020850193909352838301919091526060830152519081900360800190f35b3480156108d557600080fd5b50610213612409565b3480156108ea57600080fd5b5061024f6004803603602081101561090157600080fd5b50356001600160a01b0316612450565b60015481565b336000908152600b60205260409020805460ff1661096b576040805162461bcd60e51b815260206004820152600c60248201526b696e76616c6964206e6f646560a01b604482015290519081900360640190fd5b610974336125ea565b336000908152600b60205260409020600201548211156109d0576040805162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b604482015290519081900360640190fd5b336000908152600b60205260409020600201546109ed908361268e565b336000818152600b6020526040902060020191909155610a0d90836126d0565b5050565b60028181548110610a1e57fe5b6000918252602090912060059091020180546001820154600283015460038401546004909401546001600160a01b0390931694509092909185565b60045481565b610a67612888565b6000546001600160a01b03908116911614610ab7576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b8015610ac557610ac5611328565b60006005544311610ad857600554610ada565b435b600454909150610aea908561288c565b6004556040805160a0810182526001600160a01b039485168152602081019586529081019182526000606082018181526080830182815260028054600181018255935292517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace600590930292830180546001600160a01b031916919097161790955594517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5acf86015590517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad085015591517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad184015550517f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ad290910155565b600a8181548110610c1457fe5b6000918252602090912001546001600160a01b0316905081565b600b602052600090815260409020805460018201546002830154600384015460049094015460ff8085169561010090950416939086565b3360009081526012602052604090205460ff16610cb35760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b806006541015610cff576040805162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b604482015290519081900360640190fd5b600654610d0c908261268e565b6006556008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015610d6357600080fd5b505af1158015610d77573d6000803e3d6000fd5b505050506040513d6020811015610d8d57600080fd5b505050565b601354600114610dd2576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b600060138190556002805484908110610de757fe5b600091825260208083208684526003825260408085203386529092529220805460059092029092019250831115610e5a576040805162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b604482015290519081900360640190fd5b610e6384610f72565b6000610e9d8260010154610e9764e8d4a51000610e918760030154876000015461254890919063ffffffff16565b906125a8565b9061268e565b90508015610eaf57610eaf33826126d0565b8315610eed578154610ec1908561268e565b82556004830154610ed2908561268e565b60048401558254610eed906001600160a01b031633866128e6565b60038301548254610f089164e8d4a5100091610e9191612548565b600183015560038301548254604080518781526020810193909352828101849052606083019190915251869133917fb7ee00edafdb5db3a1b52a5789a6b562eb48268842d113dbfe860b6f86e5f5959181900360800190a350506001601355505050565b60055481565b600060028281548110610f8157fe5b9060005260206000209060050201905080600201544311610fa2575061102c565b600481015480610fb957504360029091015561102c565b6000610fc9836002015443612938565b90506000610ff6600454610e918660010154610ff06001548761254890919063ffffffff16565b90612548565b905061101961100e84610e918464e8d4a51000612548565b60038601549061288c565b6003850155505043600290920191909155505b50565b3360009081526012602052604090205460ff1661107d5760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b620f42408411156110d5576040805162461bcd60e51b815260206004820152601d60248201527f72657761726450726553757065724e6f646520697320696e76616c6964000000604482015290519081900360640190fd5b620f42408311156111175760405162461bcd60e51b8152600401808060200182810382526023815260200180612f906023913960400191505060405180910390fd5b620f424082111561116f576040805162461bcd60e51b815260206004820152601860248201527f7265776172645072654e6f646520697320696e76616c69640000000000000000604482015290519081900360640190fd5b620f42408111156111c7576040805162461bcd60e51b815260206004820152601e60248201527f7265776172645368617265466f724e6f64657320697320696e76616c69640000604482015290519081900360640190fd5b60008411806111d65750600083115b806111e15750600082115b806111ec5750600083115b61123d576040805162461bcd60e51b815260206004820152601b60248201527f696e76616c69642073657420666f72206e6f6465207265776172640000000000604482015290519081900360640190fd5b611245612944565b831561126d57611269612710610e91600754600a0a8761254890919063ffffffff16565b600e555b821561129557611291612710610e91600754600a0a8661254890919063ffffffff16565b600f555b81156112bd576112b9612710610e91600754600a0a8561254890919063ffffffff16565b6010555b80156112e5576112e1612710610e91600754600a0a8461254890919063ffffffff16565b6011555b50505050565b60008060055443116112fe576000611304565b60055443035b9050611321600954610e978360015461254890919063ffffffff16565b9150505b90565b60025460005b81811015610a0d5761133f81610f72565b60010161132e565b61134f612888565b6000546001600160a01b0390811691161461139f576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b80156113ad576113ad611328565b6113ea826113e4600286815481106113c157fe5b90600052602060002090600502016001015460045461268e90919063ffffffff16565b9061288c565b60048190555081600284815481106113fe57fe5b906000526020600020906005020160010181905550505050565b6000806002848154811061142857fe5b60009182526020808320878452600380835260408086206001600160a01b038a168752909352919093206005909202909201918201546004830154600284015493945091929091904311801561147d57508015155b156114dd576000611492856002015443612938565b905060006114b9600454610e918860010154610ff06001548761254890919063ffffffff16565b90506114d86114d184610e918464e8d4a51000612548565b859061288c565b935050505b6115058360010154610e9764e8d4a51000610e9186886000015461254890919063ffffffff16565b9450505050505b92915050565b336000908152600b60205260408120805482919060ff1661153a57600080925092505061154a565b5460019250610100900460ff1690505b9091565b611556612888565b6000546001600160a01b039081169116146115a6576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b80518251146115fc576040805162461bcd60e51b815260206004820152601960248201527f696e69744e6f64653a206c656e677468206d69736d6174636800000000000000604482015290519081900360640190fd5b60005b8251811015610d8d57600a83828151811061161657fe5b6020908102919091018101518254600180820185556000948552938390200180546001600160a01b0319166001600160a01b039092169190911790556040805160c0810190915291825283519082019084908490811061167257fe5b602002602001015115158152602001600554431161169257600554611694565b435b815260200160008152602001600081526020016000815250600b60008584815181106116bc57fe5b6020908102919091018101516001600160a01b03168252818101929092526040908101600020835181549385015115156101000261ff001991151560ff1990951694909417169290921782558201516001820155606082015160028201556080820151600382015560a090910151600490910155815182908290811061173e57fe5b60200260200101511561176157600c5461175990600161288c565b600c55611773565b600d5461176f90600161288c565b600d555b6001016115ff565b611783612888565b6000546001600160a01b039081169116146117d3576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60065481565b3360009081526012602052604090205460ff166118715760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b6001600160a01b0381166000908152600b60205260409020805460ff166118d7576040805162461bcd60e51b81526020600482015260156024820152741b9bd919481a5cc81b9bdd081858dd1a5d985d1959605a1b604482015290519081900360640190fd5b6118df612944565b60005b600a548110156119be57826001600160a01b0316600a828154811061190357fe5b6000918252602090912001546001600160a01b031614156119b657600a8054600019810190811061193057fe5b600091825260209091200154600a80546001600160a01b03909216918390811061195657fe5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600a80548061198f57fe5b600082815260209020810160001990810180546001600160a01b03191690550190556119be565b6001016118e2565b508054610100900460ff16156119e457600c546119dc90600161268e565b600c556119f6565b600d546119f290600161268e565b600d555b805460ff19168155600281015415610a0d576002810180546000909155610d8d83826126d0565b6240164081565b6000546001600160a01b031690565b60036020908152600092835260408084209091529082529020805460019091015482565b611a5f612888565b6000546001600160a01b03908116911614611aaf576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b6001600160a01b038116611afc576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b03811660009081526012602052604090205460ff1615611b6a576040805162461bcd60e51b815260206004820152601b60248201527f6163636f756e7420697320616c7265616479206f70657261746f720000000000604482015290519081900360640190fd5b6001600160a01b03166000908152601260205260409020805460ff19166001179055565b600c54600d549091565b611ba0612888565b6000546001600160a01b03908116911614611bf0576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b6001600160a01b038116611c3d576040805162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b604482015290519081900360640190fd5b6001600160a01b03811660009081526012602052604090205460ff16611caa576040805162461bcd60e51b815260206004820152601760248201527f6163636f756e74206973206e6f74206f70657261746f72000000000000000000604482015290519081900360640190fd5b6001600160a01b03166000908152601260205260409020805460ff19169055565b3360009081526012602052604090205460ff16611d195760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b80611d226112eb565b1015611d6a576040805162461bcd60e51b81526020600482015260126024820152716e6f7420656e6f7567682062616c616e636560701b604482015290519081900360640190fd5b600954611d77908261288c565b6009556008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b158015610d6357600080fd5b611dd6612888565b6000546001600160a01b03908116911614611e26576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b600754611e3a906240164090600a0a612548565b8114611e8d576040805162461bcd60e51b815260206004820152601a60248201527f77726f6e6720746f74616c20737570706c7920666f72204f4453000000000000604482015290519081900360640190fd5b60085460408051636eb1769f60e11b815233600482015230602482015290516000926001600160a01b03169163dd62ed3e916044808301926020929190829003018186803b158015611ede57600080fd5b505afa158015611ef2573d6000803e3d6000fd5b505050506040513d6020811015611f0857600080fd5b5051905081811015611f61576040805162461bcd60e51b815260206004820152601960248201527f636865636b2074686520746f6b656e20616c6c6f77616e636500000000000000604482015290519081900360640190fd5b600754611f749061271090600a0a612548565b600655600854604080516323b872dd60e01b81523360048201523060248201526044810185905290516001600160a01b03909216916323b872dd916064808201926020929091908290030181600087803b158015611fd157600080fd5b505af1158015611fe5573d6000803e3d6000fd5b505050506040513d60208110156112e557600080fd5b3360009081526012602052604090205460ff166120495760405162461bcd60e51b8152600401808060200182810382526023815260200180612f6d6023913960400191505060405180910390fd5b6001600160a01b0382166000908152600b60205260409020805460ff16156120ac576040805162461bcd60e51b81526020600482015260116024820152701b9bd919481a5cc81858dd1a5d985d1959607a1b604482015290519081900360640190fd5b6120b4612944565b60018101541561214157600a8054600180820183556000929092527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b038616179055815460ff1916178155600554431161212457600554612126565b435b6001820155805461ff00191661010083151502178155612238565b600a8054600180820183556000929092527fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a80180546001600160a01b0319166001600160a01b0386161790556040805160c08101825291825283151560208301526005549082019043116121b7576005546121b9565b435b815260006020808301829052604080840183905260609384018390526001600160a01b0388168352600b825291829020845181549286015115156101000261ff001991151560ff1990941693909317169190911781559083015160018201559082015160028201556080820151600382015560a0909101516004909101555b811561225457600c5461224c90600161288c565b600c55610d8d565b600d5461226290600161288c565b600d55505050565b6013546001146122aa576040805162461bcd60e51b81526020600482015260066024820152651313d0d2d15160d21b604482015290519081900360640190fd5b6000601381905560028054849081106122bf57fe5b600091825260208083208684526003825260408085203386529092529220600590910290910191506122f084610f72565b805460009015612338576123268260010154610e9764e8d4a51000610e918760030154876000015461254890919063ffffffff16565b905080156123385761233833826126d0565b831561237757815461234a908561288c565b8255600483015461235b908561288c565b60048401558254612377906001600160a01b0316333087612983565b600383015482546123929164e8d4a5100091610e9191612548565b600183015560038301548254604080518781526020810193909352828101849052606083019190915251869133917ff943cf10ef4d1e3239f4716ddecdf546e8ba8ab0e41deafd9a71a99936827e459181900360800190a350506001601355505050565b600e54601054600f546011549293909290565b336000908152600b60205260408120805460ff1661242b576000915050611325565b6000612436336129dd565b506002830154909150612449908261288c565b9250505090565b612458612888565b6000546001600160a01b039081169116146124a8576040805162461bcd60e51b81526020600482018190526024820152600080516020612f23833981519152604482015290519081900360640190fd5b6001600160a01b0381166124ed5760405162461bcd60e51b8152600401808060200182810382526026815260200180612edc6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000826125575750600061150c565b8282028284828161256457fe5b04146125a15760405162461bcd60e51b8152600401808060200182810382526021815260200180612f026021913960400191505060405180910390fd5b9392505050565b60006125a183836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612ba4565b6000806125f6836129dd565b90925090508115610d8d576001600160a01b0383166000908152600b602052604090206002810154612628908461288c565b600282015561264761263c83611680612548565b60018301549061288c565b60018201558054610100900460ff161561267457600381015461266a908361288c565b60038201556112e5565b6004810154612683908361288c565b600482015550505050565b60006125a183836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612c46565b60006127716002610e916126f4600754600a0a61271061254890919063ffffffff16565b600854604080516370a0823160e01b815230600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b15801561273f57600080fd5b505afa158015612753573d6000803e3d6000fd5b505050506040513d602081101561276957600080fd5b50519061268e565b905080821115612801576008546040805163a9059cbb60e01b81523360048201526024810184905290516001600160a01b039092169163a9059cbb916044808201926020929091908290030181600087803b1580156127cf57600080fd5b505af11580156127e3573d6000803e3d6000fd5b505050506040513d60208110156127f957600080fd5b50610d8d9050565b6008546040805163a9059cbb60e01b81526001600160a01b038681166004830152602482018690529151919092169163a9059cbb9160448083019260209291908290030181600087803b15801561285757600080fd5b505af115801561286b573d6000803e3d6000fd5b505050506040513d602081101561288157600080fd5b5050505050565b3390565b6000828201838110156125a1576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610d8d908490612ca0565b60006125a1828461268e565b60005b600a5481101561102c5761297b600a828154811061296157fe5b6000918252602090912001546001600160a01b03166125ea565b600101612947565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b1790526112e5908590612ca0565b6001600160a01b0381166000908152600b602052604081208054829190610100900460ff168015612a1357506064816003015410155b80612a3557508054610100900460ff16158015612a3557506064816004015410155b80612a41575060055443105b15612a53576000809250925050612b9f565b600081600101544311612a67576000612a7a565b6116808260010154430381612a7857fe5b045b905080612a8f57600080935093505050612b9f565b8154610100900460ff168015612ab457506003820154606490612ab2908361288c565b115b15612ad1576003820154612aca9060649061268e565b9050612b10565b8154610100900460ff16158015612af757506004820154606490612af5908361288c565b115b15612b10576004820154612b0d9060649061268e565b90505b600080612b1b611b8e565b85549193509150600090610100900460ff1615612b6657600e54612b40908590612548565b9050612b5f816113e485610e91600f548961254890919063ffffffff16565b9050612b96565b601054612b74908590612548565b9050612b93816113e484610e916011548961254890919063ffffffff16565b90505b95509193505050505b915091565b60008183612c305760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612bf5578181015183820152602001612bdd565b50505050905090810190601f168015612c225780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c3c57fe5b0495945050505050565b60008184841115612c985760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315612bf5578181015183820152602001612bdd565b505050900390565b6060612cf5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612d519092919063ffffffff16565b805190915015610d8d57808060200190516020811015612d1457600080fd5b5051610d8d5760405162461bcd60e51b815260040180806020018281038252602a815260200180612f43602a913960400191505060405180910390fd5b6060612d608484600085612d68565b949350505050565b6060612d7385612ed5565b612dc4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612e035780518252601f199092019160209182019101612de4565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612e65576040519150601f19603f3d011682016040523d82523d6000602084013e612e6a565b606091505b50915091508115612e7e579150612d609050565b805115612e8e5780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315612bf5578181015183820152602001612bdd565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f774f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565644f776e61626c653a2063616c6c6572206973206e6f7420746865206f70657261746f727265776172645368617265466f7253757065724e6f64657320697320696e76616c6964a264697066735822122047e06ad6f13db450a5ace4789145ce62dbc91b89d12308d8e22d11b4ef276b4564736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005b5a48d22da47773716d750a91bd7d53a91bd2400000000000000000000000000000000000000000000000000040c3549bb7d2aa0000000000000000000000000000000000000000000000000000000000ad9fc8
-----Decoded View---------------
Arg [0] : _token (address): 0x5b5a48d22Da47773716D750a91Bd7D53a91BD240
Arg [1] : _odsPerBlock (uint256): 18229166666666666
Arg [2] : _startBlock (uint256): 11378632
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000005b5a48d22da47773716d750a91bd7d53a91bd240
Arg [1] : 0000000000000000000000000000000000000000000000000040c3549bb7d2aa
Arg [2] : 0000000000000000000000000000000000000000000000000000000000ad9fc8
Deployed Bytecode Sourcemap
21317:18972:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21749:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;35677:419;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35677:419:0;;:::i;:::-;;21784:26;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21784:26:0;;:::i;:::-;;;;-1:-1:-1;;;;;21784:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21892:34;;;;;;;;;;;;;:::i;25573:636::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25573:636:0;;;-1:-1:-1;;;;;25573:636:0;;;;;;;;;;;;:::i;22383:25::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22383:25:0;;:::i;:::-;;;;-1:-1:-1;;;;;22383:25:0;;;;;;;;;;;;;;22415:44;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22415:44:0;-1:-1:-1;;;;;22415:44:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38531:289;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38531:289:0;;:::i;29546:869::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29546:869:0;;;;;;;:::i;21935:25::-;;;;;;;;;;;;;:::i;27812:728::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27812:728:0;;:::i;30423:1727::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30423:1727:0;;;;;;;;;;;;;;;;;:::i;38828:232::-;;;;;;;;;;;;;:::i;27624:180::-;;;;;;;;;;;;;:::i;26217:362::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26217:362:0;;;;;;;;;;;;;;:::i;26749:867::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26749:867:0;;;;;;-1:-1:-1;;;;;26749:867:0;;:::i;35140:236::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;24716:849;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24716:849:0;;;;;;;;-1:-1:-1;24716:849:0;;-1:-1:-1;;24716:849:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24716:849:0;;-1:-1:-1;24716:849:0;;-1:-1:-1;;;;;24716:849:0:i;20693:148::-;;;;;;;;;;;;;:::i;22020:32::-;;;;;;;;;;;;;:::i;37225:808::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37225:808:0;-1:-1:-1;;;;;37225:808:0;;:::i;21421:50::-;;;;;;;;;;;;;:::i;20051:79::-;;;;;;;;;;;;;:::i;21819:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;21819:64:0;;;;;;-1:-1:-1;;;;;21819:64:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;39793:241;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39793:241:0;-1:-1:-1;;;;;39793:241:0;;:::i;34925:207::-;;;;;;;;;;;;;:::i;40046:240::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40046:240:0;-1:-1:-1;;;;;40046:240:0;;:::i;39068:304::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39068:304:0;;:::i;24215:493::-;;;;;;;;;;;;;;;;-1:-1:-1;24215:493:0;;:::i;36104:1113::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;36104:1113:0;;;;;;;;;;:::i;28548:990::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28548:990:0;;;;;;;:::i;38041:482::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35384:285;;;;;;;;;;;;;:::i;20996:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20996:244:0;-1:-1:-1;;;;;20996:244:0;;:::i;21749:26::-;;;;:::o;35677:419::-;35770:10;35737:21;35761:20;;;:8;:20;;;;;35802:11;;;;35794:36;;;;;-1:-1:-1;;;35794:36:0;;;;;;;;;;;;-1:-1:-1;;;35794:36:0;;;;;;;;;;;;;;;35843:22;35854:10;35843;:22::i;:::-;35895:10;35886:20;;;;:8;:20;;;;;:27;;;:38;-1:-1:-1;35886:38:0;35878:69;;;;;-1:-1:-1;;;35878:69:0;;;;;;;;;;;;-1:-1:-1;;;35878:69:0;;;;;;;;;;;;;;;35999:10;35990:20;;;;:8;:20;;;;;:27;;;:40;;36022:7;35990:31;:40::i;:::-;35969:10;35960:20;;;;:8;:20;;;;;:27;;:70;;;;36043:45;;36080:7;36043:15;:45::i;:::-;35677:419;;:::o;21784:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21784:26:0;;;;-1:-1:-1;21784:26:0;;;;;:::o;21892:34::-;;;;:::o;25573:636::-;20273:12;:10;:12::i;:::-;20263:6;;-1:-1:-1;;;;;20263:6:0;;;:22;;;20255:67;;;;;-1:-1:-1;;;20255:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20255:67:0;;;;;;;;;;;;;;;25708:11:::1;25704:61;;;25736:17;:15;:17::i;:::-;25775:23;25829:10;;25814:12;:25;:53;;25857:10;;25814:53;;;25842:12;25814:53;25896:15;::::0;25775:92;;-1:-1:-1;25896:32:0::1;::::0;25916:11;25896:19:::1;:32::i;:::-;25878:15;:50:::0;25967:223:::1;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;25967:223:0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;25967:223:0;;;;;;;;;;;;25939:8:::1;:262:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;;25939:262:0::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25939:262:0;;;;;;25573:636::o;22383:25::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22383:25:0;;-1:-1:-1;22383:25:0;:::o;22415:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38531:289::-;23407:10;23396:22;;;;:10;:22;;;;;;;;23388:70;;;;-1:-1:-1;;;23388:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38679:7:::1;38662:13;;:24;;38654:55;;;::::0;;-1:-1:-1;;;38654:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;38654:55:0;;;;;;;;;;;;;::::1;;38738:13;::::0;:26:::1;::::0;38756:7;38738:17:::1;:26::i;:::-;38722:13;:42:::0;38777:5:::1;::::0;:35:::1;::::0;;-1:-1:-1;;;38777:35:0;;38792:10:::1;38777:35;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;38777:5:0;;::::1;::::0;:14:::1;::::0;:35;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:35;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;;;38531:289:0:o;29546:869::-;23251:8;;23263:1;23251:13;23243:32;;;;;-1:-1:-1;;;23243:32:0;;;;;;;;;;;;-1:-1:-1;;;23243:32:0;;;;;;;;;;;;;;;23297:1;23286:8;:12;;;29642:8:::1;:14:::0;;29651:4;;29642:14;::::1;;;;;;::::0;;;::::1;::::0;;;29691;;;:8:::1;:14:::0;;;;;;29706:10:::1;29691:26:::0;;;;;;;29736:11;;29642:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;29736:22:0;-1:-1:-1;29736:22:0::1;29728:53;;;::::0;;-1:-1:-1;;;29728:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;29728:53:0;;;;;;;;;;;;;::::1;;29792:16;29803:4;29792:10;:16::i;:::-;29819:15;29850:67;29901:4;:15;;;29850:46;29891:4;29850:36;29866:4;:19;;;29850:4;:11;;;:15;;:36;;;;:::i;:::-;:40:::0;::::1;:46::i;:::-;:50:::0;::::1;:67::i;:::-;29819:98:::0;-1:-1:-1;29932:11:0;;29928:80:::1;;29960:36;29976:10;29988:7;29960:15;:36::i;:::-;30024:11:::0;;30020:215:::1;;30066:11:::0;;:24:::1;::::0;30082:7;30066:15:::1;:24::i;:::-;30052:38:::0;;30124:16:::1;::::0;::::1;::::0;:29:::1;::::0;30145:7;30124:20:::1;:29::i;:::-;30105:16;::::0;::::1;:48:::0;30168:12;;:55:::1;::::0;-1:-1:-1;;;;;30168:12:0::1;30202:10;30215:7:::0;30168:25:::1;:55::i;:::-;30281:19;::::0;::::1;::::0;30265:11;;:46:::1;::::0;30306:4:::1;::::0;30265:36:::1;::::0;:15:::1;:36::i;:46::-;30247:15;::::0;::::1;:64:::0;30365:19:::1;::::0;::::1;::::0;30395:11;;30329:78:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;30350:4;;30338:10:::1;::::0;30329:78:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;23332:1:0;23321:8;:12;-1:-1:-1;;;29546:869:0:o;21935:25::-;;;;:::o;27812:728::-;27864:21;27888:8;27897:4;27888:14;;;;;;;;;;;;;;;;;;27864:38;;27933:4;:20;;;27917:12;:36;27913:75;;27970:7;;;27913:75;28017:16;;;;28048:13;28044:102;;-1:-1:-1;28101:12:0;28078:20;;;;:35;28128:7;;28044:102;28156:18;28177:49;28191:4;:20;;;28213:12;28177:13;:49::i;:::-;28156:70;;28237:17;28270:101;28341:15;;28270:48;28302:4;:15;;;28270:27;28285:11;;28270:10;:14;;:27;;;;:::i;:::-;:31;;:48::i;:101::-;28237:134;-1:-1:-1;28404:82:0;28442:33;28466:8;28442:19;28237:134;28456:4;28442:13;:19::i;:33::-;28404:19;;;;;:23;:82::i;:::-;28382:19;;;:104;-1:-1:-1;;28520:12:0;28497:20;;;;:35;;;;-1:-1:-1;27812:728:0;;:::o;30423:1727::-;23407:10;23396:22;;;;:10;:22;;;;;;;;23388:70;;;;-1:-1:-1;;;23388:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30711:7:::1;30688:19;:30;;30638:137;;;::::0;;-1:-1:-1;;;30638:137:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;30888:7;30859:25;:36;;30786:172;;;;-1:-1:-1::0;;;30786:172:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31032:7;31014:14;:25;;30969:122;;;::::0;;-1:-1:-1;;;30969:122:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31177:7;31153:20;:31;;31102:140;;;::::0;;-1:-1:-1;;;31102:140:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31297:1;31275:19;:23;:73;;;;31347:1;31319:25;:29;31275:73;:112;;;;31386:1;31369:14;:18;31275:112;:162;;;;31436:1;31408:25;:29;31275:162;31253:239;;;::::0;;-1:-1:-1;;;31253:239:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31505:17;:15;:17::i;:::-;31539:23:::0;;31535:148:::1;;31598:85;31663:5;31598:42;31626:13;;31622:2;:17;31598:19;:23;;:42;;;;:::i;:85::-;31577:18;:106:::0;31535:148:::1;31698:29:::0;;31694:170:::1;;31769:95;31858:5;31769:66;31821:13;;31817:2;:17;31769:25;:47;;:66;;;;:::i;:95::-;31742:24;:122:::0;31694:170:::1;31879:18:::0;;31875:101:::1;;31928:48;31970:5;31928:37;31951:13;;31947:2;:17;31928:14;:18;;:37;;;;:::i;:48::-;31912:13;:64:::0;31875:101:::1;31991:24:::0;;31987:155:::1;;32052:90;32136:5;32052:61;32099:13;;32095:2;:17;32052:20;:42;;:61;;;;:::i;:90::-;32030:19;:112:::0;31987:155:::1;30423:1727:::0;;;;:::o;38828:232::-;38879:7;38899:14;38944:10;;38929:12;:25;:57;;38985:1;38929:57;;;38972:10;;38957:12;:25;38929:57;38899:87;;39006:46;39034:17;;39006:23;39022:6;39006:11;;:15;;:23;;;;:::i;:46::-;38999:53;;;38828:232;;:::o;27624:180::-;27686:8;:15;27669:14;27712:85;27740:6;27734:3;:12;27712:85;;;27770:15;27781:3;27770:10;:15::i;:::-;27748:5;;27712:85;;26217:362;20273:12;:10;:12::i;:::-;20263:6;;-1:-1:-1;;;;;20263:6:0;;;:22;;;20255:67;;;;;-1:-1:-1;;;20255:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20255:67:0;;;;;;;;;;;;;;;26349:11:::1;26345:61;;;26377:17;:15;:17::i;:::-;26434:87;26499:11;26434:46;26454:8;26463:4;26454:14;;;;;;;;;;;;;;;;;;:25;;;26434:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:87::i;:::-;26416:15;:105;;;;26560:11;26532:8;26541:4;26532:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;26217:362:::0;;;:::o;26749:867::-;26848:7;26873:21;26897:8;26906:4;26897:14;;;;;;;;;;;;;;;;26946;;;:8;:14;;;;;;;-1:-1:-1;;;;;26946:21:0;;;;;;;;;;;26897:14;;;;;;;27003:19;;;;27052:16;;;;27098:20;;;;26897:14;;-1:-1:-1;26946:21:0;;27003:19;;27052:16;27083:12;:35;:52;;;;-1:-1:-1;27122:13:0;;;27083:52;27079:450;;;27152:18;27190:49;27204:4;:20;;;27226:12;27190:13;:49::i;:::-;27152:87;;27254:17;27291:109;27366:15;;27291:48;27323:4;:15;;;27291:27;27306:11;;27291:10;:14;;:27;;;;:::i;:109::-;27254:146;-1:-1:-1;27432:85:0;27469:33;27493:8;27469:19;27254:146;27483:4;27469:13;:19::i;:33::-;27432:14;;:18;:85::i;:::-;27415:102;;27079:450;;;27546:62;27592:4;:15;;;27546:41;27582:4;27546:31;27562:14;27546:4;:11;;;:15;;:31;;;;:::i;:62::-;27539:69;;;;;;26749:867;;;;;:::o;35140:236::-;35237:10;35181:4;35228:20;;;:8;:20;;;;;35266:11;;35181:4;;35228:20;35266:11;;35261:66;;35302:5;35309;35294:21;;;;;;;35261:66;35353:14;35347:4;;-1:-1:-1;35353:14:0;;;;;;-1:-1:-1;35140:236:0;;;:::o;24716:849::-;20273:12;:10;:12::i;:::-;20263:6;;-1:-1:-1;;;;;20263:6:0;;;:22;;;20255:67;;;;;-1:-1:-1;;;20255:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20255:67:0;;;;;;;;;;;;;;;24858:9:::1;:16;24842:5;:12;:32;24834:70;;;::::0;;-1:-1:-1;;;24834:70:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24922:9;24917:641;24941:5;:12;24937:1;:16;24917:641;;;24975:8;24989:5;24995:1;24989:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;24975:23;;::::1;::::0;;::::1;::::0;;-1:-1:-1;24975:23:0;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;24975:23:0::1;-1:-1:-1::0;;;;;24975:23:0;;::::1;::::0;;;::::1;::::0;;25034:336:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;25104:12;;25034:336;;::::1;::::0;25104:12;;25114:1;;25104:12;::::1;;;;;;;;;;;25034:336;;;;;;25167:10;;25152:12;:25;:95;;25237:10;;25152:95;;;25201:12;25152:95;25034:336;;;;25274:1;25034:336;;;;25316:1;25034:336;;;;25353:1;25034:336;;::::0;25013:8:::1;:18;25022:5;25028:1;25022:8;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;25013:18:0::1;::::0;;;;::::1;::::0;;;;;;;;-1:-1:-1;25013:18:0;:357;;;;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;25013:357:0;::::1;;-1:-1:-1::0;;25013:357:0;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;25391:12;;:9;;25401:1;;25391:12;::::1;;;;;;;;;;;25387:160;;;25441:14;::::0;:21:::1;::::0;25460:1:::1;25441:18;:21::i;:::-;25424:14;:38:::0;25387:160:::1;;;25515:9;::::0;:16:::1;::::0;25529:1:::1;25515:13;:16::i;:::-;25503:9;:28:::0;25387:160:::1;24955:3;;24917:641;;20693:148:::0;20273:12;:10;:12::i;:::-;20263:6;;-1:-1:-1;;;;;20263:6:0;;;:22;;;20255:67;;;;;-1:-1:-1;;;20255:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20255:67:0;;;;;;;;;;;;;;;20800:1:::1;20784:6:::0;;20763:40:::1;::::0;-1:-1:-1;;;;;20784:6:0;;::::1;::::0;20763:40:::1;::::0;20800:1;;20763:40:::1;20831:1;20814:19:::0;;-1:-1:-1;;;;;;20814:19:0::1;::::0;;20693:148::o;22020:32::-;;;;:::o;37225:808::-;23407:10;23396:22;;;;:10;:22;;;;;;;;23388:70;;;;-1:-1:-1;;;23388:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37318:17:0;::::1;37294:21;37318:17:::0;;;:8:::1;:17;::::0;;;;37356:11;;::::1;;37348:45;;;::::0;;-1:-1:-1;;;37348:45:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;37348:45:0;;;;;;;;;;;;;::::1;;37406:17;:15;:17::i;:::-;37441:9;37436:235;37460:8;:15:::0;37456:19;::::1;37436:235;;;37516:7;-1:-1:-1::0;;;;;37501:22:0::1;:8;37510:1;37501:11;;;;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;37501:11:0::1;:22;37497:163;;;37558:8;37567:15:::0;;-1:-1:-1;;37567:19:0;;;37558:29;::::1;;;;;;::::0;;;::::1;::::0;;;::::1;::::0;37544:8:::1;:11:::0;;-1:-1:-1;;;;;37558:29:0;;::::1;::::0;37553:1;;37544:11;::::1;;;;;;;;;;;;;:43;;;;;-1:-1:-1::0;;;;;37544:43:0::1;;;;;-1:-1:-1::0;;;;;37544:43:0::1;;;;;;37606:8;:14;;;;;;;;::::0;;;::::1;::::0;;;;-1:-1:-1;;37606:14:0;;;;;-1:-1:-1;;;;;;37606:14:0::1;::::0;;;;;37639:5:::1;;37497:163;37477:3;;37436:235;;;-1:-1:-1::0;37687:14:0;;::::1;::::0;::::1;;;37683:146;;;37735:14;::::0;:21:::1;::::0;37754:1:::1;37735:18;:21::i;:::-;37718:14;:38:::0;37683:146:::1;;;37801:9;::::0;:16:::1;::::0;37815:1:::1;37801:13;:16::i;:::-;37789:9;:28:::0;37683:146:::1;37841:19:::0;;-1:-1:-1;;37841:19:0::1;::::0;;37877:11:::1;::::0;::::1;::::0;:15;37873:153:::1;;37926:11;::::0;::::1;::::0;;37909:14:::1;37952:15:::0;;;37982:32:::1;37998:7:::0;37926:11;37982:15:::1;:32::i;21421:50::-:0;21464:7;21421:50;:::o;20051:79::-;20089:7;20116:6;-1:-1:-1;;;;;20116:6:0;20051:79;:::o;21819:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39793:241::-;20273:12;:10;:12::i;:::-;20263:6;;-1:-1:-1;;;;;20263:6:0;;;:22;;;20255:67;;;;;-1:-1:-1;;;20255:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20255:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;39867:21:0;::::1;39859:49;;;::::0;;-1:-1:-1;;;39859:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39859:49:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;39928:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;39927:20;39919:60;;;::::0;;-1:-1:-1;;;39919:60:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;40000:19:0::1;;::::0;;;:10:::1;:19;::::0;;;;:26;;-1:-1:-1;;40000:26:0::1;40022:4;40000:26;::::0;;39793:241::o;34925:207::-;35077:14;;35115:9;;35077:14;;34925:207::o;40046:240::-;20273:12;:10;:12::i;:::-;20263:6;;-1:-1:-1;;;;;20263:6:0;;;:22;;;20255:67;;;;;-1:-1:-1;;;20255:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20255:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40123:21:0;::::1;40115:49;;;::::0;;-1:-1:-1;;;40115:49:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;40115:49:0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;40183:19:0;::::1;;::::0;;;:10:::1;:19;::::0;;;;;::::1;;40175:55;;;::::0;;-1:-1:-1;;;40175:55:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;-1:-1:-1::0;;;;;40251:19:0::1;40273:5;40251:19:::0;;;:10:::1;:19;::::0;;;;:27;;-1:-1:-1;;40251:27:0::1;::::0;;40046:240::o;39068:304::-;23407:10;23396:22;;;;:10;:22;;;;;;;;23388:70;;;;-1:-1:-1;;;23388:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39226:6:::1;39202:20;:18;:20::i;:::-;:30;;39194:61;;;::::0;;-1:-1:-1;;;39194:61:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;39194:61:0;;;;;;;;;;;;;::::1;;39288:17;::::0;:29:::1;::::0;39310:6;39288:21:::1;:29::i;:::-;39268:17;:49:::0;39330:5:::1;::::0;:34:::1;::::0;;-1:-1:-1;;;39330:34:0;;39345:10:::1;39330:34;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;39330:5:0;;::::1;::::0;:14:::1;::::0;:34;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:34;::::1;;::::0;::::1;;;;::::0;::::1;24215:493:::0;20273:12;:10;:12::i;:::-;20263:6;;-1:-1:-1;;;;;20263:6:0;;;:22;;;20255:67;;;;;-1:-1:-1;;;20255:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20255:67:0;;;;;;;;;;;;;;;24348:13:::1;::::0;24323:39:::1;::::0;21464:7:::1;::::0;24344:2:::1;:17;24323:20;:39::i;:::-;24308:11;:54;24286:130;;;::::0;;-1:-1:-1;;;24286:130:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24449:5;::::0;:42:::1;::::0;;-1:-1:-1;;;24449:42:0;;24465:10:::1;24449:42;::::0;::::1;::::0;24485:4:::1;24449:42:::0;;;;;;24429:17:::1;::::0;-1:-1:-1;;;;;24449:5:0::1;::::0;:15:::1;::::0;:42;;;;;::::1;::::0;;;;;;;;:5;:42;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;-1:-1:-1::0;24449:42:0;;-1:-1:-1;24512:24:0;;::::1;;24504:62;;;::::0;;-1:-1:-1;;;24504:62:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;24615:13;::::0;24595:34:::1;::::0;22008:5:::1;::::0;24611:2:::1;:17;24595:15;:34::i;:::-;24579:13;:50:::0;24642:5:::1;::::0;:58:::1;::::0;;-1:-1:-1;;;24642:58:0;;24661:10:::1;24642:58;::::0;::::1;::::0;24681:4:::1;24642:58:::0;;;;;;;;;;;;-1:-1:-1;;;;;24642:5:0;;::::1;::::0;:18:::1;::::0;:58;;;;;::::1;::::0;;;;;;;;;:5:::1;::::0;:58;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;36104:1113:::0;23407:10;23396:22;;;;:10;:22;;;;;;;;23388:70;;;;-1:-1:-1;;;23388:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36210:17:0;::::1;36186:21;36210:17:::0;;;:8:::1;:17;::::0;;;;36249:11;;::::1;;36248:12;36240:42;;;::::0;;-1:-1:-1;;;36240:42:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;36240:42:0;;;;;;;;;;;;;::::1;;36295:17;:15;:17::i;:::-;36329:20;::::0;::::1;::::0;:24;36325:732:::1;;36399:8;:22:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;36399:22:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;36399:22:0::1;-1:-1:-1::0;;;;;36399:22:0;::::1;;::::0;;36438:18;;-1:-1:-1;;36438:18:0::1;;::::0;;36509:10:::1;::::0;36494:12:::1;:25;:87;;36571:10;;36494:87;;;36539:12;36494:87;36471:20;::::0;::::1;:110:::0;36596:26;;-1:-1:-1;;36596:26:0::1;;::::0;::::1;;;;::::0;;36325:732:::1;;;36655:8;:22:::0;;::::1;::::0;;::::1;::::0;;-1:-1:-1;36655:22:0;;;;;::::1;::::0;;-1:-1:-1;;;;;;36655:22:0::1;-1:-1:-1::0;;;;;36655:22:0;::::1;;::::0;;36712:333:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;36655:22;36712:333:::0;::::1;::::0;36842:10:::1;::::0;36712:333;;;;36827:12:::1;:25;:95;;36912:10;;36827:95;;;36876:12;36827:95;36712:333:::0;;36949:1:::1;36712:333;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;36692:17:0;::::1;::::0;;:8:::1;:17:::0;;;;;;:353;;;;;;::::1;::::0;::::1;;;;-1:-1:-1::0;;36692:353:0;::::1;;-1:-1:-1::0;;36692:353:0;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;36325:732:::1;37073:9;37069:141;;;37116:14;::::0;:21:::1;::::0;37135:1:::1;37116:18;:21::i;:::-;37099:14;:38:::0;37069:141:::1;;;37182:9;::::0;:16:::1;::::0;37196:1:::1;37182:13;:16::i;:::-;37170:9;:28:::0;23469:1:::1;36104:1113:::0;;:::o;28548:990::-;23251:8;;23263:1;23251:13;23243:32;;;;;-1:-1:-1;;;23243:32:0;;;;;;;;;;;;-1:-1:-1;;;23243:32:0;;;;;;;;;;;;;;;23297:1;23286:8;:12;;;28643:8:::1;:14:::0;;28652:4;;28643:14;::::1;;;;;;::::0;;;::::1;::::0;;;28692;;;:8:::1;:14:::0;;;;;;28707:10:::1;28692:26:::0;;;;;;;28643:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;28729:16:0::1;28701:4:::0;28729:10:::1;:16::i;:::-;28792:11:::0;;28758:15:::1;::::0;28792;28788:259:::1;;28834:99;28903:4;:15;;;28834:46;28875:4;28834:36;28850:4;:19;;;28834:4;:11;;;:15;;:36;;;;:::i;:99::-;28824:109:::0;-1:-1:-1;28952:11:0;;28948:88:::1;;28984:36;29000:10;29012:7;28984:15;:36::i;:::-;29063:11:::0;;29059:300:::1;;29105:11:::0;;:24:::1;::::0;29121:7;29105:15:::1;:24::i;:::-;29091:38:::0;;29163:16:::1;::::0;::::1;::::0;:29:::1;::::0;29184:7;29163:20:::1;:29::i;:::-;29144:16;::::0;::::1;:48:::0;29207:12;;:140:::1;::::0;-1:-1:-1;;;;;29207:12:0::1;29263:10;29301:4;29325:7:::0;29207:29:::1;:140::i;:::-;29405:19;::::0;::::1;::::0;29389:11;;:46:::1;::::0;29430:4:::1;::::0;29389:36:::1;::::0;:15:::1;:36::i;:46::-;29371:15;::::0;::::1;:64:::0;29488:19:::1;::::0;::::1;::::0;29518:11;;29453:77:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;;;;;29473:4;;29461:10:::1;::::0;29453:77:::1;::::0;;;;;;;::::1;-1:-1:-1::0;;23332:1:0;23321:8;:12;-1:-1:-1;;;28548:990:0:o;38041:482::-;38340:18;;38386:13;;38438:24;;38496:19;;38340:18;;38438:24;;38496:19;38041:482::o;35384:285::-;35486:10;35433:7;35477:20;;;:8;:20;;;;;35515:11;;;;35510:53;;35550:1;35543:8;;;;;35510:53;35576:14;35596:22;35607:10;35596;:22::i;:::-;-1:-1:-1;35638:11:0;;;;35575:43;;-1:-1:-1;35638:23:0;;35575:43;35638:15;:23::i;:::-;35631:30;;;;35384:285;:::o;20996:244::-;20273:12;:10;:12::i;:::-;20263:6;;-1:-1:-1;;;;;20263:6:0;;;:22;;;20255:67;;;;;-1:-1:-1;;;20255:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;20255:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;21085:22:0;::::1;21077:73;;;;-1:-1:-1::0;;;21077:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21187:6;::::0;;21166:38:::1;::::0;-1:-1:-1;;;;;21166:38:0;;::::1;::::0;21187:6;::::1;::::0;21166:38:::1;::::0;::::1;21215:6;:17:::0;;-1:-1:-1;;;;;;21215:17:0::1;-1:-1:-1::0;;;;;21215:17:0;;;::::1;::::0;;;::::1;::::0;;20996:244::o;5109:471::-;5167:7;5412:6;5408:47;;-1:-1:-1;5442:1:0;5435:8;;5408:47;5479:5;;;5483:1;5479;:5;:1;5503:5;;;;;:10;5495:56;;;;-1:-1:-1;;;5495:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5571:1;5109:471;-1:-1:-1;;;5109:471:0:o;6056:132::-;6114:7;6141:39;6145:1;6148;6141:39;;;;;;;;;;;;;;;;;:3;:39::i;32315:686::-;32370:14;32386:20;32410:17;32421:5;32410:10;:17::i;:::-;32369:58;;-1:-1:-1;32369:58:0;-1:-1:-1;32444:10:0;;32440:554;;-1:-1:-1;;;;;32495:15:0;;32471:21;32495:15;;;:8;:15;;;;;32539:11;;;;:23;;32555:6;32539:15;:23::i;:::-;32525:11;;;:37;32600:98;32643:40;:12;22769:4;32643:16;:40::i;:::-;32600:20;;;;;:24;:98::i;:::-;32577:20;;;:121;32719:14;;;;;;;32715:268;;;32782:25;;;;:83;;32834:12;32782:29;:83::i;:::-;32754:25;;;:111;32715:268;;;32929:20;;;;:38;;32954:12;32929:24;:38::i;:::-;32906:20;;;:61;32440:554;32315:686;;;:::o;4219:136::-;4277:7;4304:43;4308:1;4311;4304:43;;;;;;;;;;;;;;;;;:3;:43::i;39380:401::-;39455:15;39486:131;39615:1;39486:106;39557:34;39577:13;;39573:2;:17;22008:5;39557:15;;:34;;;;:::i;:::-;39486:5;;:48;;;-1:-1:-1;;;39486:48:0;;39528:4;39486:48;;;;;;-1:-1:-1;;;;;39486:5:0;;;;:33;;:48;;;;;;;;;;;;;;;:5;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39486:48:0;;:70;:106::i;:131::-;39455:162;;39642:7;39632;:17;39628:146;;;39666:5;;:35;;;-1:-1:-1;;;39666:35:0;;39681:10;39666:35;;;;;;;;;;;;-1:-1:-1;;;;;39666:5:0;;;;:14;;:35;;;;;;;;;;;;;;;:5;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39628:146:0;;-1:-1:-1;39628:146:0;;39734:5;;:28;;;-1:-1:-1;;;39734:28:0;;-1:-1:-1;;;;;39734:28:0;;;;;;;;;;;;;;;:5;;;;;:14;;:28;;;;;;;;;;;;;;:5;;:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;39380:401:0;;;:::o;18607:106::-;18695:10;18607:106;:::o;3755:181::-;3813:7;3845:5;;;3869:6;;;;3861:46;;;;;-1:-1:-1;;;3861:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;14912:177;15022:58;;;-1:-1:-1;;;;;15022:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15022:58:0;-1:-1:-1;;;15022:58:0;;;14995:86;;15015:5;;14995:19;:86::i;26587:154::-;26687:7;26719:14;:3;26727:5;26719:7;:14::i;32158:149::-;32209:9;32204:96;32228:8;:15;32224:19;;32204:96;;;32265:23;32276:8;32285:1;32276:11;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;32276:11:0;32265:10;:23::i;:::-;32245:3;;32204:96;;15097:205;15225:68;;;-1:-1:-1;;;;;15225:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15225:68:0;-1:-1:-1;;;15225:68:0;;;15198:96;;15218:5;;15198:19;:96::i;33009:1908::-;-1:-1:-1;;;;;33119:15:0;;33066:7;33119:15;;;:8;:15;;;;;33166:14;;33066:7;;33119:15;33166:14;;;;;:61;;;;;22824:3;33184:4;:25;;;:43;;33166:61;33165:139;;;-1:-1:-1;33247:14:0;;;;;;;33246:15;:57;;;;;22824:3;33265:4;:20;;;:38;;33246:57;33165:181;;;;33336:10;;33321:12;:25;33165:181;33147:251;;;33381:1;33384;33373:13;;;;;;;33147:251;33410:20;33461:4;:20;;;33446:12;:35;:138;;33583:1;33446:138;;;22769:4;33517;:20;;;33502:12;:35;33501:62;;;;;;33446:138;33410:174;-1:-1:-1;33601:17:0;33597:63;;33643:1;33646;33635:13;;;;;;;;33597:63;33690:14;;;;;;;:91;;;;-1:-1:-1;33721:25:0;;;;22824:3;;33721:43;;33751:12;33721:29;:43::i;:::-;:60;33690:91;33672:413;;;33842:25;;;;33823:45;;22824:3;;33823:18;:45::i;:::-;33808:60;;33672:413;;;33905:14;;;;;;;33904:15;:87;;;;-1:-1:-1;33936:20:0;;;;22824:3;;33936:38;;33961:12;33936:24;:38::i;:::-;:55;33904:87;33886:199;;;34052:20;;;;34033:40;;22824:3;;34033:18;:40::i;:::-;34018:55;;33886:199;34098:23;34123:18;34145:15;:13;:15::i;:::-;34236:14;;34097:63;;-1:-1:-1;34097:63:0;-1:-1:-1;34197:20:0;;34236:14;;;;;34232:630;;;34333:18;;34316:36;;:12;;:16;:36::i;:::-;34301:51;;34424:135;34546:12;34424:99;34507:15;34424:60;34459:24;;34424:12;:34;;:60;;;;:::i;:135::-;34409:150;;34232:630;;;34652:13;;34635:31;;:12;;:16;:31::i;:::-;34620:46;;34725:125;34837:12;34725:89;34803:10;34725:55;34760:19;;34725:12;:34;;:55;;;;:::i;:125::-;34710:140;;34232:630;34882:12;-1:-1:-1;34896:12:0;;-1:-1:-1;;;;33009:1908:0;;;;:::o;6684:278::-;6770:7;6805:12;6798:5;6790:28;;;;-1:-1:-1;;;6790:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6829:9;6845:1;6841;:5;;;;;;;6684:278;-1:-1:-1;;;;;6684:278:0:o;4658:192::-;4744:7;4780:12;4772:6;;;;4764:29;;;;-1:-1:-1;;;4764:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;4816:5:0;;;4658:192::o;17217:761::-;17641:23;17667:69;17695:4;17667:69;;;;;;;;;;;;;;;;;17675:5;-1:-1:-1;;;;;17667:27:0;;;:69;;;;;:::i;:::-;17751:17;;17641:95;;-1:-1:-1;17751:21:0;17747:224;;17893:10;17882:30;;;;;;;;;;;;;;;-1:-1:-1;17882:30:0;17874:85;;;;-1:-1:-1;;;17874:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11895:196;11998:12;12030:53;12053:6;12061:4;12067:1;12070:12;12030:22;:53::i;:::-;12023:60;11895:196;-1:-1:-1;;;;11895:196:0:o;13272:979::-;13402:12;13435:18;13446:6;13435:10;:18::i;:::-;13427:60;;;;;-1:-1:-1;;;13427:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;13561:12;13575:23;13602:6;-1:-1:-1;;;;;13602:11:0;13622:8;13633:4;13602:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;13602:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13560:78;;;;13653:7;13649:595;;;13684:10;-1:-1:-1;13677:17:0;;-1:-1:-1;13677:17:0;13649:595;13798:17;;:21;13794:439;;14061:10;14055:17;14122:15;14109:10;14105:2;14101:19;14094:44;14009:148;14197:20;;-1:-1:-1;;;14197:20:0;;;;;;;;;;;;;;;;;14204:12;;14197:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8977:422;9344:20;9383:8;;;8977:422::o
Swarm Source
ipfs://47e06ad6f13db450a5ace4789145ce62dbc91b89d12308d8e22d11b4ef276b45
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.