ETH Price: $3,452.62 (+1.80%)
Gas: 3 Gwei

Token

Grove Token (GVR)
 

Overview

Max Total Supply

7,487,102,490,336,178.456769825360231457 GVR

Holders

2,547 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
zoomercell.eth
Balance
145,191,262.713132092837754075 GVR

Value
$0.00
0x192a2ff96d045bb859b81b4343e0d80583f768b2
Loading...
Loading
Loading...
Loading
Loading...
Loading

 


# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GroveToken

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-22
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.8.15;

interface IERC20 {
	function totalSupply() external view returns (uint256);

	function balanceOf(address account) external view returns (uint256);

	function transfer(address recipient, uint256 amount)
	external
	returns (bool);

	function allowance(address owner, address spender)
	external
	view
	returns (uint256);

	function approve(address spender, uint256 amount) external returns (bool);

	function transferFrom(
		address sender,
		address recipient,
		uint256 amount
	) external returns (bool);

	event Transfer(address indexed from, address indexed to, uint256 value);

	event Approval(
		address indexed owner,
		address indexed spender,
		uint256 value
	);
}

interface IFactory {
	function createPair(address tokenA, address tokenB)
	external
	returns (address pair);

	function getPair(address tokenA, address tokenB)
	external
	view
	returns (address pair);
}

interface IRouter {
	function factory() external pure returns (address);

	function WETH() external pure returns (address);

	function addLiquidityETH(
		address token,
		uint256 amountTokenDesired,
		uint256 amountTokenMin,
		uint256 amountETHMin,
		address to,
		uint256 deadline
	)
	external
	payable
	returns (
		uint256 amountToken,
		uint256 amountETH,
		uint256 liquidity
	);

	function swapExactETHForTokensSupportingFeeOnTransferTokens(
		uint256 amountOutMin,
		address[] calldata path,
		address to,
		uint256 deadline
	) external payable;

	function swapExactTokensForETHSupportingFeeOnTransferTokens(
		uint256 amountIn,
		uint256 amountOutMin,
		address[] calldata path,
		address to,
		uint256 deadline
	) external;
}

interface IERC20Metadata is IERC20 {
	function name() external view returns (string memory);
	function symbol() external view returns (string memory);
	function decimals() external view returns (uint8);
}

interface DividendPayingTokenInterface {
	function dividendOf(address _owner) external view returns(uint256);
	function withdrawDividend() external;
	event DividendsDistributed(
		address indexed from,
		uint256 weiAmount
	);
	event DividendWithdrawn(
		address indexed to,
		uint256 weiAmount
	);
}

interface DividendPayingTokenOptionalInterface {
	function withdrawableDividendOf(address _owner) external view returns(uint256);
	function withdrawnDividendOf(address _owner) external view returns(uint256);
	function accumulativeDividendOf(address _owner) external view returns(uint256);
}

library SafeMath {

	function add(uint256 a, uint256 b) internal pure returns (uint256) {
		uint256 c = a + b;
		require(c >= a, "SafeMath: addition overflow");

		return c;
	}

	function sub(uint256 a, uint256 b) internal pure returns (uint256) {
		return sub(a, b, "SafeMath: subtraction overflow");
	}

	function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		require(b <= a, errorMessage);
		uint256 c = a - b;

		return c;
	}

	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;
	}

	function div(uint256 a, uint256 b) internal pure returns (uint256) {
		return div(a, b, "SafeMath: division by 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;
	}

	function mod(uint256 a, uint256 b) internal pure returns (uint256) {
		return mod(a, b, "SafeMath: modulo by zero");
	}

	function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		require(b != 0, errorMessage);
		return a % b;
	}
}

library SafeMathInt {
	int256 private constant MIN_INT256 = int256(1) << 255;
	int256 private constant MAX_INT256 = ~(int256(1) << 255);

	function mul(int256 a, int256 b) internal pure returns (int256) {
		int256 c = a * b;

		// Detect overflow when multiplying MIN_INT256 with -1
		require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
		require((b == 0) || (c / b == a));
		return c;
	}
	function div(int256 a, int256 b) internal pure returns (int256) {
		// Prevent overflow when dividing MIN_INT256 by -1
		require(b != -1 || a != MIN_INT256);

		// Solidity already throws when dividing by 0.
		return a / b;
	}
	function sub(int256 a, int256 b) internal pure returns (int256) {
		int256 c = a - b;
		require((b >= 0 && c <= a) || (b < 0 && c > a));
		return c;
	}
	function add(int256 a, int256 b) internal pure returns (int256) {
		int256 c = a + b;
		require((b >= 0 && c >= a) || (b < 0 && c < a));
		return c;
	}
	function abs(int256 a) internal pure returns (int256) {
		require(a != MIN_INT256);
		return a < 0 ? -a : a;
	}
	function toUint256Safe(int256 a) internal pure returns (uint256) {
		require(a >= 0);
		return uint256(a);
	}
}

library SafeMathUint {
	function toInt256Safe(uint256 a) internal pure returns (int256) {
		int256 b = int256(a);
		require(b >= 0);
		return b;
	}
}

library IterableMapping {
	struct Map {
		address[] keys;
		mapping(address => uint) values;
		mapping(address => uint) indexOf;
		mapping(address => bool) inserted;
	}

	function get(Map storage map, address key) public view returns (uint) {
		return map.values[key];
	}

	function getIndexOfKey(Map storage map, address key) public view returns (int) {
		if(!map.inserted[key]) {
			return -1;
		}
		return int(map.indexOf[key]);
	}

	function getKeyAtIndex(Map storage map, uint index) public view returns (address) {
		return map.keys[index];
	}

	function size(Map storage map) public view returns (uint) {
		return map.keys.length;
	}

	function set(Map storage map, address key, uint val) public {
		if (map.inserted[key]) {
			map.values[key] = val;
		} else {
			map.inserted[key] = true;
			map.values[key] = val;
			map.indexOf[key] = map.keys.length;
			map.keys.push(key);
		}
	}

	function remove(Map storage map, address key) public {
		if (!map.inserted[key]) {
			return;
		}

		delete map.inserted[key];
		delete map.values[key];

		uint index = map.indexOf[key];
		uint lastIndex = map.keys.length - 1;
		address lastKey = map.keys[lastIndex];

		map.indexOf[lastKey] = index;
		delete map.indexOf[key];

		map.keys[index] = lastKey;
		map.keys.pop();
	}
}

abstract contract Context {
	function _msgSender() internal view virtual returns (address) {
		return msg.sender;
	}

	function _msgData() internal view virtual returns (bytes calldata) {
		this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
		return msg.data;
	}
}

contract Ownable is Context {
	address private _owner;

	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

	constructor () {
		address msgSender = _msgSender();
		_owner = msgSender;
		emit OwnershipTransferred(address(0), msgSender);
	}

	function owner() public view returns (address) {
		return _owner;
	}

	modifier onlyOwner() {
		require(_owner == _msgSender(), "Ownable: caller is not the owner");
		_;
	}

	function renounceOwnership() public virtual onlyOwner {
		emit OwnershipTransferred(_owner, address(0));
		_owner = address(0);
	}

	function transferOwnership(address newOwner) public virtual onlyOwner {
		require(newOwner != address(0), "Ownable: new owner is the zero address");
		emit OwnershipTransferred(_owner, newOwner);
		_owner = newOwner;
	}
}

contract ERC20 is Context, IERC20, IERC20Metadata {
	using SafeMath for uint256;

	mapping(address => uint256) private _balances;
	mapping(address => mapping(address => uint256)) private _allowances;

	uint256 private _totalSupply;
	string private _name;
	string private _symbol;

	constructor(string memory name_, string memory symbol_) {
		_name = name_;
		_symbol = symbol_;
	}

	function name() public view virtual override returns (string memory) {
		return _name;
	}

	function symbol() public view virtual override returns (string memory) {
		return _symbol;
	}

	function decimals() public view virtual override returns (uint8) {
		return 18;
	}

	function totalSupply() public view virtual override returns (uint256) {
		return _totalSupply;
	}

	function balanceOf(address account) public view virtual override returns (uint256) {
		return _balances[account];
	}

	function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
		_transfer(_msgSender(), recipient, amount);
		return true;
	}

	function allowance(address owner, address spender) public view virtual override returns (uint256) {
		return _allowances[owner][spender];
	}

	function approve(address spender, uint256 amount) public virtual override returns (bool) {
		_approve(_msgSender(), spender, amount);
		return true;
	}

	function transferFrom(
		address sender,
		address recipient,
		uint256 amount
	) public virtual override returns (bool) {
		_transfer(sender, recipient, amount);
		_approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
		return true;
	}

	function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
		_approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
		return true;
	}

	function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
		_approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
		return true;
	}

	function _transfer(
		address sender,
		address recipient,
		uint256 amount
	) internal virtual {
		require(sender != address(0), "ERC20: transfer from the zero address");
		require(recipient != address(0), "ERC20: transfer to the zero address");
		_beforeTokenTransfer(sender, recipient, amount);
		_balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
		_balances[recipient] = _balances[recipient].add(amount);
		emit Transfer(sender, recipient, amount);
	}

	function _mint(address account, uint256 amount) internal virtual {
		require(account != address(0), "ERC20: mint to the zero address");
		_beforeTokenTransfer(address(0), account, amount);
		_totalSupply = _totalSupply.add(amount);
		_balances[account] = _balances[account].add(amount);
		emit Transfer(address(0), account, amount);
	}

	function _burn(address account, uint256 amount) internal virtual {
		require(account != address(0), "ERC20: burn from the zero address");
		_beforeTokenTransfer(account, address(0), amount);
		_balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
		_totalSupply = _totalSupply.sub(amount);
		emit Transfer(account, address(0), amount);
	}

	function _approve(
		address owner,
		address spender,
		uint256 amount
	) internal virtual {
		require(owner != address(0), "ERC20: approve from the zero address");
		require(spender != address(0), "ERC20: approve to the zero address");
		_allowances[owner][spender] = amount;
		emit Approval(owner, spender, amount);
	}

	function _beforeTokenTransfer(
		address from,
		address to,
		uint256 amount
	) internal virtual {}
}

contract DividendPayingToken is ERC20, Ownable, DividendPayingTokenInterface, DividendPayingTokenOptionalInterface {
	using SafeMath for uint256;
	using SafeMathUint for uint256;
	using SafeMathInt for int256;

	uint256 constant internal magnitude = 2**128;
	uint256 internal magnifiedDividendPerShare;
	uint256 public totalDividendsDistributed;
	address public rewardToken;
	IRouter public uniswapV2Router;

	mapping(address => int256) internal magnifiedDividendCorrections;
	mapping(address => uint256) internal withdrawnDividends;

	constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}

	receive() external payable {}

	function distributeDividendsUsingAmount(uint256 amount) public onlyOwner {
		require(totalSupply() > 0);
		if (amount > 0) {
			magnifiedDividendPerShare = magnifiedDividendPerShare.add((amount).mul(magnitude) / totalSupply());
			emit DividendsDistributed(msg.sender, amount);
			totalDividendsDistributed = totalDividendsDistributed.add(amount);
		}
	}
	function withdrawDividend() public virtual override onlyOwner {
		_withdrawDividendOfUser(payable(msg.sender));
	}
	function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
		uint256 _withdrawableDividend = withdrawableDividendOf(user);
		if (_withdrawableDividend > 0) {
			withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
			emit DividendWithdrawn(user, _withdrawableDividend);
			(bool success) = IERC20(rewardToken).transfer(user, _withdrawableDividend);
			if(!success) {
				withdrawnDividends[user] = withdrawnDividends[user].sub(_withdrawableDividend);
				return 0;
			}
			return _withdrawableDividend;
		}
		return 0;
	}
	function dividendOf(address _owner) public view override returns(uint256) {
		return withdrawableDividendOf(_owner);
	}
	function withdrawableDividendOf(address _owner) public view override returns(uint256) {
		return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
	}
	function withdrawnDividendOf(address _owner) public view override returns(uint256) {
		return withdrawnDividends[_owner];
	}
	function accumulativeDividendOf(address _owner) public view override returns(uint256) {
		return magnifiedDividendPerShare.mul(balanceOf(_owner)).toInt256Safe()
		.add(magnifiedDividendCorrections[_owner]).toUint256Safe() / magnitude;
	}
	function _transfer(address from, address to, uint256 value) internal virtual override {
		require(false);
		int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
		magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
		magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
	}
	function _mint(address account, uint256 value) internal override {
		super._mint(account, value);
		magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
		.sub( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
	}
	function _burn(address account, uint256 value) internal override {
		super._burn(account, value);
		magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account]
		.add( (magnifiedDividendPerShare.mul(value)).toInt256Safe() );
	}
	function _setBalance(address account, uint256 newBalance) internal {
		uint256 currentBalance = balanceOf(account);
		if(newBalance > currentBalance) {
			uint256 mintAmount = newBalance.sub(currentBalance);
			_mint(account, mintAmount);
		} else if(newBalance < currentBalance) {
			uint256 burnAmount = currentBalance.sub(newBalance);
			_burn(account, burnAmount);
		}
	}
	function _setRewardToken(address token) internal onlyOwner {
	    rewardToken = token;
	}
	function _setUniswapRouter(address router) internal onlyOwner {
	    uniswapV2Router = IRouter(router);
	}
}

