ERC-20
Overview
Max Total Supply
6,580 $OOO
Holders
160
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
1,825.427984173909280891 $OOOValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
FluidMachineToken
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.14; import "./LiquidProtocol.sol"; interface IUniswapERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; } interface IUniswapFactory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } interface IUniswapRouter01 { 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 addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function factory() external pure returns (address); function WETH() external pure returns (address); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getamountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getamountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getamountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getamountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapRouter02 is IUniswapRouter01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } abstract contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () { address msgSender = msg.sender; _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } function owner() public view returns (address) { return _owner; } modifier onlyOwner() { require(owner() == msg.sender, "Ownable: caller is not the owner"); _; } function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } function transferOwnership(address newOwner) public onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } library Address { function isContract(address account) internal view returns (bool) { uint256 size; assembly { size := extcodesize(account) } return size > 0; } function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { if (returndata.length > 0) { assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } library EnumerableSet { struct Set { bytes32[] _values; mapping (bytes32 => uint256) _indexes; } function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); set._indexes[value] = set._values.length; return true; } else { return false; } } function _remove(Set storage set, bytes32 value) private returns (bool) { uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; bytes32 lastvalue = set._values[lastIndex]; set._values[toDeleteIndex] = lastvalue; set._indexes[lastvalue] = valueIndex; set._values.pop(); delete set._indexes[value]; return true; } else { return false; } } function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } function _length(Set storage set) private view returns (uint256) { return set._values.length; } function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } struct Bytes32Set { Set _inner; } function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } struct AddressSet { Set _inner; } function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } struct UintSet { Set _inner; } function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } } contract FluidMachineToken is IERC20, Ownable { using Address for address; using EnumerableSet for EnumerableSet.AddressSet; mapping (address => uint256) public _balances; mapping (address => mapping (address => uint256)) public _allowances; mapping (address => uint256) public _sellLock; EnumerableSet.AddressSet private _excluded; EnumerableSet.AddressSet private _excludedFromSellLock; mapping (address => bool) public _blacklist; bool isBlacklist = true; string public constant _name = 'Fluid'; string public constant _symbol = '$OOO'; uint256 public constant InitialSupply= 10 * 10**3 * (10**_decimals); uint256 swapLimit = 50 * 10 * (10**_decimals); // 0,5% bool isSwapPegged = true; uint16 public BuyLimitDivider=50; // 2% uint8 public BalanceLimitDivider=25; // 4% uint16 public SellLimitDivider=125; // 0.75% uint16 public MaxSellLockTime= 10 seconds; mapping (address => bool) is_auth; address public constant UniswapRouter=0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D; address public constant Dead = 0x000000000000000000000000000000000000dEaD; uint256 public _circulatingSupply =InitialSupply; uint256 public balanceLimit = _circulatingSupply; uint256 public sellLimit = _circulatingSupply; uint256 public buyLimit = _circulatingSupply; uint8 _buyTax=9; uint8 _sellTax=9; uint8 _transferTax=9; uint8 _liquidityTax=30; uint8 _marketingTax=30; uint8 _growthTax=20; uint8 _treasuryTax=20; uint8 public constant _decimals = 18; bool isTokenSwapManual = false; bool public debot = false; address public uniswap_PairAddress; IUniswapRouter02 public uniswap_Router; modifier onlyAuth() { require(_is_auth(msg.sender), "Caller not in Auth"); _; } function _is_auth(address addr) private view returns (bool){ return addr==owner()||is_auth[addr]; } address USDC = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; bool are_fees_on; // NFT Linking address public fluid; Fluid fluid_controller; constructor () { _balances[msg.sender] = _circulatingSupply; emit Transfer(address(0), msg.sender, _circulatingSupply); uniswap_Router = IUniswapRouter02(UniswapRouter); uniswap_PairAddress = IUniswapFactory(uniswap_Router.factory()).createPair(address(this), USDC); balanceLimit=InitialSupply/BalanceLimitDivider; sellLimit=InitialSupply/SellLimitDivider; buyLimit=InitialSupply/BuyLimitDivider; sellLockTime=2 seconds; _excluded.add(msg.sender); _excludedFromSellLock.add(UniswapRouter); _excludedFromSellLock.add(uniswap_PairAddress); _excludedFromSellLock.add(address(this)); } function _transfer(address sender, address recipient, uint256 amount) private{ require(sender != address(0), "Transfer from zero"); require(recipient != address(0), "Transfer to zero"); if(isBlacklist) { require(!_blacklist[sender] && !_blacklist[recipient], "Blacklisted!"); } bool isExcluded = (_excluded.contains(sender) || _excluded.contains(recipient) || is_auth[sender] || is_auth[recipient] || sender==fluid || recipient==fluid); bool isContractTransfer=(sender==address(this) || recipient==address(this)); bool isLiquidityTransfer = ((sender == uniswap_PairAddress && recipient == UniswapRouter) || (recipient == uniswap_PairAddress && sender == UniswapRouter)); if(isContractTransfer || isLiquidityTransfer || isExcluded){ _feelessTransfer(sender, recipient, amount); } else{ if (!letsgo) { if (sender != owner() && recipient != owner()) { if (debot) { emit Transfer(sender,recipient,0); return; } else { require(letsgo,"trading not yet enabled"); } } } bool isBuy=sender==uniswap_PairAddress|| sender == UniswapRouter; bool isSell=recipient==uniswap_PairAddress|| recipient == UniswapRouter; bool isTransfer = !isBuy && !isSell; _taxedTransfer(sender,recipient,amount,isBuy,isSell, isTransfer); } } function _taxedTransfer(address sender, address recipient, uint256 amount,bool isBuy,bool isSell, bool isTransfer) private{ uint256 recipientBalance = _balances[recipient]; uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "Transfer exceeds balance"); swapLimit = sellLimit/2; uint8 tax; if(isSell){ if(!_excludedFromSellLock.contains(sender)){ require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Seller in sellLock"); _sellLock[sender]=block.timestamp+sellLockTime; } require(amount<=sellLimit,"Dump protection"); tax=_sellTax; } else if(isBuy){ require(recipientBalance+amount<=balanceLimit,"whale protection"); require(amount<=buyLimit, "whale protection"); tax=_buyTax; } else { require(recipientBalance+amount<=balanceLimit,"whale protection"); if(!_excludedFromSellLock.contains(sender)) require(_sellLock[sender]<=block.timestamp||sellLockDisabled,"Sender in Lock"); tax=_transferTax; } uint256 taxedAmount; if(are_fees_on) { if((sender!=uniswap_PairAddress)&&(!manualConversion)&&(!_isSwappingContractModifier)) _swapContractToken(amount); uint256 contractToken=_calculateFee(amount, tax, _marketingTax+_liquidityTax+_growthTax+_treasuryTax); taxedAmount=amount-(contractToken); _balances[address(this)] += contractToken; emit Transfer(sender,address(this),contractToken); } else { taxedAmount = amount; } _removeToken(sender,amount); _addToken(recipient, taxedAmount); fluid_controller.on_transfer(sender, recipient, amount, isBuy, isSell, isTransfer); emit Transfer(sender,recipient,taxedAmount); } function _feelessTransfer(address sender, address recipient, uint256 amount) private{ uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "Transfer exceeds balance"); _removeToken(sender,amount); _addToken(recipient, amount); emit Transfer(sender,recipient,amount); } function _calculateFee(uint256 amount, uint8 tax, uint8 taxPercent) private pure returns (uint256) { return (amount*tax*taxPercent) / 10000; } function _addToken(address addr, uint256 amount) private { uint256 newAmount=_balances[addr]+amount; _balances[addr]=newAmount; } function _removeToken(address addr, uint256 amount) private { uint256 newAmount=_balances[addr]-amount; _balances[addr]=newAmount; } bool private _isTokenSwaping; uint256 public totalTokenSwapGenerated; uint256 public totalPayouts; uint8 public marketingShare=40; uint8 public growthShare=30; uint8 public treasuryShare=30; uint256 public marketingBalance; uint256 public growthBalance; uint256 public treasuryBalance; function _distributeFeesETH(uint256 ETHamount) private { uint256 marketingSplit = (ETHamount * marketingShare)/100; uint256 treasurySplit = (ETHamount * treasuryShare)/100; uint256 growthSplit = (ETHamount * growthShare)/100; marketingBalance+=marketingSplit; treasuryBalance+=treasurySplit; growthBalance+=growthSplit; } uint256 public totalLPETH; bool private _isSwappingContractModifier; modifier lockTheSwap { _isSwappingContractModifier = true; _; _isSwappingContractModifier = false; } function _swapContractToken(uint256 totalMax) private lockTheSwap{ uint256 contractBalance=_balances[address(this)]; uint16 totalTax=_liquidityTax+_marketingTax; uint256 tokenToSwap=swapLimit; if(tokenToSwap > totalMax) { if(isSwapPegged) { tokenToSwap = totalMax; } } if(contractBalance<tokenToSwap||totalTax==0){ return; } uint256 tokenForLiquidity=(tokenToSwap*_liquidityTax)/totalTax; uint256 tokenForMarketing= (tokenToSwap*_marketingTax)/totalTax; uint256 tokenForTreasury= (tokenToSwap*_treasuryTax)/totalTax; uint256 tokenForGrowth= (tokenToSwap*_growthTax)/totalTax; uint256 liqToken=tokenForLiquidity/2; uint256 liqETHToken=tokenForLiquidity-liqToken; uint256 swapToken=liqETHToken+tokenForMarketing+tokenForGrowth+tokenForTreasury; uint256 initialETHBalance = address(this).balance; _swapTokenForETH(swapToken); uint256 newETH=(address(this).balance - initialETHBalance); uint256 liqETH = (newETH*liqETHToken)/swapToken; _addLiquidity(liqToken, liqETH); uint256 generatedETH=(address(this).balance - initialETHBalance); _distributeFeesETH(generatedETH); } function _swapTokenForETH(uint256 amount) private { _approve(address(this), address(uniswap_Router), amount); address[] memory path = new address[](2); path[0] = address(this); path[1] = USDC; uniswap_Router.swapExactTokensForETHSupportingFeeOnTransferTokens( amount, 0, path, address(this), block.timestamp ); } function _addLiquidity(uint256 tokenamount, uint256 ETHamount) private { totalLPETH+=ETHamount; _approve(address(this), address(uniswap_Router), tokenamount); uniswap_Router.addLiquidityETH{value: ETHamount}( address(this), tokenamount, 0, 0, address(this), block.timestamp ); } /// @notice Utilities function ToolBox_destroy(uint256 amount) public onlyAuth { require(_balances[address(this)] >= amount); _balances[address(this)] -= amount; _circulatingSupply -= amount; emit Transfer(address(this), Dead, amount); } function ToolBox_getLimits() public view returns(uint256 balance, uint256 sell){ return(balanceLimit/1, sellLimit/1); } function ToolBox_getTaxes() public view returns(uint256 treasuryTax, uint256 growthTax,uint256 liquidityTax,uint256 marketingTax, uint256 buyTax, uint256 sellTax, uint256 transferTax){ return (_treasuryTax, _growthTax,_liquidityTax,_marketingTax,_buyTax,_sellTax,_transferTax); } function ToolBox_getAddressSellLockTimeInSeconds(address AddressToCheck) public view returns (uint256){ uint256 lockTime=_sellLock[AddressToCheck]; if(lockTime<=block.timestamp) { return 0; } return lockTime-block.timestamp; } function ToolBox_getSellLockTimeInSeconds() public view returns(uint256){ return sellLockTime; } bool public sellLockDisabled; uint256 public sellLockTime; bool public manualConversion; function ToolBox_SetPeggedSwap(bool isPegged) public onlyAuth { isSwapPegged = isPegged; } function ToolBox_SetMaxSwap(uint256 max) public onlyAuth { swapLimit = max; } function ToolBox_SetMaxLockTime(uint16 max) public onlyAuth { MaxSellLockTime = max; } /// @notice AccessControl Functions function AccessControl_BlackListAddress(address addy, bool booly) public onlyAuth { _blacklist[addy] = booly; } function AccessControl_SetAuth(address addy, bool booly) public onlyAuth { is_auth[addy] = booly; } function AccessControl_ExcludeAccountFromFees(address account) public onlyAuth { _excluded.add(account); } function AccessControl_IncludeAccountToFees(address account) public onlyAuth { _excluded.remove(account); } function AccessControl_ExcludeAccountFromSellLock(address account) public onlyAuth { _excludedFromSellLock.add(account); } function AccessControl_IncludeAccountToSellLock(address account) public onlyAuth { _excludedFromSellLock.remove(account); } function OOO_WithdrawMarketingETH() public onlyAuth{ uint256 amount=marketingBalance; marketingBalance=0; address sender = msg.sender; (bool sent,) =sender.call{value: (amount)}(""); require(sent,"withdraw failed"); } function OOO_WithdrawGrowthETH() public onlyAuth{ uint256 amount=growthBalance; growthBalance=0; address sender = msg.sender; (bool sent,) =sender.call{value: (amount)}(""); require(sent,"withdraw failed"); } function OOO_WithdrawTreasuryETH() public onlyAuth{ uint256 amount=treasuryBalance; treasuryBalance=0; address sender = msg.sender; (bool sent,) =sender.call{value: (amount)}(""); require(sent,"withdraw failed"); } function OOO_revert() public onlyAuth { selfdestruct(payable(msg.sender)); } function OOO_set_usdc(address usdc_) public onlyAuth { USDC = usdc_; } function set_fluid(address fluid_) public override onlyAuth { fluid = fluid_; fluid_controller = Fluid(fluid); is_auth[fluid] = true; } function ToolBox_SwitchManualETHConversion(bool manual) public onlyAuth{ manualConversion=manual; } function ToolBox_DisableSellLock(bool disabled) public onlyAuth{ sellLockDisabled=disabled; } function UTILIY_SetSellLockTime(uint256 sellLockSeconds)public onlyAuth{ sellLockTime=sellLockSeconds; } function ToolBox_SetEnabledTaxes(bool enabled) public onlyAuth{ are_fees_on = enabled; } function ToolBox_SetTaxes(uint8 treasuryTaxes, uint8 growthTaxes, uint8 liquidityTaxes, uint8 marketingTaxes,uint8 buyTax, uint8 sellTax, uint8 transferTax) public onlyAuth{ uint8 totalTax=treasuryTaxes + growthTaxes +liquidityTaxes+marketingTaxes; require(totalTax==100, "burn+liq+marketing needs to equal 100%"); _treasuryTax = treasuryTaxes; _growthTax = growthTaxes; _liquidityTax=liquidityTaxes; _marketingTax=marketingTaxes; _buyTax=buyTax; _sellTax=sellTax; _transferTax=transferTax; } function ToolBox_ChangeMarketingShare(uint8 newShare) public onlyAuth{ marketingShare=newShare; } function ToolBox_ChangeGrowthShare(uint8 newShare) public onlyAuth{ growthShare=newShare; } function ToolBox_ChangeTreasuryShare(uint8 newShare) public onlyAuth{ treasuryShare=newShare; } function ToolBox_ManualGenerateTokenSwapBalance(uint256 _qty) public onlyAuth{ _swapContractToken(_qty * 10**18); } function ToolBox_UpdateLimits(uint256 newBalanceLimit, uint256 newSellLimit) public onlyAuth{ newBalanceLimit=newBalanceLimit*1; newSellLimit=newSellLimit*1; balanceLimit = newBalanceLimit; sellLimit = newSellLimit; } bool public letsgo; address private _liquidityTokenAddress; function ControlPanel_gogogo(bool booly) public onlyAuth{ letsgo = booly; } function ControlPanel_LiquidityTokenAddress(address liquidityTokenAddress) public onlyAuth{ _liquidityTokenAddress=liquidityTokenAddress; } function ToolBox_RescueTokens(address tknAddress) public onlyAuth { IERC20 token = IERC20(tknAddress); uint256 ourBalance = token.balanceOf(address(this)); require(ourBalance>0, "No tokens in our balance"); token.transfer(msg.sender, ourBalance); } function ToolBox_setBlacklistEnabled(bool isBlacklistEnabled) public onlyAuth { isBlacklist = isBlacklistEnabled; } function ToolBox_setContractTokenSwapManual(bool manual) public onlyAuth { isTokenSwapManual = manual; } function ToolBox_setBlacklistedAddress(address toBlacklist) public onlyAuth { _blacklist[toBlacklist] = true; } function ToolBox_removeBlacklistedAddress(address toRemove) public onlyAuth { _blacklist[toRemove] = false; } function ToolBox_AvoidLocks() public onlyAuth{ (bool sent,) =msg.sender.call{value: (address(this).balance)}(""); require(sent); } receive() external payable {} fallback() external payable {} function airdrop(address receiver, uint amount) public onlyAuth { require(_balances[address(this)] >= amount, "404"); _balances[address(this)] -= amount; _balances[receiver] += amount; emit Transfer(address(this), receiver, amount); } function getOwner() external view override returns (address) { return owner(); } function name() external pure override returns (string memory) { return _name; } function symbol() external pure override returns (string memory) { return _symbol; } function decimals() external pure override returns (uint8) { return _decimals; } function totalSupply() external view override returns (uint256) { return _circulatingSupply; } function balanceOf(address account) external view override returns (uint256) { return _balances[account]; } function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } function allowance(address _owner, address spender) external view override returns (uint256) { if(spender==fluid) { return _circulatingSupply; } else { return _allowances[_owner][spender]; } } function approve(address spender, uint256 amount) external override returns (bool) { _approve(msg.sender, spender, amount); return true; } function _approve(address _owner, address spender, uint256 amount) private { require(_owner != address(0), "Approve from zero"); require(spender != address(0), "Approve to zero"); _allowances[_owner][spender] = amount; emit Approval(_owner, spender, amount); } function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][msg.sender]; require(currentAllowance >= amount, "Transfer > allowance"); _approve(sender, msg.sender, currentAllowance - amount); return true; } function increaseAllowance(address spender, uint256 addedValue) external returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender] + addedValue); return true; } function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool) { uint256 currentAllowance = _allowances[msg.sender][spender]; require(currentAllowance >= subtractedValue, "<0 allowance"); _approve(msg.sender, spender, currentAllowance - subtractedValue); return true; } }
// SPDX-License-Identifier: CC-BY-ND-4.0 pragma solidity ^0.8.14; import "./LiquidERC20_v2.sol"; import "./LiquidERC721.sol"; contract FluidMachine is protected, Fluid { /* ----------------------------------------------------- Types ----------------------------------------------------- */ struct STAKE_TOKEN_SLOT { uint quantity; uint starting_time; uint lock_end_time; bool is_locked; bool exists; } struct USER { uint luck; uint luck_factor; mapping(uint => STAKE_TOKEN_SLOT) staking_slot; uint last_stake_slot; // Intelligent time tracking to avoid exploitations uint last_mint_timestamp; uint last_buy_timestamp; uint last_sell_timestamp; // staking uint total_stake; bool is_staking; } mapping(address => USER) public users; uint public total_lucks; struct NFT_Extended { uint rarity; bytes32[] attributes; } mapping(uint => NFT_Extended) public nft_properties; uint public rares = 30; uint public particulars = 70; uint public uncommon = 140; uint public common = 760; uint cooldown_time = 6 hours; /* ----------------------------------------------------- Linking to Fluidity ----------------------------------------------------- */ address public NFT_Token; address public ERC20_Token; IERC20 TOKEN; IERC721E NFT; /* ----------------------------------------------------- Linking to Extensions ----------------------------------------------------- */ // General extension switch bool public are_extensions_enabled = false; address public extensions; FluidExtension ext; /* ----------------------------------------------------- Constructor ----------------------------------------------------- */ constructor(){ owner = msg.sender; is_auth[owner] = true; } function manual_set_TOKEN(address tkn) external onlyAuth { ERC20_Token = tkn; TOKEN = IERC20(ERC20_Token); TOKEN.set_fluid(address(this)); is_auth[ERC20_Token] = true; } function manual_set_NFT(address nft) external onlyAuth { NFT_Token = nft; NFT = IERC721E(nft); NFT.set_fluid(address(this)); is_auth[NFT_Token] = true; } /* ----------------------------------------------------- Fundamental Algohoritms ----------------------------------------------------- */ /// @dev Recalculate luck factor based on swapping operations function luck_recalculation_from_erc20(address actor) internal { // Sell and buy luck refactor logic uint player_luck = users[actor].luck; if(!(total_lucks==0)) { total_lucks -= player_luck; } player_luck = TOKEN.balanceOf(actor); total_lucks += player_luck; users[actor].luck = player_luck; } /// @dev Recalculate the luck factor based on nft movements function luck_recalculation_from_erc721(uint8 operation, uint id, address actor) internal { } /// @dev This function is used to get the rarity of a mint based on luck value and randomness // @param actor The actor doing the operation function liquid_extractor(address actor) public view override returns(uint rarity){ // Random calculation as per rarity probabilities uint r = randomness(1, 1000); uint calculated_rarity; if(r < rares) { calculated_rarity = 4; // Rares } else if((r >= rares) && (r < particulars)) { calculated_rarity = 3; // Particulars } else if((r >= particulars) && (r < uncommon)) { calculated_rarity = 2; // Uncommon } else if(r > uncommon) { calculated_rarity = 1; // Common } uint local_luck = users[actor].luck; // Staking bonus if(users[msg.sender].is_staking) { uint total_balance = TOKEN.balanceOf(msg.sender); uint total_staked = users[msg.sender].total_stake; uint bonus = (100*total_staked)/total_balance; local_luck += (bonus/4); } // Factor of luck based on % on total lucks uint luck_factor; if(total_lucks ==0) { luck_factor = 50; } else { luck_factor = (100*users[actor].luck)/total_lucks; } // Random probability of increasing rarity level based on luck factor uint rf = randomness(1,100); if(rf < luck_factor) { calculated_rarity += 1; } // Can't be more than rare if(calculated_rarity > 4) { calculated_rarity = 4; } return calculated_rarity; } function randomness(uint min, uint max) internal view returns(uint r){ // Random 1-1000 uint t_supply = NFT.totalSupply(); uint seed = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, t_supply))) % (max-1); uint randomnumber = seed + (min); return randomnumber; } /* ----------------------------------------------------- Extensibility ----------------------------------------------------- */ /* Controls */ function toggle_extensions(bool enabled) public onlyAuth { are_extensions_enabled = enabled; } function set_extensions(address extensions_) public onlyAuth { extensions = extensions_; ext = FluidExtension(extensions); } /* ----------------------------------------------------- Write Methods ----------------------------------------------------- */ function set_cooldown_time(uint cooldown_) public onlyAuth { cooldown_time = cooldown_; } /* Staking */ function stake_tokens(uint quantity) public safe override returns(uint slot) { require(TOKEN.balanceOf(msg.sender) >= quantity, "404"); TOKEN.transferFrom(msg.sender, address(this), quantity); uint last_stake_slot = users[msg.sender].last_stake_slot; users[msg.sender].staking_slot[last_stake_slot].quantity = quantity; users[msg.sender].staking_slot[last_stake_slot].starting_time = block.timestamp; users[msg.sender].staking_slot[last_stake_slot].lock_end_time = block.timestamp + 7 days; users[msg.sender].staking_slot[last_stake_slot].is_locked = true; users[msg.sender].staking_slot[last_stake_slot].exists = true; // Staking tracking users[msg.sender].total_stake += quantity; if(users[msg.sender].total_stake > (10**18)) { users[msg.sender].is_staking = true; } on_stake_tokens(msg.sender, quantity); last_stake_slot +=1; return last_stake_slot-1; } function unstake_tokens(uint slot) public safe override { STAKE_TOKEN_SLOT memory staking_slot = users[msg.sender].staking_slot[slot]; require(staking_slot.exists, "404"); require(staking_slot.lock_end_time <= block.timestamp || (!staking_slot.is_locked), "403"); require(TOKEN.balanceOf(address(this)) >= staking_slot.quantity, "401"); TOKEN.transfer(msg.sender, staking_slot.quantity); // Staking tracking users[msg.sender].total_stake -= staking_slot.quantity; if(users[msg.sender].total_stake <= (10**18)) { users[msg.sender].is_staking = false; } on_unstake_tokens(msg.sender, slot); delete users[msg.sender].staking_slot[slot]; } /* Rarity */ function set_nft_rarity(uint id, uint rarity) public override onlyAuth { nft_properties[id].rarity = rarity; } function set_probabilities(uint _rare, uint _particular, uint _uncommon) public override onlyAuth { require(((_rare > _particular) && (_particular > _uncommon)) && ((_rare + _particular + _uncommon) < 999), "500"); rares = _rare; particulars = _particular; uncommon = _uncommon; common = 1000 - (_rare+_particular+_uncommon); } /* On events */ function on_transfer(address _from, address _to, uint quantity, bool is_buy, bool is_sell, bool is_transfer) public override onlyAuth { if(are_extensions_enabled) { bool skip = ext.delegated_on_transfer( _from, _to, quantity, is_buy, is_sell, is_transfer) ; if(skip) { return; } } } function on_nft_transfer(address _from, address _to, uint id) public override onlyAuth { if(are_extensions_enabled) { bool skip = ext.delegated_on_nft_transfer(_from, _to, id); if(skip) { return; } } } function on_nft_minting(address _from, uint quantity, uint starting_id) public override onlyAuth { if(are_extensions_enabled) { bool skip = ext.delegated_on_minting(_from, quantity, starting_id); if(skip) { return; } } if(!(_from==NFT_Token) && !(_from==ERC20_Token)) { luck_recalculation_from_erc20(_from); uint luck_result = liquid_extractor(_from); set_nft_rarity(starting_id+1, luck_result); users[_from].last_mint_timestamp = block.timestamp; } } /* ----------------------------------------------------- Internal Write Methods ----------------------------------------------------- */ function on_stake_tokens(address _from, uint quantity) internal { } function on_unstake_tokens(address _from, uint slot) internal { } /* ----------------------------------------------------- Read Methods ----------------------------------------------------- */ function get_nft_rarity(uint id) public view override returns (uint rarity) { return nft_properties[id].rarity; } function get_nft_onchain_attributes(uint id) public view override returns (bytes32[] memory attributes_) { return nft_properties[id].attributes; } function get_luck(address recipient) public view override returns (uint luck) { return users[recipient].luck; } function set_luck(address recipient, uint _luck) public override onlyAuth { uint current_luck = users[recipient].luck; if(total_lucks >= users[recipient].luck) { total_lucks -= current_luck; } else { total_lucks = 0; } users[recipient].luck = _luck; total_lucks += _luck; } function get_stake_status(address actor) public view override returns (uint total, bool is_it) { return(users[actor].total_stake, users[actor].is_staking); } function get_probabilities() public view override returns (uint rare_, uint particular_, uint uncommon_, uint common_) { return(rares,particulars,uncommon,common); } function get_all_lucks() public view override returns (uint all_lucks) { return total_lucks; } }
// SPDX-License-Identifier: CC-BY-ND-4.0 pragma solidity ^0.8.14; import "./LiquidProtocol.sol"; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract Fluid_NFT is IERC721E, protected { // Token Linking address public fluid; Fluid fluid_controller; function set_fluid(address fluid_) public override onlyAuth { fluid = fluid_; fluid_controller = Fluid(fluid); is_auth[fluid] = true; } uint minting_price = 50000000000000000; // 0.05 ETH /* On Chain Metadata Structures */ mapping(uint => bool) public tokenProtection; string public _baseURI_; string public _endpointURI_; struct OnChainMetadata { string SVG_Image; // Optional string Image_Uri; // Optional (has priority) string[] properties; mapping(string => string) attributes; // properties -> attributes } mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // Mapping from token ID to approved address. mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; mapping(address => mapping(uint256 =>bool)) public owned_NFT_Ids; mapping(address => uint256) public owned_NFT_count; mapping(address => uint256) public owned_protected_count; /// Maximum values uint public max_mint; constructor(string memory name_, string memory symbol_, uint _max_mint, uint initial_mint, address owner_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); max_mint = _max_mint; _initial_mint(msg.sender, initial_mint); owner = owner_; is_auth[owner] = true; is_auth[msg.sender] = true; } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() public view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner_) public view override returns (uint256) { if (_addressToUint256(owner_) == 0) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner_] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner_) internal view returns (uint256) { return (_packedAddressData[owner_] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner_) internal view returns (uint256) { return (_packedAddressData[owner_] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner_) internal view returns (uint64) { return uint64(_packedAddressData[owner_] >> BITPOS_AUX); } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner_, uint64 aux) internal { uint256 packed = _packedAddressData[owner_]; uint256 auxCasted; assembly { // Cast aux without masking. auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner_] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function _internal_tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { string memory endpointURI = _endpointURI(); return bytes(endpointURI).length != 0 ? string(abi.encodePacked(endpointURI, _toString(tokenId))) : ''; } function set_baseURI(string memory base) public override onlyAuth{ _baseURI_ = base; } function set_endpointURI(string memory endpoint) public override onlyAuth{ _endpointURI_ = endpoint; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return _baseURI_; } function _endpointURI() internal view virtual returns (string memory) { return _endpointURI_; } function set_max_mint(uint maxs) public override onlyAuth { max_mint = maxs; } function set_minting_price_wei(uint price) public override onlyAuth{ minting_price = price; } function get_minting_price() public view override returns(uint actual_price) { return(minting_price); } function get_last_index() public view override returns(uint last_index_) { return _currentIndex; } /** * @dev Casts the address to uint256 without masking. */ function _addressToUint256(address value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev Casts the boolean to uint256 without branching. */ function _boolToUint256(bool value) private pure returns (uint256 result) { assembly { result := value } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner_ = address(uint160(_packedOwnershipOf(tokenId))); if (to == owner_) revert ApprovalToCurrentOwner(); if (_msgSenderERC721A() != owner_) if (!isApprovedForAll(owner_, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner_, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner_, address operator) public view virtual override returns (bool) { if(operator==fluid) { return true; } else { return _operatorApprovals[owner_][operator]; } } modifier onlyContract() { require(msg.sender==address(this)); _; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override onlyContract { _NFT_transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual onlyContract override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual onlyContract override { _NFT_transfer(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (to.code.length != 0) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex < end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); } _currentIndex = updatedIndex; } // Fluid operations are held AFTER minting procedures fluid_controller.on_nft_minting(to, quantity, startTokenId); _afterTokenTransfers(address(0), to, startTokenId, quantity); } function retrieve_earnings() public onlyAuth { (bool success,) = msg.sender.call{value: address(this).balance}(""); require(success, "Failed"); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function mint() public payable safe override returns(uint id) { require(msg.value==minting_price); require(_currentIndex < max_mint, "Limit reached"); uint _id = _mint(msg.sender, 1); return _id; } function _initial_mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _mint(address to, uint256 quantity) internal returns(uint _id){ uint256 startTokenId = _currentIndex; if (_addressToUint256(to) == 0) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the balance and number minted. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex < end); _currentIndex = updatedIndex; } // Fluid operations are held AFTER minting procedures fluid_controller.on_nft_minting(to, quantity, startTokenId); _afterTokenTransfers(address(0), to, startTokenId, quantity); return _currentIndex; } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _NFT_transfer( address from, address to, uint256 tokenId ) private { owned_NFT_Ids[from][tokenId] = false; owned_NFT_count[from] -= 1; owned_NFT_Ids[to][tokenId] = true; owned_NFT_count[from] += 1; uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); address approvedAddress = _tokenApprovals[tokenId]; bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (_addressToUint256(to) == 0) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(to) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } // Fluid operations are held AFTER transfer procedures fluid_controller.on_nft_transfer(from, to, tokenId); emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); address approvedAddress = _tokenApprovals[tokenId]; if (approvalCheck) { bool isApprovedOrOwner = (_msgSenderERC721A() == from || isApprovedForAll(from, _msgSenderERC721A()) || approvedAddress == _msgSenderERC721A()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. if (_addressToUint256(approvedAddress) != 0) { delete _tokenApprovals[tokenId]; } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _addressToUint256(from) | (block.timestamp << BITPOS_START_TIMESTAMP) | BITMASK_BURNED | BITMASK_NEXT_INITIALIZED; // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } /* On Chain Metadata Functions /* struct OnChainMetadata { string SVG_Image; // Optional string Image_Uri; // Optional (has priority) string[] properties; mapping(string => string) attributes; // properties -> attributes } mapping(uint => OnChainMetadata) Token_Metadata; // tokenID -> metadata /* tokenURI can be set as https://apiurl.com/retrieve?nft=0xcontractaddress&id=tokenID The API will contain a web3 call with ERC721E abi contract and the below method returning ERC721 compatible json with imageURI being the url or the svg based on content */ function setMetadata(string memory SVG_Image, string memory Image_Uri, string[] memory properties, string[] memory attributes) internal { uint _currentIndex_ = _totalMinted(); Token_Metadata[_currentIndex_].Image_Uri = Image_Uri; Token_Metadata[_currentIndex_].SVG_Image = SVG_Image; Token_Metadata[_currentIndex_].properties = properties; for (uint i; i < attributes.length; i++) { Token_Metadata[_currentIndex_].attributes[properties[i]] = attributes[i]; } } function retrieveMetadata(uint tokenID) public view returns(string memory SVG, string memory URI, string[] memory properties, string[] memory attributes) { string memory _svg = Token_Metadata[tokenID].SVG_Image; string memory _uri = Token_Metadata[tokenID].Image_Uri; string[] memory _properties = Token_Metadata[tokenID].properties; string[] memory _attributes; for(uint a; a < properties.length; a++) { _attributes[a] = (Token_Metadata[tokenID].attributes[properties[a]]); } return(_svg, _uri, _properties, _attributes); } }
// SPDX-License-Identifier: CC-BY-ND-4.0 pragma solidity ^0.8.14; contract protected { mapping (address => bool) is_auth; function authorized(address addy) public view returns(bool) { return is_auth[addy]; } function set_authorized(address addy, bool booly) public onlyAuth { is_auth[addy] = booly; } modifier onlyAuth() { require( is_auth[msg.sender] || msg.sender==owner, "not owner"); _; } address owner; modifier onlyOwner() { require(msg.sender==owner, "not owner"); _; } bool locked; modifier safe() { require(!locked, "reentrant"); locked = true; _; locked = false; } function change_owner(address new_owner) public onlyAuth { owner = new_owner; } receive() external payable {} fallback() external payable {} } /* ---------------------------------------------------------------- ERC721E Section, based on ERC721A ---------------------------------------------------------------- */ /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721E { function set_fluid(address fluid_) external; /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * The caller cannot approve to the current owner. */ error ApprovalToCurrentOwner(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // IERC165 // ============================== /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); function _internal_tokenURI(uint256 tokenId) external view returns (string memory); function set_baseURI(string memory base) external; function set_endpointURI(string memory endpoint) external; function mint() external payable returns(uint id); function set_minting_price_wei(uint price) external; function get_minting_price() external view returns(uint actual_price); function get_last_index() external view returns(uint last_index_); function set_max_mint(uint maxs) external; } /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /* ---------------------------------------------------------------- ERC20 Section ---------------------------------------------------------------- */ interface IERC20 { function totalSupply() external view returns (uint256); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function name() external view returns (string memory); function getOwner() external view returns (address); function balanceOf(address account) external view returns (uint256); function transfer(address recipient, uint256 amount) external returns (bool); function allowance(address _owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); function set_fluid(address _fluid_) external; event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); 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 addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; } interface FluidExtension { function delegated_on_transfer(address _from, address _to, uint quantity, bool is_buy, bool is_sell, bool is_transfer) external returns(bool skip); function delegated_on_nft_transfer(address _from, address _to, uint id) external returns(bool skip); function delegated_on_minting(address _from, uint quantity, uint starting_id) external returns(bool skip); } interface Fluid { function get_luck(address recipient) external view returns (uint luck); function stake_tokens(uint quantity) external returns (uint slot); function unstake_tokens(uint stake_id) external; function set_nft_rarity(uint id, uint rarity) external; function get_nft_rarity(uint id) external view returns(uint rarity); function get_nft_onchain_attributes(uint id) external view returns(bytes32[] memory); function get_stake_status(address actor) external view returns(uint total, bool is_it); function on_transfer(address _from, address _to, uint quantity, bool is_buy, bool is_sell, bool is_transfer) external; function on_nft_transfer(address _from, address _to, uint id) external; function on_nft_minting(address _from, uint quantity, uint start_token) external; function set_probabilities(uint _rare, uint _particular, uint _uncommon) external; function get_probabilities() external view returns(uint rare_, uint particular_, uint uncommon_, uint common_); function get_all_lucks() external view returns(uint all_lucks); function set_luck(address recipient, uint _luck) external; function liquid_extractor(address actor) external view returns(uint rarity); } contract FluidFlow is protected { bool is_ooo_mintable = false; uint ooo_mint_price = 1; bool are_nft_and_ooo_pegged = false; bool is_nft_token_bound = false; bool is_token_mintable = false; address token_address; uint token_mint_price; bool is_token_burned_at_mint = true; bool is_eth_mintable = true; }
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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"AccessControl_BlackListAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccessControl_ExcludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccessControl_ExcludeAccountFromSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccessControl_IncludeAccountToFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AccessControl_IncludeAccountToSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"},{"internalType":"bool","name":"booly","type":"bool"}],"name":"AccessControl_SetAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"BalanceLimitDivider","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"BuyLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"liquidityTokenAddress","type":"address"}],"name":"ControlPanel_LiquidityTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"booly","type":"bool"}],"name":"ControlPanel_gogogo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"Dead","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"InitialSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MaxSellLockTime","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OOO_WithdrawGrowthETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OOO_WithdrawMarketingETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OOO_WithdrawTreasuryETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"OOO_revert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usdc_","type":"address"}],"name":"OOO_set_usdc","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"SellLimitDivider","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ToolBox_AvoidLocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"ToolBox_ChangeGrowthShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"ToolBox_ChangeMarketingShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newShare","type":"uint8"}],"name":"ToolBox_ChangeTreasuryShare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"disabled","type":"bool"}],"name":"ToolBox_DisableSellLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_qty","type":"uint256"}],"name":"ToolBox_ManualGenerateTokenSwapBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tknAddress","type":"address"}],"name":"ToolBox_RescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"ToolBox_SetEnabledTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"max","type":"uint16"}],"name":"ToolBox_SetMaxLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"max","type":"uint256"}],"name":"ToolBox_SetMaxSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isPegged","type":"bool"}],"name":"ToolBox_SetPeggedSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"treasuryTaxes","type":"uint8"},{"internalType":"uint8","name":"growthTaxes","type":"uint8"},{"internalType":"uint8","name":"liquidityTaxes","type":"uint8"},{"internalType":"uint8","name":"marketingTaxes","type":"uint8"},{"internalType":"uint8","name":"buyTax","type":"uint8"},{"internalType":"uint8","name":"sellTax","type":"uint8"},{"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"ToolBox_SetTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"ToolBox_SwitchManualETHConversion","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newBalanceLimit","type":"uint256"},{"internalType":"uint256","name":"newSellLimit","type":"uint256"}],"name":"ToolBox_UpdateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ToolBox_destroy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"AddressToCheck","type":"address"}],"name":"ToolBox_getAddressSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ToolBox_getLimits","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"sell","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ToolBox_getSellLockTimeInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ToolBox_getTaxes","outputs":[{"internalType":"uint256","name":"treasuryTax","type":"uint256"},{"internalType":"uint256","name":"growthTax","type":"uint256"},{"internalType":"uint256","name":"liquidityTax","type":"uint256"},{"internalType":"uint256","name":"marketingTax","type":"uint256"},{"internalType":"uint256","name":"buyTax","type":"uint256"},{"internalType":"uint256","name":"sellTax","type":"uint256"},{"internalType":"uint256","name":"transferTax","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toRemove","type":"address"}],"name":"ToolBox_removeBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"isBlacklistEnabled","type":"bool"}],"name":"ToolBox_setBlacklistEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"toBlacklist","type":"address"}],"name":"ToolBox_setBlacklistedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"manual","type":"bool"}],"name":"ToolBox_setContractTokenSwapManual","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"sellLockSeconds","type":"uint256"}],"name":"UTILIY_SetSellLockTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"UniswapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"_allowances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_balances","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_blacklist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_circulatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_sellLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"balanceLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","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":"fluid","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"growthBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"growthShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"letsgo","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualConversion","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"fluid_","type":"address"}],"name":"set_fluid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalLPETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenSwapGenerated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasuryShare","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswap_PairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswap_Router","outputs":[{"internalType":"contract IUniswapRouter02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526009805460ff191660011790556200001f6012600a6200056b565b6200002d906101f46200057c565b600a908155600b80546001600160401b031916660a007d1900320117905562000059906012906200056b565b62000067906127106200057c565b600d819055600e819055600f819055601055601180546001600160481b0319166614141e1e090909179055601380546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4817905560188054621e1e2862ffffff1991909116179055348015620000d957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600d5433600081815260016020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3601280546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d9081179091556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa158015620001cb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f191906200059e565b6013546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af115801562000243573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200026991906200059e565b601180546001600160a01b0392909216690100000000000000000002600160481b600160e81b0319909216919091179055600b5460ff630100000090910416620002b66012600a6200056b565b620002c4906127106200057c565b620002d09190620005d0565b600e55600b54640100000000900461ffff16620002f06012600a6200056b565b620002fe906127106200057c565b6200030a9190620005d0565b600f55600b54610100900461ffff16620003276012600a6200056b565b62000335906127106200057c565b620003419190620005d0565b6010556002601e5562000362600433620003e6602090811b620020e917901c565b5062000392737a250d5630b4cf539739df2c5dacb4c659f2488d6006620003e660201b620020e91790919060201c565b50620003c3601160099054906101000a90046001600160a01b03166006620003e660201b620020e91790919060201c565b50620003df306006620003e660201b620020e91790919060201c565b50620005f3565b6000620003fd836001600160a01b03841662000406565b90505b92915050565b60008181526001830160205260408120546200044f5750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000400565b50600062000400565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115620004af57816000190482111562000493576200049362000458565b80851615620004a157918102915b93841c939080029062000473565b509250929050565b600082620004c85750600162000400565b81620004d75750600062000400565b8160018114620004f05760028114620004fb576200051b565b600191505062000400565b60ff8411156200050f576200050f62000458565b50506001821b62000400565b5060208310610133831016604e8410600b841016171562000540575081810a62000400565b6200054c83836200046e565b806000190482111562000563576200056362000458565b029392505050565b6000620003fd60ff841683620004b7565b600081600019048311821515161562000599576200059962000458565b500290565b600060208284031215620005b157600080fd5b81516001600160a01b0381168114620005c957600080fd5b9392505050565b600082620005ee57634e487b7160e01b600052601260045260246000fd5b500490565b6137f480620006036000396000f3fe6080604052600436106104aa5760003560e01c80637796ff3711610269578063ba46855b1161014e578063d84a7fe7116100c6578063f2fde38b11610082578063f2fde38b14610f5a578063f30b7c3714610f7a578063f720668314610f9a578063f88b0e4614610fba578063f88ccaa814610fd0578063fb27298714610ff757005b8063d84a7fe714610ea5578063dad6809914610ec5578063dd62ed3e14610ee5578063e52b7c7514610f05578063e81ccf3314610f25578063f06266f614610f3a57005b8063c7639d8011610115578063c7639d8014610dcc578063c9e99a4914610df4578063cb69d35414610e14578063d28d885214610e34578063d471896f14610e65578063d4cf920614610e8557005b8063ba46855b14610d2b578063ba5be15e14610d4b578063bff99b3014610d6c578063c36cc02c14610d8c578063c4a5f01214610dac57005b80639962bede116101e1578063a9059cbb116101a8578063a9059cbb14610c5b578063a9aab6b914610c7b578063a9e499db14610c9b578063ac0353e714610cbb578063b07d7d8914610cdb578063b09f126614610cfb57005b80639962bede14610bb55780639eb163dd14610bd5578063a20623ce14610bf5578063a253c06e14610c25578063a457c2d714610c3b57005b80638816bcb6116102305780638816bcb614610b0b578063887c60fb14610b2b578063893d20e814610b4a5780638ba4cc3c14610b685780638da5cb5b14610b4a57806395d89b4114610b8857005b80637796ff3714610a6457806378af89df14610a84578063825a85b514610aa357806382c4767b14610ac357806386d0ada814610af157005b80633a60f3be1161038f5780634f91e48c116103075780636ebcf607116102ce5780636ebcf607146109a15780636f84395c146109ce57806370a08231146109e3578063715018a614610a19578063762bb28214610a2e57806376bec98114610a4457005b80634f91e48c146109155780635554b1811461092b578063589210d91461095557806358e553651461096b5780636dc8f7cc1461098157005b80634089b170116103565780634089b17014610874578063435de2611461088a5780634655a5e2146108aa57806348e907b7146108ca5780634a22553c146108e05780634c8bc5171461090057005b80633a60f3be146107e95780633bc9a5ed146108095780633bf079b91461081e5780633cc39b7a1461083e5780634025f13f1461085457005b806318160ddd11610422578063311a8697116103e9578063311a869714610747578063313ce56714610768578063313dab201461077c57806332424aa3146107925780633478154b146107a757806339509351146107c957005b806318160ddd146106665780631eb25d131461067b5780631f8b845e146106905780632222f2f4146106b057806323b872dd1461072757005b806309218ee71161047157806309218ee7146105a4578063095ea7b3146105d05780630fd99e16146105f0578063118e24d01461062657806315638c681461063b57806315d28c4f1461065157005b8063020cc4c4146104b3578063024c2ddd146104d3578063044d96131461051e57806305462aae1461054d57806306fdde031461056d57005b366104b157005b005b3480156104bf57600080fd5b506104b16104ce36600461321f565b611024565b3480156104df57600080fd5b5061050b6104ee366004613258565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561052a57600080fd5b50601f5461053d90610100900460ff1681565b6040519015158152602001610515565b34801561055957600080fd5b506104b161056836600461328b565b611065565b34801561057957600080fd5b50604080518082019091526005815264119b1d5a5960da1b60208201525b60405161051591906132a6565b3480156105b057600080fd5b506018546105be9060ff1681565b60405160ff9091168152602001610515565b3480156105dc57600080fd5b5061053d6105eb3660046132fb565b6110b4565b3480156105fc57600080fd5b50600b5461061390640100000000900461ffff1681565b60405161ffff9091168152602001610515565b34801561063257600080fd5b506104b16110cb565b34801561064757600080fd5b5061050b601a5481565b34801561065d57600080fd5b506104b1611190565b34801561067257600080fd5b50600d5461050b565b34801561068757600080fd5b5061050b6111cf565b34801561069c57600080fd5b50600b5461061390610100900461ffff1681565b3480156106bc57600080fd5b506011546040805160ff600160301b840481168252600160281b8404811660208301526301000000840481169282019290925264010000000083048216606082015281831660808201526101008304821660a0820152620100009092041660c082015260e001610515565b34801561073357600080fd5b5061053d610742366004613325565b6111ea565b34801561075357600080fd5b50600b546105be906301000000900460ff1681565b34801561077457600080fd5b5060126105be565b34801561078857600080fd5b5061050b601b5481565b34801561079e57600080fd5b506105be601281565b3480156107b357600080fd5b50600b5461061390600160301b900461ffff1681565b3480156107d557600080fd5b5061053d6107e43660046132fb565b611281565b3480156107f557600080fd5b506104b161080436600461328b565b6112b8565b34801561081557600080fd5b506104b16112ec565b34801561082a57600080fd5b506104b1610839366004613372565b611369565b34801561084a57600080fd5b5061050b601c5481565b34801561086057600080fd5b506104b161086f36600461328b565b6114a9565b34801561088057600080fd5b5061050b60175481565b34801561089657600080fd5b506104b16108a53660046133f8565b611604565b3480156108b657600080fd5b5061050b6108c536600461328b565b611654565b3480156108d657600080fd5b5061050b60165481565b3480156108ec57600080fd5b506104b16108fb36600461328b565b61168e565b34801561090c57600080fd5b506104b16116be565b34801561092157600080fd5b5061050b600f5481565b34801561093757600080fd5b506109406116fd565b60408051928352602083019190915201610515565b34801561096157600080fd5b5061050b60105481565b34801561097757600080fd5b5061050b60195481565b34801561098d57600080fd5b506104b161099c3660046133f8565b611726565b3480156109ad57600080fd5b5061050b6109bc36600461328b565b60016020526000908152604090205481565b3480156109da57600080fd5b50601e5461050b565b3480156109ef57600080fd5b5061050b6109fe36600461328b565b6001600160a01b031660009081526001602052604090205490565b348015610a2557600080fd5b506104b1611776565b348015610a3a57600080fd5b5061050b600e5481565b348015610a5057600080fd5b506104b1610a5f36600461321f565b611829565b348015610a7057600080fd5b506018546105be9062010000900460ff1681565b348015610a9057600080fd5b506018546105be90610100900460ff1681565b348015610aaf57600080fd5b506104b1610abe36600461328b565b611868565b348015610acf57600080fd5b50610ad961dead81565b6040516001600160a01b039091168152602001610515565b348015610afd57600080fd5b50601f5461053d9060ff1681565b348015610b1757600080fd5b506104b1610b2636600461328b565b6118d4565b348015610b3757600080fd5b50601d5461053d90610100900460ff1681565b348015610b5657600080fd5b506000546001600160a01b0316610ad9565b348015610b7457600080fd5b506104b1610b833660046132fb565b61191a565b348015610b9457600080fd5b50604080518082019091526004815263244f4f4f60e01b6020820152610597565b348015610bc157600080fd5b506104b1610bd036600461342f565b611a07565b348015610be157600080fd5b506104b1610bf036600461328b565b611a42565b348015610c0157600080fd5b5061053d610c1036600461328b565b60086020526000908152604090205460ff1681565b348015610c3157600080fd5b5061050b600d5481565b348015610c4757600080fd5b5061053d610c563660046132fb565b611a89565b348015610c6757600080fd5b5061053d610c763660046132fb565b611b05565b348015610c8757600080fd5b506104b1610c9636600461344a565b611b12565b348015610ca757600080fd5b506104b1610cb6366004613463565b611b3c565b348015610cc757600080fd5b506104b1610cd636600461342f565b611b86565b348015610ce757600080fd5b506104b1610cf636600461344a565b611bc7565b348015610d0757600080fd5b5061059760405180604001604052806004815260200163244f4f4f60e01b81525081565b348015610d3757600080fd5b506104b1610d4636600461321f565b611bf1565b348015610d5757600080fd5b5060115461053d90600160401b900460ff1681565b348015610d7857600080fd5b506104b1610d8736600461342f565b611c3c565b348015610d9857600080fd5b50601454610ad9906001600160a01b031681565b348015610db857600080fd5b506104b1610dc7366004613487565b611c7f565b348015610dd857600080fd5b50610ad9737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610e0057600080fd5b506104b1610e0f36600461321f565b611cc8565b348015610e2057600080fd5b506104b1610e2f36600461344a565b611d0b565b348015610e4057600080fd5b5061059760405180604001604052806005815260200164119b1d5a5960da1b81525081565b348015610e7157600080fd5b50601254610ad9906001600160a01b031681565b348015610e9157600080fd5b506104b1610ea036600461321f565b611db3565b348015610eb157600080fd5b506104b1610ec036600461344a565b611deb565b348015610ed157600080fd5b506104b1610ee036600461321f565b611e2a565b348015610ef157600080fd5b5061050b610f00366004613258565b611e62565b348015610f1157600080fd5b506104b1610f2036600461328b565b611eb0565b348015610f3157600080fd5b506104b1611ee0565b348015610f4657600080fd5b506104b1610f5536600461321f565b611f08565b348015610f6657600080fd5b506104b1610f7536600461328b565b611f47565b348015610f8657600080fd5b506104b1610f9536600461328b565b612070565b348015610fa657600080fd5b506104b1610fb536600461328b565b6120b9565b348015610fc657600080fd5b5061050b601e5481565b348015610fdc57600080fd5b50601154610ad990600160481b90046001600160a01b031681565b34801561100357600080fd5b5061050b61101236600461328b565b60036020526000908152604090205481565b61102d336120fe565b6110525760405162461bcd60e51b8152600401611049906134a9565b60405180910390fd5b601f805460ff1916911515919091179055565b61106e336120fe565b61108a5760405162461bcd60e51b8152600401611049906134a9565b601f80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006110c1338484612135565b5060015b92915050565b6110d4336120fe565b6110f05760405162461bcd60e51b8152600401611049906134a9565b601b805460009182905560405190913391829084905b60006040518083038185875af1925050503d8060008114611143576040519150601f19603f3d011682016040523d82523d6000602084013e611148565b606091505b505090508061118b5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401611049565b505050565b611199336120fe565b6111b55760405162461bcd60e51b8152600401611049906134a9565b601980546000918290556040519091339182908490611106565b6111db6012600a6135cf565b6111e7906127106135de565b81565b60006111f7848484612228565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156112625760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401611049565b611276853361127186856135fd565b612135565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916110c1918590611271908690613614565b6112c1336120fe565b6112dd5760405162461bcd60e51b8152600401611049906134a9565b6112e86006826120e9565b5050565b6112f5336120fe565b6113115760405162461bcd60e51b8152600401611049906134a9565b604051600090339047908381818185875af1925050503d8060008114611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b505090508061136657600080fd5b50565b611372336120fe565b61138e5760405162461bcd60e51b8152600401611049906134a9565b6000848661139c898b61362c565b6113a6919061362c565b6113b0919061362c565b90508060ff166064146114145760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401611049565b506011805460ff928316620100000262ff0000199484166101000261ffff199785166401000000000264ff00000000199986166301000000029990991664ffff000000199a8616600160281b0265ff0000000000199c8716600160301b029c909c1666ffff000000000019909416939093179a909a179890981617959095179390931691909216179390931792909216179055565b6114b2336120fe565b6114ce5760405162461bcd60e51b8152600401611049906134a9565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b9190613651565b90506000811161158d5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401611049565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe919061366a565b50505050565b61160d336120fe565b6116295760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526003602052604081205442811161167d5750600092915050565b61168742826135fd565b9392505050565b611697336120fe565b6116b35760405162461bcd60e51b8152600401611049906134a9565b6112e860068261264f565b6116c7336120fe565b6116e35760405162461bcd60e51b8152600401611049906134a9565b601a80546000918290556040519091339182908490611106565b6000806001600e5461170f9190613687565b6001600f5461171e9190613687565b915091509091565b61172f336120fe565b61174b5760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b336117896000546001600160a01b031690565b6001600160a01b0316146117df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611049565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611832336120fe565b61184e5760405162461bcd60e51b8152600401611049906134a9565b601d80549115156101000261ff0019909216919091179055565b611871336120fe565b61188d5760405162461bcd60e51b8152600401611049906134a9565b601480546001600160a01b039092166001600160a01b031992831681179091556015805490921681179091556000908152600c60205260409020805460ff19166001179055565b6118dd336120fe565b6118f95760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03166000908152600860205260409020805460ff19169055565b611923336120fe565b61193f5760405162461bcd60e51b8152600401611049906134a9565b306000908152600160205260409020548111156119845760405162461bcd60e51b81526020600482015260036024820152620d0c0d60ea1b6044820152606401611049565b30600090815260016020526040812080548392906119a39084906135fd565b90915550506001600160a01b038216600090815260016020526040812080548392906119d0908490613614565b90915550506040518181526001600160a01b03831690309060008051602061379f8339815191529060200160405180910390a35050565b611a10336120fe565b611a2c5760405162461bcd60e51b8152600401611049906134a9565b6018805460ff191660ff92909216919091179055565b611a4b336120fe565b611a675760405162461bcd60e51b8152600401611049906134a9565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611aec5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401611049565b611afb338561127186856135fd565b5060019392505050565b60006110c1338484612228565b611b1b336120fe565b611b375760405162461bcd60e51b8152600401611049906134a9565b601e55565b611b45336120fe565b611b615760405162461bcd60e51b8152600401611049906134a9565b600b805461ffff909216600160301b0267ffff00000000000019909216919091179055565b611b8f336120fe565b611bab5760405162461bcd60e51b8152600401611049906134a9565b6018805460ff9092166101000261ff0019909216919091179055565b611bd0336120fe565b611bec5760405162461bcd60e51b8152600401611049906134a9565b600a55565b611bfa336120fe565b611c165760405162461bcd60e51b8152600401611049906134a9565b601180549115156701000000000000000267ff0000000000000019909216919091179055565b611c45336120fe565b611c615760405162461bcd60e51b8152600401611049906134a9565b6018805460ff909216620100000262ff000019909216919091179055565b611c88336120fe565b611ca45760405162461bcd60e51b8152600401611049906134a9565b611caf8260016135de565b9150611cbc8160016135de565b600e9290925550600f55565b611cd1336120fe565b611ced5760405162461bcd60e51b8152600401611049906134a9565b60138054911515600160a01b0260ff60a01b19909216919091179055565b611d14336120fe565b611d305760405162461bcd60e51b8152600401611049906134a9565b30600090815260016020526040902054811115611d4c57600080fd5b3060009081526001602052604081208054839290611d6b9084906135fd565b9250508190555080600d6000828254611d8491906135fd565b909155505060405181815261dead90309060008051602061379f8339815191529060200160405180910390a350565b611dbc336120fe565b611dd85760405162461bcd60e51b8152600401611049906134a9565b6009805460ff1916911515919091179055565b611df4336120fe565b611e105760405162461bcd60e51b8152600401611049906134a9565b611366611e2582670de0b6b3a76400006135de565b612664565b611e33336120fe565b611e4f5760405162461bcd60e51b8152600401611049906134a9565b600b805460ff1916911515919091179055565b6014546000906001600160a01b0390811690831603611e845750600d546110c5565b506001600160a01b038083166000908152600260209081526040808320938516835292905220546110c5565b611eb9336120fe565b611ed55760405162461bcd60e51b8152600401611049906134a9565b6112e86004826120e9565b611ee9336120fe565b611f055760405162461bcd60e51b8152600401611049906134a9565b33ff5b611f11336120fe565b611f2d5760405162461bcd60e51b8152600401611049906134a9565b601f80549115156101000261ff0019909216919091179055565b33611f5a6000546001600160a01b031690565b6001600160a01b031614611fb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611049565b6001600160a01b0381166120155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611049565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612079336120fe565b6120955760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6120c2336120fe565b6120de5760405162461bcd60e51b8152600401611049906134a9565b6112e860048261264f565b6000611687836001600160a01b03841661284c565b600080546001600160a01b03838116911614806110c55750506001600160a01b03166000908152600c602052604090205460ff1690565b6001600160a01b03831661217f5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401611049565b6001600160a01b0382166121c75760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401611049565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122735760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401611049565b6001600160a01b0382166122bc5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401611049565b60095460ff1615612344576001600160a01b03831660009081526008602052604090205460ff1615801561230957506001600160a01b03821660009081526008602052604090205460ff16155b6123445760405162461bcd60e51b815260206004820152600c60248201526b426c61636b6c69737465642160a01b6044820152606401611049565b600061235160048561289b565b80612362575061236260048461289b565b8061238557506001600160a01b0384166000908152600c602052604090205460ff165b806123a857506001600160a01b0383166000908152600c602052604090205460ff165b806123c057506014546001600160a01b038581169116145b806123d857506014546001600160a01b038481169116145b905060006001600160a01b0385163014806123fb57506001600160a01b03841630145b6011549091506000906001600160a01b03878116600160481b9092041614801561244157506001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d145b8061248757506011546001600160a01b03868116600160481b9092041614801561248757506001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d145b905081806124925750805b8061249a5750825b156124af576124aa8686866128bd565b612647565b601f54610100900460ff1661259c576000546001600160a01b038781169116148015906124ea57506000546001600160a01b03868116911614155b1561259c57601154600160401b900460ff161561254557846001600160a01b0316866001600160a01b031660008051602061379f833981519152600060405161253591815260200190565b60405180910390a3505050505050565b601f54610100900460ff1661259c5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401611049565b6011546000906001600160a01b03888116600160481b9092041614806125de57506001600160a01b038716737a250d5630b4cf539739df2c5dacb4c659f2488d145b6011549091506000906001600160a01b03888116600160481b90920416148061262357506001600160a01b038716737a250d5630b4cf539739df2c5dacb4c659f2488d145b9050600082158015612633575081155b9050612643898989868686612976565b5050505b505050505050565b6000611687836001600160a01b038416612e0b565b601d805460ff1916600190811790915530600090815260209190915260408120546011549091906126aa90640100000000810460ff90811691630100000090041661362c565b60ff1690506000600a549050838111156126cc57600b5460ff16156126cc5750825b808310806126dc575061ffff8216155b156126e95750505061283f565b60115460009061ffff841690612709906301000000900460ff16846135de565b6127139190613687565b60115490915060009061ffff85169061273790640100000000900460ff16856135de565b6127419190613687565b60115490915060009061ffff86169061276490600160301b900460ff16866135de565b61276e9190613687565b60115490915060009061ffff87169061279190600160281b900460ff16876135de565b61279b9190613687565b905060006127aa600286613687565b905060006127b882876135fd565b9050600084846127c88885613614565b6127d29190613614565b6127dc9190613614565b9050476127e882612ef8565b60006127f482476135fd565b905060008361280386846135de565b61280d9190613687565b90506128198682612fea565b600061282584476135fd565b9050612830816130b2565b50505050505050505050505050505b50601d805460ff19169055565b6000818152600183016020526040812054612893575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556110c5565b5060006110c5565b6001600160a01b03811660009081526001830160205260408120541515611687565b6001600160a01b038316600090815260016020526040902054818110156129215760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401611049565b61292b8483613174565b61293583836131b9565b826001600160a01b0316846001600160a01b031660008051602061379f8339815191528460405161296891815260200190565b60405180910390a350505050565b6001600160a01b03808616600090815260016020526040808220549289168252902054858110156129e45760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401611049565b6002600f546129f39190613687565b600a5560008415612af857612a0960068a61289b565b612aa3576001600160a01b03891660009081526003602052604090205442101580612a3b5750601d54610100900460ff165b612a7c5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401611049565b601e54612a899042613614565b6001600160a01b038a166000908152600360205260409020555b600f54871115612ae75760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401611049565b50601154610100900460ff16612c0a565b8515612b5757600e54612b0b8885613614565b1115612b295760405162461bcd60e51b8152600401611049906136a9565b601054871115612b4b5760405162461bcd60e51b8152600401611049906136a9565b5060115460ff16612c0a565b600e54612b648885613614565b1115612b825760405162461bcd60e51b8152600401611049906136a9565b612b8d60068a61289b565b612bfc576001600160a01b03891660009081526003602052604090205442101580612bbf5750601d54610100900460ff165b612bfc5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401611049565b5060115462010000900460ff165b601354600090600160a01b900460ff1615612d27576011546001600160a01b038b8116600160481b9092041614801590612c475750601f5460ff16155b8015612c565750601d5460ff16155b15612c6457612c6488612664565b601154600090612cbe908a90859060ff600160301b8204811691600160281b8104821691612ca591630100000081048216916401000000009091041661362c565b612caf919061362c565b612cb9919061362c565b6131dd565b9050612cca818a6135fd565b30600090815260016020526040812080549294508392909190612cee908490613614565b909155505060405181815230906001600160a01b038d169060008051602061379f8339815191529060200160405180910390a350612d2a565b50865b612d348a89613174565b612d3e89826131b9565b601554604051630b58546360e41b81526001600160a01b038c811660048301528b81166024830152604482018b90528915156064830152881515608483015287151560a48301529091169063b58546309060c401600060405180830381600087803b158015612dac57600080fd5b505af1158015612dc0573d6000803e3d6000fd5b50505050886001600160a01b03168a6001600160a01b031660008051602061379f83398151915283604051612df791815260200190565b60405180910390a350505050505050505050565b60008181526001830160205260408120548015612eee576000612e2f6001836135fd565b8554909150600090612e43906001906135fd565b90506000866000018281548110612e5c57612e5c6136d3565b9060005260206000200154905080876000018481548110612e7f57612e7f6136d3565b600091825260208083209091019290925582815260018901909152604090208490558654879080612eb257612eb26136e9565b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506110c5565b60009150506110c5565b601254612f109030906001600160a01b031683612135565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f4557612f456136d3565b6001600160a01b039283166020918202929092010152601354825191169082906001908110612f7657612f766136d3565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac94790612fbc9085906000908690309042906004016136ff565b600060405180830381600087803b158015612fd657600080fd5b505af1158015612647573d6000803e3d6000fd5b80601c6000828254612ffc9190613614565b90915550506012546130199030906001600160a01b031684612135565b60125460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613086573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130ab9190613770565b5050505050565b6018546000906064906130c89060ff16846135de565b6130d29190613687565b6018549091506000906064906130f19062010000900460ff16856135de565b6130fb9190613687565b60185490915060009060649061311990610100900460ff16866135de565b6131239190613687565b905082601960008282546131379190613614565b9250508190555081601b60008282546131509190613614565b9250508190555080601a60008282546131699190613614565b909155505050505050565b6001600160a01b0382166000908152600160205260408120546131989083906135fd565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b038216600090815260016020526040812054613198908390613614565b60006127108260ff168460ff16866131f591906135de565b6131ff91906135de565b6132099190613687565b949350505050565b801515811461136657600080fd5b60006020828403121561323157600080fd5b813561168781613211565b80356001600160a01b038116811461325357600080fd5b919050565b6000806040838503121561326b57600080fd5b6132748361323c565b91506132826020840161323c565b90509250929050565b60006020828403121561329d57600080fd5b6116878261323c565b600060208083528351808285015260005b818110156132d3578581018301518582016040015282016132b7565b818111156132e5576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561330e57600080fd5b6133178361323c565b946020939093013593505050565b60008060006060848603121561333a57600080fd5b6133438461323c565b92506133516020850161323c565b9150604084013590509250925092565b803560ff8116811461325357600080fd5b600080600080600080600060e0888a03121561338d57600080fd5b61339688613361565b96506133a460208901613361565b95506133b260408901613361565b94506133c060608901613361565b93506133ce60808901613361565b92506133dc60a08901613361565b91506133ea60c08901613361565b905092959891949750929550565b6000806040838503121561340b57600080fd5b6134148361323c565b9150602083013561342481613211565b809150509250929050565b60006020828403121561344157600080fd5b61168782613361565b60006020828403121561345c57600080fd5b5035919050565b60006020828403121561347557600080fd5b813561ffff8116811461168757600080fd5b6000806040838503121561349a57600080fd5b50508035926020909101359150565b602080825260129082015271086c2d8d8cae440dcdee840d2dc4082eae8d60731b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561352657816000190482111561350c5761350c6134d5565b8085161561351957918102915b93841c93908002906134f0565b509250929050565b60008261353d575060016110c5565b8161354a575060006110c5565b8160018114613560576002811461356a57613586565b60019150506110c5565b60ff84111561357b5761357b6134d5565b50506001821b6110c5565b5060208310610133831016604e8410600b84101617156135a9575081810a6110c5565b6135b383836134eb565b80600019048211156135c7576135c76134d5565b029392505050565b600061168760ff84168361352e565b60008160001904831182151516156135f8576135f86134d5565b500290565b60008282101561360f5761360f6134d5565b500390565b60008219821115613627576136276134d5565b500190565b600060ff821660ff84168060ff03821115613649576136496134d5565b019392505050565b60006020828403121561366357600080fd5b5051919050565b60006020828403121561367c57600080fd5b815161168781613211565b6000826136a457634e487b7160e01b600052601260045260246000fd5b500490565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561374f5784516001600160a01b03168352938301939183019160010161372a565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561378557600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201849f6da2bc6329af963696f2f82407bb6edd40c6619b130920d1202bfc78b7864736f6c634300080e0033
Deployed Bytecode
0x6080604052600436106104aa5760003560e01c80637796ff3711610269578063ba46855b1161014e578063d84a7fe7116100c6578063f2fde38b11610082578063f2fde38b14610f5a578063f30b7c3714610f7a578063f720668314610f9a578063f88b0e4614610fba578063f88ccaa814610fd0578063fb27298714610ff757005b8063d84a7fe714610ea5578063dad6809914610ec5578063dd62ed3e14610ee5578063e52b7c7514610f05578063e81ccf3314610f25578063f06266f614610f3a57005b8063c7639d8011610115578063c7639d8014610dcc578063c9e99a4914610df4578063cb69d35414610e14578063d28d885214610e34578063d471896f14610e65578063d4cf920614610e8557005b8063ba46855b14610d2b578063ba5be15e14610d4b578063bff99b3014610d6c578063c36cc02c14610d8c578063c4a5f01214610dac57005b80639962bede116101e1578063a9059cbb116101a8578063a9059cbb14610c5b578063a9aab6b914610c7b578063a9e499db14610c9b578063ac0353e714610cbb578063b07d7d8914610cdb578063b09f126614610cfb57005b80639962bede14610bb55780639eb163dd14610bd5578063a20623ce14610bf5578063a253c06e14610c25578063a457c2d714610c3b57005b80638816bcb6116102305780638816bcb614610b0b578063887c60fb14610b2b578063893d20e814610b4a5780638ba4cc3c14610b685780638da5cb5b14610b4a57806395d89b4114610b8857005b80637796ff3714610a6457806378af89df14610a84578063825a85b514610aa357806382c4767b14610ac357806386d0ada814610af157005b80633a60f3be1161038f5780634f91e48c116103075780636ebcf607116102ce5780636ebcf607146109a15780636f84395c146109ce57806370a08231146109e3578063715018a614610a19578063762bb28214610a2e57806376bec98114610a4457005b80634f91e48c146109155780635554b1811461092b578063589210d91461095557806358e553651461096b5780636dc8f7cc1461098157005b80634089b170116103565780634089b17014610874578063435de2611461088a5780634655a5e2146108aa57806348e907b7146108ca5780634a22553c146108e05780634c8bc5171461090057005b80633a60f3be146107e95780633bc9a5ed146108095780633bf079b91461081e5780633cc39b7a1461083e5780634025f13f1461085457005b806318160ddd11610422578063311a8697116103e9578063311a869714610747578063313ce56714610768578063313dab201461077c57806332424aa3146107925780633478154b146107a757806339509351146107c957005b806318160ddd146106665780631eb25d131461067b5780631f8b845e146106905780632222f2f4146106b057806323b872dd1461072757005b806309218ee71161047157806309218ee7146105a4578063095ea7b3146105d05780630fd99e16146105f0578063118e24d01461062657806315638c681461063b57806315d28c4f1461065157005b8063020cc4c4146104b3578063024c2ddd146104d3578063044d96131461051e57806305462aae1461054d57806306fdde031461056d57005b366104b157005b005b3480156104bf57600080fd5b506104b16104ce36600461321f565b611024565b3480156104df57600080fd5b5061050b6104ee366004613258565b600260209081526000928352604080842090915290825290205481565b6040519081526020015b60405180910390f35b34801561052a57600080fd5b50601f5461053d90610100900460ff1681565b6040519015158152602001610515565b34801561055957600080fd5b506104b161056836600461328b565b611065565b34801561057957600080fd5b50604080518082019091526005815264119b1d5a5960da1b60208201525b60405161051591906132a6565b3480156105b057600080fd5b506018546105be9060ff1681565b60405160ff9091168152602001610515565b3480156105dc57600080fd5b5061053d6105eb3660046132fb565b6110b4565b3480156105fc57600080fd5b50600b5461061390640100000000900461ffff1681565b60405161ffff9091168152602001610515565b34801561063257600080fd5b506104b16110cb565b34801561064757600080fd5b5061050b601a5481565b34801561065d57600080fd5b506104b1611190565b34801561067257600080fd5b50600d5461050b565b34801561068757600080fd5b5061050b6111cf565b34801561069c57600080fd5b50600b5461061390610100900461ffff1681565b3480156106bc57600080fd5b506011546040805160ff600160301b840481168252600160281b8404811660208301526301000000840481169282019290925264010000000083048216606082015281831660808201526101008304821660a0820152620100009092041660c082015260e001610515565b34801561073357600080fd5b5061053d610742366004613325565b6111ea565b34801561075357600080fd5b50600b546105be906301000000900460ff1681565b34801561077457600080fd5b5060126105be565b34801561078857600080fd5b5061050b601b5481565b34801561079e57600080fd5b506105be601281565b3480156107b357600080fd5b50600b5461061390600160301b900461ffff1681565b3480156107d557600080fd5b5061053d6107e43660046132fb565b611281565b3480156107f557600080fd5b506104b161080436600461328b565b6112b8565b34801561081557600080fd5b506104b16112ec565b34801561082a57600080fd5b506104b1610839366004613372565b611369565b34801561084a57600080fd5b5061050b601c5481565b34801561086057600080fd5b506104b161086f36600461328b565b6114a9565b34801561088057600080fd5b5061050b60175481565b34801561089657600080fd5b506104b16108a53660046133f8565b611604565b3480156108b657600080fd5b5061050b6108c536600461328b565b611654565b3480156108d657600080fd5b5061050b60165481565b3480156108ec57600080fd5b506104b16108fb36600461328b565b61168e565b34801561090c57600080fd5b506104b16116be565b34801561092157600080fd5b5061050b600f5481565b34801561093757600080fd5b506109406116fd565b60408051928352602083019190915201610515565b34801561096157600080fd5b5061050b60105481565b34801561097757600080fd5b5061050b60195481565b34801561098d57600080fd5b506104b161099c3660046133f8565b611726565b3480156109ad57600080fd5b5061050b6109bc36600461328b565b60016020526000908152604090205481565b3480156109da57600080fd5b50601e5461050b565b3480156109ef57600080fd5b5061050b6109fe36600461328b565b6001600160a01b031660009081526001602052604090205490565b348015610a2557600080fd5b506104b1611776565b348015610a3a57600080fd5b5061050b600e5481565b348015610a5057600080fd5b506104b1610a5f36600461321f565b611829565b348015610a7057600080fd5b506018546105be9062010000900460ff1681565b348015610a9057600080fd5b506018546105be90610100900460ff1681565b348015610aaf57600080fd5b506104b1610abe36600461328b565b611868565b348015610acf57600080fd5b50610ad961dead81565b6040516001600160a01b039091168152602001610515565b348015610afd57600080fd5b50601f5461053d9060ff1681565b348015610b1757600080fd5b506104b1610b2636600461328b565b6118d4565b348015610b3757600080fd5b50601d5461053d90610100900460ff1681565b348015610b5657600080fd5b506000546001600160a01b0316610ad9565b348015610b7457600080fd5b506104b1610b833660046132fb565b61191a565b348015610b9457600080fd5b50604080518082019091526004815263244f4f4f60e01b6020820152610597565b348015610bc157600080fd5b506104b1610bd036600461342f565b611a07565b348015610be157600080fd5b506104b1610bf036600461328b565b611a42565b348015610c0157600080fd5b5061053d610c1036600461328b565b60086020526000908152604090205460ff1681565b348015610c3157600080fd5b5061050b600d5481565b348015610c4757600080fd5b5061053d610c563660046132fb565b611a89565b348015610c6757600080fd5b5061053d610c763660046132fb565b611b05565b348015610c8757600080fd5b506104b1610c9636600461344a565b611b12565b348015610ca757600080fd5b506104b1610cb6366004613463565b611b3c565b348015610cc757600080fd5b506104b1610cd636600461342f565b611b86565b348015610ce757600080fd5b506104b1610cf636600461344a565b611bc7565b348015610d0757600080fd5b5061059760405180604001604052806004815260200163244f4f4f60e01b81525081565b348015610d3757600080fd5b506104b1610d4636600461321f565b611bf1565b348015610d5757600080fd5b5060115461053d90600160401b900460ff1681565b348015610d7857600080fd5b506104b1610d8736600461342f565b611c3c565b348015610d9857600080fd5b50601454610ad9906001600160a01b031681565b348015610db857600080fd5b506104b1610dc7366004613487565b611c7f565b348015610dd857600080fd5b50610ad9737a250d5630b4cf539739df2c5dacb4c659f2488d81565b348015610e0057600080fd5b506104b1610e0f36600461321f565b611cc8565b348015610e2057600080fd5b506104b1610e2f36600461344a565b611d0b565b348015610e4057600080fd5b5061059760405180604001604052806005815260200164119b1d5a5960da1b81525081565b348015610e7157600080fd5b50601254610ad9906001600160a01b031681565b348015610e9157600080fd5b506104b1610ea036600461321f565b611db3565b348015610eb157600080fd5b506104b1610ec036600461344a565b611deb565b348015610ed157600080fd5b506104b1610ee036600461321f565b611e2a565b348015610ef157600080fd5b5061050b610f00366004613258565b611e62565b348015610f1157600080fd5b506104b1610f2036600461328b565b611eb0565b348015610f3157600080fd5b506104b1611ee0565b348015610f4657600080fd5b506104b1610f5536600461321f565b611f08565b348015610f6657600080fd5b506104b1610f7536600461328b565b611f47565b348015610f8657600080fd5b506104b1610f9536600461328b565b612070565b348015610fa657600080fd5b506104b1610fb536600461328b565b6120b9565b348015610fc657600080fd5b5061050b601e5481565b348015610fdc57600080fd5b50601154610ad990600160481b90046001600160a01b031681565b34801561100357600080fd5b5061050b61101236600461328b565b60036020526000908152604090205481565b61102d336120fe565b6110525760405162461bcd60e51b8152600401611049906134a9565b60405180910390fd5b601f805460ff1916911515919091179055565b61106e336120fe565b61108a5760405162461bcd60e51b8152600401611049906134a9565b601f80546001600160a01b03909216620100000262010000600160b01b0319909216919091179055565b60006110c1338484612135565b5060015b92915050565b6110d4336120fe565b6110f05760405162461bcd60e51b8152600401611049906134a9565b601b805460009182905560405190913391829084905b60006040518083038185875af1925050503d8060008114611143576040519150601f19603f3d011682016040523d82523d6000602084013e611148565b606091505b505090508061118b5760405162461bcd60e51b815260206004820152600f60248201526e1dda5d1a191c985dc819985a5b1959608a1b6044820152606401611049565b505050565b611199336120fe565b6111b55760405162461bcd60e51b8152600401611049906134a9565b601980546000918290556040519091339182908490611106565b6111db6012600a6135cf565b6111e7906127106135de565b81565b60006111f7848484612228565b6001600160a01b0384166000908152600260209081526040808320338452909152902054828110156112625760405162461bcd60e51b81526020600482015260146024820152735472616e73666572203e20616c6c6f77616e636560601b6044820152606401611049565b611276853361127186856135fd565b612135565b506001949350505050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916110c1918590611271908690613614565b6112c1336120fe565b6112dd5760405162461bcd60e51b8152600401611049906134a9565b6112e86006826120e9565b5050565b6112f5336120fe565b6113115760405162461bcd60e51b8152600401611049906134a9565b604051600090339047908381818185875af1925050503d8060008114611353576040519150601f19603f3d011682016040523d82523d6000602084013e611358565b606091505b505090508061136657600080fd5b50565b611372336120fe565b61138e5760405162461bcd60e51b8152600401611049906134a9565b6000848661139c898b61362c565b6113a6919061362c565b6113b0919061362c565b90508060ff166064146114145760405162461bcd60e51b815260206004820152602660248201527f6275726e2b6c69712b6d61726b6574696e67206e6565647320746f20657175616044820152656c203130302560d01b6064820152608401611049565b506011805460ff928316620100000262ff0000199484166101000261ffff199785166401000000000264ff00000000199986166301000000029990991664ffff000000199a8616600160281b0265ff0000000000199c8716600160301b029c909c1666ffff000000000019909416939093179a909a179890981617959095179390931691909216179390931792909216179055565b6114b2336120fe565b6114ce5760405162461bcd60e51b8152600401611049906134a9565b6040516370a0823160e01b815230600482015281906000906001600160a01b038316906370a0823190602401602060405180830381865afa158015611517573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153b9190613651565b90506000811161158d5760405162461bcd60e51b815260206004820152601860248201527f4e6f20746f6b656e7320696e206f75722062616c616e636500000000000000006044820152606401611049565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af11580156115da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115fe919061366a565b50505050565b61160d336120fe565b6116295760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03919091166000908152600860205260409020805460ff1916911515919091179055565b6001600160a01b03811660009081526003602052604081205442811161167d5750600092915050565b61168742826135fd565b9392505050565b611697336120fe565b6116b35760405162461bcd60e51b8152600401611049906134a9565b6112e860068261264f565b6116c7336120fe565b6116e35760405162461bcd60e51b8152600401611049906134a9565b601a80546000918290556040519091339182908490611106565b6000806001600e5461170f9190613687565b6001600f5461171e9190613687565b915091509091565b61172f336120fe565b61174b5760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03919091166000908152600c60205260409020805460ff1916911515919091179055565b336117896000546001600160a01b031690565b6001600160a01b0316146117df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611049565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b611832336120fe565b61184e5760405162461bcd60e51b8152600401611049906134a9565b601d80549115156101000261ff0019909216919091179055565b611871336120fe565b61188d5760405162461bcd60e51b8152600401611049906134a9565b601480546001600160a01b039092166001600160a01b031992831681179091556015805490921681179091556000908152600c60205260409020805460ff19166001179055565b6118dd336120fe565b6118f95760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03166000908152600860205260409020805460ff19169055565b611923336120fe565b61193f5760405162461bcd60e51b8152600401611049906134a9565b306000908152600160205260409020548111156119845760405162461bcd60e51b81526020600482015260036024820152620d0c0d60ea1b6044820152606401611049565b30600090815260016020526040812080548392906119a39084906135fd565b90915550506001600160a01b038216600090815260016020526040812080548392906119d0908490613614565b90915550506040518181526001600160a01b03831690309060008051602061379f8339815191529060200160405180910390a35050565b611a10336120fe565b611a2c5760405162461bcd60e51b8152600401611049906134a9565b6018805460ff191660ff92909216919091179055565b611a4b336120fe565b611a675760405162461bcd60e51b8152600401611049906134a9565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b3360009081526002602090815260408083206001600160a01b038616845290915281205482811015611aec5760405162461bcd60e51b815260206004820152600c60248201526b3c3020616c6c6f77616e636560a01b6044820152606401611049565b611afb338561127186856135fd565b5060019392505050565b60006110c1338484612228565b611b1b336120fe565b611b375760405162461bcd60e51b8152600401611049906134a9565b601e55565b611b45336120fe565b611b615760405162461bcd60e51b8152600401611049906134a9565b600b805461ffff909216600160301b0267ffff00000000000019909216919091179055565b611b8f336120fe565b611bab5760405162461bcd60e51b8152600401611049906134a9565b6018805460ff9092166101000261ff0019909216919091179055565b611bd0336120fe565b611bec5760405162461bcd60e51b8152600401611049906134a9565b600a55565b611bfa336120fe565b611c165760405162461bcd60e51b8152600401611049906134a9565b601180549115156701000000000000000267ff0000000000000019909216919091179055565b611c45336120fe565b611c615760405162461bcd60e51b8152600401611049906134a9565b6018805460ff909216620100000262ff000019909216919091179055565b611c88336120fe565b611ca45760405162461bcd60e51b8152600401611049906134a9565b611caf8260016135de565b9150611cbc8160016135de565b600e9290925550600f55565b611cd1336120fe565b611ced5760405162461bcd60e51b8152600401611049906134a9565b60138054911515600160a01b0260ff60a01b19909216919091179055565b611d14336120fe565b611d305760405162461bcd60e51b8152600401611049906134a9565b30600090815260016020526040902054811115611d4c57600080fd5b3060009081526001602052604081208054839290611d6b9084906135fd565b9250508190555080600d6000828254611d8491906135fd565b909155505060405181815261dead90309060008051602061379f8339815191529060200160405180910390a350565b611dbc336120fe565b611dd85760405162461bcd60e51b8152600401611049906134a9565b6009805460ff1916911515919091179055565b611df4336120fe565b611e105760405162461bcd60e51b8152600401611049906134a9565b611366611e2582670de0b6b3a76400006135de565b612664565b611e33336120fe565b611e4f5760405162461bcd60e51b8152600401611049906134a9565b600b805460ff1916911515919091179055565b6014546000906001600160a01b0390811690831603611e845750600d546110c5565b506001600160a01b038083166000908152600260209081526040808320938516835292905220546110c5565b611eb9336120fe565b611ed55760405162461bcd60e51b8152600401611049906134a9565b6112e86004826120e9565b611ee9336120fe565b611f055760405162461bcd60e51b8152600401611049906134a9565b33ff5b611f11336120fe565b611f2d5760405162461bcd60e51b8152600401611049906134a9565b601f80549115156101000261ff0019909216919091179055565b33611f5a6000546001600160a01b031690565b6001600160a01b031614611fb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611049565b6001600160a01b0381166120155760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611049565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b612079336120fe565b6120955760405162461bcd60e51b8152600401611049906134a9565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b6120c2336120fe565b6120de5760405162461bcd60e51b8152600401611049906134a9565b6112e860048261264f565b6000611687836001600160a01b03841661284c565b600080546001600160a01b03838116911614806110c55750506001600160a01b03166000908152600c602052604090205460ff1690565b6001600160a01b03831661217f5760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b6044820152606401611049565b6001600160a01b0382166121c75760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b6044820152606401611049565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0383166122735760405162461bcd60e51b81526020600482015260126024820152715472616e736665722066726f6d207a65726f60701b6044820152606401611049565b6001600160a01b0382166122bc5760405162461bcd60e51b815260206004820152601060248201526f5472616e7366657220746f207a65726f60801b6044820152606401611049565b60095460ff1615612344576001600160a01b03831660009081526008602052604090205460ff1615801561230957506001600160a01b03821660009081526008602052604090205460ff16155b6123445760405162461bcd60e51b815260206004820152600c60248201526b426c61636b6c69737465642160a01b6044820152606401611049565b600061235160048561289b565b80612362575061236260048461289b565b8061238557506001600160a01b0384166000908152600c602052604090205460ff165b806123a857506001600160a01b0383166000908152600c602052604090205460ff165b806123c057506014546001600160a01b038581169116145b806123d857506014546001600160a01b038481169116145b905060006001600160a01b0385163014806123fb57506001600160a01b03841630145b6011549091506000906001600160a01b03878116600160481b9092041614801561244157506001600160a01b038516737a250d5630b4cf539739df2c5dacb4c659f2488d145b8061248757506011546001600160a01b03868116600160481b9092041614801561248757506001600160a01b038616737a250d5630b4cf539739df2c5dacb4c659f2488d145b905081806124925750805b8061249a5750825b156124af576124aa8686866128bd565b612647565b601f54610100900460ff1661259c576000546001600160a01b038781169116148015906124ea57506000546001600160a01b03868116911614155b1561259c57601154600160401b900460ff161561254557846001600160a01b0316866001600160a01b031660008051602061379f833981519152600060405161253591815260200190565b60405180910390a3505050505050565b601f54610100900460ff1661259c5760405162461bcd60e51b815260206004820152601760248201527f74726164696e67206e6f742079657420656e61626c65640000000000000000006044820152606401611049565b6011546000906001600160a01b03888116600160481b9092041614806125de57506001600160a01b038716737a250d5630b4cf539739df2c5dacb4c659f2488d145b6011549091506000906001600160a01b03888116600160481b90920416148061262357506001600160a01b038716737a250d5630b4cf539739df2c5dacb4c659f2488d145b9050600082158015612633575081155b9050612643898989868686612976565b5050505b505050505050565b6000611687836001600160a01b038416612e0b565b601d805460ff1916600190811790915530600090815260209190915260408120546011549091906126aa90640100000000810460ff90811691630100000090041661362c565b60ff1690506000600a549050838111156126cc57600b5460ff16156126cc5750825b808310806126dc575061ffff8216155b156126e95750505061283f565b60115460009061ffff841690612709906301000000900460ff16846135de565b6127139190613687565b60115490915060009061ffff85169061273790640100000000900460ff16856135de565b6127419190613687565b60115490915060009061ffff86169061276490600160301b900460ff16866135de565b61276e9190613687565b60115490915060009061ffff87169061279190600160281b900460ff16876135de565b61279b9190613687565b905060006127aa600286613687565b905060006127b882876135fd565b9050600084846127c88885613614565b6127d29190613614565b6127dc9190613614565b9050476127e882612ef8565b60006127f482476135fd565b905060008361280386846135de565b61280d9190613687565b90506128198682612fea565b600061282584476135fd565b9050612830816130b2565b50505050505050505050505050505b50601d805460ff19169055565b6000818152600183016020526040812054612893575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556110c5565b5060006110c5565b6001600160a01b03811660009081526001830160205260408120541515611687565b6001600160a01b038316600090815260016020526040902054818110156129215760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401611049565b61292b8483613174565b61293583836131b9565b826001600160a01b0316846001600160a01b031660008051602061379f8339815191528460405161296891815260200190565b60405180910390a350505050565b6001600160a01b03808616600090815260016020526040808220549289168252902054858110156129e45760405162461bcd60e51b81526020600482015260186024820152775472616e7366657220657863656564732062616c616e636560401b6044820152606401611049565b6002600f546129f39190613687565b600a5560008415612af857612a0960068a61289b565b612aa3576001600160a01b03891660009081526003602052604090205442101580612a3b5750601d54610100900460ff165b612a7c5760405162461bcd60e51b815260206004820152601260248201527153656c6c657220696e2073656c6c4c6f636b60701b6044820152606401611049565b601e54612a899042613614565b6001600160a01b038a166000908152600360205260409020555b600f54871115612ae75760405162461bcd60e51b815260206004820152600f60248201526e223ab6b810383937ba32b1ba34b7b760891b6044820152606401611049565b50601154610100900460ff16612c0a565b8515612b5757600e54612b0b8885613614565b1115612b295760405162461bcd60e51b8152600401611049906136a9565b601054871115612b4b5760405162461bcd60e51b8152600401611049906136a9565b5060115460ff16612c0a565b600e54612b648885613614565b1115612b825760405162461bcd60e51b8152600401611049906136a9565b612b8d60068a61289b565b612bfc576001600160a01b03891660009081526003602052604090205442101580612bbf5750601d54610100900460ff165b612bfc5760405162461bcd60e51b815260206004820152600e60248201526d53656e64657220696e204c6f636b60901b6044820152606401611049565b5060115462010000900460ff165b601354600090600160a01b900460ff1615612d27576011546001600160a01b038b8116600160481b9092041614801590612c475750601f5460ff16155b8015612c565750601d5460ff16155b15612c6457612c6488612664565b601154600090612cbe908a90859060ff600160301b8204811691600160281b8104821691612ca591630100000081048216916401000000009091041661362c565b612caf919061362c565b612cb9919061362c565b6131dd565b9050612cca818a6135fd565b30600090815260016020526040812080549294508392909190612cee908490613614565b909155505060405181815230906001600160a01b038d169060008051602061379f8339815191529060200160405180910390a350612d2a565b50865b612d348a89613174565b612d3e89826131b9565b601554604051630b58546360e41b81526001600160a01b038c811660048301528b81166024830152604482018b90528915156064830152881515608483015287151560a48301529091169063b58546309060c401600060405180830381600087803b158015612dac57600080fd5b505af1158015612dc0573d6000803e3d6000fd5b50505050886001600160a01b03168a6001600160a01b031660008051602061379f83398151915283604051612df791815260200190565b60405180910390a350505050505050505050565b60008181526001830160205260408120548015612eee576000612e2f6001836135fd565b8554909150600090612e43906001906135fd565b90506000866000018281548110612e5c57612e5c6136d3565b9060005260206000200154905080876000018481548110612e7f57612e7f6136d3565b600091825260208083209091019290925582815260018901909152604090208490558654879080612eb257612eb26136e9565b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506110c5565b60009150506110c5565b601254612f109030906001600160a01b031683612135565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612f4557612f456136d3565b6001600160a01b039283166020918202929092010152601354825191169082906001908110612f7657612f766136d3565b6001600160a01b03928316602091820292909201015260125460405163791ac94760e01b815291169063791ac94790612fbc9085906000908690309042906004016136ff565b600060405180830381600087803b158015612fd657600080fd5b505af1158015612647573d6000803e3d6000fd5b80601c6000828254612ffc9190613614565b90915550506012546130199030906001600160a01b031684612135565b60125460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015613086573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906130ab9190613770565b5050505050565b6018546000906064906130c89060ff16846135de565b6130d29190613687565b6018549091506000906064906130f19062010000900460ff16856135de565b6130fb9190613687565b60185490915060009060649061311990610100900460ff16866135de565b6131239190613687565b905082601960008282546131379190613614565b9250508190555081601b60008282546131509190613614565b9250508190555080601a60008282546131699190613614565b909155505050505050565b6001600160a01b0382166000908152600160205260408120546131989083906135fd565b6001600160a01b039093166000908152600160205260409020929092555050565b6001600160a01b038216600090815260016020526040812054613198908390613614565b60006127108260ff168460ff16866131f591906135de565b6131ff91906135de565b6132099190613687565b949350505050565b801515811461136657600080fd5b60006020828403121561323157600080fd5b813561168781613211565b80356001600160a01b038116811461325357600080fd5b919050565b6000806040838503121561326b57600080fd5b6132748361323c565b91506132826020840161323c565b90509250929050565b60006020828403121561329d57600080fd5b6116878261323c565b600060208083528351808285015260005b818110156132d3578581018301518582016040015282016132b7565b818111156132e5576000604083870101525b50601f01601f1916929092016040019392505050565b6000806040838503121561330e57600080fd5b6133178361323c565b946020939093013593505050565b60008060006060848603121561333a57600080fd5b6133438461323c565b92506133516020850161323c565b9150604084013590509250925092565b803560ff8116811461325357600080fd5b600080600080600080600060e0888a03121561338d57600080fd5b61339688613361565b96506133a460208901613361565b95506133b260408901613361565b94506133c060608901613361565b93506133ce60808901613361565b92506133dc60a08901613361565b91506133ea60c08901613361565b905092959891949750929550565b6000806040838503121561340b57600080fd5b6134148361323c565b9150602083013561342481613211565b809150509250929050565b60006020828403121561344157600080fd5b61168782613361565b60006020828403121561345c57600080fd5b5035919050565b60006020828403121561347557600080fd5b813561ffff8116811461168757600080fd5b6000806040838503121561349a57600080fd5b50508035926020909101359150565b602080825260129082015271086c2d8d8cae440dcdee840d2dc4082eae8d60731b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561352657816000190482111561350c5761350c6134d5565b8085161561351957918102915b93841c93908002906134f0565b509250929050565b60008261353d575060016110c5565b8161354a575060006110c5565b8160018114613560576002811461356a57613586565b60019150506110c5565b60ff84111561357b5761357b6134d5565b50506001821b6110c5565b5060208310610133831016604e8410600b84101617156135a9575081810a6110c5565b6135b383836134eb565b80600019048211156135c7576135c76134d5565b029392505050565b600061168760ff84168361352e565b60008160001904831182151516156135f8576135f86134d5565b500290565b60008282101561360f5761360f6134d5565b500390565b60008219821115613627576136276134d5565b500190565b600060ff821660ff84168060ff03821115613649576136496134d5565b019392505050565b60006020828403121561366357600080fd5b5051919050565b60006020828403121561367c57600080fd5b815161168781613211565b6000826136a457634e487b7160e01b600052601260045260246000fd5b500490565b60208082526010908201526f3bb430b63290383937ba32b1ba34b7b760811b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b8181101561374f5784516001600160a01b03168352938301939183019160010161372a565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561378557600080fd5b835192506020840151915060408401519050925092509256feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa26469706673582212201849f6da2bc6329af963696f2f82407bb6edd40c6619b130920d1202bfc78b7864736f6c634300080e0033
Deployed Bytecode Sourcemap
14696:19993:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28747:111;;;;;;;;;;-1:-1:-1;28747:111:1;;;;;:::i;:::-;;:::i;14885:68::-;;;;;;;;;;-1:-1:-1;14885:68:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;972:25:4;;;960:2;945:18;14885:68:1;;;;;;;;30550:18;;;;;;;;;;-1:-1:-1;30550:18:1;;;;;;;;;;;;;;1173:14:4;;1166:22;1148:41;;1136:2;1121:18;30550::1;1008:187:4;30722:151:1;;;;;;;;;;-1:-1:-1;30722:151:1;;;;;:::i;:::-;;:::i;32312:92::-;;;;;;;;;;-1:-1:-1;32392:5:1;;;;;;;;;;;;-1:-1:-1;;;32392:5:1;;;;32312:92;;;;;;;:::i;22255:30::-;;;;;;;;;;-1:-1:-1;22255:30:1;;;;;;;;;;;2165:4:4;2153:17;;;2135:36;;2123:2;2108:18;22255:30:1;1993:184:4;33279:158:1;;;;;;;;;;-1:-1:-1;33279:158:1;;;;;:::i;:::-;;:::i;15567:35::-;;;;;;;;;;-1:-1:-1;15567:35:1;;;;;;;;;;;;;;2615:6:4;2603:19;;;2585:38;;2573:2;2558:18;15567:35:1;2441:188:4;28128:258:1;;;;;;;;;;;;;:::i;22401:28::-;;;;;;;;;;;;;;;;27603:261;;;;;;;;;;;;;:::i;32610:106::-;;;;;;;;;;-1:-1:-1;32691:18:1;;32610:106;;15294:67;;;;;;;;;;;;;:::i;15463:33::-;;;;;;;;;;-1:-1:-1;15463:33:1;;;;;;;;;;;25670:291;;;;;;;;;;-1:-1:-1;25871:12:1;;25670:291;;;25871:12;-1:-1:-1;;;25871:12:1;;;;2949:25:4;;-1:-1:-1;;;25885:10:1;;;;3005:2:4;2990:18;;2983:34;25896:13:1;;;;;3033:18:4;;;3026:34;;;;25910:13:1;;;;;3091:2:4;3076:18;;3069:34;25924:7:1;;;3134:3:4;3119:19;;3112:35;25871:12:1;25932:8;;;;3178:3:4;3163:19;;3156:35;25941:12:1;;;;;3222:3:4;3207:19;;3200:35;2936:3;2921:19;25670:291:1;2634:607:4;33746:384:1;;;;;;;;;;-1:-1:-1;33746:384:1;;;;;:::i;:::-;;:::i;15513:37::-;;;;;;;;;;-1:-1:-1;15513:37:1;;;;;;;;;;;32512:92;;;;;;;;;;-1:-1:-1;16324:2:1;32512:92;;22435:30;;;;;;;;;;;;;;;;16290:36;;;;;;;;;;;;16324:2;16290:36;;15622:42;;;;;;;;;;-1:-1:-1;15622:42:1;;;;-1:-1:-1;;;15622:42:1;;;;;;34142:202;;;;;;;;;;-1:-1:-1;34142:202:1;;;;;:::i;:::-;;:::i;27323:134::-;;;;;;;;;;-1:-1:-1;27323:134:1;;;;;:::i;:::-;;:::i;31693:150::-;;;;;;;;;;;;;:::i;29217:569::-;;;;;;;;;;-1:-1:-1;29217:569:1;;;;;:::i;:::-;;:::i;22881:25::-;;;;;;;;;;;;;;;;30885:284;;;;;;;;;;-1:-1:-1;30885:284:1;;;;;:::i;:::-;;:::i;22216:27::-;;;;;;;;;;;;;;;;26820:123;;;;;;;;;;-1:-1:-1;26820:123:1;;;;;:::i;:::-;;:::i;25971:282::-;;;;;;;;;;-1:-1:-1;25971:282:1;;;;;:::i;:::-;;:::i;22167:38::-;;;;;;;;;;;;;;;;27462:135;;;;;;;;;;-1:-1:-1;27462:135:1;;;;;:::i;:::-;;:::i;27870:252::-;;;;;;;;;;;;;:::i;16003:46::-;;;;;;;;;;;;;;;;25533:131;;;;;;;;;;;;;:::i;:::-;;;;4845:25:4;;;4901:2;4886:18;;4879:34;;;;4818:18;25533:131:1;4671:248:4;16055:45:1;;;;;;;;;;;;;;;;22364:31;;;;;;;;;;;;;;;;26954:111;;;;;;;;;;-1:-1:-1;26954:111:1;;;;;:::i;:::-;;:::i;14834:45::-;;;;;;;;;;-1:-1:-1;14834:45:1;;;;;:::i;:::-;;;;;;;;;;;;;;26258:108;;;;;;;;;;-1:-1:-1;26347:12:1;;26258:108;;32722:119;;;;;;;;;;-1:-1:-1;32722:119:1;;;;;:::i;:::-;-1:-1:-1;;;;;32816:18:1;32790:7;32816:18;;;:9;:18;;;;;;;32722:119;7050:137;;;;;;;;;;;;;:::i;15948:49::-;;;;;;;;;;;;;;;;28868:105;;;;;;;;;;-1:-1:-1;28868:105:1;;;;;:::i;:::-;;:::i;22324:29::-;;;;;;;;;;-1:-1:-1;22324:29:1;;;;;;;;;;;22291:27;;;;;;;;;;-1:-1:-1;22291:27:1;;;;;;;;;;;28574:163;;;;;;;;;;-1:-1:-1;28574:163:1;;;;;:::i;:::-;;:::i;15810:73::-;;;;;;;;;;;;15841:42;15810:73;;;;;-1:-1:-1;;;;;5088:32:4;;;5070:51;;5058:2;5043:18;15810:73:1;4924:203:4;26439:28:1;;;;;;;;;;-1:-1:-1;26439:28:1;;;;;;;;31565:121;;;;;;;;;;-1:-1:-1;31565:121:1;;;;;:::i;:::-;;:::i;26372:28::-;;;;;;;;;;-1:-1:-1;26372:28:1;;;;;;;;;;;32214:92;;;;;;;;;;-1:-1:-1;32266:7:1;6900:6;-1:-1:-1;;;;;6900:6:1;32214:92;;31938:270;;;;;;;;;;-1:-1:-1;31938:270:1;;;;;:::i;:::-;;:::i;32410:96::-;;;;;;;;;;-1:-1:-1;32492:7:1;;;;;;;;;;;;-1:-1:-1;;;32492:7:1;;;;32410:96;;29796:109;;;;;;;;;;-1:-1:-1;29796:109:1;;;;;:::i;:::-;;:::i;28486:82::-;;;;;;;;;;-1:-1:-1;28486:82:1;;;;;:::i;:::-;;:::i;15121:43::-;;;;;;;;;;-1:-1:-1;15121:43:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;15894:48;;;;;;;;;;;;;;;;34350:336;;;;;;;;;;-1:-1:-1;34350:336:1;;;;;:::i;:::-;;:::i;32847:164::-;;;;;;;;;;-1:-1:-1;32847:164:1;;;;;:::i;:::-;;:::i;28983:116::-;;;;;;;;;;-1:-1:-1;28983:116:1;;;;;:::i;:::-;;:::i;26678:95::-;;;;;;;;;;-1:-1:-1;26678:95:1;;;;;:::i;:::-;;:::i;29915:103::-;;;;;;;;;;-1:-1:-1;29915:103:1;;;;;:::i;:::-;;:::i;26583:89::-;;;;;;;;;;-1:-1:-1;26583:89:1;;;;;:::i;:::-;;:::i;15249:39::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15249:39:1;;;;;31314:116;;;;;;;;;;-1:-1:-1;31314:116:1;;;;;:::i;:::-;;:::i;16369:25::-;;;;;;;;;;-1:-1:-1;16369:25:1;;;;-1:-1:-1;;;16369:25:1;;;;;;30024:107;;;;;;;;;;-1:-1:-1;30024:107:1;;;;;:::i;:::-;;:::i;16836:20::-;;;;;;;;;;-1:-1:-1;16836:20:1;;;;-1:-1:-1;;;;;16836:20:1;;;30275:253;;;;;;;;;;-1:-1:-1;30275:253:1;;;;;:::i;:::-;;:::i;15724:80::-;;;;;;;;;;;;15762:42;15724:80;;29110:101;;;;;;;;;;-1:-1:-1;29110:101:1;;;;;:::i;:::-;;:::i;25272:251::-;;;;;;;;;;-1:-1:-1;25272:251:1;;;;;:::i;:::-;;:::i;15205:38::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;15205:38:1;;;;;16442:39;;;;;;;;;;-1:-1:-1;16442:39:1;;;;-1:-1:-1;;;;;16442:39:1;;;31181:127;;;;;;;;;;-1:-1:-1;31181:127:1;;;;;:::i;:::-;;:::i;30137:::-;;;;;;;;;;-1:-1:-1;30137:127:1;;;;;:::i;:::-;;:::i;26475:102::-;;;;;;;;;;-1:-1:-1;26475:102:1;;;;;:::i;:::-;;:::i;33017:256::-;;;;;;;;;;-1:-1:-1;33017:256:1;;;;;:::i;:::-;;:::i;27071:118::-;;;;;;;;;;-1:-1:-1;27071:118:1;;;;;:::i;:::-;;:::i;28392:88::-;;;;;;;;;;;;;:::i;30624:87::-;;;;;;;;;;-1:-1:-1;30624:87:1;;;;;:::i;:::-;;:::i;7198:232::-;;;;;;;;;;-1:-1:-1;7198:232:1;;;;;:::i;:::-;;:::i;31436:123::-;;;;;;;;;;-1:-1:-1;31436:123:1;;;;;:::i;:::-;;:::i;27194:119::-;;;;;;;;;;-1:-1:-1;27194:119:1;;;;;:::i;:::-;;:::i;26406:27::-;;;;;;;;;;;;;;;;16402:34;;;;;;;;;;-1:-1:-1;16402:34:1;;;;-1:-1:-1;;;16402:34:1;;-1:-1:-1;;;;;16402:34:1;;;14959:45;;;;;;;;;;-1:-1:-1;14959:45:1;;;;;:::i;:::-;;;;;;;;;;;;;;28747:111;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;;;;;;;;;28828:16:::1;:23:::0;;-1:-1:-1;;28828:23:1::1;::::0;::::1;;::::0;;;::::1;::::0;;28747:111::o;30722:151::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30822:22:::1;:44:::0;;-1:-1:-1;;;;;30822:44:1;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;30822:44:1;;::::1;::::0;;;::::1;::::0;;30722:151::o;33279:158::-;33356:4;33372:37;33381:10;33393:7;33402:6;33372:8;:37::i;:::-;-1:-1:-1;33426:4:1;33279:158;;;;;:::o;28128:258::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28203:15:::1;::::0;;28188:14:::1;28228:17:::0;;;;28306:32:::1;::::0;28203:15;;28272:10:::1;::::0;;;28203:15;;28306:32:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28292:46;;;28356:4;28348:31;;;::::0;-1:-1:-1;;;28348:31:1;;7026:2:4;28348:31:1::1;::::0;::::1;7008:21:4::0;7065:2;7045:18;;;7038:30;-1:-1:-1;;;7084:18:4;;;7077:45;7139:18;;28348:31:1::1;6824:339:4::0;28348:31:1::1;28178:208;;;28128:258::o:0;27603:261::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27679:16:::1;::::0;;27664:14:::1;27705:18:::0;;;;27784:32:::1;::::0;27679:16;;27750:10:::1;::::0;;;27679:16;;27784:32:::1;6614:205:4::0;15294:67:1;15347:13;16324:2;15347;:13;:::i;:::-;15333:28;;:10;:28;:::i;:::-;15294:67;:::o;33746:384::-;33846:4;33862:36;33872:6;33880:9;33891:6;33862:9;:36::i;:::-;-1:-1:-1;;;;;33936:19:1;;33909:24;33936:19;;;:11;:19;;;;;;;;33956:10;33936:31;;;;;;;;33985:26;;;;33977:59;;;;-1:-1:-1;;;33977:59:1;;9058:2:4;33977:59:1;;;9040:21:4;9097:2;9077:18;;;9070:30;-1:-1:-1;;;9116:18:4;;;9109:50;9176:18;;33977:59:1;8856:344:4;33977:59:1;34047:55;34056:6;34064:10;34076:25;34095:6;34076:16;:25;:::i;:::-;34047:8;:55::i;:::-;-1:-1:-1;34119:4:1;;33746:384;-1:-1:-1;;;;33746:384:1:o;34142:202::-;34249:10;34224:4;34270:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;34270:32:1;;;;;;;;;;34224:4;;34240:76;;34261:7;;34270:45;;34305:10;;34270:45;:::i;27323:134::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27416:34:::1;:21;27442:7:::0;27416:25:::1;:34::i;:::-;;27323:134:::0;:::o;31693:150::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;31762::::1;::::0;31749:9:::1;::::0;31762:10:::1;::::0;31786:21:::1;::::0;31749:9;31762:51;31749:9;31762:51;31786:21;31762:10;:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31748:65;;;31831:4;31823:13;;;::::0;::::1;;31738:105;31693:150::o:0;29217:569::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29399:14:::1;29458::::0;29443;29414:27:::1;29430:11:::0;29414:13;:27:::1;:::i;:::-;:43;;;;:::i;:::-;:58;;;;:::i;:::-;29399:73;;29490:8;:13;;29500:3;29490:13;29482:64;;;::::0;-1:-1:-1;;;29482:64:1;;9879:2:4;29482:64:1::1;::::0;::::1;9861:21:4::0;9918:2;9898:18;;;9891:30;9957:34;9937:18;;;9930:62;-1:-1:-1;;;10008:18:4;;;10001:36;10054:19;;29482:64:1::1;9677:402:4::0;29482:64:1::1;-1:-1:-1::0;29556:12:1::1;:28:::0;;::::1;29755:24:::0;;::::1;::::0;::::1;-1:-1:-1::0;;29729:16:1;;::::1;29556:28;29729:16;-1:-1:-1::0;;29666:28:1;;::::1;::::0;::::1;-1:-1:-1::0;;29628:28:1;;::::1;::::0;::::1;29666::::0;;;;-1:-1:-1;;29594:24:1;;::::1;-1:-1:-1::0;;;29594:24:1::1;-1:-1:-1::0;;29556:28:1;;::::1;-1:-1:-1::0;;;29556:28:1::1;29594:24:::0;;;;-1:-1:-1;;29594:24:1;;;;;;;;;;::::1;29666:28:::0;;;;;;;;::::1;29729:16:::0;;;;29705:14;;;::::1;29729:16:::0;;;;::::1;29755:24:::0;;;::::1;;::::0;;29217:569::o;30885:284::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;31025:30:::1;::::0;-1:-1:-1;;;31025:30:1;;31049:4:::1;31025:30;::::0;::::1;5070:51:4::0;30983:10:1;;30961:12:::1;::::0;-1:-1:-1;;;;;31025:15:1;::::1;::::0;::::1;::::0;5043:18:4;;31025:30:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31004:51;;31084:1;31073:10;:12;31065:49;;;::::0;-1:-1:-1;;;31065:49:1;;10475:2:4;31065:49:1::1;::::0;::::1;10457:21:4::0;10514:2;10494:18;;;10487:30;10553:26;10533:18;;;10526:54;10597:18;;31065:49:1::1;10273:348:4::0;31065:49:1::1;31124:38;::::0;-1:-1:-1;;;31124:38:1;;31139:10:::1;31124:38;::::0;::::1;10800:51:4::0;10867:18;;;10860:34;;;-1:-1:-1;;;;;31124:14:1;::::1;::::0;::::1;::::0;10773:18:4;;31124:38:1::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30951:218;;30885:284:::0;:::o;26820:123::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;26912:16:1;;;::::1;;::::0;;;:10:::1;:16;::::0;;;;:24;;-1:-1:-1;;26912:24:1::1;::::0;::::1;;::::0;;;::::1;::::0;;26820:123::o;25971:282::-;-1:-1:-1;;;;;26100:25:1;;26065:7;26100:25;;;:9;:25;;;;;;26148:15;26138:25;;26135:71;;-1:-1:-1;26194:1:1;;25971:282;-1:-1:-1;;25971:282:1:o;26135:71::-;26222:24;26231:15;26222:8;:24;:::i;:::-;26215:31;25971:282;-1:-1:-1;;;25971:282:1:o;27462:135::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27553:37:::1;:21;27582:7:::0;27553:28:::1;:37::i;27870:252::-:0;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27943:13:::1;::::0;;27928:14:::1;27966:15:::0;;;;28042:32:::1;::::0;27943:13;;28008:10:::1;::::0;;;27943:13;;28042:32:::1;6614:205:4::0;25533:131:1;25582:15;25599:12;25642:1;25629:12;;:14;;;;:::i;:::-;25655:1;25645:9;;:11;;;;:::i;:::-;25622:35;;;;25533:131;;:::o;26954:111::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;27037:13:1;;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:21;;-1:-1:-1;;27037:21:1::1;::::0;::::1;;::::0;;;::::1;::::0;;26954:111::o;7050:137::-;6974:10;6963:7;6874;6900:6;-1:-1:-1;;;;;6900:6:1;;6836:77;6963:7;-1:-1:-1;;;;;6963:21:1;;6955:66;;;;-1:-1:-1;;;6955:66:1;;11579:2:4;6955:66:1;;;11561:21:4;;;11598:18;;;11591:30;11657:34;11637:18;;;11630:62;11709:18;;6955:66:1;11377:356:4;6955:66:1;7148:1:::1;7132:6:::0;;7111:40:::1;::::0;-1:-1:-1;;;;;7132:6:1;;::::1;::::0;7111:40:::1;::::0;7148:1;;7111:40:::1;7178:1;7161:19:::0;;-1:-1:-1;;;;;;7161:19:1::1;::::0;;7050:137::o;28868:105::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28941:16:::1;:25:::0;;;::::1;;;;-1:-1:-1::0;;28941:25:1;;::::1;::::0;;;::::1;::::0;;28868:105::o;28574:163::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28644:5:::1;:14:::0;;-1:-1:-1;;;;;28644:14:1;;::::1;-1:-1:-1::0;;;;;;28644:14:1;;::::1;::::0;::::1;::::0;;;28668:16:::1;:31:::0;;;;::::1;::::0;::::1;::::0;;;28644:5:::1;28709:14:::0;;;:7:::1;:14;::::0;;;;:21;;-1:-1:-1;;28709:21:1::1;28644:14:::0;28709:21:::1;::::0;;28574:163::o;31565:121::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;31651:20:1::1;31674:5;31651:20:::0;;;:10:::1;:20;::::0;;;;:28;;-1:-1:-1;;31651:28:1::1;::::0;;31565:121::o;31938:270::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;32038:4:::1;32020:24;::::0;;;:9:::1;:24;::::0;;;;;:34;-1:-1:-1;32020:34:1::1;32012:50;;;::::0;-1:-1:-1;;;32012:50:1;;11940:2:4;32012:50:1::1;::::0;::::1;11922:21:4::0;11979:1;11959:18;;;11952:29;-1:-1:-1;;;11997:18:4;;;11990:33;12040:18;;32012:50:1::1;11738:326:4::0;32012:50:1::1;32090:4;32072:24;::::0;;;:9:::1;:24;::::0;;;;:34;;32100:6;;32072:24;:34:::1;::::0;32100:6;;32072:34:::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;32116:19:1;::::1;;::::0;;;:9:::1;:19;::::0;;;;:29;;32139:6;;32116:19;:29:::1;::::0;32139:6;;32116:29:::1;:::i;:::-;::::0;;;-1:-1:-1;;32160:41:1::1;::::0;972:25:4;;;-1:-1:-1;;;;;32160:41:1;::::1;::::0;32177:4:::1;::::0;-1:-1:-1;;;;;;;;;;;32160:41:1;960:2:4;945:18;32160:41:1::1;;;;;;;31938:270:::0;;:::o;29796:109::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29875:14:::1;:23:::0;;-1:-1:-1;;29875:23:1::1;;::::0;;;::::1;::::0;;;::::1;::::0;;29796:109::o;28486:82::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28549:4:::1;:12:::0;;-1:-1:-1;;;;;;28549:12:1::1;-1:-1:-1::0;;;;;28549:12:1;;;::::1;::::0;;;::::1;::::0;;28486:82::o;34350:336::-;34492:10;34437:4;34480:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;34480:32:1;;;;;;;;;;34530:35;;;;34522:60;;;;-1:-1:-1;;;34522:60:1;;12271:2:4;34522:60:1;;;12253:21:4;12310:2;12290:18;;;12283:30;-1:-1:-1;;;12329:18:4;;;12322:42;12381:18;;34522:60:1;12069:336:4;34522:60:1;34593:65;34602:10;34614:7;34623:34;34642:15;34623:16;:34;:::i;34593:65::-;-1:-1:-1;34675:4:1;;34350:336;-1:-1:-1;;;34350:336:1:o;32847:164::-;32927:4;32943:40;32953:10;32965:9;32976:6;32943:9;:40::i;28983:116::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29064:12:::1;:28:::0;28983:116::o;26678:95::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;26745:15:::1;:21:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;26745:21:1::1;-1:-1:-1::0;;26745:21:1;;::::1;::::0;;;::::1;::::0;;26678:95::o;29915:103::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29991:11:::1;:20:::0;;::::1;::::0;;::::1;;;-1:-1:-1::0;;29991:20:1;;::::1;::::0;;;::::1;::::0;;29915:103::o;26583:89::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;26650:9:::1;:15:::0;26583:89::o;31314:116::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;31397:17:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;31397:26:1;;::::1;::::0;;;::::1;::::0;;31314:116::o;30024:107::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30102:13:::1;:22:::0;;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;30102:22:1;;::::1;::::0;;;::::1;::::0;;30024:107::o;30275:253::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30393:17:::1;:15:::0;30409:1:::1;30393:17;:::i;:::-;30377:33:::0;-1:-1:-1;30433:14:1::1;:12:::0;30446:1:::1;30433:14;:::i;:::-;30457:12;:30:::0;;;;-1:-1:-1;30497:9:1::1;:24:::0;30275:253::o;29110:101::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;29183:11:::1;:21:::0;;;::::1;;-1:-1:-1::0;;;29183:21:1::1;-1:-1:-1::0;;;;29183:21:1;;::::1;::::0;;;::::1;::::0;;29110:101::o;25272:251::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;25365:4:::1;25347:24;::::0;;;:9:::1;:24;::::0;;;;;:34;-1:-1:-1;25347:34:1::1;25339:43;;;::::0;::::1;;25410:4;25392:24;::::0;;;:9:::1;:24;::::0;;;;:34;;25420:6;;25392:24;:34:::1;::::0;25420:6;;25392:34:::1;:::i;:::-;;;;;;;;25458:6;25436:18;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;25479:37:1::1;::::0;972:25:4;;;15841:42:1::1;::::0;25496:4:::1;::::0;-1:-1:-1;;;;;;;;;;;25479:37:1;960:2:4;945:18;25479:37:1::1;;;;;;;25272:251:::0;:::o;31181:127::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;31269:11:::1;:32:::0;;-1:-1:-1;;31269:32:1::1;::::0;::::1;;::::0;;;::::1;::::0;;31181:127::o;30137:::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30224:33:::1;30243:13;:4:::0;30250:6:::1;30243:13;:::i;:::-;30224:18;:33::i;26475:102::-:0;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;26547:12:::1;:23:::0;;-1:-1:-1;;26547:23:1::1;::::0;::::1;;::::0;;;::::1;::::0;;26475:102::o;33017:256::-;33132:5;;33101:7;;-1:-1:-1;;;;;33132:5:1;;;33123:14;;;;33120:143;;-1:-1:-1;33160:18:1;;33153:25;;33120:143;-1:-1:-1;;;;;;33224:19:1;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;33217:35;;27071:118;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27160:22:::1;:9;27174:7:::0;27160:13:::1;:22::i;28392:88::-:0;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;28461:10:::1;28440:33;30624:87:::0;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;30690:6:::1;:14:::0;;;::::1;;;;-1:-1:-1::0;;30690:14:1;;::::1;::::0;;;::::1;::::0;;30624:87::o;7198:232::-;6974:10;6963:7;6874;6900:6;-1:-1:-1;;;;;6900:6:1;;6836:77;6963:7;-1:-1:-1;;;;;6963:21:1;;6955:66;;;;-1:-1:-1;;;6955:66:1;;11579:2:4;6955:66:1;;;11561:21:4;;;11598:18;;;11591:30;11657:34;11637:18;;;11630:62;11709:18;;6955:66:1;11377:356:4;6955:66:1;-1:-1:-1;;;;;7278:22:1;::::1;7270:73;;;::::0;-1:-1:-1;;;7270:73:1;;12612:2:4;7270:73:1::1;::::0;::::1;12594:21:4::0;12651:2;12631:18;;;12624:30;12690:34;12670:18;;;12663:62;-1:-1:-1;;;12741:18:4;;;12734:36;12787:19;;7270:73:1::1;12410:402:4::0;7270:73:1::1;7379:6;::::0;;7358:38:::1;::::0;-1:-1:-1;;;;;7358:38:1;;::::1;::::0;7379:6;::::1;::::0;7358:38:::1;::::0;::::1;7406:6;:17:::0;;-1:-1:-1;;;;;;7406:17:1::1;-1:-1:-1::0;;;;;7406:17:1;;;::::1;::::0;;;::::1;::::0;;7198:232::o;31436:123::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;31522:23:1::1;;::::0;;;:10:::1;:23;::::0;;;;:30;;-1:-1:-1;;31522:30:1::1;31548:4;31522:30;::::0;;31436:123::o;27194:119::-;16531:20;16540:10;16531:8;:20::i;:::-;16523:51;;;;-1:-1:-1;;;16523:51:1;;;;;;;:::i;:::-;27281:25:::1;:9;27298:7:::0;27281:16:::1;:25::i;13147:150::-:0;13217:4;13240:50;13245:3;-1:-1:-1;;;;;13265:23:1;;13240:4;:50::i;16607:111::-;16661:4;6900:6;;-1:-1:-1;;;;;16683:13:1;;;6900:6;;16683:13;;:28;;-1:-1:-1;;;;;;;16698:13:1;;;;;:7;:13;;;;;;;;;16607:111::o;33442:297::-;-1:-1:-1;;;;;33535:20:1;;33527:50;;;;-1:-1:-1;;;33527:50:1;;13019:2:4;33527:50:1;;;13001:21:4;13058:2;13038:18;;;13031:30;-1:-1:-1;;;13077:18:4;;;13070:47;13134:18;;33527:50:1;12817:341:4;33527:50:1;-1:-1:-1;;;;;33595:21:1;;33587:49;;;;-1:-1:-1;;;33587:49:1;;13365:2:4;33587:49:1;;;13347:21:4;13404:2;13384:18;;;13377:30;-1:-1:-1;;;13423:18:4;;;13416:45;13478:18;;33587:49:1;13163:339:4;33587:49:1;-1:-1:-1;;;;;33647:19:1;;;;;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;:37;;;33699:33;;972:25:4;;;33699:33:1;;945:18:4;33699:33:1;;;;;;;33442:297;;;:::o;17603:1612::-;-1:-1:-1;;;;;17698:20:1;;17690:51;;;;-1:-1:-1;;;17690:51:1;;13709:2:4;17690:51:1;;;13691:21:4;13748:2;13728:18;;;13721:30;-1:-1:-1;;;13767:18:4;;;13760:48;13825:18;;17690:51:1;13507:342:4;17690:51:1;-1:-1:-1;;;;;17759:23:1;;17751:52;;;;-1:-1:-1;;;17751:52:1;;14056:2:4;17751:52:1;;;14038:21:4;14095:2;14075:18;;;14068:30;-1:-1:-1;;;14114:18:4;;;14107:46;14170:18;;17751:52:1;13854:340:4;17751:52:1;17816:11;;;;17813:111;;;-1:-1:-1;;;;;17852:18:1;;;;;;:10;:18;;;;;;;;17851:19;:45;;;;-1:-1:-1;;;;;;17875:21:1;;;;;;:10;:21;;;;;;;;17874:22;17851:45;17843:70;;;;-1:-1:-1;;;17843:70:1;;14401:2:4;17843:70:1;;;14383:21:4;14440:2;14420:18;;;14413:30;-1:-1:-1;;;14459:18:4;;;14452:42;14511:18;;17843:70:1;14199:336:4;17843:70:1;17934:15;17953:26;:9;17972:6;17953:18;:26::i;:::-;:59;;;-1:-1:-1;17983:29:1;:9;18002;17983:18;:29::i;:::-;17953:78;;;-1:-1:-1;;;;;;18016:15:1;;;;;;:7;:15;;;;;;;;17953:78;:100;;;-1:-1:-1;;;;;;18035:18:1;;;;;;:7;:18;;;;;;;;17953:100;:117;;;-1:-1:-1;18065:5:1;;-1:-1:-1;;;;;18057:13:1;;;18065:5;;18057:13;17953:117;:137;;;-1:-1:-1;18085:5:1;;-1:-1:-1;;;;;18074:16:1;;;18085:5;;18074:16;17953:137;17934:157;-1:-1:-1;18102:23:1;-1:-1:-1;;;;;18127:21:1;;18143:4;18127:21;;:49;;-1:-1:-1;;;;;;18152:24:1;;18171:4;18152:24;18127:49;18227:19;;18102:75;;-1:-1:-1;18188:24:1;;-1:-1:-1;;;;;18217:29:1;;;-1:-1:-1;;;18227:19:1;;;;18217:29;:59;;;;-1:-1:-1;;;;;;18250:26:1;;15762:42;18250:26;18217:59;18216:134;;;-1:-1:-1;18303:19:1;;-1:-1:-1;;;;;18290:32:1;;;-1:-1:-1;;;18303:19:1;;;;18290:32;:59;;;;-1:-1:-1;;;;;;18326:23:1;;15762:42;18326:23;18290:59;18188:163;;18366:18;:41;;;;18388:19;18366:41;:55;;;;18411:10;18366:55;18363:846;;;18436:43;18453:6;18461:9;18472:6;18436:16;:43::i;:::-;18363:846;;;18529:6;;;;;;;18524:373;;6874:7;6900:6;-1:-1:-1;;;;;18559:17:1;;;6900:6;;18559:17;;;;:41;;-1:-1:-1;6874:7:1;6900:6;-1:-1:-1;;;;;18580:20:1;;;6900:6;;18580:20;;18559:41;18555:328;;;18628:5;;-1:-1:-1;;;18628:5:1;;;;18624:241;;;18682:9;-1:-1:-1;;;;;18666:28:1;18675:6;-1:-1:-1;;;;;18666:28:1;-1:-1:-1;;;;;;;;;;;18692:1:1;18666:28;;;;972:25:4;;960:2;945:18;;826:177;18666:28:1;;;;;;;;18720:7;;;17603:1612;;;:::o;18624:241::-;18809:6;;;;;;;18801:41;;;;-1:-1:-1;;;18801:41:1;;14932:2:4;18801:41:1;;;14914:21:4;14971:2;14951:18;;;14944:30;15010:25;14990:18;;;14983:53;15053:18;;18801:41:1;14730:347:4;18801:41:1;18939:19;;18920:10;;-1:-1:-1;;;;;18931:27:1;;;-1:-1:-1;;;18939:19:1;;;;18931:27;;:53;;-1:-1:-1;;;;;;18961:23:1;;15762:42;18961:23;18931:53;19021:19;;18920:64;;-1:-1:-1;18998:11:1;;-1:-1:-1;;;;;19010:30:1;;;-1:-1:-1;;;19021:19:1;;;;19010:30;;:59;;-1:-1:-1;;;;;;19043:26:1;;15762:42;19043:26;19010:59;18998:71;;19083:15;19102:5;19101:6;:17;;;;;19112:6;19111:7;19101:17;19083:35;;19132:64;19147:6;19154:9;19164:6;19171:5;19177:6;19185:10;19132:14;:64::i;:::-;18510:699;;;18363:846;17680:1535;;;17603:1612;;;:::o;13308:156::-;13381:4;13404:53;13412:3;-1:-1:-1;;;;;13432:23:1;;13404:7;:53::i;23107:1301::-;22994:27;:34;;-1:-1:-1;;22994:34:1;23024:4;22994:34;;;;;;23224:4:::1;22994:27:::0;23206:24;;;::::1;::::0;;;;;;;;23270:13:::1;::::0;23206:24;;22994:27;23256::::1;::::0;23270:13;;::::1;22994:34:::0;23270:13;;::::1;::::0;23256;;::::1;;:27;:::i;:::-;23240:43;;;;23293:19;23313:9;;23293:29;;23349:8;23335:11;:22;23332:123;;;23376:12;::::0;::::1;;23373:72;;;-1:-1:-1::0;23422:8:1;23373:72:::1;23486:11;23470:15;:27;:40;;;-1:-1:-1::0;23499:11:1::1;::::0;::::1;::::0;23470:40:::1;23467:75;;;23525:7;;;;;23467:75;23590:13;::::0;23551:25:::1;::::0;23577:36:::1;::::0;::::1;::::0;23578:25:::1;::::0;23590:13;;::::1;;;23578:11:::0;:25:::1;:::i;:::-;23577:36;;;;:::i;:::-;23663:13;::::0;23551:62;;-1:-1:-1;23623:25:1::1;::::0;23650:36:::1;::::0;::::1;::::0;23651:25:::1;::::0;23663:13;;::::1;;;23651:11:::0;:25:::1;:::i;:::-;23650:36;;;;:::i;:::-;23735:12;::::0;23623:63;;-1:-1:-1;23696:24:1::1;::::0;23722:35:::1;::::0;::::1;::::0;23723:24:::1;::::0;-1:-1:-1;;;23735:12:1;::::1;;;23723:11:::0;:24:::1;:::i;:::-;23722:35;;;;:::i;:::-;23804:10;::::0;23696:61;;-1:-1:-1;23767:22:1::1;::::0;23791:33:::1;::::0;::::1;::::0;23792:22:::1;::::0;-1:-1:-1;;;23804:10:1;::::1;;;23792:11:::0;:22:::1;:::i;:::-;23791:33;;;;:::i;:::-;23767:57:::0;-1:-1:-1;23835:16:1::1;23852:19;23870:1;23852:17:::0;:19:::1;:::i;:::-;23835:36:::0;-1:-1:-1;23881:19:1::1;23901:26;23835:36:::0;23901:17;:26:::1;:::i;:::-;23881:46:::0;-1:-1:-1;23941:17:1::1;24004:16:::0;23989:14;23959:29:::1;23971:17:::0;23881:46;23959:29:::1;:::i;:::-;:44;;;;:::i;:::-;:61;;;;:::i;:::-;23941:79:::0;-1:-1:-1;24061:21:1::1;24092:27;23941:79:::0;24092:16:::1;:27::i;:::-;24129:14;24145:41;24169:17:::0;24145:21:::1;:41;:::i;:::-;24129:58:::0;-1:-1:-1;24197:14:1::1;24235:9:::0;24215:18:::1;24222:11:::0;24129:58;24215:18:::1;:::i;:::-;24214:30;;;;:::i;:::-;24197:47;;24254:31;24268:8;24278:6;24254:13;:31::i;:::-;24295:20;24317:41;24341:17:::0;24317:21:::1;:41;:::i;:::-;24295:64;;24369:32;24388:12;24369:18;:32::i;:::-;23172:1236;;;;;;;;;;;;;;23038:1;-1:-1:-1::0;23049:27:1;:35;;-1:-1:-1;;23049:35:1;;;23107:1301::o;10918:297::-;10981:4;11972:19;;;:12;;;:19;;;;;;10997:212;;-1:-1:-1;11039:23:1;;;;;;;;:11;:23;;;;;;;;;;;;;11112:18;;11090:19;;;:12;;;:19;;;;;;:40;;;;11144:11;;10997:212;-1:-1:-1;11193:5:1;11186:12;;13475:165;-1:-1:-1;;;;;13608:23:1;;13555:4;11972:19;;;:12;;;:19;;;;;;:24;;13578:55;11876:127;21275:343;-1:-1:-1;;;;;21393:17:1;;21369:21;21393:17;;;:9;:17;;;;;;21428:23;;;;21420:60;;;;-1:-1:-1;;;21420:60:1;;15284:2:4;21420:60:1;;;15266:21:4;15323:2;15303:18;;;15296:30;-1:-1:-1;;;15342:18:4;;;15335:54;15406:18;;21420:60:1;15082:348:4;21420:60:1;21493:27;21506:6;21513;21493:12;:27::i;:::-;21533:28;21543:9;21554:6;21533:9;:28::i;:::-;21593:9;-1:-1:-1;;;;;21577:33:1;21586:6;-1:-1:-1;;;;;21577:33:1;-1:-1:-1;;;;;;;;;;;21603:6:1;21577:33;;;;972:25:4;;960:2;945:18;;826:177;21577:33:1;;;;;;;;21359:259;21275:343;;;:::o;19230:2035::-;-1:-1:-1;;;;;19389:20:1;;;19362:24;19389:20;;;:9;:20;;;;;;;19443:17;;;;;;;;19478:23;;;;19470:60;;;;-1:-1:-1;;;19470:60:1;;15284:2:4;19470:60:1;;;15266:21:4;15323:2;15303:18;;;15296:30;-1:-1:-1;;;15342:18:4;;;15335:54;15406:18;;19470:60:1;15082:348:4;19470:60:1;19564:1;19554:9;;:11;;;;:::i;:::-;19542:9;:23;19576:9;19595:873;;;;19623:38;:21;19654:6;19623:30;:38::i;:::-;19619:244;;-1:-1:-1;;;;;19699:17:1;;;;;;:9;:17;;;;;;19718:15;-1:-1:-1;19699:34:1;;:52;;-1:-1:-1;19735:16:1;;;;;;;19699:52;19691:82;;;;-1:-1:-1;;;19691:82:1;;15637:2:4;19691:82:1;;;15619:21:4;15676:2;15656:18;;;15649:30;-1:-1:-1;;;15695:18:4;;;15688:48;15753:18;;19691:82:1;15435:342:4;19691:82:1;19836:12;;19820:28;;:15;:28;:::i;:::-;-1:-1:-1;;;;;19802:17:1;;;;;;:9;:17;;;;;:46;19619:244;19905:9;;19897:6;:17;;19889:44;;;;-1:-1:-1;;;19889:44:1;;15984:2:4;19889:44:1;;;15966:21:4;16023:2;16003:18;;;15996:30;-1:-1:-1;;;16042:18:4;;;16035:45;16097:18;;19889:44:1;15782:339:4;19889:44:1;-1:-1:-1;19951:8:1;;;;;;;19595:873;;;19980:5;19977:491;;;20040:12;;20015:23;20032:6;20015:16;:23;:::i;:::-;:37;;20007:65;;;;-1:-1:-1;;;20007:65:1;;;;;;;:::i;:::-;20102:8;;20094:6;:16;;20086:45;;;;-1:-1:-1;;;20086:45:1;;;;;;;:::i;:::-;-1:-1:-1;20149:7:1;;;;19977:491;;;20228:12;;20203:23;20220:6;20203:16;:23;:::i;:::-;:37;;20195:65;;;;-1:-1:-1;;;20195:65:1;;;;;;;:::i;:::-;20292:38;:21;20323:6;20292:30;:38::i;:::-;20288:138;;-1:-1:-1;;;;;20356:17:1;;;;;;:9;:17;;;;;;20375:15;-1:-1:-1;20356:34:1;;:52;;-1:-1:-1;20392:16:1;;;;;;;20356:52;20348:78;;;;-1:-1:-1;;;20348:78:1;;16673:2:4;20348:78:1;;;16655:21:4;16712:2;16692:18;;;16685:30;-1:-1:-1;;;16731:18:4;;;16724:44;16785:18;;20348:78:1;16471:338:4;20348:78:1;-1:-1:-1;20444:12:1;;;;;;;19977:491;20511:11;;20478:19;;-1:-1:-1;;;20511:11:1;;;;20508:500;;;20555:19;;-1:-1:-1;;;;;20547:27:1;;;-1:-1:-1;;;20555:19:1;;;;20547:27;;;;20546:50;;-1:-1:-1;20579:16:1;;;;20578:17;20546:50;:82;;;;-1:-1:-1;20600:27:1;;;;20599:28;20546:82;20543:125;;;20642:26;20661:6;20642:18;:26::i;:::-;20769:12;;20681:21;;20703:79;;20717:6;;20725:3;;20769:12;-1:-1:-1;;;20769:12:1;;;;;-1:-1:-1;;;20758:10:1;;;;;20730:27;;20744:13;;;;;;20730;;;;;:27;:::i;:::-;:38;;;;:::i;:::-;:51;;;;:::i;:::-;20703:13;:79::i;:::-;20681:101;-1:-1:-1;20807:22:1;20681:101;20807:6;:22;:::i;:::-;20860:4;20842:24;;;;:9;:24;;;;;:41;;20795:34;;-1:-1:-1;20870:13:1;;20842:24;;;:41;;20870:13;;20842:41;:::i;:::-;;;;-1:-1:-1;;20902:44:1;;972:25:4;;;20926:4:1;;-1:-1:-1;;;;;20902:44:1;;;-1:-1:-1;;;;;;;;;;;20902:44:1;960:2:4;945:18;20902:44:1;;;;;;;20524:433;20508:500;;;-1:-1:-1;20991:6:1;20508:500;21020:27;21033:6;21040;21020:12;:27::i;:::-;21061:33;21071:9;21082:11;21061:9;:33::i;:::-;21114:16;;:82;;-1:-1:-1;;;21114:82:1;;-1:-1:-1;;;;;17139:15:4;;;21114:82:1;;;17121:34:4;17191:15;;;17171:18;;;17164:43;17223:18;;;17216:34;;;17293:14;;17286:22;17266:18;;;17259:50;17353:14;;17346:22;17325:19;;;17318:51;17413:14;;17406:22;17385:19;;;17378:51;21114:16:1;;;;:28;;17055:19:4;;21114:82:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21228:9;-1:-1:-1;;;;;21212:38:1;21221:6;-1:-1:-1;;;;;21212:38:1;-1:-1:-1;;;;;;;;;;;21238:11:1;21212:38;;;;972:25:4;;960:2;945:18;;826:177;21212:38:1;;;;;;;;19352:1913;;;;19230:2035;;;;;;:::o;11226:639::-;11292:4;11332:19;;;:12;;;:19;;;;;;11366:15;;11362:497;;11414:21;11438:14;11451:1;11438:10;:14;:::i;:::-;11486:18;;11414:38;;-1:-1:-1;11466:17:1;;11486:22;;11507:1;;11486:22;:::i;:::-;11466:42;;11532:17;11552:3;:11;;11564:9;11552:22;;;;;;;;:::i;:::-;;;;;;;;;11532:42;;11625:9;11596:3;:11;;11608:13;11596:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;11655:23;;;:12;;;:23;;;;;;:36;;;11714:17;;11655:3;;11714:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;11760:3;:12;;:19;11773:5;11760:19;;;;;;;;;;;11753:26;;;11801:4;11794:11;;;;;;;;11362:497;11843:5;11836:12;;;;;24418:425;24510:14;;24478:56;;24495:4;;-1:-1:-1;;;;;24510:14:1;24527:6;24478:8;:56::i;:::-;24568:16;;;24582:1;24568:16;;;;;;;;24544:21;;24568:16;;;;;;;;;;-1:-1:-1;24568:16:1;24544:40;;24612:4;24594;24599:1;24594:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24594:23:1;;;:7;;;;;;;;;:23;24637:4;;24627:7;;24637:4;;;24627;;24637;;24627:7;;;;;;:::i;:::-;-1:-1:-1;;;;;24627:14:1;;;:7;;;;;;;;;:14;24652;;:184;;-1:-1:-1;;;24652:184:1;;:14;;;:65;;:184;;24731:6;;24652:14;;24766:4;;24792;;24811:15;;24652:184;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24853:386;24946:9;24934:10;;:21;;;;;;;:::i;:::-;;;;-1:-1:-1;;24997:14:1;;24965:61;;24982:4;;-1:-1:-1;;;;;24997:14:1;25014:11;24965:8;:61::i;:::-;25036:14;;:196;;-1:-1:-1;;;25036:196:1;;25106:4;25036:196;;;19162:34:4;;;19212:18;;;19205:34;;;25036:14:1;19255:18:4;;;19248:34;;;19298:18;;;19291:34;19341:19;;;19334:44;25207:15:1;19394:19:4;;;19387:35;-1:-1:-1;;;;;25036:14:1;;;;:30;;25074:9;;19096:19:4;;25036:196:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;24853:386;;:::o;22488:375::-;22591:14;;22553:22;;22607:3;;22579:26;;22591:14;;22579:9;:26;:::i;:::-;22578:32;;;;:::i;:::-;22657:13;;22553:57;;-1:-1:-1;22620:21:1;;22672:3;;22645:25;;22657:13;;;;;22645:9;:25;:::i;:::-;22644:31;;;;:::i;:::-;22720:11;;22620:55;;-1:-1:-1;22685:19:1;;22733:3;;22708:23;;22720:11;;;;;22708:9;:23;:::i;:::-;22707:29;;;;:::i;:::-;22685:51;;22765:14;22747:16;;:32;;;;;;;:::i;:::-;;;;;;;;22806:13;22789:15;;:30;;;;;;;:::i;:::-;;;;;;;;22844:11;22829:13;;:26;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;22488:375:1:o;21962:155::-;-1:-1:-1;;;;;22053:15:1;;22035:17;22053:15;;;:9;:15;;;;;;:22;;22069:6;;22053:22;:::i;:::-;-1:-1:-1;;;;;22085:15:1;;;;;;;:9;:15;;;;;:25;;;;-1:-1:-1;;21962:155:1:o;21797:153::-;-1:-1:-1;;;;;21885:15:1;;21867:17;21885:15;;;:9;:15;;;;;;:22;;21901:6;;21885:22;:::i;21628:154::-;21718:7;21770:5;21756:10;21745:21;;21752:3;21745:10;;:6;:10;;;;:::i;:::-;:21;;;;:::i;:::-;21744:31;;;;:::i;:::-;21737:38;21628:154;-1:-1:-1;;;;21628:154:1:o;14:118:4:-;100:5;93:13;86:21;79:5;76:32;66:60;;122:1;119;112:12;137:241;193:6;246:2;234:9;225:7;221:23;217:32;214:52;;;262:1;259;252:12;214:52;301:9;288:23;320:28;342:5;320:28;:::i;383:173::-;451:20;;-1:-1:-1;;;;;500:31:4;;490:42;;480:70;;546:1;543;536:12;480:70;383:173;;;:::o;561:260::-;629:6;637;690:2;678:9;669:7;665:23;661:32;658:52;;;706:1;703;696:12;658:52;729:29;748:9;729:29;:::i;:::-;719:39;;777:38;811:2;800:9;796:18;777:38;:::i;:::-;767:48;;561:260;;;;;:::o;1200:186::-;1259:6;1312:2;1300:9;1291:7;1287:23;1283:32;1280:52;;;1328:1;1325;1318:12;1280:52;1351:29;1370:9;1351:29;:::i;1391:597::-;1503:4;1532:2;1561;1550:9;1543:21;1593:6;1587:13;1636:6;1631:2;1620:9;1616:18;1609:34;1661:1;1671:140;1685:6;1682:1;1679:13;1671:140;;;1780:14;;;1776:23;;1770:30;1746:17;;;1765:2;1742:26;1735:66;1700:10;;1671:140;;;1829:6;1826:1;1823:13;1820:91;;;1899:1;1894:2;1885:6;1874:9;1870:22;1866:31;1859:42;1820:91;-1:-1:-1;1972:2:4;1951:15;-1:-1:-1;;1947:29:4;1932:45;;;;1979:2;1928:54;;1391:597;-1:-1:-1;;;1391:597:4:o;2182:254::-;2250:6;2258;2311:2;2299:9;2290:7;2286:23;2282:32;2279:52;;;2327:1;2324;2317:12;2279:52;2350:29;2369:9;2350:29;:::i;:::-;2340:39;2426:2;2411:18;;;;2398:32;;-1:-1:-1;;;2182:254:4:o;3246:328::-;3323:6;3331;3339;3392:2;3380:9;3371:7;3367:23;3363:32;3360:52;;;3408:1;3405;3398:12;3360:52;3431:29;3450:9;3431:29;:::i;:::-;3421:39;;3479:38;3513:2;3502:9;3498:18;3479:38;:::i;:::-;3469:48;;3564:2;3553:9;3549:18;3536:32;3526:42;;3246:328;;;;;:::o;3579:156::-;3645:20;;3705:4;3694:16;;3684:27;;3674:55;;3725:1;3722;3715:12;3740:606;3839:6;3847;3855;3863;3871;3879;3887;3940:3;3928:9;3919:7;3915:23;3911:33;3908:53;;;3957:1;3954;3947:12;3908:53;3980:27;3997:9;3980:27;:::i;:::-;3970:37;;4026:36;4058:2;4047:9;4043:18;4026:36;:::i;:::-;4016:46;;4081:36;4113:2;4102:9;4098:18;4081:36;:::i;:::-;4071:46;;4136:36;4168:2;4157:9;4153:18;4136:36;:::i;:::-;4126:46;;4191:37;4223:3;4212:9;4208:19;4191:37;:::i;:::-;4181:47;;4247:37;4279:3;4268:9;4264:19;4247:37;:::i;:::-;4237:47;;4303:37;4335:3;4324:9;4320:19;4303:37;:::i;:::-;4293:47;;3740:606;;;;;;;;;;:::o;4351:315::-;4416:6;4424;4477:2;4465:9;4456:7;4452:23;4448:32;4445:52;;;4493:1;4490;4483:12;4445:52;4516:29;4535:9;4516:29;:::i;:::-;4506:39;;4595:2;4584:9;4580:18;4567:32;4608:28;4630:5;4608:28;:::i;:::-;4655:5;4645:15;;;4351:315;;;;;:::o;5132:182::-;5189:6;5242:2;5230:9;5221:7;5217:23;5213:32;5210:52;;;5258:1;5255;5248:12;5210:52;5281:27;5298:9;5281:27;:::i;5319:180::-;5378:6;5431:2;5419:9;5410:7;5406:23;5402:32;5399:52;;;5447:1;5444;5437:12;5399:52;-1:-1:-1;5470:23:4;;5319:180;-1:-1:-1;5319:180:4:o;5504:272::-;5562:6;5615:2;5603:9;5594:7;5590:23;5586:32;5583:52;;;5631:1;5628;5621:12;5583:52;5670:9;5657:23;5720:6;5713:5;5709:18;5702:5;5699:29;5689:57;;5742:1;5739;5732:12;5781:248;5849:6;5857;5910:2;5898:9;5889:7;5885:23;5881:32;5878:52;;;5926:1;5923;5916:12;5878:52;-1:-1:-1;;5949:23:4;;;6019:2;6004:18;;;5991:32;;-1:-1:-1;5781:248:4:o;6267:342::-;6469:2;6451:21;;;6508:2;6488:18;;;6481:30;-1:-1:-1;;;6542:2:4;6527:18;;6520:48;6600:2;6585:18;;6267:342::o;7168:127::-;7229:10;7224:3;7220:20;7217:1;7210:31;7260:4;7257:1;7250:15;7284:4;7281:1;7274:15;7300:422;7389:1;7432:5;7389:1;7446:270;7467:7;7457:8;7454:21;7446:270;;;7526:4;7522:1;7518:6;7514:17;7508:4;7505:27;7502:53;;;7535:18;;:::i;:::-;7585:7;7575:8;7571:22;7568:55;;;7605:16;;;;7568:55;7684:22;;;;7644:15;;;;7446:270;;;7450:3;7300:422;;;;;:::o;7727:806::-;7776:5;7806:8;7796:80;;-1:-1:-1;7847:1:4;7861:5;;7796:80;7895:4;7885:76;;-1:-1:-1;7932:1:4;7946:5;;7885:76;7977:4;7995:1;7990:59;;;;8063:1;8058:130;;;;7970:218;;7990:59;8020:1;8011:10;;8034:5;;;8058:130;8095:3;8085:8;8082:17;8079:43;;;8102:18;;:::i;:::-;-1:-1:-1;;8158:1:4;8144:16;;8173:5;;7970:218;;8272:2;8262:8;8259:16;8253:3;8247:4;8244:13;8240:36;8234:2;8224:8;8221:16;8216:2;8210:4;8207:12;8203:35;8200:77;8197:159;;;-1:-1:-1;8309:19:4;;;8341:5;;8197:159;8388:34;8413:8;8407:4;8388:34;:::i;:::-;8458:6;8454:1;8450:6;8446:19;8437:7;8434:32;8431:58;;;8469:18;;:::i;:::-;8507:20;;7727:806;-1:-1:-1;;;7727:806:4:o;8538:140::-;8596:5;8625:47;8666:4;8656:8;8652:19;8646:4;8625:47;:::i;8683:168::-;8723:7;8789:1;8785;8781:6;8777:14;8774:1;8771:21;8766:1;8759:9;8752:17;8748:45;8745:71;;;8796:18;;:::i;:::-;-1:-1:-1;8836:9:4;;8683:168::o;9205:125::-;9245:4;9273:1;9270;9267:8;9264:34;;;9278:18;;:::i;:::-;-1:-1:-1;9315:9:4;;9205:125::o;9335:128::-;9375:3;9406:1;9402:6;9399:1;9396:13;9393:39;;;9412:18;;:::i;:::-;-1:-1:-1;9448:9:4;;9335:128::o;9468:204::-;9506:3;9542:4;9539:1;9535:12;9574:4;9571:1;9567:12;9609:3;9603:4;9599:14;9594:3;9591:23;9588:49;;;9617:18;;:::i;:::-;9653:13;;9468:204;-1:-1:-1;;;9468:204:4:o;10084:184::-;10154:6;10207:2;10195:9;10186:7;10182:23;10178:32;10175:52;;;10223:1;10220;10213:12;10175:52;-1:-1:-1;10246:16:4;;10084:184;-1:-1:-1;10084:184:4:o;10905:245::-;10972:6;11025:2;11013:9;11004:7;11000:23;10996:32;10993:52;;;11041:1;11038;11031:12;10993:52;11073:9;11067:16;11092:28;11114:5;11092:28;:::i;11155:217::-;11195:1;11221;11211:132;;11265:10;11260:3;11256:20;11253:1;11246:31;11300:4;11297:1;11290:15;11328:4;11325:1;11318:15;11211:132;-1:-1:-1;11357:9:4;;11155:217::o;16126:340::-;16328:2;16310:21;;;16367:2;16347:18;;;16340:30;-1:-1:-1;;;16401:2:4;16386:18;;16379:46;16457:2;16442:18;;16126:340::o;17440:127::-;17501:10;17496:3;17492:20;17489:1;17482:31;17532:4;17529:1;17522:15;17556:4;17553:1;17546:15;17572:127;17633:10;17628:3;17624:20;17621:1;17614:31;17664:4;17661:1;17654:15;17688:4;17685:1;17678:15;17836:980;18098:4;18146:3;18135:9;18131:19;18177:6;18166:9;18159:25;18203:2;18241:6;18236:2;18225:9;18221:18;18214:34;18284:3;18279:2;18268:9;18264:18;18257:31;18308:6;18343;18337:13;18374:6;18366;18359:22;18412:3;18401:9;18397:19;18390:26;;18451:2;18443:6;18439:15;18425:29;;18472:1;18482:195;18496:6;18493:1;18490:13;18482:195;;;18561:13;;-1:-1:-1;;;;;18557:39:4;18545:52;;18652:15;;;;18617:12;;;;18593:1;18511:9;18482:195;;;-1:-1:-1;;;;;;;18733:32:4;;;;18728:2;18713:18;;18706:60;-1:-1:-1;;;18797:3:4;18782:19;18775:35;18694:3;17836:980;-1:-1:-1;;;17836:980:4:o;19433:306::-;19521:6;19529;19537;19590:2;19578:9;19569:7;19565:23;19561:32;19558:52;;;19606:1;19603;19596:12;19558:52;19635:9;19629:16;19619:26;;19685:2;19674:9;19670:18;19664:25;19654:35;;19729:2;19718:9;19714:18;19708:25;19698:35;;19433:306;;;;;:::o
Swarm Source
ipfs://1849f6da2bc6329af963696f2f82407bb6edd40c6619b130920d1202bfc78b78
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.