Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakeXenoAI
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-12-20 */ //SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.11; //import "@nomiclabs/buidler/console.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ contract Context { // Empty internal constructor, to prevent people from mistakenly deploying // an instance of this contract, which should be used via inheritance. constructor() {} function _msgSender() internal view returns (address payable) { return payable(msg.sender); } function _msgData() internal view returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } /** * @dev Contract module 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() { 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 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require( newOwner != address(0), "Ownable: new owner is the zero address" ); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } /** * @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; } function min(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x < y ? x : y; } // babylonian method (https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Babylonian_method) function sqrt(uint256 y) internal pure returns (uint256 z) { if (y > 3) { z = y; uint256 x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } } interface IBEP20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the token decimals. */ function decimals() external view returns (uint8); /** * @dev Returns the token symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the token name. */ function name() external view returns (string memory); /** * @dev Returns the bep token owner. */ function getOwner() external view returns (address); /** * @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 ); } /** * @title SafeBEP20 * @dev Wrappers around BEP20 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 SafeBEP20 for IBEP20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeBEP20 { using SafeMath for uint256; using Address for address; function safeTransfer(IBEP20 token, address to, uint256 value) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transfer.selector, to, value) ); } function safeTransferFrom( IBEP20 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 * {IBEP20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IBEP20 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), "SafeBEP20: approve from non-zero to non-zero allowance" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, value) ); } function safeIncreaseAllowance( IBEP20 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( IBEP20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeBEP20: 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(IBEP20 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, "SafeBEP20: low-level call failed" ); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require( abi.decode(returndata, (bool)), "SafeBEP20: BEP20 operation did not succeed" ); } } } /** * @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) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @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); } } } } abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } contract StakeXenoAI is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeBEP20 for IBEP20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } // Info of each pool. struct PoolInfo { IBEP20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Tokens to distribute per block. uint256 lastRewardTimestamp; // Last block number that Tokens distribution occurs. uint256 accTokensPerShare; // Accumulated Tokens per share, times 1e12. See below. } IBEP20 public immutable stakingToken; IBEP20 public immutable rewardToken; mapping(address => uint256) public holderUnlockTime; uint256 public totalStaked; uint256 public apy; uint256 public lockDuration; uint256 public exitPenaltyPerc; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(address => UserInfo) public userInfo; // Total allocation poitns. Must be the sum of all allocation points in all pools. uint256 private totalAllocPoint = 0; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); constructor() { stakingToken = IBEP20(0xa3637Da59d9007F324C2628Ebdd17dc1a839c394); rewardToken = stakingToken; apy = 15; lockDuration = 14 days; exitPenaltyPerc = 10; // staking pool poolInfo.push( PoolInfo({ lpToken: stakingToken, allocPoint: 1000, lastRewardTimestamp: 2199615, accTokensPerShare: 0 }) ); totalAllocPoint = 1000; } function stopReward() external onlyOwner { updatePool(0); apy = 0; } function startReward() external onlyOwner { require( poolInfo[0].lastRewardTimestamp == 21799615, "Can only start rewards once" ); poolInfo[0].lastRewardTimestamp = block.timestamp; } // View function to see pending Reward on frontend. function pendingReward(address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[_user]; if (pool.lastRewardTimestamp == 21799615) { return 0; } uint256 accTokensPerShare = pool.accTokensPerShare; uint256 lpSupply = totalStaked; if (block.timestamp > pool.lastRewardTimestamp && lpSupply != 0) { uint256 tokenReward = calculateNewRewards() .mul(pool.allocPoint) .div(totalAllocPoint); accTokensPerShare = accTokensPerShare.add( tokenReward.mul(1e12).div(lpSupply) ); } return user.amount.mul(accTokensPerShare).div(1e12).sub(user.rewardDebt); } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardTimestamp) { return; } uint256 lpSupply = totalStaked; if (lpSupply == 0) { pool.lastRewardTimestamp = block.timestamp; return; } uint256 tokenReward = calculateNewRewards().mul(pool.allocPoint).div( totalAllocPoint ); pool.accTokensPerShare = pool.accTokensPerShare.add( tokenReward.mul(1e12).div(lpSupply) ); pool.lastRewardTimestamp = block.timestamp; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public onlyOwner { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Stake primary tokens function deposit(uint256 _amount) public nonReentrant { if (holderUnlockTime[msg.sender] == 0) { holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; updatePool(0); if (user.amount > 0) { uint256 pending = user .amount .mul(pool.accTokensPerShare) .div(1e12) .sub(user.rewardDebt); if (pending > 0) { require( pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin A." ); rewardToken.safeTransfer(address(msg.sender), pending); } } uint256 amountTransferred = 0; if (_amount > 0) { uint256 initialBalance = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); amountTransferred = pool.lpToken.balanceOf(address(this)) - initialBalance; user.amount = user.amount.add(amountTransferred); totalStaked += amountTransferred; } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); emit Deposit(msg.sender, _amount); } // Withdraw primary tokens from STAKING. function withdraw() public nonReentrant { require( holderUnlockTime[msg.sender] <= block.timestamp, "May not do normal withdraw early" ); PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; updatePool(0); uint256 pending = user.amount.mul(pool.accTokensPerShare).div(1e12).sub( user.rewardDebt ); if (pending > 0) { require( pending <= rewardsRemaining(), "Cannot withdraw other people's staked tokens. Contact an admin B." ); rewardToken.safeTransfer(address(msg.sender), pending); } if (_amount > 0) { user.amount = 0; totalStaked -= _amount; pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.rewardDebt = user.amount.mul(pool.accTokensPerShare).div(1e12); if (user.amount > 0) { holderUnlockTime[msg.sender] = block.timestamp + lockDuration; } else { holderUnlockTime[msg.sender] = 0; } emit Withdraw(msg.sender, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw() external nonReentrant { PoolInfo storage pool = poolInfo[0]; UserInfo storage user = userInfo[msg.sender]; uint256 _amount = user.amount; totalStaked -= _amount; // exit penalty for early unstakers, penalty held on contract as rewards. if (holderUnlockTime[msg.sender] >= block.timestamp) { _amount -= (_amount * exitPenaltyPerc) / 100; } holderUnlockTime[msg.sender] = 0; pool.lpToken.safeTransfer(address(msg.sender), _amount); user.amount = 0; user.rewardDebt = 0; emit EmergencyWithdraw(msg.sender, _amount); } // Withdraw reward. EMERGENCY ONLY. This allows the owner to migrate rewards to a new staking pool since we are not minting new tokens. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { require( _amount <= rewardToken.balanceOf(address(this)) - totalStaked, "not enough tokens to take out" ); rewardToken.safeTransfer(address(msg.sender), _amount); } function calculateNewRewards() public view returns (uint256) { PoolInfo storage pool = poolInfo[0]; if (pool.lastRewardTimestamp > block.timestamp) { return 0; } return ((((block.timestamp - pool.lastRewardTimestamp) * totalStaked) * apy) / 100 / 365 days); } function rewardsRemaining() public view returns (uint256) { return rewardToken.balanceOf(address(this)) - totalStaked; } function updateApy(uint256 newApy) external onlyOwner { require(newApy <= 10000, "APY must be below 10000%"); updatePool(0); apy = newApy; } function updatelockduration(uint256 newlockDuration) external onlyOwner { require(newlockDuration <= 2419200, "Duration must be below 2 weeks"); lockDuration = newlockDuration; } function updateExitPenalty(uint256 newPenaltyPerc) external onlyOwner { require(newPenaltyPerc <= 20, "May not set higher than 20%"); exitPenaltyPerc = newPenaltyPerc; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","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":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"apy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calculateNewRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"exitPenaltyPerc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"holderUnlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IBEP20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardTimestamp","type":"uint256"},{"internalType":"uint256","name":"accTokensPerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IBEP20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalStaked","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":"newApy","type":"uint256"}],"name":"updateApy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPenaltyPerc","type":"uint256"}],"name":"updateExitPenalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newlockDuration","type":"uint256"}],"name":"updatelockduration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60c0604052600060095534801561001557600080fd5b50600061002661024260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3506001808190555073a3637da59d9007f324c2628ebdd17dc1a839c39473ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff168152505060805173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050600f60048190555062127500600581905550600a6006819055506007604051806080016040528060805173ffffffffffffffffffffffffffffffffffffffff1681526020016103e881526020016221903f81526020016000815250908060018154018082558091505060019003906000526020600020906004020160009091909190915060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201556060820151816003015550506103e860098190555061024a565b600033905090565b60805160a05161319562000293600039600081816105520152818161063d0152818161087d01528181610df0015281816113ee0152611b0e01526000610c9901526131956000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b146103a8578063f40f0f52146103c4578063f7c618c1146103f4578063ff16ef391461041257610173565b8063a913a5f714610352578063b6b55f2514610382578063db2e21bc1461039e57610173565b806380dc0672146102b6578063817b1cd2146102c05780638c09c135146102de5780638da5cb5b146102fa5780638e0b019814610318578063999e2f751461033457610173565b8063630b5ba111610130578063630b5ba11461023e578063715018a61461024857806372f702f314610252578063746c8ae11461027057806378c196f31461027a5780637b280def1461029857610173565b806304554443146101785780631526fe27146101965780631959a002146101c95780633279beab146101fa5780633bcfc4b8146102165780633ccfd60b14610234575b600080fd5b61018061042e565b60405161018d91906123e0565b60405180910390f35b6101b060048036038101906101ab919061242c565b610434565b6040516101c094939291906124d8565b60405180910390f35b6101e360048036038101906101de919061255b565b610494565b6040516101f1929190612588565b60405180910390f35b610214600480360381019061020f919061242c565b6104b8565b005b61021e610684565b60405161022b91906123e0565b60405180910390f35b61023c61068a565b005b610246610a7c565b005b610250610b44565b005b61025a610c97565b60405161026791906125b1565b60405180910390f35b610278610cbb565b005b610282610de9565b60405161028f91906123e0565b60405180910390f35b6102a0610e97565b6040516102ad91906123e0565b60405180910390f35b6102be610e9d565b005b6102c8610f46565b6040516102d591906123e0565b60405180910390f35b6102f860048036038101906102f3919061242c565b610f4c565b005b610302611031565b60405161030f91906125db565b60405180910390f35b610332600480360381019061032d919061242c565b61105a565b005b61033c61113d565b60405161034991906123e0565b60405180910390f35b61036c6004803603810190610367919061255b565b6111c7565b60405161037991906123e0565b60405180910390f35b61039c6004803603810190610397919061242c565b6111df565b005b6103a66116ac565b005b6103c260048036038101906103bd919061255b565b6118f6565b005b6103de60048036038101906103d9919061255b565b611997565b6040516103eb91906123e0565b60405180910390f35b6103fc611b0c565b60405161040991906125b1565b60405180910390f35b61042c6004803603810190610427919061242c565b611b30565b005b60055481565b6007818154811061044457600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60086020528060005260406000206000915090508060000154908060010154905082565b6104c0611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461054d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054490612653565b60405180910390fd5b6003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105a991906125db565b602060405180830381865afa1580156105c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ea9190612688565b6105f491906126e4565b811115610636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062d90612764565b60405180910390fd5b61068133827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b50565b60045481565b600260015414156106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c7906127d0565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561075a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107519061283c565b60405180910390fd5b600060076000815481106107715761077061285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506107d76000611cac565b6000610821836001015461081364e8d4a5100061080588600301548860000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b905060008111156108c257610834610de9565b811115610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d90612923565b60405180910390fd5b6108c133827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b600082111561093e576000836000018190555081600360008282546108e791906126e4565b9250508190555061093d33838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b61097064e8d4a5100061096286600301548660000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b83600101819055506000836000015411156109db57600554426109939190612943565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a21565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a6791906123e0565b60405180910390a25050505060018081905550565b610a84611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0890612653565b60405180910390fd5b6000600780549050905060005b81811015610b4057610b2f81611cac565b80610b3990612999565b9050610b1e565b5050565b610b4c611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090612653565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000000000000000000000000000000000000000000081565b610cc3611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790612653565b60405180910390fd5b63014ca2bf6007600081548110610d6a57610d6961285c565b5b90600052602060002090600402016002015414610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390612a2e565b60405180910390fd5b426007600081548110610dd257610dd161285c565b5b906000526020600020906004020160020181905550565b60006003547f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e4791906125db565b602060405180830381865afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190612688565b610e9291906126e4565b905090565b60065481565b610ea5611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990612653565b60405180910390fd5b610f3c6000611cac565b6000600481905550565b60035481565b610f54611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890612653565b60405180910390fd5b6224ea00811115611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90612a9a565b60405180910390fd5b8060058190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611062611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e690612653565b60405180910390fd5b6014811115611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90612b06565b60405180910390fd5b8060068190555050565b60008060076000815481106111555761115461285c565b5b90600052602060002090600402019050428160020154111561117b5760009150506111c4565b6301e13380606460045460035484600201544261119891906126e4565b6111a29190612b26565b6111ac9190612b26565b6111b69190612baf565b6111c09190612baf565b9150505b90565b60026020528060005260406000206000915090505481565b60026001541415611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906127d0565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156112c757600554426112839190612943565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060076000815481106112de576112dd61285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061133b6000611cac565b600081600001541115611435576000611392826001015461138464e8d4a5100061137687600301548760000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b90506000811115611433576113a5610de9565b8111156113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90612c78565b60405180910390fd5b61143233827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b505b6000808411156116175760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161149e91906125db565b602060405180830381865afa1580156114bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114df9190612688565b90506115323330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ea0909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161159091906125db565b602060405180830381865afa1580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190612688565b6115db91906126e4565b91506115f4828460000154611f2990919063ffffffff16565b8360000181905550816003600082825461160e9190612943565b92505081905550505b61164964e8d4a5100061163b85600301548560000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8560405161169791906123e0565b60405180910390a25050506001808190555050565b600260015414156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906127d0565b60405180910390fd5b6002600181905550600060076000815481106117115761171061285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050806003600082825461177f91906126e4565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106117f4576064600654826117dc9190612b26565b6117e69190612baf565b816117f191906126e4565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061188833828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516118e291906123e0565b60405180910390a250505060018081905550565b6118fe611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290612653565b60405180910390fd5b61199481611f87565b50565b60008060076000815481106119af576119ae61285c565b5b906000526020600020906004020190506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905063014ca2bf82600201541415611a1d57600092505050611b07565b60008260030154905060006003549050836002015442118015611a41575060008114155b15611abc576000611a7a600954611a6c8760010154611a5e61113d565b611d9190919063ffffffff16565b611e0c90919063ffffffff16565b9050611ab8611aa983611a9b64e8d4a5100085611d9190919063ffffffff16565b611e0c90919063ffffffff16565b84611f2990919063ffffffff16565b9250505b611b008360010154611af264e8d4a51000611ae4868860000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b9450505050505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b611b38611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90612653565b60405180910390fd5b612710811115611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190612ce4565b60405180910390fd5b611c146000611cac565b8060048190555050565b600033905090565b611ca78363a9059cbb60e01b8484604051602401611c45929190612d04565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120b4565b505050565b600060078281548110611cc257611cc161285c565b5b9060005260206000209060040201905080600201544211611ce35750611d8e565b600060035490506000811415611d03574282600201819055505050611d8e565b6000611d37600954611d298560010154611d1b61113d565b611d9190919063ffffffff16565b611e0c90919063ffffffff16565b9050611d79611d6683611d5864e8d4a5100085611d9190919063ffffffff16565b611e0c90919063ffffffff16565b8460030154611f2990919063ffffffff16565b83600301819055504283600201819055505050505b50565b600080831415611da45760009050611e06565b60008284611db29190612b26565b9050828482611dc19190612baf565b14611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df890612d9f565b60405180910390fd5b809150505b92915050565b6000611e4e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061217b565b905092915050565b6000611e9883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121de565b905092915050565b611f23846323b872dd60e01b858585604051602401611ec193929190612dbf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120b4565b50505050565b6000808284611f389190612943565b905083811015611f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7490612e42565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee90612ed4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612116826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122429092919063ffffffff16565b905060008151111561217657808060200190518101906121369190612f2c565b612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90612fcb565b60405180910390fd5b5b505050565b600080831182906121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99190613073565b60405180910390fd5b50600083856121d19190612baf565b9050809150509392505050565b6000838311158290612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d9190613073565b60405180910390fd5b506000838561223591906126e4565b9050809150509392505050565b6060612251848460008561225a565b90509392505050565b60606122658561237c565b6122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b906130e1565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122cd9190613148565b60006040518083038185875af1925050503d806000811461230a576040519150601f19603f3d011682016040523d82523d6000602084013e61230f565b606091505b50915091508115612324578092505050612374565b6000815111156123375780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b9190613073565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156123be57506000801b8214155b92505050919050565b6000819050919050565b6123da816123c7565b82525050565b60006020820190506123f560008301846123d1565b92915050565b600080fd5b612409816123c7565b811461241457600080fd5b50565b60008135905061242681612400565b92915050565b600060208284031215612442576124416123fb565b5b600061245084828501612417565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061249e61249961249484612459565b612479565b612459565b9050919050565b60006124b082612483565b9050919050565b60006124c2826124a5565b9050919050565b6124d2816124b7565b82525050565b60006080820190506124ed60008301876124c9565b6124fa60208301866123d1565b61250760408301856123d1565b61251460608301846123d1565b95945050505050565b600061252882612459565b9050919050565b6125388161251d565b811461254357600080fd5b50565b6000813590506125558161252f565b92915050565b600060208284031215612571576125706123fb565b5b600061257f84828501612546565b91505092915050565b600060408201905061259d60008301856123d1565b6125aa60208301846123d1565b9392505050565b60006020820190506125c660008301846124c9565b92915050565b6125d58161251d565b82525050565b60006020820190506125f060008301846125cc565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061263d6020836125f6565b915061264882612607565b602082019050919050565b6000602082019050818103600083015261266c81612630565b9050919050565b60008151905061268281612400565b92915050565b60006020828403121561269e5761269d6123fb565b5b60006126ac84828501612673565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ef826123c7565b91506126fa836123c7565b92508282101561270d5761270c6126b5565b5b828203905092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b600061274e601d836125f6565b915061275982612718565b602082019050919050565b6000602082019050818103600083015261277d81612741565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006127ba601f836125f6565b91506127c582612784565b602082019050919050565b600060208201905081810360008301526127e9816127ad565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b60006128266020836125f6565b9150612831826127f0565b602082019050919050565b6000602082019050818103600083015261285581612819565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2060208201527f422e000000000000000000000000000000000000000000000000000000000000604082015250565b600061290d6042836125f6565b91506129188261288b565b606082019050919050565b6000602082019050818103600083015261293c81612900565b9050919050565b600061294e826123c7565b9150612959836123c7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561298e5761298d6126b5565b5b828201905092915050565b60006129a4826123c7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129d7576129d66126b5565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b6000612a18601b836125f6565b9150612a23826129e2565b602082019050919050565b60006020820190508181036000830152612a4781612a0b565b9050919050565b7f4475726174696f6e206d7573742062652062656c6f772032207765656b730000600082015250565b6000612a84601e836125f6565b9150612a8f82612a4e565b602082019050919050565b60006020820190508181036000830152612ab381612a77565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203230250000000000600082015250565b6000612af0601b836125f6565b9150612afb82612aba565b602082019050919050565b60006020820190508181036000830152612b1f81612ae3565b9050919050565b6000612b31826123c7565b9150612b3c836123c7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b7557612b746126b5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bba826123c7565b9150612bc5836123c7565b925082612bd557612bd4612b80565b5b828204905092915050565b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2060208201527f412e000000000000000000000000000000000000000000000000000000000000604082015250565b6000612c626042836125f6565b9150612c6d82612be0565b606082019050919050565b60006020820190508181036000830152612c9181612c55565b9050919050565b7f415059206d7573742062652062656c6f77203130303030250000000000000000600082015250565b6000612cce6018836125f6565b9150612cd982612c98565b602082019050919050565b60006020820190508181036000830152612cfd81612cc1565b9050919050565b6000604082019050612d1960008301856125cc565b612d2660208301846123d1565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d896021836125f6565b9150612d9482612d2d565b604082019050919050565b60006020820190508181036000830152612db881612d7c565b9050919050565b6000606082019050612dd460008301866125cc565b612de160208301856125cc565b612dee60408301846123d1565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612e2c601b836125f6565b9150612e3782612df6565b602082019050919050565b60006020820190508181036000830152612e5b81612e1f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ebe6026836125f6565b9150612ec982612e62565b604082019050919050565b60006020820190508181036000830152612eed81612eb1565b9050919050565b60008115159050919050565b612f0981612ef4565b8114612f1457600080fd5b50565b600081519050612f2681612f00565b92915050565b600060208284031215612f4257612f416123fb565b5b6000612f5084828501612f17565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612fb5602a836125f6565b9150612fc082612f59565b604082019050919050565b60006020820190508181036000830152612fe481612fa8565b9050919050565b600081519050919050565b60005b83811015613014578082015181840152602081019050612ff9565b83811115613023576000848401525b50505050565b6000601f19601f8301169050919050565b600061304582612feb565b61304f81856125f6565b935061305f818560208601612ff6565b61306881613029565b840191505092915050565b6000602082019050818103600083015261308d818461303a565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006130cb601d836125f6565b91506130d682613095565b602082019050919050565b600060208201905081810360008301526130fa816130be565b9050919050565b600081519050919050565b600081905092915050565b600061312282613101565b61312c818561310c565b935061313c818560208601612ff6565b80840191505092915050565b60006131548284613117565b91508190509291505056fea26469706673582212208873da23c7e92ca7ae5e11536ce629bc0a947df80db36d3a1f32c50c092b625f64736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101735760003560e01c806380dc0672116100de578063a913a5f711610097578063f2fde38b11610071578063f2fde38b146103a8578063f40f0f52146103c4578063f7c618c1146103f4578063ff16ef391461041257610173565b8063a913a5f714610352578063b6b55f2514610382578063db2e21bc1461039e57610173565b806380dc0672146102b6578063817b1cd2146102c05780638c09c135146102de5780638da5cb5b146102fa5780638e0b019814610318578063999e2f751461033457610173565b8063630b5ba111610130578063630b5ba11461023e578063715018a61461024857806372f702f314610252578063746c8ae11461027057806378c196f31461027a5780637b280def1461029857610173565b806304554443146101785780631526fe27146101965780631959a002146101c95780633279beab146101fa5780633bcfc4b8146102165780633ccfd60b14610234575b600080fd5b61018061042e565b60405161018d91906123e0565b60405180910390f35b6101b060048036038101906101ab919061242c565b610434565b6040516101c094939291906124d8565b60405180910390f35b6101e360048036038101906101de919061255b565b610494565b6040516101f1929190612588565b60405180910390f35b610214600480360381019061020f919061242c565b6104b8565b005b61021e610684565b60405161022b91906123e0565b60405180910390f35b61023c61068a565b005b610246610a7c565b005b610250610b44565b005b61025a610c97565b60405161026791906125b1565b60405180910390f35b610278610cbb565b005b610282610de9565b60405161028f91906123e0565b60405180910390f35b6102a0610e97565b6040516102ad91906123e0565b60405180910390f35b6102be610e9d565b005b6102c8610f46565b6040516102d591906123e0565b60405180910390f35b6102f860048036038101906102f3919061242c565b610f4c565b005b610302611031565b60405161030f91906125db565b60405180910390f35b610332600480360381019061032d919061242c565b61105a565b005b61033c61113d565b60405161034991906123e0565b60405180910390f35b61036c6004803603810190610367919061255b565b6111c7565b60405161037991906123e0565b60405180910390f35b61039c6004803603810190610397919061242c565b6111df565b005b6103a66116ac565b005b6103c260048036038101906103bd919061255b565b6118f6565b005b6103de60048036038101906103d9919061255b565b611997565b6040516103eb91906123e0565b60405180910390f35b6103fc611b0c565b60405161040991906125b1565b60405180910390f35b61042c6004803603810190610427919061242c565b611b30565b005b60055481565b6007818154811061044457600080fd5b90600052602060002090600402016000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60086020528060005260406000206000915090508060000154908060010154905082565b6104c0611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461054d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161054490612653565b60405180910390fd5b6003547f000000000000000000000000a3637da59d9007f324c2628ebdd17dc1a839c39473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016105a991906125db565b602060405180830381865afa1580156105c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105ea9190612688565b6105f491906126e4565b811115610636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062d90612764565b60405180910390fd5b61068133827f000000000000000000000000a3637da59d9007f324c2628ebdd17dc1a839c39473ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b50565b60045481565b600260015414156106d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c7906127d0565b60405180910390fd5b600260018190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561075a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107519061283c565b60405180910390fd5b600060076000815481106107715761077061285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000816000015490506107d76000611cac565b6000610821836001015461081364e8d4a5100061080588600301548860000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b905060008111156108c257610834610de9565b811115610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d90612923565b60405180910390fd5b6108c133827f000000000000000000000000a3637da59d9007f324c2628ebdd17dc1a839c39473ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b600082111561093e576000836000018190555081600360008282546108e791906126e4565b9250508190555061093d33838660000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b61097064e8d4a5100061096286600301548660000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b83600101819055506000836000015411156109db57600554426109939190612943565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610a21565b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436483604051610a6791906123e0565b60405180910390a25050505060018081905550565b610a84611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0890612653565b60405180910390fd5b6000600780549050905060005b81811015610b4057610b2f81611cac565b80610b3990612999565b9050610b1e565b5050565b610b4c611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610bd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd090612653565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b7f000000000000000000000000a3637da59d9007f324c2628ebdd17dc1a839c39481565b610cc3611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4790612653565b60405180910390fd5b63014ca2bf6007600081548110610d6a57610d6961285c565b5b90600052602060002090600402016002015414610dbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db390612a2e565b60405180910390fd5b426007600081548110610dd257610dd161285c565b5b906000526020600020906004020160020181905550565b60006003547f000000000000000000000000a3637da59d9007f324c2628ebdd17dc1a839c39473ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610e4791906125db565b602060405180830381865afa158015610e64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e889190612688565b610e9291906126e4565b905090565b60065481565b610ea5611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2990612653565b60405180910390fd5b610f3c6000611cac565b6000600481905550565b60035481565b610f54611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fe1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fd890612653565b60405180910390fd5b6224ea00811115611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90612a9a565b60405180910390fd5b8060058190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611062611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e690612653565b60405180910390fd5b6014811115611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112a90612b06565b60405180910390fd5b8060068190555050565b60008060076000815481106111555761115461285c565b5b90600052602060002090600402019050428160020154111561117b5760009150506111c4565b6301e13380606460045460035484600201544261119891906126e4565b6111a29190612b26565b6111ac9190612b26565b6111b69190612baf565b6111c09190612baf565b9150505b90565b60026020528060005260406000206000915090505481565b60026001541415611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c906127d0565b60405180910390fd5b60026001819055506000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414156112c757600554426112839190612943565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600060076000815481106112de576112dd61285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905061133b6000611cac565b600081600001541115611435576000611392826001015461138464e8d4a5100061137687600301548760000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b90506000811115611433576113a5610de9565b8111156113e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113de90612c78565b60405180910390fd5b61143233827f000000000000000000000000a3637da59d9007f324c2628ebdd17dc1a839c39473ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b5b505b6000808411156116175760008360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161149e91906125db565b602060405180830381865afa1580156114bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114df9190612688565b90506115323330878760000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611ea0909392919063ffffffff16565b808460000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161159091906125db565b602060405180830381865afa1580156115ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d19190612688565b6115db91906126e4565b91506115f4828460000154611f2990919063ffffffff16565b8360000181905550816003600082825461160e9190612943565b92505081905550505b61164964e8d4a5100061163b85600301548560000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b82600101819055503373ffffffffffffffffffffffffffffffffffffffff167fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c8560405161169791906123e0565b60405180910390a25050506001808190555050565b600260015414156116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e9906127d0565b60405180910390fd5b6002600181905550600060076000815481106117115761171061285c565b5b906000526020600020906004020190506000600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600081600001549050806003600082825461177f91906126e4565b9250508190555042600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106117f4576064600654826117dc9190612b26565b6117e69190612baf565b816117f191906126e4565b90505b6000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061188833828560000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16611c269092919063ffffffff16565b60008260000181905550600082600101819055503373ffffffffffffffffffffffffffffffffffffffff167f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695826040516118e291906123e0565b60405180910390a250505060018081905550565b6118fe611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461198b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198290612653565b60405180910390fd5b61199481611f87565b50565b60008060076000815481106119af576119ae61285c565b5b906000526020600020906004020190506000600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905063014ca2bf82600201541415611a1d57600092505050611b07565b60008260030154905060006003549050836002015442118015611a41575060008114155b15611abc576000611a7a600954611a6c8760010154611a5e61113d565b611d9190919063ffffffff16565b611e0c90919063ffffffff16565b9050611ab8611aa983611a9b64e8d4a5100085611d9190919063ffffffff16565b611e0c90919063ffffffff16565b84611f2990919063ffffffff16565b9250505b611b008360010154611af264e8d4a51000611ae4868860000154611d9190919063ffffffff16565b611e0c90919063ffffffff16565b611e5690919063ffffffff16565b9450505050505b919050565b7f000000000000000000000000a3637da59d9007f324c2628ebdd17dc1a839c39481565b611b38611c1e565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bbc90612653565b60405180910390fd5b612710811115611c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0190612ce4565b60405180910390fd5b611c146000611cac565b8060048190555050565b600033905090565b611ca78363a9059cbb60e01b8484604051602401611c45929190612d04565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120b4565b505050565b600060078281548110611cc257611cc161285c565b5b9060005260206000209060040201905080600201544211611ce35750611d8e565b600060035490506000811415611d03574282600201819055505050611d8e565b6000611d37600954611d298560010154611d1b61113d565b611d9190919063ffffffff16565b611e0c90919063ffffffff16565b9050611d79611d6683611d5864e8d4a5100085611d9190919063ffffffff16565b611e0c90919063ffffffff16565b8460030154611f2990919063ffffffff16565b83600301819055504283600201819055505050505b50565b600080831415611da45760009050611e06565b60008284611db29190612b26565b9050828482611dc19190612baf565b14611e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df890612d9f565b60405180910390fd5b809150505b92915050565b6000611e4e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f00000000000081525061217b565b905092915050565b6000611e9883836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506121de565b905092915050565b611f23846323b872dd60e01b858585604051602401611ec193929190612dbf565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506120b4565b50505050565b6000808284611f389190612943565b905083811015611f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7490612e42565b60405180910390fd5b8091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611ff7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fee90612ed4565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000612116826040518060400160405280602081526020017f5361666542455032303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff166122429092919063ffffffff16565b905060008151111561217657808060200190518101906121369190612f2c565b612175576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161216c90612fcb565b60405180910390fd5b5b505050565b600080831182906121c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121b99190613073565b60405180910390fd5b50600083856121d19190612baf565b9050809150509392505050565b6000838311158290612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221d9190613073565b60405180910390fd5b506000838561223591906126e4565b9050809150509392505050565b6060612251848460008561225a565b90509392505050565b60606122658561237c565b6122a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229b906130e1565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff1685876040516122cd9190613148565b60006040518083038185875af1925050503d806000811461230a576040519150601f19603f3d011682016040523d82523d6000602084013e61230f565b606091505b50915091508115612324578092505050612374565b6000815111156123375780518082602001fd5b836040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161236b9190613073565b60405180910390fd5b949350505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156123be57506000801b8214155b92505050919050565b6000819050919050565b6123da816123c7565b82525050565b60006020820190506123f560008301846123d1565b92915050565b600080fd5b612409816123c7565b811461241457600080fd5b50565b60008135905061242681612400565b92915050565b600060208284031215612442576124416123fb565b5b600061245084828501612417565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061249e61249961249484612459565b612479565b612459565b9050919050565b60006124b082612483565b9050919050565b60006124c2826124a5565b9050919050565b6124d2816124b7565b82525050565b60006080820190506124ed60008301876124c9565b6124fa60208301866123d1565b61250760408301856123d1565b61251460608301846123d1565b95945050505050565b600061252882612459565b9050919050565b6125388161251d565b811461254357600080fd5b50565b6000813590506125558161252f565b92915050565b600060208284031215612571576125706123fb565b5b600061257f84828501612546565b91505092915050565b600060408201905061259d60008301856123d1565b6125aa60208301846123d1565b9392505050565b60006020820190506125c660008301846124c9565b92915050565b6125d58161251d565b82525050565b60006020820190506125f060008301846125cc565b92915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061263d6020836125f6565b915061264882612607565b602082019050919050565b6000602082019050818103600083015261266c81612630565b9050919050565b60008151905061268281612400565b92915050565b60006020828403121561269e5761269d6123fb565b5b60006126ac84828501612673565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006126ef826123c7565b91506126fa836123c7565b92508282101561270d5761270c6126b5565b5b828203905092915050565b7f6e6f7420656e6f75676820746f6b656e7320746f2074616b65206f7574000000600082015250565b600061274e601d836125f6565b915061275982612718565b602082019050919050565b6000602082019050818103600083015261277d81612741565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006127ba601f836125f6565b91506127c582612784565b602082019050919050565b600060208201905081810360008301526127e9816127ad565b9050919050565b7f4d6179206e6f7420646f206e6f726d616c207769746864726177206561726c79600082015250565b60006128266020836125f6565b9150612831826127f0565b602082019050919050565b6000602082019050818103600083015261285581612819565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2060208201527f422e000000000000000000000000000000000000000000000000000000000000604082015250565b600061290d6042836125f6565b91506129188261288b565b606082019050919050565b6000602082019050818103600083015261293c81612900565b9050919050565b600061294e826123c7565b9150612959836123c7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561298e5761298d6126b5565b5b828201905092915050565b60006129a4826123c7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156129d7576129d66126b5565b5b600182019050919050565b7f43616e206f6e6c792073746172742072657761726473206f6e63650000000000600082015250565b6000612a18601b836125f6565b9150612a23826129e2565b602082019050919050565b60006020820190508181036000830152612a4781612a0b565b9050919050565b7f4475726174696f6e206d7573742062652062656c6f772032207765656b730000600082015250565b6000612a84601e836125f6565b9150612a8f82612a4e565b602082019050919050565b60006020820190508181036000830152612ab381612a77565b9050919050565b7f4d6179206e6f742073657420686967686572207468616e203230250000000000600082015250565b6000612af0601b836125f6565b9150612afb82612aba565b602082019050919050565b60006020820190508181036000830152612b1f81612ae3565b9050919050565b6000612b31826123c7565b9150612b3c836123c7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b7557612b746126b5565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bba826123c7565b9150612bc5836123c7565b925082612bd557612bd4612b80565b5b828204905092915050565b7f43616e6e6f74207769746864726177206f746865722070656f706c652773207360008201527f74616b656420746f6b656e732e2020436f6e7461637420616e2061646d696e2060208201527f412e000000000000000000000000000000000000000000000000000000000000604082015250565b6000612c626042836125f6565b9150612c6d82612be0565b606082019050919050565b60006020820190508181036000830152612c9181612c55565b9050919050565b7f415059206d7573742062652062656c6f77203130303030250000000000000000600082015250565b6000612cce6018836125f6565b9150612cd982612c98565b602082019050919050565b60006020820190508181036000830152612cfd81612cc1565b9050919050565b6000604082019050612d1960008301856125cc565b612d2660208301846123d1565b9392505050565b7f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f60008201527f7700000000000000000000000000000000000000000000000000000000000000602082015250565b6000612d896021836125f6565b9150612d9482612d2d565b604082019050919050565b60006020820190508181036000830152612db881612d7c565b9050919050565b6000606082019050612dd460008301866125cc565b612de160208301856125cc565b612dee60408301846123d1565b949350505050565b7f536166654d6174683a206164646974696f6e206f766572666c6f770000000000600082015250565b6000612e2c601b836125f6565b9150612e3782612df6565b602082019050919050565b60006020820190508181036000830152612e5b81612e1f565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000612ebe6026836125f6565b9150612ec982612e62565b604082019050919050565b60006020820190508181036000830152612eed81612eb1565b9050919050565b60008115159050919050565b612f0981612ef4565b8114612f1457600080fd5b50565b600081519050612f2681612f00565b92915050565b600060208284031215612f4257612f416123fb565b5b6000612f5084828501612f17565b91505092915050565b7f5361666542455032303a204245503230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b6000612fb5602a836125f6565b9150612fc082612f59565b604082019050919050565b60006020820190508181036000830152612fe481612fa8565b9050919050565b600081519050919050565b60005b83811015613014578082015181840152602081019050612ff9565b83811115613023576000848401525b50505050565b6000601f19601f8301169050919050565b600061304582612feb565b61304f81856125f6565b935061305f818560208601612ff6565b61306881613029565b840191505092915050565b6000602082019050818103600083015261308d818461303a565b905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b60006130cb601d836125f6565b91506130d682613095565b602082019050919050565b600060208201905081810360008301526130fa816130be565b9050919050565b600081519050919050565b600081905092915050565b600061312282613101565b61312c818561310c565b935061313c818560208601612ff6565b80840191505092915050565b60006131548284613117565b91508190509291505056fea26469706673582212208873da23c7e92ca7ae5e11536ce629bc0a947df80db36d3a1f32c50c092b625f64736f6c634300080b0033
Deployed Bytecode Sourcemap
25489:9366:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26428:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26528:26;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;26610:44;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;33468:293;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26403:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31328:1251;;;:::i;:::-;;29525:190;;;:::i;:::-;;2840:140;;;:::i;:::-;;26225:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27605:241;;;:::i;:::-;;34129:134;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26462:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27506:91;;;:::i;:::-;;26370:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34451:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2198:79;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34660:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33769:352;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26310:51;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29752:1520;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32650:669;;;:::i;:::-;;3135:109;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27911:807;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26268:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34271:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26428:27;;;;:::o;26528:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26610:44::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;33468:293::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;33620:11:::1;;33581;:21;;;33611:4;33581:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;33570:7;:61;;33548:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;33699:54;33732:10;33745:7;33699:11;:24;;;;:54;;;;;:::i;:::-;33468:293:::0;:::o;26403:18::-;;;;:::o;31328:1251::-;24542:1;25140:7;;:19;;25132:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24542:1;25273:7;:18;;;;31433:15:::1;31401:16;:28;31418:10;31401:28;;;;;;;;;;;;;;;;:47;;31379:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;31521:21;31545:8;31554:1;31545:11;;;;;;;;:::i;:::-;;;;;;;;;;;;31521:35;;31567:21;31591:8;:20;31600:10;31591:20;;;;;;;;;;;;;;;31567:44;;31624:15;31642:4;:11;;;31624:29;;31664:13;31675:1;31664:10;:13::i;:::-;31688:15;31706:94;31774:4;:15;;;31706:49;31750:4;31706:39;31722:4;:22;;;31706:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;:53;;:94;;;;:::i;:::-;31688:112;;31825:1;31815:7;:11;31811:270;;;31880:18;:16;:18::i;:::-;31869:7;:29;;31843:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;32015:54;32048:10;32061:7;32015:11;:24;;;;:54;;;;;:::i;:::-;31811:270;32107:1;32097:7;:11;32093:166;;;32139:1;32125:4;:11;;:15;;;;32170:7;32155:11;;:22;;;;;;;:::i;:::-;;;;;;;;32192:55;32226:10;32239:7;32192:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;32093:166;32289:49;32333:4;32289:39;32305:4;:22;;;32289:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;32271:4;:15;;:67;;;;32369:1;32355:4;:11;;;:15;32351:174;;;32436:12;;32418:15;:30;;;;:::i;:::-;32387:16;:28;32404:10;32387:28;;;;;;;;;;;;;;;:61;;;;32351:174;;;32512:1;32481:16;:28;32498:10;32481:28;;;;;;;;;;;;;;;:32;;;;32351:174;32551:10;32542:29;;;32563:7;32542:29;;;;;;:::i;:::-;;;;;;;;31368:1211;;;;24498:1:::0;25452:7;:22;;;;31328:1251::o;29525:190::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;29580:14:::1;29597:8;:15;;;;29580:32;;29628:11;29623:85;29651:6;29645:3;:12;29623:85;;;29681:15;29692:3;29681:10;:15::i;:::-;29659:5;;;;:::i;:::-;;;29623:85;;;;29569:146;29525:190::o:0;2840:140::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2939:1:::1;2902:40;;2923:6;::::0;::::1;;;;;;;;2902:40;;;;;;;;;;;;2970:1;2953:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2840:140::o:0;26225:36::-;;;:::o;27605:241::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27715:8:::1;27680;27689:1;27680:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;;:43;27658:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;27823:15;27789:8;27798:1;27789:11;;;;;;;;:::i;:::-;;;;;;;;;;;;:31;;:49;;;;27605:241::o:0;34129:134::-;34178:7;34244:11;;34205;:21;;;34235:4;34205:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:50;;;;:::i;:::-;34198:57;;34129:134;:::o;26462:30::-;;;;:::o;27506:91::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;27558:13:::1;27569:1;27558:10;:13::i;:::-;27588:1;27582:3;:7;;;;27506:91::o:0;26370:26::-;;;;:::o;34451:201::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34561:7:::1;34542:15;:26;;34534:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;34629:15;34614:12;:30;;;;34451:201:::0;:::o;2198:79::-;2236:7;2263:6;;;;;;;;;;;2256:13;;2198:79;:::o;34660:192::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34767:2:::1;34749:14;:20;;34741:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;34830:14;34812:15;:32;;;;34660:192:::0;:::o;33769:352::-;33821:7;33841:21;33865:8;33874:1;33865:11;;;;;;;;:::i;:::-;;;;;;;;;;;;33841:35;;33918:15;33891:4;:24;;;:42;33887:83;;;33957:1;33950:8;;;;;33887:83;34104:8;34085:3;34065;;34037:11;;34009:4;:24;;;33991:15;:42;;;;:::i;:::-;33990:58;;;;:::i;:::-;33989:79;;;;:::i;:::-;33988:100;;;;:::i;:::-;:124;;;;:::i;:::-;33980:133;;;33769:352;;:::o;26310:51::-;;;;;;;;;;;;;;;;;:::o;29752:1520::-;24542:1;25140:7;;:19;;25132:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24542:1;25273:7;:18;;;;29853:1:::1;29821:16;:28;29838:10;29821:28;;;;;;;;;;;;;;;;:33;29817:127;;;29920:12;;29902:15;:30;;;;:::i;:::-;29871:16;:28;29888:10;29871:28;;;;;;;;;;;;;;;:61;;;;29817:127;29954:21;29978:8;29987:1;29978:11;;;;;;;;:::i;:::-;;;;;;;;;;;;29954:35;;30000:21;30024:8;:20;30033:10;30024:20;;;;;;;;;;;;;;;30000:44;;30057:13;30068:1;30057:10;:13::i;:::-;30099:1;30085:4;:11;;;:15;30081:516;;;30117:15;30135:142;30261:4;:15;;;30135:103;30233:4;30135:75;30187:4;:22;;;30135:4;:29;;;:51;;:75;;;;:::i;:::-;:97;;:103;;;;:::i;:::-;:125;;:142;;;;:::i;:::-;30117:160;;30306:1;30296:7;:11;30292:294;;;30369:18;:16;:18::i;:::-;30358:7;:29;;30328:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;30516:54;30549:10;30562:7;30516:11;:24;;;;:54;;;;;:::i;:::-;30292:294;30102:495;30081:516;30607:25;30661:1:::0;30651:7:::1;:11;30647:494;;;30679:22;30704:4;:12;;;;;;;;;;;;:22;;;30735:4;30704:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30679:62;;30756:140;30812:10;30850:4;30874:7;30756:4;:12;;;;;;;;;;;;:29;;;;:140;;;;;;:::i;:::-;31005:14;30948:4;:12;;;;;;;;;;;;:22;;;30979:4;30948:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:71;;;;:::i;:::-;30911:108;;31048:34;31064:17;31048:4;:11;;;:15;;:34;;;;:::i;:::-;31034:4;:11;;:48;;;;31112:17;31097:11;;:32;;;;;;;:::i;:::-;;;;;;;;30664:477;30647:494;31169:49;31213:4;31169:39;31185:4;:22;;;31169:4;:11;;;:15;;:39;;;;:::i;:::-;:43;;:49;;;;:::i;:::-;31151:4;:15;;:67;;;;31244:10;31236:28;;;31256:7;31236:28;;;;;;:::i;:::-;;;;;;;;29806:1466;;;24498:1:::0;25452:7;:22;;;;29752:1520;:::o;32650:669::-;24542:1;25140:7;;:19;;25132:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;24542:1;25273:7;:18;;;;32712:21:::1;32736:8;32745:1;32736:11;;;;;;;;:::i;:::-;;;;;;;;;;;;32712:35;;32758:21;32782:8;:20;32791:10;32782:20;;;;;;;;;;;;;;;32758:44;;32813:15;32831:4;:11;;;32813:29;;32868:7;32853:11;;:22;;;;;;;:::i;:::-;;;;;;;;33005:15;32973:16;:28;32990:10;32973:28;;;;;;;;;;;;;;;;:47;32969:124;;33078:3;33059:15;;33049:7;:25;;;;:::i;:::-;33048:33;;;;:::i;:::-;33037:44;;;;;:::i;:::-;;;32969:124;33134:1;33103:16;:28;33120:10;33103:28;;;;;;;;;;;;;;;:32;;;;33146:55;33180:10;33193:7;33146:4;:12;;;;;;;;;;;;:25;;;;:55;;;;;:::i;:::-;33226:1;33212:4;:11;;:15;;;;33256:1;33238:4;:15;;:19;;;;33291:10;33273:38;;;33303:7;33273:38;;;;;;:::i;:::-;;;;;;;;32701:618;;;24498:1:::0;25452:7;:22;;;;32650:669::o;3135:109::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3208:28:::1;3227:8;3208:18;:28::i;:::-;3135:109:::0;:::o;27911:807::-;27972:7;27992:21;28016:8;28025:1;28016:11;;;;;;;;:::i;:::-;;;;;;;;;;;;27992:35;;28038:21;28062:8;:15;28071:5;28062:15;;;;;;;;;;;;;;;28038:39;;28120:8;28092:4;:24;;;:36;28088:77;;;28152:1;28145:8;;;;;;28088:77;28175:25;28203:4;:22;;;28175:50;;28236:16;28255:11;;28236:30;;28299:4;:24;;;28281:15;:42;:59;;;;;28339:1;28327:8;:13;;28281:59;28277:338;;;28357:19;28379:99;28462:15;;28379:60;28423:4;:15;;;28379:21;:19;:21::i;:::-;:43;;:60;;;;:::i;:::-;:82;;:99;;;;:::i;:::-;28357:121;;28513:90;28553:35;28579:8;28553:21;28569:4;28553:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;28513:17;:21;;:90;;;;:::i;:::-;28493:110;;28342:273;28277:338;28645:65;28694:4;:15;;;28645:44;28684:4;28645:34;28661:17;28645:4;:11;;;:15;;:34;;;;:::i;:::-;:38;;:44;;;;:::i;:::-;:48;;:65;;;;:::i;:::-;28625:85;;;;;;27911:807;;;;:::o;26268:35::-;;;:::o;34271:172::-;2420:12;:10;:12::i;:::-;2410:22;;:6;;;;;;;;;;:22;;;2402:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;34354:5:::1;34344:6;:15;;34336:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;34399:13;34410:1;34399:10;:13::i;:::-;34429:6;34423:3;:12;;;;34271:172:::0;:::o;828:107::-;873:15;916:10;901:26;;828:107;:::o;13360:214::-;13443:123;13477:5;13520:23;;;13545:2;13549:5;13497:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13443:19;:123::i;:::-;13360:214;;;:::o;28794:648::-;28848:21;28872:8;28881:4;28872:14;;;;;;;;:::i;:::-;;;;;;;;;;;;28848:38;;28920:4;:24;;;28901:15;:43;28897:82;;28961:7;;;28897:82;28989:16;29008:11;;28989:30;;29046:1;29034:8;:13;29030:109;;;29091:15;29064:4;:24;;:42;;;;29121:7;;;;29030:109;29149:19;29171:87;29232:15;;29171:42;29197:4;:15;;;29171:21;:19;:21::i;:::-;:25;;:42;;;;:::i;:::-;:46;;:87;;;;:::i;:::-;29149:109;;29294:87;29335:35;29361:8;29335:21;29351:4;29335:11;:15;;:21;;;;:::i;:::-;:25;;:35;;;;:::i;:::-;29294:4;:22;;;:26;;:87;;;;:::i;:::-;29269:4;:22;;:112;;;;29419:15;29392:4;:24;;:42;;;;28837:605;;;28794:648;;:::o;5851:471::-;5909:7;6159:1;6154;:6;6150:47;;;6184:1;6177:8;;;;6150:47;6209:9;6225:1;6221;:5;;;;:::i;:::-;6209:17;;6254:1;6249;6245;:5;;;;:::i;:::-;:10;6237:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;6313:1;6306:8;;;5851:471;;;;;:::o;6798:132::-;6856:7;6883:39;6887:1;6890;6883:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6876:46;;6798:132;;;;:::o;4927:136::-;4985:7;5012:43;5016:1;5019;5012:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;5005:50;;4927:136;;;;:::o;13582:285::-;13726:133;13760:5;13803:27;;;13832:4;13838:2;13842:5;13780:68;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13726:19;:133::i;:::-;13582:285;;;;:::o;4463:181::-;4521:7;4541:9;4557:1;4553;:5;;;;:::i;:::-;4541:17;;4582:1;4577;:6;;4569:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;4635:1;4628:8;;;4463:181;;;;:::o;3350:266::-;3458:1;3438:22;;:8;:22;;;;3416:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3571:8;3542:38;;3563:6;;;;;;;;;;3542:38;;;;;;;;;;;;3600:8;3591:6;;:17;;;;;;;;;;;;;;;;;;3350:266;:::o;16202:860::-;16626:23;16652:106;16694:4;16652:106;;;;;;;;;;;;;;;;;16660:5;16652:27;;;;:106;;;;;:::i;:::-;16626:132;;16793:1;16773:10;:17;:21;16769:286;;;16946:10;16935:30;;;;;;;;;;;;:::i;:::-;16909:134;;;;;;;;;;;;:::i;:::-;;;;;;;;;16769:286;16272:790;16202:860;;:::o;7426:312::-;7546:7;7578:1;7574;:5;7581:12;7566:28;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;7605:9;7621:1;7617;:5;;;;:::i;:::-;7605:17;;7729:1;7722:8;;;7426:312;;;;;:::o;5366:226::-;5486:7;5519:1;5514;:6;;5522:12;5506:29;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;5546:9;5562:1;5558;:5;;;;:::i;:::-;5546:17;;5583:1;5576:8;;;5366:226;;;;;:::o;20986:230::-;21123:12;21155:53;21178:6;21186:4;21192:1;21195:12;21155:22;:53::i;:::-;21148:60;;20986:230;;;;;:::o;22607:1044::-;22780:12;22813:18;22824:6;22813:10;:18::i;:::-;22805:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;22939:12;22953:23;22980:6;:11;;22999:8;23023:4;22980:58;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22938:100;;;;23053:7;23049:595;;;23084:10;23077:17;;;;;;23049:595;23218:1;23198:10;:17;:21;23194:439;;;23461:10;23455:17;23522:15;23509:10;23505:2;23501:19;23494:44;23194:439;23604:12;23597:20;;;;;;;;;;;:::i;:::-;;;;;;;;22607:1044;;;;;;;:::o;17750:641::-;17810:4;18072:16;18099:19;18121:66;18099:88;;;;18303:7;18291:20;18279:32;;18352:11;18340:8;:23;;:42;;;;;18379:3;18367:15;;:8;:15;;18340:42;18332:51;;;;17750:641;;;:::o;7:77:1:-;44:7;73:5;62:16;;7:77;;;:::o;90:118::-;177:24;195:5;177:24;:::i;:::-;172:3;165:37;90:118;;:::o;214:222::-;307:4;345:2;334:9;330:18;322:26;;358:71;426:1;415:9;411:17;402:6;358:71;:::i;:::-;214:222;;;;:::o;523:117::-;632:1;629;622:12;769:122;842:24;860:5;842:24;:::i;:::-;835:5;832:35;822:63;;881:1;878;871:12;822:63;769:122;:::o;897:139::-;943:5;981:6;968:20;959:29;;997:33;1024:5;997:33;:::i;:::-;897:139;;;;:::o;1042:329::-;1101:6;1150:2;1138:9;1129:7;1125:23;1121:32;1118:119;;;1156:79;;:::i;:::-;1118:119;1276:1;1301:53;1346:7;1337:6;1326:9;1322:22;1301:53;:::i;:::-;1291:63;;1247:117;1042:329;;;;:::o;1377:126::-;1414:7;1454:42;1447:5;1443:54;1432:65;;1377:126;;;:::o;1509:60::-;1537:3;1558:5;1551:12;;1509:60;;;:::o;1575:142::-;1625:9;1658:53;1676:34;1685:24;1703:5;1685:24;:::i;:::-;1676:34;:::i;:::-;1658:53;:::i;:::-;1645:66;;1575:142;;;:::o;1723:126::-;1773:9;1806:37;1837:5;1806:37;:::i;:::-;1793:50;;1723:126;;;:::o;1855:140::-;1919:9;1952:37;1983:5;1952:37;:::i;:::-;1939:50;;1855:140;;;:::o;2001:159::-;2102:51;2147:5;2102:51;:::i;:::-;2097:3;2090:64;2001:159;;:::o;2166:581::-;2357:4;2395:3;2384:9;2380:19;2372:27;;2409:85;2491:1;2480:9;2476:17;2467:6;2409:85;:::i;:::-;2504:72;2572:2;2561:9;2557:18;2548:6;2504:72;:::i;:::-;2586;2654:2;2643:9;2639:18;2630:6;2586:72;:::i;:::-;2668;2736:2;2725:9;2721:18;2712:6;2668:72;:::i;:::-;2166:581;;;;;;;:::o;2753:96::-;2790:7;2819:24;2837:5;2819:24;:::i;:::-;2808:35;;2753:96;;;:::o;2855:122::-;2928:24;2946:5;2928:24;:::i;:::-;2921:5;2918:35;2908:63;;2967:1;2964;2957:12;2908:63;2855:122;:::o;2983:139::-;3029:5;3067:6;3054:20;3045:29;;3083:33;3110:5;3083:33;:::i;:::-;2983:139;;;;:::o;3128:329::-;3187:6;3236:2;3224:9;3215:7;3211:23;3207:32;3204:119;;;3242:79;;:::i;:::-;3204:119;3362:1;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3333:117;3128:329;;;;:::o;3463:332::-;3584:4;3622:2;3611:9;3607:18;3599:26;;3635:71;3703:1;3692:9;3688:17;3679:6;3635:71;:::i;:::-;3716:72;3784:2;3773:9;3769:18;3760:6;3716:72;:::i;:::-;3463:332;;;;;:::o;3801:250::-;3908:4;3946:2;3935:9;3931:18;3923:26;;3959:85;4041:1;4030:9;4026:17;4017:6;3959:85;:::i;:::-;3801:250;;;;:::o;4057:118::-;4144:24;4162:5;4144:24;:::i;:::-;4139:3;4132:37;4057:118;;:::o;4181:222::-;4274:4;4312:2;4301:9;4297:18;4289:26;;4325:71;4393:1;4382:9;4378:17;4369:6;4325:71;:::i;:::-;4181:222;;;;:::o;4409:169::-;4493:11;4527:6;4522:3;4515:19;4567:4;4562:3;4558:14;4543:29;;4409:169;;;;:::o;4584:182::-;4724:34;4720:1;4712:6;4708:14;4701:58;4584:182;:::o;4772:366::-;4914:3;4935:67;4999:2;4994:3;4935:67;:::i;:::-;4928:74;;5011:93;5100:3;5011:93;:::i;:::-;5129:2;5124:3;5120:12;5113:19;;4772:366;;;:::o;5144:419::-;5310:4;5348:2;5337:9;5333:18;5325:26;;5397:9;5391:4;5387:20;5383:1;5372:9;5368:17;5361:47;5425:131;5551:4;5425:131;:::i;:::-;5417:139;;5144:419;;;:::o;5569:143::-;5626:5;5657:6;5651:13;5642:22;;5673:33;5700:5;5673:33;:::i;:::-;5569:143;;;;:::o;5718:351::-;5788:6;5837:2;5825:9;5816:7;5812:23;5808:32;5805:119;;;5843:79;;:::i;:::-;5805:119;5963:1;5988:64;6044:7;6035:6;6024:9;6020:22;5988:64;:::i;:::-;5978:74;;5934:128;5718:351;;;;:::o;6075:180::-;6123:77;6120:1;6113:88;6220:4;6217:1;6210:15;6244:4;6241:1;6234:15;6261:191;6301:4;6321:20;6339:1;6321:20;:::i;:::-;6316:25;;6355:20;6373:1;6355:20;:::i;:::-;6350:25;;6394:1;6391;6388:8;6385:34;;;6399:18;;:::i;:::-;6385:34;6444:1;6441;6437:9;6429:17;;6261:191;;;;:::o;6458:179::-;6598:31;6594:1;6586:6;6582:14;6575:55;6458:179;:::o;6643:366::-;6785:3;6806:67;6870:2;6865:3;6806:67;:::i;:::-;6799:74;;6882:93;6971:3;6882:93;:::i;:::-;7000:2;6995:3;6991:12;6984:19;;6643:366;;;:::o;7015:419::-;7181:4;7219:2;7208:9;7204:18;7196:26;;7268:9;7262:4;7258:20;7254:1;7243:9;7239:17;7232:47;7296:131;7422:4;7296:131;:::i;:::-;7288:139;;7015:419;;;:::o;7440:181::-;7580:33;7576:1;7568:6;7564:14;7557:57;7440:181;:::o;7627:366::-;7769:3;7790:67;7854:2;7849:3;7790:67;:::i;:::-;7783:74;;7866:93;7955:3;7866:93;:::i;:::-;7984:2;7979:3;7975:12;7968:19;;7627:366;;;:::o;7999:419::-;8165:4;8203:2;8192:9;8188:18;8180:26;;8252:9;8246:4;8242:20;8238:1;8227:9;8223:17;8216:47;8280:131;8406:4;8280:131;:::i;:::-;8272:139;;7999:419;;;:::o;8424:182::-;8564:34;8560:1;8552:6;8548:14;8541:58;8424:182;:::o;8612:366::-;8754:3;8775:67;8839:2;8834:3;8775:67;:::i;:::-;8768:74;;8851:93;8940:3;8851:93;:::i;:::-;8969:2;8964:3;8960:12;8953:19;;8612:366;;;:::o;8984:419::-;9150:4;9188:2;9177:9;9173:18;9165:26;;9237:9;9231:4;9227:20;9223:1;9212:9;9208:17;9201:47;9265:131;9391:4;9265:131;:::i;:::-;9257:139;;8984:419;;;:::o;9409:180::-;9457:77;9454:1;9447:88;9554:4;9551:1;9544:15;9578:4;9575:1;9568:15;9595:290;9735:34;9731:1;9723:6;9719:14;9712:58;9804:34;9799:2;9791:6;9787:15;9780:59;9873:4;9868:2;9860:6;9856:15;9849:29;9595:290;:::o;9891:366::-;10033:3;10054:67;10118:2;10113:3;10054:67;:::i;:::-;10047:74;;10130:93;10219:3;10130:93;:::i;:::-;10248:2;10243:3;10239:12;10232:19;;9891:366;;;:::o;10263:419::-;10429:4;10467:2;10456:9;10452:18;10444:26;;10516:9;10510:4;10506:20;10502:1;10491:9;10487:17;10480:47;10544:131;10670:4;10544:131;:::i;:::-;10536:139;;10263:419;;;:::o;10688:305::-;10728:3;10747:20;10765:1;10747:20;:::i;:::-;10742:25;;10781:20;10799:1;10781:20;:::i;:::-;10776:25;;10935:1;10867:66;10863:74;10860:1;10857:81;10854:107;;;10941:18;;:::i;:::-;10854:107;10985:1;10982;10978:9;10971:16;;10688:305;;;;:::o;10999:233::-;11038:3;11061:24;11079:5;11061:24;:::i;:::-;11052:33;;11107:66;11100:5;11097:77;11094:103;;;11177:18;;:::i;:::-;11094:103;11224:1;11217:5;11213:13;11206:20;;10999:233;;;:::o;11238:177::-;11378:29;11374:1;11366:6;11362:14;11355:53;11238:177;:::o;11421:366::-;11563:3;11584:67;11648:2;11643:3;11584:67;:::i;:::-;11577:74;;11660:93;11749:3;11660:93;:::i;:::-;11778:2;11773:3;11769:12;11762:19;;11421:366;;;:::o;11793:419::-;11959:4;11997:2;11986:9;11982:18;11974:26;;12046:9;12040:4;12036:20;12032:1;12021:9;12017:17;12010:47;12074:131;12200:4;12074:131;:::i;:::-;12066:139;;11793:419;;;:::o;12218:180::-;12358:32;12354:1;12346:6;12342:14;12335:56;12218:180;:::o;12404:366::-;12546:3;12567:67;12631:2;12626:3;12567:67;:::i;:::-;12560:74;;12643:93;12732:3;12643:93;:::i;:::-;12761:2;12756:3;12752:12;12745:19;;12404:366;;;:::o;12776:419::-;12942:4;12980:2;12969:9;12965:18;12957:26;;13029:9;13023:4;13019:20;13015:1;13004:9;13000:17;12993:47;13057:131;13183:4;13057:131;:::i;:::-;13049:139;;12776:419;;;:::o;13201:177::-;13341:29;13337:1;13329:6;13325:14;13318:53;13201:177;:::o;13384:366::-;13526:3;13547:67;13611:2;13606:3;13547:67;:::i;:::-;13540:74;;13623:93;13712:3;13623:93;:::i;:::-;13741:2;13736:3;13732:12;13725:19;;13384:366;;;:::o;13756:419::-;13922:4;13960:2;13949:9;13945:18;13937:26;;14009:9;14003:4;13999:20;13995:1;13984:9;13980:17;13973:47;14037:131;14163:4;14037:131;:::i;:::-;14029:139;;13756:419;;;:::o;14181:348::-;14221:7;14244:20;14262:1;14244:20;:::i;:::-;14239:25;;14278:20;14296:1;14278:20;:::i;:::-;14273:25;;14466:1;14398:66;14394:74;14391:1;14388:81;14383:1;14376:9;14369:17;14365:105;14362:131;;;14473:18;;:::i;:::-;14362:131;14521:1;14518;14514:9;14503:20;;14181:348;;;;:::o;14535:180::-;14583:77;14580:1;14573:88;14680:4;14677:1;14670:15;14704:4;14701:1;14694:15;14721:185;14761:1;14778:20;14796:1;14778:20;:::i;:::-;14773:25;;14812:20;14830:1;14812:20;:::i;:::-;14807:25;;14851:1;14841:35;;14856:18;;:::i;:::-;14841:35;14898:1;14895;14891:9;14886:14;;14721:185;;;;:::o;14912:290::-;15052:34;15048:1;15040:6;15036:14;15029:58;15121:34;15116:2;15108:6;15104:15;15097:59;15190:4;15185:2;15177:6;15173:15;15166:29;14912:290;:::o;15208:366::-;15350:3;15371:67;15435:2;15430:3;15371:67;:::i;:::-;15364:74;;15447:93;15536:3;15447:93;:::i;:::-;15565:2;15560:3;15556:12;15549:19;;15208:366;;;:::o;15580:419::-;15746:4;15784:2;15773:9;15769:18;15761:26;;15833:9;15827:4;15823:20;15819:1;15808:9;15804:17;15797:47;15861:131;15987:4;15861:131;:::i;:::-;15853:139;;15580:419;;;:::o;16005:174::-;16145:26;16141:1;16133:6;16129:14;16122:50;16005:174;:::o;16185:366::-;16327:3;16348:67;16412:2;16407:3;16348:67;:::i;:::-;16341:74;;16424:93;16513:3;16424:93;:::i;:::-;16542:2;16537:3;16533:12;16526:19;;16185:366;;;:::o;16557:419::-;16723:4;16761:2;16750:9;16746:18;16738:26;;16810:9;16804:4;16800:20;16796:1;16785:9;16781:17;16774:47;16838:131;16964:4;16838:131;:::i;:::-;16830:139;;16557:419;;;:::o;16982:332::-;17103:4;17141:2;17130:9;17126:18;17118:26;;17154:71;17222:1;17211:9;17207:17;17198:6;17154:71;:::i;:::-;17235:72;17303:2;17292:9;17288:18;17279:6;17235:72;:::i;:::-;16982:332;;;;;:::o;17320:220::-;17460:34;17456:1;17448:6;17444:14;17437:58;17529:3;17524:2;17516:6;17512:15;17505:28;17320:220;:::o;17546:366::-;17688:3;17709:67;17773:2;17768:3;17709:67;:::i;:::-;17702:74;;17785:93;17874:3;17785:93;:::i;:::-;17903:2;17898:3;17894:12;17887:19;;17546:366;;;:::o;17918:419::-;18084:4;18122:2;18111:9;18107:18;18099:26;;18171:9;18165:4;18161:20;18157:1;18146:9;18142:17;18135:47;18199:131;18325:4;18199:131;:::i;:::-;18191:139;;17918:419;;;:::o;18343:442::-;18492:4;18530:2;18519:9;18515:18;18507:26;;18543:71;18611:1;18600:9;18596:17;18587:6;18543:71;:::i;:::-;18624:72;18692:2;18681:9;18677:18;18668:6;18624:72;:::i;:::-;18706;18774:2;18763:9;18759:18;18750:6;18706:72;:::i;:::-;18343:442;;;;;;:::o;18791:177::-;18931:29;18927:1;18919:6;18915:14;18908:53;18791:177;:::o;18974:366::-;19116:3;19137:67;19201:2;19196:3;19137:67;:::i;:::-;19130:74;;19213:93;19302:3;19213:93;:::i;:::-;19331:2;19326:3;19322:12;19315:19;;18974:366;;;:::o;19346:419::-;19512:4;19550:2;19539:9;19535:18;19527:26;;19599:9;19593:4;19589:20;19585:1;19574:9;19570:17;19563:47;19627:131;19753:4;19627:131;:::i;:::-;19619:139;;19346:419;;;:::o;19771:225::-;19911:34;19907:1;19899:6;19895:14;19888:58;19980:8;19975:2;19967:6;19963:15;19956:33;19771:225;:::o;20002:366::-;20144:3;20165:67;20229:2;20224:3;20165:67;:::i;:::-;20158:74;;20241:93;20330:3;20241:93;:::i;:::-;20359:2;20354:3;20350:12;20343:19;;20002:366;;;:::o;20374:419::-;20540:4;20578:2;20567:9;20563:18;20555:26;;20627:9;20621:4;20617:20;20613:1;20602:9;20598:17;20591:47;20655:131;20781:4;20655:131;:::i;:::-;20647:139;;20374:419;;;:::o;20799:90::-;20833:7;20876:5;20869:13;20862:21;20851:32;;20799:90;;;:::o;20895:116::-;20965:21;20980:5;20965:21;:::i;:::-;20958:5;20955:32;20945:60;;21001:1;20998;20991:12;20945:60;20895:116;:::o;21017:137::-;21071:5;21102:6;21096:13;21087:22;;21118:30;21142:5;21118:30;:::i;:::-;21017:137;;;;:::o;21160:345::-;21227:6;21276:2;21264:9;21255:7;21251:23;21247:32;21244:119;;;21282:79;;:::i;:::-;21244:119;21402:1;21427:61;21480:7;21471:6;21460:9;21456:22;21427:61;:::i;:::-;21417:71;;21373:125;21160:345;;;;:::o;21511:229::-;21651:34;21647:1;21639:6;21635:14;21628:58;21720:12;21715:2;21707:6;21703:15;21696:37;21511:229;:::o;21746:366::-;21888:3;21909:67;21973:2;21968:3;21909:67;:::i;:::-;21902:74;;21985:93;22074:3;21985:93;:::i;:::-;22103:2;22098:3;22094:12;22087:19;;21746:366;;;:::o;22118:419::-;22284:4;22322:2;22311:9;22307:18;22299:26;;22371:9;22365:4;22361:20;22357:1;22346:9;22342:17;22335:47;22399:131;22525:4;22399:131;:::i;:::-;22391:139;;22118:419;;;:::o;22543:99::-;22595:6;22629:5;22623:12;22613:22;;22543:99;;;:::o;22648:307::-;22716:1;22726:113;22740:6;22737:1;22734:13;22726:113;;;22825:1;22820:3;22816:11;22810:18;22806:1;22801:3;22797:11;22790:39;22762:2;22759:1;22755:10;22750:15;;22726:113;;;22857:6;22854:1;22851:13;22848:101;;;22937:1;22928:6;22923:3;22919:16;22912:27;22848:101;22697:258;22648:307;;;:::o;22961:102::-;23002:6;23053:2;23049:7;23044:2;23037:5;23033:14;23029:28;23019:38;;22961:102;;;:::o;23069:364::-;23157:3;23185:39;23218:5;23185:39;:::i;:::-;23240:71;23304:6;23299:3;23240:71;:::i;:::-;23233:78;;23320:52;23365:6;23360:3;23353:4;23346:5;23342:16;23320:52;:::i;:::-;23397:29;23419:6;23397:29;:::i;:::-;23392:3;23388:39;23381:46;;23161:272;23069:364;;;;:::o;23439:313::-;23552:4;23590:2;23579:9;23575:18;23567:26;;23639:9;23633:4;23629:20;23625:1;23614:9;23610:17;23603:47;23667:78;23740:4;23731:6;23667:78;:::i;:::-;23659:86;;23439:313;;;;:::o;23758:179::-;23898:31;23894:1;23886:6;23882:14;23875:55;23758:179;:::o;23943:366::-;24085:3;24106:67;24170:2;24165:3;24106:67;:::i;:::-;24099:74;;24182:93;24271:3;24182:93;:::i;:::-;24300:2;24295:3;24291:12;24284:19;;23943:366;;;:::o;24315:419::-;24481:4;24519:2;24508:9;24504:18;24496:26;;24568:9;24562:4;24558:20;24554:1;24543:9;24539:17;24532:47;24596:131;24722:4;24596:131;:::i;:::-;24588:139;;24315:419;;;:::o;24740:98::-;24791:6;24825:5;24819:12;24809:22;;24740:98;;;:::o;24844:147::-;24945:11;24982:3;24967:18;;24844:147;;;;:::o;24997:373::-;25101:3;25129:38;25161:5;25129:38;:::i;:::-;25183:88;25264:6;25259:3;25183:88;:::i;:::-;25176:95;;25280:52;25325:6;25320:3;25313:4;25306:5;25302:16;25280:52;:::i;:::-;25357:6;25352:3;25348:16;25341:23;;25105:265;24997:373;;;;:::o;25376:271::-;25506:3;25528:93;25617:3;25608:6;25528:93;:::i;:::-;25521:100;;25638:3;25631:10;;25376:271;;;;:::o
Swarm Source
ipfs://8873da23c7e92ca7ae5e11536ce629bc0a947df80db36d3a1f32c50c092b625f
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.