contract GroveToken is Ownable, ERC20 {

	IRouter public uniswapV2Router;
	address public immutable uniswapV2Pair;

	string private constant _name =  "Grove Token";
	string private constant _symbol = "GVR";
	uint8 private constant _decimals = 18;

	GroveTokenDividendTracker public dividendTracker;

	bool public isTradingEnabled;

	// initialSupply
	uint256 constant initialSupply = 5000000000000000 * (10**18);

	uint256 public maxWalletAmount = initialSupply * 3;

	uint256 public maxTxAmount = initialSupply * 3;

	bool private _swapping;
	uint256 public minimumTokensBeforeSwap = 150000000 * (10**18);

	address public liquidityWallet;
	address public marketingWallet;
	address public buyBackWallet;
	address private bridge;

	struct CustomTaxPeriod {
		bytes23 periodName;
		uint8 blocksInPeriod;
		uint256 timeInPeriod;
		uint8 liquidityFeeOnBuy;
		uint8 liquidityFeeOnSell;
		uint8 marketingFeeOnBuy;
		uint8 marketingFeeOnSell;
		uint8 buyBackFeeOnBuy;
		uint8 buyBackFeeOnSell;
        uint8 burnFeeOnBuy;
		uint8 burnFeeOnSell;
		uint8 holdersFeeOnBuy;
		uint8 holdersFeeOnSell;
	}

	// Base taxes
	CustomTaxPeriod private _base = CustomTaxPeriod("base",0,0,1,1,3,3,1,1,2,2,3,3);

	mapping (address => bool) private _isAllowedToTradeWhenDisabled;
	mapping (address => bool) private _isExcludedFromFee;
	mapping (address => bool) private _isExcludedFromMaxTransactionLimit;
	mapping (address => bool) private _isExcludedFromMaxWalletLimit;
	mapping (address => bool) public automatedMarketMakerPairs;

	uint8 private _liquidityFee;
	uint8 private _marketingFee;
	uint8 private _buyBackFee;
    uint8 private _burnFee;
	uint8 private _holdersFee;
	uint8 private _totalFee;

	event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value);
	event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress);
	event WalletChange(string indexed indentifier, address indexed newWallet, address indexed oldWallet);
	event FeeChange(string indexed identifier, uint8 liquidityFee, uint8 marketingFee, uint8 buyBackFee, uint8 burnFee, uint8 holdersFee);
	event CustomTaxPeriodChange(uint256 indexed newValue, uint256 indexed oldValue, string indexed taxType, bytes23 period);
	event MaxTransactionAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
	event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
	event ExcludeFromFeesChange(address indexed account, bool isExcluded);
	event ExcludeFromMaxTransferChange(address indexed account, bool isExcluded);
	event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
	event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded);
	event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue);
	event MinTokenAmountForDividendsChange(uint256 indexed newValue, uint256 indexed oldValue);
	event DividendsSent(uint256 tokensSwapped);
	event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived,uint256 tokensIntoLiqudity);
    event ClaimETHOverflow(uint256 amount);
    event TokenBurn(uint8 _burnFee, uint256 burnAmount);
	event FeesApplied(uint8 liquidityFee, uint8 marketingFee, uint8 buyBackFee, uint8 burnFee, uint8 holdersFee, uint8 totalFee);
	event BridgeContractChange(address bridgeContract);

	modifier hasMintPermission {
		require(msg.sender == bridge, "only bridge contract can mint");
		_;
	}

	constructor() ERC20(_name, _symbol) {
		dividendTracker = new GroveTokenDividendTracker();
		dividendTracker.setUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        dividendTracker.setRewardToken(address(this));

		liquidityWallet = owner();
		marketingWallet = owner();
		buyBackWallet = owner();

		IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
		address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(address(this), _uniswapV2Router.WETH());
		uniswapV2Router = _uniswapV2Router;
		uniswapV2Pair = _uniswapV2Pair;
		_setAutomatedMarketMakerPair(_uniswapV2Pair, true);

		_isExcludedFromFee[owner()] = true;
		_isExcludedFromFee[address(this)] = true;
		_isExcludedFromFee[address(dividendTracker)] = true;

		dividendTracker.excludeFromDividends(address(dividendTracker));
		dividendTracker.excludeFromDividends(address(this));
		dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD));
		dividendTracker.excludeFromDividends(owner());
		dividendTracker.excludeFromDividends(address(_uniswapV2Router));

		_isAllowedToTradeWhenDisabled[owner()] = true;

		_isExcludedFromMaxTransactionLimit[address(dividendTracker)] = true;
		_isExcludedFromMaxTransactionLimit[address(this)] = true;

		_isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
		_isExcludedFromMaxWalletLimit[address(dividendTracker)] = true;
		_isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
		_isExcludedFromMaxWalletLimit[address(this)] = true;
		_isExcludedFromMaxWalletLimit[owner()] = true;

		_mint(owner(), initialSupply);
	}

	receive() external payable {}

	// Setters
	function activateTrading() external onlyOwner {
		isTradingEnabled = true;
	}
	function deactivateTrading() external onlyOwner {
		isTradingEnabled = false;
	}
	function _setAutomatedMarketMakerPair(address pair, bool value) private {
		require(automatedMarketMakerPairs[pair] != value, "GroveToken: Automated market maker pair is already set to that value");
		automatedMarketMakerPairs[pair] = value;
		if(value) {
			dividendTracker.excludeFromDividends(pair);
		}
		emit AutomatedMarketMakerPairChange(pair, value);
	}
	function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner {
		_isAllowedToTradeWhenDisabled[account] = allowed;
		emit AllowedWhenTradingDisabledChange(account, allowed);
	}
	function excludeFromFees(address account, bool excluded) external onlyOwner {
		require(_isExcludedFromFee[account] != excluded, "GroveToken: Account is already the value of 'excluded'");
		_isExcludedFromFee[account] = excluded;
		emit ExcludeFromFeesChange(account, excluded);
	}
	function excludeFromDividends(address account) external onlyOwner {
		dividendTracker.excludeFromDividends(account);
	}
	function excludeFromMaxTransactionLimit(address account, bool excluded) external onlyOwner {
		require(_isExcludedFromMaxTransactionLimit[account] != excluded, "GroveToken: Account is already the value of 'excluded'");
		_isExcludedFromMaxTransactionLimit[account] = excluded;
		emit ExcludeFromMaxTransferChange(account, excluded);
	}
	function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner {
		require(_isExcludedFromMaxWalletLimit[account] != excluded, "GroveToken: Account is already the value of 'excluded'");
		_isExcludedFromMaxWalletLimit[account] = excluded;
		emit ExcludeFromMaxWalletChange(account, excluded);
	}
	function setWallets(address newLiquidityWallet, address newMarketingWallet, address newBuyBackWallet) external onlyOwner {
		if(liquidityWallet != newLiquidityWallet) {
			require(newLiquidityWallet != address(0), "GroveToken: The liquidityWallet cannot be 0");
			emit WalletChange("liquidityWallet", newLiquidityWallet, liquidityWallet);
			liquidityWallet = newLiquidityWallet;
		}
		if(marketingWallet != newMarketingWallet) {
			require(newMarketingWallet != address(0), "GroveToken: The marketingWallet cannot be 0");
			emit WalletChange("marketingWallet", newMarketingWallet, marketingWallet);
			marketingWallet = newMarketingWallet;
		}
		if(buyBackWallet != newBuyBackWallet) {
			require(newBuyBackWallet != address(0), "GroveToken: The buyBackWallet cannot be 0");
			emit WalletChange("buyBackWallet", newBuyBackWallet, buyBackWallet);
			buyBackWallet = newBuyBackWallet;
		}
	}
	// Base fees
	function setBaseFeesOnBuy(uint8 _liquidityFeeOnBuy, uint8 _marketingFeeOnBuy, uint8 _buyBackFeeOnBuy, uint8 _burnFeeOnBuy, uint8 _holdersFeeOnBuy) external onlyOwner {
		_setCustomBuyTaxPeriod(_base, _liquidityFeeOnBuy, _marketingFeeOnBuy, _buyBackFeeOnBuy, _burnFeeOnBuy, _holdersFeeOnBuy);
		emit FeeChange("baseFees-Buy", _liquidityFeeOnBuy, _marketingFeeOnBuy, _buyBackFeeOnBuy, _burnFeeOnBuy, _holdersFeeOnBuy);
	}
	function setBaseFeesOnSell(uint8 _liquidityFeeOnSell, uint8 _marketingFeeOnSell, uint8 _buyBackFeeOnSell, uint8 _burnFeeOnSell, uint8 _holdersFeeOnSell) external onlyOwner {
		_setCustomSellTaxPeriod(_base, _liquidityFeeOnSell, _marketingFeeOnSell, _buyBackFeeOnSell, _burnFeeOnSell, _holdersFeeOnSell);
		emit FeeChange("baseFees-Sell", _liquidityFeeOnSell, _marketingFeeOnSell, _buyBackFeeOnSell, _burnFeeOnSell, _holdersFeeOnSell);
	}
	function setUniswapRouter(address newAddress) external onlyOwner {
		require(newAddress != address(uniswapV2Router), "GroveToken: The router already has that address");
		emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
		uniswapV2Router = IRouter(newAddress);
		dividendTracker.setUniswapRouter(newAddress);
	}
	function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
		require(newValue != maxTxAmount, "GroveToken: Cannot update maxTxAmount to same value");
		emit MaxTransactionAmountChange(newValue, maxTxAmount);
		maxTxAmount = newValue;
	}
	function setMaxWalletAmount(uint256 newValue) external onlyOwner {
		require(newValue != maxWalletAmount, "GroveToken: Cannot update maxWalletAmount to same value");
		emit MaxWalletAmountChange(newValue, maxWalletAmount);
		maxWalletAmount = newValue;
	}
	function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
		require(newValue != minimumTokensBeforeSwap, "GroveToken: Cannot update minimumTokensBeforeSwap to same value");
		emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
		minimumTokensBeforeSwap = newValue;
	}
	function setMinimumTokenBalanceForDividends(uint256 newValue) external onlyOwner {
		dividendTracker.setTokenBalanceForDividends(newValue);
	}
	function claim() external {
		dividendTracker.processAccount(payable(msg.sender), false);
    }
	function claimETHOverflow(uint256 amount) external onlyOwner {
	    require(amount < address(this).balance, "GroveToken: Cannot send more than contract balance");
        (bool success,) = address(owner()).call{value : amount}("");
        if (success){
            emit ClaimETHOverflow(amount);
        }
	}
	function mint(address account, uint256 value) external hasMintPermission returns(bool) {
		_mint(account, value);
		return true;
	}
	function burn(uint256 value) external {
		_burn(msg.sender, value);
	}

    function bridgeContract() external view returns (address) {
        return bridge;
    }

    function setBridgeContract(address _bridgeContract) external onlyOwner {
        require(_bridgeContract != address(0x0) && _bridgeContract != bridge, "invalid address");
        bridge = _bridgeContract;
		emit BridgeContractChange(_bridgeContract);
    }

	// Getters
	function getTotalDividendsDistributed() external view returns (uint256) {
		return dividendTracker.totalDividendsDistributed();
	}
	function withdrawableDividendOf(address account) external view returns(uint256) {
		return dividendTracker.withdrawableDividendOf(account);
	}
	function dividendTokenBalanceOf(address account) external view returns (uint256) {
		return dividendTracker.balanceOf(account);
	}
	function getNumberOfDividendTokenHolders() external view returns(uint256) {
		return dividendTracker.getNumberOfTokenHolders();
	}
	function getBaseBuyFees() external view returns (uint8, uint8, uint8, uint8, uint8){
		return (_base.liquidityFeeOnBuy, _base.marketingFeeOnBuy, _base.buyBackFeeOnBuy, _base.burnFeeOnBuy, _base.holdersFeeOnBuy);
	}
	function getBaseSellFees() external view returns (uint8, uint8, uint8, uint8, uint8){
		return (_base.liquidityFeeOnSell, _base.marketingFeeOnSell, _base.buyBackFeeOnSell, _base.burnFeeOnSell, _base.holdersFeeOnSell);
	}

	// Main
	function _transfer(
		address from,
		address to,
		uint256 amount
		) internal override {
			require(from != address(0), "ERC20: transfer from the zero address");
			require(to != address(0), "ERC20: transfer to the zero address");

			if(amount == 0) {
				super._transfer(from, to, 0);
				return;
			}

			bool isBuyFromLp = automatedMarketMakerPairs[from];
			bool isSelltoLp = automatedMarketMakerPairs[to];

			if(!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) {
				require(isTradingEnabled, "GroveToken: Trading is currently disabled.");
				if (!_isExcludedFromMaxTransactionLimit[to] && !_isExcludedFromMaxTransactionLimit[from]) {
					require(amount <= maxTxAmount, "GroveToken: Buy amount exceeds the maxTxBuyAmount.");
				}
				if (!_isExcludedFromMaxWalletLimit[to]) {
					require((balanceOf(to) + amount) <= maxWalletAmount, "GroveToken: Expected wallet amount exceeds the maxWalletAmount.");
				}
			}

			_adjustTaxes(isBuyFromLp, isSelltoLp);
			bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

			if (
				isTradingEnabled &&
				canSwap &&
				!_swapping &&
				_totalFee > 0 &&
				automatedMarketMakerPairs[to]
			) {
				_swapping = true;
				_swapAndLiquify();
				_swapping = false;
			}

			bool takeFee = !_swapping && isTradingEnabled;

			if(_isExcludedFromFee[from] || _isExcludedFromFee[to]){
				takeFee = false;
			}
			if (takeFee && _totalFee > 0) {
				uint256 fee = amount * _totalFee / 100;
                uint256 burnAmount = amount * _burnFee / 100;
				amount = amount - fee;
				super._transfer(from, address(this), fee);

                if (burnAmount > 0) {
                    super._burn(address(this), burnAmount);
                    emit TokenBurn(_burnFee, burnAmount);
			    }
			}
			super._transfer(from, to, amount);

            try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
		    try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
	}
	function _adjustTaxes(bool isBuyFromLp, bool isSelltoLp) private {
		_liquidityFee = 0;
		_marketingFee = 0;
		_buyBackFee = 0;
        _burnFee = 0;
		_holdersFee = 0;

		if (isBuyFromLp) {
			_liquidityFee = _base.liquidityFeeOnBuy;
			_marketingFee = _base.marketingFeeOnBuy;
			_buyBackFee = _base.buyBackFeeOnBuy;
            _burnFee = _base.burnFeeOnBuy;
			_holdersFee = _base.holdersFeeOnBuy;
		}
	    if (isSelltoLp) {
	    	_liquidityFee = _base.liquidityFeeOnSell;
			_marketingFee = _base.marketingFeeOnSell;
			_buyBackFee = _base.buyBackFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
			_holdersFee = _base.holdersFeeOnSell;
		}
        if (!isSelltoLp && !isBuyFromLp) {
			_liquidityFee = _base.liquidityFeeOnSell;
			_marketingFee = _base.marketingFeeOnSell;
			_buyBackFee = _base.buyBackFeeOnSell;
            _burnFee = _base.burnFeeOnSell;
			_holdersFee = _base.holdersFeeOnSell;
		}
		_totalFee = _liquidityFee + _marketingFee + _buyBackFee + _burnFee + _holdersFee;
		emit FeesApplied(_liquidityFee, _marketingFee, _buyBackFee, _burnFee, _holdersFee, _totalFee);
	}
	function _setCustomSellTaxPeriod(CustomTaxPeriod storage map,
		uint8 _liquidityFeeOnSell,
		uint8 _marketingFeeOnSell,
		uint8 _buyBackFeeOnSell,
        uint8 _burnFeeOnSell,
		uint8 _holdersFeeOnSell
	) private {
		if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
			emit CustomTaxPeriodChange(_liquidityFeeOnSell, map.liquidityFeeOnSell, "liquidityFeeOnSell", map.periodName);
			map.liquidityFeeOnSell = _liquidityFeeOnSell;
		}
		if (map.marketingFeeOnSell != _marketingFeeOnSell) {
			emit CustomTaxPeriodChange(_marketingFeeOnSell, map.marketingFeeOnSell, "marketingFeeOnSell", map.periodName);
			map.marketingFeeOnSell = _marketingFeeOnSell;
		}
		if (map.buyBackFeeOnSell != _buyBackFeeOnSell) {
			emit CustomTaxPeriodChange(_buyBackFeeOnSell, map.buyBackFeeOnSell, "buyBackFeeOnSell", map.periodName);
			map.buyBackFeeOnSell = _buyBackFeeOnSell;
		}
        if (map.burnFeeOnSell != _burnFeeOnSell) {
			emit CustomTaxPeriodChange(_burnFeeOnSell, map.burnFeeOnSell, "burnFeeOnSell", map.periodName);
			map.burnFeeOnSell = _burnFeeOnSell;
		}
		if (map.holdersFeeOnSell != _holdersFeeOnSell) {
			emit CustomTaxPeriodChange(_holdersFeeOnSell, map.holdersFeeOnSell, "holdersFeeOnSell", map.periodName);
			map.holdersFeeOnSell = _holdersFeeOnSell;
		}
	}
	function _setCustomBuyTaxPeriod(CustomTaxPeriod storage map,
		uint8 _liquidityFeeOnBuy,
		uint8 _marketingFeeOnBuy,
		uint8 _buyBackFeeOnBuy,
        uint8 _burnFeeOnBuy,
		uint8 _holdersFeeOnBuy
		) private {
		if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
			emit CustomTaxPeriodChange(_liquidityFeeOnBuy, map.liquidityFeeOnBuy, "liquidityFeeOnBuy", map.periodName);
			map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
		}
		if (map.marketingFeeOnBuy != _marketingFeeOnBuy) {
			emit CustomTaxPeriodChange(_marketingFeeOnBuy, map.marketingFeeOnBuy, "marketingFeeOnBuy", map.periodName);
			map.marketingFeeOnBuy = _marketingFeeOnBuy;
		}
		if (map.buyBackFeeOnBuy != _buyBackFeeOnBuy) {
			emit CustomTaxPeriodChange(_buyBackFeeOnBuy, map.buyBackFeeOnBuy, "buyBackFeeOnBuy", map.periodName);
			map.buyBackFeeOnBuy = _buyBackFeeOnBuy;
		}
        if (map.burnFeeOnBuy != _burnFeeOnBuy) {
			emit CustomTaxPeriodChange(_burnFeeOnBuy, map.burnFeeOnBuy, "burnFeeOnBuy", map.periodName);
			map.burnFeeOnBuy = _burnFeeOnBuy;
		}
		if (map.holdersFeeOnBuy != _holdersFeeOnBuy) {
			emit CustomTaxPeriodChange(_holdersFeeOnBuy, map.holdersFeeOnBuy, "holdersFeeOnBuy", map.periodName);
			map.holdersFeeOnBuy = _holdersFeeOnBuy;
		}
	}
	function _swapAndLiquify() private {
		uint256 contractBalance = balanceOf(address(this));
		uint256 initialETHBalance = address(this).balance;

		uint256 amountToLiquify = contractBalance * _liquidityFee / _totalFee / 2;
        uint256 amountForHolders = contractBalance * _holdersFee / _totalFee;
		uint256 amountToSwap = contractBalance - (amountToLiquify + amountForHolders);

		_swapTokensForETH(amountToSwap);

		uint256 ETHBalanceAfterSwap = address(this).balance  - initialETHBalance;
		uint256 totalETHFee = _totalFee - ((_liquidityFee / 2) + _burnFee + _holdersFee);
		uint256 amountETHLiquidity = ETHBalanceAfterSwap * _liquidityFee / totalETHFee / 2;
        uint256 amountETHMarketing = ETHBalanceAfterSwap * _marketingFee / totalETHFee;
		uint256 amountETHBuyBack = ETHBalanceAfterSwap - (amountETHLiquidity + amountETHMarketing);

		payable(buyBackWallet).transfer(amountETHBuyBack);
        payable(marketingWallet).transfer(amountETHMarketing);

		if (amountToLiquify > 0) {
			_addLiquidity(amountToLiquify, amountETHLiquidity);
			emit SwapAndLiquify(amountToSwap, amountETHLiquidity, amountToLiquify);
        }

		(bool success) = IERC20(address(this)).transfer(address(dividendTracker), amountForHolders);
		if(success) {
			dividendTracker.distributeDividendsUsingAmount(amountForHolders);
			emit DividendsSent(amountForHolders);
		}
	}
	function _swapTokensForETH(uint256 tokenAmount) private {
		address[] memory path = new address[](2);
		path[0] = address(this);
		path[1] = uniswapV2Router.WETH();
		_approve(address(this), address(uniswapV2Router), tokenAmount);
		uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
			tokenAmount,
			0, // accept any amount of ETH
			path,
			address(this),
			block.timestamp
		);
	}
	function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
		_approve(address(this), address(uniswapV2Router), tokenAmount);
		uniswapV2Router.addLiquidityETH{value: ethAmount}(
			address(this),
			tokenAmount,
			0, // slippage is unavoidable
			0, // slippage is unavoidable
			liquidityWallet,
			block.timestamp
		);
	}
}

