Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Overview
Max Total Supply
10,000,000 NEURONI
Holders
105
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.845309766194695429 NEURONIValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NeuroniAI
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Multiple files format)
//SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.7; import "./Interfaces.sol"; import "./Libraries.sol"; import "./BaseErc20.sol"; import "./Burnable.sol"; import "./Taxable.sol"; import "./TaxDistributor.sol"; import "./AntiSniper.sol"; contract NeuroniAI is BaseErc20, AntiSniper, Burnable, Taxable { constructor () { configure(0xA281151C22a70d6743F5b31Bc4E3958ce3681985); symbol = "NEURONI"; name = "Neuroni.AI"; decimals = 18; // Swap address routerAddress = getRouterAddress(); IDEXRouter router = IDEXRouter(routerAddress); address WBNB = router.WETH(); address pair = IDEXFactory(router.factory()).createPair(WBNB, address(this)); exchanges[pair] = true; taxDistributor = new TaxDistributor(routerAddress, pair, WBNB, 1300, 1300); // Anti Sniper enableSniperBlocking = true; isNeverSniper[address(taxDistributor)] = true; mhPercentage = 300; // Tax minimumTimeBetweenSwaps = 5 minutes; minimumTokensBeforeSwap = 1000 * 10 ** decimals; excludedFromTax[address(taxDistributor)] = true; taxDistributor.createWalletTax("Insight", 190, 456, 0xC6467b4F00cA55c5548fb7bd872c872B63841eB9, true); taxDistributor.createWalletTax("Marketing", 185, 444, 0xE53820cAdD647D99B1BD98a29Af7Be87E497Cf0f, true); taxDistributor.createWalletTax("Dev", 125, 300, 0x08a3351E0C1eb65C5D80D568AdbE97810820d7E3, true); autoSwapTax = false; // Burnable ableToBurn[address(taxDistributor)] = true; // Finalise _allowed[address(taxDistributor)][routerAddress] = 2**256 - 1; _totalSupply = _totalSupply + (10_000_000 * 10 ** decimals); _balances[owner] = _balances[owner] + _totalSupply; emit Transfer(address(0), owner, _totalSupply); } // Overrides function launch() public override(AntiSniper, BaseErc20) onlyOwner { super.launch(); } function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) { super.configure(_owner); } function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal { super.preTransfer(from, to, value); } function calculateTransferAmount(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal returns (uint256) { return super.calculateTransferAmount(from, to, value); } function postTransfer(address from, address to) override(BaseErc20) internal { super.postTransfer(from, to); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Libraries.sol"; import "./Interfaces.sol"; import "./BaseErc20.sol"; interface IPinkAntiBot { function setTokenOwner(address owner) external; function onPreTransferCheck(address from, address to, uint256 amount) external; } abstract contract AntiSniper is BaseErc20 { IPinkAntiBot public pinkAntiBot; bool private pinkAntiBotConfigured; bool public enableSniperBlocking; bool public enableBlockLogProtection; bool public enableHighTaxCountdown; bool public enablePinkAntiBot; uint256 public msPercentage; uint256 public mhPercentage; uint256 public maxGasLimit; uint256 public launchTime; uint256 public launchBlock; uint256 public snipersCaught; mapping (address => bool) public isSniper; mapping (address => bool) public isNeverSniper; mapping (address => uint256) public transactionBlockLog; // Overrides function configure(address _owner) internal virtual override { isNeverSniper[_owner] = true; super.configure(_owner); } function launch() override virtual public onlyOwner { super.launch(); launchTime = block.timestamp; launchBlock = block.number; } function preTransfer(address from, address to, uint256 value) override virtual internal { require(enableSniperBlocking == false || isSniper[msg.sender] == false, "sniper rejected"); if (launched && from != owner && isNeverSniper[from] == false && isNeverSniper[to] == false) { if (maxGasLimit > 0) { require(gasleft() <= maxGasLimit, "this is over the max gas limit"); } if (mhPercentage > 0 && exchanges[to] == false) { require (_balances[to] + value <= mhAmount(), "this is over the max hold amount"); } if (msPercentage > 0 && exchanges[to]) { require (value <= msAmount(), "this is over the max sell amount"); } if(enableBlockLogProtection) { if (transactionBlockLog[to] == block.number) { isSniper[to] = true; snipersCaught ++; } if (transactionBlockLog[from] == block.number) { isSniper[from] = true; snipersCaught ++; } if (exchanges[to] == false) { transactionBlockLog[to] = block.number; } if (exchanges[from] == false) { transactionBlockLog[from] = block.number; } } if (enablePinkAntiBot) { pinkAntiBot.onPreTransferCheck(from, to, value); } } super.preTransfer(from, to, value); } function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) { uint256 amountAfterTax = value; if (launched && enableHighTaxCountdown) { if (from != owner && sniperTax() > 0 && isNeverSniper[from] == false && isNeverSniper[to] == false) { uint256 taxAmount = (value * sniperTax()) / 10000; amountAfterTax = amountAfterTax - taxAmount; } } return super.calculateTransferAmount(from, to, amountAfterTax); } // Public methods function mhAmount() public view returns (uint256) { return (_totalSupply * mhPercentage) / 10000; } function msAmount() public view returns (uint256) { return (_totalSupply * msPercentage) / 10000; } function sniperTax() public virtual view returns (uint256) { if(launched) { if (block.number - launchBlock < 3) { return 9900; } } return 0; } // Admin methods function configurePinkAntiBot(address antiBot) external onlyOwner { pinkAntiBot = IPinkAntiBot(antiBot); pinkAntiBot.setTokenOwner(owner); pinkAntiBotConfigured = true; enablePinkAntiBot = true; } function setSniperBlocking(bool enabled) external onlyOwner { enableSniperBlocking = enabled; } function setBlockLogProtection(bool enabled) external onlyOwner { enableBlockLogProtection = enabled; } function setHighTaxCountdown(bool enabled) external onlyOwner { enableHighTaxCountdown = enabled; } function setPinkAntiBot(bool enabled) external onlyOwner { require(pinkAntiBotConfigured, "pink anti bot is not configured"); enablePinkAntiBot = enabled; } function setMsPercentage(uint256 amount) external onlyOwner { msPercentage = amount; } function setMhPercentage(uint256 amount) external onlyOwner { mhPercentage = amount; } function setMaxGasLimit(uint256 amount) external onlyOwner { maxGasLimit = amount; } function setIsSniper(address who, bool enabled) external onlyOwner { isSniper[who] = enabled; } function setNeverSniper(address who, bool enabled) external onlyOwner { isNeverSniper[who] = enabled; } // private methods }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Interfaces.sol"; import "./Libraries.sol"; abstract contract BaseErc20 is IERC20, IOwnable { mapping (address => uint256) internal _balances; mapping (address => mapping (address => uint256)) internal _allowed; uint256 internal _totalSupply; bool internal _useSafeTransfer; string public symbol; string public name; uint8 public decimals; address public override owner; bool public isTradingEnabled = true; bool public launched; mapping (address => bool) public canAlwaysTrade; mapping (address => bool) public excludedFromSelling; mapping (address => bool) public exchanges; modifier onlyOwner() { require(msg.sender == owner, "can only be called by the contract owner"); _; } modifier isLaunched() { require(launched, "can only be called once token is launched"); _; } // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list modifier tradingEnabled(address from) { require((isTradingEnabled && launched) || from == owner || canAlwaysTrade[msg.sender], "trading not enabled"); _; } function configure(address _owner) internal virtual { owner = _owner; canAlwaysTrade[owner] = true; } /** * @dev Total number of tokens in existence */ function totalSupply() external override view returns (uint256) { return _totalSupply; } /** * @dev Gets the balance of the specified address. * @param _owner The address to query the balance of. * @return An uint256 representing the amount owned by the passed address. */ function balanceOf(address _owner) external override view returns (uint256) { return _balances[_owner]; } /** * @dev Function to check the amount of tokens that an owner allowed to a spender. * @param _owner address The address which owns the funds. * @param spender address The address which will spend the funds. * @return A uint256 specifying the amount of tokens still available for the spender. */ function allowance(address _owner, address spender) external override view returns (uint256) { return _allowed[_owner][spender]; } /** * @dev Transfer token for a specified address * @param to The address to transfer to. * @param value The amount to be transferred. */ function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) { _transfer(msg.sender, to, value); return true; } /** * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender. * Beware that changing an allowance with this method brings the risk that someone may use both the old * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * @param spender The address which will spend the funds. * @param value The amount of tokens to be spent. */ function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = value; emit Approval(msg.sender, spender, value); return true; } /** * @dev Transfer tokens from one address to another. * Note that while this function emits an Approval event, this is not required as per the specification, * and other compliant implementations may not emit the event. * @param from address The address which you want to send tokens from * @param to address The address which you want to transfer to * @param value uint256 the amount of tokens to be transferred */ function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) { _allowed[from][msg.sender] = _allowed[from][msg.sender] - value; _transfer(from, to, value); emit Approval(from, msg.sender, _allowed[from][msg.sender]); return true; } /** * @dev Increase the amount of tokens that an owner allowed to a spender. * approve should be called when allowed_[_spender] == 0. To increment * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param addedValue The amount of tokens to increase the allowance by. */ function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = _allowed[msg.sender][spender] + addedValue; emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } /** * @dev Decrease the amount of tokens that an owner allowed to a spender. * approve should be called when allowed_[_spender] == 0. To decrement * allowed value is better to use this function to avoid 2 calls (and wait until * the first transaction is mined) * From MonolithDAO Token.sol * Emits an Approval event. * @param spender The address which will spend the funds. * @param subtractedValue The amount of tokens to decrease the allowance by. */ function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) { require(spender != address(0), "cannot approve the 0 address"); _allowed[msg.sender][spender] = _allowed[msg.sender][spender] - subtractedValue; emit Approval(msg.sender, spender, _allowed[msg.sender][spender]); return true; } // Virtual methods function launch() virtual public onlyOwner { launched = true; } function preTransfer(address from, address to, uint256 value) virtual internal { } function calculateTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) { require(from != to, "you cannot transfer to yourself"); return value; } function postTransfer(address from, address to) virtual internal { } // Admin methods function changeOwner(address who) external onlyOwner { require(who != address(0), "cannot be zero address"); owner = who; } function removeBnb() external onlyOwner { uint256 balance = address(this).balance; payable(owner).transfer(balance); } function transferTokens(address token, address to) external onlyOwner returns(bool){ uint256 balance = IERC20(token).balanceOf(address(this)); return IERC20(token).transfer(to, balance); } function setCanAlwaysTrade(address who, bool enabled) external onlyOwner { canAlwaysTrade[who] = enabled; } function setExchange(address who, bool isExchange) external onlyOwner { exchanges[who] = isExchange; } // Private methods function getRouterAddress() internal view returns (address routerAddress) { if (block.chainid == 1 || block.chainid == 3 || block.chainid == 4 || block.chainid == 5) { routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D ; // ETHEREUM } else if (block.chainid == 56) { routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E; // BSC MAINNET } else if (block.chainid == 97) { routerAddress = 0xc99f3718dB7c90b020cBBbb47eD26b0BA0C6512B; // BSC TESTNET - https://pancakeswap.rainbit.me/ } else { revert("Unknown Chain ID"); } } /** * @dev Transfer token for a specified addresses * @param from The address to transfer from. * @param to The address to transfer to. * @param value The amount to be transferred. */ function _transfer(address from, address to, uint256 value) private { require(to != address(0), "cannot be zero address"); require(excludedFromSelling[from] == false, "address is not allowed to sell"); if (_useSafeTransfer) { _balances[from] = _balances[from] - value; _balances[to] = _balances[to] + value; emit Transfer(from, to, value); } else { preTransfer(from, to, value); uint256 modifiedAmount = calculateTransferAmount(from, to, value); _balances[from] = _balances[from] - value; _balances[to] = _balances[to] + modifiedAmount; emit Transfer(from, to, modifiedAmount); postTransfer(from, to); } } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Libraries.sol"; import "./Interfaces.sol"; import "./BaseErc20.sol"; abstract contract Burnable is BaseErc20, IBurnable { mapping (address => bool) public ableToBurn; modifier onlyBurner() { require(ableToBurn[msg.sender], "no burn permissions"); _; } // Overrides function configure(address _owner) internal virtual override { ableToBurn[_owner] = true; super.configure(_owner); } // Admin methods function setAbleToBurn(address who, bool enabled) external onlyOwner { ableToBurn[who] = enabled; } /** * @dev Internal function that burns an amount of the token of a given * account. * @param value The amount that will be burnt. */ function burn(uint256 value) external override onlyBurner { _burn(msg.sender, value); } /** * @dev Internal function that burns an amount of the token of a given * account, deducting from the sender's allowance for said account. Uses the * internal burn function. * Emits an Approval event (reflecting the reduced allowance). * @param account The account whose tokens will be burnt. * @param value The amount that will be burnt. */ function burnFrom(address account, uint256 value) external override onlyBurner { _allowed[account][msg.sender] = _allowed[account][msg.sender] - value; _burn(account, value); emit Approval(account, msg.sender, _allowed[account][msg.sender]); } // Private methods function _burn(address account, uint256 value) internal { require(account != address(0)); _totalSupply = _totalSupply - value; _balances[account] = _balances[account] - value; emit Transfer(account, address(0), value); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; interface IOwnable { function owner() external view returns (address); } interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address _owner, address spender) external view returns (uint256); function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IBurnable { function burn(uint256 value) external; function burnFrom(address account, uint256 value) external; } interface IDEXFactory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IDEXRouter { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity); function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); } interface IDividendDistributor { function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external; function setShare(address shareholder, uint256 amount) external; function depositNative() external payable; function depositToken(address from, uint256 amount) external; function process(uint256 gas) external; function inSwap() external view returns (bool); } interface ITaxDistributor { receive() external payable; function lastSwapTime() external view returns (uint256); function inSwap() external view returns (bool); function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external; function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external; function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external; function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external; function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external; function distribute() external payable; function getSellTax() external view returns (uint256); function getBuyTax() external view returns (uint256); function setTaxWallet(string memory taxName, address wallet) external; function setSellTax(string memory taxName, uint256 taxPercentage) external; function setBuyTax(string memory taxName, uint256 taxPercentage) external; function takeSellTax(uint256 value) external returns (uint256); function takeBuyTax(uint256 value) external returns (uint256); } interface IWalletDistributor { function receiveToken(address token, address from, uint256 amount) external; }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; /** * @title SafeMath * @dev Math operations with safety checks that revert on error */ library SafeMath { int256 constant private INT256_MIN = -2**255; /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Multiplies two signed integers, reverts on overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // 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-solidity/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below int256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0); // Solidity only automatically asserts when dividing by 0 require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow int256 c = a / b; return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Subtracts two signed integers, reverts on overflow. */ 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; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Adds two signed integers, reverts on overflow. */ 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; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Libraries.sol"; import "./Interfaces.sol"; import "./BaseErc20.sol"; abstract contract Taxable is BaseErc20 { ITaxDistributor taxDistributor; bool public autoSwapTax; uint256 public minimumTimeBetweenSwaps; uint256 public minimumTokensBeforeSwap; mapping (address => bool) public excludedFromTax; uint256 swapStartTime; // Overrides function configure(address _owner) internal virtual override { excludedFromTax[_owner] = true; super.configure(_owner); } function calculateTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) { uint256 amountAfterTax = value; if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) { if (exchanges[from]) { // we are BUYING amountAfterTax = taxDistributor.takeBuyTax(value); } else if (exchanges[to]) { // we are SELLING amountAfterTax = taxDistributor.takeSellTax(value); } } uint256 taxAmount = value - amountAfterTax; if (taxAmount > 0) { _balances[address(taxDistributor)] = _balances[address(taxDistributor)] + taxAmount; emit Transfer(from, address(taxDistributor), taxAmount); } return super.calculateTransferAmount(from, to, amountAfterTax); } function preTransfer(address from, address to, uint256 value) override virtual internal { uint256 timeSinceLastSwap = block.timestamp - taxDistributor.lastSwapTime(); if ( launched && autoSwapTax && exchanges[to] && swapStartTime + 60 <= block.timestamp && timeSinceLastSwap >= minimumTimeBetweenSwaps && _balances[address(taxDistributor)] >= minimumTokensBeforeSwap && taxDistributor.inSwap() == false ) { swapStartTime = block.timestamp; try taxDistributor.distribute() {} catch {} } super.preTransfer(from, to, value); } // Public methods /** * @dev Return the current total sell tax from the tax distributor */ function sellTax() external view returns (uint256) { return taxDistributor.getSellTax(); } /** * @dev Return the current total sell tax from the tax distributor */ function buyTax() external view returns (uint256) { return taxDistributor.getBuyTax(); } /** * @dev Return the address of the tax distributor contract */ function taxDistributorAddress() external view returns (address) { return address(taxDistributor); } // Admin methods function setAutoSwaptax(bool enabled) external onlyOwner { autoSwapTax = enabled; } function setExcludedFromTax(address who, bool enabled) external onlyOwner { excludedFromTax[who] = enabled; } function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner { minimumTokensBeforeSwap = minAmount; minimumTimeBetweenSwaps = minTime; } function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner { taxDistributor.setSellTax(taxName, taxAmount); } function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner { taxDistributor.setBuyTax(taxName, taxAmount); } function setTaxWallet(string memory taxName, address wallet) external onlyOwner { taxDistributor.setTaxWallet(taxName, wallet); } function runSwapManually() external isLaunched { taxDistributor.distribute(); } }
//SPDX-License-Identifier: UNLICENSED pragma solidity 0.8.7; import "./Interfaces.sol"; import "./Libraries.sol"; contract TaxDistributor is ITaxDistributor { address immutable public tokenPair; address immutable public routerAddress; address immutable private _token; address immutable private _wbnb; IDEXRouter private _router; bool public override inSwap; uint256 public override lastSwapTime; uint256 immutable public maxSellTax; uint256 immutable public maxBuyTax; enum TaxType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN } struct Tax { string taxName; uint256 buyTaxPercentage; uint256 sellTaxPercentage; uint256 taxPool; TaxType taxType; address location; uint256 share; bool convertToNative; } Tax[] public taxes; event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived); event DistributionError(string text); modifier onlyToken() { require(msg.sender == _token, "no permissions"); _; } modifier swapLock() { require(inSwap == false, "already swapping"); inSwap = true; _; inSwap = false; } constructor (address router, address pair, address wbnb, uint256 _maxSellTax, uint256 _maxBuyTax) { require(wbnb != address(0), "pairedToken cannot be 0 address"); require(pair != address(0), "pair cannot be 0 address"); require(router != address(0), "router cannot be 0 address"); _token = msg.sender; _wbnb = wbnb; _router = IDEXRouter(router); maxSellTax = _maxSellTax; maxBuyTax = _maxBuyTax; tokenPair = pair; routerAddress = router; } receive() external override payable {} function createWalletTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.WALLET, wallet, 0, convertToNative)); } function createDistributorTax(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DISTRIBUTOR, wallet, 0, convertToNative)); } function createDividendTax(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.DIVIDEND, dividendDistributor, 0, convertToNative)); } function createBurnTax(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.BURN, address(0), 0, false)); } function createLiquidityTax(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken { taxes.push(Tax(name, buyTax, sellTax, 0, TaxType.LIQUIDITY, holder, 0, false)); } function distribute() external payable override onlyToken swapLock { address[] memory path = new address[](2); path[0] = _token; path[1] = _wbnb; IERC20 token = IERC20(_token); uint256 totalTokens; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.LIQUIDITY) { uint256 half = taxes[i].taxPool / 2; totalTokens += taxes[i].taxPool - half; } else if (taxes[i].convertToNative) { totalTokens += taxes[i].taxPool; } } totalTokens = checkTokenAmount(token, totalTokens); if (checkTokenAmount(token, totalTokens) != totalTokens) { emit DistributionError("Insufficient tokens to swap. Please add more tokens"); return; } uint256[] memory amts = _router.swapExactTokensForETH( totalTokens, 0, path, address(this), block.timestamp + 300 ); uint256 amountBNB = address(this).balance; if (totalTokens != amts[0] || amountBNB != amts[1] ) { emit DistributionError("Unexpected amounts returned from swap"); } // Calculate the distribution uint256 toDistribute = amountBNB; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].convertToNative || taxes[i].taxType == TaxType.LIQUIDITY) { if (i == taxes.length - 1) { taxes[i].share = toDistribute; } else if (taxes[i].taxType == TaxType.LIQUIDITY) { uint256 half = taxes[i].taxPool / 2; uint256 share = (amountBNB * (taxes[i].taxPool - half)) / totalTokens; taxes[i].share = share; toDistribute = toDistribute - share; } else { uint256 share = (amountBNB * taxes[i].taxPool) / totalTokens; taxes[i].share = share; toDistribute = toDistribute - share; } } } // Distribute the coins for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.WALLET) { if (taxes[i].convertToNative) { payable(taxes[i].location).transfer(taxes[i].share); } else { token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.DISTRIBUTOR) { if (taxes[i].convertToNative) { payable(taxes[i].location).transfer(taxes[i].share); } else { token.approve(taxes[i].location, taxes[i].taxPool); IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.DIVIDEND) { if (taxes[i].convertToNative) { IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}(); } else { IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool)); } } else if (taxes[i].taxType == TaxType.BURN) { IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool)); } else if (taxes[i].taxType == TaxType.LIQUIDITY) { if(taxes[i].share > 0){ uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2); _router.addLiquidityETH{value: taxes[i].share}( _token, half, 0, 0, taxes[i].location, block.timestamp + 300 ); } } taxes[i].taxPool = 0; taxes[i].share = 0; } emit TaxesDistributed(totalTokens, amountBNB); lastSwapTime = block.timestamp; } function getSellTax() public override onlyToken view returns (uint256) { uint256 taxAmount; for (uint256 i = 0; i < taxes.length; i++) { taxAmount += taxes[i].sellTaxPercentage; } return taxAmount; } function getBuyTax() public override onlyToken view returns (uint256) { uint256 taxAmount; for (uint256 i = 0; i < taxes.length; i++) { taxAmount += taxes[i].buyTaxPercentage; } return taxAmount; } function setTaxWallet(string memory taxName, address wallet) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].taxType == TaxType.WALLET && compareStrings(taxes[i].taxName, taxName)) { taxes[i].location = wallet; updated = true; } } require(updated, "could not find tax to update"); } function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { if (compareStrings(taxes[i].taxName, taxName)) { taxes[i].sellTaxPercentage = taxPercentage; updated = true; } } require(updated, "could not find tax to update"); require(getSellTax() <= maxSellTax, "tax cannot be set this high"); } function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken { bool updated; for (uint256 i = 0; i < taxes.length; i++) { //if (taxes[i].taxName == taxName) { if (compareStrings(taxes[i].taxName, taxName)) { taxes[i].buyTaxPercentage = taxPercentage; updated = true; } } require(updated, "could not find tax to update"); require(getBuyTax() <= maxBuyTax, "tax cannot be set this high"); } function takeSellTax(uint256 value) external override onlyToken returns (uint256) { for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].sellTaxPercentage > 0) { uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000; taxes[i].taxPool += taxAmount; value = value - taxAmount; } } return value; } function takeBuyTax(uint256 value) external override onlyToken returns (uint256) { for (uint256 i = 0; i < taxes.length; i++) { if (taxes[i].buyTaxPercentage > 0) { uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000; taxes[i].taxPool += taxAmount; value = value - taxAmount; } } return value; } // Private methods function compareStrings(string memory a, string memory b) private pure returns (bool) { return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b)))); } function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) { uint256 balance = token.balanceOf(address(this)); if (balance > amount) { return amount; } return balance; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"changeOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"antiBot","type":"address"}],"name":"configurePinkAntiBot","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":[],"name":"enableBlockLogProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableHighTaxCountdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePinkAntiBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSniperBlocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"isNeverSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"pinkAntiBot","outputs":[{"internalType":"contract IPinkAntiBot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeBnb","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"runSwapManually","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlockLogProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setHighTaxCountdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setIsSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMhPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMsPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNeverSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setPinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSniperBlocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxDistributorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transactionBlockLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526006805460ff60a81b1916600160a81b1790553480156200002457600080fd5b506200004473a281151c22a70d6743f5b31bc4e3958ce368198562000689565b604080518082019091526007808252664e4555524f4e4960c81b6020909201918252620000749160049162000869565b5060408051808201909152600a808252694e6575726f6e692e414960b01b6020909201918252620000a89160059162000869565b506006805460ff191660121790556000620000c2620006a2565b905060008190506000816001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b1580156200010557600080fd5b505afa1580156200011a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200014091906200091d565b90506000826001600160a01b031663c45a01556040518163ffffffff1660e01b815260040160206040518083038186803b1580156200017e57600080fd5b505afa15801562000193573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001b991906200091d565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c6539690604401602060405180830381600087803b1580156200020557600080fd5b505af11580156200021a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200024091906200091d565b6001600160a01b03811660009081526009602052604090819020805460ff19166001179055519091508490829084906105149081906200028090620008f8565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103906000f080158015620002cb573d6000803e3d6000fd5b50601580546001600160a01b03929092166001600160a01b031990921682179055600a805460ff60a81b1916600160a81b178155600091825260126020526040909120805460ff1916600117905561012c600c819055601655600654620003399160ff9190911690620009b3565b62000347906103e862000a74565b601755601580546001600160a01b0390811660009081526018602052604090819020805460ff1916600190811790915592549051634693167f60e11b815260a06004820152600760a482015266125b9cda59da1d60ca1b60c482015260be60248201526101c8604482015273c6467b4f00ca55c5548fb7bd872c872b63841eb9606482015260848101939093521690638d262cfe9060e401600060405180830381600087803b158015620003fa57600080fd5b505af11580156200040f573d6000803e3d6000fd5b5050601554604051634693167f60e11b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c482015260b960248201526101bc604482015273e53820cadd647d99b1bd98a29af7be87e497cf0f6064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b158015620004a357600080fd5b505af1158015620004b8573d6000803e3d6000fd5b5050601554604051634693167f60e11b815260a06004820152600360a4820152622232bb60e91b60c4820152607d602482015261012c60448201527308a3351e0c1eb65c5d80d568adbe97810820d7e36064820152600160848201526001600160a01b039091169250638d262cfe915060e401600060405180830381600087803b1580156200054657600080fd5b505af11580156200055b573d6000803e3d6000fd5b50506015805460ff60a01b19811682556001600160a01b039081166000908152601460209081526040808320805460ff19166001908117909155945484168352938152838220928a168252919091522060001990555050600654620005c59060ff16600a620009b3565b620005d4906298968062000a74565b600254620005e391906200094f565b600281905560065461010090046001600160a01b03166000908152602081905260409020546200061491906200094f565b600680546001600160a01b03610100918290048116600090815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef916200067791815260200190565b60405180910390a35050505062000ae9565b6200069f816200077060201b62001b691760201c565b50565b60004660011480620006b45750466003145b80620006c05750466004145b80620006cc5750466005145b15620006eb5750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b46603814156200070e57507310ed43c718714eb63d5aa57b78b54704e256024e90565b466061141562000731575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b60405162461bcd60e51b815260206004820152601060248201526f155b9adb9bdddb8810da185a5b88125160821b604482015260640160405180910390fd5b6001600160a01b0381166000908152601860209081526040909120805460ff191660011790556200069f90829062001b91620007ac821b17901c565b6001600160a01b0381166000908152601460209081526040909120805460ff191660011790556200069f90829062001bb9620007e8821b17901c565b6001600160a01b0381166000908152601260209081526040909120805460ff191660011790556200069f90829062001be162000824821b17901c565b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b828054620008779062000a96565b90600052602060002090601f0160209004810192826200089b5760008555620008e6565b82601f10620008b657805160ff1916838001178555620008e6565b82800160010185558215620008e6579182015b82811115620008e6578251825591602001919060010190620008c9565b50620008f492915062000906565b5090565b612dca80620039b383390190565b5b80821115620008f4576000815560010162000907565b6000602082840312156200093057600080fd5b81516001600160a01b03811681146200094857600080fd5b9392505050565b6000821982111562000965576200096562000ad3565b500190565b600181815b80851115620009ab5781600019048211156200098f576200098f62000ad3565b808516156200099d57918102915b93841c93908002906200096f565b509250929050565b60006200094860ff841683600082620009cf5750600162000a6e565b81620009de5750600062000a6e565b8160018114620009f7576002811462000a025762000a22565b600191505062000a6e565b60ff84111562000a165762000a1662000ad3565b50506001821b62000a6e565b5060208310610133831016604e8410600b841016171562000a47575081810a62000a6e565b62000a5383836200096a565b806000190482111562000a6a5762000a6a62000ad3565b0290505b92915050565b600081600019048311821515161562000a915762000a9162000ad3565b500290565b600181811c9082168062000aab57607f821691505b6020821081141562000acd57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b612eba8062000af96000396000f3fe608060405234801561001057600080fd5b50600436106103fc5760003560e01c80636b8f2f3b11610215578063c2ed286b11610125578063db38a41d116100b8578063e79d416011610087578063e79d4160146108f9578063e948474b14610902578063ede49a1914610925578063f19fffcb14610939578063f1f5cd911461094d57600080fd5b8063db38a41d1461088f578063dba61c58146108af578063dd62ed3e146108b8578063e53be8d1146108f157600080fd5b8063d00efb2f116100f4578063d00efb2f14610857578063d2d7ad8314610860578063d31acb2814610869578063d3b0066f1461087c57600080fd5b8063c2ed286b14610820578063c4a5abcd14610833578063c552f4c51461083c578063cc1776d31461084f57600080fd5b806389d53c01116101a8578063a457c2d711610177578063a457c2d7146107b1578063a6f9dae1146107c4578063a9059cbb146107d7578063b0ad3ebf146107ea578063c20c5caf1461080d57600080fd5b806389d53c011461075b5780638da5cb5b1461076e57806395d89b4114610786578063989763ef1461078e57600080fd5b8063790ca413116101e4578063790ca4131461071857806379cc6790146107215780638091f3bf14610734578063810453451461074857600080fd5b80636b8f2f3b146106b05780636f864552146106c457806370a08231146106cc5780637412dbb3146106f557600080fd5b8063395093511161031057806352c6dbc4116102a35780635d9d7d43116102725780635d9d7d43146106665780635e45da23146106795780636331bf65146106825780636508c57e1461068a5780636a092e791461069d57600080fd5b806352c6dbc4146106195780635543379a1461062d578063583dd79d146106405780635d90bbaf1461065357600080fd5b806345541cba116102df57806345541cba146105e25780634f7041a5146105eb5780634f72e2a2146105f35780634fbc27751461060657600080fd5b806339509351146105a1578063407133d2146105b457806342966c68146105c7578063442ef7d2146105da57600080fd5b806318551108116103935780632b750627116103625780632b7506271461051557806330bd85c514610538578063313ce5671461054c5780633164df8b1461056b578063368274991461058e57600080fd5b806318551108146104b75780631e19ae77146104dc57806323b872dd146104ef57806328be90381461050257600080fd5b8063095ea7b3116103cf578063095ea7b31461045c5780630f3a325f1461046f5780631776834a1461049257806318160ddd146104a557600080fd5b806301339c2114610401578063064a59d01461040b57806306fdde031461043457806307a1cfbd14610449575b600080fd5b610409610955565b005b60065461041f90600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b61043c610997565b60405161042b9190612c39565b610409610457366004612b53565b610a25565b61041f61046a366004612aaa565b610abc565b61041f61047d3660046129e2565b60116020526000908152604090205460ff1681565b6104096104a0366004612b98565b610bb0565b6002545b60405190815260200161042b565b6015546001600160a01b03165b6040516001600160a01b03909116815260200161042b565b6104096104ea366004612a73565b610be4565b61041f6104fd366004612a37565b610c3e565b610409610510366004612a73565b610d69565b61041f6105233660046129e2565b60126020526000908152604090205460ff1681565b600a5461041f90600160c01b900460ff1681565b6006546105599060ff1681565b60405160ff909116815260200161042b565b61041f6105793660046129e2565b60146020526000908152604090205460ff1681565b61040961059c366004612ad4565b610dc3565b61041f6105af366004612aaa565b610e10565b600a546104c4906001600160a01b031681565b6104096105d5366004612b98565b610f24565b610409610f86565b6104a9600b5481565b6104a961105b565b610409610601366004612ad4565b6110dd565b610409610614366004612a73565b61112a565b600a5461041f90600160b01b900460ff1681565b61040961063b366004612ad4565b611184565b61040961064e366004612b0e565b6111d1565b610409610661366004612a73565b611232565b610409610674366004612a73565b61128c565b6104a9600d5481565b6104a96112e6565b610409610698366004612b53565b611305565b61041f6106ab366004612a04565b611366565b60155461041f90600160a01b900460ff1681565b6104a96114a0565b6104a96106da3660046129e2565b6001600160a01b031660009081526020819052604090205490565b61041f6107033660046129e2565b60096020526000908152604090205460ff1681565b6104a9600e5481565b61040961072f366004612aaa565b6114b5565b60065461041f90600160b01b900460ff1681565b610409610756366004612b98565b6115b4565b610409610769366004612ad4565b6115e8565b6006546104c49061010090046001600160a01b031681565b61043c61168e565b61041f61079c3660046129e2565b60186020526000908152604090205460ff1681565b61041f6107bf366004612aaa565b61169b565b6104096107d23660046129e2565b61176a565b61041f6107e5366004612aaa565b611810565b61041f6107f83660046129e2565b60076020526000908152604090205460ff1681565b61040961081b366004612b98565b61189f565b61040961082e366004612a73565b6118d3565b6104a9600c5481565b61040961084a366004612ad4565b61192d565b6104a961197a565b6104a9600f5481565b6104a960175481565b610409610877366004612bca565b6119bf565b61040961088a3660046129e2565b6119f9565b6104a961089d3660046129e2565b60136020526000908152604090205481565b6104a960165481565b6104a96108c6366004612a04565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610409611abf565b6104a960105481565b61041f6109103660046129e2565b60086020526000908152604090205460ff1681565b600a5461041f90600160a81b900460ff1681565b600a5461041f90600160b81b900460ff1681565b6104a9611b31565b60065461010090046001600160a01b0316331461098d5760405162461bcd60e51b815260040161098490612cfc565b60405180910390fd5b610995611c26565b565b600580546109a490612db4565b80601f01602080910402602001604051908101604052809291908181526020018280546109d090612db4565b8015610a1d5780601f106109f257610100808354040283529160200191610a1d565b820191906000526020600020905b815481529060010190602001808311610a0057829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610a545760405162461bcd60e51b815260040161098490612cfc565b6015546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610a869085908590600401612c76565b600060405180830381600087803b158015610aa057600080fd5b505af1158015610ab4573d6000803e3d6000fd5b505050505050565b6006546000903390600160a81b900460ff168015610ae35750600654600160b01b900460ff165b80610b0057506006546001600160a01b0382811661010090920416145b80610b1a57503360009081526007602052604090205460ff165b610b365760405162461bcd60e51b815260040161098490612ccf565b6001600160a01b038416610b5c5760405162461bcd60e51b815260040161098490612c98565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902087905551868152919291600080516020612e6583398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610bdf5760405162461bcd60e51b815260040161098490612cfc565b600d55565b60065461010090046001600160a01b03163314610c135760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b6006546000908490600160a81b900460ff168015610c655750600654600160b01b900460ff165b80610c8257506006546001600160a01b0382811661010090920416145b80610c9c57503360009081526007602052604090205460ff165b610cb85760405162461bcd60e51b815260040161098490612ccf565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610ce7908490612d9d565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610d16858585611c67565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020612e65833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610d985760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610df25760405162461bcd60e51b815260040161098490612cfc565b600a8054911515600160b81b0260ff60b81b19909216919091179055565b6006546000903390600160a81b900460ff168015610e375750600654600160b01b900460ff165b80610e5457506006546001600160a01b0382811661010090920416145b80610e6e57503360009081526007602052604090205460ff165b610e8a5760405162461bcd60e51b815260040161098490612ccf565b6001600160a01b038416610eb05760405162461bcd60e51b815260040161098490612c98565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610edf908490612d44565b3360008181526001602090815260408083206001600160a01b038a1680855290835292819020859055519384529092600080516020612e658339815191529101610b9e565b3360009081526014602052604090205460ff16610f795760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610984565b610f833382611e80565b50565b600654600160b01b900460ff16610ff15760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610984565b601560009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b50505050565b60155460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b1580156110a057600080fd5b505afa1580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d89190612bb1565b905090565b60065461010090046001600160a01b0316331461110c5760405162461bcd60e51b815260040161098490612cfc565b60158054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146111595760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146111b35760405162461bcd60e51b815260040161098490612cfc565b600a8054911515600160b01b0260ff60b01b19909216919091179055565b60065461010090046001600160a01b031633146112005760405162461bcd60e51b815260040161098490612cfc565b60155460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610a869085908590600401612c4c565b60065461010090046001600160a01b031633146112615760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146112bb5760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6000612710600c546002546112fb9190612d7e565b6110d89190612d5c565b60065461010090046001600160a01b031633146113345760405162461bcd60e51b815260040161098490612cfc565b60155460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610a869085908590600401612c76565b60065460009061010090046001600160a01b031633146113985760405162461bcd60e51b815260040161098490612cfc565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b1580156113da57600080fd5b505afa1580156113ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114129190612bb1565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114989190612af1565b949350505050565b6000612710600b546002546112fb9190612d7e565b3360009081526014602052604090205460ff1661150a5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610984565b6001600160a01b0382166000908152600160209081526040808320338452909152902054611539908290612d9d565b6001600160a01b03831660009081526001602090815260408083203384529091529020556115678282611e80565b6001600160a01b03821660008181526001602090815260408083203380855290835292819020549051908152919291600080516020612e6583398151915291015b60405180910390a35050565b60065461010090046001600160a01b031633146115e35760405162461bcd60e51b815260040161098490612cfc565b600c55565b60065461010090046001600160a01b031633146116175760405162461bcd60e51b815260040161098490612cfc565b600a54600160a01b900460ff166116705760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610984565b600a8054911515600160c01b0260ff60c01b19909216919091179055565b600480546109a490612db4565b6006546000903390600160a81b900460ff1680156116c25750600654600160b01b900460ff165b806116df57506006546001600160a01b0382811661010090920416145b806116f957503360009081526007602052604090205460ff165b6117155760405162461bcd60e51b815260040161098490612ccf565b6001600160a01b03841661173b5760405162461bcd60e51b815260040161098490612c98565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610edf908490612d9d565b60065461010090046001600160a01b031633146117995760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b0381166117e85760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610984565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6006546000903390600160a81b900460ff1680156118375750600654600160b01b900460ff165b8061185457506006546001600160a01b0382811661010090920416145b8061186e57503360009081526007602052604090205460ff165b61188a5760405162461bcd60e51b815260040161098490612ccf565b611895338585611c67565b5060019392505050565b60065461010090046001600160a01b031633146118ce5760405162461bcd60e51b815260040161098490612cfc565b600b55565b60065461010090046001600160a01b031633146119025760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b0316331461195c5760405162461bcd60e51b815260040161098490612cfc565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6015546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b1580156110a057600080fd5b60065461010090046001600160a01b031633146119ee5760405162461bcd60e51b815260040161098490612cfc565b601791909155601655565b60065461010090046001600160a01b03163314611a285760405162461bcd60e51b815260040161098490612cfc565b600a80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015611a8957600080fd5b505af1158015611a9d573d6000803e3d6000fd5b5050600a805464ff000000ff60a01b191664010000000160a01b179055505050565b60065461010090046001600160a01b03163314611aee5760405162461bcd60e51b815260040161098490612cfc565b600654604051479161010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015611b2d573d6000803e3d6000fd5b5050565b600654600090600160b01b900460ff1615611b63576003600f5443611b569190612d9d565b1015611b6357506126ac90565b50600090565b6001600160a01b0381166000908152601860205260409020805460ff19166001179055610f83815b6001600160a01b0381166000908152601460205260409020805460ff19166001179055610f83815b6001600160a01b0381166000908152601260205260409020805460ff19166001179055610f83815b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b60065461010090046001600160a01b03163314611c555760405162461bcd60e51b815260040161098490612cfc565b611c5d611f02565b42600e5543600f55565b6001600160a01b038216611cb65760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610984565b6001600160a01b03831660009081526008602052604090205460ff1615611d1f5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610984565b60035460ff1615611dc5576001600160a01b038316600090815260208190526040902054611d4e908290612d9d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d7e908290612d44565b6001600160a01b03838116600081815260208181526040918290209490945551848152909291861691600080516020612e45833981519152910160405180910390a3505050565b611dd0838383611f46565b6000611ddd848484611f51565b6001600160a01b038516600090815260208190526040902054909150611e04908390612d9d565b6001600160a01b038086166000908152602081905260408082209390935590851681522054611e34908290612d44565b6001600160a01b03848116600081815260208181526040918290209490945551848152909291871691600080516020612e45833981519152910160405180910390a3611055565b505050565b6001600160a01b038216611e9357600080fd5b80600254611ea19190612d9d565b6002556001600160a01b038216600090815260208190526040902054611ec8908290612d9d565b6001600160a01b0383166000818152602081815260408083209490945592518481529092600080516020612e4583398151915291016115a8565b60065461010090046001600160a01b03163314611f315760405162461bcd60e51b815260040161098490612cfc565b6006805460ff60b01b1916600160b01b179055565b611e7b838383611f5e565b600061149884848461217a565b60155460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b158015611fa357600080fd5b505afa158015611fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdb9190612bb1565b611fe59042612d9d565b600654909150600160b01b900460ff16801561200a5750601554600160a01b900460ff165b801561202e57506001600160a01b03831660009081526009602052604090205460ff165b8015612048575042601954603c6120459190612d44565b11155b801561205657506016548110155b801561207e57506017546015546001600160a01b031660009081526020819052604090205410155b801561210d5750601560009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b1580156120d357600080fd5b505afa1580156120e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210b9190612af1565b155b1561216f57426019556015546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561215c57600080fd5b505af192505050801561216d575060015b505b6110558484846123bb565b6001600160a01b038316600090815260186020526040812054829060ff161580156121be57506001600160a01b03841660009081526018602052604090205460ff16155b80156121d35750600654600160b01b900460ff165b15612320576001600160a01b03851660009081526009602052604090205460ff161561227e5760155460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b15801561223f57600080fd5b505af1158015612253573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122779190612bb1565b9050612320565b6001600160a01b03841660009081526009602052604090205460ff161561232057601554604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b1580156122e557600080fd5b505af11580156122f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231d9190612bb1565b90505b600061232c8285612d9d565b905080156123a6576015546001600160a01b031660009081526020819052604090205461235a908290612d44565b601580546001600160a01b039081166000908152602081815260409182902094909455915491518481529181169290891691600080516020612e45833981519152910160405180910390a35b6123b18686846127e4565b9695505050505050565b600a54600160a81b900460ff1615806123e457503360009081526011602052604090205460ff16155b6124225760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610984565b600654600160b01b900460ff16801561244e57506006546001600160a01b038481166101009092041614155b801561247357506001600160a01b03831660009081526012602052604090205460ff16155b801561249857506001600160a01b03821660009081526012602052604090205460ff16155b15611e7b57600d54156124f757600d545a11156124f75760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610984565b6000600c5411801561252257506001600160a01b03821660009081526009602052604090205460ff16155b156125a15761252f6112e6565b6001600160a01b038316600090815260208190526040902054612553908390612d44565b11156125a15760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610984565b6000600b541180156125cb57506001600160a01b03821660009081526009602052604090205460ff165b15612627576125d86114a0565b8111156126275760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610984565b600a54600160b01b900460ff161561275f576001600160a01b038216600090815260136020526040902054431415612690576001600160a01b0382166000908152601160205260408120805460ff19166001179055601080549161268a83612def565b91905055505b6001600160a01b0383166000908152601360205260409020544314156126e7576001600160a01b0383166000908152601160205260408120805460ff1916600117905560108054916126e183612def565b91905055505b6001600160a01b03821660009081526009602052604090205460ff16612723576001600160a01b03821660009081526013602052604090204390555b6001600160a01b03831660009081526009602052604090205460ff1661275f576001600160a01b03831660009081526013602052604090204390555b600a54600160c01b900460ff1615611e7b57600a5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b1580156127c757600080fd5b505af11580156127db573d6000803e3d6000fd5b50505050505050565b6006546000908290600160b01b900460ff16801561280b5750600a54600160b81b900460ff165b156128ba576006546001600160a01b03868116610100909204161480159061283a57506000612838611b31565b115b801561285f57506001600160a01b03851660009081526012602052604090205460ff16155b801561288457506001600160a01b03841660009081526012602052604090205460ff16155b156128ba576000612710612896611b31565b6128a09086612d7e565b6128aa9190612d5c565b90506128b68183612d9d565b9150505b6128c58585836128ce565b95945050505050565b6000826001600160a01b0316846001600160a01b031614156129325760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610984565b5092915050565b80356001600160a01b038116811461295057600080fd5b919050565b600082601f83011261296657600080fd5b813567ffffffffffffffff8082111561298157612981612e20565b604051601f8301601f19908116603f011681019082821181831017156129a9576129a9612e20565b816040528381528660208588010111156129c257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156129f457600080fd5b6129fd82612939565b9392505050565b60008060408385031215612a1757600080fd5b612a2083612939565b9150612a2e60208401612939565b90509250929050565b600080600060608486031215612a4c57600080fd5b612a5584612939565b9250612a6360208501612939565b9150604084013590509250925092565b60008060408385031215612a8657600080fd5b612a8f83612939565b91506020830135612a9f81612e36565b809150509250929050565b60008060408385031215612abd57600080fd5b612ac683612939565b946020939093013593505050565b600060208284031215612ae657600080fd5b81356129fd81612e36565b600060208284031215612b0357600080fd5b81516129fd81612e36565b60008060408385031215612b2157600080fd5b823567ffffffffffffffff811115612b3857600080fd5b612b4485828601612955565b925050612a2e60208401612939565b60008060408385031215612b6657600080fd5b823567ffffffffffffffff811115612b7d57600080fd5b612b8985828601612955565b95602094909401359450505050565b600060208284031215612baa57600080fd5b5035919050565b600060208284031215612bc357600080fd5b5051919050565b60008060408385031215612bdd57600080fd5b50508035926020909101359150565b6000815180845260005b81811015612c1257602081850181015186830182015201612bf6565b81811115612c24576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006129fd6020830184612bec565b604081526000612c5f6040830185612bec565b905060018060a01b03831660208301529392505050565b604081526000612c896040830185612bec565b90508260208301529392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b60008219821115612d5757612d57612e0a565b500190565b600082612d7957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612d9857612d98612e0a565b500290565b600082821015612daf57612daf612e0a565b500390565b600181811c90821680612dc857607f821691505b60208210811415612de957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e0357612e03612e0a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610f8357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122068a80a1989a1410dbf7da15ff8136c9a0f5371b73833d195d6fcb8d2ba8871c564736f6c634300080700336101406040523480156200001257600080fd5b5060405162002dca38038062002dca8339810160408190526200003591620001b5565b6001600160a01b038316620000915760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e95760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000088565b6001600160a01b038516620001415760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000088565b33606090811b60c0526001600160601b031993811b841660e052600080546001600160a01b0388166001600160a01b0319909116179055610100929092526101205291821b811660805291901b1660a05262000212565b80516001600160a01b0381168114620001b057600080fd5b919050565b600080600080600060a08688031215620001ce57600080fd5b620001d98662000198565b9450620001e96020870162000198565b9350620001f96040870162000198565b6060870151608090970151959894975095949392505050565b60805160601c60a05160601c60c05160601c60e05160601c6101005161012051612ad7620002f36000396000818161032a01526105930152600081816102ad0152610bdb0152600061104f015260008181610424015281816106180152818161079601528181610836015281816108ba015281816109e101528181610b1501528181610c0d01528181610c9101528181610e1f01528181610f3c01528181610ffb0152818161109b01528181611a0601528181611ca401528181611df101528181611fbf0152612136015260006101e1015260006103d70152612ad76000f3fe6080604052600436106101235760003560e01c8063a411209a116100a0578063db017dc711610064578063db017dc71461037d578063e4fc6b6d1461039d578063ed4ce99e146103a5578063ee16c160146103c5578063fb5a780c146103f957600080fd5b8063a411209a1461029b578063b0bc85de146102cf578063c5be2bc7146102e4578063c8e956ab14610318578063d83067861461034c57600080fd5b80633268cc56116100e75780633268cc56146101cf5780634fa26fd51461021b578063583dd79d1461023b5780636508c57e1461025b5780638d262cfe1461027b57600080fd5b806307a1cfbd1461012f5780630dd8715714610151578063135b4fc01461017a578063252d723a1461019a5780632b1fb89e146101af57600080fd5b3661012a57005b600080fd5b34801561013b57600080fd5b5061014f61014a3660046125bc565b610419565b005b34801561015d57600080fd5b5061016760015481565b6040519081526020015b60405180910390f35b34801561018657600080fd5b5061014f6101953660046126b0565b61060d565b3480156101a657600080fd5b50610167610789565b3480156101bb57600080fd5b5061014f6101ca3660046126b0565b61082b565b3480156101db57600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610171565b34801561022757600080fd5b50610167610236366004612726565b6108ad565b34801561024757600080fd5b5061014f61025636600461256e565b6109d6565b34801561026757600080fd5b5061014f6102763660046125bc565b610b0a565b34801561028757600080fd5b5061014f6102963660046126b0565b610c02565b3480156102a757600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b3480156102db57600080fd5b50610167610c84565b3480156102f057600080fd5b506103046102ff366004612726565b610d20565b6040516101719897969594939291906127a2565b34801561032457600080fd5b506101677f000000000000000000000000000000000000000000000000000000000000000081565b34801561035857600080fd5b5060005461036d90600160a01b900460ff1681565b6040519015158152602001610171565b34801561038957600080fd5b50610167610398366004612726565b610e12565b61014f610f31565b3480156103b157600080fd5b5061014f6103c036600461264f565b611fb4565b3480156103d157600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561040557600080fd5b5061014f610414366004612601565b61212b565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461046a5760405162461bcd60e51b815260040161046190612878565b60405180910390fd5b6000805b6002548110156105735761052e6002828154811061048e5761048e612a64565b906000526020600020906007020160000180546104aa906129e2565b80601f01602080910402602001604051908101604052809291908181526020018280546104d6906129e2565b80156105235780601f106104f857610100808354040283529160200191610523565b820191906000526020600020905b81548152906001019060200180831161050657829003601f168201915b505050505085612294565b1561056157826002828154811061054757610547612a64565b906000526020600020906007020160010181905550600191505b8061056b81612a1d565b91505061046e565b50806105915760405162461bcd60e51b815260040161046190612841565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610789565b11156106085760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610461565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146106555760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016003600481111561068f5761068f612a4e565b81526001600160a01b038516602080830191909152600060408301819052851515606090930192909252835460018101855593825290819020825180519394600702909101926106e29284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561072b5761072b612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107d35760405162461bcd60e51b815260040161046190612878565b6000805b60025481101561082557600281815481106107f4576107f4612a64565b906000526020600020906007020160010154826108119190612942565b91508061081d81612a1d565b9150506107d7565b50905090565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108735760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016001600481111561068f5761068f612a4e565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108f75760405162461bcd60e51b815260040161046190612878565b60005b6002548110156109cc5760006002828154811061091957610919612a64565b90600052602060002090600702016002015411156109ba5760006127106002838154811061094957610949612a64565b90600052602060002090600702016002015485610966919061297c565b610970919061295a565b9050806002838154811061098657610986612a64565b906000526020600020906007020160030160008282546109a69190612942565b909155506109b69050818561299b565b9350505b806109c481612a1d565b9150506108fa565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a1e5760405162461bcd60e51b815260040161046190612878565b6000805b600254811015610aec57600060028281548110610a4157610a41612a64565b60009182526020909120600460079092020181015460ff1690811115610a6957610a69612a4e565b148015610a875750610a876002828154811061048e5761048e612a64565b15610ada578260028281548110610aa057610aa0612a64565b906000526020600020906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80610ae481612a1d565b915050610a22565b50806106085760405162461bcd60e51b815260040161046190612841565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610b525760405162461bcd60e51b815260040161046190612878565b6000805b600254811015610bbb57610b766002828154811061048e5761048e612a64565b15610ba9578260028281548110610b8f57610b8f612a64565b906000526020600020906007020160020181905550600191505b80610bb381612a1d565b915050610b56565b5080610bd95760405162461bcd60e51b815260040161046190612841565b7f00000000000000000000000000000000000000000000000000000000000000006105ba610c84565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c4a5760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280878152602001868152602001858152602001600081526020016000600481111561068f5761068f612a4e565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cce5760405162461bcd60e51b815260040161046190612878565b6000805b6002548110156108255760028181548110610cef57610cef612a64565b90600052602060002090600702016002015482610d0c9190612942565b915080610d1881612a1d565b915050610cd2565b60028181548110610d3057600080fd5b9060005260206000209060070201600091509050806000018054610d53906129e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610d7f906129e2565b8015610dcc5780601f10610da157610100808354040283529160200191610dcc565b820191906000526020600020905b815481529060010190602001808311610daf57829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e5c5760405162461bcd60e51b815260040161046190612878565b60005b6002548110156109cc57600060028281548110610e7e57610e7e612a64565b9060005260206000209060070201600101541115610f1f57600061271060028381548110610eae57610eae612a64565b90600052602060002090600702016001015485610ecb919061297c565b610ed5919061295a565b90508060028381548110610eeb57610eeb612a64565b90600052602060002090600702016003016000828254610f0b9190612942565b90915550610f1b9050818561299b565b9350505b80610f2981612a1d565b915050610e5f565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f795760405162461bcd60e51b815260040161046190612878565b600054600160a01b900460ff1615610fc65760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610461565b6000805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061102d5761102d612a64565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061108157611081612a64565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000006000805b6002548110156111f45760028082815481106110dc576110dc612a64565b60009182526020909120600460079092020181015460ff169081111561110457611104612a4e565b1415611180576000600280838154811061112057611120612a64565b90600052602060002090600702016003015461113c919061295a565b9050806002838154811061115257611152612a64565b90600052602060002090600702016003015461116e919061299b565b6111789084612942565b9250506111e2565b6002818154811061119357611193612a64565b600091825260209091206006600790920201015460ff16156111e257600281815481106111c2576111c2612a64565b906000526020600020906007020160030154826111df9190612942565b91505b806111ec81612a1d565b9150506110be565b506111ff82826122ee565b90508061120c83836122ee565b1461129c577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d160405161128c9060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a1505050611fa5565b600080546001600160a01b03166318cbafe5838387306112be4261012c612942565b6040518663ffffffff1660e01b81526004016112de9594939291906128a0565b600060405180830381600087803b1580156112f857600080fd5b505af115801561130c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261133491908101906124a4565b905060004790508160008151811061134e5761134e612a64565b60200260200101518314158061137e57508160018151811061137257611372612a64565b60200260200101518114155b156113f9577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516113f09060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b8060005b60025481101561163f576002818154811061141a5761141a612a64565b600091825260209091206006600790920201015460ff16806114755750600280828154811061144b5761144b612a64565b60009182526020909120600460079092020181015460ff169081111561147357611473612a4e565b145b1561162d576002546114899060019061299b565b8114156114be5781600282815481106114a4576114a4612a64565b90600052602060002090600702016005018190555061162d565b60028082815481106114d2576114d2612a64565b60009182526020909120600460079092020181015460ff16908111156114fa576114fa612a4e565b14156115b8576000600280838154811061151657611516612a64565b906000526020600020906007020160030154611532919061295a565b9050600086826002858154811061154b5761154b612a64565b906000526020600020906007020160030154611567919061299b565b611571908761297c565b61157b919061295a565b9050806002848154811061159157611591612a64565b60009182526020909120600560079092020101556115af818561299b565b9350505061162d565b600085600283815481106115ce576115ce612a64565b906000526020600020906007020160030154856115eb919061297c565b6115f5919061295a565b9050806002838154811061160b5761160b612a64565b6000918252602090912060056007909202010155611629818461299b565b9250505b8061163781612a1d565b9150506113fd565b5060005b600254811015611f605760006002828154811061166257611662612a64565b60009182526020909120600460079092020181015460ff169081111561168a5761168a612a4e565b141561184c57600281815481106116a3576116a3612a64565b600091825260209091206006600790920201015460ff161561175957600281815481106116d2576116d2612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b03166108fc6002838154811061171657611716612a64565b9060005260206000209060070201600501549081150290604051600060405180830381858888f19350505050158015611753573d6000803e3d6000fd5b50611efb565b856001600160a01b031663a9059cbb6002838154811061177b5761177b612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166117ce89600286815481106117b7576117b7612a64565b9060005260206000209060070201600301546122ee565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561181457600080fd5b505af1158015611828573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117539190612551565b60036002828154811061186157611861612a64565b60009182526020909120600460079092020181015460ff169081111561188957611889612a4e565b1415611aaa57600281815481106118a2576118a2612a64565b600091825260209091206006600790920201015460ff16156118d157600281815481106116d2576116d2612a64565b856001600160a01b031663095ea7b3600283815481106118f3576118f3612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166002848154811061192b5761192b612a64565b60009182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401602060405180830381600087803b15801561198557600080fd5b505af1158015611999573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119bd9190612551565b50600281815481106119d1576119d1612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f000000000000000000000000000000000000000000000000000000000000000030611a3d8a600287815481106117b7576117b7612a64565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b600060405180830381600087803b158015611a8d57600080fd5b505af1158015611aa1573d6000803e3d6000fd5b50505050611efb565b600160028281548110611abf57611abf612a64565b60009182526020909120600460079092020181015460ff1690811115611ae757611ae7612a4e565b1415611c5f5760028181548110611b0057611b00612a64565b600091825260209091206006600790920201015460ff1615611bd05760028181548110611b2f57611b2f612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b524660028381548110611b7557611b75612a64565b9060005260206000209060070201600501546040518263ffffffff1660e01b81526004016000604051808303818588803b158015611bb257600080fd5b505af1158015611bc6573d6000803e3d6000fd5b5050505050611efb565b60028181548110611be357611be3612a64565b906000526020600020906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea30611c2e89600286815481106117b7576117b7612a64565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401611a73565b600460028281548110611c7457611c74612a64565b60009182526020909120600460079092020181015460ff1690811115611c9c57611c9c612a4e565b1415611d06577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611ce888600285815481106117b7576117b7612a64565b6040518263ffffffff1660e01b8152600401611a7391815260200190565b6002808281548110611d1a57611d1a612a64565b60009182526020909120600460079092020181015460ff1690811115611d4257611d42612a4e565b1415611efb57600060028281548110611d5d57611d5d612a64565b9060005260206000209060070201600501541115611efb576000611db0876002808581548110611d8f57611d8f612a64565b906000526020600020906007020160030154611dab919061295a565b6122ee565b600054600280549293506001600160a01b039091169163f305d719919085908110611ddd57611ddd612a64565b9060005260206000209060070201600501547f00000000000000000000000000000000000000000000000000000000000000008460008060028981548110611e2757611e27612a64565b600091825260209091206007909102016004015461010090046001600160a01b0316611e554261012c612942565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c4016060604051808303818588803b158015611ebd57600080fd5b505af1158015611ed1573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190611ef69190612758565b505050505b600060028281548110611f1057611f10612a64565b906000526020600020906007020160030181905550600060028281548110611f3a57611f3a612a64565b600091825260209091206005600790920201015580611f5881612a1d565b915050611643565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a1505042600155505050505b6000805460ff60a01b19169055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611ffc5760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280868152602001858152602001848152602001600081526020016002600481111561203657612036612a4e565b81526001600160a01b0384166020808301919091526000604083018190526060909201829052835460018101855593825290819020825180519394600702909101926120859284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff021916908360048111156120ce576120ce612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146121735760405162461bcd60e51b815260040161046190612878565b6002604051806101000160405280858152602001848152602001838152602001600081526020016004808111156121ac576121ac612a4e565b8152600060208083018290526040830182905260609092018190528354600181018555938152819020825180519394600702909101926121ef9284920190612384565b5060208201518160010155604082015181600201556060820151816003015560808201518160040160006101000a81548160ff0219169083600481111561223857612238612a4e565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b6000816040516020016122a79190612786565b60405160208183030381529060405280519060200120836040516020016122ce9190612786565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b815230600482015260009081906001600160a01b038516906370a082319060240160206040518083038186803b15801561233257600080fd5b505afa158015612346573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061236a919061273f565b90508281111561237d57829150506122e8565b9392505050565b828054612390906129e2565b90600052602060002090601f0160209004810192826123b257600085556123f8565b82601f106123cb57805160ff19168380011785556123f8565b828001600101855582156123f8579182015b828111156123f85782518255916020019190600101906123dd565b50612404929150612408565b5090565b5b808211156124045760008155600101612409565b80356001600160a01b03811681146109d157600080fd5b600082601f83011261244557600080fd5b813567ffffffffffffffff81111561245f5761245f612a7a565b612472601f8201601f1916602001612911565b81815284602083860101111561248757600080fd5b816020850160208301376000918101602001919091529392505050565b600060208083850312156124b757600080fd5b825167ffffffffffffffff808211156124cf57600080fd5b818501915085601f8301126124e357600080fd5b8151818111156124f5576124f5612a7a565b8060051b9150612506848301612911565b8181528481019084860184860187018a101561252157600080fd5b600095505b83861015612544578051835260019590950194918601918601612526565b5098975050505050505050565b60006020828403121561256357600080fd5b815161237d81612a90565b6000806040838503121561258157600080fd5b823567ffffffffffffffff81111561259857600080fd5b6125a485828601612434565b9250506125b36020840161241d565b90509250929050565b600080604083850312156125cf57600080fd5b823567ffffffffffffffff8111156125e657600080fd5b6125f285828601612434565b95602094909401359450505050565b60008060006060848603121561261657600080fd5b833567ffffffffffffffff81111561262d57600080fd5b61263986828701612434565b9660208601359650604090950135949350505050565b6000806000806080858703121561266557600080fd5b843567ffffffffffffffff81111561267c57600080fd5b61268887828801612434565b94505060208501359250604085013591506126a56060860161241d565b905092959194509250565b600080600080600060a086880312156126c857600080fd5b853567ffffffffffffffff8111156126df57600080fd5b6126eb88828901612434565b95505060208601359350604086013592506127086060870161241d565b9150608086013561271881612a90565b809150509295509295909350565b60006020828403121561273857600080fd5b5035919050565b60006020828403121561275157600080fd5b5051919050565b60008060006060848603121561276d57600080fd5b8351925060208401519150604084015190509250925092565b600082516127988184602087016129b2565b9190910192915050565b60006101008083528a51808285015261012091506127c68183860160208f016129b2565b602084018b9052604084018a905260608401899052601f01601f191683010190506005861061280557634e487b7160e01b600052602160045260246000fd5b85608083015261282060a08301866001600160a01b03169052565b8360c083015261283460e083018415159052565b9998505050505050505050565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156128f05784516001600160a01b0316835293830193918301916001016128cb565b50506001600160a01b03969096166060850152505050608001529392505050565b604051601f8201601f1916810167ffffffffffffffff8111828210171561293a5761293a612a7a565b604052919050565b6000821982111561295557612955612a38565b500190565b60008261297757634e487b7160e01b600052601260045260246000fd5b500490565b600081600019048311821515161561299657612996612a38565b500290565b6000828210156129ad576129ad612a38565b500390565b60005b838110156129cd5781810151838201526020016129b5565b838111156129dc576000848401525b50505050565b600181811c908216806129f657607f821691505b60208210811415612a1757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612a3157612a31612a38565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114612a9e57600080fd5b5056fea2646970667358221220dee1094e34294ea839b72410c4eb0b66574eb8a52d3921e7b270f1fd8dda977064736f6c63430008070033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103fc5760003560e01c80636b8f2f3b11610215578063c2ed286b11610125578063db38a41d116100b8578063e79d416011610087578063e79d4160146108f9578063e948474b14610902578063ede49a1914610925578063f19fffcb14610939578063f1f5cd911461094d57600080fd5b8063db38a41d1461088f578063dba61c58146108af578063dd62ed3e146108b8578063e53be8d1146108f157600080fd5b8063d00efb2f116100f4578063d00efb2f14610857578063d2d7ad8314610860578063d31acb2814610869578063d3b0066f1461087c57600080fd5b8063c2ed286b14610820578063c4a5abcd14610833578063c552f4c51461083c578063cc1776d31461084f57600080fd5b806389d53c01116101a8578063a457c2d711610177578063a457c2d7146107b1578063a6f9dae1146107c4578063a9059cbb146107d7578063b0ad3ebf146107ea578063c20c5caf1461080d57600080fd5b806389d53c011461075b5780638da5cb5b1461076e57806395d89b4114610786578063989763ef1461078e57600080fd5b8063790ca413116101e4578063790ca4131461071857806379cc6790146107215780638091f3bf14610734578063810453451461074857600080fd5b80636b8f2f3b146106b05780636f864552146106c457806370a08231146106cc5780637412dbb3146106f557600080fd5b8063395093511161031057806352c6dbc4116102a35780635d9d7d43116102725780635d9d7d43146106665780635e45da23146106795780636331bf65146106825780636508c57e1461068a5780636a092e791461069d57600080fd5b806352c6dbc4146106195780635543379a1461062d578063583dd79d146106405780635d90bbaf1461065357600080fd5b806345541cba116102df57806345541cba146105e25780634f7041a5146105eb5780634f72e2a2146105f35780634fbc27751461060657600080fd5b806339509351146105a1578063407133d2146105b457806342966c68146105c7578063442ef7d2146105da57600080fd5b806318551108116103935780632b750627116103625780632b7506271461051557806330bd85c514610538578063313ce5671461054c5780633164df8b1461056b578063368274991461058e57600080fd5b806318551108146104b75780631e19ae77146104dc57806323b872dd146104ef57806328be90381461050257600080fd5b8063095ea7b3116103cf578063095ea7b31461045c5780630f3a325f1461046f5780631776834a1461049257806318160ddd146104a557600080fd5b806301339c2114610401578063064a59d01461040b57806306fdde031461043457806307a1cfbd14610449575b600080fd5b610409610955565b005b60065461041f90600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b61043c610997565b60405161042b9190612c39565b610409610457366004612b53565b610a25565b61041f61046a366004612aaa565b610abc565b61041f61047d3660046129e2565b60116020526000908152604090205460ff1681565b6104096104a0366004612b98565b610bb0565b6002545b60405190815260200161042b565b6015546001600160a01b03165b6040516001600160a01b03909116815260200161042b565b6104096104ea366004612a73565b610be4565b61041f6104fd366004612a37565b610c3e565b610409610510366004612a73565b610d69565b61041f6105233660046129e2565b60126020526000908152604090205460ff1681565b600a5461041f90600160c01b900460ff1681565b6006546105599060ff1681565b60405160ff909116815260200161042b565b61041f6105793660046129e2565b60146020526000908152604090205460ff1681565b61040961059c366004612ad4565b610dc3565b61041f6105af366004612aaa565b610e10565b600a546104c4906001600160a01b031681565b6104096105d5366004612b98565b610f24565b610409610f86565b6104a9600b5481565b6104a961105b565b610409610601366004612ad4565b6110dd565b610409610614366004612a73565b61112a565b600a5461041f90600160b01b900460ff1681565b61040961063b366004612ad4565b611184565b61040961064e366004612b0e565b6111d1565b610409610661366004612a73565b611232565b610409610674366004612a73565b61128c565b6104a9600d5481565b6104a96112e6565b610409610698366004612b53565b611305565b61041f6106ab366004612a04565b611366565b60155461041f90600160a01b900460ff1681565b6104a96114a0565b6104a96106da3660046129e2565b6001600160a01b031660009081526020819052604090205490565b61041f6107033660046129e2565b60096020526000908152604090205460ff1681565b6104a9600e5481565b61040961072f366004612aaa565b6114b5565b60065461041f90600160b01b900460ff1681565b610409610756366004612b98565b6115b4565b610409610769366004612ad4565b6115e8565b6006546104c49061010090046001600160a01b031681565b61043c61168e565b61041f61079c3660046129e2565b60186020526000908152604090205460ff1681565b61041f6107bf366004612aaa565b61169b565b6104096107d23660046129e2565b61176a565b61041f6107e5366004612aaa565b611810565b61041f6107f83660046129e2565b60076020526000908152604090205460ff1681565b61040961081b366004612b98565b61189f565b61040961082e366004612a73565b6118d3565b6104a9600c5481565b61040961084a366004612ad4565b61192d565b6104a961197a565b6104a9600f5481565b6104a960175481565b610409610877366004612bca565b6119bf565b61040961088a3660046129e2565b6119f9565b6104a961089d3660046129e2565b60136020526000908152604090205481565b6104a960165481565b6104a96108c6366004612a04565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b610409611abf565b6104a960105481565b61041f6109103660046129e2565b60086020526000908152604090205460ff1681565b600a5461041f90600160a81b900460ff1681565b600a5461041f90600160b81b900460ff1681565b6104a9611b31565b60065461010090046001600160a01b0316331461098d5760405162461bcd60e51b815260040161098490612cfc565b60405180910390fd5b610995611c26565b565b600580546109a490612db4565b80601f01602080910402602001604051908101604052809291908181526020018280546109d090612db4565b8015610a1d5780601f106109f257610100808354040283529160200191610a1d565b820191906000526020600020905b815481529060010190602001808311610a0057829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610a545760405162461bcd60e51b815260040161098490612cfc565b6015546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610a869085908590600401612c76565b600060405180830381600087803b158015610aa057600080fd5b505af1158015610ab4573d6000803e3d6000fd5b505050505050565b6006546000903390600160a81b900460ff168015610ae35750600654600160b01b900460ff165b80610b0057506006546001600160a01b0382811661010090920416145b80610b1a57503360009081526007602052604090205460ff165b610b365760405162461bcd60e51b815260040161098490612ccf565b6001600160a01b038416610b5c5760405162461bcd60e51b815260040161098490612c98565b3360008181526001602090815260408083206001600160a01b0389168085529083529281902087905551868152919291600080516020612e6583398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610bdf5760405162461bcd60e51b815260040161098490612cfc565b600d55565b60065461010090046001600160a01b03163314610c135760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152601460205260409020805460ff1916911515919091179055565b6006546000908490600160a81b900460ff168015610c655750600654600160b01b900460ff165b80610c8257506006546001600160a01b0382811661010090920416145b80610c9c57503360009081526007602052604090205460ff165b610cb85760405162461bcd60e51b815260040161098490612ccf565b6001600160a01b0385166000908152600160209081526040808320338452909152902054610ce7908490612d9d565b6001600160a01b0386166000908152600160209081526040808320338452909152902055610d16858585611c67565b6001600160a01b03851660008181526001602090815260408083203380855290835292819020549051908152919291600080516020612e65833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610d985760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152600960205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610df25760405162461bcd60e51b815260040161098490612cfc565b600a8054911515600160b81b0260ff60b81b19909216919091179055565b6006546000903390600160a81b900460ff168015610e375750600654600160b01b900460ff165b80610e5457506006546001600160a01b0382811661010090920416145b80610e6e57503360009081526007602052604090205460ff165b610e8a5760405162461bcd60e51b815260040161098490612ccf565b6001600160a01b038416610eb05760405162461bcd60e51b815260040161098490612c98565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610edf908490612d44565b3360008181526001602090815260408083206001600160a01b038a1680855290835292819020859055519384529092600080516020612e658339815191529101610b9e565b3360009081526014602052604090205460ff16610f795760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610984565b610f833382611e80565b50565b600654600160b01b900460ff16610ff15760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610984565b601560009054906101000a90046001600160a01b03166001600160a01b031663e4fc6b6d6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561104157600080fd5b505af1158015611055573d6000803e3d6000fd5b50505050565b60155460408051631296b91d60e11b815290516000926001600160a01b03169163252d723a916004808301926020929190829003018186803b1580156110a057600080fd5b505afa1580156110b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110d89190612bb1565b905090565b60065461010090046001600160a01b0316331461110c5760405162461bcd60e51b815260040161098490612cfc565b60158054911515600160a01b0260ff60a01b19909216919091179055565b60065461010090046001600160a01b031633146111595760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152600760205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146111b35760405162461bcd60e51b815260040161098490612cfc565b600a8054911515600160b01b0260ff60b01b19909216919091179055565b60065461010090046001600160a01b031633146112005760405162461bcd60e51b815260040161098490612cfc565b60155460405163583dd79d60e01b81526001600160a01b039091169063583dd79d90610a869085908590600401612c4c565b60065461010090046001600160a01b031633146112615760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146112bb5760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152601260205260409020805460ff1916911515919091179055565b6000612710600c546002546112fb9190612d7e565b6110d89190612d5c565b60065461010090046001600160a01b031633146113345760405162461bcd60e51b815260040161098490612cfc565b60155460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610a869085908590600401612c76565b60065460009061010090046001600160a01b031633146113985760405162461bcd60e51b815260040161098490612cfc565b6040516370a0823160e01b81523060048201526000906001600160a01b038516906370a082319060240160206040518083038186803b1580156113da57600080fd5b505afa1580156113ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114129190612bb1565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb90604401602060405180830381600087803b15801561146057600080fd5b505af1158015611474573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114989190612af1565b949350505050565b6000612710600b546002546112fb9190612d7e565b3360009081526014602052604090205460ff1661150a5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610984565b6001600160a01b0382166000908152600160209081526040808320338452909152902054611539908290612d9d565b6001600160a01b03831660009081526001602090815260408083203384529091529020556115678282611e80565b6001600160a01b03821660008181526001602090815260408083203380855290835292819020549051908152919291600080516020612e6583398151915291015b60405180910390a35050565b60065461010090046001600160a01b031633146115e35760405162461bcd60e51b815260040161098490612cfc565b600c55565b60065461010090046001600160a01b031633146116175760405162461bcd60e51b815260040161098490612cfc565b600a54600160a01b900460ff166116705760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610984565b600a8054911515600160c01b0260ff60c01b19909216919091179055565b600480546109a490612db4565b6006546000903390600160a81b900460ff1680156116c25750600654600160b01b900460ff165b806116df57506006546001600160a01b0382811661010090920416145b806116f957503360009081526007602052604090205460ff165b6117155760405162461bcd60e51b815260040161098490612ccf565b6001600160a01b03841661173b5760405162461bcd60e51b815260040161098490612c98565b3360009081526001602090815260408083206001600160a01b0388168452909152902054610edf908490612d9d565b60065461010090046001600160a01b031633146117995760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b0381166117e85760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610984565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6006546000903390600160a81b900460ff1680156118375750600654600160b01b900460ff165b8061185457506006546001600160a01b0382811661010090920416145b8061186e57503360009081526007602052604090205460ff165b61188a5760405162461bcd60e51b815260040161098490612ccf565b611895338585611c67565b5060019392505050565b60065461010090046001600160a01b031633146118ce5760405162461bcd60e51b815260040161098490612cfc565b600b55565b60065461010090046001600160a01b031633146119025760405162461bcd60e51b815260040161098490612cfc565b6001600160a01b03919091166000908152601860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b0316331461195c5760405162461bcd60e51b815260040161098490612cfc565b600a8054911515600160a81b0260ff60a81b19909216919091179055565b6015546040805163585e42ef60e11b815290516000926001600160a01b03169163b0bc85de916004808301926020929190829003018186803b1580156110a057600080fd5b60065461010090046001600160a01b031633146119ee5760405162461bcd60e51b815260040161098490612cfc565b601791909155601655565b60065461010090046001600160a01b03163314611a285760405162461bcd60e51b815260040161098490612cfc565b600a80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd990602401600060405180830381600087803b158015611a8957600080fd5b505af1158015611a9d573d6000803e3d6000fd5b5050600a805464ff000000ff60a01b191664010000000160a01b179055505050565b60065461010090046001600160a01b03163314611aee5760405162461bcd60e51b815260040161098490612cfc565b600654604051479161010090046001600160a01b0316906108fc8315029083906000818181858888f19350505050158015611b2d573d6000803e3d6000fd5b5050565b600654600090600160b01b900460ff1615611b63576003600f5443611b569190612d9d565b1015611b6357506126ac90565b50600090565b6001600160a01b0381166000908152601860205260409020805460ff19166001179055610f83815b6001600160a01b0381166000908152601460205260409020805460ff19166001179055610f83815b6001600160a01b0381166000908152601260205260409020805460ff19166001179055610f83815b60068054610100600160a81b0319166101006001600160a01b03938416810291909117918290559004166000908152600760205260409020805460ff19166001179055565b60065461010090046001600160a01b03163314611c555760405162461bcd60e51b815260040161098490612cfc565b611c5d611f02565b42600e5543600f55565b6001600160a01b038216611cb65760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610984565b6001600160a01b03831660009081526008602052604090205460ff1615611d1f5760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610984565b60035460ff1615611dc5576001600160a01b038316600090815260208190526040902054611d4e908290612d9d565b6001600160a01b038085166000908152602081905260408082209390935590841681522054611d7e908290612d44565b6001600160a01b03838116600081815260208181526040918290209490945551848152909291861691600080516020612e45833981519152910160405180910390a3505050565b611dd0838383611f46565b6000611ddd848484611f51565b6001600160a01b038516600090815260208190526040902054909150611e04908390612d9d565b6001600160a01b038086166000908152602081905260408082209390935590851681522054611e34908290612d44565b6001600160a01b03848116600081815260208181526040918290209490945551848152909291871691600080516020612e45833981519152910160405180910390a3611055565b505050565b6001600160a01b038216611e9357600080fd5b80600254611ea19190612d9d565b6002556001600160a01b038216600090815260208190526040902054611ec8908290612d9d565b6001600160a01b0383166000818152602081815260408083209490945592518481529092600080516020612e4583398151915291016115a8565b60065461010090046001600160a01b03163314611f315760405162461bcd60e51b815260040161098490612cfc565b6006805460ff60b01b1916600160b01b179055565b611e7b838383611f5e565b600061149884848461217a565b60155460408051630dd8715760e01b815290516000926001600160a01b031691630dd87157916004808301926020929190829003018186803b158015611fa357600080fd5b505afa158015611fb7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fdb9190612bb1565b611fe59042612d9d565b600654909150600160b01b900460ff16801561200a5750601554600160a01b900460ff165b801561202e57506001600160a01b03831660009081526009602052604090205460ff165b8015612048575042601954603c6120459190612d44565b11155b801561205657506016548110155b801561207e57506017546015546001600160a01b031660009081526020819052604090205410155b801561210d5750601560009054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b815260040160206040518083038186803b1580156120d357600080fd5b505afa1580156120e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210b9190612af1565b155b1561216f57426019556015546040805163e4fc6b6d60e01b815290516001600160a01b039092169163e4fc6b6d9160048082019260009290919082900301818387803b15801561215c57600080fd5b505af192505050801561216d575060015b505b6110558484846123bb565b6001600160a01b038316600090815260186020526040812054829060ff161580156121be57506001600160a01b03841660009081526018602052604090205460ff16155b80156121d35750600654600160b01b900460ff165b15612320576001600160a01b03851660009081526009602052604090205460ff161561227e5760155460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc790602401602060405180830381600087803b15801561223f57600080fd5b505af1158015612253573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122779190612bb1565b9050612320565b6001600160a01b03841660009081526009602052604090205460ff161561232057601554604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd590602401602060405180830381600087803b1580156122e557600080fd5b505af11580156122f9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231d9190612bb1565b90505b600061232c8285612d9d565b905080156123a6576015546001600160a01b031660009081526020819052604090205461235a908290612d44565b601580546001600160a01b039081166000908152602081815260409182902094909455915491518481529181169290891691600080516020612e45833981519152910160405180910390a35b6123b18686846127e4565b9695505050505050565b600a54600160a81b900460ff1615806123e457503360009081526011602052604090205460ff16155b6124225760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610984565b600654600160b01b900460ff16801561244e57506006546001600160a01b038481166101009092041614155b801561247357506001600160a01b03831660009081526012602052604090205460ff16155b801561249857506001600160a01b03821660009081526012602052604090205460ff16155b15611e7b57600d54156124f757600d545a11156124f75760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610984565b6000600c5411801561252257506001600160a01b03821660009081526009602052604090205460ff16155b156125a15761252f6112e6565b6001600160a01b038316600090815260208190526040902054612553908390612d44565b11156125a15760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610984565b6000600b541180156125cb57506001600160a01b03821660009081526009602052604090205460ff165b15612627576125d86114a0565b8111156126275760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610984565b600a54600160b01b900460ff161561275f576001600160a01b038216600090815260136020526040902054431415612690576001600160a01b0382166000908152601160205260408120805460ff19166001179055601080549161268a83612def565b91905055505b6001600160a01b0383166000908152601360205260409020544314156126e7576001600160a01b0383166000908152601160205260408120805460ff1916600117905560108054916126e183612def565b91905055505b6001600160a01b03821660009081526009602052604090205460ff16612723576001600160a01b03821660009081526013602052604090204390555b6001600160a01b03831660009081526009602052604090205460ff1661275f576001600160a01b03831660009081526013602052604090204390555b600a54600160c01b900460ff1615611e7b57600a5460405163090ec10b60e31b81526001600160a01b03858116600483015284811660248301526044820184905290911690634876085890606401600060405180830381600087803b1580156127c757600080fd5b505af11580156127db573d6000803e3d6000fd5b50505050505050565b6006546000908290600160b01b900460ff16801561280b5750600a54600160b81b900460ff165b156128ba576006546001600160a01b03868116610100909204161480159061283a57506000612838611b31565b115b801561285f57506001600160a01b03851660009081526012602052604090205460ff16155b801561288457506001600160a01b03841660009081526012602052604090205460ff16155b156128ba576000612710612896611b31565b6128a09086612d7e565b6128aa9190612d5c565b90506128b68183612d9d565b9150505b6128c58585836128ce565b95945050505050565b6000826001600160a01b0316846001600160a01b031614156129325760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610984565b5092915050565b80356001600160a01b038116811461295057600080fd5b919050565b600082601f83011261296657600080fd5b813567ffffffffffffffff8082111561298157612981612e20565b604051601f8301601f19908116603f011681019082821181831017156129a9576129a9612e20565b816040528381528660208588010111156129c257600080fd5b836020870160208301376000602085830101528094505050505092915050565b6000602082840312156129f457600080fd5b6129fd82612939565b9392505050565b60008060408385031215612a1757600080fd5b612a2083612939565b9150612a2e60208401612939565b90509250929050565b600080600060608486031215612a4c57600080fd5b612a5584612939565b9250612a6360208501612939565b9150604084013590509250925092565b60008060408385031215612a8657600080fd5b612a8f83612939565b91506020830135612a9f81612e36565b809150509250929050565b60008060408385031215612abd57600080fd5b612ac683612939565b946020939093013593505050565b600060208284031215612ae657600080fd5b81356129fd81612e36565b600060208284031215612b0357600080fd5b81516129fd81612e36565b60008060408385031215612b2157600080fd5b823567ffffffffffffffff811115612b3857600080fd5b612b4485828601612955565b925050612a2e60208401612939565b60008060408385031215612b6657600080fd5b823567ffffffffffffffff811115612b7d57600080fd5b612b8985828601612955565b95602094909401359450505050565b600060208284031215612baa57600080fd5b5035919050565b600060208284031215612bc357600080fd5b5051919050565b60008060408385031215612bdd57600080fd5b50508035926020909101359150565b6000815180845260005b81811015612c1257602081850181015186830182015201612bf6565b81811115612c24576000602083870101525b50601f01601f19169290920160200192915050565b6020815260006129fd6020830184612bec565b604081526000612c5f6040830185612bec565b905060018060a01b03831660208301529392505050565b604081526000612c896040830185612bec565b90508260208301529392505050565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b60008219821115612d5757612d57612e0a565b500190565b600082612d7957634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612d9857612d98612e0a565b500290565b600082821015612daf57612daf612e0a565b500390565b600181811c90821680612dc857607f821691505b60208210811415612de957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415612e0357612e03612e0a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114610f8357600080fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a264697066735822122068a80a1989a1410dbf7da15ff8136c9a0f5371b73833d195d6fcb8d2ba8871c564736f6c63430008070033
Deployed Bytecode Sourcemap
263:2491:7:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1965:100;;;:::i;:::-;;511:35:1;;;;;-1:-1:-1;;;511:35:1;;;;;;;;;5712:14:8;;5705:22;5687:41;;5675:2;5660:18;511:35:1;;;;;;;;415:19;;;:::i;:::-;;;;;;;:::i;3539:143:6:-;;;;;;:::i;:::-;;:::i;3456:314:1:-;;;;;;:::i;:::-;;:::i;826:41:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5189:98;;;;;;:::i;:::-;;:::i;1538:102:1:-;1620:12;;1538:102;;;11682:25:8;;;11670:2;11655:18;1538:102:1;11536:177:8;2787:114:6;2878:14;;-1:-1:-1;;;;;2878:14:6;2787:114;;;-1:-1:-1;;;;;4844:32:8;;;4826:51;;4814:2;4799:18;2787:114:6;4680:203:8;587:113:2;;;;;;:::i;:::-;;:::i;4243:328:1:-;;;;;;:::i;:::-;;:::i;7583:116::-;;;;;;:::i;:::-;;:::i;874:46:0:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;575:29;;;;;-1:-1:-1;;;575:29:0;;;;;;441:21:1;;;;;;;;;;;;11890:4:8;11878:17;;;11860:36;;11848:2;11833:18;441:21:1;11718:184:8;215:43:2;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4649:113:0;;;;;;:::i;:::-;;:::i;5086:381:1:-;;;;;;:::i;:::-;;:::i;371:31:0:-;;;;;-1:-1:-1;;;;;371:31:0;;;871:101:2;;;;;;:::i;:::-;;:::i;3849:93:6:-;;;:::i;617:27:0:-;;;;;;2595:102:6;;;:::i;2947:97::-;;;;;;:::i;:::-;;:::i;7450:121:1:-;;;;;;:::i;:::-;;:::i;491:36:0:-;;;;;-1:-1:-1;;;491:36:0;;;;;;4520:117;;;;;;:::i;:::-;;:::i;3694:143:6:-;;;;;;:::i;:::-;;:::i;5299:109:0:-;;;;;;:::i;:::-;;:::i;5416:117::-;;;;;;:::i;:::-;;:::i;685:26::-;;;;;;3643:113;;;:::i;3386:145:6:-;;;;;;:::i;:::-;;:::i;7227:211:1:-;;;;;;:::i;:::-;;:::i;242:23:6:-;;;;;-1:-1:-1;;;242:23:6;;;;;;3768:114:0;;;:::i;1857:119:1:-;;;;;;:::i;:::-;-1:-1:-1;;;;;1951:17:1;1924:7;1951:17;;;;;;;;;;;;1857:119;699:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;720:25:0;;;;;;1371:275:2;;;;;;:::i;:::-;;:::i;553:20:1:-;;;;;-1:-1:-1;;;553:20:1;;;;;;5077:100:0;;;;;;:::i;:::-;;:::i;4774:179::-;;;;;;:::i;:::-;;:::i;475:29:1:-;;;;;;;;-1:-1:-1;;;;;475:29:1;;;388:20;;;:::i;362:48:6:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;5987:391:1;;;;;;:::i;:::-;;:::i;6924:146::-;;;;;;:::i;:::-;;:::i;2631:178::-;;;;;;:::i;:::-;;:::i;586:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;4965:100:0;;;;;;:::i;:::-;;:::i;3052:123:6:-;;;;;;:::i;:::-;;:::i;651:27:0:-;;;;;;4399:109;;;;;;:::i;:::-;;:::i;2393:104:6:-;;;:::i;752:26:0:-;;;;;;317:38:6;;;;;;3183:191;;;;;;:::i;:::-;;:::i;4150:237:0:-;;;;;;:::i;:::-;;:::i;927:55::-;;;;;;:::i;:::-;;;;;;;;;;;;;;272:38:6;;;;;;2316:144:1;;;;;;:::i;:::-;-1:-1:-1;;;;;2427:16:1;;;2400:7;2427:16;;;:8;:16;;;;;;;;:25;;;;;;;;;;;;;2316:144;7078:141;;;:::i;785:28:0:-;;;;;;640:52:1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;452:32:0;;;;;-1:-1:-1;;;452:32:0;;;;;;534:34;;;;;-1:-1:-1;;;534:34:0;;;;;;3893:217;;;:::i;1965:100:7:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;;;;;;;;;2043:14:7::1;:12;:14::i;:::-;1965:100::o:0;415:19:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3539:143:6:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;3630:14:6::1;::::0;:44:::1;::::0;-1:-1:-1;;;3630:44:6;;-1:-1:-1;;;;;3630:14:6;;::::1;::::0;:24:::1;::::0;:44:::1;::::0;3655:7;;3664:9;;3630:44:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3539:143:::0;;:::o;3456:314:1:-;1207:16;;3559:4;;3538:10;;-1:-1:-1;;;1207:16:1;;;;:28;;;;-1:-1:-1;1227:8:1;;-1:-1:-1;;;1227:8:1;;;;1207:28;1206:47;;;-1:-1:-1;1248:5:1;;-1:-1:-1;;;;;1240:13:1;;;1248:5;;;;;1240:13;1206:47;:77;;;-1:-1:-1;1272:10:1;1257:26;;;;:14;:26;;;;;;;;1206:77;1198:109;;;;-1:-1:-1;;;1198:109:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3584:21:1;::::1;3576:62;;;;-1:-1:-1::0;;;3576:62:1::1;;;;;;;:::i;:::-;3660:10;3651:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;3651:29:1;::::1;::::0;;;;;;;;;;:37;;;3704:36;11682:25:8;;;3651:29:1;;3660:10;-1:-1:-1;;;;;;;;;;;3704:36:1;11655:18:8;3704:36:1::1;;;;;;;;-1:-1:-1::0;3758:4:1::1;::::0;3456:314;-1:-1:-1;;;3456:314:1:o;5189:98:0:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;5259:11:0::1;:20:::0;5189:98::o;587:113:2:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;667:15:2;;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:25;;-1:-1:-1;;667:25:2::1;::::0;::::1;;::::0;;;::::1;::::0;;587:113::o;4243:328:1:-;1207:16;;4354:4;;4339;;-1:-1:-1;;;1207:16:1;;;;:28;;;;-1:-1:-1;1227:8:1;;-1:-1:-1;;;1227:8:1;;;;1207:28;1206:47;;;-1:-1:-1;1248:5:1;;-1:-1:-1;;;;;1240:13:1;;;1248:5;;;;;1240:13;1206:47;:77;;;-1:-1:-1;1272:10:1;1257:26;;;;:14;:26;;;;;;;;1206:77;1198:109;;;;-1:-1:-1;;;1198:109:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;4400:14:1;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4415:10:::1;4400:26:::0;;;;;;;;:34:::1;::::0;4429:5;;4400:34:::1;:::i;:::-;-1:-1:-1::0;;;;;4371:14:1;::::1;;::::0;;;:8:::1;:14;::::0;;;;;;;4386:10:::1;4371:26:::0;;;;;;;:63;4445:26:::1;4380:4:::0;4461:2;4465:5;4445:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;4487:54:1;::::1;4514:14;::::0;;;:8:::1;:14;::::0;;;;;;;4502:10:::1;4514:26:::0;;;;;;;;;;;4487:54;;11682:25:8;;;4502:10:1;;4487:54;-1:-1:-1;;;;;;;;;;;4487:54:1;11655:18:8;4487:54:1::1;;;;;;;-1:-1:-1::0;4559:4:1::1;::::0;4243:328;-1:-1:-1;;;;4243:328:1:o;7583:116::-;808:5;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7664:14:1;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:27;;-1:-1:-1;;7664:27:1::1;::::0;::::1;;::::0;;;::::1;::::0;;7583:116::o;4649:113:0:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;4722:22:0::1;:32:::0;;;::::1;;-1:-1:-1::0;;;4722:32:0::1;-1:-1:-1::0;;;;4722:32:0;;::::1;::::0;;;::::1;::::0;;4649:113::o;5086:381:1:-;1207:16;;5195:4;;5174:10;;-1:-1:-1;;;1207:16:1;;;;:28;;;;-1:-1:-1;1227:8:1;;-1:-1:-1;;;1227:8:1;;;;1207:28;1206:47;;;-1:-1:-1;1248:5:1;;-1:-1:-1;;;;;1240:13:1;;;1248:5;;;;;1240:13;1206:47;:77;;;-1:-1:-1;1272:10:1;1257:26;;;;:14;:26;;;;;;;;1206:77;1198:109;;;;-1:-1:-1;;;1198:109:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;5220:21:1;::::1;5212:62;;;;-1:-1:-1::0;;;5212:62:1::1;;;;;;;:::i;:::-;5328:10;5319:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5319:29:1;::::1;::::0;;;;;;;;:42:::1;::::0;5351:10;;5319:42:::1;:::i;:::-;5296:10;5287:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;5287:29:1;::::1;::::0;;;;;;;;;;:74;;;5377:60;11682:25:8;;;5287:29:1;;-1:-1:-1;;;;;;;;;;;5377:60:1;11655:18:8;5377:60:1::1;11536:177:8::0;871:101:2;319:10;308:22;;;;:10;:22;;;;;;;;300:54;;;;-1:-1:-1;;;300:54:2;;7370:2:8;300:54:2;;;7352:21:8;7409:2;7389:18;;;7382:30;-1:-1:-1;;;7428:18:8;;;7421:49;7487:18;;300:54:2;7168:343:8;300:54:2;940:24:::1;946:10;958:5;940;:24::i;:::-;871:101:::0;:::o;3849:93:6:-;931:8:1;;-1:-1:-1;;;931:8:1;;;;923:62;;;;-1:-1:-1;;;923:62:1;;8435:2:8;923:62:1;;;8417:21:8;8474:2;8454:18;;;8447:30;8513:34;8493:18;;;8486:62;-1:-1:-1;;;8564:18:8;;;8557:39;8613:19;;923:62:1;8233:405:8;923:62:1;3907:14:6::1;;;;;;;;;-1:-1:-1::0;;;;;3907:14:6::1;-1:-1:-1::0;;;;;3907:25:6::1;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3849:93::o:0;2595:102::-;2663:14;;:26;;;-1:-1:-1;;;2663:26:6;;;;2636:7;;-1:-1:-1;;;;;2663:14:6;;:24;;:26;;;;;;;;;;;;;;:14;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2656:33;;2595:102;:::o;2947:97::-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;3015:11:6::1;:21:::0;;;::::1;;-1:-1:-1::0;;;3015:21:6::1;-1:-1:-1::0;;;;3015:21:6;;::::1;::::0;;;::::1;::::0;;2947:97::o;7450:121:1:-;808:5;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;7534:19:1;;;::::1;;::::0;;;:14:::1;:19;::::0;;;;:29;;-1:-1:-1;;7534:29:1::1;::::0;::::1;;::::0;;;::::1;::::0;;7450:121::o;4520:117:0:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;4595:24:0::1;:34:::0;;;::::1;;-1:-1:-1::0;;;4595:34:0::1;-1:-1:-1::0;;;;4595:34:0;;::::1;::::0;;;::::1;::::0;;4520:117::o;3694:143:6:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;3785:14:6::1;::::0;:44:::1;::::0;-1:-1:-1;;;3785:44:6;;-1:-1:-1;;;;;3785:14:6;;::::1;::::0;:27:::1;::::0;:44:::1;::::0;3813:7;;3822:6;;3785:44:::1;;;:::i;5299:109:0:-:0;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;5377:13:0;;;::::1;;::::0;;;:8:::1;:13;::::0;;;;:23;;-1:-1:-1;;5377:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;5299:109::o;5416:117::-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;5497:18:0;;;::::1;;::::0;;;:13:::1;:18;::::0;;;;:28;;-1:-1:-1;;5497:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;5416:117::o;3643:113::-;3684:7;3743:5;3727:12;;3712;;:27;;;;:::i;:::-;3711:37;;;;:::i;3386:145:6:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;3478:14:6::1;::::0;:45:::1;::::0;-1:-1:-1;;;3478:45:6;;-1:-1:-1;;;;;3478:14:6;;::::1;::::0;:25:::1;::::0;:45:::1;::::0;3504:7;;3513:9;;3478:45:::1;;;:::i;7227:211:1:-:0;808:5;;7305:4;;808:5;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;7339:38:::1;::::0;-1:-1:-1;;;7339:38:1;;7371:4:::1;7339:38;::::0;::::1;4826:51:8::0;7321:15:1::1;::::0;-1:-1:-1;;;;;7339:23:1;::::1;::::0;::::1;::::0;4799:18:8;;7339:38:1::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7395:35;::::0;-1:-1:-1;;;7395:35:1;;-1:-1:-1;;;;;5460:32:8;;;7395:35:1::1;::::0;::::1;5442:51:8::0;5509:18;;;5502:34;;;7321:56:1;;-1:-1:-1;7395:22:1;;::::1;::::0;::::1;::::0;5415:18:8;;7395:35:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7388:42:::0;7227:211;-1:-1:-1;;;;7227:211:1:o;3768:114:0:-;3809:7;3869:5;3853:12;;3838;;:27;;;;:::i;1371:275:2:-;319:10;308:22;;;;:10;:22;;;;;;;;300:54;;;;-1:-1:-1;;;300:54:2;;7370:2:8;300:54:2;;;7352:21:8;7409:2;7389:18;;;7382:30;-1:-1:-1;;;7428:18:8;;;7421:49;7487:18;;300:54:2;7168:343:8;300:54:2;-1:-1:-1;;;;;1493:17:2;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;1511:10:::1;1493:29:::0;;;;;;;;:37:::1;::::0;1525:5;;1493:37:::1;:::i;:::-;-1:-1:-1::0;;;;;1461:17:2;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;1479:10:::1;1461:29:::0;;;;;;;:69;1541:21:::1;1470:7:::0;1556:5;1541::::1;:21::i;:::-;-1:-1:-1::0;;;;;1578:60:2;::::1;1608:17;::::0;;;:8:::1;:17;::::0;;;;;;;1596:10:::1;1608:29:::0;;;;;;;;;;;1578:60;;11682:25:8;;;1596:10:2;;1578:60;-1:-1:-1;;;;;;;;;;;1578:60:2;11655:18:8;1578:60:2::1;;;;;;;;1371:275:::0;;:::o;5077:100:0:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;5148:12:0::1;:21:::0;5077:100::o;4774:179::-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;4850:21:0::1;::::0;-1:-1:-1;;;4850:21:0;::::1;;;4842:65;;;::::0;-1:-1:-1;;;4842:65:0;;7718:2:8;4842:65:0::1;::::0;::::1;7700:21:8::0;7757:2;7737:18;;;7730:30;7796:33;7776:18;;;7769:61;7847:18;;4842:65:0::1;7516:355:8::0;4842:65:0::1;4918:17;:27:::0;;;::::1;;-1:-1:-1::0;;;4918:27:0::1;-1:-1:-1::0;;;;4918:27:0;;::::1;::::0;;;::::1;::::0;;4774:179::o;388:20:1:-;;;;;;;:::i;5987:391::-;1207:16;;6101:4;;6080:10;;-1:-1:-1;;;1207:16:1;;;;:28;;;;-1:-1:-1;1227:8:1;;-1:-1:-1;;;1227:8:1;;;;1207:28;1206:47;;;-1:-1:-1;1248:5:1;;-1:-1:-1;;;;;1240:13:1;;;1248:5;;;;;1240:13;1206:47;:77;;;-1:-1:-1;1272:10:1;1257:26;;;;:14;:26;;;;;;;;1206:77;1198:109;;;;-1:-1:-1;;;1198:109:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;6126:21:1;::::1;6118:62;;;;-1:-1:-1::0;;;6118:62:1::1;;;;;;;:::i;:::-;6234:10;6225:20;::::0;;;:8:::1;:20;::::0;;;;;;;-1:-1:-1;;;;;6225:29:1;::::1;::::0;;;;;;;;:47:::1;::::0;6257:15;;6225:47:::1;:::i;6924:146::-:0;808:5;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;6996:17:1;::::1;6988:52;;;::::0;-1:-1:-1;;;6988:52:1;;10324:2:8;6988:52:1::1;::::0;::::1;10306:21:8::0;10363:2;10343:18;;;10336:30;-1:-1:-1;;;10382:18:8;;;10375:52;10444:18;;6988:52:1::1;10122:346:8::0;6988:52:1::1;7051:5;:11:::0;;-1:-1:-1;;;;;7051:11:1;;::::1;;;-1:-1:-1::0;;;;;;7051:11:1;;::::1;::::0;;;::::1;::::0;;6924:146::o;2631:178::-;1207:16;;2730:4;;2709:10;;-1:-1:-1;;;1207:16:1;;;;:28;;;;-1:-1:-1;1227:8:1;;-1:-1:-1;;;1227:8:1;;;;1207:28;1206:47;;;-1:-1:-1;1248:5:1;;-1:-1:-1;;;;;1240:13:1;;;1248:5;;;;;1240:13;1206:47;:77;;;-1:-1:-1;1272:10:1;1257:26;;;;:14;:26;;;;;;;;1206:77;1198:109;;;;-1:-1:-1;;;1198:109:1;;;;;;;:::i;:::-;2747:32:::1;2757:10;2769:2;2773:5;2747:9;:32::i;:::-;-1:-1:-1::0;2797:4:1::1;::::0;2631:178;-1:-1:-1;;;2631:178:1:o;4965:100:0:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;5036:12:0::1;:21:::0;4965:100::o;3052:123:6:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;3137:20:6;;;::::1;;::::0;;;:15:::1;:20;::::0;;;;:30;;-1:-1:-1;;3137:30:6::1;::::0;::::1;;::::0;;;::::1;::::0;;3052:123::o;4399:109:0:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;4470:20:0::1;:30:::0;;;::::1;;-1:-1:-1::0;;;4470:30:0::1;-1:-1:-1::0;;;;4470:30:0;;::::1;::::0;;;::::1;::::0;;4399:109::o;2393:104:6:-;2462:14;;:27;;;-1:-1:-1;;;2462:27:6;;;;2435:7;;-1:-1:-1;;;;;2462:14:6;;:25;;:27;;;;;;;;;;;;;;:14;:27;;;;;;;;;;3183:191;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;3287:23:6::1;:35:::0;;;;3333:23:::1;:33:::0;3183:191::o;4150:237:0:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;4227:11:0::1;:35:::0;;-1:-1:-1;;;;;;4227:35:0::1;-1:-1:-1::0;;;;;4227:35:0;;::::1;::::0;;::::1;::::0;;;4299:5:::1;::::0;4273:32:::1;::::0;-1:-1:-1;;;4273:32:0;;4227:35:::1;4299:5:::0;;::::1;::::0;;::::1;4273:32;::::0;::::1;4826:51:8::0;4227:35:0;4273:25:::1;::::0;4799:18:8;;4273:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;4316:21:0::1;:28:::0;;-1:-1:-1;;;;4355:24:0;-1:-1:-1;;;4355:24:0;;;-1:-1:-1;;;4150:237:0:o;7078:141:1:-;808:5;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;7187:5:::1;::::0;7179:32:::1;::::0;7147:21:::1;::::0;7187:5:::1;::::0;::::1;-1:-1:-1::0;;;;;7187:5:1::1;::::0;7179:32:::1;::::0;::::1;;::::0;7147:21;;7129:15:::1;7179:32:::0;7129:15;7179:32;7147:21;7187:5;7179:32;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;7118:101;7078:141::o:0;3893:217:0:-;3966:8;;3943:7;;-1:-1:-1;;;3966:8:0;;;;3963:121;;;4024:1;4010:11;;3995:12;:26;;;;:::i;:::-;:30;3991:82;;;-1:-1:-1;4053:4:0;;3893:217::o;3991:82::-;-1:-1:-1;4101:1:0;;3893:217::o;475:144:6:-;-1:-1:-1;;;;;547:23:6;;;;;;:15;:23;;;;;:30;;-1:-1:-1;;547:30:6;573:4;547:30;;;588:23;563:6;406:139:2;-1:-1:-1;;;;;478:18:2;;;;;;:10;:18;;;;;:25;;-1:-1:-1;;478:25:2;499:4;478:25;;;514:23;489:6;1019:142:0;-1:-1:-1;;;;;1091:21:0;;;;;;:13;:21;;;;;:28;;-1:-1:-1;;1091:28:0;1115:4;1091:28;;;1130:23;1105:6;1341:124:1;1404:5;:14;;-1:-1:-1;;;;;;1404:14:1;;-1:-1:-1;;;;;1404:14:1;;;;;;;;;;;;;1444:5;;;-1:-1:-1;1429:21:1;;;:14;:21;;;;;:28;;-1:-1:-1;;1429:28:1;-1:-1:-1;1429:28:1;;;1341:124::o;1173:161:0:-;808:5:1;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;1236:14:0::1;:12;:14::i;:::-;1274:15;1261:10;:28:::0;1314:12:::1;1300:11;:26:::0;1173:161::o;8614:792:1:-;-1:-1:-1;;;;;8701:16:1;;8693:51;;;;-1:-1:-1;;;8693:51:1;;10324:2:8;8693:51:1;;;10306:21:8;10363:2;10343:18;;;10336:30;-1:-1:-1;;;10382:18:8;;;10375:52;10444:18;;8693:51:1;10122:346:8;8693:51:1;-1:-1:-1;;;;;8763:25:1;;;;;;:19;:25;;;;;;;;:34;8755:77;;;;-1:-1:-1;;;8755:77:1;;7011:2:8;8755:77:1;;;6993:21:8;7050:2;7030:18;;;7023:30;7089:32;7069:18;;;7062:60;7139:18;;8755:77:1;6809:354:8;8755:77:1;8857:16;;;;8853:546;;;-1:-1:-1;;;;;8910:15:1;;:9;:15;;;;;;;;;;;:23;;8928:5;;8910:23;:::i;:::-;-1:-1:-1;;;;;8892:15:1;;;:9;:15;;;;;;;;;;;:41;;;;8964:13;;;;;;;:21;;8980:5;;8964:21;:::i;:::-;-1:-1:-1;;;;;8948:13:1;;;:9;:13;;;;;;;;;;;;:37;;;;9005:25;11682::8;;;8948:13:1;;9005:25;;;;-1:-1:-1;;;;;;;;;;;9005:25:1;11655:18:8;9005:25:1;;;;;;;8614:792;;;:::o;8853:546::-;9065:28;9077:4;9083:2;9087:5;9065:11;:28::i;:::-;9110:22;9135:40;9159:4;9165:2;9169:5;9135:23;:40::i;:::-;-1:-1:-1;;;;;9208:15:1;;:9;:15;;;;;;;;;;;9110:65;;-1:-1:-1;9208:23:1;;9226:5;;9208:23;:::i;:::-;-1:-1:-1;;;;;9190:15:1;;;:9;:15;;;;;;;;;;;:41;;;;9262:13;;;;;;;:30;;9278:14;;9262:30;:::i;:::-;-1:-1:-1;;;;;9246:13:1;;;:9;:13;;;;;;;;;;;;:46;;;;9314:34;11682:25:8;;;9246:13:1;;9314:34;;;;-1:-1:-1;;;;;;;;;;;9314:34:1;11655:18:8;9314:34:1;;;;;;;9365:22;7078:141;8853:546;8614:792;;;:::o;1682:263:2:-;-1:-1:-1;;;;;1757:21:2;;1749:30;;;;;;1822:5;1807:12;;:20;;;;:::i;:::-;1792:12;:35;-1:-1:-1;;;;;1859:18:2;;:9;:18;;;;;;;;;;;:26;;1880:5;;1859:26;:::i;:::-;-1:-1:-1;;;;;1838:18:2;;:9;:18;;;;;;;;;;;:47;;;;1901:36;;11682:25:8;;;1838:9:2;;-1:-1:-1;;;;;;;;;;;1901:36:2;11655:18:8;1901:36:2;11536:177:8;6422:77:1;808:5;;;;;-1:-1:-1;;;;;808:5:1;794:10;:19;786:72;;;;-1:-1:-1;;;786:72:1;;;;;;;:::i;:::-;6476:8:::1;:15:::0;;-1:-1:-1;;;;6476:15:1::1;-1:-1:-1::0;;;6476:15:1::1;::::0;;6422:77::o;2222:165:7:-;2345:34;2363:4;2369:2;2373:5;2345:17;:34::i;2399:214::-;2532:7;2559:46;2589:4;2595:2;2599:5;2559:29;:46::i;1563:693:6:-;1708:14;;:29;;;-1:-1:-1;;;1708:29:6;;;;1662:25;;-1:-1:-1;;;;;1708:14:6;;:27;;:29;;;;;;;;;;;;;;:14;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1690:47;;:15;:47;:::i;:::-;1766:8;;1662:75;;-1:-1:-1;;;;1766:8:6;;;;:37;;;;-1:-1:-1;1792:11:6;;-1:-1:-1;;;1792:11:6;;;;1766:37;:68;;;;-1:-1:-1;;;;;;1821:13:6;;;;;;:9;:13;;;;;;;;1766:68;:123;;;;;1874:15;1852:13;;1868:2;1852:18;;;;:::i;:::-;:37;;1766:123;:184;;;;;1927:23;;1906:17;:44;;1766:184;:262;;;;-1:-1:-1;2005:23:6;;1985:14;;-1:-1:-1;;;;;1985:14:6;1967:9;:34;;;;;;;;;;;:61;;1766:262;:311;;;;;2045:14;;;;;;;;;-1:-1:-1;;;;;2045:14:6;-1:-1:-1;;;;;2045:21:6;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:32;1766:311;1748:456;;;2120:15;2104:13;:31;2154:14;;:27;;;-1:-1:-1;;;2154:27:6;;;;-1:-1:-1;;;;;2154:14:6;;;;:25;;:27;;;;;:14;;:27;;;;;;;;:14;;:27;;;;;;;;;;;;;;;;;;;;;;;;;2150:43;;2214:34;2232:4;2238:2;2242:5;2214:17;:34::i;637:916::-;-1:-1:-1;;;;;823:21:6;;746:7;823:21;;;:15;:21;;;;;;801:5;;823:21;;:30;;;:62;;-1:-1:-1;;;;;;857:19:6;;;;;;:15;:19;;;;;;;;:28;823:62;:74;;;;-1:-1:-1;889:8:6;;-1:-1:-1;;;889:8:6;;;;823:74;819:390;;;-1:-1:-1;;;;;918:15:6;;;;;;:9;:15;;;;;;;;914:284;;;1005:14;;:32;;-1:-1:-1;;;1005:32:6;;;;;11682:25:8;;;-1:-1:-1;;;;;1005:14:6;;;;:25;;11655:18:8;;1005:32:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;988:49;;914:284;;;-1:-1:-1;;;;;1063:13:6;;;;;;:9;:13;;;;;;;;1059:139;;;1149:14;;:33;;-1:-1:-1;;;1149:33:6;;;;;11682:25:8;;;-1:-1:-1;;;;;1149:14:6;;;;:26;;11655:18:8;;1149:33:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1132:50;;1059:139;1221:17;1241:22;1249:14;1241:5;:22;:::i;:::-;1221:42;-1:-1:-1;1278:13:6;;1274:199;;1363:14;;-1:-1:-1;;;;;1363:14:6;1345:9;:34;;;;;;;;;;;:46;;1382:9;;1345:46;:::i;:::-;1326:14;;;-1:-1:-1;;;;;1326:14:6;;;1308:9;:34;;;;;;;;;;;;:83;;;;1434:14;;1411:50;;11682:25:8;;;1434:14:6;;;;1411:50;;;;-1:-1:-1;;;;;;;;;;;1411:50:6;11655:18:8;1411:50:6;;;;;;;1274:199;1490:55;1520:4;1526:2;1530:14;1490:29;:55::i;:::-;1483:62;637:916;-1:-1:-1;;;;;;637:916:6:o;1346:1682:0:-;1453:20;;-1:-1:-1;;;1453:20:0;;;;:29;;:62;;-1:-1:-1;1495:10:0;1486:20;;;;:8;:20;;;;;;;;:29;1453:62;1445:90;;;;-1:-1:-1;;;1445:90:0;;10675:2:8;1445:90:0;;;10657:21:8;10714:2;10694:18;;;10687:30;-1:-1:-1;;;10733:18:8;;;10726:45;10788:18;;1445:90:0;10473:339:8;1445:90:0;1560:8;;-1:-1:-1;;;1560:8:0;;;;:25;;;;-1:-1:-1;1580:5:0;;-1:-1:-1;;;;;1572:13:0;;;1580:5;;;;;1572:13;;1560:25;:57;;;;-1:-1:-1;;;;;;1589:19:0;;;;;;:13;:19;;;;;;;;:28;1560:57;:87;;;;-1:-1:-1;;;;;;1621:17:0;;;;;;:13;:17;;;;;;;;:26;1560:87;1556:1410;;;1682:11;;:15;1678:122;;1738:11;;1725:9;:24;;1717:67;;;;-1:-1:-1;;;1717:67:0;;11379:2:8;1717:67:0;;;11361:21:8;11418:2;11398:18;;;11391:30;11457:32;11437:18;;;11430:60;11507:18;;1717:67:0;11177:354:8;1717:67:0;1847:1;1832:12;;:16;:42;;;;-1:-1:-1;;;;;;1852:13:0;;;;;;:9;:13;;;;;;;;:22;1832:42;1828:164;;;1929:10;:8;:10::i;:::-;-1:-1:-1;;;;;1904:13:0;;:9;:13;;;;;;;;;;;:21;;1920:5;;1904:21;:::i;:::-;:35;;1895:81;;;;-1:-1:-1;;;1895:81:0;;8845:2:8;1895:81:0;;;8827:21:8;;;8864:18;;;8857:30;8923:34;8903:18;;;8896:62;8975:18;;1895:81:0;8643:356:8;1895:81:0;2039:1;2024:12;;:16;:33;;;;-1:-1:-1;;;;;;2044:13:0;;;;;;:9;:13;;;;;;;;2024:33;2020:139;;;2096:10;:8;:10::i;:::-;2087:5;:19;;2078:65;;;;-1:-1:-1;;;2078:65:0;;9963:2:8;2078:65:0;;;9945:21:8;;;9982:18;;;9975:30;10041:34;10021:18;;;10014:62;10093:18;;2078:65:0;9761:356:8;2078:65:0;2190:24;;-1:-1:-1;;;2190:24:0;;;;2187:635;;;-1:-1:-1;;;;;2239:23:0;;;;;;:19;:23;;;;;;2266:12;2239:39;2235:146;;;-1:-1:-1;;;;;2303:12:0;;;;;;:8;:12;;;;;:19;;-1:-1:-1;;2303:19:0;2318:4;2303:19;;;2345:13;:16;;;;;;:::i;:::-;;;;;;2235:146;-1:-1:-1;;;;;2403:25:0;;;;;;:19;:25;;;;;;2432:12;2403:41;2399:150;;;-1:-1:-1;;;;;2469:14:0;;;;;;:8;:14;;;;;:21;;-1:-1:-1;;2469:21:0;2486:4;2469:21;;;2513:13;:16;;;;;;:::i;:::-;;;;;;2399:150;-1:-1:-1;;;;;2571:13:0;;;;;;:9;:13;;;;;;;;2567:109;;-1:-1:-1;;;;;2618:23:0;;;;;;:19;:23;;;;;2644:12;2618:38;;2567:109;-1:-1:-1;;;;;2698:15:0;;;;;;:9;:15;;;;;;;;2694:113;;-1:-1:-1;;;;;2747:25:0;;;;;;:19;:25;;;;;2775:12;2747:40;;2694:113;2854:17;;-1:-1:-1;;;2854:17:0;;;;2850:105;;;2892:11;;:47;;-1:-1:-1;;;2892:47:0;;-1:-1:-1;;;;;5146:15:8;;;2892:47:0;;;5128:34:8;5198:15;;;5178:18;;;5171:43;5230:18;;;5223:34;;;2892:11:0;;;;:30;;5063:18:8;;2892:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8614:792:1;;;:::o;3040:562:0:-;3214:8;;3149:7;;3194:5;;-1:-1:-1;;;3214:8:0;;;;:34;;;;-1:-1:-1;3226:22:0;;-1:-1:-1;;;3226:22:0;;;;3214:34;3210:312;;;3277:5;;-1:-1:-1;;;;;3269:13:0;;;3277:5;;;;;3269:13;;;;:32;;;3300:1;3286:11;:9;:11::i;:::-;:15;3269:32;:64;;;;-1:-1:-1;;;;;;3305:19:0;;;;;;:13;:19;;;;;;;;:28;3269:64;:94;;;;-1:-1:-1;;;;;;3337:17:0;;;;;;:13;:17;;;;;;;;:26;3269:94;3265:246;;;3384:17;3428:5;3413:11;:9;:11::i;:::-;3405:19;;:5;:19;:::i;:::-;3404:29;;;;:::i;:::-;3384:49;-1:-1:-1;3469:26:0;3384:49;3469:14;:26;:::i;:::-;3452:43;;3365:146;3265:246;3539:55;3569:4;3575:2;3579:14;3539:29;:55::i;:::-;3532:62;3040:562;-1:-1:-1;;;;;3040:562:0:o;6601:205:1:-;6701:7;6737:2;-1:-1:-1;;;;;6729:10:1;:4;-1:-1:-1;;;;;6729:10:1;;;6721:54;;;;-1:-1:-1;;;6721:54:1;;11019:2:8;6721:54:1;;;11001:21:8;11058:2;11038:18;;;11031:30;11097:33;11077:18;;;11070:61;11148:18;;6721:54:1;10817:355:8;6721:54:1;-1:-1:-1;6793:5:1;6601:205;-1:-1:-1;;6601:205:1:o;14:173:8:-;82:20;;-1:-1:-1;;;;;131:31:8;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:719::-;235:5;288:3;281:4;273:6;269:17;265:27;255:55;;306:1;303;296:12;255:55;342:6;329:20;368:18;405:2;401;398:10;395:36;;;411:18;;:::i;:::-;486:2;480:9;454:2;540:13;;-1:-1:-1;;536:22:8;;;560:2;532:31;528:40;516:53;;;584:18;;;604:22;;;581:46;578:72;;;630:18;;:::i;:::-;670:10;666:2;659:22;705:2;697:6;690:18;751:3;744:4;739:2;731:6;727:15;723:26;720:35;717:55;;;768:1;765;758:12;717:55;832:2;825:4;817:6;813:17;806:4;798:6;794:17;781:54;879:1;872:4;867:2;859:6;855:15;851:26;844:37;899:6;890:15;;;;;;192:719;;;;:::o;916:186::-;975:6;1028:2;1016:9;1007:7;1003:23;999:32;996:52;;;1044:1;1041;1034:12;996:52;1067:29;1086:9;1067:29;:::i;:::-;1057:39;916:186;-1:-1:-1;;;916:186:8:o;1107:260::-;1175:6;1183;1236:2;1224:9;1215:7;1211:23;1207:32;1204:52;;;1252:1;1249;1242:12;1204:52;1275:29;1294:9;1275:29;:::i;:::-;1265:39;;1323:38;1357:2;1346:9;1342:18;1323:38;:::i;:::-;1313:48;;1107:260;;;;;:::o;1372:328::-;1449:6;1457;1465;1518:2;1506:9;1497:7;1493:23;1489:32;1486:52;;;1534:1;1531;1524:12;1486:52;1557:29;1576:9;1557:29;:::i;:::-;1547:39;;1605:38;1639:2;1628:9;1624:18;1605:38;:::i;:::-;1595:48;;1690:2;1679:9;1675:18;1662:32;1652:42;;1372:328;;;;;:::o;1705:315::-;1770:6;1778;1831:2;1819:9;1810:7;1806:23;1802:32;1799:52;;;1847:1;1844;1837:12;1799:52;1870:29;1889:9;1870:29;:::i;:::-;1860:39;;1949:2;1938:9;1934:18;1921:32;1962:28;1984:5;1962:28;:::i;:::-;2009:5;1999:15;;;1705:315;;;;;:::o;2025:254::-;2093:6;2101;2154:2;2142:9;2133:7;2129:23;2125:32;2122:52;;;2170:1;2167;2160:12;2122:52;2193:29;2212:9;2193:29;:::i;:::-;2183:39;2269:2;2254:18;;;;2241:32;;-1:-1:-1;;;2025:254:8:o;2284:241::-;2340:6;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2448:9;2435:23;2467:28;2489:5;2467:28;:::i;2530:245::-;2597:6;2650:2;2638:9;2629:7;2625:23;2621:32;2618:52;;;2666:1;2663;2656:12;2618:52;2698:9;2692:16;2717:28;2739:5;2717:28;:::i;2780:396::-;2858:6;2866;2919:2;2907:9;2898:7;2894:23;2890:32;2887:52;;;2935:1;2932;2925:12;2887:52;2975:9;2962:23;3008:18;3000:6;2997:30;2994:50;;;3040:1;3037;3030:12;2994:50;3063;3105:7;3096:6;3085:9;3081:22;3063:50;:::i;:::-;3053:60;;;3132:38;3166:2;3155:9;3151:18;3132:38;:::i;3181:390::-;3259:6;3267;3320:2;3308:9;3299:7;3295:23;3291:32;3288:52;;;3336:1;3333;3326:12;3288:52;3376:9;3363:23;3409:18;3401:6;3398:30;3395:50;;;3441:1;3438;3431:12;3395:50;3464;3506:7;3497:6;3486:9;3482:22;3464:50;:::i;:::-;3454:60;3561:2;3546:18;;;;3533:32;;-1:-1:-1;;;;3181:390:8:o;3576:180::-;3635:6;3688:2;3676:9;3667:7;3663:23;3659:32;3656:52;;;3704:1;3701;3694:12;3656:52;-1:-1:-1;3727:23:8;;3576:180;-1:-1:-1;3576:180:8:o;3761:184::-;3831:6;3884:2;3872:9;3863:7;3859:23;3855:32;3852:52;;;3900:1;3897;3890:12;3852:52;-1:-1:-1;3923:16:8;;3761:184;-1:-1:-1;3761:184:8:o;3950:248::-;4018:6;4026;4079:2;4067:9;4058:7;4054:23;4050:32;4047:52;;;4095:1;4092;4085:12;4047:52;-1:-1:-1;;4118:23:8;;;4188:2;4173:18;;;4160:32;;-1:-1:-1;3950:248:8:o;4203:472::-;4245:3;4283:5;4277:12;4310:6;4305:3;4298:19;4335:1;4345:162;4359:6;4356:1;4353:13;4345:162;;;4421:4;4477:13;;;4473:22;;4467:29;4449:11;;;4445:20;;4438:59;4374:12;4345:162;;;4525:6;4522:1;4519:13;4516:87;;;4591:1;4584:4;4575:6;4570:3;4566:16;4562:27;4555:38;4516:87;-1:-1:-1;4657:2:8;4636:15;-1:-1:-1;;4632:29:8;4623:39;;;;4664:4;4619:50;;4203:472;-1:-1:-1;;4203:472:8:o;5966:220::-;6115:2;6104:9;6097:21;6078:4;6135:45;6176:2;6165:9;6161:18;6153:6;6135:45;:::i;6191:317::-;6368:2;6357:9;6350:21;6331:4;6388:45;6429:2;6418:9;6414:18;6406:6;6388:45;:::i;:::-;6380:53;;6498:1;6494;6489:3;6485:11;6481:19;6473:6;6469:32;6464:2;6453:9;6449:18;6442:60;6191:317;;;;;:::o;6513:291::-;6690:2;6679:9;6672:21;6653:4;6710:45;6751:2;6740:9;6736:18;6728:6;6710:45;:::i;:::-;6702:53;;6791:6;6786:2;6775:9;6771:18;6764:34;6513:291;;;;;:::o;7876:352::-;8078:2;8060:21;;;8117:2;8097:18;;;8090:30;8156;8151:2;8136:18;;8129:58;8219:2;8204:18;;7876:352::o;9004:343::-;9206:2;9188:21;;;9245:2;9225:18;;;9218:30;-1:-1:-1;;;9279:2:8;9264:18;;9257:49;9338:2;9323:18;;9004:343::o;9352:404::-;9554:2;9536:21;;;9593:2;9573:18;;;9566:30;9632:34;9627:2;9612:18;;9605:62;-1:-1:-1;;;9698:2:8;9683:18;;9676:38;9746:3;9731:19;;9352:404::o;11907:128::-;11947:3;11978:1;11974:6;11971:1;11968:13;11965:39;;;11984:18;;:::i;:::-;-1:-1:-1;12020:9:8;;11907:128::o;12040:217::-;12080:1;12106;12096:132;;12150:10;12145:3;12141:20;12138:1;12131:31;12185:4;12182:1;12175:15;12213:4;12210:1;12203:15;12096:132;-1:-1:-1;12242:9:8;;12040:217::o;12262:168::-;12302:7;12368:1;12364;12360:6;12356:14;12353:1;12350:21;12345:1;12338:9;12331:17;12327:45;12324:71;;;12375:18;;:::i;:::-;-1:-1:-1;12415:9:8;;12262:168::o;12435:125::-;12475:4;12503:1;12500;12497:8;12494:34;;;12508:18;;:::i;:::-;-1:-1:-1;12545:9:8;;12435:125::o;12565:380::-;12644:1;12640:12;;;;12687;;;12708:61;;12762:4;12754:6;12750:17;12740:27;;12708:61;12815:2;12807:6;12804:14;12784:18;12781:38;12778:161;;;12861:10;12856:3;12852:20;12849:1;12842:31;12896:4;12893:1;12886:15;12924:4;12921:1;12914:15;12778:161;;12565:380;;;:::o;12950:135::-;12989:3;-1:-1:-1;;13010:17:8;;13007:43;;;13030:18;;:::i;:::-;-1:-1:-1;13077:1:8;13066:13;;12950:135::o;13090:127::-;13151:10;13146:3;13142:20;13139:1;13132:31;13182:4;13179:1;13172:15;13206:4;13203:1;13196:15;13222:127;13283:10;13278:3;13274:20;13271:1;13264:31;13314:4;13311:1;13304:15;13338:4;13335:1;13328:15;13354:118;13440:5;13433:13;13426:21;13419:5;13416:32;13406:60;;13462:1;13459;13452:12
Swarm Source
ipfs://dee1094e34294ea839b72410c4eb0b66574eb8a52d3921e7b270f1fd8dda9770
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.