ETH Price: $2,526.12 (+0.04%)

Contract

0x10CCBE5BE5e510B9dC3213D1702Ca96Cb2129FC6
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve205969922024-08-24 7:33:237 days ago1724484803IN
0x10CCBE5B...Cb2129FC6
0 ETH0.00004741.02006023
Approve204955952024-08-10 3:42:5921 days ago1723261379IN
0x10CCBE5B...Cb2129FC6
0 ETH0.000027881.15296104
Approve198926862024-05-17 22:32:47105 days ago1715985167IN
0x10CCBE5B...Cb2129FC6
0 ETH0.000100383.83302066
Approve198926852024-05-17 22:32:35105 days ago1715985155IN
0x10CCBE5B...Cb2129FC6
0 ETH0.000084453.49131423
Approve183842022023-10-19 11:53:23317 days ago1697716403IN
0x10CCBE5B...Cb2129FC6
0 ETH0.000288026.22339554
Approve182489852023-09-30 14:02:11335 days ago1696082531IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0002721211.24980167
Unlock179553252023-08-20 10:21:11377 days ago1692526871IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0011170214.73145098
Approve176524442023-07-08 23:56:59419 days ago1688860619IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0003201813.23675544
Approve176480382023-07-08 9:04:35420 days ago1688807075IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0007755716.75797929
Approve175779532023-06-28 12:55:35430 days ago1687956935IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0008022417.26265211
Approve175764522023-06-28 7:52:23430 days ago1687938743IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0006610714.30242944
Unlock175392622023-06-23 2:17:59435 days ago1687486679IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0012124215.98704915
Approve174791842023-06-14 15:51:59443 days ago1686757919IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0012434726.7225225
Approve174397052023-06-09 2:26:23449 days ago1686277583IN
0x10CCBE5B...Cb2129FC6
0 ETH0.000485320.06317462
Claim Rewards174209342023-06-06 10:51:23452 days ago1686048683IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0014159320.50095705
Approve174126042023-06-05 6:39:47453 days ago1685947187IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0009954521.53680722
Approve174070072023-06-04 11:40:47454 days ago1685878847IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0008210117.75824483
Claim Rewards174070002023-06-04 11:39:23454 days ago1685878763IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0011241321.63164043
Approve174061392023-06-04 8:43:23454 days ago1685868203IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0009331720.19472815
Approve174027262023-06-03 21:10:47454 days ago1685826647IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0007041726.49970046
Approve174027252023-06-03 21:10:35454 days ago1685826635IN
0x10CCBE5B...Cb2129FC6
0 ETH0.001170325.18239249
Approve174027002023-06-03 21:05:35454 days ago1685826335IN
0x10CCBE5B...Cb2129FC6
0 ETH0.001045722.50125146
Approve174026812023-06-03 21:01:47454 days ago1685826107IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0013170928.45872127
Claim Rewards173995672023-06-03 10:29:11455 days ago1685788151IN
0x10CCBE5B...Cb2129FC6
0 ETH0.00124123.88065933
Lock173995652023-06-03 10:28:47455 days ago1685788127IN
0x10CCBE5B...Cb2129FC6
0 ETH0.0062156124.48875152
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RULER

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-05-31
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

/*

Become The King ($RULER)
- 1 trillion supply
- 99% of supply is used as liquidity, locked permanently
- a 'ruler' that collects the LP fees
- lock more tokens than the current ruler to usurp them
- locked tokens are returned to the original ruler when usurped
- the ruler can add to their own locked tokens
- the ruler can also unlock tokens and return them to their wallet
- 10% transfer and buy fee (no sell fee), disbursed to holders (8%) and ruler (2%)
- no fee on locks/unlocks

Obviously don't buy the token unless you know the risks.
Good luck and have fun!

https://ruler.tax

*/

interface Callable {
	function tokenCallback(address _from, uint256 _tokens, bytes calldata _data) external returns (bool);
}

interface Router {
	function factory() external view returns (address);
	function positionManager() external view returns (address);
	function WETH9() external view returns (address);
}

interface Factory {
	function createPool(address _tokenA, address _tokenB, uint24 _fee) external returns (address);
}

interface Pool {
	function initialize(uint160 _sqrtPriceX96) external;
}

interface Params {
	struct MintParams {
		address token0;
		address token1;
		uint24 fee;
		int24 tickLower;
		int24 tickUpper;
		uint256 amount0Desired;
		uint256 amount1Desired;
		uint256 amount0Min;
		uint256 amount1Min;
		address recipient;
		uint256 deadline;
	}
	struct CollectParams {
		uint256 tokenId;
		address recipient;
		uint128 amount0Max;
		uint128 amount1Max;
	}
}

interface PositionManager is Params {
	function mint(MintParams calldata) external payable returns (uint256 tokenId, uint128 liquidity, uint256 amount0, uint256 amount1);
	function collect(CollectParams calldata) external payable returns (uint256 amount0, uint256 amount1);
}