contract GroveTokenDividendTracker is DividendPayingToken {
	using SafeMath for uint256;
	using SafeMathInt for int256;
	using IterableMapping for IterableMapping.Map;

	IterableMapping.Map private tokenHoldersMap;

	mapping (address => bool) public excludedFromDividends;
	mapping (address => uint256) public lastClaimTimes;
	uint256 public claimWait;
	uint256 public minimumTokenBalanceForDividends;

	event ExcludeFromDividends(address indexed account);
	event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
	event Claim(address indexed account, uint256 amount, bool indexed automatic);

	constructor() DividendPayingToken("GroveToken_Dividend_Tracker", "GroveToken_Dividend_Tracker") {
		claimWait = 3600;
		minimumTokenBalanceForDividends = 0 * (10**18);
	}
	function setRewardToken(address token) external onlyOwner {
	    _setRewardToken(token);
	}
	function setUniswapRouter(address router) external onlyOwner {
	    _setUniswapRouter(router);
	}
	function _transfer(address, address, uint256) internal override pure {
		require(false, "GroveToken_Dividend_Tracker: No transfers allowed");
	}
	function excludeFromDividends(address account) external onlyOwner {
		require(!excludedFromDividends[account]);
		excludedFromDividends[account] = true;
		_setBalance(account, 0);
		tokenHoldersMap.remove(account);
		emit ExcludeFromDividends(account);
	}
	function setTokenBalanceForDividends(uint256 newValue) external onlyOwner {
		require(minimumTokenBalanceForDividends != newValue, "GroveToken_Dividend_Tracker: minimumTokenBalanceForDividends already the value of 'newValue'.");
		minimumTokenBalanceForDividends = newValue;
	}
	function getNumberOfTokenHolders() external view returns(uint256) {
		return tokenHoldersMap.keys.length;
	}
    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
		if(excludedFromDividends[account]) {
			return;
		}
		if(newBalance >= minimumTokenBalanceForDividends) {
			_setBalance(account, newBalance);
			tokenHoldersMap.set(account, newBalance);
		}
		else {
			_setBalance(account, 0);
			tokenHoldersMap.remove(account);
		}
		processAccount(account, true);
	}
	function processAccount(address payable account, bool automatic) public onlyOwner returns (bool) {
		uint256 amount = _withdrawDividendOfUser(account);
		if(amount > 0) {
			lastClaimTimes[account] = block.timestamp;
			emit Claim(account, amount, automatic);
			return true;
		}
		return false;
	}
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"bridgeContract","type":"address"}],"name":"BridgeContractChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETHOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"}],"name":"DividendsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"marketingFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"burnFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"marketingFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"burnFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalFee","type":"uint8"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountForDividendsChange","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":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"_burnFee","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"TokenBurn","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":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","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":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridgeContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract GroveTokenDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_burnFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_marketingFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_burnFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridgeContract","type":"address"}],"name":"setBridgeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"},{"internalType":"address","name":"newMarketingWallet","type":"address"},{"internalType":"address","name":"newBuyBackWallet","type":"address"}],"name":"setWallets","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":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a06040526200001f6df684df56c3e01bc6c73200000000600362000b6d565b6008556200003d6df684df56c3e01bc6c73200000000600362000b6d565b6009556a7c13bc4b2c133c56000000600b55604080516101a081018252636261736560e01b815260006020820181905291810182905260016060820181905260808201819052600360a0830181905260c0830181905260e0830182905261010083019190915260026101208301819052610140830152610160820181905261018090910152601080546001600160c01b031916636261736560981b1790556011556012805469030302020101030301016001600160501b03199091161790553480156200010957600080fd5b506040518060400160405280600b81526020016a23b937bb32902a37b5b2b760a91b8152506040518060400160405280600381526020016223ab2960e91b81525060006200015c6200084a60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506004620001b4838262000c33565b506005620001c3828262000c33565b505050604051620001d49062000b49565b604051809103906000f080158015620001f1573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b03929092169182179055604051635f54c24f60e11b8152737a250d5630b4cf539739df2c5dacb4c659f2488d600482015263bea9849e90602401600060405180830381600087803b1580156200025c57600080fd5b505af115801562000271573d6000803e3d6000fd5b5050600754604051638aee812760e01b81523060048201526001600160a01b039091169250638aee81279150602401600060405180830381600087803b158015620002bb57600080fd5b505af1158015620002d0573d6000803e3d6000fd5b50505050620002e46200084e60201b60201c565b600c80546001600160a01b039283166001600160a01b03199182161790915560008054600d8054841691909416908117909355600e805490921690921790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9291839163c45a0155916004808201926020929091908290030181865afa15801562000378573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200039e919062000cff565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003ec573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000412919062000cff565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000460573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000486919062000cff565b600680546001600160a01b0319166001600160a01b038581169190911790915581166080529050620004ba8160016200085d565b600160146000620004d36000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260149093528183208054851660019081179091556007805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b1580156200056957600080fd5b505af11580156200057e573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620005c857600080fd5b505af1158015620005dd573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200062957600080fd5b505af11580156200063e573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620006686000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b158015620006aa57600080fd5b505af1158015620006bf573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b1580156200070b57600080fd5b505af115801562000720573d6000803e3d6000fd5b505050506001601360006200073a6200084e60201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905560078054831682526015855283822080548716600190811790915530808452858420805489168317905588851684526016968790528584208054891683179055915484168352848320805488168217905560065490931682528382208054871684179055815291822080549094168117909355620007ee6000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055620008426200082d6000546001600160a01b031690565b6df684df56c3e01bc6c73200000000620009d3565b505062000d45565b3390565b6000546001600160a01b031690565b6001600160a01b03821660009081526017602052604090205481151560ff909116151503620009075760405162461bcd60e51b8152602060048201526044602482018190527f47726f7665546f6b656e3a204175746f6d61746564206d61726b6574206d616b908201527f6572207061697220697320616c72656164792073657420746f20746861742076606482015263616c756560e01b608482015260a4015b60405180910390fd5b6001600160a01b0382166000908152601760205260409020805460ff19168215801591909117909155620009975760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200097d57600080fd5b505af115801562000992573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a90600090a35050565b6001600160a01b03821662000a2b5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401620008fe565b62000a478160035462000adf60201b62001d7e1790919060201c565b6003556001600160a01b03821660009081526001602090815260409091205462000a7c91839062001d7e62000adf821b17901c565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9062000ace9085815260200190565b60405180910390a35050565b505050565b60008062000aee838562000d2a565b90508381101562000b425760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401620008fe565b9392505050565b611e6780620049ea83390190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161562000b8a5762000b8a62000b57565b500290565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000bba57607f821691505b60208210810362000bdb57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000ada57600081815260208120601f850160051c8101602086101562000c0a5750805b601f850160051c820191505b8181101562000c2b5782815560010162000c16565b505050505050565b81516001600160401b0381111562000c4f5762000c4f62000b8f565b62000c678162000c60845462000ba5565b8462000be1565b602080601f83116001811462000c9f576000841562000c865750858301515b600019600386901b1c1916600185901b17855562000c2b565b600085815260208120601f198616915b8281101562000cd05788860151825594840194600190910190840162000caf565b508582101562000cef5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000d1257600080fd5b81516001600160a01b038116811462000b4257600080fd5b6000821982111562000d405762000d4062000b57565b500190565b608051613c8962000d6160003960006105ad0152613c896000f3fe6080604052600436106103035760003560e01c8063715018a611610190578063aee50b1e116100dc578063cd59658311610095578063d46980161161006f578063d469801614610958578063dd62ed3e14610978578063f2fde38b146109be578063fe017535146109de57600080fd5b8063cd59658314610904578063d2d7ad8314610922578063d32215761461093857600080fd5b8063aee50b1e146107e3578063b1ba39ea14610803578063b62496f514610823578063bea9849e14610853578063c024666814610873578063cd43e2281461089357600080fd5b80638da5cb5b11610149578063a457c2d711610123578063a457c2d71461076d578063a8b9d2401461078d578063a9059cbb146107ad578063aa4bde28146107cd57600080fd5b80638da5cb5b1461071a57806395d89b41146107385780639fad96831461074d57600080fd5b8063715018a61461066f57806375cb1bd11461068457806375f0a874146106a4578063781edb3c146106c4578063880bcbc1146106e45780638c0b5e221461070457600080fd5b806330bb4cff1161024f57806342966c68116102085780635ebf4db9116101e25780635ebf4db9146105e457806364b0f653146106045780636843cd841461061957806370a082311461063957600080fd5b806342966c681461057b57806349bd5a5e1461059b5780634e71d92d146105cf57600080fd5b806330bb4cff146104d5578063313ce567146104ea57806331e79db01461050657806334cf1fea14610526578063395093511461053b57806340c10f191461055b57600080fd5b80631694505e116102bc5780631e293c10116102965780631e293c101461045557806323b872dd1461047557806327a14fc2146104955780632c1f5216146104b557600080fd5b80631694505e146103de57806318160ddd146104165780631cd348c01461043557600080fd5b8063064a59d01461030f57806306fdde0314610345578063095ea7b314610367578063098df585146103875780630b26cf66146103a95780630bd05b69146103c957600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5060075461033090600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561035157600080fd5b5061035a610a24565b60405161033c91906135f2565b34801561037357600080fd5b5061033061038236600461365c565b610ab6565b34801561039357600080fd5b506103a76103a2366004613688565b610acc565b005b3480156103b557600080fd5b506103a76103c43660046136a1565b610bfe565b3480156103d557600080fd5b506103a7610ce0565b3480156103ea57600080fd5b506006546103fe906001600160a01b031681565b6040516001600160a01b03909116815260200161033c565b34801561042257600080fd5b506003545b60405190815260200161033c565b34801561044157600080fd5b50600e546103fe906001600160a01b031681565b34801561046157600080fd5b506103a7610470366004613688565b610d1f565b34801561048157600080fd5b506103306104903660046136be565b610de9565b3480156104a157600080fd5b506103a76104b0366004613688565b610e52565b3480156104c157600080fd5b506007546103fe906001600160a01b031681565b3480156104e157600080fd5b50610427610f26565b3480156104f657600080fd5b506040516012815260200161033c565b34801561051257600080fd5b506103a76105213660046136a1565b610f99565b34801561053257600080fd5b506103a7611026565b34801561054757600080fd5b5061033061055636600461365c565b61105f565b34801561056757600080fd5b5061033061057636600461365c565b611095565b34801561058757600080fd5b506103a7610596366004613688565b6110fc565b3480156105a757600080fd5b506103fe7f000000000000000000000000000000000000000000000000000000000000000081565b3480156105db57600080fd5b506103a7611109565b3480156105f057600080fd5b506103a76105ff366004613688565b61117e565b34801561061057600080fd5b506104276111d9565b34801561062557600080fd5b506104276106343660046136a1565b611223565b34801561064557600080fd5b506104276106543660046136a1565b6001600160a01b031660009081526001602052604090205490565b34801561067b57600080fd5b506103a7611299565b34801561069057600080fd5b506103a761069f3660046136ff565b61130d565b3480156106b057600080fd5b50600d546103fe906001600160a01b031681565b3480156106d057600080fd5b506103a76106df366004613758565b611620565b3480156106f057600080fd5b506103a76106ff366004613758565b6116ea565b34801561071057600080fd5b5061042760095481565b34801561072657600080fd5b506000546001600160a01b03166103fe565b34801561074457600080fd5b5061035a6117ac565b34801561075957600080fd5b506103a76107683660046137a7565b6117bb565b34801561077957600080fd5b5061033061078836600461365c565b611872565b34801561079957600080fd5b506104276107a83660046136a1565b6118c1565b3480156107b957600080fd5b506103306107c836600461365c565b6118f4565b3480156107d957600080fd5b5061042760085481565b3480156107ef57600080fd5b506103a76107fe366004613688565b611901565b34801561080f57600080fd5b506103a761081e3660046137a7565b6119d5565b34801561082f57600080fd5b5061033061083e3660046136a1565b60176020526000908152604090205460ff1681565b34801561085f57600080fd5b506103a761086e3660046136a1565b611a2c565b34801561087f57600080fd5b506103a761088e366004613758565b611b50565b34801561089f57600080fd5b5060125460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a00161033c565b34801561091057600080fd5b50600f546001600160a01b03166103fe565b34801561092e57600080fd5b50610427600b5481565b34801561094457600080fd5b506103a7610953366004613758565b611c12565b34801561096457600080fd5b50600c546103fe906001600160a01b031681565b34801561098457600080fd5b5061042761099336600461380c565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109ca57600080fd5b506103a76109d93660046136a1565b611c94565b3480156109ea57600080fd5b5060125460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b909104166108d0565b606060048054610a339061383a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f9061383a565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905090565b6000610ac3338484611de4565b50600192915050565b6000546001600160a01b03163314610aff5760405162461bcd60e51b8152600401610af690613874565b60405180910390fd5b478110610b695760405162461bcd60e51b815260206004820152603260248201527f47726f7665546f6b656e3a2043616e6e6f742073656e64206d6f7265207468616044820152716e20636f6e74726163742062616c616e636560701b6064820152608401610af6565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610bb6576040519150601f19603f3d011682016040523d82523d6000602084013e610bbb565b606091505b505090508015610bfa576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca48906020015b60405180910390a15b5050565b6000546001600160a01b03163314610c285760405162461bcd60e51b8152600401610af690613874565b6001600160a01b03811615801590610c4e5750600f546001600160a01b03828116911614155b610c8c5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610af6565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f73244783076368b5f1590f6a673d39babc815dad202ae0fa41954830b1ef51249060200160405180910390a150565b6000546001600160a01b03163314610d0a5760405162461bcd60e51b8152600401610af690613874565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610d495760405162461bcd60e51b8152600401610af690613874565b6009548103610db65760405162461bcd60e51b815260206004820152603360248201527f47726f7665546f6b656e3a2043616e6e6f7420757064617465206d61785478416044820152726d6f756e7420746f2073616d652076616c756560681b6064820152608401610af6565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610df6848484611f09565b610e488433610e4385604051806060016040528060288152602001613be7602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906124c8565b611de4565b5060019392505050565b6000546001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610af690613874565b6008548103610ef35760405162461bcd60e51b815260206004820152603760248201527f47726f7665546f6b656e3a2043616e6e6f7420757064617465206d617857616c60448201527f6c6574416d6f756e7420746f2073616d652076616c75650000000000000000006064820152608401610af6565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610f70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9491906138a9565b905090565b6000546001600160a01b03163314610fc35760405162461bcd60e51b8152600401610af690613874565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561100b57600080fd5b505af115801561101f573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146110505760405162461bcd60e51b8152600401610af690613874565b6007805460ff60a01b19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ac3918590610e439086611d7e565b600f546000906001600160a01b031633146110f25760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792062726964676520636f6e74726163742063616e206d696e740000006044820152606401610af6565b610ac38383612502565b61110633826125e8565b50565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561115a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110691906138c2565b6000546001600160a01b031633146111a85760405162461bcd60e51b8152600401610af690613874565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610ff1565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610f70573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129391906138a9565b92915050565b6000546001600160a01b031633146112c35760405162461bcd60e51b8152600401610af690613874565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113375760405162461bcd60e51b8152600401610af690613874565b600c546001600160a01b0384811691161461142f576001600160a01b0383166113b65760405162461bcd60e51b815260206004820152602b60248201527f47726f7665546f6b656e3a20546865206c697175696469747957616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610af6565b600c546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691851690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600c80546001600160a01b0319166001600160a01b0385161790555b600d546001600160a01b03838116911614611527576001600160a01b0382166114ae5760405162461bcd60e51b815260206004820152602b60248201527f47726f7665546f6b656e3a20546865206d61726b6574696e6757616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610af6565b600d546040516e1b585c9ad95d1a5b99d5d85b1b195d608a1b81526001600160a01b0391821691841690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0319166001600160a01b0384161790555b600e546001600160a01b0382811691161461161b576001600160a01b0381166115a45760405162461bcd60e51b815260206004820152602960248201527f47726f7665546f6b656e3a20546865206275794261636b57616c6c657420636160448201526806e6e6f7420626520360bc1b6064820152608401610af6565b600e546040516c189d5e509858dad5d85b1b195d609a1b81526001600160a01b0391821691831690600d01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600e80546001600160a01b0319166001600160a01b0383161790555b505050565b6000546001600160a01b0316331461164a5760405162461bcd60e51b8152600401610af690613874565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150361168a5760405162461bcd60e51b8152600401610af6906138df565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91015b60405180910390a25050565b6000546001600160a01b031633146117145760405162461bcd60e51b8152600401610af690613874565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036117545760405162461bcd60e51b8152600401610af6906138df565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a4091016116de565b606060058054610a339061383a565b6000546001600160a01b031633146117e55760405162461bcd60e51b8152600401610af690613874565b6117f4601086868686866126ec565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b6000610ac33384610e4385604051806060016040528060258152602001613c2f602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906124c8565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611252565b6000610ac3338484611f09565b6000546001600160a01b0316331461192b5760405162461bcd60e51b8152600401610af690613874565b600b5481036119a25760405162461bcd60e51b815260206004820152603f60248201527f47726f7665546f6b656e3a2043616e6e6f7420757064617465206d696e696d7560448201527f6d546f6b656e734265666f72655377617020746f2073616d652076616c7565006064820152608401610af6565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b031633146119ff5760405162461bcd60e51b8152600401610af690613874565b611a0e601086868686866129d1565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d0161180d565b6000546001600160a01b03163314611a565760405162461bcd60e51b8152600401610af690613874565b6006546001600160a01b0390811690821603611acc5760405162461bcd60e51b815260206004820152602f60248201527f47726f7665546f6b656e3a2054686520726f7574657220616c7265616479206860448201526e61732074686174206164647265737360881b6064820152608401610af6565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e90602401610ff1565b6000546001600160a01b03163314611b7a5760405162461bcd60e51b8152600401610af690613874565b6001600160a01b03821660009081526014602052604090205481151560ff909116151503611bba5760405162461bcd60e51b8152600401610af6906138df565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b91016116de565b6000546001600160a01b03163314611c3c5760405162461bcd60e51b8152600401610af690613874565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d35091016116de565b6000546001600160a01b03163314611cbe5760405162461bcd60e51b8152600401610af690613874565b6001600160a01b038116611d235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610af6565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080611d8b838561394b565b905083811015611ddd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610af6565b9392505050565b6001600160a01b038316611e465760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610af6565b6001600160a01b038216611ea75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610af6565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611f2f5760405162461bcd60e51b8152600401610af690613963565b6001600160a01b038216611f555760405162461bcd60e51b8152600401610af6906139a8565b80600003611f695761161b83836000612cd2565b6001600160a01b03808416600081815260176020908152604080832054948716835280832054938352601390915290205460ff928316929182169116158015611fcb57506001600160a01b03841660009081526013602052604090205460ff16155b156121b157600754600160a01b900460ff1661203c5760405162461bcd60e51b815260206004820152602a60248201527f47726f7665546f6b656e3a2054726164696e672069732063757272656e746c79604482015269103234b9b0b13632b21760b11b6064820152608401610af6565b6001600160a01b03841660009081526015602052604090205460ff1615801561207e57506001600160a01b03851660009081526015602052604090205460ff16155b156120f0576009548311156120f05760405162461bcd60e51b815260206004820152603260248201527f47726f7665546f6b656e3a2042757920616d6f756e742065786365656473207460448201527134329036b0bc2a3c213abca0b6b7bab73a1760711b6064820152608401610af6565b6001600160a01b03841660009081526016602052604090205460ff166121b15760085483612133866001600160a01b031660009081526001602052604090205490565b61213d919061394b565b11156121b15760405162461bcd60e51b815260206004820152603f60248201527f47726f7665546f6b656e3a2045787065637465642077616c6c657420616d6f7560448201527f6e74206578636565647320746865206d617857616c6c6574416d6f756e742e006064820152608401610af6565b6121bb8282612dde565b600b543060009081526001602052604090205460075491111590600160a01b900460ff1680156121e85750805b80156121f75750600a5460ff16155b801561220e5750601854600160281b900460ff1615155b801561223257506001600160a01b03851660009081526017602052604090205460ff165b1561225757600a805460ff1916600117905561224c613056565b600a805460ff191690555b600a5460009060ff161580156122765750600754600160a01b900460ff165b6001600160a01b03881660009081526014602052604090205490915060ff16806122b857506001600160a01b03861660009081526014602052604090205460ff165b156122c1575060005b8080156122d95750601854600160281b900460ff1615155b156123a2576018546000906064906122fb90600160281b900460ff16886139eb565b6123059190613a20565b601854909150600090606490612325906301000000900460ff16896139eb565b61232f9190613a20565b905061233b8288613a34565b9650612348893084612cd2565b801561239f5761235830826125e8565b60185460408051630100000090920460ff168252602082018390527ffecf12fd01122af77b8b8f1a0f126363142d14fba298ea36d9fe4909f61bb5a1910160405180910390a15b50505b6123ad878787612cd2565b6007546001600160a01b031663e30443bc886123de816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561242457600080fd5b505af1925050508015612435575060015b506007546001600160a01b031663e30443bc87612467816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156124ad57600080fd5b505af19250505080156124be575060015b5050505050505050565b600081848411156124ec5760405162461bcd60e51b8152600401610af691906135f2565b5060006124f98486613a34565b95945050505050565b6001600160a01b0382166125585760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610af6565b6003546125659082611d7e565b6003556001600160a01b03821660009081526001602052604090205461258b9082611d7e565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125dc9085815260200190565b60405180910390a35050565b6001600160a01b0382166126485760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610af6565b61268581604051806060016040528060228152602001613b9f602291396001600160a01b03851660009081526001602052604090205491906124c8565b6001600160a01b0383166000908152600160205260409020556003546126ab90826133b1565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016125dc565b600286015460ff86811691161461276d57604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff9182169291891691600080516020613c0f833981519152916127539160481b90613a4b565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff85811662010000909204161461280157604051706d61726b6574696e674665654f6e42757960781b815260110160405190819003812060028801548854919260ff6201000090920482169291881691600080516020613c0f833981519152916127e09160481b90613a4b565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff848116600160201b9092041614612898576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160201b90920482169291871691600080516020613c0f833981519152916128749160481b90613a4b565b60405180910390a460028601805464ff000000001916600160201b60ff8616021790555b600286015460ff838116600160301b909204161461292e576040516b6275726e4665654f6e42757960a01b8152600c0160405190819003812060028801548854919260ff600160301b90920482169291861691600080516020613c0f833981519152916129089160481b90613a4b565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b90920416146129c9576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b90920482169291851691600080516020613c0f833981519152916129a19160481b90613a4b565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600286015460ff8681166101009092041614612a6257604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff61010090920482169291891691600080516020613c0f83398151915291612a439160481b90613a4b565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff85811663010000009092041614612afb57604051711b585c9ad95d1a5b99d1995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff630100000090920482169291881691600080516020613c0f83398151915291612ad89160481b90613a4b565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614612b94576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b90920482169291871691600080516020613c0f83398151915291612b6f9160481b90613a4b565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b9092041614612c2c576040516c189d5c9b91995953db94d95b1b609a1b8152600d0160405190819003812060028801548854919260ff600160381b90920482169291861691600080516020613c0f83398151915291612c059160481b90613a4b565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b90920416146129c9576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b90920482169291851691600080516020613c0f83398151915291612ca09160481b90613a4b565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b038316612cf85760405162461bcd60e51b8152600401610af690613963565b6001600160a01b038216612d1e5760405162461bcd60e51b8152600401610af6906139a8565b612d5b81604051806060016040528060268152602001613bc1602691396001600160a01b03861660009081526001602052604090205491906124c8565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612d8a9082611d7e565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611efc9085815260200190565b6018805464ffffffffff191690558115612e66576012546018805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b8015612ee1576012546018805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b80158015612eed575081155b15612f67576012546018805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b60185460ff600160201b820481169163010000008104821691620100008204811691612f9b91610100820481169116613a62565b612fa59190613a62565b612faf9190613a62565b612fb99190613a62565b6018805465ff0000000000198116600160281b60ff948516810291821793849055604080519386169286169290921783526101008404851660208401526201000084048516918301919091526301000000830484166060830152600160201b83048416608083015290910490911660a08201527f6c6977cb51242ec6e05aba0e2a29a5292ed1a8a5cffa3b87ff66395b7997d6d29060c001610bf1565b306000908152600160205260408120546018549091479160029060ff600160281b82048116916130879116866139eb565b6130919190613a20565b61309b9190613a20565b60185490915060009060ff600160281b82048116916130c391600160201b90910416866139eb565b6130cd9190613a20565b905060006130db828461394b565b6130e59086613a34565b90506130f0816133f3565b60006130fc8547613a34565b60185490915060009060ff600160201b8204811691630100000081048216916131289160029116613a87565b6131329190613a62565b61313c9190613a62565b6018546131539190600160281b900460ff16613aa9565b60185460ff918216925060009160029184916131709116866139eb565b61317a9190613a20565b6131849190613a20565b60185490915060009083906131a190610100900460ff16866139eb565b6131ab9190613a20565b905060006131b9828461394b565b6131c39086613a34565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156131fe573d6000803e3d6000fd5b50600d546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015613239573d6000803e3d6000fd5b50871561328c5761324a8884613545565b60408051878152602081018590529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101889052600090309063a9059cbb906044016020604051808303816000875af11580156132e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330491906138c2565b905080156133a457600754604051636bf5ecd560e01b8152600481018a90526001600160a01b0390911690636bf5ecd590602401600060405180830381600087803b15801561335257600080fd5b505af1158015613366573d6000803e3d6000fd5b505050507fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9698860405161339b91815260200190565b60405180910390a15b5050505050505050505050565b6000611ddd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124c8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061342857613428613acc565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a59190613ae2565b816001815181106134b8576134b8613acc565b6001600160a01b0392831660209182029290920101526006546134de9130911684611de4565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613517908590600090869030904290600401613aff565b600060405180830381600087803b15801561353157600080fd5b505af11580156129c9573d6000803e3d6000fd5b60065461355d9030906001600160a01b031684611de4565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156135cd573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061101f9190613b70565b600060208083528351808285015260005b8181101561361f57858101830151858201604001528201613603565b81811115613631576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461110657600080fd5b6000806040838503121561366f57600080fd5b823561367a81613647565b946020939093013593505050565b60006020828403121561369a57600080fd5b5035919050565b6000602082840312156136b357600080fd5b8135611ddd81613647565b6000806000606084860312156136d357600080fd5b83356136de81613647565b925060208401356136ee81613647565b929592945050506040919091013590565b60008060006060848603121561371457600080fd5b833561371f81613647565b9250602084013561372f81613647565b9150604084013561373f81613647565b809150509250925092565b801515811461110657600080fd5b6000806040838503121561376b57600080fd5b823561377681613647565b915060208301356137868161374a565b809150509250929050565b803560ff811681146137a257600080fd5b919050565b600080600080600060a086880312156137bf57600080fd5b6137c886613791565b94506137d660208701613791565b93506137e460408701613791565b92506137f260608701613791565b915061380060808701613791565b90509295509295909350565b6000806040838503121561381f57600080fd5b823561382a81613647565b9150602083013561378681613647565b600181811c9082168061384e57607f821691505b60208210810361386e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156138bb57600080fd5b5051919050565b6000602082840312156138d457600080fd5b8151611ddd8161374a565b60208082526036908201527f47726f7665546f6b656e3a204163636f756e7420697320616c7265616479207460408201527568652076616c7565206f6620276578636c756465642760501b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561395e5761395e613935565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000816000190483118215151615613a0557613a05613935565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613a2f57613a2f613a0a565b500490565b600082821015613a4657613a46613935565b500390565b68ffffffffffffffffff1991909116815260200190565b600060ff821660ff84168060ff03821115613a7f57613a7f613935565b019392505050565b600060ff831680613a9a57613a9a613a0a565b8060ff84160491505092915050565b600060ff821660ff841680821015613ac357613ac3613935565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613af457600080fd5b8151611ddd81613647565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b4f5784516001600160a01b031683529383019391830191600101613b2a565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613b8557600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208b373de0c37b558820d9dc2974a6061180cc95c73c44899d88ca95baecbc5ca564736f6c634300080f003360806040523480156200001157600080fd5b50604080518082018252601b8082527f47726f7665546f6b656e5f4469766964656e645f547261636b657200000000006020808401829052845180860190955291845290830152908181600362000069838262000197565b50600462000078828262000197565b50505060006200008d620000ee60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e1060125550600060135562000263565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011d57607f821691505b6020821081036200013e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019257600081815260208120601f850160051c810160208610156200016d5750805b601f850160051c820191505b818110156200018e5782815560010162000179565b5050505b505050565b81516001600160401b03811115620001b357620001b3620000f2565b620001cb81620001c4845462000108565b8462000144565b602080601f831160018114620002035760008415620001ea5750858301515b600019600386901b1c1916600185901b1785556200018e565b600085815260208120601f198616915b82811015620002345788860151825594840194600190910190840162000213565b5085821015620002535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611bf480620002736000396000f3fe6080604052600436106101fd5760003560e01c8063715018a61161010d578063a9059cbb116100a0578063bea9849e1161006f578063bea9849e146105d6578063dd62ed3e146105f6578063e30443bc1461063c578063f2fde38b1461065c578063f7c618c11461067c57600080fd5b8063a9059cbb1461054a578063aafd847a1461056a578063bc4c4b37146105a0578063be10b614146105c057600080fd5b806391b89fba116100dc57806391b89fba146104d557806395d89b41146104f5578063a457c2d71461050a578063a8b9d2401461052a57600080fd5b8063715018a61461046c57806385a6b3ae146104815780638aee8127146104975780638da5cb5b146104b757600080fd5b806327ce0147116101905780634e7b827f1161015f5780634e7b827f146103bb5780636a474002146103eb5780636bf5ecd5146104005780636f2789ec1461042057806370a082311461043657600080fd5b806327ce01471461033f578063313ce5671461035f57806331e79db01461037b578063395093511461039b57600080fd5b80631694505e116101cc5780631694505e146102a557806318160ddd146102dd578063226cfa3d146102f257806323b872dd1461031f57600080fd5b806306fdde0314610209578063095ea7b31461023457806309bbedde14610264578063163c7cef1461028357600080fd5b3661020457005b600080fd5b34801561021557600080fd5b5061021e61069c565b60405161022b919061183b565b60405180910390f35b34801561024057600080fd5b5061025461024f3660046118a5565b61072e565b604051901515815260200161022b565b34801561027057600080fd5b50600c545b60405190815260200161022b565b34801561028f57600080fd5b506102a361029e3660046118d1565b610745565b005b3480156102b157600080fd5b506009546102c5906001600160a01b031681565b6040516001600160a01b03909116815260200161022b565b3480156102e957600080fd5b50600254610275565b3480156102fe57600080fd5b5061027561030d3660046118ea565b60116020526000908152604090205481565b34801561032b57600080fd5b5061025461033a366004611907565b61081a565b34801561034b57600080fd5b5061027561035a3660046118ea565b610883565b34801561036b57600080fd5b506040516012815260200161022b565b34801561038757600080fd5b506102a36103963660046118ea565b6108df565b3480156103a757600080fd5b506102546103b63660046118a5565b610a06565b3480156103c757600080fd5b506102546103d63660046118ea565b60106020526000908152604090205460ff1681565b3480156103f757600080fd5b506102a3610a3c565b34801561040c57600080fd5b506102a361041b3660046118d1565b610a72565b34801561042c57600080fd5b5061027560125481565b34801561044257600080fd5b506102756104513660046118ea565b6001600160a01b031660009081526020819052604090205490565b34801561047857600080fd5b506102a3610b2f565b34801561048d57600080fd5b5061027560075481565b3480156104a357600080fd5b506102a36104b23660046118ea565b610ba3565b3480156104c357600080fd5b506005546001600160a01b03166102c5565b3480156104e157600080fd5b506102756104f03660046118ea565b610bd6565b34801561050157600080fd5b5061021e610be1565b34801561051657600080fd5b506102546105253660046118a5565b610bf0565b34801561053657600080fd5b506102756105453660046118ea565b610c3f565b34801561055657600080fd5b506102546105653660046118a5565b610c6b565b34801561057657600080fd5b506102756105853660046118ea565b6001600160a01b03166000908152600b602052604090205490565b3480156105ac57600080fd5b506102546105bb366004611956565b610c78565b3480156105cc57600080fd5b5061027560135481565b3480156105e257600080fd5b506102a36105f13660046118ea565b610d26565b34801561060257600080fd5b5061027561061136600461198f565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561064857600080fd5b506102a36106573660046118a5565b610d59565b34801561066857600080fd5b506102a36106773660046118ea565b610ec3565b34801561068857600080fd5b506008546102c5906001600160a01b031681565b6060600380546106ab906119bd565b80601f01602080910402602001604051908101604052809291908181526020018280546106d7906119bd565b80156107245780601f106106f957610100808354040283529160200191610724565b820191906000526020600020905b81548152906001019060200180831161070757829003601f168201915b5050505050905090565b600061073b338484610fae565b5060015b92915050565b6005546001600160a01b031633146107785760405162461bcd60e51b815260040161076f906119f7565b60405180910390fd5b80601354036108155760405162461bcd60e51b815260206004820152605d60248201527f47726f7665546f6b656e5f4469766964656e645f547261636b65723a206d696e60448201527f696d756d546f6b656e42616c616e6365466f724469766964656e647320616c7260648201527f65616479207468652076616c7565206f6620276e657756616c7565272e000000608482015260a40161076f565b601355565b60006108278484846110d2565b610879843361087485604051806060016040528060288152602001611b72602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611134565b610fae565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926108d5926108d0926108ca916108c5919061116e565b6111f7565b90611207565b611245565b61073f9190611a42565b6005546001600160a01b031633146109095760405162461bcd60e51b815260040161076f906119f7565b6001600160a01b03811660009081526010602052604090205460ff161561092f57600080fd5b6001600160a01b0381166000908152601060205260408120805460ff1916600117905561095d908290611258565b60405163131836e760e21b8152600c60048201526001600160a01b038216602482015273e0e81c29a68bfdd7c48072fd94e7c58f1f0146c190634c60db9c9060440160006040518083038186803b1580156109b757600080fd5b505af41580156109cb573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b0387168452909152812054909161073b91859061087490866112bd565b6005546001600160a01b03163314610a665760405162461bcd60e51b815260040161076f906119f7565b610a6f3361131c565b50565b6005546001600160a01b03163314610a9c5760405162461bcd60e51b815260040161076f906119f7565b6000610aa760025490565b11610ab157600080fd5b8015610a6f57610ae4610ac360025490565b610ad183600160801b61116e565b610adb9190611a42565b600654906112bd565b60065560405181815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a2600754610b2990826112bd565b60075550565b6005546001600160a01b03163314610b595760405162461bcd60e51b815260040161076f906119f7565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610bcd5760405162461bcd60e51b815260040161076f906119f7565b610a6f81611481565b600061073f82610c3f565b6060600480546106ab906119bd565b600061073b338461087485604051806060016040528060258152602001611b9a602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611134565b6001600160a01b0381166000908152600b602052604081205461073f90610c6584610883565b906114cd565b600061073b3384846110d2565b6005546000906001600160a01b03163314610ca55760405162461bcd60e51b815260040161076f906119f7565b6000610cb08461131c565b90508015610d1c576001600160a01b038416600081815260116020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610d0a9085815260200190565b60405180910390a3600191505061073f565b5060009392505050565b6005546001600160a01b03163314610d505760405162461bcd60e51b815260040161076f906119f7565b610a6f8161150f565b6005546001600160a01b03163314610d835760405162461bcd60e51b815260040161076f906119f7565b6001600160a01b03821660009081526010602052604090205460ff16610ebf576013548110610e3457610db68282611258565b604051632f0ad01760e21b8152600c60048201526001600160a01b03831660248201526044810182905273e0e81c29a68bfdd7c48072fd94e7c58f1f0146c19063bc2b405c9060640160006040518083038186803b158015610e1757600080fd5b505af4158015610e2b573d6000803e3d6000fd5b50505050610eb2565b610e3f826000611258565b60405163131836e760e21b8152600c60048201526001600160a01b038316602482015273e0e81c29a68bfdd7c48072fd94e7c58f1f0146c190634c60db9c9060440160006040518083038186803b158015610e9957600080fd5b505af4158015610ead573d6000803e3d6000fd5b505050505b610ebd826001610c78565b505b5050565b6005546001600160a01b03163314610eed5760405162461bcd60e51b815260040161076f906119f7565b6001600160a01b038116610f525760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0383166110105760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161076f565b6001600160a01b0382166110715760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161076f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152603160248201527f47726f7665546f6b656e5f4469766964656e645f547261636b65723a204e6f206044820152701d1c985b9cd9995c9cc8185b1b1bddd959607a1b606482015260840161076f565b600081848411156111585760405162461bcd60e51b815260040161076f919061183b565b5060006111658486611a64565b95945050505050565b6000826000036111805750600061073f565b600061118c8385611a7b565b9050826111998583611a42565b146111f05760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b606482015260840161076f565b9392505050565b6000818181121561073f57600080fd5b6000806112148385611a9a565b9050600083121580156112275750838112155b8061123c575060008312801561123c57508381125b6111f057600080fd5b60008082121561125457600080fd5b5090565b6001600160a01b0382166000908152602081905260409020548082111561129757600061128583836114cd565b9050611291848261155b565b50610ebd565b80821015610ebd5760006112ab82846114cd565b90506112b784826115bf565b50505050565b6000806112ca8385611adb565b9050838110156111f05760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015260640161076f565b60008061132883610c3f565b90508015611478576001600160a01b0383166000908152600b602052604090205461135390826112bd565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d906113a29084815260200190565b60405180910390a260085460405163a9059cbb60e01b81526001600160a01b03858116600483015260248201849052600092169063a9059cbb906044016020604051808303816000875af11580156113fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114229190611af3565b905080611471576001600160a01b0384166000908152600b602052604090205461144c90836114cd565b6001600160a01b039094166000908152600b6020526040812094909455509192915050565b5092915050565b50600092915050565b6005546001600160a01b031633146114ab5760405162461bcd60e51b815260040161076f906119f7565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60006111f083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611134565b6005546001600160a01b031633146115395760405162461bcd60e51b815260040161076f906119f7565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b6115658282611603565b61159f6115806108c58360065461116e90919063ffffffff16565b6001600160a01b0384166000908152600a6020526040902054906116ee565b6001600160a01b039092166000908152600a602052604090209190915550565b6115c9828261172b565b61159f6115e46108c58360065461116e90919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611207565b6001600160a01b0382166116595760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640161076f565b61166560008383610ebd565b60025461167290826112bd565b6002556001600160a01b03821660009081526020819052604090205461169890826112bd565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806116fb8385611b10565b90506000831215801561170e5750838113155b8061123c575060008312801561123c57508381136111f057600080fd5b6001600160a01b03821661178b5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161076f565b61179782600083610ebd565b6117d481604051806060016040528060228152602001611b50602291396001600160a01b0385166000908152602081905260409020549190611134565b6001600160a01b0383166000908152602081905260409020556002546117fa90826114cd565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016116e2565b600060208083528351808285015260005b818110156118685785810183015185820160400152820161184c565b8181111561187a576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b0381168114610a6f57600080fd5b600080604083850312156118b857600080fd5b82356118c381611890565b946020939093013593505050565b6000602082840312156118e357600080fd5b5035919050565b6000602082840312156118fc57600080fd5b81356111f081611890565b60008060006060848603121561191c57600080fd5b833561192781611890565b9250602084013561193781611890565b929592945050506040919091013590565b8015158114610a6f57600080fd5b6000806040838503121561196957600080fd5b823561197481611890565b9150602083013561198481611948565b809150509250929050565b600080604083850312156119a257600080fd5b82356119ad81611890565b9150602083013561198481611890565b600181811c908216806119d157607f821691505b6020821081036119f157634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082611a5f57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611a7657611a76611a2c565b500390565b6000816000190483118215151615611a9557611a95611a2c565b500290565b600080821280156001600160ff1b0384900385131615611abc57611abc611a2c565b600160ff1b8390038412811615611ad557611ad5611a2c565b50500190565b60008219821115611aee57611aee611a2c565b500190565b600060208284031215611b0557600080fd5b81516111f081611948565b60008083128015600160ff1b850184121615611b2e57611b2e611a2c565b6001600160ff1b0384018313811615611b4957611b49611a2c565b5050039056fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220f1ee6719b3ddb19461ae48c503877461ca1f4759bcf79597589f8bb7243df5e164736f6c634300080f0033

