ERC-20
Overview
Max Total Supply
643,865,323.16183545247845869 WISEr
Holders
147
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract (WITH 18 Decimals)
Balance
0.3575 WISErValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
TokenProfit
Compiler Version
v0.8.19+commit.7dd6d404
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: --DAO-- /** * @author René Hochmuth * @author Vitally Marinchenko */ pragma solidity =0.8.19; import "./Adapter.sol"; import "./TokenBase.sol"; error Prevented(); error ExecuteFailed(); error InvalidAmount( uint256 provided, uint256 required ); contract TokenProfit is TokenBase { Adapter public adapter; address public adapterContract; address public governanceContract; address public immutable auctionContract; uint256 constant PRECISION_FACTOR = 1E18; bool public extraMintAllowed; uint256 status; uint256 constant ENTERED = 1; uint256 constant NOT_ENTERED = 2; modifier nonReentrant() { nonReentrantBefore(); _; nonReentrantAfter(); } function nonReentrantBefore() private { if (status == ENTERED) { revert Prevented(); } status = ENTERED; } function nonReentrantAfter() private { status = NOT_ENTERED; } modifier onlyAdapter() { require( msg.sender == adapterContract, "TokenProfit: NOT_ADAPTER" ); _; } modifier onlyGovernance() { require( msg.sender == governanceContract, "TokenProfit: NOT_GOVERNANCE" ); _; } modifier syncAdapter() { adapter.syncServices(); _; } receive() external payable { emit Received( msg.sender, msg.value ); } constructor( address _auctionContract, address _uniV2RouterAddress, address _liquidNFTsRouterAddress, address _liquidNFTsWETHPool, address _liquidNFTsUSDCPool ) { adapter = new Adapter( address(this), _uniV2RouterAddress, _liquidNFTsRouterAddress, _liquidNFTsWETHPool, _liquidNFTsUSDCPool ); auctionContract = _auctionContract; adapterContract = address(adapter); governanceContract = msg.sender; status = NOT_ENTERED; } /** * @dev Allows to execute contract call controlled by Adapter contract */ function executeAdapterRequest( address _contractAddress, bytes memory _callBytes ) external onlyAdapter returns (bytes memory) { ( bool success, bytes memory returnData ) = _contractAddress.call( _callBytes ); if (success == false) { revert ExecuteFailed(); } return returnData; } /** * @dev Allows to execute contract call defined by Adapter contract */ function executeAdapterRequestWithValue( address _callAddress, bytes memory _callBytes, uint256 _callValue ) external onlyAdapter returns (bytes memory) { ( bool success, bytes memory returnData ) = _callAddress.call{value: _callValue}( _callBytes ); if (success == false) { revert ExecuteFailed(); } return returnData; } /** * @dev Allows to change Adapter contract */ function changeAdapter( address _newAdapterAddress ) external onlyGovernance { adapterContract = _newAdapterAddress; adapter = Adapter( _newAdapterAddress ); } /** * @dev Returns total amount of tokens controlled by Adapter contract */ function getTotalTokenAmount( uint8 _index ) external view returns (uint256) { ( , uint256[] memory tokenAmounts, , ) = adapter.getTokenAmounts(); return tokenAmounts[_index]; } /** * @dev Allows user to burn TokenProfit tokens and redeem rewards */ function redeemRewards( uint256 _burnAmount ) external syncAdapter nonReentrant returns ( uint256, uint256[] memory ) { ( uint256 availableEther, uint256[] memory availableTokens, uint256 etherRedeemAmount, uint256[] memory tokenRedeemAmounts ) = getUserRedeemAmounts( _burnAmount ); _burn( msg.sender, _burnAmount ); _processTokens( availableTokens, tokenRedeemAmounts ); _processEther( availableEther, etherRedeemAmount ); emit RewardsRedeemed( _burnAmount, tokenRedeemAmounts, etherRedeemAmount ); return ( etherRedeemAmount, tokenRedeemAmounts ); } /** * @dev Calculates the max amount users can mint */ function getAvailableMint() public view returns (uint256 res) { if (totalSupply > INITIAL_TOTAL_SUPPLY) { return 0; } res = INITIAL_TOTAL_SUPPLY - totalSupply; } /** * @dev Calculates redeem rewards for the user based on burn amount */ function getUserRedeemAmounts( uint256 _burnAmount ) public view returns ( uint256, uint256[] memory, uint256, uint256[] memory ) { ( uint256 etherAmount, uint256[] memory tokenAmounts, uint256 availableEther, uint256[] memory availableTokens ) = adapter.getTokenAmounts(); uint256 length = tokenAmounts.length; uint256[] memory tokenRedeemAmounts = new uint256[](length); for (uint256 i = 0; i < length; i++) { tokenRedeemAmounts[i] = _getRedeemAmount( _burnAmount, tokenAmounts[i], totalSupply ); } uint256 etherRedeemAmount = _getRedeemAmount( _burnAmount, etherAmount, totalSupply ); return ( availableEther, availableTokens, etherRedeemAmount, tokenRedeemAmounts ); } /** * @dev Calculates redeem rewards based on burn amount and total supply */ function _getRedeemAmount( uint256 _burnAmount, uint256 _tokenAmount, uint256 _totalSupply ) internal pure returns (uint256) { return _burnAmount * PRECISION_FACTOR * _tokenAmount / PRECISION_FACTOR / _totalSupply; } /** * @dev Pays out rewards to the user in all supported tokens */ function _processTokens( uint256[] memory _available, uint256[] memory _redeemAmounts ) internal { for (uint256 i = 0; i < _available.length; i++) { if (_redeemAmounts[i] > _available[i]) { _redeemAmounts[i] = _available[i] + adapter.assistWithdrawTokens( i, _redeemAmounts[i] - _available[i] ); } ( IERC20 token , , , ) = adapter.tokens( i ); token.transfer( msg.sender, _redeemAmounts[i] ); } } /** * @dev Pays out rewards to the user in ETH currency */ function _processEther( uint256 _available, uint256 _redeemAmount ) internal returns (uint256) { if (_redeemAmount > _available) { _redeemAmount = _available + adapter.assistWithdrawETH( _redeemAmount - _available ); } payable(msg.sender).transfer( _redeemAmount ); return _redeemAmount; } /** * @dev Allows to mint TokenProfit tokens by Auction Contract */ function mintSupply( address _mintTo, uint256 _mintAmount ) external returns (bool) { require( msg.sender == auctionContract, "TokenProfit: INVALID_MINTER" ); _mint( _mintTo, _mintAmount ); return true; } /** * @dev Allows to mint exact amount of TokenProfit tokens * by anyone who provides enough ETH - does include fees */ function buySupply( uint256 _desiredAmount ) external payable nonReentrant returns (uint256) { require( extraMintAllowed == true, "TokenProfit: MINT_NOT_ALLOWED" ); require( getAvailableMint() >= _desiredAmount, "TokenProfit: MINT_CAPPED" ); uint256 ethRequired = adapter.getEthAmountFromTokenAmount( _desiredAmount, msg.value ); require( ethRequired > MIN_ETH_AMOUNT, "TokenProfit: MINT_TOO_SMALL" ); if (msg.value < ethRequired) { revert InvalidAmount( msg.value, ethRequired ); } _mint( msg.sender, _desiredAmount ); payable(msg.sender).transfer( msg.value - ethRequired ); emit SupplyPurchase( msg.sender, ethRequired, _desiredAmount, adapter.buyFee() ); return ethRequired; } /** * @dev Let governance decide for extra minting */ function setAllowMint( bool _allow ) external onlyGovernance { extraMintAllowed = _allow; } /** * @dev Allows UI to fetch mintfee more easily */ function getCurrentBuyFee() external view returns (uint256) { return adapter.buyFee(); } }
// SPDX-License-Identifier: --DAO-- /** * @author René Hochmuth * @author Vitally Marinchenko */ pragma solidity =0.8.19; import "./AdapterHelper.sol"; contract Adapter is AdapterHelper { constructor( address _tokenProfitAddress, address _uniV2RouterAddress, address _liquidNFTsRouterAddress, address _liquidNFTsWETHPool, address _liquidNFTsUSDCPool ) AdapterDeclarations( _tokenProfitAddress, _uniV2RouterAddress, _liquidNFTsRouterAddress, _liquidNFTsWETHPool, _liquidNFTsUSDCPool ) { admin = tx.origin; multisig = tx.origin; } /** * @dev Overview for services and ability to syncronize them */ function syncServices() external { liquidNFTsUSDCPool.manualSyncPool(); liquidNFTsWETHPool.manualSyncPool(); } /** * @dev Allows admin to swap USDC for ETH using UniswapV2 */ function swapUSDCForETH( uint256 _amount, uint256 _minAmountOut ) external onlyMultiSig returns ( uint256 amountIn, uint256 amountOut ) { address[] memory path = new address[](2); path[0] = USDC_ADDRESS; path[1] = WETH_ADDRESS; uint256[] memory amounts = _executeSwap( path, _amount, _minAmountOut ); emit AdminSwap( USDC_ADDRESS, WETH_ADDRESS, amounts[0], amounts[1] ); return ( amounts[0], amounts[1] ); } function _precisionWithFee() internal view returns (uint256) { return FEE_PRECISION + buyFee; } /** * @dev Calculates tokens to mint given exact ETH amount * input for the TokenProfit contract during mint */ function getTokenAmountFromEthAmount( uint256 _ethAmount ) external view returns (uint256) { return tokenProfit.totalSupply() * _ethAmount * FEE_PRECISION / _precisionWithFee() / _calculateTotalEthValue( 0 ); } /** * @dev Calculates ETH amount necessary to pay to * receive fixed token amount from the TokenProfit contract */ function getEthAmountFromTokenAmount( uint256 _tokenAmount, uint256 _msgValue ) external view returns (uint256) { return _calculateTotalEthValue( _msgValue ) * _tokenAmount * PRECISION_FACTOR * _precisionWithFee() / FEE_PRECISION / tokenProfit.totalSupply() / PRECISION_FACTOR; } function proposeNewMultisig( address _proposedMultisig ) external onlyMultiSig { address oldProposedMultisig = proposedMultisig; proposedMultisig = _proposedMultisig; emit MultisigUpdateProposed( oldProposedMultisig, _proposedMultisig ); } function claimMultisigOwnership() external onlyProposedMultisig { address oldMultisig = multisig; multisig = proposedMultisig; proposedMultisig = ZERO_ADDRESS; emit MultisigUpdate( oldMultisig, multisig ); } /** * @dev Starts the process to change the admin address */ function proposeNewAdmin( address _newProposedAdmin ) external onlyMultiSig { address oldProposedAdmin = proposedAdmin; proposedAdmin = _newProposedAdmin; emit AdminUpdateProposed( oldProposedAdmin, _newProposedAdmin ); } /** * @dev Finalize the change of the admin address */ function claimAdminOwnership() external onlyProposedAdmin { address oldAdmin = admin; admin = proposedAdmin; proposedAdmin = ZERO_ADDRESS; emit AdminUpdate( oldAdmin, admin ); } /** * @dev Ability for multisig to change the buy fee */ function changeBuyFee( uint256 _newFeeValue ) external onlyMultiSig { require( FEE_THRESHOLD > _newFeeValue, "Adapter: FEE_TOO_HIGH" ); require( _newFeeValue > FEE_LOWER_BOUND, "Adapter: FEE_TOO_LOW" ); uint256 oldValue = buyFee; buyFee = _newFeeValue; emit BuyFeeChanged( oldValue, _newFeeValue ); } /** * @dev Allows multisig to swap ETH for USDC using UniswapV2 */ function swapETHforUSDC( uint256 _amount, uint256 _minAmountOut ) external onlyMultiSig returns ( uint256 amountIn, uint256 amountOut ) { address[] memory path = new address[](2); path[0] = WETH_ADDRESS; path[1] = USDC_ADDRESS; uint256[] memory amounts = _executeSwapWithValue( path, _amount, _minAmountOut ); emit AdminSwap( WETH_ADDRESS, USDC_ADDRESS, amounts[0], amounts[1] ); return ( amounts[0], amounts[1] ); } /** * @dev Allows admin to deposit ETH into LiquidNFTs pool */ function depositETHLiquidNFTs( uint256 _amount ) external onlyAdmin { _wrapETH( _amount ); _depositLiquidNFTsWrapper( liquidNFTsWETHPool, _amount ); } /** * @dev Allows admin to deposit USDC into LiquidNFTs pool */ function depositUSDCLiquidNFTs( uint256 _amount ) external onlyAdmin { _depositLiquidNFTsWrapper( liquidNFTsUSDCPool, _amount ); } /** * @dev Allows admin to withdraw USDC from LiquidNFTs pool */ function withdrawUSDCLiquidNFTs( uint256 _amount ) external onlyAdmin { _withdrawLiquidNFTsWrapper( liquidNFTsUSDCPool, _amount ); } /** * @dev Allows admin to withdraw ETH from LiquidNFTs pool */ function withdrawETHLiquidNFTs( uint256 _amount ) external onlyAdmin { _withdrawLiquidNFTsWrapper( liquidNFTsWETHPool, _amount ); _unwrapETH( WETH.balanceOf( TOKEN_PROFIT_ADDRESS ) ); } /** * @dev Allows TokenProfit contract to withdraw tokens from services */ function assistWithdrawTokens( uint256 _index, uint256 _amount ) external onlyTokenProfit returns (uint256) { if (tokens[_index].tokenERC20 == USDC) { return _USDCRoutine( _amount ); } revert InvalidToken(); } /** * @dev Allows TokenProfit contract to withdraw ETH from services */ function assistWithdrawETH( uint256 _amount ) external onlyTokenProfit returns (uint256) { return _WETHRoutine( _amount ); } }
// SPDX-License-Identifier: --DAO-- /** * @author René Hochmuth * @author Vitally Marinchenko */ pragma solidity =0.8.19; import "./AdapterInterfaces.sol"; error InvalidFeed(); error InvalidToken(); error InvalidDecimals(); contract AdapterDeclarations { struct TokenData { IERC20 tokenERC20; IChainLink feedLink; uint8 feedDecimals; uint8 tokenDecimals; } uint256 constant TOKENS = 1; TokenData[TOKENS] public tokens; IERC20 public immutable WETH; IERC20 public immutable USDC; address public immutable WETH_ADDRESS; address public immutable USDC_ADDRESS; address public immutable TOKEN_PROFIT_ADDRESS; address public immutable UNIV2_ROUTER_ADDRESS; address public immutable LIQUID_NFT_ROUTER_ADDRESS; ITokenProfit public immutable tokenProfit; ILiquidNFTsPool public immutable liquidNFTsWETHPool; ILiquidNFTsPool public immutable liquidNFTsUSDCPool; address public admin; address public multisig; address public proposedMultisig; address public proposedAdmin; uint256 public buyFee = 1000; uint256 constant public FEE_PRECISION = 1E4; uint256 constant public FEE_THRESHOLD = 50000; uint256 constant public FEE_LOWER_BOUND = 10; uint256 constant public PRECISION_FACTOR = 1E18; uint80 constant MAX_ROUND_COUNT = 50; address constant ZERO_ADDRESS = address(0x0); uint256 constant UINT256_MAX = type(uint256).max; mapping(address => uint256) public chainLinkHeartBeat; modifier onlyAdmin() { require( msg.sender == admin, "AdapterDeclarations: NOT_ADMIN" ); _; } modifier onlyTokenProfit() { require( msg.sender == TOKEN_PROFIT_ADDRESS, "AdapterDeclarations: NOT_TOKEN_PROFIT" ); _; } modifier onlyProposedMultisig() { require( msg.sender == proposedMultisig, "AdapterDeclarations: NOT_PROPOSED_MULTISIG" ); _; } modifier onlyProposedAdmin() { require( msg.sender == proposedAdmin, "AdapterDeclarations: NOT_PROPOSED_ADMIN" ); _; } modifier onlyMultiSig() { require( msg.sender == multisig, "AdapterDeclarations: NOT_MULTISIG" ); _; } event AdminSwap( address indexed from, address indexed to, uint256 amountIn, uint256 amountOut ); event BuyFeeChanged( uint256 indexed oldFee, uint256 indexed newFee ); event MultisigUpdate( address oldMultisig, address newMultisig ); event MultisigUpdateProposed( address oldProposedMultisig, address newProposedMultisig ); event AdminUpdate( address oldAdmin, address newAdmin ); event AdminUpdateProposed( address oldProposedAdmin, address newProposedAdmin ); constructor( address _tokenProfitAddress, address _uniV2RouterAddress, address _liquidNFTsRouterAddress, address _liquidNFTsWETHPool, address _liquidNFTsUSDCPool ) { // --- liquidNFTs group --- liquidNFTsWETHPool = ILiquidNFTsPool( _liquidNFTsWETHPool ); liquidNFTsUSDCPool = ILiquidNFTsPool( _liquidNFTsUSDCPool ); LIQUID_NFT_ROUTER_ADDRESS = _liquidNFTsRouterAddress; // --- token group --- USDC_ADDRESS = liquidNFTsUSDCPool.poolToken(); WETH_ADDRESS = liquidNFTsWETHPool.poolToken(); USDC = IERC20( USDC_ADDRESS ); WETH = IWETH( WETH_ADDRESS ); IChainLink chainLinkFeed = IChainLink( 0x986b5E1e1755e3C2440e960477f25201B0a8bbD4 ); tokens[0] = TokenData({ tokenERC20: USDC, feedLink: chainLinkFeed, feedDecimals: chainLinkFeed.decimals(), tokenDecimals: USDC.decimals() }); _validateData(); // --- tokenProfit group --- tokenProfit = ITokenProfit( _tokenProfitAddress ); TOKEN_PROFIT_ADDRESS = _tokenProfitAddress; UNIV2_ROUTER_ADDRESS = _uniV2RouterAddress; } function _validateData() private { for (uint256 i = 0; i < TOKENS; i++) { TokenData memory token = tokens[i]; if (token.tokenDecimals == 0) { revert InvalidDecimals(); } if (token.feedDecimals == 0) { revert InvalidDecimals(); } if (token.tokenERC20 == IERC20(ZERO_ADDRESS)) { revert InvalidToken(); } if (token.feedLink == IChainLink(ZERO_ADDRESS)) { revert InvalidFeed(); } string memory expectedFeedName = string.concat( token.tokenERC20.symbol(), " / " "ETH" ); string memory chainLinkFeedName = token.feedLink.description(); require( keccak256(abi.encodePacked(expectedFeedName)) == keccak256(abi.encodePacked(chainLinkFeedName)), "AdapterDeclarations: INVALID_CHAINLINK_FEED" ); recalibrate( address(token.feedLink) ); } } /** * @dev Determines info for the heartbeat update * mechanism for chainlink oracles (roundIds) */ function getLatestAggregatorRoundId( IChainLink _feed ) public view returns (uint80) { ( uint80 roundId, , , , ) = _feed.latestRoundData(); return uint64(roundId); } /** * @dev Determines number of iterations necessary during recalibrating * heartbeat. */ function _getIterationCount( uint80 _latestAggregatorRoundId ) internal pure returns (uint80) { return _latestAggregatorRoundId > MAX_ROUND_COUNT ? MAX_ROUND_COUNT : _latestAggregatorRoundId; } /** * @dev fetches timestamp of a byteshifted aggregatorRound with specific * phaseID. For more info see chainlink historical price data documentation */ function _getRoundTimestamp( IChainLink _feed, uint16 _phaseId, uint80 _aggregatorRoundId ) internal view returns (uint256) { ( , , , uint256 timestamp, ) = _feed.getRoundData( getRoundIdByByteShift( _phaseId, _aggregatorRoundId ) ); return timestamp; } /** * @dev Determines info for the heartbeat update mechanism for chainlink * oracles (shifted round Ids) */ function getRoundIdByByteShift( uint16 _phaseId, uint80 _aggregatorRoundId ) public pure returns (uint80) { return uint80(uint256(_phaseId) << 64 | _aggregatorRoundId); } /** * @dev Function to recalibrate the heartbeat for a specific feed */ function recalibrate( address _feed ) public { chainLinkHeartBeat[_feed] = recalibratePreview( IChainLink(_feed) ); } /** * @dev View function to determine the heartbeat for a specific feed * Looks at the maximal last 50 rounds and takes second highest value to * avoid counting offline time of chainlink as valid heartbeat */ function recalibratePreview( IChainLink _feed ) public view returns (uint256) { uint80 latestAggregatorRoundId = getLatestAggregatorRoundId( _feed ); uint80 iterationCount = _getIterationCount( latestAggregatorRoundId ); if (iterationCount < 2) { revert("LiquidRouter: SMALL_SAMPLE"); } uint16 phaseId = _feed.phaseId(); uint256 latestTimestamp = _getRoundTimestamp( _feed, phaseId, latestAggregatorRoundId ); uint256 currentDiff; uint256 currentBiggest; uint256 currentSecondBiggest; for (uint80 i = 1; i < iterationCount; i++) { uint256 currentTimestamp = _getRoundTimestamp( _feed, phaseId, latestAggregatorRoundId - i ); currentDiff = latestTimestamp - currentTimestamp; latestTimestamp = currentTimestamp; if (currentDiff >= currentBiggest) { currentSecondBiggest = currentBiggest; currentBiggest = currentDiff; } else if (currentDiff > currentSecondBiggest && currentDiff < currentBiggest) { currentSecondBiggest = currentDiff; } } return currentSecondBiggest; } function setApprovals() external { address[2] memory spenders = [ UNIV2_ROUTER_ADDRESS, LIQUID_NFT_ROUTER_ADDRESS ]; for (uint256 i = 0; i < spenders.length; i++) { for (uint256 j = 0; j < tokens.length; j++) { tokenProfit.executeAdapterRequest( address(tokens[j].tokenERC20), abi.encodeWithSelector( IERC20.approve.selector, spenders[i], UINT256_MAX ) ); } tokenProfit.executeAdapterRequest( WETH_ADDRESS, abi.encodeWithSelector( IERC20.approve.selector, spenders[i], UINT256_MAX ) ); } } }
// SPDX-License-Identifier: --DAO-- /** * @author René Hochmuth * @author Vitally Marinchenko */ pragma solidity =0.8.19; import "./AdapterDeclarations.sol"; error SlippageTooBig(); error ChainLinkOffline(); abstract contract AdapterHelper is AdapterDeclarations { /** * @dev Tells TokenProfit contract to perform a swap through UniswapV2 starting with ETH */ function _executeSwapWithValue( address[] memory _path, uint256 _amount, uint256 _minAmountOut ) internal returns (uint256[] memory) { if (_minAmountOut == 0) { revert SlippageTooBig(); } bytes memory callbackData = tokenProfit.executeAdapterRequestWithValue( UNIV2_ROUTER_ADDRESS, abi.encodeWithSelector( IUniswapV2.swapExactETHForTokens.selector, _minAmountOut, _path, TOKEN_PROFIT_ADDRESS, block.timestamp ), _amount ); return abi.decode( callbackData, ( uint256[] ) ); } /** * @dev checks if chainLink price feeds are still operating */ function isChainlinkOffline() public view returns (bool) { for (uint256 i = 0; i < TOKENS; i++) { IChainLink feed = tokens[i].feedLink; ( , , , uint256 upd , ) = feed.latestRoundData(); upd = block.timestamp > upd ? block.timestamp - upd : block.timestamp; if (upd > chainLinkHeartBeat[address(feed)]) return true; } return false; } /** * @dev Calculates ETH and token balances available for services * -------------------------------- * availableEther is ETH balance of the TokenProfit contract * availableTokens is balances of all tokens in TokenProfit contract * etherAmount is availableEther + ETH deposited in other services * tokenAmounts is availableTokens + tokens deposited in other services */ function getTokenAmounts() public view returns ( uint256 etherAmount, uint256[] memory tokensAmounts, uint256 availableEther, uint256[] memory availableAmounts ) { uint256[] memory tokenAmounts = new uint256[](TOKENS); uint256[] memory availableTokens = new uint256[](TOKENS); ( availableEther, availableTokens ) = _getAvailableFunds(); for (uint256 i = 0; i < TOKENS; i++) { tokenAmounts[i] = _getReservesByToken( tokens[i].tokenERC20 ) + availableTokens[i]; } etherAmount = _calculateAmountFromShares( liquidNFTsWETHPool, TOKEN_PROFIT_ADDRESS ) + availableEther; return ( etherAmount, tokenAmounts, availableEther, availableTokens ); } function _calculateTotalEthValue( uint256 _msgValue ) internal view returns (uint256) { if (isChainlinkOffline() == true) { revert ChainLinkOffline(); } ( uint256 etherAmount, uint256[] memory tokensAmounts, , ) = getTokenAmounts(); for (uint256 i = 0; i < TOKENS; i++) { TokenData memory token = tokens[i]; IChainLink feed = token.feedLink; uint256 latestAnswer = feed.latestAnswer(); require( latestAnswer > 0, "AdapterHelper: CHAINLINK_OFFLINE" ); etherAmount += feed.latestAnswer() * PRECISION_FACTOR * tokensAmounts[i] / (10 ** token.tokenDecimals) / (10 ** token.feedDecimals); } return etherAmount - _msgValue; } /** * @dev Tells TokenProfit contract to perform * a swap through UniswapV2 starting with Tokens */ function _executeSwap( address[] memory _path, uint256 _amount, uint256 _minAmountOut ) internal returns (uint256[] memory) { if (_minAmountOut == 0) { revert SlippageTooBig(); } bytes memory callbackData = tokenProfit.executeAdapterRequest( UNIV2_ROUTER_ADDRESS, abi.encodeWithSelector( IUniswapV2.swapExactTokensForETH.selector, _amount, _minAmountOut, _path, TOKEN_PROFIT_ADDRESS, block.timestamp ) ); return abi.decode( callbackData, ( uint256[] ) ); } /** * @dev Tells TokenProfit contract to convert WETH to ETH */ function _unwrapETH( uint256 _amount ) internal { tokenProfit.executeAdapterRequest( WETH_ADDRESS, abi.encodeWithSelector( IWETH.withdraw.selector, _amount ) ); } /** * @dev Tells TokenProfit contract to convert ETH to WETH */ function _wrapETH( uint256 _amount ) internal { tokenProfit.executeAdapterRequestWithValue( WETH_ADDRESS, abi.encodeWithSelector( IWETH.deposit.selector ), _amount ); } /** * @dev Tells TokenProfit contract to deposit funds into LiquidNFTs pool */ function _depositLiquidNFTsWrapper( ILiquidNFTsPool _pool, uint256 _amount ) internal { tokenProfit.executeAdapterRequest( LIQUID_NFT_ROUTER_ADDRESS, abi.encodeWithSelector( ILiquidNFTsRouter.depositFunds.selector, _amount, _pool ) ); } /** * @dev Tells TokenProfit contract to withdraw funds from LiquidNFTs pool */ function _withdrawLiquidNFTsWrapper( ILiquidNFTsPool _pool, uint256 _amount ) internal { tokenProfit.executeAdapterRequest( LIQUID_NFT_ROUTER_ADDRESS, abi.encodeWithSelector( ILiquidNFTsRouter.withdrawFunds.selector, _calculateSharesFromAmount( _pool, _amount ), _pool ) ); } /** * @dev Routine used to deal with all services withdrawing USDC */ function _USDCRoutine( uint256 _amount ) internal returns (uint256) { uint256 balanceBefore = USDC.balanceOf( TOKEN_PROFIT_ADDRESS ); _withdrawLiquidNFTsWrapper( liquidNFTsUSDCPool, _amount ); uint256 balanceAfter = USDC.balanceOf( TOKEN_PROFIT_ADDRESS ); return balanceAfter - balanceBefore; } /** * @dev Routine used to deal with all services withdrawing ETH */ function _WETHRoutine( uint256 _amount ) internal returns (uint256) { _withdrawLiquidNFTsWrapper( liquidNFTsWETHPool, _amount ); uint256 balance = WETH.balanceOf( TOKEN_PROFIT_ADDRESS ); _unwrapETH( balance ); return balance; } /** * @dev Returns balances of TokenProfit contract - tokens and ETH */ function _getAvailableFunds() internal view returns ( uint256, uint256[] memory ) { uint256[] memory availableTokens = new uint256[](TOKENS); for (uint256 i = 0; i < TOKENS; i++) { IERC20 token = tokens[i].tokenERC20; availableTokens[i] = token.balanceOf( TOKEN_PROFIT_ADDRESS ); } uint256 availableEther = TOKEN_PROFIT_ADDRESS.balance; return ( availableEther, availableTokens ); } /** * @dev Returns balances locked in servcies based on token */ function _getReservesByToken( IERC20 _token ) internal view returns (uint256) { if (_token == USDC) { return _calculateAmountFromShares( liquidNFTsUSDCPool, TOKEN_PROFIT_ADDRESS ); } return 0; } /** * @dev Helper function to calculate shares from amount for LiquidNFTs pool */ function _calculateSharesFromAmount( ILiquidNFTsPool _pool, uint256 _amount ) internal view returns (uint256) { return _amountSharesCalculationWrapper( _pool.totalInternalShares(), _pool.pseudoTotalTokensHeld(), _amount ); } /** * @dev Helper function to calculate amount from shares for LiquidNFTs pool */ function _calculateAmountFromShares( ILiquidNFTsPool _pool, address _sharesHolder ) internal view returns (uint256) { return _amountSharesCalculationWrapper( _pool.pseudoTotalTokensHeld(), _pool.totalInternalShares(), _pool.internalShares( _sharesHolder ) ); } /** * @dev Calculates ratios based on shares and amount */ function _amountSharesCalculationWrapper( uint256 _totalValue, uint256 _correspondingTotalValue, uint256 _amountValue ) internal pure returns (uint256) { return _totalValue * _amountValue / _correspondingTotalValue; } }
// SPDX-License-Identifier: --DAO-- /** * @author René Hochmuth * @author Vitally Marinchenko */ pragma solidity =0.8.19; import "./IERC20.sol"; interface IChainLink { function decimals() external view returns (uint8); function latestAnswer() external view returns (uint256); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answerdInRound ); function getRoundData( uint80 _roundId ) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function phaseId() external view returns( uint16 phaseId ); function aggregator() external view returns (address); function description() external view returns (string memory); } interface ITokenProfit { function getAvailableMint() external view returns (uint256); function executeAdapterRequest( address _contractToCall, bytes memory _callBytes ) external returns (bytes memory); function executeAdapterRequestWithValue( address _contractToCall, bytes memory _callBytes, uint256 _value ) external returns (bytes memory); function totalSupply() external view returns (uint256); } interface ILiquidNFTsRouter { function depositFunds( uint256 _amount, address _pool ) external; function withdrawFunds( uint256 _amount, address _pool ) external; } interface ILiquidNFTsPool { function pseudoTotalTokensHeld() external view returns (uint256); function totalInternalShares() external view returns (uint256); function manualSyncPool() external; function internalShares( address _user ) external view returns (uint256); function poolToken() external view returns (address); function chainLinkETH() external view returns (address); } interface IUniswapV2 { function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); } interface IWETH is IERC20 { function deposit() payable external; function withdraw( uint256 _amount ) external; }
// SPDX-License-Identifier: --DAO-- /** * @author René Hochmuth * @author Vitally Marinchenko */ pragma solidity =0.8.19; interface IERC20 { function transfer( address _to, uint256 _amount ) external; function transferFrom( address _from, address _to, uint256 _amount ) external; function balanceOf( address _account ) external view returns (uint256); function approve( address _spender, uint256 _amount ) external; function allowance( address _user, address _spender ) external view returns (uint256); function decimals() external view returns (uint8); function symbol() external view returns (string memory); }
// SPDX-License-Identifier: --DAO-- /** * @author René Hochmuth * @author Vitally Marinchenko */ pragma solidity =0.8.19; import "./IERC20.sol"; contract TokenBase { string public constant name = "WISEr Token"; string public constant symbol = "WISEr"; uint8 public constant decimals = 18; address constant ZERO_ADDRESS = address(0); uint256 constant UINT256_MAX = type(uint256).max; uint256 public totalSupply; uint256 public constant INITIAL_TOTAL_SUPPLY = 1E27; uint256 public constant MIN_ETH_AMOUNT = 1E5; mapping(address => uint256) public balanceOf; mapping(address => mapping(address => uint256)) public allowance; mapping(address => uint256) public nonces; bytes32 public immutable DOMAIN_SEPARATOR; bytes32 public constant PERMIT_TYPEHASH = keccak256( "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)" ); event Approval( address indexed owner, address indexed spender, uint256 value ); event Transfer( address indexed from, address indexed to, uint256 value ); event Received( address indexed from, uint256 indexed amount ); event SupplyPurchase( address indexed buyer, uint256 ethAmount, uint256 tokenAmountReceived, uint256 indexed appliedFee ); event RewardsRedeemed( uint256 _burnAmount, uint256[] tokenRedeemAmounts, uint256 etherRedeemAmount ); constructor() { DOMAIN_SEPARATOR = keccak256( abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(name)), keccak256(bytes("1")), block.chainid, address(this) ) ); } function _mint( address _to, uint256 _value ) internal { totalSupply = totalSupply + _value; unchecked { balanceOf[_to] = balanceOf[_to] + _value; } emit Transfer( ZERO_ADDRESS, _to, _value ); } function _burn( address _from, uint256 _value ) internal { unchecked { totalSupply = totalSupply - _value; } balanceOf[_from] = balanceOf[_from] - _value; emit Transfer( _from, ZERO_ADDRESS, _value ); } function _approve( address _owner, address _spender, uint256 _value ) private { allowance[_owner][_spender] = _value; emit Approval( _owner, _spender, _value ); } function _transfer( address _from, address _to, uint256 _value ) private { balanceOf[_from] = balanceOf[_from] - _value; unchecked { balanceOf[_to] = balanceOf[_to] + _value; } emit Transfer( _from, _to, _value ); } function approve( address _spender, uint256 _value ) external returns (bool) { _approve( msg.sender, _spender, _value ); return true; } function increaseAllowance( address _spender, uint256 _addedValue ) external returns (bool) { _approve( msg.sender, _spender, allowance[msg.sender][_spender] + _addedValue ); return true; } function decreaseAllowance( address _spender, uint256 _subtractedValue ) external returns (bool) { _approve( msg.sender, _spender, allowance[msg.sender][_spender] - _subtractedValue ); return true; } function transfer( address _to, uint256 _value ) external returns (bool) { _transfer( msg.sender, _to, _value ); return true; } function transferFrom( address _from, address _to, uint256 _value ) external returns (bool) { if (allowance[_from][msg.sender] != UINT256_MAX) { allowance[_from][msg.sender] -= _value; } _transfer( _from, _to, _value ); return true; } function permit( address _owner, address _spender, uint256 _value, uint256 _deadline, uint8 _v, bytes32 _r, bytes32 _s ) external { require( _deadline >= block.timestamp, "TokenBase: PERMIT_CALL_EXPIRED" ); bytes32 digest = keccak256( abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256( abi.encode( PERMIT_TYPEHASH, _owner, _spender, _value, nonces[_owner]++, _deadline ) ) ) ); if (uint256(_s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { revert("TokenBase: INVALID_SIGNATURE"); } address recoveredAddress = ecrecover( digest, _v, _r, _s ); require( recoveredAddress != ZERO_ADDRESS && recoveredAddress == _owner, "TokenBase: INVALID_SIGNATURE" ); _approve( _owner, _spender, _value ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_auctionContract","type":"address"},{"internalType":"address","name":"_uniV2RouterAddress","type":"address"},{"internalType":"address","name":"_liquidNFTsRouterAddress","type":"address"},{"internalType":"address","name":"_liquidNFTsWETHPool","type":"address"},{"internalType":"address","name":"_liquidNFTsUSDCPool","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ExecuteFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"provided","type":"uint256"},{"internalType":"uint256","name":"required","type":"uint256"}],"name":"InvalidAmount","type":"error"},{"inputs":[],"name":"Prevented","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_burnAmount","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"tokenRedeemAmounts","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"etherRedeemAmount","type":"uint256"}],"name":"RewardsRedeemed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"buyer","type":"address"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenAmountReceived","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"appliedFee","type":"uint256"}],"name":"SupplyPurchase","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INITIAL_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_ETH_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapter","outputs":[{"internalType":"contract Adapter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adapterContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auctionContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_desiredAmount","type":"uint256"}],"name":"buySupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdapterAddress","type":"address"}],"name":"changeAdapter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"bytes","name":"_callBytes","type":"bytes"}],"name":"executeAdapterRequest","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_callAddress","type":"address"},{"internalType":"bytes","name":"_callBytes","type":"bytes"},{"internalType":"uint256","name":"_callValue","type":"uint256"}],"name":"executeAdapterRequestWithValue","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"extraMintAllowed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableMint","outputs":[{"internalType":"uint256","name":"res","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentBuyFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_index","type":"uint8"}],"name":"getTotalTokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnAmount","type":"uint256"}],"name":"getUserRedeemAmounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"governanceContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_mintTo","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_deadline","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_burnAmount","type":"uint256"}],"name":"redeemRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_allow","type":"bool"}],"name":"setAllowMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c06040523480156200001157600080fd5b5060405162006361380380620063618339810160408190526200003491620001e6565b604080518082018252600b81526a2ba4a9a2b9102a37b5b2b760a91b6020918201528151808301835260018152603160f81b9082015281517f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f918101919091527f3a0c3e98fb25f9a2e60fdd32411f2afea6666615f51366d03c642b8378b8a73f918101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c001604051602081830303815290604052805190602001206080818152505030848484846040516200012190620001bb565b6001600160a01b0395861681529385166020850152918416604084015283166060830152909116608082015260a001604051809103906000f0801580156200016d573d6000803e3d6000fd5b50600480546001600160a01b039283166001600160a01b031991821681179092559690911660a052600580548716909117905550506006805490931633179092555050600260075562000256565b61407b80620022e683390190565b80516001600160a01b0381168114620001e157600080fd5b919050565b600080600080600060a08688031215620001ff57600080fd5b6200020a86620001c9565b94506200021a60208701620001c9565b93506200022a60408701620001c9565b92506200023a60608701620001c9565b91506200024a60808701620001c9565b90509295509295909350565b60805160a05161205c6200028a60003960008181610312015261131c01526000818161042a0152610e22015261205c6000f3fe6080604052600436106101f25760003560e01c80635e81078d1161010d578063b172b222116100a0578063d505accf1161006f578063d505accf14610674578063d9d62b3d14610694578063dd62ed3e146106a7578063e742806a146106df578063f52ac300146106ff57600080fd5b8063b172b222146105ef578063c04fcad81461060f578063c1e183f21461062f578063d1b06a2b1461064457600080fd5b806395d89b41116100dc57806395d89b411461055e578063a457c2d71461058f578063a9059cbb146105af578063ae0bcf2b146105cf57600080fd5b80635e81078d146104c257806370a08231146104e45780637ecebe0014610511578063933ea5581461053e57600080fd5b806330adf81f116101855780633950935111610154578063395093511461044c578063580cdcd61461046c5780635d007f86146104815780635e31a864146104a157600080fd5b806330adf81f1461038f578063313ce567146103c357806335f11cc2146103ea5780633644e5151461041857600080fd5b80630ab8afac116101c15780630ab8afac1461030057806318160ddd146103345780631faee62d1461035857806323b872dd1461036f57600080fd5b8063029ab66d1461022b57806303eadcfc1461026157806306fdde0314610299578063095ea7b3146102d057600080fd5b3661022657604051349033907f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587490600090a3005b600080fd5b34801561023757600080fd5b5061024b610246366004611a9b565b61071f565b6040516102589190611b44565b60405180910390f35b34801561026d57600080fd5b50600454610281906001600160a01b031681565b6040516001600160a01b039091168152602001610258565b3480156102a557600080fd5b5061024b6040518060400160405280600b81526020016a2ba4a9a2b9102a37b5b2b760a91b81525081565b3480156102dc57600080fd5b506102f06102eb366004611b5e565b61080c565b6040519015158152602001610258565b34801561030c57600080fd5b506102817f000000000000000000000000000000000000000000000000000000000000000081565b34801561034057600080fd5b5061034a60005481565b604051908152602001610258565b34801561036457600080fd5b5061034a620186a081565b34801561037b57600080fd5b506102f061038a366004611b8a565b610823565b34801561039b57600080fd5b5061034a7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156103cf57600080fd5b506103d8601281565b60405160ff9091168152602001610258565b3480156103f657600080fd5b5061040a610405366004611bcb565b61089d565b604051610258929190611c1f565b34801561042457600080fd5b5061034a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561045857600080fd5b506102f0610467366004611b5e565b610989565b34801561047857600080fd5b5061034a6109c5565b34801561048d57600080fd5b50600554610281906001600160a01b031681565b3480156104ad57600080fd5b506006546102f090600160a01b900460ff1681565b3480156104ce57600080fd5b506104e26104dd366004611c38565b610a01565b005b3480156104f057600080fd5b5061034a6104ff366004611c5a565b60016020526000908152604090205481565b34801561051d57600080fd5b5061034a61052c366004611c5a565b60036020526000908152604090205481565b34801561054a57600080fd5b5061034a610559366004611c86565b610a79565b34801561056a57600080fd5b5061024b604051806040016040528060058152602001642ba4a9a2b960d91b81525081565b34801561059b57600080fd5b506102f06105aa366004611b5e565b610b13565b3480156105bb57600080fd5b506102f06105ca366004611b5e565b610b4a565b3480156105db57600080fd5b506104e26105ea366004611c5a565b610b57565b3480156105fb57600080fd5b50600654610281906001600160a01b031681565b34801561061b57600080fd5b5061034a6b033b2e3c9fd0803ce800000081565b34801561063b57600080fd5b5061034a610bdd565b34801561065057600080fd5b5061066461065f366004611bcb565b610c56565b6040516102589493929190611ca3565b34801561068057600080fd5b506104e261068f366004611cdf565b610db6565b61034a6106a2366004611bcb565b611064565b3480156106b357600080fd5b5061034a6106c2366004611d50565b600260209081526000928352604080842090915290825290205481565b3480156106eb57600080fd5b506102f06106fa366004611b5e565b61130f565b34801561070b57600080fd5b5061024b61071a366004611d89565b611393565b6005546060906001600160a01b0316331461077c5760405162461bcd60e51b81526020600482015260186024820152772a37b5b2b7283937b334ba1d102727aa2fa0a220a82a22a960411b60448201526064015b60405180910390fd5b600080856001600160a01b031684866040516107989190611dd9565b60006040518083038185875af1925050503d80600081146107d5576040519150601f19603f3d011682016040523d82523d6000602084013e6107da565b606091505b5090925090508115156000036108035760405163d6bed87360e01b815260040160405180910390fd5b95945050505050565b6000610819338484611479565b5060015b92915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610888576001600160a01b038416600090815260026020908152604080832033845290915281208054849290610882908490611e0b565b90915550505b6108938484846114db565b5060019392505050565b6004805460408051634e6d7d1560e11b815290516000936060936001600160a01b031692639cdafa2a9281830192879282900301818387803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b5050505061090261155e565b60008060008061091187610c56565b93509350935093506109233388611588565b61092d838261160c565b610937848361186e565b507f5a902a6d1f9125eccbff7ebd4bbb9186a06b277d701c710db28f06e3ee13f6c087828460405161096b93929190611e1e565b60405180910390a1909450925050506109846002600755565b915091565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916108199185906109c0908690611e47565b611479565b60006b033b2e3c9fd0803ce800000060005411156109e35750600090565b6000546109fc906b033b2e3c9fd0803ce8000000611e0b565b905090565b6006546001600160a01b03163314610a5b5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204e4f545f474f5645524e414e434500000000006044820152606401610773565b60068054911515600160a01b0260ff60a01b19909216919091179055565b600480546040805163d73cc4df60e01b8152905160009384936001600160a01b03169263d73cc4df928183019286928290030181865afa158015610ac1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae99190810190611ecf565b5050915050808360ff1681518110610b0357610b03611f46565b6020026020010151915050919050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916108199185906109c0908690611e0b565b60006108193384846114db565b6006546001600160a01b03163314610bb15760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204e4f545f474f5645524e414e434500000000006044820152606401610773565b600580546001600160a01b039092166001600160a01b0319928316811790915560048054909216179055565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663470624026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc9190611f5c565b6000606060006060600080600080600460009054906101000a90046001600160a01b03166001600160a01b031663d73cc4df6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cb7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cdf9190810190611ecf565b82519397509195509350915060008167ffffffffffffffff811115610d0657610d066119e4565b604051908082528060200260200182016040528015610d2f578160200160208202803683370190505b50905060005b82811015610d9257610d638c878381518110610d5357610d53611f46565b6020026020010151600054611936565b828281518110610d7557610d75611f46565b602090810291909101015280610d8a81611f75565b915050610d35565b506000610da28c88600054611936565b949c939b5093995097509095505050505050565b42841015610e065760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e426173653a205045524d49545f43414c4c5f4558504952454400006044820152606401610773565b6001600160a01b038716600090815260036020526040812080547f0000000000000000000000000000000000000000000000000000000000000000917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9187610e7483611f75565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610eed92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115610f785760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e426173653a20494e56414c49445f5349474e4154555245000000006044820152606401610773565b6040805160008082526020820180845284905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015610fcc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906110025750886001600160a01b0316816001600160a01b0316145b61104e5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e426173653a20494e56414c49445f5349474e4154555245000000006044820152606401610773565b611059898989611479565b505050505050505050565b600061106e61155e565b600654600160a01b900460ff1615156001146110cc5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e50726f6669743a204d494e545f4e4f545f414c4c4f5745440000006044820152606401610773565b816110d56109c5565b10156111235760405162461bcd60e51b815260206004820152601860248201527f546f6b656e50726f6669743a204d494e545f43415050454400000000000000006044820152606401610773565b60048054604051630b5c70d960e01b81529182018490523460248301526000916001600160a01b0390911690630b5c70d990604401602060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190611f5c565b9050620186a081116111ed5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204d494e545f544f4f5f534d414c4c00000000006044820152606401610773565b80341015611217576040516307c83fcf60e41b815234600482015260248101829052604401610773565b611221338461196b565b336108fc61122f8334611e0b565b6040518115909202916000818181858888f19350505050158015611257573d6000803e3d6000fd5b506004805460408051632383120160e11b815290516001600160a01b039092169263470624029282820192602092908290030181865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190611f5c565b604080518381526020810186905233917f2869e578f7b8e64810d60630268382a3c1b1add426bf45318e5258b4359e58fc910160405180910390a3905061130a6002600755565b919050565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146113895760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a20494e56414c49445f4d494e54455200000000006044820152606401610773565b610819838361196b565b6005546060906001600160a01b031633146113eb5760405162461bcd60e51b81526020600482015260186024820152772a37b5b2b7283937b334ba1d102727aa2fa0a220a82a22a960411b6044820152606401610773565b600080846001600160a01b0316846040516114069190611dd9565b6000604051808303816000865af19150503d8060008114611443576040519150601f19603f3d011682016040523d82523d6000602084013e611448565b606091505b5090925090508115156000036114715760405163d6bed87360e01b815260040160405180910390fd5b949350505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152600160205260409020546114ff908290611e0b565b6001600160a01b0384811660008181526001602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016114ce565b60016007540361158157604051631cc33edd60e11b815260040160405180910390fd5b6001600755565b6000805482900381556001600160a01b0383168152600160205260409020546115b2908290611e0b565b6001600160a01b0383166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116009085815260200190565b60405180910390a35050565b60005b82518110156118695782818151811061162a5761162a611f46565b602002602001015182828151811061164457611644611f46565b602002602001015111156117535760045483516001600160a01b039091169063757acf3690839086908290811061167d5761167d611f46565b602002602001015185858151811061169757611697611f46565b60200260200101516116a99190611e0b565b6040516001600160e01b031960e085901b168152600481019290925260248201526044016020604051808303816000875af11580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190611f5c565b83828151811061172257611722611f46565b60200260200101516117349190611e47565b82828151811061174657611746611f46565b6020026020010181815250505b600480546040516327b2595f60e11b81529182018390526000916001600160a01b0390911690634f64b2be90602401608060405180830381865afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190611f8e565b5050509050806001600160a01b031663a9059cbb338585815181106117ea576117ea611f46565b60200260200101516040518363ffffffff1660e01b81526004016118239291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b15801561183d57600080fd5b505af1158015611851573d6000803e3d6000fd5b5050505050808061186190611f75565b91505061160f565b505050565b600082821115611901576004546001600160a01b03166307a7b8896118938585611e0b565b6040518263ffffffff1660e01b81526004016118b191815260200190565b6020604051808303816000875af11580156118d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f49190611f5c565b6118fe9084611e47565b91505b604051339083156108fc029084906000818181858888f1935050505015801561192e573d6000803e3d6000fd5b509092915050565b600081670de0b6b3a76400008461194d8288611fed565b6119579190611fed565b6119619190612004565b6114719190612004565b806000546119799190611e47565b60009081556001600160a01b038316808252600160209081526040808420805486019055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611600565b6001600160a01b03811681146119e157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611a2357611a236119e4565b604052919050565b600082601f830112611a3c57600080fd5b813567ffffffffffffffff811115611a5657611a566119e4565b611a69601f8201601f19166020016119fa565b818152846020838601011115611a7e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215611ab057600080fd5b8335611abb816119cc565b9250602084013567ffffffffffffffff811115611ad757600080fd5b611ae386828701611a2b565b925050604084013590509250925092565b60005b83811015611b0f578181015183820152602001611af7565b50506000910152565b60008151808452611b30816020860160208601611af4565b601f01601f19169290920160200192915050565b602081526000611b576020830184611b18565b9392505050565b60008060408385031215611b7157600080fd5b8235611b7c816119cc565b946020939093013593505050565b600080600060608486031215611b9f57600080fd5b8335611baa816119cc565b92506020840135611bba816119cc565b929592945050506040919091013590565b600060208284031215611bdd57600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611c1457815187529582019590820190600101611bf8565b509495945050505050565b8281526040602082015260006114716040830184611be4565b600060208284031215611c4a57600080fd5b81358015158114611b5757600080fd5b600060208284031215611c6c57600080fd5b8135611b57816119cc565b60ff811681146119e157600080fd5b600060208284031215611c9857600080fd5b8135611b5781611c77565b848152608060208201526000611cbc6080830186611be4565b8460408401528281036060840152611cd48185611be4565b979650505050505050565b600080600080600080600060e0888a031215611cfa57600080fd5b8735611d05816119cc565b96506020880135611d15816119cc565b955060408801359450606088013593506080880135611d3381611c77565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d6357600080fd5b8235611d6e816119cc565b91506020830135611d7e816119cc565b809150509250929050565b60008060408385031215611d9c57600080fd5b8235611da7816119cc565b9150602083013567ffffffffffffffff811115611dc357600080fd5b611dcf85828601611a2b565b9150509250929050565b60008251611deb818460208701611af4565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081d5761081d611df5565b838152606060208201526000611e376060830185611be4565b9050826040830152949350505050565b8082018082111561081d5761081d611df5565b600082601f830112611e6b57600080fd5b8151602067ffffffffffffffff821115611e8757611e876119e4565b8160051b611e968282016119fa565b9283528481018201928281019087851115611eb057600080fd5b83870192505b84831015611cd457825182529183019190830190611eb6565b60008060008060808587031215611ee557600080fd5b84519350602085015167ffffffffffffffff80821115611f0457600080fd5b611f1088838901611e5a565b9450604087015193506060870151915080821115611f2d57600080fd5b50611f3a87828801611e5a565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611f6e57600080fd5b5051919050565b600060018201611f8757611f87611df5565b5060010190565b60008060008060808587031215611fa457600080fd5b8451611faf816119cc565b6020860151909450611fc0816119cc565b6040860151909350611fd181611c77565b6060860151909250611fe281611c77565b939692955090935050565b808202811582820484141761081d5761081d611df5565b60008261202157634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220978cc000b826d0ac67f0b11a1a0fdda757af54541f8734ae74d610aa05c784b964736f6c634300081300336101c06040526103e86006553480156200001857600080fd5b506040516200407b3803806200407b8339810160408190526200003b9162000940565b6001600160a01b03808316610180528082166101a081905290841661014052604080516332f7ce0b60e21b8152905187928792879287928792909163cbdf382c916004808201926020929091908290030181865afa158015620000a2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000c89190620009b0565b6001600160a01b031660e0816001600160a01b031681525050610180516001600160a01b031663cbdf382c6040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000123573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001499190620009b0565b6001600160a01b0390811660c081905260e05190911660a0819052608091825260408051928301815290825273986b5e1e1755e3c2440e960477f25201b0a8bbd46020838101829052825163313ce56760e01b81528351929493840192859263313ce56792600480820193918290030181865afa158015620001cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001f59190620009d5565b60ff16815260200160a0516001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200023e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002649190620009d5565b60ff9081169091528151600080546001600160a01b039283166001600160a01b031990911617905560208301516001805460408601516060909601518516600160a81b0260ff60a81b1996909516600160a01b026001600160a81b031990911692909316919091179190911792909216179055620002e16200032d565b505050506001600160a01b03918216610160819052610100521661012052505060028054326001600160a01b031991821681179092556003805490911690911790555062000c78915050565b60005b60018110156200062c576000808260018110620003515762000351620009fa565b604080516080810182526002929092029290920180546001600160a01b039081168352600190910154908116602083015260ff600160a01b8204811693830193909352600160a81b900490911660608201819052909150600003620003c957604051630692acc560e51b815260040160405180910390fd5b806040015160ff16600003620003f257604051630692acc560e51b815260040160405180910390fd5b80516001600160a01b03166200041b5760405163c1ab6dc160e01b815260040160405180910390fd5b60208101516001600160a01b031662000447576040516301f86e1760e41b815260040160405180910390fd5b600081600001516001600160a01b03166395d89b416040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200048c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620004b6919081019062000a4c565b604051602001620004c8919062000b04565b6040516020818303038152906040529050600082602001516001600160a01b0316637284e4166040518163ffffffff1660e01b8152600401600060405180830381865afa1580156200051e573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405262000548919081019062000a4c565b9050806040516020016200055d919062000b30565b604051602081830303815290604052805190602001208260405160200162000586919062000b30565b6040516020818303038152906040528051906020012014620006035760405162461bcd60e51b815260206004820152602b60248201527f416461707465724465636c61726174696f6e733a20494e56414c49445f43484160448201526a125393125392d7d191515160aa1b60648201526084015b60405180910390fd5b602083015162000613906200062f565b5050508080620006239062000b64565b91505062000330565b50565b6200063a8162000656565b6001600160a01b03909116600090815260076020526040902055565b6000806200066483620007e8565b90506000620006738262000866565b90506002816001600160501b03161015620006d15760405162461bcd60e51b815260206004820152601a60248201527f4c6971756964526f757465723a20534d414c4c5f53414d504c450000000000006044820152606401620005fa565b6000846001600160a01b03166358303b106040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000712573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000738919062000b80565b90506000620007498683866200088a565b90506000808060015b866001600160501b0316816001600160501b03161015620007db576000620007878b8862000781858d62000ba6565b6200088a565b905062000795818762000bd0565b9450809550838510620007ac5784939250620007c5565b8285118015620007bb57508385105b15620007c5578492505b5080620007d28162000be6565b91505062000752565b5098975050505050505050565b600080826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156200082a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000850919062000c2f565b50506001600160401b0390921695945050505050565b600060326001600160501b0383161162000881578162000884565b60325b92915050565b6000806001600160a01b038516639a6fc8f569ffff0000000000000000604087901b166001600160501b038616176040516001600160e01b031960e084901b1681526001600160501b03909116600482015260240160a060405180830381865afa158015620008fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620007db919062000c2f565b80516001600160a01b03811681146200093b57600080fd5b919050565b600080600080600060a086880312156200095957600080fd5b620009648662000923565b9450620009746020870162000923565b9350620009846040870162000923565b9250620009946060870162000923565b9150620009a46080870162000923565b90509295509295909350565b600060208284031215620009c357600080fd5b620009ce8262000923565b9392505050565b600060208284031215620009e857600080fd5b815160ff81168114620009ce57600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60005b8381101562000a4357818101518382015260200162000a29565b50506000910152565b60006020828403121562000a5f57600080fd5b81516001600160401b038082111562000a7757600080fd5b818401915084601f83011262000a8c57600080fd5b81518181111562000aa15762000aa162000a10565b604051601f8201601f19908116603f0116810190838211818310171562000acc5762000acc62000a10565b8160405282815287602084870101111562000ae657600080fd5b62000af983602083016020880162000a26565b979650505050505050565b6000825162000b1881846020870162000a26565b650405e408aa8960d31b920191825250600601919050565b6000825162000b4481846020870162000a26565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b60006001820162000b795762000b7962000b4e565b5060010190565b60006020828403121562000b9357600080fd5b815161ffff81168114620009ce57600080fd5b6001600160501b0382811682821603908082111562000bc95762000bc962000b4e565b5092915050565b8181038181111562000884576200088462000b4e565b60006001600160501b038281166002600160501b0319810162000c0d5762000c0d62000b4e565b6001019392505050565b80516001600160501b03811681146200093b57600080fd5b600080600080600060a0868803121562000c4857600080fd5b62000c538662000c17565b9450602086015193506040860151925060608601519150620009a46080870162000c17565b60805160a05160c05160e05161010051610120516101405161016051610180516101a05161320662000e756000396000818161043901528181610865015281816114b9015281816119d7015281816122b8015261272901526000818161061901528181610a4a01528181610ec80152818161152c0152818161185b0152611b92015260008181610468015281816107550152818161101a01528181611157015281816116c901528181611ef70152818161203e015281816120f60152818161239a0152818161247001526128d501526000818161066701528181610fdb01528181611f1e015261211f01526000818161057e01528181610fb60152818161249f0152612904015260008181610361015281816106f301528181610de301528181610f040152818161187c01528181611bce01528181612219015281816122f4015281816124ca0152818161260e015281816126c00152818161274a01526129300152600081816105df015281816113240152818161138701528181611a4e0152611b2f01526000818161027e0152818161117e015281816112d0015281816113b101528181611aa201528181611b050152818161206b01526123c90152600081816104ee01528181610e22015281816122460152818161231f01526126ed0152600081816105b801528181610f300152611bf901526132066000f3fe608060405234801561001057600080fd5b50600436106102745760003560e01c806388d36be911610151578063c0f9acc5116100c3578063e0655fe511610087578063e0655fe514610689578063e63a391f1461069c578063eae07118146106a5578063ef3bedb5146106b8578063f851a440146106c0578063fc02d304146106d357600080fd5b8063c0f9acc514610601578063c65528b414610614578063ccd34cd51461063b578063d73cc4df1461064a578063dac7b7ce1461066257600080fd5b8063a1b6124811610115578063a1b6124814610553578063a637674614610566578063aaead34e14610579578063ab46b347146105a0578063ad5c4648146105b3578063bb09d9b7146105da57600080fd5b806388d36be9146104c157806389a30271146104e9578063919a75001461051057806394288264146105385780639cdafa2a1461054b57600080fd5b80634783c35b116101ea57806365a01062116101ae57806365a010621461045b57806371ffd46a14610463578063757acf361461048a578063804bff751461049d578063841d7a19146104a65780638757b15b146104b957600080fd5b80634783c35b146103a75780634f64b2be146103ba5780634f7f41ee1461040157806358774385146104215780635e27714a1461043457600080fd5b8063231bd0621161023c578063231bd0621461031e578063257e0039146103495780632dbd974c1461035c57806332f751ec14610383578063427ef62914610396578063470624021461039e57600080fd5b8063040141e51461027957806307a7b889146102bd5780630b5c70d9146102de5780631919c1fd146102f15780632049895514610306575b600080fd5b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6102d06102cb366004612a8c565b6106e6565b6040519081526020016102b4565b6102d06102ec366004612aa5565b610748565b6103046102ff366004612a8c565b610836565b005b61030e61088d565b60405190151581526020016102b4565b61033161032c366004612adc565b610996565b6040516001600160501b0390911681526020016102b4565b610304610357366004612a8c565b610a12565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6005546102a0906001600160a01b031681565b610304610a6f565b6102d060065481565b6003546102a0906001600160a01b031681565b6103cd6103c8366004612a8c565b610b49565b604080516001600160a01b03958616815294909316602085015260ff918216928401929092521660608201526080016102b4565b6102d061040f366004612adc565b60076020526000908152604090205481565b6102d061042f366004612adc565b610b8d565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b610304610d06565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6102d0610498366004612aa5565b610dd6565b6102d061c35081565b6103046104b4366004612a8c565b610e99565b610304610fa2565b6103316104cf366004612b1e565b6001600160501b031660409190911b61ffff60401b161790565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b61052361051e366004612aa5565b61127e565b604080519283526020830191909152016102b4565b610304610546366004612adc565b611492565b6103046114b7565b6004546102a0906001600160a01b031681565b610304610574366004612adc565b61159f565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6103046105ae366004612adc565b61162b565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6102d061060f366004612a8c565b6116af565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b6102d0670de0b6b3a764000081565b610652611771565b6040516102b49493929190612b92565b6102a07f000000000000000000000000000000000000000000000000000000000000000081565b610304610697366004612a8c565b6118b5565b6102d061271081565b6103046106b3366004612a8c565b6119a8565b6102d0600a81565b6002546102a0906001600160a01b031681565b6105236106e1366004612aa5565b6119fc565b6000336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107395760405162461bcd60e51b815260040161073090612bce565b60405180910390fd5b61074282611b8b565b92915050565b6000670de0b6b3a76400007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107d59190612c13565b6127106107e0611c71565b670de0b6b3a7640000876107f388611c88565b6107fd9190612c42565b6108079190612c42565b6108119190612c42565b61081b9190612c59565b6108259190612c59565b61082f9190612c59565b9392505050565b6002546001600160a01b031633146108605760405162461bcd60e51b815260040161073090612c7b565b61088a7f000000000000000000000000000000000000000000000000000000000000000082611eed565b50565b6000805b600181101561098e5760008082600181106108ae576108ae612cb2565b6002020160010160009054906101000a90046001600160a01b031690506000816001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa15801561090b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061092f9190612cc8565b509350505050804211610942574261094c565b61094c8142612d20565b6001600160a01b038316600090815260076020526040902054909150811115610979576001935050505090565b5050808061098690612d33565b915050610891565b506000905090565b600080826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156109d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fb9190612cc8565b505067ffffffffffffffff90921695945050505050565b6002546001600160a01b03163314610a3c5760405162461bcd60e51b815260040161073090612c7b565b610a4581611fff565b61088a7f0000000000000000000000000000000000000000000000000000000000000000826120da565b6004546001600160a01b03163314610adc5760405162461bcd60e51b815260206004820152602a60248201527f416461707465724465636c61726174696f6e733a204e4f545f50524f504f5345604482015269445f4d554c544953494760b01b6064820152608401610730565b60038054600480546001600160a01b038082166001600160a01b0319808616821790965594909116909155604080519190921680825260208201939093527f6e1b23f37b65392903dc0c75cb46db326cf736173865d9ce52cca96a993a92e891015b60405180910390a150565b60008160018110610b5957600080fd5b6002020180546001909101546001600160a01b0391821692509081169060ff600160a01b8204811691600160a81b90041684565b600080610b9983610996565b90506000610ba682612150565b90506002816001600160501b03161015610c025760405162461bcd60e51b815260206004820152601a60248201527f4c6971756964526f757465723a20534d414c4c5f53414d504c450000000000006044820152606401610730565b6000846001600160a01b03166358303b106040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c669190612d4c565b90506000610c75868386612171565b90506000808060015b866001600160501b0316816001600160501b03161015610cf9576000610cae8b88610ca9858d612d69565b612171565b9050610cba8187612d20565b9450809550838510610ccf5784939250610ce6565b8285118015610cdd57508385105b15610ce6578492505b5080610cf181612d90565b915050610c7e565b5098975050505050505050565b6005546001600160a01b03163314610d705760405162461bcd60e51b815260206004820152602760248201527f416461707465724465636c61726174696f6e733a204e4f545f50524f504f5345604482015266222fa0a226a4a760c91b6064820152608401610730565b60028054600580546001600160a01b038082166001600160a01b0319808616821790965594909116909155604080519190921680825260208201939093527f6cf401c525bbb229f303f40902b2c97709f14c4ca45aee3365be1c04466c129a9101610b3e565b6000336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e205760405162461bcd60e51b815260040161073090612bce565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660008460018110610e5d57610e5d612cb2565b60020201546001600160a01b031603610e8057610e7982612202565b9050610742565b60405163c1ab6dc160e01b815260040160405180910390fd5b6002546001600160a01b03163314610ec35760405162461bcd60e51b815260040161073090612c7b565b610eed7f000000000000000000000000000000000000000000000000000000000000000082611eed565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015261088a917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610f79573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f9d9190612c13565b612398565b604080518082019091526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811682527f000000000000000000000000000000000000000000000000000000000000000016602082015260005b600281101561127a5760005b600181101561114c577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52ac3006000836001811061105a5761105a612cb2565b600290810291909101546001600160a01b03169063095ea7b360e01b9087908790811061108957611089612cb2565b60200201516040516001600160a01b039091166024820152600019604482015260640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526110f29291600401612e06565b6000604051808303816000875af1158015611111573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526111399190810190612e71565b508061114481612d33565b91505061100f565b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663f52ac3007f000000000000000000000000000000000000000000000000000000000000000063095ea7b360e01b8585600281106111b7576111b7612cb2565b60200201516040516001600160a01b039091166024820152600019604482015260640160408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526112209291600401612e06565b6000604051808303816000875af115801561123f573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526112679190810190612e71565b508061127281612d33565b915050611003565b5050565b60035460009081906001600160a01b031633146112ad5760405162461bcd60e51b815260040161073090612f05565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000008160008151811061130257611302612cb2565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061135657611356612cb2565b60200260200101906001600160a01b031690816001600160a01b0316815250506000611383828787612449565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f04e47bde7996bb3976c4b3a96e80b6bcbe3001f75c44286c5ea634f9d22638138360008151811061140d5761140d612cb2565b60200260200101518460018151811061142857611428612cb2565b6020026020010151604051611447929190918252602082015260400190565b60405180910390a38060008151811061146257611462612cb2565b60200260200101518160018151811061147d5761147d612cb2565b60200260200101519350935050509250929050565b61149b81610b8d565b6001600160a01b03909116600090815260076020526040902055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634cfb7ab96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561151257600080fd5b505af1158015611526573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634cfb7ab96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561158557600080fd5b505af1158015611599573d6000803e3d6000fd5b50505050565b6003546001600160a01b031633146115c95760405162461bcd60e51b815260040161073090612f05565b600580546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f1c6cf03398cc53293ba2b35b0f46785933143d9386795d264dc2356b6f78581791015b60405180910390a15050565b6003546001600160a01b031633146116555760405162461bcd60e51b815260040161073090612f05565b600480546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f246a0384eab2163c3ed990a1968a95226a1e168862b57b3cb6f759a024e7dfcc910161161f565b60006116bb6000611c88565b6116c3611c71565b612710847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611725573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117499190612c13565b6117539190612c42565b61175d9190612c42565b6117679190612c59565b6107429190612c59565b6040805160018082528183019092526000916060918391839183916020808301908036833750506040805160018082528183019092529293506000929150602080830190803683370190505090506117c76125ab565b909450905060005b6001811015611854578181815181106117ea576117ea612cb2565b602002602001015161181b6000836001811061180857611808612cb2565b60020201546001600160a01b03166126e9565b6118259190612f46565b83828151811061183757611837612cb2565b60209081029190910101528061184c81612d33565b9150506117cf565b50836118a07f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612776565b6118aa9190612f46565b969195509293509050565b6003546001600160a01b031633146118df5760405162461bcd60e51b815260040161073090612f05565b8061c350116119285760405162461bcd60e51b8152602060048201526015602482015274082c8c2e0e8cae474408c8a8abea89e9ebe90928e9605b1b6044820152606401610730565b600a811161196f5760405162461bcd60e51b8152602060048201526014602482015273416461707465723a204645455f544f4f5f4c4f5760601b6044820152606401610730565b6006805490829055604051829082907f26514ee1bed536218b4838232e0c5b32f4d71470a74865380caad452458f91e390600090a35050565b6002546001600160a01b031633146119d25760405162461bcd60e51b815260040161073090612c7b565b61088a7f0000000000000000000000000000000000000000000000000000000000000000826120da565b60035460009081906001600160a01b03163314611a2b5760405162461bcd60e51b815260040161073090612f05565b6040805160028082526060820183526000926020830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110611a8057611a80612cb2565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110611ad457611ad4612cb2565b60200260200101906001600160a01b031690816001600160a01b0316815250506000611b018287876128ae565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f04e47bde7996bb3976c4b3a96e80b6bcbe3001f75c44286c5ea634f9d22638138360008151811061140d5761140d612cb2565b6000611bb77f000000000000000000000000000000000000000000000000000000000000000083611eed565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015611c42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c669190612c13565b905061074281612398565b6000600654612710611c839190612f46565b905090565b6000611c9261088d565b1515600103611cb457604051630b4eb78560e01b815260040160405180910390fd5b600080611cbf611771565b50509150915060005b6001811015611eda576000808260018110611ce557611ce5612cb2565b604080516080810182526002929092029290920180546001600160a01b039081168352600190910154908116602080840182905260ff600160a01b8404811685870152600160a81b909304909216606084015283516350d25bcd60e01b815293519294509260009284926350d25bcd92600480820193918290030181865afa158015611d75573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d999190612c13565b905060008111611deb5760405162461bcd60e51b815260206004820181905260248201527f4164617074657248656c7065723a20434841494e4c494e4b5f4f46464c494e456044820152606401610730565b6040830151611dfb90600a61303d565b6060840151611e0b90600a61303d565b868681518110611e1d57611e1d612cb2565b6020026020010151670de0b6b3a7640000856001600160a01b03166350d25bcd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611e6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e909190612c13565b611e9a9190612c42565b611ea49190612c42565b611eae9190612c59565b611eb89190612c59565b611ec29087612f46565b95505050508080611ed290612d33565b915050611cc8565b50611ee58483612d20565b949350505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663f52ac3007f000000000000000000000000000000000000000000000000000000000000000063744bfe6160e01b611f4f86866129aa565b60405160248101919091526001600160a01b03871660448201526064015b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b9092168252611fb39291600401612e06565b6000604051808303816000875af1158015611fd2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611ffa9190810190612e71565b505050565b6040805160048082526024820183526020820180516001600160e01b0316630d0e30db60e41b179052915163029ab66d60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169263029ab66d92612093927f00000000000000000000000000000000000000000000000000000000000000009287910161304c565b6000604051808303816000875af11580156120b2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261127a9190810190612e71565b604051602481018290526001600160a01b0383811660448301527f0000000000000000000000000000000000000000000000000000000000000000169063f52ac300907f00000000000000000000000000000000000000000000000000000000000000009063f785de2360e01b90606401611f6d565b600060326001600160501b038316116121695781610742565b603292915050565b6000806001600160a01b038516639a6fc8f561ffff60401b604087901b166001600160501b038616176040516001600160e01b031960e084901b1681526001600160501b03909116600482015260240160a060405180830381865afa1580156121de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cf99190612cc8565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa15801561228d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122b19190612c13565b90506122dd7f000000000000000000000000000000000000000000000000000000000000000084611eed565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015612368573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061238c9190612c13565b9050611ee58282612d20565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52ac3007f0000000000000000000000000000000000000000000000000000000000000000632e1a7d4d60e01b8460405160240161240391815260200190565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526120939291600401612e06565b60608160000361246c57604051633c01925b60e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663029ab66d7f0000000000000000000000000000000000000000000000000000000000000000637ff36ab560e01b86897f0000000000000000000000000000000000000000000000000000000000000000426040516024016124fd94939291906130b9565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526125459291899060040161304c565b6000604051808303816000875af1158015612564573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261258c9190810190612e71565b9050808060200190518101906125a291906130ee565b95945050505050565b60408051600180825281830190925260009160609183916020808301908036833701905050905060005b60018110156126b55760008082600181106125f2576125f2612cb2565b60020201546040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152909116915081906370a0823190602401602060405180830381865afa158015612661573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126859190612c13565b83838151811061269757612697612cb2565b602090810291909101015250806126ad81612d33565b9150506125d5565b506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001631939092509050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03160361276e576107427f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000612776565b506000919050565b600061082f836001600160a01b0316630ff544db6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127b9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127dd9190612c13565b846001600160a01b03166379a401c36040518163ffffffff1660e01b8152600401602060405180830381865afa15801561281b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061283f9190612c13565b60405163c8aafc8360e01b81526001600160a01b03868116600483015287169063c8aafc8390602401602060405180830381865afa158015612885573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128a99190612c13565b612a75565b6060816000036128d157604051633c01925b60e01b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f52ac3007f00000000000000000000000000000000000000000000000000000000000000006318cbafe560e01b87878a7f000000000000000000000000000000000000000000000000000000000000000042604051602401612964959493929190613194565b60408051601f198184030181529181526020820180516001600160e01b03166001600160e01b03199485161790525160e085901b90921682526125459291600401612e06565b600061082f836001600160a01b03166379a401c36040518163ffffffff1660e01b8152600401602060405180830381865afa1580156129ed573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a119190612c13565b846001600160a01b0316630ff544db6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a4f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a739190612c13565b845b600082612a828386612c42565b611ee59190612c59565b600060208284031215612a9e57600080fd5b5035919050565b60008060408385031215612ab857600080fd5b50508035926020909101359150565b6001600160a01b038116811461088a57600080fd5b600060208284031215612aee57600080fd5b813561082f81612ac7565b61ffff8116811461088a57600080fd5b6001600160501b038116811461088a57600080fd5b60008060408385031215612b3157600080fd5b8235612b3c81612af9565b91506020830135612b4c81612b09565b809150509250929050565b600081518084526020808501945080840160005b83811015612b8757815187529582019590820190600101612b6b565b509495945050505050565b848152608060208201526000612bab6080830186612b57565b8460408401528281036060840152612bc38185612b57565b979650505050505050565b60208082526025908201527f416461707465724465636c61726174696f6e733a204e4f545f544f4b454e5f506040820152641493d1925560da1b606082015260800190565b600060208284031215612c2557600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b808202811582820484141761074257610742612c2c565b600082612c7657634e487b7160e01b600052601260045260246000fd5b500490565b6020808252601e908201527f416461707465724465636c61726174696f6e733a204e4f545f41444d494e0000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600080600080600060a08688031215612ce057600080fd5b8551612ceb81612b09565b809550506020860151935060408601519250606086015191506080860151612d1281612b09565b809150509295509295909350565b8181038181111561074257610742612c2c565b600060018201612d4557612d45612c2c565b5060010190565b600060208284031215612d5e57600080fd5b815161082f81612af9565b6001600160501b03828116828216039080821115612d8957612d89612c2c565b5092915050565b60006001600160501b03808316818103612dac57612dac612c2c565b6001019392505050565b60005b83811015612dd1578181015183820152602001612db9565b50506000910152565b60008151808452612df2816020860160208601612db6565b601f01601f19169290920160200192915050565b6001600160a01b0383168152604060208201819052600090611ee590830184612dda565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612e6957612e69612e2a565b604052919050565b600060208284031215612e8357600080fd5b815167ffffffffffffffff80821115612e9b57600080fd5b818401915084601f830112612eaf57600080fd5b815181811115612ec157612ec1612e2a565b612ed4601f8201601f1916602001612e40565b9150808252856020828501011115612eeb57600080fd5b612efc816020840160208601612db6565b50949350505050565b60208082526021908201527f416461707465724465636c61726174696f6e733a204e4f545f4d554c544953496040820152604760f81b606082015260800190565b8082018082111561074257610742612c2c565b600181815b80851115612f94578160001904821115612f7a57612f7a612c2c565b80851615612f8757918102915b93841c9390800290612f5e565b509250929050565b600082612fab57506001610742565b81612fb857506000610742565b8160018114612fce5760028114612fd857612ff4565b6001915050610742565b60ff841115612fe957612fe9612c2c565b50506001821b610742565b5060208310610133831016604e8410600b8410161715613017575081810a610742565b6130218383612f59565b806000190482111561303557613035612c2c565b029392505050565b600061082f60ff841683612f9c565b6001600160a01b038416815260606020820181905260009061307090830185612dda565b9050826040830152949350505050565b600081518084526020808501945080840160005b83811015612b875781516001600160a01b031687529582019590820190600101613094565b8481526080602082015260006130d26080830186613080565b6001600160a01b03949094166040830152506060015292915050565b6000602080838503121561310157600080fd5b825167ffffffffffffffff8082111561311957600080fd5b818501915085601f83011261312d57600080fd5b81518181111561313f5761313f612e2a565b8060051b9150613150848301612e40565b818152918301840191848101908884111561316a57600080fd5b938501935b838510156131885784518252938501939085019061316f565b98975050505050505050565b85815284602082015260a0604082015260006131b360a0830186613080565b6001600160a01b039490941660608301525060800152939250505056fea2646970667358221220f29b1b285138562e9f818fe7a11fbb049dd0c266fba3fef31fcba7065a99e1ae64736f6c634300081300330000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b040000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000b4d2484ef7f91c8d4cd019460ccbc384c1c242970000000000000000000000003f302d860b27fb06c794ee0916abc1d3a362bf7e00000000000000000000000085162c81d0ef84b21230eb4bf3cab073b71f3c38
Deployed Bytecode
0x6080604052600436106101f25760003560e01c80635e81078d1161010d578063b172b222116100a0578063d505accf1161006f578063d505accf14610674578063d9d62b3d14610694578063dd62ed3e146106a7578063e742806a146106df578063f52ac300146106ff57600080fd5b8063b172b222146105ef578063c04fcad81461060f578063c1e183f21461062f578063d1b06a2b1461064457600080fd5b806395d89b41116100dc57806395d89b411461055e578063a457c2d71461058f578063a9059cbb146105af578063ae0bcf2b146105cf57600080fd5b80635e81078d146104c257806370a08231146104e45780637ecebe0014610511578063933ea5581461053e57600080fd5b806330adf81f116101855780633950935111610154578063395093511461044c578063580cdcd61461046c5780635d007f86146104815780635e31a864146104a157600080fd5b806330adf81f1461038f578063313ce567146103c357806335f11cc2146103ea5780633644e5151461041857600080fd5b80630ab8afac116101c15780630ab8afac1461030057806318160ddd146103345780631faee62d1461035857806323b872dd1461036f57600080fd5b8063029ab66d1461022b57806303eadcfc1461026157806306fdde0314610299578063095ea7b3146102d057600080fd5b3661022657604051349033907f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587490600090a3005b600080fd5b34801561023757600080fd5b5061024b610246366004611a9b565b61071f565b6040516102589190611b44565b60405180910390f35b34801561026d57600080fd5b50600454610281906001600160a01b031681565b6040516001600160a01b039091168152602001610258565b3480156102a557600080fd5b5061024b6040518060400160405280600b81526020016a2ba4a9a2b9102a37b5b2b760a91b81525081565b3480156102dc57600080fd5b506102f06102eb366004611b5e565b61080c565b6040519015158152602001610258565b34801561030c57600080fd5b506102817f0000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b0481565b34801561034057600080fd5b5061034a60005481565b604051908152602001610258565b34801561036457600080fd5b5061034a620186a081565b34801561037b57600080fd5b506102f061038a366004611b8a565b610823565b34801561039b57600080fd5b5061034a7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b3480156103cf57600080fd5b506103d8601281565b60405160ff9091168152602001610258565b3480156103f657600080fd5b5061040a610405366004611bcb565b61089d565b604051610258929190611c1f565b34801561042457600080fd5b5061034a7feb4a2d5cbae87d6bdc736b6f960e673f1885606782cf8a12231244941345dfb081565b34801561045857600080fd5b506102f0610467366004611b5e565b610989565b34801561047857600080fd5b5061034a6109c5565b34801561048d57600080fd5b50600554610281906001600160a01b031681565b3480156104ad57600080fd5b506006546102f090600160a01b900460ff1681565b3480156104ce57600080fd5b506104e26104dd366004611c38565b610a01565b005b3480156104f057600080fd5b5061034a6104ff366004611c5a565b60016020526000908152604090205481565b34801561051d57600080fd5b5061034a61052c366004611c5a565b60036020526000908152604090205481565b34801561054a57600080fd5b5061034a610559366004611c86565b610a79565b34801561056a57600080fd5b5061024b604051806040016040528060058152602001642ba4a9a2b960d91b81525081565b34801561059b57600080fd5b506102f06105aa366004611b5e565b610b13565b3480156105bb57600080fd5b506102f06105ca366004611b5e565b610b4a565b3480156105db57600080fd5b506104e26105ea366004611c5a565b610b57565b3480156105fb57600080fd5b50600654610281906001600160a01b031681565b34801561061b57600080fd5b5061034a6b033b2e3c9fd0803ce800000081565b34801561063b57600080fd5b5061034a610bdd565b34801561065057600080fd5b5061066461065f366004611bcb565b610c56565b6040516102589493929190611ca3565b34801561068057600080fd5b506104e261068f366004611cdf565b610db6565b61034a6106a2366004611bcb565b611064565b3480156106b357600080fd5b5061034a6106c2366004611d50565b600260209081526000928352604080842090915290825290205481565b3480156106eb57600080fd5b506102f06106fa366004611b5e565b61130f565b34801561070b57600080fd5b5061024b61071a366004611d89565b611393565b6005546060906001600160a01b0316331461077c5760405162461bcd60e51b81526020600482015260186024820152772a37b5b2b7283937b334ba1d102727aa2fa0a220a82a22a960411b60448201526064015b60405180910390fd5b600080856001600160a01b031684866040516107989190611dd9565b60006040518083038185875af1925050503d80600081146107d5576040519150601f19603f3d011682016040523d82523d6000602084013e6107da565b606091505b5090925090508115156000036108035760405163d6bed87360e01b815260040160405180910390fd5b95945050505050565b6000610819338484611479565b5060015b92915050565b6001600160a01b038316600090815260026020908152604080832033845290915281205460001914610888576001600160a01b038416600090815260026020908152604080832033845290915281208054849290610882908490611e0b565b90915550505b6108938484846114db565b5060019392505050565b6004805460408051634e6d7d1560e11b815290516000936060936001600160a01b031692639cdafa2a9281830192879282900301818387803b1580156108e257600080fd5b505af11580156108f6573d6000803e3d6000fd5b5050505061090261155e565b60008060008061091187610c56565b93509350935093506109233388611588565b61092d838261160c565b610937848361186e565b507f5a902a6d1f9125eccbff7ebd4bbb9186a06b277d701c710db28f06e3ee13f6c087828460405161096b93929190611e1e565b60405180910390a1909450925050506109846002600755565b915091565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916108199185906109c0908690611e47565b611479565b60006b033b2e3c9fd0803ce800000060005411156109e35750600090565b6000546109fc906b033b2e3c9fd0803ce8000000611e0b565b905090565b6006546001600160a01b03163314610a5b5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204e4f545f474f5645524e414e434500000000006044820152606401610773565b60068054911515600160a01b0260ff60a01b19909216919091179055565b600480546040805163d73cc4df60e01b8152905160009384936001600160a01b03169263d73cc4df928183019286928290030181865afa158015610ac1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610ae99190810190611ecf565b5050915050808360ff1681518110610b0357610b03611f46565b6020026020010151915050919050565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916108199185906109c0908690611e0b565b60006108193384846114db565b6006546001600160a01b03163314610bb15760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204e4f545f474f5645524e414e434500000000006044820152606401610773565b600580546001600160a01b039092166001600160a01b0319928316811790915560048054909216179055565b6000600460009054906101000a90046001600160a01b03166001600160a01b031663470624026040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c32573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109fc9190611f5c565b6000606060006060600080600080600460009054906101000a90046001600160a01b03166001600160a01b031663d73cc4df6040518163ffffffff1660e01b8152600401600060405180830381865afa158015610cb7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610cdf9190810190611ecf565b82519397509195509350915060008167ffffffffffffffff811115610d0657610d066119e4565b604051908082528060200260200182016040528015610d2f578160200160208202803683370190505b50905060005b82811015610d9257610d638c878381518110610d5357610d53611f46565b6020026020010151600054611936565b828281518110610d7557610d75611f46565b602090810291909101015280610d8a81611f75565b915050610d35565b506000610da28c88600054611936565b949c939b5093995097509095505050505050565b42841015610e065760405162461bcd60e51b815260206004820152601e60248201527f546f6b656e426173653a205045524d49545f43414c4c5f4558504952454400006044820152606401610773565b6001600160a01b038716600090815260036020526040812080547feb4a2d5cbae87d6bdc736b6f960e673f1885606782cf8a12231244941345dfb0917f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9918b918b918b9187610e7483611f75565b909155506040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810187905260e00160405160208183030381529060405280519060200120604051602001610eed92919061190160f01b81526002810192909252602282015260420190565b6040516020818303038152906040528051906020012090507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115610f785760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e426173653a20494e56414c49445f5349474e4154555245000000006044820152606401610773565b6040805160008082526020820180845284905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa158015610fcc573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116158015906110025750886001600160a01b0316816001600160a01b0316145b61104e5760405162461bcd60e51b815260206004820152601c60248201527f546f6b656e426173653a20494e56414c49445f5349474e4154555245000000006044820152606401610773565b611059898989611479565b505050505050505050565b600061106e61155e565b600654600160a01b900460ff1615156001146110cc5760405162461bcd60e51b815260206004820152601d60248201527f546f6b656e50726f6669743a204d494e545f4e4f545f414c4c4f5745440000006044820152606401610773565b816110d56109c5565b10156111235760405162461bcd60e51b815260206004820152601860248201527f546f6b656e50726f6669743a204d494e545f43415050454400000000000000006044820152606401610773565b60048054604051630b5c70d960e01b81529182018490523460248301526000916001600160a01b0390911690630b5c70d990604401602060405180830381865afa158015611175573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111999190611f5c565b9050620186a081116111ed5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a204d494e545f544f4f5f534d414c4c00000000006044820152606401610773565b80341015611217576040516307c83fcf60e41b815234600482015260248101829052604401610773565b611221338461196b565b336108fc61122f8334611e0b565b6040518115909202916000818181858888f19350505050158015611257573d6000803e3d6000fd5b506004805460408051632383120160e11b815290516001600160a01b039092169263470624029282820192602092908290030181865afa15801561129f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c39190611f5c565b604080518381526020810186905233917f2869e578f7b8e64810d60630268382a3c1b1add426bf45318e5258b4359e58fc910160405180910390a3905061130a6002600755565b919050565b6000336001600160a01b037f0000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b0416146113895760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e50726f6669743a20494e56414c49445f4d494e54455200000000006044820152606401610773565b610819838361196b565b6005546060906001600160a01b031633146113eb5760405162461bcd60e51b81526020600482015260186024820152772a37b5b2b7283937b334ba1d102727aa2fa0a220a82a22a960411b6044820152606401610773565b600080846001600160a01b0316846040516114069190611dd9565b6000604051808303816000865af19150503d8060008114611443576040519150601f19603f3d011682016040523d82523d6000602084013e611448565b606091505b5090925090508115156000036114715760405163d6bed87360e01b815260040160405180910390fd5b949350505050565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166000908152600160205260409020546114ff908290611e0b565b6001600160a01b0384811660008181526001602090815260408083209590955592861680825290849020805486019055925184815290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91016114ce565b60016007540361158157604051631cc33edd60e11b815260040160405180910390fd5b6001600755565b6000805482900381556001600160a01b0383168152600160205260409020546115b2908290611e0b565b6001600160a01b0383166000818152600160205260408082209390935591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906116009085815260200190565b60405180910390a35050565b60005b82518110156118695782818151811061162a5761162a611f46565b602002602001015182828151811061164457611644611f46565b602002602001015111156117535760045483516001600160a01b039091169063757acf3690839086908290811061167d5761167d611f46565b602002602001015185858151811061169757611697611f46565b60200260200101516116a99190611e0b565b6040516001600160e01b031960e085901b168152600481019290925260248201526044016020604051808303816000875af11580156116ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117109190611f5c565b83828151811061172257611722611f46565b60200260200101516117349190611e47565b82828151811061174657611746611f46565b6020026020010181815250505b600480546040516327b2595f60e11b81529182018390526000916001600160a01b0390911690634f64b2be90602401608060405180830381865afa15801561179f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c39190611f8e565b5050509050806001600160a01b031663a9059cbb338585815181106117ea576117ea611f46565b60200260200101516040518363ffffffff1660e01b81526004016118239291906001600160a01b03929092168252602082015260400190565b600060405180830381600087803b15801561183d57600080fd5b505af1158015611851573d6000803e3d6000fd5b5050505050808061186190611f75565b91505061160f565b505050565b600082821115611901576004546001600160a01b03166307a7b8896118938585611e0b565b6040518263ffffffff1660e01b81526004016118b191815260200190565b6020604051808303816000875af11580156118d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f49190611f5c565b6118fe9084611e47565b91505b604051339083156108fc029084906000818181858888f1935050505015801561192e573d6000803e3d6000fd5b509092915050565b600081670de0b6b3a76400008461194d8288611fed565b6119579190611fed565b6119619190612004565b6114719190612004565b806000546119799190611e47565b60009081556001600160a01b038316808252600160209081526040808420805486019055518481529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611600565b6001600160a01b03811681146119e157600080fd5b50565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611a2357611a236119e4565b604052919050565b600082601f830112611a3c57600080fd5b813567ffffffffffffffff811115611a5657611a566119e4565b611a69601f8201601f19166020016119fa565b818152846020838601011115611a7e57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215611ab057600080fd5b8335611abb816119cc565b9250602084013567ffffffffffffffff811115611ad757600080fd5b611ae386828701611a2b565b925050604084013590509250925092565b60005b83811015611b0f578181015183820152602001611af7565b50506000910152565b60008151808452611b30816020860160208601611af4565b601f01601f19169290920160200192915050565b602081526000611b576020830184611b18565b9392505050565b60008060408385031215611b7157600080fd5b8235611b7c816119cc565b946020939093013593505050565b600080600060608486031215611b9f57600080fd5b8335611baa816119cc565b92506020840135611bba816119cc565b929592945050506040919091013590565b600060208284031215611bdd57600080fd5b5035919050565b600081518084526020808501945080840160005b83811015611c1457815187529582019590820190600101611bf8565b509495945050505050565b8281526040602082015260006114716040830184611be4565b600060208284031215611c4a57600080fd5b81358015158114611b5757600080fd5b600060208284031215611c6c57600080fd5b8135611b57816119cc565b60ff811681146119e157600080fd5b600060208284031215611c9857600080fd5b8135611b5781611c77565b848152608060208201526000611cbc6080830186611be4565b8460408401528281036060840152611cd48185611be4565b979650505050505050565b600080600080600080600060e0888a031215611cfa57600080fd5b8735611d05816119cc565b96506020880135611d15816119cc565b955060408801359450606088013593506080880135611d3381611c77565b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611d6357600080fd5b8235611d6e816119cc565b91506020830135611d7e816119cc565b809150509250929050565b60008060408385031215611d9c57600080fd5b8235611da7816119cc565b9150602083013567ffffffffffffffff811115611dc357600080fd5b611dcf85828601611a2b565b9150509250929050565b60008251611deb818460208701611af4565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b8181038181111561081d5761081d611df5565b838152606060208201526000611e376060830185611be4565b9050826040830152949350505050565b8082018082111561081d5761081d611df5565b600082601f830112611e6b57600080fd5b8151602067ffffffffffffffff821115611e8757611e876119e4565b8160051b611e968282016119fa565b9283528481018201928281019087851115611eb057600080fd5b83870192505b84831015611cd457825182529183019190830190611eb6565b60008060008060808587031215611ee557600080fd5b84519350602085015167ffffffffffffffff80821115611f0457600080fd5b611f1088838901611e5a565b9450604087015193506060870151915080821115611f2d57600080fd5b50611f3a87828801611e5a565b91505092959194509250565b634e487b7160e01b600052603260045260246000fd5b600060208284031215611f6e57600080fd5b5051919050565b600060018201611f8757611f87611df5565b5060010190565b60008060008060808587031215611fa457600080fd5b8451611faf816119cc565b6020860151909450611fc0816119cc565b6040860151909350611fd181611c77565b6060860151909250611fe281611c77565b939692955090935050565b808202811582820484141761081d5761081d611df5565b60008261202157634e487b7160e01b600052601260045260246000fd5b50049056fea2646970667358221220978cc000b826d0ac67f0b11a1a0fdda757af54541f8734ae74d610aa05c784b964736f6c63430008130033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b040000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000b4d2484ef7f91c8d4cd019460ccbc384c1c242970000000000000000000000003f302d860b27fb06c794ee0916abc1d3a362bf7e00000000000000000000000085162c81d0ef84b21230eb4bf3cab073b71f3c38
-----Decoded View---------------
Arg [0] : _auctionContract (address): 0x4a24c1989E5dFF0DE40f5804b47623b6b4300b04
Arg [1] : _uniV2RouterAddress (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _liquidNFTsRouterAddress (address): 0xB4d2484EF7f91c8D4cd019460Ccbc384C1C24297
Arg [3] : _liquidNFTsWETHPool (address): 0x3f302D860b27FB06C794eE0916abC1D3A362Bf7e
Arg [4] : _liquidNFTsUSDCPool (address): 0x85162c81D0Ef84b21230eB4bf3cAb073B71F3c38
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000004a24c1989e5dff0de40f5804b47623b6b4300b04
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000b4d2484ef7f91c8d4cd019460ccbc384c1c24297
Arg [3] : 0000000000000000000000003f302d860b27fb06c794ee0916abc1d3a362bf7e
Arg [4] : 00000000000000000000000085162c81d0ef84b21230eb4bf3cab073b71f3c38
Deployed Bytecode Sourcemap
290:9937:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1485:65;;1531:9;;1507:10;;1485:65;;;;;290:9937;;;;;2759:479;;;;;;;;;;-1:-1:-1;2759:479:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;331:22;;;;;;;;;;-1:-1:-1;331:22:6;;;;-1:-1:-1;;;;;331:22:6;;;;;;-1:-1:-1;;;;;2556:32:7;;;2538:51;;2526:2;2511:18;331:22:6;2377:218:7;179:43:5;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;179:43:5;;;;;3258:240;;;;;;;;;;-1:-1:-1;3258:240:5;;;;;:::i;:::-;;:::i;:::-;;;3309:14:7;;3302:22;3284:41;;3272:2;3257:18;3258:240:5;3144:187:7;436:40:6;;;;;;;;;;;;;;;418:26:5;;;;;;;;;;;;;;;;;;;3690:25:7;;;3678:2;3663:18;418:26:5;3544:177:7;508:44:5;;;;;;;;;;;;549:3;508:44;;4352:376;;;;;;;;;;-1:-1:-1;4352:376:5;;;;;:::i;:::-;;:::i;774:151::-;;;;;;;;;;;;816:109;774:151;;273:35;;;;;;;;;;;;306:2;273:35;;;;;4541:4:7;4529:17;;;4511:36;;4499:2;4484:18;273:35:5;4369:184:7;4002:937:6;;;;;;;;;;-1:-1:-1;4002:937:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;727:41:5:-;;;;;;;;;;;;;;;3504:294;;;;;;;;;;-1:-1:-1;3504:294:5;;;;;:::i;:::-;;:::i;5012:242:6:-;;;;;;;;;;;;;:::i;360:30::-;;;;;;;;;;-1:-1:-1;360:30:6;;;;-1:-1:-1;;;;;360:30:6;;;529:28;;;;;;;;;;-1:-1:-1;529:28:6;;;;-1:-1:-1;;;529:28:6;;;;;;9891:135;;;;;;;;;;-1:-1:-1;9891:135:6;;;;;:::i;:::-;;:::i;:::-;;559:44:5;;;;;;;;;;-1:-1:-1;559:44:5;;;;;:::i;:::-;;;;;;;;;;;;;;679:41;;;;;;;;;;-1:-1:-1;679:41:5;;;;;:::i;:::-;;;;;;;;;;;;;;3630:282:6;;;;;;;;;;-1:-1:-1;3630:282:6;;;;;:::i;:::-;;:::i;228:39:5:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;228:39:5;;;;;3804:304;;;;;;;;;;-1:-1:-1;3804:304:5;;;;;:::i;:::-;;:::i;4114:232::-;;;;;;;;;;-1:-1:-1;4114:232:5;;;;;:::i;:::-;;:::i;3304::6:-;;;;;;;;;;-1:-1:-1;3304:232:6;;;;;:::i;:::-;;:::i;396:33::-;;;;;;;;;;-1:-1:-1;396:33:6;;;;-1:-1:-1;;;;;396:33:6;;;451:51:5;;;;;;;;;;;;498:4;451:51;;10097:128:6;;;;;;;;;;;;;:::i;5346:1060::-;;;;;;;;;;-1:-1:-1;5346:1060:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;4734:1327:5:-;;;;;;;;;;-1:-1:-1;4734:1327:5;;;;;:::i;:::-;;:::i;8707:1112:6:-;;;;;;:::i;:::-;;:::i;609:64:5:-;;;;;;;;;;-1:-1:-1;609:64:5;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;8227:338:6;;;;;;;;;;-1:-1:-1;8227:338:6;;;;;:::i;:::-;;:::i;2236:431::-;;;;;;;;;;-1:-1:-1;2236:431:6;;;;;:::i;:::-;;:::i;2759:479::-;1089:15;;2950:12;;-1:-1:-1;;;;;1089:15:6;1075:10;:29;1054:100;;;;-1:-1:-1;;;1054:100:6;;8892:2:7;1054:100:6;;;8874:21:7;8931:2;8911:18;;;8904:30;-1:-1:-1;;;8950:18:7;;;8943:54;9014:18;;1054:100:6;;;;;;;;;2992:12:::1;3018:23:::0;3054:12:::1;-1:-1:-1::0;;;;;3054:17:6::1;3079:10;3104;3054:70;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;2978:146:6;;-1:-1:-1;2978:146:6;-1:-1:-1;3139:16:6;::::1;;3150:5;3139:16:::0;3135:69:::1;;3178:15;;-1:-1:-1::0;;;3178:15:6::1;;;;;;;;;;;3135:69;3221:10:::0;2759:479;-1:-1:-1;;;;;2759:479:6:o;3258:240:5:-;3365:4;3385:84;3407:10;3431:8;3453:6;3385:8;:84::i;:::-;-1:-1:-1;3487:4:5;3258:240;;;;;:::o;4352:376::-;-1:-1:-1;;;;;4506:16:5;;4482:4;4506:16;;;:9;:16;;;;;;;;4523:10;4506:28;;;;;;;;-1:-1:-1;;4506:43:5;4502:112;;-1:-1:-1;;;;;4565:16:5;;;;;;:9;:16;;;;;;;;4582:10;4565:28;;;;;;;:38;;4597:6;;4565:16;:38;;4597:6;;4565:38;:::i;:::-;;;;-1:-1:-1;;4502:112:5;4624:75;4647:5;4666:3;4683:6;4624:9;:75::i;:::-;-1:-1:-1;4717:4:5;4352:376;;;;;:::o;4002:937:6:-;1377:7;;;:22;;;-1:-1:-1;;;1377:22:6;;;;4148:7;;4169:16;;-1:-1:-1;;;;;1377:7:6;;:20;;:22;;;;4148:7;;1377:22;;;;;4148:7;1377;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;691:20:::1;:18;:20::i;:::-;4224:22:::2;4260:32:::0;4306:25:::2;4345:35:::0;4393:55:::2;4427:11;4393:20;:55::i;:::-;4210:238;;;;;;;;4459:64;4478:10;4502:11;4459:5;:64::i;:::-;4534:85;4562:15;4591:18;4534:14;:85::i;:::-;4630:82;4657:14;4685:17;4630:13;:82::i;:::-;;4728:113;4757:11;4782:18;4814:17;4728:113;;;;;;;;:::i;:::-;;;;;;;;4873:17:::0;;-1:-1:-1;4904:18:6;-1:-1:-1;;;732:19:6::1;649:1:::0;988:6;:20;929:86;732:19:::1;4002:937:::0;;;:::o;3504:294:5:-;3668:10;3626:4;3714:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;3714:31:5;;;;;;;;;;3626:4;;3646:123;;3692:8;;3714:45;;3748:11;;3714:45;:::i;:::-;3646:8;:123::i;5012:242:6:-;5085:11;498:4:5;5116:11:6;;:34;5112:73;;;-1:-1:-1;5173:1:6;;5012:242::o;5112:73::-;5236:11;;5201:46;;498:4:5;5201:46:6;:::i;:::-;5195:52;;5012:242;:::o;9891:135::-;1249:18;;-1:-1:-1;;;;;1249:18:6;1235:10;:32;1214:106;;;;-1:-1:-1;;;1214:106:6;;10340:2:7;1214:106:6;;;10322:21:7;10379:2;10359:18;;;10352:30;10418:29;10398:18;;;10391:57;10465:18;;1214:106:6;10138:351:7;1214:106:6;9994:16:::1;:25:::0;;;::::1;;-1:-1:-1::0;;;9994:25:6::1;-1:-1:-1::0;;;;9994:25:6;;::::1;::::0;;;::::1;::::0;;9891:135::o;3630:282::-;3842:7;;;:25;;;-1:-1:-1;;;3842:25:6;;;;3734:7;;;;-1:-1:-1;;;;;3842:7:6;;:23;;:25;;;;3734:7;;3842:25;;;;;:7;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3842:25:6;;;;;;;;;;;;:::i;:::-;3757:110;;;;;3885:12;3898:6;3885:20;;;;;;;;;;:::i;:::-;;;;;;;3878:27;;;3630:282;;;:::o;3804:304:5:-;3973:10;3931:4;4019:21;;;:9;:21;;;;;;;;-1:-1:-1;;;;;4019:31:5;;;;;;;;;;3931:4;;3951:128;;3997:8;;4019:50;;4053:16;;4019:50;:::i;4114:232::-;4217:4;4237:80;4260:10;4284:3;4301:6;4237:9;:80::i;3304:232:6:-;1249:18;;-1:-1:-1;;;;;1249:18:6;1235:10;:32;1214:106;;;;-1:-1:-1;;;1214:106:6;;10340:2:7;1214:106:6;;;10322:21:7;10379:2;10359:18;;;10352:30;10418:29;10398:18;;;10391:57;10465:18;;1214:106:6;10138:351:7;1214:106:6;3423:15:::1;:36:::0;;-1:-1:-1;;;;;3423:36:6;;::::1;-1:-1:-1::0;;;;;;3423:36:6;;::::1;::::0;::::1;::::0;;;3470:7:::1;:59:::0;;;;::::1;;::::0;;3304:232::o;10097:128::-;10172:7;10202;;;;;;;;;-1:-1:-1;;;;;10202:7:6;-1:-1:-1;;;;;10202:14:6;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;5346:1060::-;5469:7;5490:16;5520:7;5541:16;5596:19;5629:29;5672:22;5708:32;5753:7;;;;;;;;;-1:-1:-1;;;;;5753:7:6;-1:-1:-1;;;;;5753:23:6;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5753:25:6;;;;;;;;;;;;:::i;:::-;5806:19;;5582:196;;-1:-1:-1;5582:196:6;;-1:-1:-1;5582:196:6;-1:-1:-1;5582:196:6;-1:-1:-1;5789:14:6;5806:19;5873:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5873:21:6;;5835:59;;5910:9;5905:207;5929:6;5925:1;:10;5905:207;;;5980:121;6014:11;6043:12;6056:1;6043:15;;;;;;;;:::i;:::-;;;;;;;6076:11;;5980:16;:121::i;:::-;5956:18;5975:1;5956:21;;;;;;;;:::i;:::-;;;;;;;;;;:145;5937:3;;;;:::i;:::-;;;;5905:207;;;;6122:25;6150:101;6180:11;6205;6230;;6150:16;:101::i;:::-;6283:14;;6311:15;;-1:-1:-1;6283:14:6;;-1:-1:-1;6122:129:6;-1:-1:-1;5346:1060:6;;-1:-1:-1;;;;;;5346:1060:6:o;4734:1327:5:-;4980:15;4967:9;:28;;4946:105;;;;-1:-1:-1;;;4946:105:5;;12613:2:7;4946:105:5;;;12595:21:7;12652:2;12632:18;;;12625:30;12691:32;12671:18;;;12664:60;12741:18;;4946:105:5;12411:354:7;4946:105:5;-1:-1:-1;;;;;5404:14:5;;5062;5404;;;:6;:14;;;;;:16;;5164;;816:109;;5306:6;;5338:8;;5372:6;;5062:14;5404:16;;;:::i;:::-;;;;-1:-1:-1;5229:248:5;;;;;;13057:25:7;;;;-1:-1:-1;;;;;13156:15:7;;;13136:18;;;13129:43;13208:15;;;;13188:18;;;13181:43;13240:18;;;13233:34;13283:19;;;13276:35;13327:19;;;13320:35;;;13029:19;;5229:248:5;;;;;;;;;;;;5198:297;;;;;;5102:407;;;;;;;;-1:-1:-1;;;13624:27:7;;13676:1;13667:11;;13660:27;;;;13712:2;13703:12;;13696:28;13749:2;13740:12;;13366:392;5102:407:5;;;;;;;;;;;;;5079:440;;;;;;5062:457;;5548:66;5542:2;5534:11;;:80;5530:149;;;5630:38;;-1:-1:-1;;;5630:38:5;;13965:2:7;5630:38:5;;;13947:21:7;14004:2;13984:18;;;13977:30;14043;14023:18;;;14016:58;14091:18;;5630:38:5;13763:352:7;5530:149:5;5716:87;;;5689:24;5716:87;;;;;;;;;14347:25:7;;;14420:4;14408:17;;14388:18;;;14381:45;;;;14442:18;;;14435:34;;;14485:18;;;14478:34;;;5716:87:5;;14319:19:7;;5716:87:5;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5716:87:5;;-1:-1:-1;;5716:87:5;;;-1:-1:-1;;;;;;;5835:32:5;;;;;;:74;;;5903:6;-1:-1:-1;;;;;5883:26:5;:16;-1:-1:-1;;;;;5883:26:5;;5835:74;5814:149;;;;-1:-1:-1;;;5814:149:5;;13965:2:7;5814:149:5;;;13947:21:7;14004:2;13984:18;;;13977:30;14043;14023:18;;;14016:58;14091:18;;5814:149:5;13763:352:7;5814:149:5;5974:80;5996:6;6016:8;6038:6;5974:8;:80::i;:::-;4936:1125;;4734:1327;;;;;;;:::o;8707:1112:6:-;8835:7;691:20;:18;:20::i;:::-;8879:16:::1;::::0;-1:-1:-1;;;8879:16:6;::::1;;;:24;;8899:4;8879:24;8858:100;;;::::0;-1:-1:-1;;;8858:100:6;;14725:2:7;8858:100:6::1;::::0;::::1;14707:21:7::0;14764:2;14744:18;;;14737:30;14803:31;14783:18;;;14776:59;14852:18;;8858:100:6::1;14523:353:7::0;8858:100:6::1;9012:14;8990:18;:16;:18::i;:::-;:36;;8969:107;;;::::0;-1:-1:-1;;;8969:107:6;;15083:2:7;8969:107:6::1;::::0;::::1;15065:21:7::0;15122:2;15102:18;;;15095:30;15161:26;15141:18;;;15134:54;15205:18;;8969:107:6::1;14881:348:7::0;8969:107:6::1;9109:7;::::0;;:96:::1;::::0;-1:-1:-1;;;9109:96:6;;;;::::1;15408:25:7::0;;;9186:9:6::1;15449:18:7::0;;;15442:34;9087:19:6::1;::::0;-1:-1:-1;;;;;9109:7:6;;::::1;::::0;:35:::1;::::0;15381:18:7;;9109:96:6::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9087:118;;549:3:5;9237:11:6;:28;9216:102;;;::::0;-1:-1:-1;;;9216:102:6;;15689:2:7;9216:102:6::1;::::0;::::1;15671:21:7::0;15728:2;15708:18;;;15701:30;15767:29;15747:18;;;15740:57;15814:18;;9216:102:6::1;15487:351:7::0;9216:102:6::1;9345:11;9333:9;:23;9329:144;;;9379:83;::::0;-1:-1:-1;;;9379:83:6;;9410:9:::1;9379:83;::::0;::::1;15408:25:7::0;15449:18;;;15442:34;;;15381:18;;9379:83:6::1;15234:248:7::0;9329:144:6::1;9483:67;9502:10;9526:14;9483:5;:67::i;:::-;9569:10;9561:75;9603:23;9615:11:::0;9603:9:::1;:23;:::i;:::-;9561:75;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;9757:7:6::1;::::0;;:16:::1;::::0;;-1:-1:-1;;;9757:16:6;;;;-1:-1:-1;;;;;9757:7:6;;::::1;::::0;:14:::1;::::0;:16;;::::1;::::0;::::1;::::0;;;;;;;:7;:16:::1;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9652:131;::::0;;15408:25:7;;;15464:2;15449:18;;15442:34;;;9680:10:6::1;::::0;9652:131:::1;::::0;15381:18:7;9652:131:6::1;;;;;;;9801:11:::0;-1:-1:-1;732:19:6;649:1;988:6;:20;929:86;732:19;8707:1112;;;:::o;8227:338::-;8341:4;8382:10;-1:-1:-1;;;;;8396:15:6;8382:29;;8361:103;;;;-1:-1:-1;;;8361:103:6;;16045:2:7;8361:103:6;;;16027:21:7;16084:2;16064:18;;;16057:30;16123:29;16103:18;;;16096:57;16170:18;;8361:103:6;15843:351:7;8361:103:6;8475:61;8494:7;8515:11;8475:5;:61::i;2236:431::-;1089:15;;2394:12;;-1:-1:-1;;;;;1089:15:6;1075:10;:29;1054:100;;;;-1:-1:-1;;;1054:100:6;;8892:2:7;1054:100:6;;;8874:21:7;8931:2;8911:18;;;8904:30;-1:-1:-1;;;8950:18:7;;;8943:54;9014:18;;1054:100:6;8690:348:7;1054:100:6;2436:12:::1;2462:23:::0;2498:16:::1;-1:-1:-1::0;;;;;2498:21:6::1;2533:10;2498:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;2422:131:6;;-1:-1:-1;2422:131:6;-1:-1:-1;2568:16:6;::::1;;2579:5;2568:16:::0;2564:69:::1;;2607:15;;-1:-1:-1::0;;;2607:15:6::1;;;;;;;;;;;2564:69;2650:10:::0;2236:431;-1:-1:-1;;;;2236:431:6:o;2610:267:5:-;-1:-1:-1;;;;;2738:17:5;;;;;;;:9;:17;;;;;;;;:27;;;;;;;;;;;;;:36;;;2790:80;;3690:25:7;;;2790:80:5;;3663:18:7;2790:80:5;;;;;;;;2610:267;;;:::o;2883:369::-;-1:-1:-1;;;;;3033:16:5;;;;;;:9;:16;;;;;;:25;;3052:6;;3033:25;:::i;:::-;-1:-1:-1;;;;;3006:16:5;;;;;;;:9;:16;;;;;;;;:52;;;;3122:14;;;;;;;;;;;;:23;;3093:52;;3171:74;;3690:25:7;;;3006:16:5;;3171:74;;3663:18:7;3171:74:5;3544:177:7;764:159:6;611:1;828:6;;:17;824:66;;868:11;;-1:-1:-1;;;868:11:6;;;;;;;;;;;824:66;611:1;900:6;:16;764:159::o;2256:348:5:-;2405:11;;;:20;;;2379:46;;-1:-1:-1;;;;;2473:16:5;;;;-1:-1:-1;2473:16:5;;;;;;:25;;2419:6;;2473:25;:::i;:::-;-1:-1:-1;;;;;2446:16:5;;;;;;:9;:16;;;;;;:52;;;;2514:83;;;;;;2581:6;3690:25:7;;3678:2;3663:18;;3544:177;2514:83:5;;;;;;;;2256:348;;:::o;6919:718:6:-;7063:9;7058:573;7082:10;:17;7078:1;:21;7058:573;;;7144:10;7155:1;7144:13;;;;;;;;:::i;:::-;;;;;;;7124:14;7139:1;7124:17;;;;;;;;:::i;:::-;;;;;;;:33;7120:232;;;7213:7;;7306:13;;-1:-1:-1;;;;;7213:7:6;;;;:28;;7263:1;;7306:10;;7263:1;;7306:13;;;;;;:::i;:::-;;;;;;;7286:14;7301:1;7286:17;;;;;;;;:::i;:::-;;;;;;;:33;;;;:::i;:::-;7213:124;;-1:-1:-1;;;;;;7213:124:6;;;;;;;;;;15408:25:7;;;;15449:18;;;15442:34;15381:18;;7213:124:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7197:10;7208:1;7197:13;;;;;;;;:::i;:::-;;;;;;;:140;;;;:::i;:::-;7177:14;7192:1;7177:17;;;;;;;;:::i;:::-;;;;;;:160;;;;;7120:232;7467:7;;;:47;;-1:-1:-1;;;7467:47:6;;;;;3690:25:7;;;7384:12:6;;-1:-1:-1;;;;;7467:7:6;;;;:14;;3663:18:7;;7467:47:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7366:148;;;;;7529:5;-1:-1:-1;;;;;7529:14:6;;7561:10;7589:14;7604:1;7589:17;;;;;;;;:::i;:::-;;;;;;;7529:91;;;;;;;;;;;;;;;-1:-1:-1;;;;;17076:32:7;;;;17058:51;;17140:2;17125:18;;17118:34;17046:2;17031:18;;16884:274;7529:91:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7106:525;7101:3;;;;;:::i;:::-;;;;7058:573;;;;6919:718;;:::o;7714:427::-;7836:7;7879:10;7863:13;:26;7859:169;;;7934:7;;-1:-1:-1;;;;;7934:7:6;:25;7977:26;7993:10;7977:13;:26;:::i;:::-;7934:83;;;;;;;;;;;;;3690:25:7;;3678:2;3663:18;;3544:177;7934:83:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7921:96;;:10;:96;:::i;:::-;7905:112;;7859:169;8038:65;;8046:10;;8038:65;;;;;8080:13;;8038:65;;;;8080:13;8046:10;8038:65;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8121:13:6;;7714:427;-1:-1:-1;;7714:427:6:o;6502:332::-;6670:7;6815:12;518:4;6757:12;6700:42;518:4;6700:11;:42;:::i;:::-;:69;;;;:::i;:::-;:100;;;;:::i;:::-;:127;;;;:::i;1910:340:5:-;2043:6;2029:11;;:20;;;;:::i;:::-;2007:11;:42;;;-1:-1:-1;;;;;2113:14:5;;;;;:9;:14;;;;;;;;;;:23;;2084:52;;2162:81;3690:25:7;;;2113:14:5;;2007:11;2162:81;;3663:18:7;2162:81:5;3544:177:7;14:131;-1:-1:-1;;;;;89:31:7;;79:42;;69:70;;135:1;132;125:12;69:70;14:131;:::o;150:127::-;211:10;206:3;202:20;199:1;192:31;242:4;239:1;232:15;266:4;263:1;256:15;282:275;353:2;347:9;418:2;399:13;;-1:-1:-1;;395:27:7;383:40;;453:18;438:34;;474:22;;;435:62;432:88;;;500:18;;:::i;:::-;536:2;529:22;282:275;;-1:-1:-1;282:275:7:o;562:530::-;604:5;657:3;650:4;642:6;638:17;634:27;624:55;;675:1;672;665:12;624:55;711:6;698:20;737:18;733:2;730:26;727:52;;;759:18;;:::i;:::-;803:55;846:2;827:13;;-1:-1:-1;;823:27:7;852:4;819:38;803:55;:::i;:::-;883:2;874:7;867:19;929:3;922:4;917:2;909:6;905:15;901:26;898:35;895:55;;;946:1;943;936:12;895:55;1011:2;1004:4;996:6;992:17;985:4;976:7;972:18;959:55;1059:1;1034:16;;;1052:4;1030:27;1023:38;;;;1038:7;562:530;-1:-1:-1;;;562:530:7:o;1097:523::-;1183:6;1191;1199;1252:2;1240:9;1231:7;1227:23;1223:32;1220:52;;;1268:1;1265;1258:12;1220:52;1307:9;1294:23;1326:31;1351:5;1326:31;:::i;:::-;1376:5;-1:-1:-1;1432:2:7;1417:18;;1404:32;1459:18;1448:30;;1445:50;;;1491:1;1488;1481:12;1445:50;1514:49;1555:7;1546:6;1535:9;1531:22;1514:49;:::i;:::-;1504:59;;;1610:2;1599:9;1595:18;1582:32;1572:42;;1097:523;;;;;:::o;1625:250::-;1710:1;1720:113;1734:6;1731:1;1728:13;1720:113;;;1810:11;;;1804:18;1791:11;;;1784:39;1756:2;1749:10;1720:113;;;-1:-1:-1;;1867:1:7;1849:16;;1842:27;1625:250::o;1880:270::-;1921:3;1959:5;1953:12;1986:6;1981:3;1974:19;2002:76;2071:6;2064:4;2059:3;2055:14;2048:4;2041:5;2037:16;2002:76;:::i;:::-;2132:2;2111:15;-1:-1:-1;;2107:29:7;2098:39;;;;2139:4;2094:50;;1880:270;-1:-1:-1;;1880:270:7:o;2155:217::-;2302:2;2291:9;2284:21;2265:4;2322:44;2362:2;2351:9;2347:18;2339:6;2322:44;:::i;:::-;2314:52;2155:217;-1:-1:-1;;;2155:217:7:o;2824:315::-;2892:6;2900;2953:2;2941:9;2932:7;2928:23;2924:32;2921:52;;;2969:1;2966;2959:12;2921:52;3008:9;2995:23;3027:31;3052:5;3027:31;:::i;:::-;3077:5;3129:2;3114:18;;;;3101:32;;-1:-1:-1;;;2824:315:7:o;3726:456::-;3803:6;3811;3819;3872:2;3860:9;3851:7;3847:23;3843:32;3840:52;;;3888:1;3885;3878:12;3840:52;3927:9;3914:23;3946:31;3971:5;3946:31;:::i;:::-;3996:5;-1:-1:-1;4053:2:7;4038:18;;4025:32;4066:33;4025:32;4066:33;:::i;:::-;3726:456;;4118:7;;-1:-1:-1;;;4172:2:7;4157:18;;;;4144:32;;3726:456::o;4558:180::-;4617:6;4670:2;4658:9;4649:7;4645:23;4641:32;4638:52;;;4686:1;4683;4676:12;4638:52;-1:-1:-1;4709:23:7;;4558:180;-1:-1:-1;4558:180:7:o;4743:435::-;4796:3;4834:5;4828:12;4861:6;4856:3;4849:19;4887:4;4916:2;4911:3;4907:12;4900:19;;4953:2;4946:5;4942:14;4974:1;4984:169;4998:6;4995:1;4992:13;4984:169;;;5059:13;;5047:26;;5093:12;;;;5128:15;;;;5020:1;5013:9;4984:169;;;-1:-1:-1;5169:3:7;;4743:435;-1:-1:-1;;;;;4743:435:7:o;5183:332::-;5390:6;5379:9;5372:25;5433:2;5428;5417:9;5413:18;5406:30;5353:4;5453:56;5505:2;5494:9;5490:18;5482:6;5453:56;:::i;5520:273::-;5576:6;5629:2;5617:9;5608:7;5604:23;5600:32;5597:52;;;5645:1;5642;5635:12;5597:52;5684:9;5671:23;5737:5;5730:13;5723:21;5716:5;5713:32;5703:60;;5759:1;5756;5749:12;5798:247;5857:6;5910:2;5898:9;5889:7;5885:23;5881:32;5878:52;;;5926:1;5923;5916:12;5878:52;5965:9;5952:23;5984:31;6009:5;5984:31;:::i;6050:114::-;6134:4;6127:5;6123:16;6116:5;6113:27;6103:55;;6154:1;6151;6144:12;6169:243;6226:6;6279:2;6267:9;6258:7;6254:23;6250:32;6247:52;;;6295:1;6292;6285:12;6247:52;6334:9;6321:23;6353:29;6376:5;6353:29;:::i;6417:609::-;6730:6;6719:9;6712:25;6773:3;6768:2;6757:9;6753:18;6746:31;6693:4;6800:57;6852:3;6841:9;6837:19;6829:6;6800:57;:::i;:::-;6893:6;6888:2;6877:9;6873:18;6866:34;6948:9;6940:6;6936:22;6931:2;6920:9;6916:18;6909:50;6976:44;7013:6;7005;6976:44;:::i;:::-;6968:52;6417:609;-1:-1:-1;;;;;;;6417:609:7:o;7031:801::-;7142:6;7150;7158;7166;7174;7182;7190;7243:3;7231:9;7222:7;7218:23;7214:33;7211:53;;;7260:1;7257;7250:12;7211:53;7299:9;7286:23;7318:31;7343:5;7318:31;:::i;:::-;7368:5;-1:-1:-1;7425:2:7;7410:18;;7397:32;7438:33;7397:32;7438:33;:::i;:::-;7490:7;-1:-1:-1;7544:2:7;7529:18;;7516:32;;-1:-1:-1;7595:2:7;7580:18;;7567:32;;-1:-1:-1;7651:3:7;7636:19;;7623:33;7665:31;7623:33;7665:31;:::i;:::-;7031:801;;;;-1:-1:-1;7031:801:7;;;;7715:7;7769:3;7754:19;;7741:33;;-1:-1:-1;7821:3:7;7806:19;;;7793:33;;7031:801;-1:-1:-1;;7031:801:7:o;7837:388::-;7905:6;7913;7966:2;7954:9;7945:7;7941:23;7937:32;7934:52;;;7982:1;7979;7972:12;7934:52;8021:9;8008:23;8040:31;8065:5;8040:31;:::i;:::-;8090:5;-1:-1:-1;8147:2:7;8132:18;;8119:32;8160:33;8119:32;8160:33;:::i;:::-;8212:7;8202:17;;;7837:388;;;;;:::o;8230:455::-;8307:6;8315;8368:2;8356:9;8347:7;8343:23;8339:32;8336:52;;;8384:1;8381;8374:12;8336:52;8423:9;8410:23;8442:31;8467:5;8442:31;:::i;:::-;8492:5;-1:-1:-1;8548:2:7;8533:18;;8520:32;8575:18;8564:30;;8561:50;;;8607:1;8604;8597:12;8561:50;8630:49;8671:7;8662:6;8651:9;8647:22;8630:49;:::i;:::-;8620:59;;;8230:455;;;;;:::o;9043:287::-;9172:3;9210:6;9204:13;9226:66;9285:6;9280:3;9273:4;9265:6;9261:17;9226:66;:::i;:::-;9308:16;;;;;9043:287;-1:-1:-1;;9043:287:7:o;9335:127::-;9396:10;9391:3;9387:20;9384:1;9377:31;9427:4;9424:1;9417:15;9451:4;9448:1;9441:15;9467:128;9534:9;;;9555:11;;;9552:37;;;9569:18;;:::i;9600:403::-;9835:6;9824:9;9817:25;9878:2;9873;9862:9;9858:18;9851:30;9798:4;9898:56;9950:2;9939:9;9935:18;9927:6;9898:56;:::i;:::-;9890:64;;9990:6;9985:2;9974:9;9970:18;9963:34;9600:403;;;;;;:::o;10008:125::-;10073:9;;;10094:10;;;10091:36;;;10107:18;;:::i;10494:709::-;10559:5;10612:3;10605:4;10597:6;10593:17;10589:27;10579:55;;10630:1;10627;10620:12;10579:55;10659:6;10653:13;10685:4;10708:18;10704:2;10701:26;10698:52;;;10730:18;;:::i;:::-;10776:2;10773:1;10769:10;10799:28;10823:2;10819;10815:11;10799:28;:::i;:::-;10861:15;;;10931;;;10927:24;;;10892:12;;;;10963:15;;;10960:35;;;10991:1;10988;10981:12;10960:35;11027:2;11019:6;11015:15;11004:26;;11039:135;11055:6;11050:3;11047:15;11039:135;;;11121:10;;11109:23;;11072:12;;;;11152;;;;11039:135;;11208:737;11355:6;11363;11371;11379;11432:3;11420:9;11411:7;11407:23;11403:33;11400:53;;;11449:1;11446;11439:12;11400:53;11478:9;11472:16;11462:26;;11532:2;11521:9;11517:18;11511:25;11555:18;11596:2;11588:6;11585:14;11582:34;;;11612:1;11609;11602:12;11582:34;11635:72;11699:7;11690:6;11679:9;11675:22;11635:72;:::i;:::-;11625:82;;11747:2;11736:9;11732:18;11726:25;11716:35;;11797:2;11786:9;11782:18;11776:25;11760:41;;11826:2;11816:8;11813:16;11810:36;;;11842:1;11839;11832:12;11810:36;;11865:74;11931:7;11920:8;11909:9;11905:24;11865:74;:::i;:::-;11855:84;;;11208:737;;;;;;;:::o;11950:127::-;12011:10;12006:3;12002:20;11999:1;11992:31;12042:4;12039:1;12032:15;12066:4;12063:1;12056:15;12082:184;12152:6;12205:2;12193:9;12184:7;12180:23;12176:32;12173:52;;;12221:1;12218;12211:12;12173:52;-1:-1:-1;12244:16:7;;12082:184;-1:-1:-1;12082:184:7:o;12271:135::-;12310:3;12331:17;;;12328:43;;12351:18;;:::i;:::-;-1:-1:-1;12398:1:7;12387:13;;12271:135::o;16199:680::-;16326:6;16334;16342;16350;16403:3;16391:9;16382:7;16378:23;16374:33;16371:53;;;16420:1;16417;16410:12;16371:53;16452:9;16446:16;16471:31;16496:5;16471:31;:::i;:::-;16571:2;16556:18;;16550:25;16521:5;;-1:-1:-1;16584:33:7;16550:25;16584:33;:::i;:::-;16688:2;16673:18;;16667:25;16636:7;;-1:-1:-1;16701:31:7;16667:25;16701:31;:::i;:::-;16803:2;16788:18;;16782:25;16751:7;;-1:-1:-1;16816:31:7;16782:25;16816:31;:::i;:::-;16199:680;;;;-1:-1:-1;16199:680:7;;-1:-1:-1;;16199:680:7:o;17163:168::-;17236:9;;;17267;;17284:15;;;17278:22;;17264:37;17254:71;;17305:18;;:::i;17336:217::-;17376:1;17402;17392:132;;17446:10;17441:3;17437:20;17434:1;17427:31;17481:4;17478:1;17471:15;17509:4;17506:1;17499:15;17392:132;-1:-1:-1;17538:9:7;;17336:217::o
Swarm Source
ipfs://f29b1b285138562e9f818fe7a11fbb049dd0c266fba3fef31fcba7065a99e1ae
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.