contract RULER is Params {

	uint256 constant private FLOAT_SCALAR = 2**64;
	uint256 constant private UINT_MAX = type(uint256).max;
	uint128 constant private UINT128_MAX = type(uint128).max;
	uint256 constant private INITIAL_SUPPLY = 1e30; // 1 trillion
	Router constant private ROUTER = Router(0x68b3465833fb72A70ecDF485E0e4C7bD8665Fc45);
	uint256 constant private INITIAL_ETH_MC = 1e3 ether; // 1,000 ETH initial market cap price
	uint256 constant private CONCENTRATED_PERCENT = 5; // 5% of tokens will be sold at the min price (50 ETH)
	uint256 constant private UPPER_ETH_MC = 1e5 ether; // 100,000 ETH max market cap price
	uint256 constant private INITIAL_RULER_TOKENS_PERCENT = 1; // 1%
	uint256 constant private TRANSFER_FEE = 10; // 10%
	uint256 constant private RULER_FEE = 2; // 2% of the 10% transfer fee goes to ruler, 8% to everyone else

	int24 constant internal MIN_TICK = -887272;
	int24 constant internal MAX_TICK = -MIN_TICK;
	uint160 constant internal MIN_SQRT_RATIO = 4295128739;
	uint160 constant internal MAX_SQRT_RATIO = 1461446703485210103287273052203988822378723970342;

	string constant public name = "Become The King";
	string constant public symbol = "RULER";
	uint8 constant public decimals = 18;

	struct User {
		uint256 balance;
		mapping(address => uint256) allowance;
		int256 scaledPayout;
	}

	struct Info {
		address pool;
		address ruler;
		uint256 rulerLocked;
		uint256 totalSupply;
		uint256 scaledRewardsPerToken;
		mapping(address => User) users;
		uint256 lowerPositionId;
		uint256 upperPositionId;
	}
	Info private info;


	event Transfer(address indexed from, address indexed to, uint256 tokens);
	event Approval(address indexed owner, address indexed spender, uint256 tokens);
	event ClaimRewards(address indexed user, uint256 amount);
	event Locked(address indexed ruler, uint256 amount);
	event Unlocked(address indexed ruler, uint256 amount);
	event Reward(uint256 amount);


	modifier _onlyRuler() {
		require(msg.sender == ruler());
		_;
	}


	constructor() {
		address _this = address(this);
		address _weth = ROUTER.WETH9();
		(uint160 _initialSqrtPrice, ) = _getPriceAndTickFromValues(_weth < _this, INITIAL_SUPPLY, INITIAL_ETH_MC);
		info.pool = Factory(ROUTER.factory()).createPool(_this, _weth, 10000);
		Pool(pool()).initialize(_initialSqrtPrice);
	}

	function setRuler(address _ruler) external _onlyRuler {
		info.ruler = _ruler;
	}
	
	function unlock(uint256 _amount) external _onlyRuler {
		unchecked {
			require(rulerLocked() >= _amount);
			info.rulerLocked -= _amount;
			_transfer(address(this), ruler(), _amount);
			emit Unlocked(ruler(), _amount);
		}
	}

	
	function initialize() external {
		require(totalSupply() == 0);
		address _this = address(this);
		address _weth = ROUTER.WETH9();
		bool _weth0 = _weth < _this;
		PositionManager _pm = PositionManager(ROUTER.positionManager());
		info.totalSupply = INITIAL_SUPPLY;
		info.ruler = 0xFaDED72464D6e76e37300B467673b36ECc4d2ccF;
		info.rulerLocked = INITIAL_RULER_TOKENS_PERCENT * INITIAL_SUPPLY / 100;
		emit Locked(ruler(), rulerLocked());
		info.users[_this].balance = INITIAL_SUPPLY;
		emit Transfer(address(0x0), _this, INITIAL_SUPPLY);
		_approve(_this, address(_pm), INITIAL_SUPPLY - rulerLocked());
		( , int24 _minTick) = _getPriceAndTickFromValues(_weth0, INITIAL_SUPPLY, INITIAL_ETH_MC);
		( , int24 _maxTick) = _getPriceAndTickFromValues(_weth0, INITIAL_SUPPLY, UPPER_ETH_MC);
		uint256 _concentratedTokens = CONCENTRATED_PERCENT * INITIAL_SUPPLY / 100;
		(info.lowerPositionId, , , ) = _pm.mint(MintParams({
			token0: _weth0 ? _weth : _this,
			token1: !_weth0 ? _weth : _this,
			fee: 10000,
			tickLower: _weth0 ? _minTick - 200 : _minTick,
			tickUpper: !_weth0 ? _minTick + 200 : _minTick,
			amount0Desired: _weth0 ? 0 : _concentratedTokens,
			amount1Desired: !_weth0 ? 0 : _concentratedTokens,
			amount0Min: 0,
			amount1Min: 0,
			recipient: _this,
			deadline: block.timestamp
		}));
		(info.upperPositionId, , , ) = _pm.mint(MintParams({
			token0: _weth0 ? _weth : _this,
			token1: !_weth0 ? _weth : _this,
			fee: 10000,
			tickLower: _weth0 ? _maxTick : _minTick + 200,
			tickUpper: !_weth0 ? _maxTick : _minTick - 200,
			amount0Desired: _weth0 ? 0 : INITIAL_SUPPLY - _concentratedTokens - rulerLocked(),
			amount1Desired: !_weth0 ? 0 : INITIAL_SUPPLY - _concentratedTokens - rulerLocked(),
			amount0Min: 0,
			amount1Min: 0,
			recipient: _this,
			deadline: block.timestamp
		}));
	}

	function collectTradingFees() public {
		PositionManager _pm = PositionManager(ROUTER.positionManager());
		_pm.collect(CollectParams({
			tokenId: info.lowerPositionId,
			recipient: ruler(),
			amount0Max: UINT128_MAX,
			amount1Max: UINT128_MAX
		}));
		_pm.collect(CollectParams({
			tokenId: info.upperPositionId,
			recipient: ruler(),
			amount0Max: UINT128_MAX,
			amount1Max: UINT128_MAX
		}));
	}

	function lock(uint256 _amount) external {
		unchecked {
			if (msg.sender == ruler()) {
				transfer(address(this), _amount);
				info.rulerLocked += _amount;
			} else {
				require(_amount > rulerLocked());
				collectTradingFees();
				_transfer(address(this), ruler(), rulerLocked());
				emit Unlocked(ruler(), rulerLocked());
				transfer(address(this), _amount);
				info.ruler = msg.sender;
				info.rulerLocked = _amount;
			}
			emit Locked(ruler(), _amount);
		}
	}

	function claimRewards() external {
		unchecked {
			uint256 _rewards = rewardsOf(msg.sender);
			if (_rewards > 0) {
				info.users[msg.sender].scaledPayout += int256(_rewards * FLOAT_SCALAR);
				_transfer(address(this), msg.sender, _rewards);
				emit ClaimRewards(msg.sender, _rewards);
			}
		}
	}
	
	function burn(uint256 _tokens) external {
		_burn(msg.sender, _tokens);
	}

	function transfer(address _to, uint256 _tokens) public returns (bool) {
		return _transfer(msg.sender, _to, _tokens);
	}

	function approve(address _spender, uint256 _tokens) external returns (bool) {
		return _approve(msg.sender, _spender, _tokens);
	}

	function transferFrom(address _from, address _to, uint256 _tokens) external returns (bool) {
		unchecked {
			uint256 _allowance = allowance(_from, msg.sender);
			require(_allowance >= _tokens);
			if (_allowance != UINT_MAX) {
				info.users[_from].allowance[msg.sender] -= _tokens;
			}
			return _transfer(_from, _to, _tokens);
		}
	}

	function transferAndCall(address _to, uint256 _tokens, bytes calldata _data) external returns (bool) {
		unchecked {
			uint256 _balanceBefore = balanceOf(_to);
			_transfer(msg.sender, _to, _tokens);
			uint256 _tokensReceived = balanceOf(_to) - _balanceBefore;
			uint32 _size;
			assembly {
				_size := extcodesize(_to)
			}
			if (_size > 0) {
				require(Callable(_to).tokenCallback(msg.sender, _tokensReceived, _data));
			}
			return true;
		}
	}
	

	function pool() public view returns (address) {
		return info.pool;
	}

	function ruler() public view returns (address) {
		return info.ruler;
	}

	function rulerLocked() public view returns (uint256) {
		return info.rulerLocked;
	}

	function totalSupply() public view returns (uint256) {
		return info.totalSupply;
	}

	function balanceOf(address _user) public view returns (uint256) {
		return info.users[_user].balance;
	}

	function rewardsOf(address _user) public view returns (uint256) {
		return uint256(int256(info.scaledRewardsPerToken * balanceOf(_user)) - info.users[_user].scaledPayout) / FLOAT_SCALAR;
	}

	function allowance(address _user, address _spender) public view returns (uint256) {
		return info.users[_user].allowance[_spender];
	}

	function positions() external view returns (uint256 lower, uint256 upper) {
		return (info.lowerPositionId, info.upperPositionId);
	}

	function allInfoFor(address _user) external view returns (address currentRuler, uint256 rulerLockedTokens, uint256 totalTokens, uint256 userBalance, uint256 userRewards) {
		return (ruler(), rulerLocked(), totalSupply(), balanceOf(_user), rewardsOf(_user));
	}


	function _burn(address _account, uint256 _tokens) internal {
		unchecked {
			require(balanceOf(_account) >= _tokens);
			info.totalSupply -= _tokens;
			info.users[_account].balance -= _tokens;
			info.users[_account].scaledPayout -= int256(_tokens * info.scaledRewardsPerToken);
			emit Transfer(_account, address(0x0), _tokens);
		}
	}
	
	function _approve(address _owner, address _spender, uint256 _tokens) internal returns (bool) {
		info.users[_owner].allowance[_spender] = _tokens;
		emit Approval(_owner, _spender, _tokens);
		return true;
	}
	
	function _transfer(address _from, address _to, uint256 _tokens) internal returns (bool) {
		unchecked {
			require(balanceOf(_from) >= _tokens);
			info.users[_from].balance -= _tokens;
			info.users[_from].scaledPayout -= int256(_tokens * info.scaledRewardsPerToken);
			address _this = address(this);
			address _pm = ROUTER.positionManager();
			uint256 _fee = 0;
			if (!(_from == _this || _to == _this || _to == pool() || _from == _pm || _to == _pm)) {
				_fee = _tokens * TRANSFER_FEE / 100;
				info.users[_this].balance += _fee;
				emit Transfer(_from, _this, _fee);
			}
			uint256 _transferred = _tokens - _fee;
			info.users[_to].balance += _transferred;
			info.users[_to].scaledPayout += int256(_transferred * info.scaledRewardsPerToken);
			emit Transfer(_from, _to, _transferred);
			_disburse(_fee);
			return true;
		}
	}

	function _disburse(uint256 _amount) internal {
		unchecked {
			if (_amount > 0) {
				uint256 _rulerReward = RULER_FEE * _amount / TRANSFER_FEE;
				info.users[ruler()].scaledPayout -= int256(_rulerReward * FLOAT_SCALAR);
				info.scaledRewardsPerToken += (_amount - _rulerReward) * FLOAT_SCALAR / (totalSupply() - balanceOf(pool()) - balanceOf(address(this)));
				emit Reward(_amount);
			}
		}
	}


	function _getSqrtRatioAtTick(int24 tick) internal pure returns (uint160 sqrtPriceX96) {
		unchecked {
			uint256 absTick = tick < 0 ? uint256(-int256(tick)) : uint256(int256(tick));
			require(absTick <= uint256(int256(MAX_TICK)), 'T');

			uint256 ratio = absTick & 0x1 != 0 ? 0xfffcb933bd6fad37aa2d162d1a594001 : 0x100000000000000000000000000000000;
			if (absTick & 0x2 != 0) ratio = (ratio * 0xfff97272373d413259a46990580e213a) >> 128;
			if (absTick & 0x4 != 0) ratio = (ratio * 0xfff2e50f5f656932ef12357cf3c7fdcc) >> 128;
			if (absTick & 0x8 != 0) ratio = (ratio * 0xffe5caca7e10e4e61c3624eaa0941cd0) >> 128;
			if (absTick & 0x10 != 0) ratio = (ratio * 0xffcb9843d60f6159c9db58835c926644) >> 128;
			if (absTick & 0x20 != 0) ratio = (ratio * 0xff973b41fa98c081472e6896dfb254c0) >> 128;
			if (absTick & 0x40 != 0) ratio = (ratio * 0xff2ea16466c96a3843ec78b326b52861) >> 128;
			if (absTick & 0x80 != 0) ratio = (ratio * 0xfe5dee046a99a2a811c461f1969c3053) >> 128;
			if (absTick & 0x100 != 0) ratio = (ratio * 0xfcbe86c7900a88aedcffc83b479aa3a4) >> 128;
			if (absTick & 0x200 != 0) ratio = (ratio * 0xf987a7253ac413176f2b074cf7815e54) >> 128;
			if (absTick & 0x400 != 0) ratio = (ratio * 0xf3392b0822b70005940c7a398e4b70f3) >> 128;
			if (absTick & 0x800 != 0) ratio = (ratio * 0xe7159475a2c29b7443b29c7fa6e889d9) >> 128;
			if (absTick & 0x1000 != 0) ratio = (ratio * 0xd097f3bdfd2022b8845ad8f792aa5825) >> 128;
			if (absTick & 0x2000 != 0) ratio = (ratio * 0xa9f746462d870fdf8a65dc1f90e061e5) >> 128;
			if (absTick & 0x4000 != 0) ratio = (ratio * 0x70d869a156d2a1b890bb3df62baf32f7) >> 128;
			if (absTick & 0x8000 != 0) ratio = (ratio * 0x31be135f97d08fd981231505542fcfa6) >> 128;
			if (absTick & 0x10000 != 0) ratio = (ratio * 0x9aa508b5b7a84e1c677de54f3e99bc9) >> 128;
			if (absTick & 0x20000 != 0) ratio = (ratio * 0x5d6af8dedb81196699c329225ee604) >> 128;
			if (absTick & 0x40000 != 0) ratio = (ratio * 0x2216e584f5fa1ea926041bedfe98) >> 128;
			if (absTick & 0x80000 != 0) ratio = (ratio * 0x48a170391f7dc42444e8fa2) >> 128;

			if (tick > 0) ratio = type(uint256).max / ratio;

			sqrtPriceX96 = uint160((ratio >> 32) + (ratio % (1 << 32) == 0 ? 0 : 1));
		}
	}

	function _getTickAtSqrtRatio(uint160 sqrtPriceX96) internal pure returns (int24 tick) {
		unchecked {
			require(sqrtPriceX96 >= MIN_SQRT_RATIO && sqrtPriceX96 < MAX_SQRT_RATIO, 'R');
			uint256 ratio = uint256(sqrtPriceX96) << 32;

			uint256 r = ratio;
			uint256 msb = 0;

			assembly {
				let f := shl(7, gt(r, 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(6, gt(r, 0xFFFFFFFFFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(5, gt(r, 0xFFFFFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(4, gt(r, 0xFFFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(3, gt(r, 0xFF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(2, gt(r, 0xF))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := shl(1, gt(r, 0x3))
				msb := or(msb, f)
				r := shr(f, r)
			}
			assembly {
				let f := gt(r, 0x1)
				msb := or(msb, f)
			}

			if (msb >= 128) r = ratio >> (msb - 127);
			else r = ratio << (127 - msb);

			int256 log_2 = (int256(msb) - 128) << 64;

			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(63, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(62, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(61, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(60, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(59, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(58, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(57, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(56, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(55, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(54, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(53, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(52, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(51, f))
				r := shr(f, r)
			}
			assembly {
				r := shr(127, mul(r, r))
				let f := shr(128, r)
				log_2 := or(log_2, shl(50, f))
			}

			int256 log_sqrt10001 = log_2 * 255738958999603826347141;

			int24 tickLow = int24((log_sqrt10001 - 3402992956809132418596140100660247210) >> 128);
			int24 tickHi = int24((log_sqrt10001 + 291339464771989622907027621153398088495) >> 128);

			tick = tickLow == tickHi ? tickLow : _getSqrtRatioAtTick(tickHi) <= sqrtPriceX96 ? tickHi : tickLow;
		}
	}

	function _sqrt(uint256 _n) internal pure returns (uint256 result) {
		unchecked {
			uint256 _tmp = (_n + 1) / 2;
			result = _n;
			while (_tmp < result) {
				result = _tmp;
				_tmp = (_n / _tmp + _tmp) / 2;
			}
		}
	}

	function _getPriceAndTickFromValues(bool _weth0, uint256 _tokens, uint256 _weth) internal pure returns (uint160 price, int24 tick) {
		uint160 _tmpPrice = uint160(_sqrt(2**192 / (!_weth0 ? _tokens : _weth) * (_weth0 ? _tokens : _weth)));
		tick = _getTickAtSqrtRatio(_tmpPrice);
		tick = tick - (tick % 200);
		price = _getSqrtRatioAtTick(tick);
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimRewards","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ruler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reward","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"ruler","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"allInfoFor","outputs":[{"internalType":"address","name":"currentRuler","type":"address"},{"internalType":"uint256","name":"rulerLockedTokens","type":"uint256"},{"internalType":"uint256","name":"totalTokens","type":"uint256"},{"internalType":"uint256","name":"userBalance","type":"uint256"},{"internalType":"uint256","name":"userRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectTradingFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"positions","outputs":[{"internalType":"uint256","name":"lower","type":"uint256"},{"internalType":"uint256","name":"upper","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"rewardsOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ruler","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rulerLocked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_ruler","type":"address"}],"name":"setRuler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"transferAndCall","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokens","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801562000010575f80fd5b505f3090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000067573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200008d919062000975565b90505f620000c16001600160a01b03808516908416106c0c9f2c9cd04674edea40000000683635c9adc5dea000006200023a565b5090507368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000115573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200013b919062000975565b60405163a167129560e01b81526001600160a01b03858116600483015284811660248301526127106044830152919091169063a1671295906064016020604051808303815f875af115801562000193573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001b9919062000975565b5f80546001600160a01b0319166001600160a01b0392909216918217905560405163f637731d60e01b81526001600160a01b038381166004830152919091169063f637731d906024015f604051808303815f87803b1580156200021a575f80fd5b505af11580156200022d573d5f803e3d5ffd5b5050505050505062000a4e565b5f805f62000282866200024e578462000250565b855b87156200025e578562000260565b865b6200027090600160c01b620009cc565b6200027c9190620009e2565b620002c2565b90506200028f816200030d565b91506200029e60c88362000a02565b620002aa908362000a26565b9150620002b78262000632565b925050935093915050565b80600260018201045b818110156200030757809150600281828581620002ec57620002ec620009a4565b040181620002fe57620002fe620009a4565b049050620002cb565b50919050565b5f6401000276a36001600160a01b0383161080159062000349575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b6200037f5760405162461bcd60e51b81526020600482015260016024820152602960f91b60448201526064015b60405180910390fd5b600160201b600160c01b03602083901b166001600160801b03811160071b81811c6001600160401b03811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c979088119617909417909217179091171717608081106200041357607f810383901c91506200041d565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b1462000623576001600160a01b038916620006058262000632565b6001600160a01b031611156200061c578162000625565b8062000625565b815b9998505050505050505050565b5f805f8360020b1262000649578260020b62000650565b8260020b5f035b9050620d89e88111156200068b5760405162461bcd60e51b81526020600482015260016024820152601560fa1b604482015260640162000376565b5f816001165f03620006a257600160801b620006b4565b6ffffcb933bd6fad37aa2d162d1a5940015b6001600160881b031690506002821615620006df576ffff97272373d413259a46990580e213a0260801c5b6004821615620006ff576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156200071f576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156200073f576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156200075f576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156200077f576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156200079f576ffe5dee046a99a2a811c461f1969c30530260801c5b610100821615620007c0576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615620007e1576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161562000802576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161562000823576fe7159475a2c29b7443b29c7fa6e889d90260801c5b61100082161562000844576fd097f3bdfd2022b8845ad8f792aa58250260801c5b61200082161562000865576fa9f746462d870fdf8a65dc1f90e061e50260801c5b61400082161562000886576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615620008a7576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615620008c9576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615620008ea576e5d6af8dedb81196699c329225ee6040260801c5b620400008216156200090a576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161562000928576b048a170391f7dc42444e8fa20260801c5b5f8460020b13156200094b57805f1981620009475762000947620009a4565b0490505b6401000000008106156200096157600162000963565b5f5b60ff16602082901c0192505050919050565b5f6020828403121562000986575f80fd5b81516001600160a01b03811681146200099d575f80fd5b9392505050565b634e487b7160e01b5f52601260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f82620009dd57620009dd620009a4565b500490565b8082028115828204841417620009fc57620009fc620009b8565b92915050565b5f8260020b8062000a175762000a17620009a4565b808360020b0791505092915050565b600282810b9082900b03627fffff198112627fffff82131715620009fc57620009fc620009b8565b611ed78062000a5c5f395ff3fe608060405234801561000f575f80fd5b5060043610610148575f3560e01c806353f8b303116100bf57806395d89b411161007957806395d89b41146102ef578063a51dd75d14610313578063a9059cbb14610324578063ba5b798214610337578063dd46706414610352578063dd62ed3e14610365575f80fd5b806353f8b3031461026c57806357f6b812146102745780636198e339146102b957806370a08231146102cc5780638129fc1c146102df578063838e2c9d146102e7575f80fd5b8063313ce56711610110578063313ce567146101fc578063372500ab146102165780634000aea01461022057806342966c6814610233578063479ba7ae146102465780634fa4c5d714610259575f80fd5b806306fdde031461014c578063095ea7b31461019057806316f0115b146101b357806318160ddd146101d757806323b872dd146101e9575b5f80fd5b61017a6040518060400160405280600f81526020016e4265636f6d6520546865204b696e6760881b81525081565b60405161018791906119e2565b60405180910390f35b6101a361019e366004611a41565b6103a1565b6040519015158152602001610187565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610187565b6003545b604051908152602001610187565b6101a36101f7366004611a6b565b6103b6565b610204601281565b60405160ff9091168152602001610187565b61021e610431565b005b6101a361022e366004611aa9565b6104a7565b61021e610241366004611b2b565b610564565b6101db610254366004611b42565b61056e565b61021e610267366004611b42565b6105b9565b61021e6105f1565b610287610282366004611b42565b6107d7565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610187565b61021e6102c7366004611b2b565b610818565b6101db6102da366004611b42565b6108ae565b61021e6108c8565b6002546101db565b61017a60405180604001604052806005815260200164292aa622a960d91b81525081565b6001546001600160a01b03166101bf565b6101a3610332366004611a41565b610e21565b60065460075460408051928352602083019190915201610187565b61021e610360366004611b2b565b610e2d565b6101db610373366004611b64565b6001600160a01b039182165f9081526005602090815260408083209390941682526001909201909152205490565b5f6103ad338484610f44565b90505b92915050565b6001600160a01b0383165f908152600560209081526040808320338452600101909152812054828110156103e8575f80fd5b5f19811461041d576001600160a01b0385165f9081526005602090815260408083203384526001019091529020805484900390555b610428858585610faf565b95945050505050565b5f61043b3361056e565b905080156104a457335f8181526005602052604090206002018054600160401b840201905561046c90309083610faf565b5060405181815233907f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc67906020015b60405180910390a25b50565b5f806104b2866108ae565b90506104bf338787610faf565b505f816104cb886108ae565b039050863b63ffffffff81161561055657604051636be32e7360e01b81526001600160a01b03891690636be32e739061050e90339086908b908b90600401611b9b565b6020604051808303815f875af115801561052a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061054e9190611be2565b610556575f80fd5b506001979650505050505050565b6104a433826111a0565b6001600160a01b0381165f90815260056020526040812060020154600160401b90610598846108ae565b6004546105a59190611c15565b6105af9190611c2c565b6103b09190611c66565b6001546001600160a01b031633146105cf575f80fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610642573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106669190611c79565b9050806001600160a01b031663fc6f786560405180608001604052805f60060154815260200161069e6001546001600160a01b031690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b1681526106dd9190600401611c94565b60408051808303815f875af11580156106f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071c9190611cd7565b5050806001600160a01b031663fc6f786560405180608001604052805f6007015481526020016107546001546001600160a01b031690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b1681526107939190600401611c94565b60408051808303815f875af11580156107ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d29190611cd7565b505050565b5f805f805f6107ee6001546001600160a01b031690565b6002546003546107fd896108ae565b6108068a61056e565b939a9299509097509550909350915050565b6001546001600160a01b0316331461082e575f80fd5b8061083860025490565b1015610842575f80fd5b600280548290039055610867306108616001546001600160a01b031690565b83610faf565b506001546001600160a01b03166001600160a01b03167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d8260405161049b91815260200190565b6001600160a01b03165f9081526005602052604090205490565b600354156108d4575f80fd5b5f3090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094d9190611c79565b90505f826001600160a01b0316826001600160a01b03161090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109dc9190611c79565b68327cb2734119d3b7a9601e1b6003819055600180546001600160a01b03191673faded72464d6e76e37300b467673b36ecc4d2ccf178155919250606491610a249190611c15565b610a2e9190611c66565b60028190556001546001600160a01b0316907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060405190815260200160405180910390a26001600160a01b0384165f81815260056020908152604080832068327cb2734119d3b7a9601e1b9081905590519081525f80516020611e82833981519152910160405180910390a3610ae48482610ac960025490565b610adf9068327cb2734119d3b7a9601e1b611cf9565b610f44565b505f610b068368327cb2734119d3b7a9601e1b683635c9adc5dea00000611213565b9150505f610b2b8468327cb2734119d3b7a9601e1b69152d02c7e14af6800000611213565b91505f90506064610b4968327cb2734119d3b7a9601e1b6005611c15565b610b539190611c66565b9050836001600160a01b0316638831645660405180610160016040528088610b7b578a610b7d565b895b6001600160a01b031681526020018815610b97578a610b99565b895b6001600160a01b03168152612710602082015260400188610bba5786610bc5565b610bc560c888611d0c565b60020b81526020018815610bd95786610be4565b610be48760c8611d31565b60020b815260200188610bf75784610bf9565b5f5b81526020018815610c0a5784610c0c565b5f5b81526020015f81526020015f81526020018a6001600160a01b03168152602001428152506040518263ffffffff1660e01b8152600401610c4c9190611d56565b6080604051808303815f875af1158015610c68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8c9190611e1a565b5050506006556040805161016081019091526001600160a01b038516906388316456908088610cbb578a610cbd565b895b6001600160a01b031681526020018815610cd7578a610cd9565b895b6001600160a01b03168152612710602082015260400188610d0457610cff8760c8611d31565b610d06565b855b60020b81526020018815610d2457610d1f60c888611d0c565b610d26565b855b60020b815260200188610d5b57600254610d4c8668327cb2734119d3b7a9601e1b611cf9565b610d569190611cf9565b610d5d565b5f5b81526020018815610d9057600254610d818668327cb2734119d3b7a9601e1b611cf9565b610d8b9190611cf9565b610d92565b5f5b81526020015f81526020015f81526020018a6001600160a01b03168152602001428152506040518263ffffffff1660e01b8152600401610dd29190611d56565b6080604051808303815f875af1158015610dee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e129190611e1a565b50505060075550505050505050565b5f6103ad338484610faf565b6001546001600160a01b03163303610e5757610e493082610e21565b506002805482019055610efe565b6002548111610e64575f80fd5b610e6c6105f1565b610e8a30610e826001546001600160a01b031690565b600254610faf565b506001546001600160a01b03166001600160a01b03167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d610eca60025490565b60405190815260200160405180910390a2610ee53082610e21565b50600180546001600160a01b0319163317905560028190555b6001546001600160a01b03166001600160a01b03167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600088260405161049b91815260200190565b6001600160a01b038381165f8181526005602090815260408083209487168084526001909501825280832086905551858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b5f81610fba856108ae565b1015610fc4575f80fd5b6001600160a01b0384165f9081526005602090815260408083208054869003815560048054600290920180549288029092039091558151631e46e62f60e21b815291513094937368b3465833fb72a70ecdf485e0e4c7bd8665fc459363791b98bc9381810193918290030181865afa158015611042573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110669190611c79565b90505f826001600160a01b0316876001600160a01b0316148061109a5750826001600160a01b0316866001600160a01b0316145b806110b157505f546001600160a01b038781169116145b806110cd5750816001600160a01b0316876001600160a01b0316145b806110e95750816001600160a01b0316866001600160a01b0316145b61113c57506001600160a01b038281165f8181526005602090815260409182902080546064600a8b0204908101909155915182815291938a16915f80516020611e82833981519152910160405180910390a35b6001600160a01b038681165f818152600560209081526040918290208054868b03908101825560045460029092018054928202909201909155915182815291938b16915f80516020611e82833981519152910160405180910390a361055682611289565b806111aa836108ae565b10156111b4575f80fd5b6003805482900390556001600160a01b0382165f81815260056020908152604080832080548690038155600454600290910180549187029091039055518481529192915f80516020611e82833981519152910160405180910390a35050565b5f805f611251866112245784611226565b855b87156112325785611234565b865b61124290600160c01b611c66565b61124c9190611c15565b611354565b905061125c81611397565b915061126960c883611e60565b6112739083611d0c565b915061127e826116b4565b925050935093915050565b80156104a4575f600a60028302049050600160401b810260055f6112b56001546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f2060020180549190910390556112e1306108ae565b6112f56102da5f546001600160a01b031690565b6003540303600160401b828403028161131057611310611c52565b600480549290910490910190556040518281527f3ac0594a85a20354f9dc74f33728416d19ce00d04a406c108cc2dcf2cecea1349060200160405180910390a15050565b80600260018201045b818110156113915780915060028182858161137a5761137a611c52565b04018161138957611389611c52565b04905061135d565b50919050565b5f6401000276a36001600160a01b038316108015906113d2575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b6114075760405162461bcd60e51b81526020600482015260016024820152602960f91b60448201526064015b60405180910390fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061149b57607f810383901c91506114a5565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146116a557886001600160a01b031661168a826116b4565b6001600160a01b0316111561169f57816116a7565b806116a7565b815b9998505050505050505050565b5f805f8360020b126116c9578260020b6116d0565b8260020b5f035b9050620d89e88111156117095760405162461bcd60e51b81526020600482015260016024820152601560fa1b60448201526064016113fe565b5f816001165f0361171e57600160801b611730565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611764576ffff97272373d413259a46990580e213a0260801c5b6004821615611783576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156117a2576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156117c1576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156117e0576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156117ff576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561181e576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561183e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561185e576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561187e576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561189e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156118be576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156118de576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156118fe576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561191e576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561193f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561195f576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561197e576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561199b576b048a170391f7dc42444e8fa20260801c5b5f8460020b13156119ba57805f19816119b6576119b6611c52565b0490505b6401000000008106156119ce5760016119d0565b5f5b60ff16602082901c0192505050919050565b5f6020808352835180828501525f5b81811015611a0d578581018301518582016040015282016119f1565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146104a4575f80fd5b5f8060408385031215611a52575f80fd5b8235611a5d81611a2d565b946020939093013593505050565b5f805f60608486031215611a7d575f80fd5b8335611a8881611a2d565b92506020840135611a9881611a2d565b929592945050506040919091013590565b5f805f8060608587031215611abc575f80fd5b8435611ac781611a2d565b935060208501359250604085013567ffffffffffffffff80821115611aea575f80fd5b818701915087601f830112611afd575f80fd5b813581811115611b0b575f80fd5b886020828501011115611b1c575f80fd5b95989497505060200194505050565b5f60208284031215611b3b575f80fd5b5035919050565b5f60208284031215611b52575f80fd5b8135611b5d81611a2d565b9392505050565b5f8060408385031215611b75575f80fd5b8235611b8081611a2d565b91506020830135611b9081611a2d565b809150509250929050565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f60208284031215611bf2575f80fd5b81518015158114611b5d575f80fd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176103b0576103b0611c01565b8181035f831280158383131683831282161715611c4b57611c4b611c01565b5092915050565b634e487b7160e01b5f52601260045260245ffd5b5f82611c7457611c74611c52565b500490565b5f60208284031215611c89575f80fd5b8151611b5d81611a2d565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5f8060408385031215611ce8575f80fd5b505080516020909101519092909150565b818103818111156103b0576103b0611c01565b600282810b9082900b03627fffff198112627fffff821317156103b0576103b0611c01565b600281810b9083900b01627fffff8113627fffff19821217156103b0576103b0611c01565b81516001600160a01b0316815261016081016020830151611d8260208401826001600160a01b03169052565b506040830151611d99604084018262ffffff169052565b506060830151611dae606084018260020b9052565b506080830151611dc3608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151611e09828501826001600160a01b03169052565b505061014092830151919092015290565b5f805f8060808587031215611e2d575f80fd5b8451935060208501516001600160801b0381168114611e4a575f80fd5b6040860151606090960151949790965092505050565b5f8260020b80611e7257611e72611c52565b808360020b079150509291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202e3e1101e2bc35fec0d5d0c35889a57f8aeca2704f6951eb692d75d58dd5bbdf64736f6c63430008140033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610148575f3560e01c806353f8b303116100bf57806395d89b411161007957806395d89b41146102ef578063a51dd75d14610313578063a9059cbb14610324578063ba5b798214610337578063dd46706414610352578063dd62ed3e14610365575f80fd5b806353f8b3031461026c57806357f6b812146102745780636198e339146102b957806370a08231146102cc5780638129fc1c146102df578063838e2c9d146102e7575f80fd5b8063313ce56711610110578063313ce567146101fc578063372500ab146102165780634000aea01461022057806342966c6814610233578063479ba7ae146102465780634fa4c5d714610259575f80fd5b806306fdde031461014c578063095ea7b31461019057806316f0115b146101b357806318160ddd146101d757806323b872dd146101e9575b5f80fd5b61017a6040518060400160405280600f81526020016e4265636f6d6520546865204b696e6760881b81525081565b60405161018791906119e2565b60405180910390f35b6101a361019e366004611a41565b6103a1565b6040519015158152602001610187565b5f546001600160a01b03165b6040516001600160a01b039091168152602001610187565b6003545b604051908152602001610187565b6101a36101f7366004611a6b565b6103b6565b610204601281565b60405160ff9091168152602001610187565b61021e610431565b005b6101a361022e366004611aa9565b6104a7565b61021e610241366004611b2b565b610564565b6101db610254366004611b42565b61056e565b61021e610267366004611b42565b6105b9565b61021e6105f1565b610287610282366004611b42565b6107d7565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a001610187565b61021e6102c7366004611b2b565b610818565b6101db6102da366004611b42565b6108ae565b61021e6108c8565b6002546101db565b61017a60405180604001604052806005815260200164292aa622a960d91b81525081565b6001546001600160a01b03166101bf565b6101a3610332366004611a41565b610e21565b60065460075460408051928352602083019190915201610187565b61021e610360366004611b2b565b610e2d565b6101db610373366004611b64565b6001600160a01b039182165f9081526005602090815260408083209390941682526001909201909152205490565b5f6103ad338484610f44565b90505b92915050565b6001600160a01b0383165f908152600560209081526040808320338452600101909152812054828110156103e8575f80fd5b5f19811461041d576001600160a01b0385165f9081526005602090815260408083203384526001019091529020805484900390555b610428858585610faf565b95945050505050565b5f61043b3361056e565b905080156104a457335f8181526005602052604090206002018054600160401b840201905561046c90309083610faf565b5060405181815233907f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc67906020015b60405180910390a25b50565b5f806104b2866108ae565b90506104bf338787610faf565b505f816104cb886108ae565b039050863b63ffffffff81161561055657604051636be32e7360e01b81526001600160a01b03891690636be32e739061050e90339086908b908b90600401611b9b565b6020604051808303815f875af115801561052a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061054e9190611be2565b610556575f80fd5b506001979650505050505050565b6104a433826111a0565b6001600160a01b0381165f90815260056020526040812060020154600160401b90610598846108ae565b6004546105a59190611c15565b6105af9190611c2c565b6103b09190611c66565b6001546001600160a01b031633146105cf575f80fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b5f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610642573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106669190611c79565b9050806001600160a01b031663fc6f786560405180608001604052805f60060154815260200161069e6001546001600160a01b031690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b1681526106dd9190600401611c94565b60408051808303815f875af11580156106f8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061071c9190611cd7565b5050806001600160a01b031663fc6f786560405180608001604052805f6007015481526020016107546001546001600160a01b031690565b6001600160a01b031681526001600160801b0360208201819052604091820152516001600160e01b031960e084901b1681526107939190600401611c94565b60408051808303815f875af11580156107ae573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d29190611cd7565b505050565b5f805f805f6107ee6001546001600160a01b031690565b6002546003546107fd896108ae565b6108068a61056e565b939a9299509097509550909350915050565b6001546001600160a01b0316331461082e575f80fd5b8061083860025490565b1015610842575f80fd5b600280548290039055610867306108616001546001600160a01b031690565b83610faf565b506001546001600160a01b03166001600160a01b03167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d8260405161049b91815260200190565b6001600160a01b03165f9081526005602052604090205490565b600354156108d4575f80fd5b5f3090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b0316634aa4a4fc6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610929573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061094d9190611c79565b90505f826001600160a01b0316826001600160a01b03161090505f7368b3465833fb72a70ecdf485e0e4c7bd8665fc456001600160a01b031663791b98bc6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109dc9190611c79565b68327cb2734119d3b7a9601e1b6003819055600180546001600160a01b03191673faded72464d6e76e37300b467673b36ecc4d2ccf178155919250606491610a249190611c15565b610a2e9190611c66565b60028190556001546001600160a01b0316907f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600089060405190815260200160405180910390a26001600160a01b0384165f81815260056020908152604080832068327cb2734119d3b7a9601e1b9081905590519081525f80516020611e82833981519152910160405180910390a3610ae48482610ac960025490565b610adf9068327cb2734119d3b7a9601e1b611cf9565b610f44565b505f610b068368327cb2734119d3b7a9601e1b683635c9adc5dea00000611213565b9150505f610b2b8468327cb2734119d3b7a9601e1b69152d02c7e14af6800000611213565b91505f90506064610b4968327cb2734119d3b7a9601e1b6005611c15565b610b539190611c66565b9050836001600160a01b0316638831645660405180610160016040528088610b7b578a610b7d565b895b6001600160a01b031681526020018815610b97578a610b99565b895b6001600160a01b03168152612710602082015260400188610bba5786610bc5565b610bc560c888611d0c565b60020b81526020018815610bd95786610be4565b610be48760c8611d31565b60020b815260200188610bf75784610bf9565b5f5b81526020018815610c0a5784610c0c565b5f5b81526020015f81526020015f81526020018a6001600160a01b03168152602001428152506040518263ffffffff1660e01b8152600401610c4c9190611d56565b6080604051808303815f875af1158015610c68573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c8c9190611e1a565b5050506006556040805161016081019091526001600160a01b038516906388316456908088610cbb578a610cbd565b895b6001600160a01b031681526020018815610cd7578a610cd9565b895b6001600160a01b03168152612710602082015260400188610d0457610cff8760c8611d31565b610d06565b855b60020b81526020018815610d2457610d1f60c888611d0c565b610d26565b855b60020b815260200188610d5b57600254610d4c8668327cb2734119d3b7a9601e1b611cf9565b610d569190611cf9565b610d5d565b5f5b81526020018815610d9057600254610d818668327cb2734119d3b7a9601e1b611cf9565b610d8b9190611cf9565b610d92565b5f5b81526020015f81526020015f81526020018a6001600160a01b03168152602001428152506040518263ffffffff1660e01b8152600401610dd29190611d56565b6080604051808303815f875af1158015610dee573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e129190611e1a565b50505060075550505050505050565b5f6103ad338484610faf565b6001546001600160a01b03163303610e5757610e493082610e21565b506002805482019055610efe565b6002548111610e64575f80fd5b610e6c6105f1565b610e8a30610e826001546001600160a01b031690565b600254610faf565b506001546001600160a01b03166001600160a01b03167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d610eca60025490565b60405190815260200160405180910390a2610ee53082610e21565b50600180546001600160a01b0319163317905560028190555b6001546001600160a01b03166001600160a01b03167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd600088260405161049b91815260200190565b6001600160a01b038381165f8181526005602090815260408083209487168084526001909501825280832086905551858152919392917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35060019392505050565b5f81610fba856108ae565b1015610fc4575f80fd5b6001600160a01b0384165f9081526005602090815260408083208054869003815560048054600290920180549288029092039091558151631e46e62f60e21b815291513094937368b3465833fb72a70ecdf485e0e4c7bd8665fc459363791b98bc9381810193918290030181865afa158015611042573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110669190611c79565b90505f826001600160a01b0316876001600160a01b0316148061109a5750826001600160a01b0316866001600160a01b0316145b806110b157505f546001600160a01b038781169116145b806110cd5750816001600160a01b0316876001600160a01b0316145b806110e95750816001600160a01b0316866001600160a01b0316145b61113c57506001600160a01b038281165f8181526005602090815260409182902080546064600a8b0204908101909155915182815291938a16915f80516020611e82833981519152910160405180910390a35b6001600160a01b038681165f818152600560209081526040918290208054868b03908101825560045460029092018054928202909201909155915182815291938b16915f80516020611e82833981519152910160405180910390a361055682611289565b806111aa836108ae565b10156111b4575f80fd5b6003805482900390556001600160a01b0382165f81815260056020908152604080832080548690038155600454600290910180549187029091039055518481529192915f80516020611e82833981519152910160405180910390a35050565b5f805f611251866112245784611226565b855b87156112325785611234565b865b61124290600160c01b611c66565b61124c9190611c15565b611354565b905061125c81611397565b915061126960c883611e60565b6112739083611d0c565b915061127e826116b4565b925050935093915050565b80156104a4575f600a60028302049050600160401b810260055f6112b56001546001600160a01b031690565b6001600160a01b0316815260208101919091526040015f2060020180549190910390556112e1306108ae565b6112f56102da5f546001600160a01b031690565b6003540303600160401b828403028161131057611310611c52565b600480549290910490910190556040518281527f3ac0594a85a20354f9dc74f33728416d19ce00d04a406c108cc2dcf2cecea1349060200160405180910390a15050565b80600260018201045b818110156113915780915060028182858161137a5761137a611c52565b04018161138957611389611c52565b04905061135d565b50919050565b5f6401000276a36001600160a01b038316108015906113d2575073fffd8963efd1fc6a506488495d951d5263988d266001600160a01b038316105b6114075760405162461bcd60e51b81526020600482015260016024820152602960f91b60448201526064015b60405180910390fd5b640100000000600160c01b03602083901b166001600160801b03811160071b81811c67ffffffffffffffff811160061b90811c63ffffffff811160051b90811c61ffff811160041b90811c60ff8111600390811b91821c600f811160021b90811c918211600190811b92831c9790881196179094179092171790911717176080811061149b57607f810383901c91506114a5565b80607f0383901b91505b908002607f81811c60ff83811c9190911c800280831c81831c1c800280841c81841c1c800280851c81851c1c800280861c81861c1c800280871c81871c1c800280881c81881c1c800280891c81891c1c8002808a1c818a1c1c8002808b1c818b1c1c8002808c1c818c1c1c8002808d1c818d1c1c8002808e1c9c81901c9c909c1c80029c8d901c9e9d607f198f0160401b60c09190911c678000000000000000161760c19b909b1c674000000000000000169a909a1760c29990991c672000000000000000169890981760c39790971c671000000000000000169690961760c49590951c670800000000000000169490941760c59390931c670400000000000000169290921760c69190911c670200000000000000161760c79190911c670100000000000000161760c89190911c6680000000000000161760c99190911c6640000000000000161760ca9190911c6620000000000000161760cb9190911c6610000000000000161760cc9190911c6608000000000000161760cd9190911c66040000000000001617693627a301d71055774c8581026f028f6481ab7f045a5af012a19d003aa9198101608090811d906fdb2df09e81959a81455e260799a0632f8301901d600281810b9083900b146116a557886001600160a01b031661168a826116b4565b6001600160a01b0316111561169f57816116a7565b806116a7565b815b9998505050505050505050565b5f805f8360020b126116c9578260020b6116d0565b8260020b5f035b9050620d89e88111156117095760405162461bcd60e51b81526020600482015260016024820152601560fa1b60448201526064016113fe565b5f816001165f0361171e57600160801b611730565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615611764576ffff97272373d413259a46990580e213a0260801c5b6004821615611783576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b60088216156117a2576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b60108216156117c1576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156117e0576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156117ff576fff2ea16466c96a3843ec78b326b528610260801c5b608082161561181e576ffe5dee046a99a2a811c461f1969c30530260801c5b61010082161561183e576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b61020082161561185e576ff987a7253ac413176f2b074cf7815e540260801c5b61040082161561187e576ff3392b0822b70005940c7a398e4b70f30260801c5b61080082161561189e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b6110008216156118be576fd097f3bdfd2022b8845ad8f792aa58250260801c5b6120008216156118de576fa9f746462d870fdf8a65dc1f90e061e50260801c5b6140008216156118fe576f70d869a156d2a1b890bb3df62baf32f70260801c5b61800082161561191e576f31be135f97d08fd981231505542fcfa60260801c5b6201000082161561193f576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b6202000082161561195f576e5d6af8dedb81196699c329225ee6040260801c5b6204000082161561197e576d2216e584f5fa1ea926041bedfe980260801c5b6208000082161561199b576b048a170391f7dc42444e8fa20260801c5b5f8460020b13156119ba57805f19816119b6576119b6611c52565b0490505b6401000000008106156119ce5760016119d0565b5f5b60ff16602082901c0192505050919050565b5f6020808352835180828501525f5b81811015611a0d578581018301518582016040015282016119f1565b505f604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146104a4575f80fd5b5f8060408385031215611a52575f80fd5b8235611a5d81611a2d565b946020939093013593505050565b5f805f60608486031215611a7d575f80fd5b8335611a8881611a2d565b92506020840135611a9881611a2d565b929592945050506040919091013590565b5f805f8060608587031215611abc575f80fd5b8435611ac781611a2d565b935060208501359250604085013567ffffffffffffffff80821115611aea575f80fd5b818701915087601f830112611afd575f80fd5b813581811115611b0b575f80fd5b886020828501011115611b1c575f80fd5b95989497505060200194505050565b5f60208284031215611b3b575f80fd5b5035919050565b5f60208284031215611b52575f80fd5b8135611b5d81611a2d565b9392505050565b5f8060408385031215611b75575f80fd5b8235611b8081611a2d565b91506020830135611b9081611a2d565b809150509250929050565b6001600160a01b0385168152602081018490526060604082018190528101829052818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f60208284031215611bf2575f80fd5b81518015158114611b5d575f80fd5b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176103b0576103b0611c01565b8181035f831280158383131683831282161715611c4b57611c4b611c01565b5092915050565b634e487b7160e01b5f52601260045260245ffd5b5f82611c7457611c74611c52565b500490565b5f60208284031215611c89575f80fd5b8151611b5d81611a2d565b815181526020808301516001600160a01b0316908201526040808301516001600160801b0390811691830191909152606092830151169181019190915260800190565b5f8060408385031215611ce8575f80fd5b505080516020909101519092909150565b818103818111156103b0576103b0611c01565b600282810b9082900b03627fffff198112627fffff821317156103b0576103b0611c01565b600281810b9083900b01627fffff8113627fffff19821217156103b0576103b0611c01565b81516001600160a01b0316815261016081016020830151611d8260208401826001600160a01b03169052565b506040830151611d99604084018262ffffff169052565b506060830151611dae606084018260020b9052565b506080830151611dc3608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151611e09828501826001600160a01b03169052565b505061014092830151919092015290565b5f805f8060808587031215611e2d575f80fd5b8451935060208501516001600160801b0381168114611e4a575f80fd5b6040860151606090960151949790965092505050565b5f8260020b80611e7257611e72611c52565b808360020b079150509291505056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212202e3e1101e2bc35fec0d5d0c35889a57f8aeca2704f6951eb692d75d58dd5bbdf64736f6c63430008140033

Deployed Bytecode Sourcemap

1887:16270:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3003:47;;;;;;;;;;;;;;;-1:-1:-1;;;3003:47:0;;;;;;;;;;;;:::i;:::-;;;;;;;;7903:132;;;;;;:::i;:::-;;:::i;:::-;;;1188:14:1;;1181:22;1163:41;;1151:2;1136:18;7903:132:0;1023:187:1;8868:72:0;8905:7;8926:9;-1:-1:-1;;;;;8926:9:0;8868:72;;;-1:-1:-1;;;;;1488:32:1;;;1470:51;;1458:2;1443:18;8868:72:0;1324:203:1;9115:86:0;9180:16;;9115:86;;;1678:25:1;;;1666:2;1651:18;9115:86:0;1532:177:1;8040:347:0;;;;;;:::i;:::-;;:::i;3097:35::-;;3130:2;3097:35;;;;;2347:4:1;2335:17;;;2317:36;;2305:2;2290:18;3097:35:0;2175:184:1;7379:310:0;;;:::i;:::-;;8392:468;;;;;;:::i;:::-;;:::i;7695:76::-;;;;;;:::i;:::-;;:::i;9317:191::-;;;;;;:::i;:::-;;:::i;4264:83::-;;;;;;:::i;:::-;;:::i;6457:420::-;;;:::i;9794:262::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;3877:32:1;;;3859:51;;3941:2;3926:18;;3919:34;;;;3969:18;;;3962:34;;;;4027:2;4012:18;;4005:34;4070:3;4055:19;;4048:35;3846:3;3831:19;9794:262:0;3600:489:1;4353:235:0;;;;;;:::i;:::-;;:::i;9206:106::-;;;;;;:::i;:::-;;:::i;4596:1856::-;;;:::i;9024:86::-;9089:16;;9024:86;;3054:39;;;;;;;;;;;;;;;-1:-1:-1;;;3054:39:0;;;;;8945:74;9004:10;;-1:-1:-1;;;;;9004:10:0;8945:74;;7776:122;;;;;;:::i;:::-;;:::i;9654:135::-;9741:20;;9763;;9654:135;;;4268:25:1;;;4324:2;4309:18;;4302:34;;;;4241:18;9654:135:0;4094:248:1;6882:492:0;;;;;;:::i;:::-;;:::i;9513:136::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9607:17:0;;;9586:7;9607:17;;;:10;:17;;;;;;;;:37;;;;;;:27;;;;:37;;;;;;9513:136;7903:132;7973:4;7991:39;8000:10;8012:8;8022:7;7991:8;:39::i;:::-;7984:46;;7903:132;;;;;:::o;8040:347::-;-1:-1:-1;;;;;9607:17:0;;8125:4;9607:17;;;:10;:17;;;;;;;;8190:10;9607:37;;:27;;:37;;;;;;8229:7;8215:10;:21;;8207:30;;;;;;-1:-1:-1;;8247:10:0;:22;8243:92;;-1:-1:-1;;;;;8278:17:0;;:4;:17;;;:10;:17;;;;;;;;8306:10;8278:39;;:27;;:39;;;;;:50;;;;;;;8243:92;8347:30;8357:5;8364:3;8369:7;8347:9;:30::i;:::-;8340:37;8040:347;-1:-1:-1;;;;;8040:347:0:o;7379:310::-;7433:16;7452:21;7462:10;7452:9;:21::i;:::-;7433:40;-1:-1:-1;7483:12:0;;7479:201;;7515:10;7504:4;:22;;;:10;:22;;;;;:35;;:70;;-1:-1:-1;;;7550:23:0;;7504:70;;;7581:46;;7599:4;;7550:8;7581:9;:46::i;:::-;-1:-1:-1;7639:34:0;;1678:25:1;;;7652:10:0;;7639:34;;1666:2:1;1651:18;7639:34:0;;;;;;;;7479:201;7417:268;7379:310::o;8392:468::-;8487:4;8514:22;8539:14;8549:3;8539:9;:14::i;:::-;8514:39;;8559:35;8569:10;8581:3;8586:7;8559:9;:35::i;:::-;;8600:23;8643:14;8626;8636:3;8626:9;:14::i;:::-;:31;;-1:-1:-1;8706:16:0;;8737:9;;;;8733:101;;8763:63;;-1:-1:-1;;;8763:63:0;;-1:-1:-1;;;;;8763:27:0;;;;;:63;;8791:10;;8803:15;;8820:5;;;;8763:63;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8755:72;;;;;;-1:-1:-1;8846:4:0;;8392:468;-1:-1:-1;;;;;;;8392:468:0:o;7695:76::-;7740:26;7746:10;7758:7;7740:5;:26::i;9317:191::-;-1:-1:-1;;;;;9457:17:0;;9372:7;9457:17;;;:10;:17;;;;;:30;;;-1:-1:-1;;;1958:5:0;9437:16;9468:5;9437:9;:16::i;:::-;9408:26;;:45;;;;:::i;:::-;9401:86;;;;:::i;:::-;9393:110;;;;:::i;4264:83::-;9004:10;;-1:-1:-1;;;;;9004:10:0;3900;:21;3892:30;;;;;;4323:10:::1;:19:::0;;-1:-1:-1;;;;;;4323:19:0::1;-1:-1:-1::0;;;;;4323:19:0;;;::::1;::::0;;;::::1;::::0;;4264:83::o;6457:420::-;6499:19;2188:42;-1:-1:-1;;;;;6537:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6499:63;;6567:3;-1:-1:-1;;;;;6567:11:0;;6579:137;;;;;;;;6608:4;:20;;;6579:137;;;;6645:7;9004:10;;-1:-1:-1;;;;;9004:10:0;;8945:74;6645:7;-1:-1:-1;;;;;6579:137:0;;;-1:-1:-1;;;;;6579:137:0;;;;;;;;;;;6567:150;-1:-1:-1;;;;;;6567:150:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;6722:3;-1:-1:-1;;;;;6722:11:0;;6734:137;;;;;;;;6763:4;:20;;;6734:137;;;;6800:7;9004:10;;-1:-1:-1;;;;;9004:10:0;;8945:74;6800:7;-1:-1:-1;;;;;6734:137:0;;;-1:-1:-1;;;;;6734:137:0;;;;;;;;;;;6722:150;-1:-1:-1;;;;;;6722:150:0;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;6494:383;6457:420::o;9794:262::-;9852:20;9874:25;9901:19;9922;9943;9977:7;9004:10;;-1:-1:-1;;;;;9004:10:0;;8945:74;9977:7;9089:16;;9180;;10016;10026:5;10016:9;:16::i;:::-;10034;10044:5;10034:9;:16::i;:::-;9969:82;;;;-1:-1:-1;9969:82:0;;-1:-1:-1;9969:82:0;-1:-1:-1;9969:82:0;;-1:-1:-1;9794:262:0;-1:-1:-1;;9794:262:0:o;4353:235::-;9004:10;;-1:-1:-1;;;;;9004:10:0;3900;:21;3892:30;;;;;;4452:7:::1;4435:13;9089:16:::0;;;9024:86;4435:13:::1;:24;;4427:33;;;::::0;::::1;;4466:16;:27:::0;;;;::::1;::::0;;4499:42:::1;4517:4;4524:7;9004:10:::0;;-1:-1:-1;;;;;9004:10:0;;8945:74;4524:7:::1;4533;4499:9;:42::i;:::-;-1:-1:-1::0;9004:10:0;;-1:-1:-1;;;;;9004:10:0;-1:-1:-1;;;;;4552:26:0::1;;4570:7;4552:26;;;;1678:25:1::0;;1666:2;1651:18;;1532:177;9206:106:0;-1:-1:-1;;;;;9282:17:0;9261:7;9282:17;;;:10;:17;;;;;:25;;9206:106::o;4596:1856::-;9180:16;;4640:18;4632:27;;;;;;4664:13;4688:4;4664:29;;4698:13;2188:42;-1:-1:-1;;;;;4714:12:0;;:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4698:30;;4733:11;4755:5;-1:-1:-1;;;;;4747:13:0;:5;-1:-1:-1;;;;;4747:13:0;;4733:27;;4765:19;2188:42;-1:-1:-1;;;;;4803:22:0;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;4833:16:0;:33;;;4871:10;:55;;-1:-1:-1;;;;;;4871:55:0;4884:42;4871:55;;;4765:63;;-1:-1:-1;4998:3:0;;4950:45;;2126:4;4950:45;:::i;:::-;:51;;;;:::i;:::-;4931:16;:70;;;9004:10;;-1:-1:-1;;;;;9004:10:0;;5011:30;;;;1678:25:1;;;1666:2;1651:18;5011:30:0;;;;;;;-1:-1:-1;;;;;5046:17:0;;:4;:17;;;:10;:17;;;;;;;;-1:-1:-1;;;5046:42:0;;;;5098:45;;1678:25:1;;;-1:-1:-1;;;;;;;;;;;5098:45:0;1651:18:1;5098:45:0;;;;;;;5148:61;5157:5;5172:3;5195:13;9089:16;;;9024:86;5195:13;5178:30;;-1:-1:-1;;;5178:30:0;:::i;:::-;5148:8;:61::i;:::-;;5218:14;5236:66;5263:6;-1:-1:-1;;;2277:9:0;5236:26;:66::i;:::-;5214:88;;;5311:14;5329:64;5356:6;-1:-1:-1;;;2476:9:0;5329:26;:64::i;:::-;5307:86;-1:-1:-1;5398:27:0;;-1:-1:-1;5468:3:0;5428:37;-1:-1:-1;;;2376:1:0;5428:37;:::i;:::-;:43;;;;:::i;:::-;5398:73;;5507:3;-1:-1:-1;;;;;5507:8:0;;5516:409;;;;;;;;5541:6;:22;;5558:5;5541:22;;;5550:5;5541:22;-1:-1:-1;;;;;5516:409:0;;;;;5578:6;5577:7;:23;;5595:5;5577:23;;;5587:5;5577:23;-1:-1:-1;;;;;5516:409:0;;;5611:5;5516:409;;;;;;5633:6;:34;;5659:8;5633:34;;;5642:14;5653:3;5642:8;:14;:::i;:::-;5516:409;;;;;;5685:6;5684:7;:35;;5711:8;5684:35;;;5694:14;:8;5705:3;5694:14;:::i;:::-;5516:409;;;;;;5741:6;:32;;5754:19;5741:32;;;5750:1;5741:32;5516:409;;;;5796:6;5795:7;:33;;5809:19;5795:33;;;5805:1;5795:33;5516:409;;;;5846:1;5516:409;;;;5865:1;5516:409;;;;5883:5;-1:-1:-1;;;;;5516:409:0;;;;;5904:15;5516:409;;;5507:419;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;5477:20:0;5476:450;5971:475;;;;;;;;;-1:-1:-1;;;;;5962:8:0;;;;;5971:475;5996:6;:22;;6013:5;5996:22;;;6005:5;5996:22;-1:-1:-1;;;;;5971:475:0;;;;;6033:6;6032:7;:23;;6050:5;6032:23;;;6042:5;6032:23;-1:-1:-1;;;;;5971:475:0;;;6066:5;5971:475;;;;;;6088:6;:34;;6108:14;:8;6119:3;6108:14;:::i;:::-;6088:34;;;6097:8;6088:34;5971:475;;;;;;6140:6;6139:7;:35;;6160:14;6171:3;6160:8;:14;:::i;:::-;6139:35;;;6149:8;6139:35;5971:475;;;;;;6196:6;:65;;9089:16;;6209:36;6226:19;-1:-1:-1;;;6209:36:0;:::i;:::-;:52;;;;:::i;:::-;6196:65;;;6205:1;6196:65;5971:475;;;;6284:6;6283:7;:66;;9089:16;;6297:36;6314:19;-1:-1:-1;;;6297:36:0;:::i;:::-;:52;;;;:::i;:::-;6283:66;;;6293:1;6283:66;5971:475;;;;6367:1;5971:475;;;;6386:1;5971:475;;;;6404:5;-1:-1:-1;;;;;5971:475:0;;;;;6425:15;5971:475;;;5962:485;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;5932:20:0;5931:516;-1:-1:-1;;;;;;;4596:1856:0:o;7776:122::-;7840:4;7858:35;7868:10;7880:3;7885:7;7858:9;:35::i;6882:492::-;9004:10;;-1:-1:-1;;;;;9004:10:0;6947;:21;6943:387;;6977:32;6994:4;7001:7;6977:8;:32::i;:::-;-1:-1:-1;7016:16:0;:27;;;;;;6943:387;;;9089:16;;7071:7;:23;7063:32;;;;;;7102:20;:18;:20::i;:::-;7129:48;7147:4;7154:7;9004:10;;-1:-1:-1;;;;;9004:10:0;;8945:74;7154:7;9089:16;;7129:9;:48::i;:::-;-1:-1:-1;9004:10:0;;-1:-1:-1;;;;;9004:10:0;-1:-1:-1;;;;;7189:32:0;;7207:13;9089:16;;;9024:86;7207:13;7189:32;;1678:25:1;;;1666:2;1651:18;7189:32:0;;;;;;;7228;7245:4;7252:7;7228:8;:32::i;:::-;-1:-1:-1;7267:10:0;:23;;-1:-1:-1;;;;;;7267:23:0;7280:10;7267:23;;;7297:16;:26;;;6943:387;9004:10;;-1:-1:-1;;;;;9004:10:0;-1:-1:-1;;;;;7340:24:0;;7356:7;7340:24;;;;1678:25:1;;1666:2;1651:18;;1532:177;10415:212:0;-1:-1:-1;;;;;10513:18:0;;;10502:4;10513:18;;;:10;:18;;;;;;;;:38;;;;;;:28;;;;:38;;;;;:48;;;10571:35;1678:25:1;;;10502:4:0;;10513:38;:18;10571:35;;1651:18:1;10571:35:0;;;;;;;-1:-1:-1;10618:4:0;10415:212;;;;;:::o;10633:860::-;10715:4;10770:7;10750:16;10760:5;10750:9;:16::i;:::-;:27;;10742:36;;;;;;-1:-1:-1;;;;;10784:17:0;;:4;:17;;;:10;:17;;;;;;;;:36;;;;;;;10877:26;;;10826:30;;;;:78;;10867:36;;;10826:78;;;;;;10959:24;;-1:-1:-1;;;10959:24:0;;;;10934:4;;10784;2188:42;;10959:22;;:24;;;;;;;;;;2188:42;10959:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10945:38;;10989:12;11026:5;-1:-1:-1;;;;;11017:14:0;:5;-1:-1:-1;;;;;11017:14:0;;:30;;;;11042:5;-1:-1:-1;;;;;11035:12:0;:3;-1:-1:-1;;;;;11035:12:0;;11017:30;:47;;;-1:-1:-1;8905:7:0;8926:9;-1:-1:-1;;;;;11051:13:0;;;8926:9;;11051:13;11017:47;:63;;;;11077:3;-1:-1:-1;;;;;11068:12:0;:5;-1:-1:-1;;;;;11068:12:0;;11017:63;:77;;;;11091:3;-1:-1:-1;;;;;11084:10:0;:3;-1:-1:-1;;;;;11084:10:0;;11017:77;11011:215;;-1:-1:-1;;;;;;11146:17:0;;;:4;:17;;;:10;:17;;;;;;;;;:33;;11136:3;2632:2;11111:22;;:28;11146:33;;;;;;11191:28;;1678:25:1;;;11111:28:0;;11191;;;-1:-1:-1;;;;;;;;;;;11191:28:0;1651:18:1;11191:28:0;;;;;;;11011:215;-1:-1:-1;;;;;11274:15:0;;;11231:20;11274:15;;;:10;:15;;;;;;;;;:39;;11254:14;;;11274:39;;;;;11373:26;;11319:28;;;;:81;;11358:41;;;11319:81;;;;;;11411:34;;1678:25:1;;;11254:14:0;;11411:34;;;-1:-1:-1;;;;;;;;;;;11411:34:0;1651:18:1;11411:34:0;;;;;;;11451:15;11461:4;11451:9;:15::i;10063:346::-;10174:7;10151:19;10161:8;10151:9;:19::i;:::-;:30;;10143:39;;;;;;10188:16;:27;;;;;;;-1:-1:-1;;;;;10221:20:0;;-1:-1:-1;10221:20:0;;;:10;:20;;;;;;;;:39;;;;;;;10320:26;;10266:33;;;;:81;;10310:36;;;10266:81;;;;;10358:41;1678:25:1;;;-1:-1:-1;;10221:20:0;-1:-1:-1;;;;;;;;;;;10358:41:0;1651:18:1;10358:41:0;;;;;;;10063:346;;:::o;17801:353::-;17905:13;17920:10;17937:17;17965:72;18011:6;:24;;18030:5;18011:24;;;18020:7;18011:24;17982:6;17981:7;:25;;18001:5;17981:25;;;17991:7;17981:25;17971:36;;-1:-1:-1;;;17971:36:0;:::i;:::-;:65;;;;:::i;:::-;17965:5;:72::i;:::-;17937:101;;18050:30;18070:9;18050:19;:30::i;:::-;18043:37;-1:-1:-1;18100:10:0;18107:3;18043:37;18100:10;:::i;:::-;18092:19;;:4;:19;:::i;:::-;18085:26;;18124:25;18144:4;18124:19;:25::i;:::-;18116:33;;17932:222;17801:353;;;;;;:::o;11498:409::-;11568:11;;11564:334;;11588:20;2632:2;2682:1;11611:19;;:34;;-1:-1:-1;;;;11695:27:0;;11652:10;:4;11663:7;9004:10;;-1:-1:-1;;;;;9004:10:0;;8945:74;11663:7;-1:-1:-1;;;;;11652:19:0;;;;;;;;;;;;-1:-1:-1;11652:19:0;:32;;:71;;;;;;;;11839:24;11857:4;11839:9;:24::i;:::-;11819:17;11829:6;8905:7;8926:9;-1:-1:-1;;;;;8926:9:0;;8868:72;11819:17;9180:16;;11803:33;:60;-1:-1:-1;;;11771:12:0;11761:7;:22;11760:39;:104;;;;;:::i;:::-;11730:26;:134;;11760:104;;;;11730:134;;;;;11876:15;;1678:25:1;;;11876:15:0;;1666:2:1;1651:18;11876:15:0;;;;;;;11581:317;11498:409;:::o;17565:231::-;17668:6;17678:1;17673;17668:6;;17667:12;17702:85;17716:6;17709:4;:13;17702:85;;;17740:4;17731:13;;17779:1;17771:4;17764;17759:2;:9;;;;;:::i;:::-;;:16;17758:22;;;;;:::i;:::-;;17751:29;;17702:85;;;17636:156;17565:231;;;:::o;14134:3426::-;14208:10;2891;-1:-1:-1;;;;;14249:30:0;;;;;;:63;;-1:-1:-1;2948:49:0;-1:-1:-1;;;;;14283:29:0;;;14249:63;14241:77;;;;-1:-1:-1;;;14241:77:0;;10242:2:1;14241:77:0;;;10224:21:1;10281:1;10261:18;;;10254:29;-1:-1:-1;;;10299:18:1;;;10292:31;10340:18;;14241:77:0;;;;;;;;;-1:-1:-1;;;;;14365:2:0;14340:27;;;;-1:-1:-1;;;;;14453:41:0;;14450:1;14446:49;14529:9;;;14587:18;14581:25;;14578:1;14574:33;14641:9;;;14699:10;14693:17;;14690:1;14686:25;14745:9;;;14803:6;14797:13;;14794:1;14790:21;14845:9;;;14903:4;14897:11;;14894:1;14890:19;;;14943:9;;;15001:3;14995:10;;14992:1;14988:18;15040:9;;;15092:10;;;15089:1;15085:18;;;15137:9;;;;15182:10;;;14620;;14724;;;14824;;;14922;15019;;;15116;15205;15239:3;15232:10;;15228:75;;15264:3;15258;:9;15248:5;:20;;15244:24;;15228:75;;;15299:3;15293;:9;15283:5;:20;;15279:24;;15228:75;15389:9;;;15384:3;15380:19;;;15414:11;;;;15472:9;;;;15522;;15513:19;;;15547:11;;;15605:9;15655;;15646:19;;;15680:11;;;15738:9;15788;;15779:19;;;15813:11;;;15871:9;15921;;15912:19;;;15946:11;;;16004:9;16054;;16045:19;;;16079:11;;;16137:9;16187;;16178:19;;;16212:11;;;16270:9;16320;;16311:19;;;16345:11;;;16403:9;16453;;16444:19;;;16478:11;;;16536:9;16586;;16577:19;;;16611:11;;;16669:9;16719;;16710:19;;;16744:11;;;16802:9;16852;;16843:19;;;16877:11;;;16935:9;16985;;16976:19;;;17010:11;;;;17068:9;;;;17118;;17109:19;;;;;15389:9;-1:-1:-1;;15327:17:0;;15349:2;15326:25;15450:10;;;;;;;15440:21;15583:10;;;;;;;15573:21;;;;15716:10;;;;;;;15706:21;;;;15849:10;;;;;;;15839:21;;;;15982:10;;;;;;;15972:21;;;;16115:10;;;;;;;16105:21;;;;16248:10;;;;;;;16238:21;16381:10;;;;;;;16371:21;16514:10;;;;;;;16504:21;16647:10;;;;;;;16637:21;16780:10;;;;;;;16770:21;16913:10;;;;;;;16903:21;17046:10;;;;;;;17036:21;17179:10;;;;;;;17169:21;17234:24;17226:32;;-1:-1:-1;;17289:53:0;;15341:3;17288:62;;;;17395:39;17379:55;;17378:64;;17458:17;;;;;;;;;:92;;17519:12;-1:-1:-1;;;;;17488:43:0;:27;17508:6;17488:19;:27::i;:::-;-1:-1:-1;;;;;17488:43:0;;;:62;;17543:7;17458:92;;17488:62;17534:6;17458:92;;;17478:7;17458:92;17451:99;14134:3426;-1:-1:-1;;;;;;;;;14134:3426:0:o;11914:2215::-;11978:20;12021:15;12046:1;12039:4;:8;;;:57;;12090:4;12083:12;;12039:57;;;12066:4;12059:12;;12058:13;;12039:57;12021:75;-1:-1:-1;2835:9:0;12110:36;;;12102:50;;;;-1:-1:-1;;;12102:50:0;;10571:2:1;12102:50:0;;;10553:21:1;10610:1;10590:18;;;10583:29;-1:-1:-1;;;10628:18:1;;;10621:31;10669:18;;12102:50:0;10369:324:1;12102:50:0;12160:13;12176:7;12186:3;12176:13;12193:1;12176:18;:93;;-1:-1:-1;;;12176:93:0;;;12197:34;12176:93;12160:109;;;-1:-1:-1;12289:3:0;12279:13;;:18;12275:83;;12316:34;12308:42;12355:3;12307:51;12275:83;12378:3;12368:13;;:18;12364:83;;12405:34;12397:42;12444:3;12396:51;12364:83;12467:3;12457:13;;:18;12453:83;;12494:34;12486:42;12533:3;12485:51;12453:83;12556:4;12546:14;;:19;12542:84;;12584:34;12576:42;12623:3;12575:51;12542:84;12646:4;12636:14;;:19;12632:84;;12674:34;12666:42;12713:3;12665:51;12632:84;12736:4;12726:14;;:19;12722:84;;12764:34;12756:42;12803:3;12755:51;12722:84;12826:4;12816:14;;:19;12812:84;;12854:34;12846:42;12893:3;12845:51;12812:84;12916:5;12906:15;;:20;12902:85;;12945:34;12937:42;12984:3;12936:51;12902:85;13007:5;12997:15;;:20;12993:85;;13036:34;13028:42;13075:3;13027:51;12993:85;13098:5;13088:15;;:20;13084:85;;13127:34;13119:42;13166:3;13118:51;13084:85;13189:5;13179:15;;:20;13175:85;;13218:34;13210:42;13257:3;13209:51;13175:85;13280:6;13270:16;;:21;13266:86;;13310:34;13302:42;13349:3;13301:51;13266:86;13372:6;13362:16;;:21;13358:86;;13402:34;13394:42;13441:3;13393:51;13358:86;13464:6;13454:16;;:21;13450:86;;13494:34;13486:42;13533:3;13485:51;13450:86;13556:6;13546:16;;:21;13542:86;;13586:34;13578:42;13625:3;13577:51;13542:86;13648:7;13638:17;;:22;13634:86;;13679:33;13671:41;13717:3;13670:50;13634:86;13740:7;13730:17;;:22;13726:85;;13771:32;13763:40;13808:3;13762:49;13726:85;13831:7;13821:17;;:22;13817:83;;13862:30;13854:38;13897:3;13853:47;13817:83;13920:7;13910:17;;:22;13906:78;;13951:25;13943:33;13981:3;13942:42;13906:78;14003:1;13996:4;:8;;;13992:47;;;14034:5;-1:-1:-1;;14014:25:0;;;;;:::i;:::-;;14006:33;;13992:47;14096:7;14087:5;:17;:22;:30;;14116:1;14087:30;;;14112:1;14087:30;14070:48;;14080:2;14071:5;:11;;14070:48;14047:72;;12005:2120;;11914:2215;;;:::o;14:548:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;567:131::-;-1:-1:-1;;;;;642:31:1;;632:42;;622:70;;688:1;685;678:12;703:315;771:6;779;832:2;820:9;811:7;807:23;803:32;800:52;;;848:1;845;838:12;800:52;887:9;874:23;906:31;931:5;906:31;:::i;:::-;956:5;1008:2;993:18;;;;980:32;;-1:-1:-1;;;703:315:1:o;1714:456::-;1791:6;1799;1807;1860:2;1848:9;1839:7;1835:23;1831:32;1828:52;;;1876:1;1873;1866:12;1828:52;1915:9;1902:23;1934:31;1959:5;1934:31;:::i;:::-;1984:5;-1:-1:-1;2041:2:1;2026:18;;2013:32;2054:33;2013:32;2054:33;:::i;:::-;1714:456;;2106:7;;-1:-1:-1;;;2160:2:1;2145:18;;;;2132:32;;1714:456::o;2364:794::-;2452:6;2460;2468;2476;2529:2;2517:9;2508:7;2504:23;2500:32;2497:52;;;2545:1;2542;2535:12;2497:52;2584:9;2571:23;2603:31;2628:5;2603:31;:::i;:::-;2653:5;-1:-1:-1;2705:2:1;2690:18;;2677:32;;-1:-1:-1;2760:2:1;2745:18;;2732:32;2783:18;2813:14;;;2810:34;;;2840:1;2837;2830:12;2810:34;2878:6;2867:9;2863:22;2853:32;;2923:7;2916:4;2912:2;2908:13;2904:27;2894:55;;2945:1;2942;2935:12;2894:55;2985:2;2972:16;3011:2;3003:6;3000:14;2997:34;;;3027:1;3024;3017:12;2997:34;3072:7;3067:2;3058:6;3054:2;3050:15;3046:24;3043:37;3040:57;;;3093:1;3090;3083:12;3040:57;2364:794;;;;-1:-1:-1;;3124:2:1;3116:11;;-1:-1:-1;;;2364:794:1:o;3163:180::-;3222:6;3275:2;3263:9;3254:7;3250:23;3246:32;3243:52;;;3291:1;3288;3281:12;3243:52;-1:-1:-1;3314:23:1;;3163:180;-1:-1:-1;3163:180:1:o;3348:247::-;3407:6;3460:2;3448:9;3439:7;3435:23;3431:32;3428:52;;;3476:1;3473;3466:12;3428:52;3515:9;3502:23;3534:31;3559:5;3534:31;:::i;:::-;3584:5;3348:247;-1:-1:-1;;;3348:247:1:o;4347:388::-;4415:6;4423;4476:2;4464:9;4455:7;4451:23;4447:32;4444:52;;;4492:1;4489;4482:12;4444:52;4531:9;4518:23;4550:31;4575:5;4550:31;:::i;:::-;4600:5;-1:-1:-1;4657:2:1;4642:18;;4629:32;4670:33;4629:32;4670:33;:::i;:::-;4722:7;4712:17;;;4347:388;;;;;:::o;4740:559::-;-1:-1:-1;;;;;4953:32:1;;4935:51;;5017:2;5002:18;;4995:34;;;5065:2;5060;5045:18;;5038:30;;;5084:18;;5077:34;;;5104:6;5154;5148:3;5133:19;;5120:49;5219:1;5189:22;;;5213:3;5185:32;;;5178:43;;;;5282:2;5261:15;;;-1:-1:-1;;5257:29:1;5242:45;5238:55;;4740:559;-1:-1:-1;;;4740:559:1:o;5304:277::-;5371:6;5424:2;5412:9;5403:7;5399:23;5395:32;5392:52;;;5440:1;5437;5430:12;5392:52;5472:9;5466:16;5525:5;5518:13;5511:21;5504:5;5501:32;5491:60;;5547:1;5544;5537:12;5586:127;5647:10;5642:3;5638:20;5635:1;5628:31;5678:4;5675:1;5668:15;5702:4;5699:1;5692:15;5718:168;5791:9;;;5822;;5839:15;;;5833:22;;5819:37;5809:71;;5860:18;;:::i;5891:200::-;5957:9;;;5930:4;5985:9;;6013:10;;6025:12;;;6009:29;6048:12;;;6040:21;;6006:56;6003:82;;;6065:18;;:::i;:::-;6003:82;5891:200;;;;:::o;6096:127::-;6157:10;6152:3;6148:20;6145:1;6138:31;6188:4;6185:1;6178:15;6212:4;6209:1;6202:15;6228:120;6268:1;6294;6284:35;;6299:18;;:::i;:::-;-1:-1:-1;6333:9:1;;6228:120::o;6353:251::-;6423:6;6476:2;6464:9;6455:7;6451:23;6447:32;6444:52;;;6492:1;6489;6482:12;6444:52;6524:9;6518:16;6543:31;6568:5;6543:31;:::i;6609:570::-;6832:13;;6814:32;;6906:4;6894:17;;;6888:24;-1:-1:-1;;;;;6884:50:1;6862:20;;;6855:80;6982:4;6970:17;;;6964:24;-1:-1:-1;;;;;7079:21:1;;;7057:20;;;7050:51;;;;7161:4;7149:17;;;7143:24;7139:33;7117:20;;;7110:63;;;;6801:3;6786:19;;6609:570::o;7184:245::-;7263:6;7271;7324:2;7312:9;7303:7;7299:23;7295:32;7292:52;;;7340:1;7337;7330:12;7292:52;-1:-1:-1;;7363:16:1;;7419:2;7404:18;;;7398:25;7363:16;;7398:25;;-1:-1:-1;7184:245:1:o;7434:128::-;7501:9;;;7522:11;;;7519:37;;;7536:18;;:::i;7567:193::-;7665:1;7654:16;;;7636;;;;7632:39;-1:-1:-1;;7686:23:1;;7721:8;7711:19;;7683:48;7680:74;;;7734:18;;:::i;7765:189::-;7861:1;7832:16;;;7850;;;;7828:39;7915:7;7882:18;;-1:-1:-1;;7902:22:1;;7879:46;7876:72;;;7928:18;;:::i;8152:1218::-;8370:13;;-1:-1:-1;;;;;1281:31:1;1269:44;;8338:3;8323:19;;8442:4;8434:6;8430:17;8424:24;8457:54;8505:4;8494:9;8490:20;8476:12;-1:-1:-1;;;;;1281:31:1;1269:44;;1215:104;8457:54;;8560:4;8552:6;8548:17;8542:24;8575:55;8624:4;8613:9;8609:20;8593:14;8035:8;8024:20;8012:33;;7959:92;8575:55;;8679:4;8671:6;8667:17;8661:24;8694:54;8742:4;8731:9;8727:20;8711:14;8131:1;8120:20;8108:33;;8056:91;8694:54;;8797:4;8789:6;8785:17;8779:24;8812:54;8860:4;8849:9;8845:20;8829:14;8131:1;8120:20;8108:33;;8056:91;8812:54;;8922:4;8914:6;8910:17;8904:24;8897:4;8886:9;8882:20;8875:54;8985:4;8977:6;8973:17;8967:24;8960:4;8949:9;8945:20;8938:54;9048:4;9040:6;9036:17;9030:24;9023:4;9012:9;9008:20;9001:54;9074:6;9134:2;9126:6;9122:15;9116:22;9111:2;9100:9;9096:18;9089:50;;9158:6;9213:2;9205:6;9201:15;9195:22;9226:54;9276:2;9265:9;9261:18;9245:14;-1:-1:-1;;;;;1281:31:1;1269:44;;1215:104;9226:54;-1:-1:-1;;9299:6:1;9347:15;;;9341:22;9321:18;;;;9314:50;8152:1218;:::o;9375:489::-;9472:6;9480;9488;9496;9549:3;9537:9;9528:7;9524:23;9520:33;9517:53;;;9566:1;9563;9556:12;9517:53;9595:9;9589:16;9579:26;;9648:2;9637:9;9633:18;9627:25;-1:-1:-1;;;;;9685:5:1;9681:46;9674:5;9671:57;9661:85;;9742:1;9739;9732:12;9661:85;9810:2;9795:18;;9789:25;9854:2;9839:18;;;9833:25;9375:489;;9765:5;;-1:-1:-1;9375:489:1;-1:-1:-1;;;9375:489:1:o;9869:166::-;9899:1;9940;9937;9926:16;9961:3;9951:37;;9968:18;;:::i;:::-;10025:3;10021:1;10018;10007:16;10002:27;9997:32;;;9869:166;;;;:::o

Swarm Source

ipfs://2e3e1101e2bc35fec0d5d0c35889a57f8aeca2704f6951eb692d75d58dd5bbdf

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.