Deployed Bytecode

0x6080604052600436106103035760003560e01c8063715018a611610190578063aee50b1e116100dc578063cd59658311610095578063d46980161161006f578063d469801614610958578063dd62ed3e14610978578063f2fde38b146109be578063fe017535146109de57600080fd5b8063cd59658314610904578063d2d7ad8314610922578063d32215761461093857600080fd5b8063aee50b1e146107e3578063b1ba39ea14610803578063b62496f514610823578063bea9849e14610853578063c024666814610873578063cd43e2281461089357600080fd5b80638da5cb5b11610149578063a457c2d711610123578063a457c2d71461076d578063a8b9d2401461078d578063a9059cbb146107ad578063aa4bde28146107cd57600080fd5b80638da5cb5b1461071a57806395d89b41146107385780639fad96831461074d57600080fd5b8063715018a61461066f57806375cb1bd11461068457806375f0a874146106a4578063781edb3c146106c4578063880bcbc1146106e45780638c0b5e221461070457600080fd5b806330bb4cff1161024f57806342966c68116102085780635ebf4db9116101e25780635ebf4db9146105e457806364b0f653146106045780636843cd841461061957806370a082311461063957600080fd5b806342966c681461057b57806349bd5a5e1461059b5780634e71d92d146105cf57600080fd5b806330bb4cff146104d5578063313ce567146104ea57806331e79db01461050657806334cf1fea14610526578063395093511461053b57806340c10f191461055b57600080fd5b80631694505e116102bc5780631e293c10116102965780631e293c101461045557806323b872dd1461047557806327a14fc2146104955780632c1f5216146104b557600080fd5b80631694505e146103de57806318160ddd146104165780631cd348c01461043557600080fd5b8063064a59d01461030f57806306fdde0314610345578063095ea7b314610367578063098df585146103875780630b26cf66146103a95780630bd05b69146103c957600080fd5b3661030a57005b600080fd5b34801561031b57600080fd5b5060075461033090600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b34801561035157600080fd5b5061035a610a24565b60405161033c91906135f2565b34801561037357600080fd5b5061033061038236600461365c565b610ab6565b34801561039357600080fd5b506103a76103a2366004613688565b610acc565b005b3480156103b557600080fd5b506103a76103c43660046136a1565b610bfe565b3480156103d557600080fd5b506103a7610ce0565b3480156103ea57600080fd5b506006546103fe906001600160a01b031681565b6040516001600160a01b03909116815260200161033c565b34801561042257600080fd5b506003545b60405190815260200161033c565b34801561044157600080fd5b50600e546103fe906001600160a01b031681565b34801561046157600080fd5b506103a7610470366004613688565b610d1f565b34801561048157600080fd5b506103306104903660046136be565b610de9565b3480156104a157600080fd5b506103a76104b0366004613688565b610e52565b3480156104c157600080fd5b506007546103fe906001600160a01b031681565b3480156104e157600080fd5b50610427610f26565b3480156104f657600080fd5b506040516012815260200161033c565b34801561051257600080fd5b506103a76105213660046136a1565b610f99565b34801561053257600080fd5b506103a7611026565b34801561054757600080fd5b5061033061055636600461365c565b61105f565b34801561056757600080fd5b5061033061057636600461365c565b611095565b34801561058757600080fd5b506103a7610596366004613688565b6110fc565b3480156105a757600080fd5b506103fe7f0000000000000000000000001f1b4836dde1859e2ede1c6155140318ef5931c281565b3480156105db57600080fd5b506103a7611109565b3480156105f057600080fd5b506103a76105ff366004613688565b61117e565b34801561061057600080fd5b506104276111d9565b34801561062557600080fd5b506104276106343660046136a1565b611223565b34801561064557600080fd5b506104276106543660046136a1565b6001600160a01b031660009081526001602052604090205490565b34801561067b57600080fd5b506103a7611299565b34801561069057600080fd5b506103a761069f3660046136ff565b61130d565b3480156106b057600080fd5b50600d546103fe906001600160a01b031681565b3480156106d057600080fd5b506103a76106df366004613758565b611620565b3480156106f057600080fd5b506103a76106ff366004613758565b6116ea565b34801561071057600080fd5b5061042760095481565b34801561072657600080fd5b506000546001600160a01b03166103fe565b34801561074457600080fd5b5061035a6117ac565b34801561075957600080fd5b506103a76107683660046137a7565b6117bb565b34801561077957600080fd5b5061033061078836600461365c565b611872565b34801561079957600080fd5b506104276107a83660046136a1565b6118c1565b3480156107b957600080fd5b506103306107c836600461365c565b6118f4565b3480156107d957600080fd5b5061042760085481565b3480156107ef57600080fd5b506103a76107fe366004613688565b611901565b34801561080f57600080fd5b506103a761081e3660046137a7565b6119d5565b34801561082f57600080fd5b5061033061083e3660046136a1565b60176020526000908152604090205460ff1681565b34801561085f57600080fd5b506103a761086e3660046136a1565b611a2c565b34801561087f57600080fd5b506103a761088e366004613758565b611b50565b34801561089f57600080fd5b5060125460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a00161033c565b34801561091057600080fd5b50600f546001600160a01b03166103fe565b34801561092e57600080fd5b50610427600b5481565b34801561094457600080fd5b506103a7610953366004613758565b611c12565b34801561096457600080fd5b50600c546103fe906001600160a01b031681565b34801561098457600080fd5b5061042761099336600461380c565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156109ca57600080fd5b506103a76109d93660046136a1565b611c94565b3480156109ea57600080fd5b5060125460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b909104166108d0565b606060048054610a339061383a565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5f9061383a565b8015610aac5780601f10610a8157610100808354040283529160200191610aac565b820191906000526020600020905b815481529060010190602001808311610a8f57829003601f168201915b5050505050905090565b6000610ac3338484611de4565b50600192915050565b6000546001600160a01b03163314610aff5760405162461bcd60e51b8152600401610af690613874565b60405180910390fd5b478110610b695760405162461bcd60e51b815260206004820152603260248201527f47726f7665546f6b656e3a2043616e6e6f742073656e64206d6f7265207468616044820152716e20636f6e74726163742062616c616e636560701b6064820152608401610af6565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610bb6576040519150601f19603f3d011682016040523d82523d6000602084013e610bbb565b606091505b505090508015610bfa576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca48906020015b60405180910390a15b5050565b6000546001600160a01b03163314610c285760405162461bcd60e51b8152600401610af690613874565b6001600160a01b03811615801590610c4e5750600f546001600160a01b03828116911614155b610c8c5760405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606401610af6565b600f80546001600160a01b0319166001600160a01b0383169081179091556040519081527f73244783076368b5f1590f6a673d39babc815dad202ae0fa41954830b1ef51249060200160405180910390a150565b6000546001600160a01b03163314610d0a5760405162461bcd60e51b8152600401610af690613874565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610d495760405162461bcd60e51b8152600401610af690613874565b6009548103610db65760405162461bcd60e51b815260206004820152603360248201527f47726f7665546f6b656e3a2043616e6e6f7420757064617465206d61785478416044820152726d6f756e7420746f2073616d652076616c756560681b6064820152608401610af6565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610df6848484611f09565b610e488433610e4385604051806060016040528060288152602001613be7602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906124c8565b611de4565b5060019392505050565b6000546001600160a01b03163314610e7c5760405162461bcd60e51b8152600401610af690613874565b6008548103610ef35760405162461bcd60e51b815260206004820152603760248201527f47726f7665546f6b656e3a2043616e6e6f7420757064617465206d617857616c60448201527f6c6574416d6f756e7420746f2073616d652076616c75650000000000000000006064820152608401610af6565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015610f70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9491906138a9565b905090565b6000546001600160a01b03163314610fc35760405162461bcd60e51b8152600401610af690613874565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b15801561100b57600080fd5b505af115801561101f573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146110505760405162461bcd60e51b8152600401610af690613874565b6007805460ff60a01b19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610ac3918590610e439086611d7e565b600f546000906001600160a01b031633146110f25760405162461bcd60e51b815260206004820152601d60248201527f6f6e6c792062726964676520636f6e74726163742063616e206d696e740000006044820152606401610af6565b610ac38383612502565b61110633826125e8565b50565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561115a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110691906138c2565b6000546001600160a01b031633146111a85760405162461bcd60e51b8152600401610af690613874565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef90602401610ff1565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015610f70573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561126f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061129391906138a9565b92915050565b6000546001600160a01b031633146112c35760405162461bcd60e51b8152600401610af690613874565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146113375760405162461bcd60e51b8152600401610af690613874565b600c546001600160a01b0384811691161461142f576001600160a01b0383166113b65760405162461bcd60e51b815260206004820152602b60248201527f47726f7665546f6b656e3a20546865206c697175696469747957616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610af6565b600c546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691851690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600c80546001600160a01b0319166001600160a01b0385161790555b600d546001600160a01b03838116911614611527576001600160a01b0382166114ae5760405162461bcd60e51b815260206004820152602b60248201527f47726f7665546f6b656e3a20546865206d61726b6574696e6757616c6c65742060448201526a063616e6e6f7420626520360ac1b6064820152608401610af6565b600d546040516e1b585c9ad95d1a5b99d5d85b1b195d608a1b81526001600160a01b0391821691841690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0319166001600160a01b0384161790555b600e546001600160a01b0382811691161461161b576001600160a01b0381166115a45760405162461bcd60e51b815260206004820152602960248201527f47726f7665546f6b656e3a20546865206275794261636b57616c6c657420636160448201526806e6e6f7420626520360bc1b6064820152608401610af6565b600e546040516c189d5e509858dad5d85b1b195d609a1b81526001600160a01b0391821691831690600d01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600e80546001600160a01b0319166001600160a01b0383161790555b505050565b6000546001600160a01b0316331461164a5760405162461bcd60e51b8152600401610af690613874565b6001600160a01b03821660009081526016602052604090205481151560ff90911615150361168a5760405162461bcd60e51b8152600401610af6906138df565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91015b60405180910390a25050565b6000546001600160a01b031633146117145760405162461bcd60e51b8152600401610af690613874565b6001600160a01b03821660009081526015602052604090205481151560ff9091161515036117545760405162461bcd60e51b8152600401610af6906138df565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a4091016116de565b606060058054610a339061383a565b6000546001600160a01b031633146117e55760405162461bcd60e51b8152600401610af690613874565b6117f4601086868686866126ec565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b6000610ac33384610e4385604051806060016040528060258152602001613c2f602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906124c8565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611252565b6000610ac3338484611f09565b6000546001600160a01b0316331461192b5760405162461bcd60e51b8152600401610af690613874565b600b5481036119a25760405162461bcd60e51b815260206004820152603f60248201527f47726f7665546f6b656e3a2043616e6e6f7420757064617465206d696e696d7560448201527f6d546f6b656e734265666f72655377617020746f2073616d652076616c7565006064820152608401610af6565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b031633146119ff5760405162461bcd60e51b8152600401610af690613874565b611a0e601086868686866129d1565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d0161180d565b6000546001600160a01b03163314611a565760405162461bcd60e51b8152600401610af690613874565b6006546001600160a01b0390811690821603611acc5760405162461bcd60e51b815260206004820152602f60248201527f47726f7665546f6b656e3a2054686520726f7574657220616c7265616479206860448201526e61732074686174206164647265737360881b6064820152608401610af6565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e90602401610ff1565b6000546001600160a01b03163314611b7a5760405162461bcd60e51b8152600401610af690613874565b6001600160a01b03821660009081526014602052604090205481151560ff909116151503611bba5760405162461bcd60e51b8152600401610af6906138df565b6001600160a01b038216600081815260146020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b91016116de565b6000546001600160a01b03163314611c3c5760405162461bcd60e51b8152600401610af690613874565b6001600160a01b038216600081815260136020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d35091016116de565b6000546001600160a01b03163314611cbe5760405162461bcd60e51b8152600401610af690613874565b6001600160a01b038116611d235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610af6565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b600080611d8b838561394b565b905083811015611ddd5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610af6565b9392505050565b6001600160a01b038316611e465760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610af6565b6001600160a01b038216611ea75760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610af6565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b038316611f2f5760405162461bcd60e51b8152600401610af690613963565b6001600160a01b038216611f555760405162461bcd60e51b8152600401610af6906139a8565b80600003611f695761161b83836000612cd2565b6001600160a01b03808416600081815260176020908152604080832054948716835280832054938352601390915290205460ff928316929182169116158015611fcb57506001600160a01b03841660009081526013602052604090205460ff16155b156121b157600754600160a01b900460ff1661203c5760405162461bcd60e51b815260206004820152602a60248201527f47726f7665546f6b656e3a2054726164696e672069732063757272656e746c79604482015269103234b9b0b13632b21760b11b6064820152608401610af6565b6001600160a01b03841660009081526015602052604090205460ff1615801561207e57506001600160a01b03851660009081526015602052604090205460ff16155b156120f0576009548311156120f05760405162461bcd60e51b815260206004820152603260248201527f47726f7665546f6b656e3a2042757920616d6f756e742065786365656473207460448201527134329036b0bc2a3c213abca0b6b7bab73a1760711b6064820152608401610af6565b6001600160a01b03841660009081526016602052604090205460ff166121b15760085483612133866001600160a01b031660009081526001602052604090205490565b61213d919061394b565b11156121b15760405162461bcd60e51b815260206004820152603f60248201527f47726f7665546f6b656e3a2045787065637465642077616c6c657420616d6f7560448201527f6e74206578636565647320746865206d617857616c6c6574416d6f756e742e006064820152608401610af6565b6121bb8282612dde565b600b543060009081526001602052604090205460075491111590600160a01b900460ff1680156121e85750805b80156121f75750600a5460ff16155b801561220e5750601854600160281b900460ff1615155b801561223257506001600160a01b03851660009081526017602052604090205460ff165b1561225757600a805460ff1916600117905561224c613056565b600a805460ff191690555b600a5460009060ff161580156122765750600754600160a01b900460ff165b6001600160a01b03881660009081526014602052604090205490915060ff16806122b857506001600160a01b03861660009081526014602052604090205460ff165b156122c1575060005b8080156122d95750601854600160281b900460ff1615155b156123a2576018546000906064906122fb90600160281b900460ff16886139eb565b6123059190613a20565b601854909150600090606490612325906301000000900460ff16896139eb565b61232f9190613a20565b905061233b8288613a34565b9650612348893084612cd2565b801561239f5761235830826125e8565b60185460408051630100000090920460ff168252602082018390527ffecf12fd01122af77b8b8f1a0f126363142d14fba298ea36d9fe4909f61bb5a1910160405180910390a15b50505b6123ad878787612cd2565b6007546001600160a01b031663e30443bc886123de816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561242457600080fd5b505af1925050508015612435575060015b506007546001600160a01b031663e30443bc87612467816001600160a01b031660009081526001602052604090205490565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156124ad57600080fd5b505af19250505080156124be575060015b5050505050505050565b600081848411156124ec5760405162461bcd60e51b8152600401610af691906135f2565b5060006124f98486613a34565b95945050505050565b6001600160a01b0382166125585760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610af6565b6003546125659082611d7e565b6003556001600160a01b03821660009081526001602052604090205461258b9082611d7e565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906125dc9085815260200190565b60405180910390a35050565b6001600160a01b0382166126485760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610af6565b61268581604051806060016040528060228152602001613b9f602291396001600160a01b03851660009081526001602052604090205491906124c8565b6001600160a01b0383166000908152600160205260409020556003546126ab90826133b1565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016125dc565b600286015460ff86811691161461276d57604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff9182169291891691600080516020613c0f833981519152916127539160481b90613a4b565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff85811662010000909204161461280157604051706d61726b6574696e674665654f6e42757960781b815260110160405190819003812060028801548854919260ff6201000090920482169291881691600080516020613c0f833981519152916127e09160481b90613a4b565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff848116600160201b9092041614612898576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160201b90920482169291871691600080516020613c0f833981519152916128749160481b90613a4b565b60405180910390a460028601805464ff000000001916600160201b60ff8616021790555b600286015460ff838116600160301b909204161461292e576040516b6275726e4665654f6e42757960a01b8152600c0160405190819003812060028801548854919260ff600160301b90920482169291861691600080516020613c0f833981519152916129089160481b90613a4b565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b90920416146129c9576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b90920482169291851691600080516020613c0f833981519152916129a19160481b90613a4b565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600286015460ff8681166101009092041614612a6257604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff61010090920482169291891691600080516020613c0f83398151915291612a439160481b90613a4b565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff85811663010000009092041614612afb57604051711b585c9ad95d1a5b99d1995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff630100000090920482169291881691600080516020613c0f83398151915291612ad89160481b90613a4b565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614612b94576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b90920482169291871691600080516020613c0f83398151915291612b6f9160481b90613a4b565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b9092041614612c2c576040516c189d5c9b91995953db94d95b1b609a1b8152600d0160405190819003812060028801548854919260ff600160381b90920482169291861691600080516020613c0f83398151915291612c059160481b90613a4b565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b90920416146129c9576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b90920482169291851691600080516020613c0f83398151915291612ca09160481b90613a4b565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b038316612cf85760405162461bcd60e51b8152600401610af690613963565b6001600160a01b038216612d1e5760405162461bcd60e51b8152600401610af6906139a8565b612d5b81604051806060016040528060268152602001613bc1602691396001600160a01b03861660009081526001602052604090205491906124c8565b6001600160a01b038085166000908152600160205260408082209390935590841681522054612d8a9082611d7e565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611efc9085815260200190565b6018805464ffffffffff191690558115612e66576012546018805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b8015612ee1576012546018805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b80158015612eed575081155b15612f67576012546018805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b60185460ff600160201b820481169163010000008104821691620100008204811691612f9b91610100820481169116613a62565b612fa59190613a62565b612faf9190613a62565b612fb99190613a62565b6018805465ff0000000000198116600160281b60ff948516810291821793849055604080519386169286169290921783526101008404851660208401526201000084048516918301919091526301000000830484166060830152600160201b83048416608083015290910490911660a08201527f6c6977cb51242ec6e05aba0e2a29a5292ed1a8a5cffa3b87ff66395b7997d6d29060c001610bf1565b306000908152600160205260408120546018549091479160029060ff600160281b82048116916130879116866139eb565b6130919190613a20565b61309b9190613a20565b60185490915060009060ff600160281b82048116916130c391600160201b90910416866139eb565b6130cd9190613a20565b905060006130db828461394b565b6130e59086613a34565b90506130f0816133f3565b60006130fc8547613a34565b60185490915060009060ff600160201b8204811691630100000081048216916131289160029116613a87565b6131329190613a62565b61313c9190613a62565b6018546131539190600160281b900460ff16613aa9565b60185460ff918216925060009160029184916131709116866139eb565b61317a9190613a20565b6131849190613a20565b60185490915060009083906131a190610100900460ff16866139eb565b6131ab9190613a20565b905060006131b9828461394b565b6131c39086613a34565b600e546040519192506001600160a01b03169082156108fc029083906000818181858888f193505050501580156131fe573d6000803e3d6000fd5b50600d546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015613239573d6000803e3d6000fd5b50871561328c5761324a8884613545565b60408051878152602081018590529081018990527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60075460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101889052600090309063a9059cbb906044016020604051808303816000875af11580156132e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061330491906138c2565b905080156133a457600754604051636bf5ecd560e01b8152600481018a90526001600160a01b0390911690636bf5ecd590602401600060405180830381600087803b15801561335257600080fd5b505af1158015613366573d6000803e3d6000fd5b505050507fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9698860405161339b91815260200190565b60405180910390a15b5050505050505050505050565b6000611ddd83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506124c8565b604080516002808252606082018352600092602083019080368337019050509050308160008151811061342857613428613acc565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613481573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134a59190613ae2565b816001815181106134b8576134b8613acc565b6001600160a01b0392831660209182029290920101526006546134de9130911684611de4565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac94790613517908590600090869030904290600401613aff565b600060405180830381600087803b15801561353157600080fd5b505af11580156129c9573d6000803e3d6000fd5b60065461355d9030906001600160a01b031684611de4565b600654600c5460405163f305d71960e01b81523060048201526024810185905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af11580156135cd573d6000803e3d6000fd5b50505050506040513d601f19601f8201168201806040525081019061101f9190613b70565b600060208083528351808285015260005b8181101561361f57858101830151858201604001528201613603565b81811115613631576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461110657600080fd5b6000806040838503121561366f57600080fd5b823561367a81613647565b946020939093013593505050565b60006020828403121561369a57600080fd5b5035919050565b6000602082840312156136b357600080fd5b8135611ddd81613647565b6000806000606084860312156136d357600080fd5b83356136de81613647565b925060208401356136ee81613647565b929592945050506040919091013590565b60008060006060848603121561371457600080fd5b833561371f81613647565b9250602084013561372f81613647565b9150604084013561373f81613647565b809150509250925092565b801515811461110657600080fd5b6000806040838503121561376b57600080fd5b823561377681613647565b915060208301356137868161374a565b809150509250929050565b803560ff811681146137a257600080fd5b919050565b600080600080600060a086880312156137bf57600080fd5b6137c886613791565b94506137d660208701613791565b93506137e460408701613791565b92506137f260608701613791565b915061380060808701613791565b90509295509295909350565b6000806040838503121561381f57600080fd5b823561382a81613647565b9150602083013561378681613647565b600181811c9082168061384e57607f821691505b60208210810361386e57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000602082840312156138bb57600080fd5b5051919050565b6000602082840312156138d457600080fd5b8151611ddd8161374a565b60208082526036908201527f47726f7665546f6b656e3a204163636f756e7420697320616c7265616479207460408201527568652076616c7565206f6620276578636c756465642760501b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561395e5761395e613935565b500190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b6000816000190483118215151615613a0557613a05613935565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613a2f57613a2f613a0a565b500490565b600082821015613a4657613a46613935565b500390565b68ffffffffffffffffff1991909116815260200190565b600060ff821660ff84168060ff03821115613a7f57613a7f613935565b019392505050565b600060ff831680613a9a57613a9a613a0a565b8060ff84160491505092915050565b600060ff821660ff841680821015613ac357613ac3613935565b90039392505050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613af457600080fd5b8151611ddd81613647565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613b4f5784516001600160a01b031683529383019391830191600101613b2a565b50506001600160a01b03969096166060850152505050608001529392505050565b600080600060608486031215613b8557600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212208b373de0c37b558820d9dc2974a6061180cc95c73c44899d88ca95baecbc5ca564736f6c634300080f0033

Libraries Used


Deployed Bytecode Sourcemap

15786:20056:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16098:28;;;;;;;;;;-1:-1:-1;16098:28:0;;;;-1:-1:-1;;;16098:28:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;16098:28:0;;;;;;;;8440:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9264:154::-;;;;;;;;;;-1:-1:-1;9264:154:0;;;;;:::i;:::-;;:::i;26008:315::-;;;;;;;;;;-1:-1:-1;26008:315:0;;;;;:::i;:::-;;:::i;:::-;;26641:260;;;;;;;;;;-1:-1:-1;26641:260:0;;;;;:::i;:::-;;:::i;20979:79::-;;;;;;;;;;;;;:::i;15830:30::-;;;;;;;;;;-1:-1:-1;15830:30:0;;;;-1:-1:-1;;;;;15830:30:0;;;;;;-1:-1:-1;;;;;1880:32:1;;;1862:51;;1850:2;1835:18;15830:30:0;1701:218:1;8725:99:0;;;;;;;;;;-1:-1:-1;8807:12:0;;8725:99;;;2070:25:1;;;2058:2;2043:18;8725:99:0;1924:177:1;16486:28:0;;;;;;;;;;-1:-1:-1;16486:28:0;;;;-1:-1:-1;;;;;16486:28:0;;;24932:253;;;;;;;;;;-1:-1:-1;24932:253:0;;;;;:::i;:::-;;:::i;9423:313::-;;;;;;;;;;-1:-1:-1;9423:313:0;;;;;:::i;:::-;;:::i;25188:259::-;;;;;;;;;;-1:-1:-1;25188:259:0;;;;;:::i;:::-;;:::i;16044:48::-;;;;;;;;;;-1:-1:-1;16044:48:0;;;;-1:-1:-1;;;;;16044:48:0;;;26919:132;;;;;;;;;;;;;:::i;8636:84::-;;;;;;;;;;-1:-1:-1;8636:84:0;;8713:2;3167:36:1;;3155:2;3140:18;8636:84:0;3025:184:1;22010:121:0;;;;;;;;;;-1:-1:-1;22010:121:0;;;;;:::i;:::-;;:::i;21061:82::-;;;;;;;;;;;;;:::i;9741:203::-;;;;;;;;;;-1:-1:-1;9741:203:0;;;;;:::i;:::-;;:::i;26326:134::-;;;;;;;;;;-1:-1:-1;26326:134:0;;;;;:::i;:::-;;:::i;26463:72::-;;;;;;;;;;-1:-1:-1;26463:72:0;;;;;:::i;:::-;;:::i;15864:38::-;;;;;;;;;;;;;;;25908:97;;;;;;;;;;;;;:::i;25761:144::-;;;;;;;;;;-1:-1:-1;25761:144:0;;;;;:::i;:::-;;:::i;27336:132::-;;;;;;;;;;;;;:::i;27201:::-;;;;;;;;;;-1:-1:-1;27201:132:0;;;;;:::i;:::-;;:::i;8829:118::-;;;;;;;;;;-1:-1:-1;8829:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;8924:18:0;8903:7;8924:18;;;:9;:18;;;;;;;8829:118;7674:133;;;;;;;;;;;;;:::i;22801:909::-;;;;;;;;;;-1:-1:-1;22801:909:0;;;;;:::i;:::-;;:::i;16452:30::-;;;;;;;;;;-1:-1:-1;16452:30:0;;;;-1:-1:-1;;;;;16452:30:0;;;22476:322;;;;;;;;;;-1:-1:-1;22476:322:0;;;;;:::i;:::-;;:::i;22134:339::-;;;;;;;;;;-1:-1:-1;22134:339:0;;;;;:::i;:::-;;:::i;16273:46::-;;;;;;;;;;;;;;;;7490:70;;;;;;;;;;-1:-1:-1;7528:7:0;7549:6;-1:-1:-1;;;;;7549:6:0;7490:70;;8536:95;;;;;;;;;;;;;:::i;23728:422::-;;;;;;;;;;-1:-1:-1;23728:422:0;;;;;:::i;:::-;;:::i;9949:254::-;;;;;;;;;;-1:-1:-1;9949:254:0;;;;;:::i;:::-;;:::i;27054:144::-;;;;;;;;;;-1:-1:-1;27054:144:0;;;;;:::i;:::-;;:::i;8952:160::-;;;;;;;;;;-1:-1:-1;8952:160:0;;;;;:::i;:::-;;:::i;16217:50::-;;;;;;;;;;;;;;;;25450:308;;;;;;;;;;-1:-1:-1;25450:308:0;;;;;:::i;:::-;;:::i;24153:440::-;;;;;;;;;;-1:-1:-1;24153:440:0;;;;;:::i;:::-;;:::i;17288:58::-;;;;;;;;;;-1:-1:-1;17288:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;24596:333;;;;;;;;;;-1:-1:-1;24596:333:0;;;;;:::i;:::-;;:::i;21722:285::-;;;;;;;;;;-1:-1:-1;21722:285:0;;;;;:::i;:::-;;:::i;27471:216::-;;;;;;;;;;-1:-1:-1;27567:23:0;;;;;;;27592;;;;;;-1:-1:-1;;;27617:21:0;;;;;-1:-1:-1;;;27640:18:0;;;;;-1:-1:-1;;;27660:21:0;;;;27471:216;;;;5157:4:1;5145:17;;;5127:36;;5199:17;;;5194:2;5179:18;;5172:45;5253:17;;;5233:18;;;5226:45;;;;5307:17;;5302:2;5287:18;;5280:45;5362:17;;;5356:3;5341:19;;5334:46;5114:3;5099:19;27471:216:0;4888:498:1;26543:90:0;;;;;;;;;;-1:-1:-1;26619:6:0;;-1:-1:-1;;;;;26619:6:0;26543:90;;16351:61;;;;;;;;;;;;;;;;21517:202;;;;;;;;;;-1:-1:-1;21517:202:0;;;;;:::i;:::-;;:::i;16418:30::-;;;;;;;;;;-1:-1:-1;16418:30:0;;;;-1:-1:-1;;;;;16418:30:0;;;9117:142;;;;;;;;;;-1:-1:-1;9117:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;9227:18:0;;;9206:7;9227:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;9117:142;7812:223;;;;;;;;;;-1:-1:-1;7812:223:0;;;;;:::i;:::-;;:::i;27690:222::-;;;;;;;;;;-1:-1:-1;27787:24:0;;;;;;;;;27813;;;;;;-1:-1:-1;;;27839:22:0;;;;;-1:-1:-1;;;27863:19:0;;;;;-1:-1:-1;;;27884:22:0;;;;27690:222;;8440:91;8494:13;8521:5;8514:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8440:91;:::o;9264:154::-;9347:4;9358:39;6956:10;9381:7;9390:6;9358:8;:39::i;:::-;-1:-1:-1;9409:4:0;9264:154;;;;:::o;26008:315::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;;;;;;;;;26094:21:::1;26085:6;:30;26077:93;;;::::0;-1:-1:-1;;;26077:93:0;;6732:2:1;26077:93:0::1;::::0;::::1;6714:21:1::0;6771:2;6751:18;;;6744:30;6810:34;6790:18;;;6783:62;-1:-1:-1;;;6861:18:1;;;6854:48;6919:19;;26077:93:0::1;6530:414:1::0;26077:93:0::1;26182:12;7549:6:::0;;26199:41:::1;::::0;-1:-1:-1;;;;;7549:6:0;;;;26229;;26182:12;26199:41;26182:12;26199:41;26229:6;7549;26199:41:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26181:59;;;26255:7;26251:68;;;26283:24;::::0;2070:25:1;;;26283:24:0::1;::::0;2058:2:1;2043:18;26283:24:0::1;;;;;;;;26251:68;26069:254;26008:315:::0;:::o;26641:260::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26731:31:0;::::1;::::0;;::::1;::::0;:60:::1;;-1:-1:-1::0;26785:6:0::1;::::0;-1:-1:-1;;;;;26766:25:0;;::::1;26785:6:::0;::::1;26766:25;;26731:60;26723:88;;;::::0;-1:-1:-1;;;26723:88:0;;7361:2:1;26723:88:0::1;::::0;::::1;7343:21:1::0;7400:2;7380:18;;;7373:30;-1:-1:-1;;;7419:18:1;;;7412:45;7474:18;;26723:88:0::1;7159:339:1::0;26723:88:0::1;26822:6;:24:::0;;-1:-1:-1;;;;;;26822:24:0::1;-1:-1:-1::0;;;;;26822:24:0;::::1;::::0;;::::1;::::0;;;26856:37:::1;::::0;1862:51:1;;;26856:37:0::1;::::0;1850:2:1;1835:18;26856:37:0::1;;;;;;;26641:260:::0;:::o;20979:79::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;21030:16:::1;:23:::0;;-1:-1:-1;;;;21030:23:0::1;-1:-1:-1::0;;;21030:23:0::1;::::0;;20979:79::o;24932:253::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;25027:11:::1;;25015:8;:23:::0;25007:87:::1;;;::::0;-1:-1:-1;;;25007:87:0;;7705:2:1;25007:87:0::1;::::0;::::1;7687:21:1::0;7744:2;7724:18;;;7717:30;7783:34;7763:18;;;7756:62;-1:-1:-1;;;7834:18:1;;;7827:49;7893:19;;25007:87:0::1;7503:415:1::0;25007:87:0::1;25141:11;::::0;25104:49:::1;::::0;25131:8;;25104:49:::1;::::0;;;::::1;25158:11;:22:::0;24932:253::o;9423:313::-;9542:4;9553:36;9563:6;9571:9;9582:6;9553:9;:36::i;:::-;9594:121;9603:6;6956:10;9625:89;9663:6;9625:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9625:19:0;;;;;;:11;:19;;;;;;;;6956:10;9625:33;;;;;;;;;;:37;:89::i;:::-;9594:8;:121::i;:::-;-1:-1:-1;9727:4:0;9423:313;;;;;:::o;25188:259::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;25278:15:::1;;25266:8;:27:::0;25258:95:::1;;;::::0;-1:-1:-1;;;25258:95:0;;8125:2:1;25258:95:0::1;::::0;::::1;8107:21:1::0;8164:2;8144:18;;;8137:30;8203:34;8183:18;;;8176:62;8274:25;8254:18;;;8247:53;8317:19;;25258:95:0::1;7923:419:1::0;25258:95:0::1;25395:15;::::0;25363:48:::1;::::0;25385:8;;25363:48:::1;::::0;;;::::1;25416:15;:26:::0;25188:259::o;26919:132::-;27003:15;;:43;;;-1:-1:-1;;;27003:43:0;;;;26982:7;;-1:-1:-1;;;;;27003:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26996:50;;26919:132;:::o;22010:121::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;22081:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;22081:45:0;;-1:-1:-1;;;;;1880:32:1;;;22081:45:0::1;::::0;::::1;1862:51:1::0;22081:15:0;;::::1;::::0;:36:::1;::::0;1835:18:1;;22081:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;22010:121:::0;:::o;21061:82::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;21114:16:::1;:24:::0;;-1:-1:-1;;;;21114:24:0::1;::::0;;21061:82::o;9741:203::-;6956:10;9829:4;9872:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;9872:34:0;;;;;;;;;;9829:4;;9840:83;;9863:7;;9872:50;;9911:10;9872:38;:50::i;26326:134::-;19217:6;;26407:4;;-1:-1:-1;;;;;19217:6:0;19203:10;:20;19195:62;;;;-1:-1:-1;;;19195:62:0;;8738:2:1;19195:62:0;;;8720:21:1;8777:2;8757:18;;;8750:30;8816:31;8796:18;;;8789:59;8865:18;;19195:62:0;8536:353:1;19195:62:0;26418:21:::1;26424:7;26433:5;26418;:21::i;26463:72::-:0;26506:24;26512:10;26524:5;26506;:24::i;:::-;26463:72;:::o;25908:97::-;25939:15;;:58;;-1:-1:-1;;;25939:58:0;;25978:10;25939:58;;;9078:51:1;25939:15:0;9145:18:1;;;9138:50;-1:-1:-1;;;;;25939:15:0;;;;:30;;9051:18:1;;25939:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;25761:144::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;25847:15:::1;::::0;:53:::1;::::0;-1:-1:-1;;;25847:53:0;;::::1;::::0;::::1;2070:25:1::0;;;-1:-1:-1;;;;;25847:15:0;;::::1;::::0;:43:::1;::::0;2043:18:1;;25847:53:0::1;1924:177:1::0;27336:132:0;27422:15;;:41;;;-1:-1:-1;;;27422:41:0;;;;27401:7;;-1:-1:-1;;;;;27422:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;27201:132;27294:15;;:34;;-1:-1:-1;;;27294:34:0;;-1:-1:-1;;;;;1880:32:1;;;27294:34:0;;;1862:51:1;27273:7:0;;27294:15;;:25;;1835:18:1;;27294:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;27287:41;27201:132;-1:-1:-1;;27201:132:0:o;7674:133::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;7775:1:::1;7759:6:::0;;7738:40:::1;::::0;-1:-1:-1;;;;;7759:6:0;;::::1;::::0;7738:40:::1;::::0;7775:1;;7738:40:::1;7800:1;7783:19:::0;;-1:-1:-1;;;;;;7783:19:0::1;::::0;;7674:133::o;22801:909::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;22930:15:::1;::::0;-1:-1:-1;;;;;22930:37:0;;::::1;:15:::0;::::1;:37;22927:263;;-1:-1:-1::0;;;;;22983:32:0;::::1;22975:88;;;::::0;-1:-1:-1;;;22975:88:0;;9651:2:1;22975:88:0::1;::::0;::::1;9633:21:1::0;9690:2;9670:18;;;9663:30;9729:34;9709:18;;;9702:62;-1:-1:-1;;;9780:18:1;;;9773:41;9831:19;;22975:88:0::1;9449:407:1::0;22975:88:0::1;23126:15;::::0;23074:68:::1;::::0;-1:-1:-1;;;10063:30:1;;-1:-1:-1;;;;;23126:15:0;;::::1;::::0;23074:68;::::1;::::0;10118:2:1;10109:12;23074:68:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;23148:15;:36:::0;;-1:-1:-1;;;;;;23148:36:0::1;-1:-1:-1::0;;;;;23148:36:0;::::1;;::::0;;22927:263:::1;23197:15;::::0;-1:-1:-1;;;;;23197:37:0;;::::1;:15:::0;::::1;:37;23194:263;;-1:-1:-1::0;;;;;23250:32:0;::::1;23242:88;;;::::0;-1:-1:-1;;;23242:88:0;;10334:2:1;23242:88:0::1;::::0;::::1;10316:21:1::0;10373:2;10353:18;;;10346:30;10412:34;10392:18;;;10385:62;-1:-1:-1;;;10463:18:1;;;10456:41;10514:19;;23242:88:0::1;10132:407:1::0;23242:88:0::1;23393:15;::::0;23341:68:::1;::::0;-1:-1:-1;;;10746:30:1;;-1:-1:-1;;;;;23393:15:0;;::::1;::::0;23341:68;::::1;::::0;10801:2:1;10792:12;23341:68:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;23415:15;:36:::0;;-1:-1:-1;;;;;;23415:36:0::1;-1:-1:-1::0;;;;;23415:36:0;::::1;;::::0;;23194:263:::1;23464:13;::::0;-1:-1:-1;;;;;23464:33:0;;::::1;:13:::0;::::1;:33;23461:245;;-1:-1:-1::0;;;;;23513:30:0;::::1;23505:84;;;::::0;-1:-1:-1;;;23505:84:0;;11017:2:1;23505:84:0::1;::::0;::::1;10999:21:1::0;11056:2;11036:18;;;11029:30;11095:34;11075:18;;;11068:62;-1:-1:-1;;;11146:18:1;;;11139:39;11195:19;;23505:84:0::1;10815:405:1::0;23505:84:0::1;23648:13;::::0;23600:62:::1;::::0;-1:-1:-1;;;11427:28:1;;-1:-1:-1;;;;;23648:13:0;;::::1;::::0;23600:62;::::1;::::0;11480:2:1;11471:12;23600:62:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;23668:13;:32:::0;;-1:-1:-1;;;;;;23668:32:0::1;-1:-1:-1::0;;;;;23668:32:0;::::1;;::::0;;23461:245:::1;22801:909:::0;;;:::o;22476:322::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22575:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;22567:117:::1;;;;-1:-1:-1::0;;;22567:117:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22689:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;22689:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22748:45;;154:41:1;;;22748:45:0::1;::::0;127:18:1;22748:45:0::1;;;;;;;;22476:322:::0;;:::o;22134:339::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;22238:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;22230:122:::1;;;;-1:-1:-1::0;;;22230:122:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;22357:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;22357:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;22421:47;;154:41:1;;;22421:47:0::1;::::0;127:18:1;22421:47:0::1;14:187:1::0;8536:95:0;8592:13;8619:7;8612:14;;;;;:::i;23728:422::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;23899:120:::1;23922:5;23929:18;23949;23969:16;23987:13;24002:16;23899:22;:120::i;:::-;24029:116;::::0;-1:-1:-1;;;12119:27:1;;12171:2;12162:12;24029:116:0::1;;::::0;;;;;::::1;::::0;;5157:4:1;5145:17;;;5127:36;;5199:17;;;5194:2;5179:18;;5172:45;5253:17;;;5233:18;;;5226:45;5307:17;;;5302:2;5287:18;;5280:45;5362:17;;5356:3;5341:19;;5334:46;24029:116:0;;;;::::1;::::0;;;;;5114:3:1;24029:116:0;;::::1;23728:422:::0;;;;;:::o;9949:254::-;10042:4;10053:129;6956:10;10076:7;10085:96;10124:15;10085:96;;;;;;;;;;;;;;;;;6956:10;10085:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;10085:34:0;;;;;;;;;;;;:38;:96::i;27054:144::-;27146:15;;:47;;-1:-1:-1;;;27146:47:0;;-1:-1:-1;;;;;1880:32:1;;;27146:47:0;;;1862:51:1;27125:7:0;;27146:15;;:38;;1835:18:1;;27146:47:0;1701:218:1;8952:160:0;9038:4;9049:42;6956:10;9073:9;9084:6;9049:9;:42::i;25450:308::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;25548:23:::1;;25536:8;:35:::0;25528:111:::1;;;::::0;-1:-1:-1;;;25528:111:0;;12387:2:1;25528:111:0::1;::::0;::::1;12369:21:1::0;12426:2;12406:18;;;12399:30;12465:34;12445:18;;;12438:62;12536:33;12516:18;;;12509:61;12587:19;;25528:111:0::1;12185:427:1::0;25528:111:0::1;25690:23;::::0;25649:65:::1;::::0;25680:8;;25649:65:::1;::::0;;;::::1;25719:23;:34:::0;25450:308::o;24153:440::-;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;24330:126:::1;24354:5;24361:19;24382;24403:17;24422:14;24438:17;24330:23;:126::i;:::-;24466:122;::::0;-1:-1:-1;;;12819:28:1;;12872:2;12863:12;24466:122:0::1;12617:264:1::0;24596:333:0;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;24696:15:::1;::::0;-1:-1:-1;;;;;24696:15:0;;::::1;24674:38:::0;;::::1;::::0;24666:98:::1;;;::::0;-1:-1:-1;;;24666:98:0;;13088:2:1;24666:98:0::1;::::0;::::1;13070:21:1::0;13127:2;13107:18;;;13100:30;13166:34;13146:18;;;13139:62;-1:-1:-1;;;13217:18:1;;;13210:45;13272:19;;24666:98:0::1;12886:411:1::0;24666:98:0::1;24816:15;::::0;24774:59:::1;::::0;-1:-1:-1;;;;;24816:15:0;;::::1;::::0;24774:59;::::1;::::0;::::1;::::0;24816:15:::1;::::0;24774:59:::1;24838:15;:37:::0;;-1:-1:-1;;;;;;24838:37:0::1;-1:-1:-1::0;;;;;24838:37:0;;::::1;::::0;;::::1;::::0;;;24880:15:::1;::::0;:44:::1;::::0;-1:-1:-1;;;24880:44:0;;::::1;::::0;::::1;1862:51:1::0;;;;24880:15:0;;::::1;::::0;:32:::1;::::0;1835:18:1;;24880:44:0::1;1701:218:1::0;21722:285:0;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21811:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;21803:106:::1;;;;-1:-1:-1::0;;;21803:106:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;21914:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;21914:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21962:40;;154:41:1;;;21962:40:0::1;::::0;127:18:1;21962:40:0::1;14:187:1::0;21517:202:0;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21606:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;21606:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;21664:50;;154:41:1;;;21664:50:0::1;::::0;127:18:1;21664:50:0::1;14:187:1::0;7812:223:0;7599:6;;-1:-1:-1;;;;;7599:6:0;6956:10;7599:22;7591:67;;;;-1:-1:-1;;;7591:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;7895:22:0;::::1;7887:73;;;::::0;-1:-1:-1;;;7887:73:0;;13504:2:1;7887:73:0::1;::::0;::::1;13486:21:1::0;13543:2;13523:18;;;13516:30;13582:34;13562:18;;;13555:62;-1:-1:-1;;;13633:18:1;;;13626:36;13679:19;;7887:73:0::1;13302:402:1::0;7887:73:0::1;7991:6;::::0;;7970:38:::1;::::0;-1:-1:-1;;;;;7970:38:0;;::::1;::::0;7991:6;::::1;::::0;7970:38:::1;::::0;::::1;8013:6;:17:::0;;-1:-1:-1;;;;;;8013:17:0::1;-1:-1:-1::0;;;;;8013:17:0;;;::::1;::::0;;;::::1;::::0;;7812:223::o;2598:160::-;2656:7;;2682:5;2686:1;2682;:5;:::i;:::-;2670:17;;2705:1;2700;:6;;2692:46;;;;-1:-1:-1;;;2692:46:0;;14176:2:1;2692:46:0;;;14158:21:1;14215:2;14195:18;;;14188:30;14254:29;14234:18;;;14227:57;14301:18;;2692:46:0;13974:351:1;2692:46:0;2752:1;2598:160;-1:-1:-1;;;2598:160:0:o;11454:330::-;-1:-1:-1;;;;;11563:19:0;;11555:68;;;;-1:-1:-1;;;11555:68:0;;14532:2:1;11555:68:0;;;14514:21:1;14571:2;14551:18;;;14544:30;14610:34;14590:18;;;14583:62;-1:-1:-1;;;14661:18:1;;;14654:34;14705:19;;11555:68:0;14330:400:1;11555:68:0;-1:-1:-1;;;;;11636:21:0;;11628:68;;;;-1:-1:-1;;;11628:68:0;;14937:2:1;11628:68:0;;;14919:21:1;14976:2;14956:18;;;14949:30;15015:34;14995:18;;;14988:62;-1:-1:-1;;;15066:18:1;;;15059:32;15108:19;;11628:68:0;14735:398:1;11628:68:0;-1:-1:-1;;;;;11701:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;11747:32;;2070:25:1;;;11747:32:0;;2043:18:1;11747:32:0;;;;;;;;11454:330;;;:::o;27927:2056::-;-1:-1:-1;;;;;28034:18:0;;28026:68;;;;-1:-1:-1;;;28026:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28108:16:0;;28100:64;;;;-1:-1:-1;;;28100:64:0;;;;;;;:::i;:::-;28175:6;28185:1;28175:11;28172:71;;28195:28;28211:4;28217:2;28221:1;28195:15;:28::i;28172:71::-;-1:-1:-1;;;;;28269:31:0;;;28250:16;28269:31;;;:25;:31;;;;;;;;;28324:29;;;;;;;;;28365:35;;;:29;:35;;;;;;28269:31;;;;;28324:29;;;;28365:35;28364:36;:74;;;;-1:-1:-1;;;;;;28405:33:0;;;;;;:29;:33;;;;;;;;28404:34;28364:74;28361:541;;;28455:16;;-1:-1:-1;;;28455:16:0;;;;28447:71;;;;-1:-1:-1;;;28447:71:0;;16150:2:1;28447:71:0;;;16132:21:1;16189:2;16169:18;;;16162:30;16228:34;16208:18;;;16201:62;-1:-1:-1;;;16279:18:1;;;16272:40;16329:19;;28447:71:0;15948:406:1;28447:71:0;-1:-1:-1;;;;;28530:38:0;;;;;;:34;:38;;;;;;;;28529:39;:84;;;;-1:-1:-1;;;;;;28573:40:0;;;;;;:34;:40;;;;;;;;28572:41;28529:84;28525:190;;;28641:11;;28631:6;:21;;28623:84;;;;-1:-1:-1;;;28623:84:0;;16561:2:1;28623:84:0;;;16543:21:1;16600:2;16580:18;;;16573:30;16639:34;16619:18;;;16612:62;-1:-1:-1;;;16690:18:1;;;16683:48;16748:19;;28623:84:0;16359:414:1;28623:84:0;-1:-1:-1;;;;;28726:33:0;;;;;;:29;:33;;;;;;;;28721:175;;28805:15;;28794:6;28778:13;28788:2;-1:-1:-1;;;;;8924:18:0;8903:7;8924:18;;;:9;:18;;;;;;;8829:118;28778:13;:22;;;;:::i;:::-;28777:43;;28769:119;;;;-1:-1:-1;;;28769:119:0;;16980:2:1;28769:119:0;;;16962:21:1;17019:2;16999:18;;;16992:30;17058:34;17038:18;;;17031:62;17129:33;17109:18;;;17102:61;17180:19;;28769:119:0;16778:427:1;28769:119:0;28909:37;28922:11;28935:10;28909:12;:37::i;:::-;28995:23;;28985:4;28952:12;8924:18;;;:9;:18;;;;;;29036:16;;-1:-1:-1;;28967:51:0;;-1:-1:-1;;;29036:16:0;;;;:32;;;;;29061:7;29036:32;:51;;;;-1:-1:-1;29078:9:0;;;;29077:10;29036:51;:73;;;;-1:-1:-1;29096:9:0;;-1:-1:-1;;;29096:9:0;;;;:13;;29036:73;:111;;;;-1:-1:-1;;;;;;29118:29:0;;;;;;:25;:29;;;;;;;;29036:111;29026:206;;;29161:9;:16;;-1:-1:-1;;29161:16:0;29173:4;29161:16;;;29184:17;:15;:17::i;:::-;29208:9;:17;;-1:-1:-1;;29208:17:0;;;29026:206;29255:9;;29239:12;;29255:9;;29254:10;:30;;;;-1:-1:-1;29268:16:0;;-1:-1:-1;;;29268:16:0;;;;29254:30;-1:-1:-1;;;;;29295:24:0;;;;;;:18;:24;;;;;;29239:45;;-1:-1:-1;29295:24:0;;;:50;;-1:-1:-1;;;;;;29323:22:0;;;;;;:18;:22;;;;;;;;29295:50;29292:83;;;-1:-1:-1;29363:5:0;29292:83;29384:7;:24;;;;-1:-1:-1;29395:9:0;;-1:-1:-1;;;29395:9:0;;;;:13;;29384:24;29380:392;;;29440:9;;29417:11;;29452:3;;29431:18;;-1:-1:-1;;;29440:9:0;;;;29431:6;:18;:::i;:::-;:24;;;;:::i;:::-;29504:8;;29417:38;;-1:-1:-1;29474:18:0;;29515:3;;29495:17;;29504:8;;;;;29495:6;:17;:::i;:::-;:23;;;;:::i;:::-;29474:44;-1:-1:-1;29534:12:0;29543:3;29534:6;:12;:::i;:::-;29525:21;;29553:41;29569:4;29583;29590:3;29553:15;:41::i;:::-;29619:14;;29615:151;;29658:38;29678:4;29685:10;29658:11;:38::i;:::-;29734:8;;29724:31;;;29734:8;;;;;;17940:36:1;;18007:2;17992:18;;17985:34;;;29724:31:0;;17913:18:1;29724:31:0;;;;;;;29615:151;29410:362;;29380:392;29777:33;29793:4;29799:2;29803:6;29777:15;:33::i;:::-;29831:15;;-1:-1:-1;;;;;29831:15:0;:26;29866:4;29873:15;29866:4;-1:-1:-1;;;;;8924:18:0;8903:7;8924:18;;;:9;:18;;;;;;;8829:118;29873:15;29831:58;;-1:-1:-1;;;;;;29831:58:0;;;;;;;-1:-1:-1;;;;;18238:32:1;;;29831:58:0;;;18220:51:1;18287:18;;;18280:34;18193:18;;29831:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29827:74;29913:15;;-1:-1:-1;;;;;29913:15:0;:26;29948:2;29953:13;29948:2;-1:-1:-1;;;;;8924:18:0;8903:7;8924:18;;;:9;:18;;;;;;;8829:118;29953:13;29913:54;;-1:-1:-1;;;;;;29913:54:0;;;;;;;-1:-1:-1;;;;;18238:32:1;;;29913:54:0;;;18220:51:1;18287:18;;;18280:34;18193:18;;29913:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29909:70;28020:1963;;;;27927:2056;;;:::o;2895:171::-;2981:7;3011:12;3003:6;;;;2995:29;;;;-1:-1:-1;;;2995:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3029:9:0;3041:5;3045:1;3041;:5;:::i;:::-;3029:17;2895:171;-1:-1:-1;;;;;2895:171:0:o;10722:341::-;-1:-1:-1;;;;;10800:21:0;;10792:65;;;;-1:-1:-1;;;10792:65:0;;18527:2:1;10792:65:0;;;18509:21:1;18566:2;18546:18;;;18539:30;18605:33;18585:18;;;18578:61;18656:18;;10792:65:0;18325:355:1;10792:65:0;10931:12;;:24;;10948:6;10931:16;:24::i;:::-;10916:12;:39;-1:-1:-1;;;;;10981:18:0;;;;;;:9;:18;;;;;;:30;;11004:6;10981:22;:30::i;:::-;-1:-1:-1;;;;;10960:18:0;;;;;;:9;:18;;;;;;:51;;;;11021:37;;10960:18;;;11021:37;;;;11051:6;2070:25:1;;2058:2;2043:18;;1924:177;11021:37:0;;;;;;;;10722:341;;:::o;11068:381::-;-1:-1:-1;;;;;11146:21:0;;11138:67;;;;-1:-1:-1;;;11138:67:0;;18887:2:1;11138:67:0;;;18869:21:1;18926:2;18906:18;;;18899:30;18965:34;18945:18;;;18938:62;-1:-1:-1;;;19016:18:1;;;19009:31;19057:19;;11138:67:0;18685:397:1;11138:67:0;11285:68;11308:6;11285:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11285:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;11264:18:0;;;;;;:9;:18;;;;;:89;11373:12;;:24;;11390:6;11373:16;:24::i;:::-;11358:12;:39;11407:37;;2070:25:1;;;11433:1:0;;-1:-1:-1;;;;;11407:37:0;;;;;2058:2:1;2043:18;11407:37:0;1924:177:1;32418:1258:0;32642:21;;;;:43;;;;:21;;:43;32638:215;;32698:101;;-1:-1:-1;;;19289:32:1;;19346:2;19337:12;32698:101:0;;;;;;;;32740:21;;;;32784:14;;32698:101;;32740:21;;;;;32698:101;;;;-1:-1:-1;;;;;;;;;;;32698:101:0;;;32784:14;;;32698:101;:::i;:::-;;;;;;;;32805:21;;;:42;;-1:-1:-1;;32805:42:0;;;;;;;32638:215;32861:21;;;;:43;;;;:21;;;;;:43;32857:215;;32917:101;;-1:-1:-1;;;19776:32:1;;19833:2;19824:12;32917:101:0;;;;;;;;32959:21;;;;33003:14;;32917:101;;32959:21;;;;;;;;32917:101;;;;-1:-1:-1;;;;;;;;;;;32917:101:0;;;33003:14;;;32917:101;:::i;:::-;;;;;;;;33024:21;;;:42;;-1:-1:-1;;33024:42:0;;;;;;;;;32857:215;33080:19;;;;:39;;;;-1:-1:-1;;;33080:19:0;;;;:39;33076:201;;33132:95;;-1:-1:-1;;;20049:30:1;;20104:2;20095:12;33132:95:0;;;;;;;;33172:19;;;;33212:14;;33132:95;;33172:19;-1:-1:-1;;;33172:19:0;;;;;;33132:95;;;;-1:-1:-1;;;;;;;;;;;33132:95:0;;;33212:14;;;33132:95;:::i;:::-;;;;;;;;33233:19;;;:38;;-1:-1:-1;;33233:38:0;-1:-1:-1;;;33233:38:0;;;;;;;33076:201;33291:16;;;;:33;;;;-1:-1:-1;;;33291:16:0;;;;:33;33287:180;;33337:86;;-1:-1:-1;;;20320:27:1;;20372:2;20363:12;33337:86:0;;;;;;;;33374:16;;;;33408:14;;33337:86;;33374:16;-1:-1:-1;;;33374:16:0;;;;;;33337:86;;;;-1:-1:-1;;;;;;;;;;;33337:86:0;;;33408:14;;;33337:86;:::i;:::-;;;;;;;;33429:16;;;:32;;-1:-1:-1;;33429:32:0;-1:-1:-1;;;33429:32:0;;;;;;;33287:180;33475:19;;;;:39;;;;-1:-1:-1;;;33475:19:0;;;;:39;33471:201;;33527:95;;-1:-1:-1;;;20588:30:1;;20643:2;20634:12;33527:95:0;;;;;;;;33567:19;;;;33607:14;;33527:95;;33567:19;-1:-1:-1;;;33567:19:0;;;;;;33527:95;;;;-1:-1:-1;;;;;;;;;;;33527:95:0;;;33607:14;;;33527:95;:::i;:::-;;;;;;;;33628:19;;;:38;;-1:-1:-1;;33628:38:0;-1:-1:-1;;;33628:38:0;;;;;;;33471:201;32418:1258;;;;;;:::o;31117:1298::-;31346:22;;;;:45;;;;:22;;;;;:45;31342:222;;31404:104;;-1:-1:-1;;;20859:33:1;;20917:2;20908:12;31404:104:0;;;;;;;;31447:22;;;;31493:14;;31404:104;;31447:22;;;;;;;;31404:104;;;;-1:-1:-1;;;;;;;;;;;31404:104:0;;;31493:14;;;31404:104;:::i;:::-;;;;;;;;31514:22;;;:44;;-1:-1:-1;;31514:44:0;;;;;;;;;31342:222;31572:22;;;;:45;;;;:22;;;;;:45;31568:222;;31630:104;;-1:-1:-1;;;21133:33:1;;21191:2;21182:12;31630:104:0;;;;;;;;31673:22;;;;31719:14;;31630:104;;31673:22;;;;;;;;31630:104;;;;-1:-1:-1;;;;;;;;;;;31630:104:0;;;31719:14;;;31630:104;:::i;:::-;;;;;;;;31740:22;;;:44;;-1:-1:-1;;31740:44:0;;;;;;;;;31568:222;31798:20;;;;:41;;;;-1:-1:-1;;;31798:20:0;;;;:41;31794:208;;31852:98;;-1:-1:-1;;;21407:31:1;;21463:2;21454:12;31852:98:0;;;;;;;;31893:20;;;;31935:14;;31852:98;;31893:20;-1:-1:-1;;;31893:20:0;;;;;;31852:98;;;;-1:-1:-1;;;;;;;;;;;31852:98:0;;;31935:14;;;31852:98;:::i;:::-;;;;;;;;31956:20;;;:40;;-1:-1:-1;;31956:40:0;-1:-1:-1;;;31956:40:0;;;;;;;31794:208;32016:17;;;;:35;;;;-1:-1:-1;;;32016:17:0;;;;:35;32012:187;;32064:89;;-1:-1:-1;;;21679:28:1;;21732:2;21723:12;32064:89:0;;;;;;;;32102:17;;;;32138:14;;32064:89;;32102:17;-1:-1:-1;;;32102:17:0;;;;;;32064:89;;;;-1:-1:-1;;;;;;;;;;;32064:89:0;;;32138:14;;;32064:89;:::i;:::-;;;;;;;;32159:17;;;:34;;-1:-1:-1;;32159:34:0;-1:-1:-1;;;32159:34:0;;;;;;;32012:187;32207:20;;;;:41;;;;-1:-1:-1;;;32207:20:0;;;;:41;32203:208;;32261:98;;-1:-1:-1;;;21948:31:1;;22004:2;21995:12;32261:98:0;;;;;;;;32302:20;;;;32344:14;;32261:98;;32302:20;-1:-1:-1;;;32302:20:0;;;;;;32261:98;;;;-1:-1:-1;;;;;;;;;;;32261:98:0;;;32344:14;;;32261:98;:::i;:::-;;;;;;;;32365:20;;;:40;;;;;-1:-1:-1;;;32365:40:0;-1:-1:-1;;32365:40:0;;;;;;31117:1298;;;;;;:::o;10208:509::-;-1:-1:-1;;;;;10321:20:0;;10313:70;;;;-1:-1:-1;;;10313:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10396:23:0;;10388:71;;;;-1:-1:-1;;;10388:71:0;;;;;;;:::i;:::-;10536;10558:6;10536:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10536:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;10516:17:0;;;;;;;:9;:17;;;;;;:91;;;;10635:20;;;;;;;:32;;10660:6;10635:24;:32::i;:::-;-1:-1:-1;;;;;10612:20:0;;;;;;;:9;:20;;;;;;;:55;;;;10677:35;;;;;;;;;;10705:6;2070:25:1;;2058:2;2043:18;;1924:177;29986:1128:0;30056:13;:17;;-1:-1:-1;;30143:15:0;;;30165:239;;;;30204:23;;30188:13;:39;;30204:23;;;;-1:-1:-1;;30233:39:0;;;;;;;30204:23;30249;;;;;;30233:39;;;;;;;;-1:-1:-1;;30328:29:0;-1:-1:-1;;;30292:21:0;;;;;30278:35;;;;-1:-1:-1;;30328:29:0;;-1:-1:-1;;;30339:18:0;;;;30328:29;;;-1:-1:-1;;30363:35:0;-1:-1:-1;;;30377:21:0;;;;;;;30363:35;;;;;;;30165:239;30415:10;30411:246;;;30452:24;;30436:13;:40;;30452:24;;;;;;;;-1:-1:-1;;30482:40:0;;;;;;;30498:24;;;;;;30482:40;;;;;-1:-1:-1;;30579:30:0;-1:-1:-1;;;30542:22:0;;;;30528:36;;-1:-1:-1;;30579:30:0;;-1:-1:-1;;;30590:19:0;;;;30579:30;;;;;-1:-1:-1;;30615:36:0;-1:-1:-1;;;30629:22:0;;;;-1:-1:-1;;;30615:36:0;;;;;;;30411:246;30672:10;30671:11;:27;;;;;30687:11;30686:12;30671:27;30667:260;;;30722:24;;30706:13;:40;;30722:24;;;;;;;;-1:-1:-1;;30752:40:0;;;;;;;30768:24;;;;;;30752:40;;;;;-1:-1:-1;;30849:30:0;-1:-1:-1;;;30812:22:0;;;;30798:36;;-1:-1:-1;;30849:30:0;;-1:-1:-1;;;30860:19:0;;;;30849:30;;;;;-1:-1:-1;;30885:36:0;-1:-1:-1;;;30899:22:0;;;;-1:-1:-1;;;30885:36:0;;;;;;;30667:260;31000:11;;;-1:-1:-1;;;31000:11:0;;;;;30989:8;;;;;;30975:11;;;;;;30943:29;;31000:11;30959:13;;;;;30943;:29;:::i;:::-;:43;;;;:::i;:::-;:54;;;;:::i;:::-;:68;;;;:::i;:::-;30931:9;:80;;-1:-1:-1;;30931:80:0;;-1:-1:-1;;;30931:80:0;;;;;;;;;;;;;31021:88;;;31033:13;;;;;;;;;;22513:34:1;;30931:80:0;31048:13;;;;22578:2:1;22563:18;;22556:43;31063:11:0;;;;;22615:18:1;;;22608:43;;;;31076:8:0;;;;;22682:2:1;22667:18;;22660:43;-1:-1:-1;;;31086:11:0;;;;22734:3:1;22719:19;;22712:44;31099:9:0;;;;;;22787:3:1;22772:19;;22765:44;31021:88:0;;22477:3:1;22462:19;31021:88:0;22227:588:1;33679:1390:0;33763:4;33719:23;8924:18;;;:9;:18;;;;;;33890:9;;8924:18;;33802:21;;33902:1;;33890:9;-1:-1:-1;;;33890:9:0;;;;;33856:31;;33874:13;8924:18;33856:31;:::i;:::-;:43;;;;:::i;:::-;:47;;;;:::i;:::-;33973:9;;33830:73;;-1:-1:-1;33914:24:0;;33973:9;-1:-1:-1;;;33973:9:0;;;;;33941:29;;-1:-1:-1;;;33959:11:0;;;;33941:15;:29;:::i;:::-;:41;;;;:::i;:::-;33914:68;-1:-1:-1;33987:20:0;34029:34;33914:68;34029:15;:34;:::i;:::-;34010:54;;:15;:54;:::i;:::-;33987:77;;34071:31;34089:12;34071:17;:31::i;:::-;34109:27;34139:42;34164:17;34139:21;:42;:::i;:::-;34254:11;;34109:72;;-1:-1:-1;34186:19:0;;34254:11;-1:-1:-1;;;34254:11:0;;;;;34243:8;;;;;;34222:17;;34238:1;;34222:13;:17;:::i;:::-;34221:30;;;;:::i;:::-;:44;;;;:::i;:::-;34208:9;;:58;;;-1:-1:-1;;;34208:9:0;;;;:58;:::i;:::-;34322:13;;34186:80;;;;;-1:-1:-1;34271:26:0;;34352:1;;34186:80;;34300:35;;34322:13;34300:19;:35;:::i;:::-;:49;;;;:::i;:::-;:53;;;;:::i;:::-;34415:13;;34271:82;;-1:-1:-1;34364:26:0;;34431:11;;34393:35;;34415:13;;;;;34393:19;:35;:::i;:::-;:49;;;;:::i;:::-;34364:78;-1:-1:-1;34447:24:0;34497:39;34364:78;34497:18;:39;:::i;:::-;34474:63;;:19;:63;:::i;:::-;34552:13;;34544:49;;34447:90;;-1:-1:-1;;;;;;34552:13:0;;34544:49;;;;;34447:90;;34552:13;34544:49;34552:13;34544:49;34447:90;34552:13;34544:49;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34612:15:0;;34604:53;;-1:-1:-1;;;;;34612:15:0;;;;34604:53;;;;;34638:18;;34612:15;34604:53;34612:15;34604:53;34638:18;34612:15;34604:53;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34668:19:0;;34664:169;;34695:50;34709:15;34726:18;34695:13;:50::i;:::-;34756:65;;;23392:25:1;;;23448:2;23433:18;;23426:34;;;23476:18;;;23469:34;;;34756:65:0;;23380:2:1;23365:18;34756:65:0;;;;;;;34664:169;34895:15;;34856:74;;-1:-1:-1;;;34856:74:0;;-1:-1:-1;;;;;34895:15:0;;;34856:74;;;18220:51:1;18287:18;;;18280:34;;;34840:12:0;;34871:4;;34856:30;;18193:18:1;;34856:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34839:91;;34938:7;34935:130;;;34953:15;;:64;;-1:-1:-1;;;34953:64:0;;;;;2070:25:1;;;-1:-1:-1;;;;;34953:15:0;;;;:46;;2043:18:1;;34953:64:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35028:31;35042:16;35028:31;;;;2070:25:1;;2058:2;2043:18;;1924:177;35028:31:0;;;;;;;;34935:130;33714:1355;;;;;;;;;;;33679:1390::o;2763:127::-;2821:7;2842:43;2846:1;2849;2842:43;;;;;;;;;;;;;;;;;:3;:43::i;35072:416::-;35157:16;;;35171:1;35157:16;;;;;;;;35133:21;;35157:16;;;;;;;;;;-1:-1:-1;35157:16:0;35133:40;;35196:4;35178;35183:1;35178:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35178:23:0;;;:7;;;;;;;;;;:23;;;;35216:15;;:22;;;-1:-1:-1;;;35216:22:0;;;;:15;;;;;:20;;:22;;;;;35178:7;;35216:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35206:4;35211:1;35206:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35206:32:0;;;:7;;;;;;;;;:32;35275:15;;35243:62;;35260:4;;35275:15;35293:11;35243:8;:62::i;:::-;35310:15;;:173;;-1:-1:-1;;;35310:173:0;;-1:-1:-1;;;;;35310:15:0;;;;:66;;:173;;35382:11;;35310:15;;35434:4;;35452;;35463:15;;35310:173;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35491:348;35599:15;;35567:62;;35584:4;;-1:-1:-1;;;;;35599:15:0;35617:11;35567:8;:62::i;:::-;35634:15;;35793;;35634:200;;-1:-1:-1;;;35634:200:0;;35697:4;35634:200;;;25639:34:1;25689:18;;;25682:34;;;35634:15:0;25732:18:1;;;25725:34;;;25775:18;;;25768:34;-1:-1:-1;;;;;35793:15:0;;;25818:19:1;;;25811:44;35814:15:0;25871:19:1;;;25864:35;35634:15:0;;;:31;;35673:9;;25573:19:1;;35634:200:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;206:597:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;644:6;641:1;638:13;635:91;;;714:1;709:2;700:6;689:9;685:22;681:31;674:42;635:91;-1:-1:-1;787:2:1;766:15;-1:-1:-1;;762:29:1;747:45;;;;794:2;743:54;;206:597;-1:-1:-1;;;206:597:1:o;808:131::-;-1:-1:-1;;;;;883:31:1;;873:42;;863:70;;929:1;926;919:12;944:315;1012:6;1020;1073:2;1061:9;1052:7;1048:23;1044:32;1041:52;;;1089:1;1086;1079:12;1041:52;1128:9;1115:23;1147:31;1172:5;1147:31;:::i;:::-;1197:5;1249:2;1234:18;;;;1221:32;;-1:-1:-1;;;944:315:1:o;1264:180::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;-1:-1:-1;1415:23:1;;1264:180;-1:-1:-1;1264:180:1:o;1449:247::-;1508:6;1561:2;1549:9;1540:7;1536:23;1532:32;1529:52;;;1577:1;1574;1567:12;1529:52;1616:9;1603:23;1635:31;1660:5;1635:31;:::i;2314:456::-;2391:6;2399;2407;2460:2;2448:9;2439:7;2435:23;2431:32;2428:52;;;2476:1;2473;2466:12;2428:52;2515:9;2502:23;2534:31;2559:5;2534:31;:::i;:::-;2584:5;-1:-1:-1;2641:2:1;2626:18;;2613:32;2654:33;2613:32;2654:33;:::i;:::-;2314:456;;2706:7;;-1:-1:-1;;;2760:2:1;2745:18;;;;2732:32;;2314:456::o;3214:529::-;3291:6;3299;3307;3360:2;3348:9;3339:7;3335:23;3331:32;3328:52;;;3376:1;3373;3366:12;3328:52;3415:9;3402:23;3434:31;3459:5;3434:31;:::i;:::-;3484:5;-1:-1:-1;3541:2:1;3526:18;;3513:32;3554:33;3513:32;3554:33;:::i;:::-;3606:7;-1:-1:-1;3665:2:1;3650:18;;3637:32;3678:33;3637:32;3678:33;:::i;:::-;3730:7;3720:17;;;3214:529;;;;;:::o;3748:118::-;3834:5;3827:13;3820:21;3813:5;3810:32;3800:60;;3856:1;3853;3846:12;3871:382;3936:6;3944;3997:2;3985:9;3976:7;3972:23;3968:32;3965:52;;;4013:1;4010;4003:12;3965:52;4052:9;4039:23;4071:31;4096:5;4071:31;:::i;:::-;4121:5;-1:-1:-1;4178:2:1;4163:18;;4150:32;4191:30;4150:32;4191:30;:::i;:::-;4240:7;4230:17;;;3871:382;;;;;:::o;4258:156::-;4324:20;;4384:4;4373:16;;4363:27;;4353:55;;4404:1;4401;4394:12;4353:55;4258:156;;;:::o;4419:464::-;4504:6;4512;4520;4528;4536;4589:3;4577:9;4568:7;4564:23;4560:33;4557:53;;;4606:1;4603;4596:12;4557:53;4629:27;4646:9;4629:27;:::i;:::-;4619:37;;4675:36;4707:2;4696:9;4692:18;4675:36;:::i;:::-;4665:46;;4730:36;4762:2;4751:9;4747:18;4730:36;:::i;:::-;4720:46;;4785:36;4817:2;4806:9;4802:18;4785:36;:::i;:::-;4775:46;;4840:37;4872:3;4861:9;4857:19;4840:37;:::i;:::-;4830:47;;4419:464;;;;;;;;:::o;5391:388::-;5459:6;5467;5520:2;5508:9;5499:7;5495:23;5491:32;5488:52;;;5536:1;5533;5526:12;5488:52;5575:9;5562:23;5594:31;5619:5;5594:31;:::i;:::-;5644:5;-1:-1:-1;5701:2:1;5686:18;;5673:32;5714:33;5673:32;5714:33;:::i;5784:380::-;5863:1;5859:12;;;;5906;;;5927:61;;5981:4;5973:6;5969:17;5959:27;;5927:61;6034:2;6026:6;6023:14;6003:18;6000:38;5997:161;;6080:10;6075:3;6071:20;6068:1;6061:31;6115:4;6112:1;6105:15;6143:4;6140:1;6133:15;5997:161;;5784:380;;;:::o;6169:356::-;6371:2;6353:21;;;6390:18;;;6383:30;6449:34;6444:2;6429:18;;6422:62;6516:2;6501:18;;6169:356::o;8347:184::-;8417:6;8470:2;8458:9;8449:7;8445:23;8441:32;8438:52;;;8486:1;8483;8476:12;8438:52;-1:-1:-1;8509:16:1;;8347:184;-1:-1:-1;8347:184:1:o;9199:245::-;9266:6;9319:2;9307:9;9298:7;9294:23;9290:32;9287:52;;;9335:1;9332;9325:12;9287:52;9367:9;9361:16;9386:28;9408:5;9386:28;:::i;11494:418::-;11696:2;11678:21;;;11735:2;11715:18;;;11708:30;11774:34;11769:2;11754:18;;11747:62;-1:-1:-1;;;11840:2:1;11825:18;;11818:52;11902:3;11887:19;;11494:418::o;13709:127::-;13770:10;13765:3;13761:20;13758:1;13751:31;13801:4;13798:1;13791:15;13825:4;13822:1;13815:15;13841:128;13881:3;13912:1;13908:6;13905:1;13902:13;13899:39;;;13918:18;;:::i;:::-;-1:-1:-1;13954:9:1;;13841:128::o;15138:401::-;15340:2;15322:21;;;15379:2;15359:18;;;15352:30;15418:34;15413:2;15398:18;;15391:62;-1:-1:-1;;;15484:2:1;15469:18;;15462:35;15529:3;15514:19;;15138:401::o;15544:399::-;15746:2;15728:21;;;15785:2;15765:18;;;15758:30;15824:34;15819:2;15804:18;;15797:62;-1:-1:-1;;;15890:2:1;15875:18;;15868:33;15933:3;15918:19;;15544:399::o;17210:168::-;17250:7;17316:1;17312;17308:6;17304:14;17301:1;17298:21;17293:1;17286:9;17279:17;17275:45;17272:71;;;17323:18;;:::i;:::-;-1:-1:-1;17363:9:1;;17210:168::o;17383:127::-;17444:10;17439:3;17435:20;17432:1;17425:31;17475:4;17472:1;17465:15;17499:4;17496:1;17489:15;17515:120;17555:1;17581;17571:35;;17586:18;;:::i;:::-;-1:-1:-1;17620:9:1;;17515:120::o;17640:125::-;17680:4;17708:1;17705;17702:8;17699:34;;;17713:18;;:::i;:::-;-1:-1:-1;17750:9:1;;17640:125::o;19360:209::-;-1:-1:-1;;19524:38:1;;;;19506:57;;19494:2;19479:18;;19360:209::o;22018:204::-;22056:3;22092:4;22089:1;22085:12;22124:4;22121:1;22117:12;22159:3;22153:4;22149:14;22144:3;22141:23;22138:49;;;22167:18;;:::i;:::-;22203:13;;22018:204;-1:-1:-1;;;22018:204:1:o;22820:165::-;22858:1;22892:4;22889:1;22885:12;22916:3;22906:37;;22923:18;;:::i;:::-;22975:3;22968:4;22965:1;22961:12;22957:22;22952:27;;;22820:165;;;;:::o;22990:195::-;23028:4;23065;23062:1;23058:12;23097:4;23094:1;23090:12;23122:3;23117;23114:12;23111:38;;;23129:18;;:::i;:::-;23166:13;;;22990:195;-1:-1:-1;;;22990:195:1:o;23925:127::-;23986:10;23981:3;23977:20;23974:1;23967:31;24017:4;24014:1;24007:15;24041:4;24038:1;24031:15;24057:251;24127:6;24180:2;24168:9;24159:7;24155:23;24151:32;24148:52;;;24196:1;24193;24186:12;24148:52;24228:9;24222:16;24247:31;24272:5;24247:31;:::i;24313:980::-;24575:4;24623:3;24612:9;24608:19;24654:6;24643:9;24636:25;24680:2;24718:6;24713:2;24702:9;24698:18;24691:34;24761:3;24756:2;24745:9;24741:18;24734:31;24785:6;24820;24814:13;24851:6;24843;24836:22;24889:3;24878:9;24874:19;24867:26;;24928:2;24920:6;24916:15;24902:29;;24949:1;24959:195;24973:6;24970:1;24967:13;24959:195;;;25038:13;;-1:-1:-1;;;;;25034:39:1;25022:52;;25129:15;;;;25094:12;;;;25070:1;24988:9;24959:195;;;-1:-1:-1;;;;;;;25210:32:1;;;;25205:2;25190:18;;25183:60;-1:-1:-1;;;25274:3:1;25259:19;25252:35;25171:3;24313:980;-1:-1:-1;;;24313:980:1:o;25910:306::-;25998:6;26006;26014;26067:2;26055:9;26046:7;26042:23;26038:32;26035:52;;;26083:1;26080;26073:12;26035:52;26112:9;26106:16;26096:26;;26162:2;26151:9;26147:18;26141:25;26131:35;;26206:2;26195:9;26191:18;26185:25;26175:35;;25910:306;;;;;:::o

Swarm Source

ipfs://f1ee6719b3ddb19461ae48c503877461ca1f4759bcf79597589f8bb7243df5e1
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.