BNB Price: $617.97 (+3.47%)
 

Overview

Max Total Supply

21,000,000ERC20 ***

Holders

10,147

Market

Price

$0.00 @ 0.000000 BNB

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0.000000001 ERC20 ***

Value
$0.00
0x2b8401bbb2107270fb9252850772273456101048
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BTH

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
// SPDX-License-Identifier: MIT
pragma solidity 0.8.19;

import "@openzeppelin/[email protected]/token/ERC721/IERC721.sol";
import "@openzeppelin/[email protected]/access/Ownable.sol";
import "@openzeppelin/[email protected]/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";


contract BTH is ERC20,Ownable{ 
    using SafeMath for uint256;
    struct UserInfo{
        address inviter;                
        uint256 ethAmount;              
        uint256 rewardBalance;          
        uint256 releaseWETHBalance;     
        uint256 nextRelease;            
        uint256 pendingTeamRewards;
        uint256 lastRewardBlock;
        uint256 shareActiveNums;
        uint256 teamAmount;        
    }

    bool inSwap;

    modifier swapping(){
        inSwap=true;
        _;
        inSwap=false;
    }

    uint256[] public shareRateList;
    uint256[] public teamRateList;

    uint256 public tokenId;

    uint256 public sosAmount;

    ISwapRouter public SwapRouter;
    IWETH public WETH;          
    IERC20 public USDT;          
    IFund public NFTFund;
    mapping(address=>bool) public isExcludeFee;
    mapping(address=>bool) public automatedMarketMakerPairs;

    AutoSwap public autoSwap;
    AutoSwap public autoSwapFund;

    address public foundation;
    INonfungiblePositionManager public V3Manage;
           
    address public sosAddress; 
    IV3CALC public v3_position_calc;
    
    bool public isStartup;
    bool public isEnableInviter;
    bool public isEnableBuy;
    mapping(address=>mapping(address=>bool)) public bindState;

    mapping(address => UserInfo) public userInfo;

    event Deposit(address from,uint256 amount);

    event Finished(address from,uint256 amount);
    
    event ShareReward(address shareUser,address rewardUser,uint256 amount);

    event BindUser(address from,address inviter);

    event Reward(address from ,uint256 bnbAmount,uint256 bthAmount);

    event TeamReward(address from,address claimUser,uint256 rewardAmount,bool isShare);
    
    constructor()ERC20("BTH-ERC20", "BTH") {
        shareRateList = [20,10,10,5,5];
        teamRateList =  [10,10,10,5,5,5,5,5,5,5];
        foundation=0x10c83b9eE5037DbE4D3138643771E3C281bf3D31;

        isExcludeFee[foundation]=true;

        _mint(foundation,3000000e18);

        _mint(address(this),17999000e18); 
        
        _mint(0xA515515e9Ee61a8995b6b287b776eff65720A5D3,1000e18);

        sosAddress=0x0305Fe450428D2723E3b1783bBCFCA6EAC8Fa7ed;                                                                 

        WETH=IWETH(0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c);                                 
        
        USDT=IERC20(0x55d398326f99059fF775485246999027B3197955);                                
        
        NFTFund=IFund(0x490E1C570539CFc8374C9D86eB4DcCF828AC19E1);                              

        SwapRouter=ISwapRouter(0x10ED43C718714eb63d5aA57B78B54704E256024E);                     

        V3Manage = INonfungiblePositionManager(0x46A15B0b27311cedF172AB29E4f4766fbE7F4364);     
        
        v3_position_calc = IV3CALC(0xdB8e871731789D40aC3CF2690Dba486B68bF3F9C);                

        tokenId=311746;

        address factory=SwapRouter.factory();
        
        address usdtPair = ISwapFactory(factory).createPair(address(this),address(USDT));

        address bnbPair =ISwapFactory(factory).createPair(address(this),address(WETH));

        automatedMarketMakerPairs[usdtPair]=true;

        automatedMarketMakerPairs[bnbPair]=true;

        autoSwap = new AutoSwap(address(this));

        autoSwapFund=new AutoSwap(address(this));

        userInfo[0xA515515e9Ee61a8995b6b287b776eff65720A5D3].inviter = 0xC80eB15e2d68695DE2A4366Fb22A250290388004;

        WETH.approve(address(SwapRouter), type(uint256).max);

        _approve(address(this), address(SwapRouter), type(uint256).max);

    }

    receive() external payable{
        address sender = msg.sender;
        uint256 ethAmount = msg.value; 
        bool isBot = isContract(sender);  
        if(isBot  || (tx.origin != sender)){
            return;
        }
        require(isStartup,"BTH-ERC20: Not yet open");

        UserInfo storage user=userInfo[sender];

        require(user.ethAmount ==0&&user.rewardBalance==0,"BTH-ERC20: Deposit exsists");
        require(ethAmount >= 1e18,"BTH-ERC20: pass 1 eth");

        address parent=user.inviter;
        
        if(parent != address(0)){
            UserInfo storage parentUser=userInfo[parent];
            parentUser.shareActiveNums+=1;
            parentUser.teamAmount+=ethAmount;

            uint256[] memory rateList=shareRateList;
            uint256 rewardAmount=ethAmount.mul(rateList[0]).div(1000);
            
            if(rewardAmount>=parentUser.rewardBalance){
                payable(parent).transfer(parentUser.rewardBalance);
                payable(sosAddress).transfer(rewardAmount.sub(parentUser.rewardBalance));
                emit ShareReward(sender,parent,parentUser.rewardBalance);
                finished(parent);
            }else{
                payable(parent).transfer(rewardAmount);
                parentUser.rewardBalance-=rewardAmount;
                emit ShareReward(sender,parent,rewardAmount);
            }

            for(uint i=1;i<5;i++){
                parent=parentUser.inviter;
                rewardAmount=ethAmount.mul(rateList[i]).div(1000);

                if(parent == address(0)){
                    payable(sosAddress).transfer(rewardAmount);
                    continue;
                }
                
                parentUser=userInfo[parent];
                parentUser.teamAmount+=ethAmount;
                
                if(parentUser.rewardBalance>0){
                    if(rewardAmount>=parentUser.rewardBalance){
                        payable(parent).transfer(parentUser.rewardBalance);
                        payable (sosAddress).transfer(rewardAmount.sub(parentUser.rewardBalance));
                        emit ShareReward(sender,parent,parentUser.rewardBalance);
                        finished(parent);
                    }else{
                        payable(parent).transfer(rewardAmount);
                        parentUser.rewardBalance-=rewardAmount;
                        emit ShareReward(sender,parent,rewardAmount);
                    }
                }else{
                    payable(sosAddress).transfer(rewardAmount);
                }
                
            }
        
            for(uint256 i=0;i<50;i++){
                if(parent ==address(0)){
                    break;
                }

                parentUser.teamAmount+=ethAmount;
                parent = parentUser.inviter;
                parentUser=userInfo[parent];
            }
        }

        user.ethAmount=ethAmount;
        user.releaseWETHBalance=ethAmount.mul(79).div(100);     
        user.rewardBalance=ethAmount.mul(150).div(100);
        user.nextRelease=ethAmount.div(100); 
        user.lastRewardBlock=block.number;

        WETH.deposit{value:user.nextRelease}();

        swapWETHToBTH(user.nextRelease);
                
        NFTFund.fund{value:ethAmount.div(10)}();

        payable(0x57c8E60641F283Fa40098189f9241dd6EA4A9329).transfer(ethAmount.div(20));

        uint256 WETHBalance = address(this).balance;
        
        if(WETHBalance>0){
            (uint128 lpAmount,,uint256 amount1) = V3Manage.increaseLiquidity{value: WETHBalance}(INonfungiblePositionManager.IncreaseLiquidityParams({
                tokenId:tokenId,
                amount0Desired:0,
                amount1Desired:WETHBalance,
                amount0Min:0,
                amount1Min:WETHBalance,
                deadline:block.timestamp
            }));

            require(lpAmount>0 && amount1 == WETHBalance,"DepositV3 Error");
        }
        
        emit Deposit(sender,ethAmount);
    
    }

    function finished(address from) internal {
        UserInfo storage user=userInfo[from];
        
        emit Finished(from,user.ethAmount);

        user.ethAmount=0;
        user.lastRewardBlock=0;
        user.nextRelease=0;
        user.pendingTeamRewards=0;
        user.rewardBalance=0;

        if(user.releaseWETHBalance>0){
            sosAmount+=user.releaseWETHBalance;
        }
        user.releaseWETHBalance=0;
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != to,"BTH-ERC20: must from != to");
        require(amount >0 ,"BTH-ERC20: must amount > 0");
        
        if(inSwap || ((isExcludeFee[from]||isExcludeFee[to])&&!isStartup)){ 
            return super._transfer(from,to,amount);
        }

        if(automatedMarketMakerPairs[from]){
            require(isEnableBuy,"BTH-ERC20: Swap BTH Disabled");
            uint256 fees=amount.div(20);
            super._transfer(from, address(autoSwapFund), fees);
            return super._transfer(from,to,amount.sub(fees));
        }else if(automatedMarketMakerPairs[to]){
            uint256 fees=amount.div(20);
            super._transfer(from, address(autoSwapFund), fees);
            process();
            return super._transfer(from,to,amount.sub(fees));
        }else if(!isContract(from)&&to == address(this)){
            reward(from);
        }else{
            doInviter(from,to);
        }

        super._transfer(from, to, amount);
    }
    

    function doInviter(address from,address to) internal {
        UserInfo memory fromUser=userInfo[from];
        UserInfo memory toUser=userInfo[to];
        if(isContract(from)||isContract(to)||!isEnableInviter){
            return;
        }

        if(toUser.inviter == address(0)&&fromUser.inviter !=address(0)){
            bindState[from][to] = true;
            return;
        }

        if(fromUser.inviter == address(0)&&toUser.inviter !=address(0)&&bindState[to][from]){
            userInfo[from].inviter = to;
            emit BindUser(from,to);
        }
        
    }


    function process() internal swapping {
        uint256 totalAmount=balanceOf(address(autoSwapFund));
        super._transfer(address(autoSwapFund), address(this), totalAmount);
        super._transfer(address(this), address(0xDead), totalAmount.div(5));

        uint256 swapAmount = totalAmount.mul(3).div(5);
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = address(WETH);

        SwapRouter.swapExactTokensForTokens(swapAmount,0,path,address(autoSwap),block.timestamp);

        uint256 wethAmount= WETH.balanceOf(address(autoSwap));

        autoSwap.withdraw(WETH, address(this), wethAmount);

        SwapRouter.addLiquidity(address(WETH), address(this) , wethAmount, totalAmount.div(5), 0, 0, 0x66aDD9Dd2dc3aAAff708bEaDb1219A5305C7C10e, block.timestamp);
        
        wethAmount=WETH.balanceOf(address(this));
        
        WETH.withdraw(wethAmount);
        uint256 halfAmount=wethAmount.div(2);
        payable(0xcad734be9eCAa4a90DB7A5E857701C106d4B90d9).transfer(halfAmount);
        NFTFund.fund{value:halfAmount}();
    }

    function reward(address from) internal {
        address sender = msg.sender;
        require(sender == from && sender == tx.origin,"BTH-ERC20: Bot Warning");  
        UserInfo storage fromUser=userInfo[from];

        uint256 ethAmount = fromUser.ethAmount;
        
        require(ethAmount>0,"BTH-ERC20: Insufficient Deposit Amount");

        require(fromUser.lastRewardBlock>0&&block.number>fromUser.lastRewardBlock+28800,"BTH-ERC20: Insufficient Reward Time");

        uint256 subDay = block.number.sub(fromUser.lastRewardBlock).div(28800);

        uint256 staticPending = ethAmount.mul(subDay).mul(15).div(1000);

        uint256 rewardPending=staticPending.add(fromUser.pendingTeamRewards);
        
        if(fromUser.releaseWETHBalance>0){
            
            uint256 releaseAmount=fromUser.nextRelease.mul(subDay);
            if(releaseAmount>fromUser.releaseWETHBalance){
                releaseAmount=fromUser.releaseWETHBalance;
            }
            releaseAndSwap(releaseAmount);
            fromUser.releaseWETHBalance=fromUser.releaseWETHBalance.sub(releaseAmount);
        }
        

        if(rewardPending>=fromUser.rewardBalance){
            uint256 sendAmount=_getAmountsOut(fromUser.rewardBalance);
            super._transfer(address(this), from, sendAmount);
            emit Reward(from, fromUser.rewardBalance,sendAmount);
            finished(from);
            
        }else{
            uint256 sendAmount=_getAmountsOut(rewardPending);
            super._transfer(address(this), from,sendAmount );
            fromUser.rewardBalance=fromUser.rewardBalance.sub(rewardPending);
            fromUser.lastRewardBlock=block.number;
            emit Reward(from, rewardPending,sendAmount);
        }
        
        rewardTeam(from,fromUser.inviter,staticPending);
    }

    function rewardTeam(address from,address inviter,uint256 rewardAmount) internal {
    
        uint256[] memory rateList=teamRateList;

        uint256 currSpendRate=0;
        
        for(uint8 i=0;i<50;i++){
            if(inviter == address(0)){
                break;
            }
            UserInfo storage parent=userInfo[inviter];
        
            if(parent.rewardBalance==0){
                continue ;
            }

            if(i<10&&i<parent.shareActiveNums&&parent.ethAmount>0){
                uint256 shareRewars = rewardAmount.mul(rateList[i]).div(100);
                parent.pendingTeamRewards+= shareRewars;
                emit TeamReward(from, inviter, shareRewars,true);
            }
            
            uint256 teamReward;
            if(parent.teamAmount >= 100000e18){
                teamReward = rewardAmount * (50 - currSpendRate) / 100;
                parent.pendingTeamRewards+=teamReward;
                emit TeamReward(from, inviter, teamReward,false);
                break;
            }else if(parent.teamAmount >= 50000e18&&currSpendRate<45){
                teamReward = rewardAmount * (45 - currSpendRate) / 100;
                currSpendRate=45;
            }else if(parent.teamAmount >= 20000e18&&currSpendRate<40){
                teamReward = rewardAmount * (40 - currSpendRate) / 100;
                currSpendRate=40;
            }else if(parent.teamAmount >= 10000e18&&currSpendRate<35){
                teamReward = rewardAmount * (35 - currSpendRate) / 100;
                currSpendRate=35;
            }else if(parent.teamAmount >= 5000e18&&currSpendRate<30){
                teamReward = rewardAmount * (30 - currSpendRate) / 100;
                currSpendRate=30;
            }else if(parent.teamAmount >= 2000e18&&currSpendRate<25){
                teamReward = rewardAmount * (25 - currSpendRate) / 100;
                currSpendRate=25;
            }else if(parent.teamAmount >= 1000e18&&currSpendRate<20){
                teamReward = rewardAmount * (20 - currSpendRate) / 100;
                currSpendRate=20;
            }else if(parent.teamAmount >= 500e18&&currSpendRate<15){
                teamReward = rewardAmount * (15 - currSpendRate) / 100;
                currSpendRate=15;
            }else if(parent.teamAmount >= 200e18&&currSpendRate<10){
                teamReward = rewardAmount * (10 - currSpendRate) / 100;
                currSpendRate=10;
            }else if(parent.teamAmount >= 50e18&&currSpendRate==0){
                teamReward = rewardAmount/20;
                currSpendRate=5;
            }

            if(teamReward>0){
                parent.pendingTeamRewards+=teamReward;
                emit TeamReward(from, inviter, teamReward,false);
            }

            inviter=parent.inviter;
        }
    }

    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function releaseAndSwap(uint256 wethAmount) internal {

        (,,,,,int24 tickLower,int24 tickUpper,uint128 liquidity,,,,) = V3Manage.positions(tokenId);

        (,uint256 amountWETH) = IV3CALC(v3_position_calc).principal(0x36696169C63e42cd08ce11f5deeBbCeBae652050,tickLower,tickUpper,liquidity);

        require(amountWETH >= wethAmount&&liquidity>0,"BTH-ERC20:  Insufficient funds");

        uint256 calcRes = wethAmount * liquidity / amountWETH;

        uint128 deLpAmunt = uint128(calcRes)+1;
        
        if(deLpAmunt>liquidity){
            deLpAmunt = liquidity;
        }

        (,uint256 weth2) = V3Manage.decreaseLiquidity(INonfungiblePositionManager.DecreaseLiquidityParams({
             tokenId:tokenId,
             liquidity:deLpAmunt,
             amount0Min:0,
             amount1Min:0,
             deadline:block.timestamp
        }));

        require(weth2>0,"BTH-ERC20: Insufficient position");
        V3Manage.collect(INonfungiblePositionManager.CollectParams({
            tokenId:tokenId,
            recipient:address(this),
            amount0Max:340282366920938463463374607431768211455,
            amount1Max:340282366920938463463374607431768211455
        }));

        swapWETHToBTH(weth2);
        
    }

    function swapWETHToBTH(uint256 wethAmount) internal swapping returns(uint256){
        address[] memory path = new address[](2);
        path[0] = address(WETH);                                   
        path[1] = address(this);

        SwapRouter.swapExactTokensForTokens(wethAmount,0,path,address(autoSwap),block.timestamp);
        uint256 bthAmount=balanceOf(address(autoSwap));
        super._transfer(address(autoSwap), address(this), bthAmount);

        return bthAmount;
    }

    function _getAmountsOut(uint256 ethAmount) internal view returns(uint256){
        address[] memory path = new address[](2);
        path[0] = address(WETH);
        path[1] = address(this);
        uint256[] memory amounts = ISwapRouter(SwapRouter).getAmountsOut(ethAmount, path);
        return amounts[1];
    }
    
    function sosBuy(uint256 amount) external {
        require(sosAmount>=amount,"BTH-ERC20: err amount"); 
        require(msg.sender==sosAddress,"BTH-ERC20: err permission"); 
        
        WETH.approve(address(SwapRouter), type(uint256).max);
        _approve(address(this), address(SwapRouter), type(uint256).max);

        releaseAndSwap(amount);
        sosAmount-=amount;
    }

    function startup() public onlyOwner{
        require(!isStartup,"BTH-ERC20: inviter started");
        isStartup = true;
    }

    function enableInviter() public onlyOwner{
        require(!isEnableInviter,"BTH-ERC20: inviter started");
        isEnableInviter = true;
    }

    function enableBuy() public {
        require(msg.sender==sosAddress,"BTH-ERC20: err permission"); 
        require(!isEnableBuy,"BTH-ERC20: err status");
        isEnableBuy=true;
    }

    function withdrawV3NFT(address to) external onlyOwner{
        V3Manage.transferFrom(address(this), to, tokenId);
    }
}


interface IFund {
    function fund() external payable;
}

interface ISwapPair {
    function mint(address to) external returns (uint liquidity);
}

interface ISwapRouter {
    function factory() external pure returns (address);
    function swapExactETHForTokens(
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external payable;
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
}

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

contract AutoSwap{
    address owner;
    constructor(address _owner){
        owner=_owner;
    }

    function withdraw(IERC20 token,address to,uint256 amount) external {
        require(msg.sender==owner,"AutoSwap: permission err");
        token.transfer(to,amount);
    }
}

interface INonfungiblePositionManager is IERC721{

    struct DecreaseLiquidityParams {
        uint256 tokenId;
        uint128 liquidity;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    struct IncreaseLiquidityParams {
        uint256 tokenId;
        uint256 amount0Desired;
        uint256 amount1Desired;
        uint256 amount0Min;
        uint256 amount1Min;
        uint256 deadline;
    }

    struct CollectParams {
        uint256 tokenId;
        address recipient;
        uint128 amount0Max;
        uint128 amount1Max;
    }

    function decreaseLiquidity(DecreaseLiquidityParams calldata params) external payable returns (uint256 amount0, uint256 amount1);

    function increaseLiquidity(IncreaseLiquidityParams calldata params) external payable returns (uint128 liquidity,uint256 amount0,uint256 amount1);

    function collect(CollectParams calldata params) external payable returns (uint256 amount0, uint256 amount1);

    function positions(uint256 tokenId)
    external
    view
    returns (
        uint96 nonce,
        address operator,
        address token0,
        address token1,
        uint24 fee,
        int24 tickLower,
        int24 tickUpper,
        uint128 liquidity,
        uint256 feeGrowthInside0LastX128,
        uint256 feeGrowthInside1LastX128,
        uint128 tokensOwed0,
        uint128 tokensOwed1
    );
}

interface IV3CALC{
    function principal(
        address pool,
        int24 _tickLower,
        int24 _tickUpper,
        uint128 liquidity
    ) external view returns (uint256 amount0, uint256 amount1);
}

interface IWETH is IERC20{
    function deposit() external payable ;
    function withdraw(uint wad) external ;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;

import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the default value returned by this function, unless
     * it's overridden.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address from, address to, uint256 amount) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, allowance(owner, spender) + addedValue);
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        address owner = _msgSender();
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `from` to `to`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     */
    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by
            // decrementing then incrementing.
            _balances[to] += amount;
        }

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        unchecked {
            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
            // Overflow not possible: amount <= accountBalance <= totalSupply.
            _totalSupply -= amount;
        }

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    /**
     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 amount) internal virtual {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"inviter","type":"address"}],"name":"BindUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Finished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"bnbAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bthAmount","type":"uint256"}],"name":"Reward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"shareUser","type":"address"},{"indexed":false,"internalType":"address","name":"rewardUser","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ShareReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"claimUser","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isShare","type":"bool"}],"name":"TeamReward","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":"NFTFund","outputs":[{"internalType":"contract IFund","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SwapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDT","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V3Manage","outputs":[{"internalType":"contract INonfungiblePositionManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwap","outputs":[{"internalType":"contract AutoSwap","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoSwapFund","outputs":[{"internalType":"contract AutoSwap","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"bindState","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableInviter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"foundation","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":[],"name":"isEnableBuy","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isEnableInviter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isExcludeFee","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStartup","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"shareRateList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sosAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sosAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"sosBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"teamRateList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"amount","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":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"address","name":"inviter","type":"address"},{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"rewardBalance","type":"uint256"},{"internalType":"uint256","name":"releaseWETHBalance","type":"uint256"},{"internalType":"uint256","name":"nextRelease","type":"uint256"},{"internalType":"uint256","name":"pendingTeamRewards","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"shareActiveNums","type":"uint256"},{"internalType":"uint256","name":"teamAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"v3_position_calc","outputs":[{"internalType":"contract IV3CALC","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"withdrawV3NFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b506040518060400160405280600981526020016804254482d45524332360bc1b81525060405180604001604052806003815260200162084a8960eb1b815250816003908162000061919062000983565b50600462000070828262000983565b5050506200008d620000876200061b60201b60201c565b6200061f565b6040805160a08101825260148152600a602082018190529181019190915260056060820181905260808201819052620000c99160069162000865565b506040805161014081018252600a808252602082018190529181018290526005606082018190526080820181905260a0820181905260c0820181905260e08201819052610100820181905261012082015262000129916007919062000865565b50601280546001600160a01b0319167310c83b9ee5037dbe4d3138643771e3c281bf3d319081179091556000819052600e6020527fe83b5bc6e2a75693872c7f233eb58181c60bd1074d105ba86bc92124e9b9ff19805460ff19166001179055620001a0906a027b46536c66c8e300000062000671565b620001b7306a0ee36fbec0baef7360000062000671565b620001e073a515515e9ee61a8995b6b287b776eff65720a5d3683635c9adc5dea0000062000671565b601480546001600160a01b0319908116730305fe450428d2723e3b1783bbcfca6eac8fa7ed17909155600b8054821673bb4cdb9cbd36b01bd1cbaebf2de08d9173bc095c179055600c805482167355d398326f99059ff775485246999027b3197955179055600d8054821673490e1c570539cfc8374c9d86eb4dccf828ac19e1179055600a805482167310ed43c718714eb63d5aa57b78b54704e256024e9081179091556013805483167346a15b0b27311cedf172ab29e4f4766fbe7f43641790556015805490921673db8e871731789d40ac3cf2690dba486b68bf3f9c179091556204c1c26008556040805163c45a015560e01b815290516000929163c45a01559160048281019260209291908290030181865afa15801562000308573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200032e919062000a4f565b600c546040516364e329cb60e11b81523060048201526001600160a01b0391821660248201529192506000919083169063c9c65396906044016020604051808303816000875af115801562000387573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003ad919062000a4f565b600b546040516364e329cb60e11b81523060048201526001600160a01b0391821660248201529192506000919084169063c9c65396906044016020604051808303816000875af115801562000406573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200042c919062000a4f565b6001600160a01b038381166000908152600f60205260408082208054600160ff19918216811790925593851683529181902080549093169091179091555190915030906200047a90620008ba565b6001600160a01b039091168152602001604051809103906000f080158015620004a7573d6000803e3d6000fd5b50601080546001600160a01b0319166001600160a01b03929092169190911790556040513090620004d890620008ba565b6001600160a01b039091168152602001604051809103906000f08015801562000505573d6000803e3d6000fd5b50601180546001600160a01b039283166001600160a01b03199182161790915573a515515e9ee61a8995b6b287b776eff65720a5d360005260176020527f302796681b71e53cc7de2758224285017862c01fea5bf54a30855c8e9e7722a4805490911673c80eb15e2d68695de2a4366fb22a250290388004179055600b54600a5460405163095ea7b360e01b81529083166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015620005cf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005f5919062000a81565b50600a54620006129030906001600160a01b031660001962000738565b50505062000acd565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620006cd5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064015b60405180910390fd5b8060026000828254620006e1919062000aa5565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6001600160a01b0383166200079c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401620006c4565b6001600160a01b038216620007ff5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401620006c4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b505050565b828054828255906000526020600020908101928215620008a8579160200282015b82811115620008a8578251829060ff1690559160200191906001019062000886565b50620008b6929150620008c8565b5090565b61026780620045b583390190565b5b80821115620008b65760008155600101620008c9565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200090a57607f821691505b6020821081036200092b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200086057600081815260208120601f850160051c810160208610156200095a5750805b601f850160051c820191505b818110156200097b5782815560010162000966565b505050505050565b81516001600160401b038111156200099f576200099f620008df565b620009b781620009b08454620008f5565b8462000931565b602080601f831160018114620009ef5760008415620009d65750858301515b600019600386901b1c1916600185901b1785556200097b565b600085815260208120601f198616915b8281101562000a2057888601518255948401946001909101908401620009ff565b508582101562000a3f5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000a6257600080fd5b81516001600160a01b038116811462000a7a57600080fd5b9392505050565b60006020828403121562000a9457600080fd5b8151801515811462000a7a57600080fd5b8082018082111562000ac757634e487b7160e01b600052601160045260246000fd5b92915050565b613ad88062000add6000396000f3fe60806040526004361061023f5760003560e01c8063770048511161012e578063bb67e7b7116100ab578063dcace9ab1161006f578063dcace9ab146110ad578063dccacf43146110dd578063dd62ed3e146110fe578063f2fde38b1461111e578063fbef6d171461113e57600080fd5b8063bb67e7b714611017578063c54e44eb14611038578063c8d9928114611058578063d5009f921461106d578063d52dd8901461108d57600080fd5b8063a457c2d7116100f2578063a457c2d714610f72578063a9059cbb14610f92578063ad5c464814610fb2578063b3892c6414610fd2578063b62496f514610fe757600080fd5b80637700485114610ef45780638b35eba814610f145780638da5cb5b14610f2a57806395d89b4114610f48578063a335239b14610f5d57600080fd5b8063313ce567116101bc5780634dc32eff116101805780634dc32eff14610e4957806370a0823114610e69578063715018a614610e9f57806371c3e4bb14610eb457806373f2e22d14610ed457600080fd5b8063313ce56714610dac5780633351c43114610dc85780633950935114610de957806341fbb05014610e0957806347a4f02814610e2957600080fd5b80631959a002116102035780631959a00214610c395780631ac2827114610cf75780631cef38b214610d1957806323b872dd14610d545780632874e21714610d7457600080fd5b806306fdde0314610b85578063095ea7b314610bb0578063173b034c14610be057806317d70f7c14610c0e57806318160ddd14610c2457600080fd5b36610b80573334813b1515808061025f5750326001600160a01b03841614155b1561026657005b601554600160a01b900460ff166102c45760405162461bcd60e51b815260206004820152601760248201527f4254482d45524332303a204e6f7420796574206f70656e00000000000000000060448201526064015b60405180910390fd5b6001600160a01b038316600090815260176020526040902060018101541580156102f057506002810154155b61033c5760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a204465706f736974206578736973747300000000000060448201526064016102bb565b670de0b6b3a764000083101561038c5760405162461bcd60e51b8152602060048201526015602482015274084a8905a8aa48664607440e0c2e6e6406240cae8d605b1b60448201526064016102bb565b80546001600160a01b031680156108a9576001600160a01b038116600090815260176020526040812060078101805491926001926103cb90849061347d565b92505081905550848160080160008282546103e6919061347d565b925050819055506000600680548060200260200160405190810160405280929190818152602001828054801561043b57602002820191906000526020600020905b815481526020019060010190808311610427575b50505050509050600061047d6103e86104778460008151811061046057610460613490565b60200260200101518a61115e90919063ffffffff16565b90611173565b90508260020154811061054b5760028301546040516001600160a01b0386169180156108fc02916000818181858888f193505050501580156104c3573d6000803e3d6000fd5b5060145460028401546001600160a01b03909116906108fc906104e790849061117f565b6040518115909202916000818181858888f1935050505015801561050f573d6000803e3d6000fd5b50600080516020613a8383398151915288858560020154604051610535939291906134a6565b60405180910390a16105468461118b565b6105c6565b6040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015610581573d6000803e3d6000fd5b508083600201600082825461059691906134ca565b9091555050604051600080516020613a83833981519152906105bd908a90879085906134a6565b60405180910390a15b60015b600581101561084057835483516001600160a01b039091169550610618906103e8906104779086908590811061060157610601613490565b60200260200101518b61115e90919063ffffffff16565b91506001600160a01b038516610668576014546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610662573d6000803e3d6000fd5b5061082e565b6001600160a01b03851660009081526017602052604081206008810180549196508a92909161069890849061347d565b90915550506002840154156107f257836002015482106107735760028401546040516001600160a01b0387169180156108fc02916000818181858888f193505050501580156106eb573d6000803e3d6000fd5b5060145460028501546001600160a01b03909116906108fc9061070f90859061117f565b6040518115909202916000818181858888f19350505050158015610737573d6000803e3d6000fd5b50600080516020613a838339815191528986866002015460405161075d939291906134a6565b60405180910390a161076e8561118b565b61082e565b6040516001600160a01b0386169083156108fc029084906000818181858888f193505050501580156107a9573d6000803e3d6000fd5b50818460020160008282546107be91906134ca565b9091555050604051600080516020613a83833981519152906107e5908b90889086906134a6565b60405180910390a161082e565b6014546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561082c573d6000803e3d6000fd5b505b80610838816134dd565b9150506105c9565b5060005b60328110156108a4576001600160a01b038516156108a45787846008016000828254610870919061347d565b909155505092546001600160a01b03166000818152601760205260409020909450928061089c816134dd565b915050610844565b505050505b600182018490556108c0606461047786604f61115e565b60038301556108d5606461047786609661115e565b60028301556108e5846064611173565b6004808401829055436006850155600b5460408051630d0e30db60e41b815290516001600160a01b039092169363d0e30db0939092828201926000929082900301818588803b15801561093757600080fd5b505af115801561094b573d6000803e3d6000fd5b505050505061095d8260040154611238565b50600d546001600160a01b031663b60d428861097a86600a611173565b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109a557600080fd5b505af11580156109b9573d6000803e3d6000fd5b507357c8e60641f283fa40098189f9241dd6ea4a932993506108fc92506109e591508790506014611173565b6040518115909202916000818181858888f19350505050158015610a0d573d6000803e3d6000fd5b50478015610b3c576013546040805160c081018252600854815260006020820181815282840186815260608401838152608085018881524260a08701908152965163219f5d1760e01b8152955160048701529251602486015290516044850152516064840152516084830152915160a4820152909182916001600160a01b039091169063219f5d1790859060c40160606040518083038185885af1158015610ab9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ade9190613512565b92505091506000826001600160801b0316118015610afb57508281145b610b395760405162461bcd60e51b815260206004820152600f60248201526e2232b837b9b4ba2b199022b93937b960891b60448201526064016102bb565b50505b604080516001600160a01b0388168152602081018790527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a1005b600080fd5b348015610b9157600080fd5b50610b9a61137d565b604051610ba79190613547565b60405180910390f35b348015610bbc57600080fd5b50610bd0610bcb3660046135aa565b61140f565b6040519015158152602001610ba7565b348015610bec57600080fd5b50610c00610bfb3660046135d6565b611427565b604051908152602001610ba7565b348015610c1a57600080fd5b50610c0060085481565b348015610c3057600080fd5b50600254610c00565b348015610c4557600080fd5b50610ca9610c543660046135ef565b6017602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b03909716979596949593949293919290919089565b604080516001600160a01b03909a168a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610ba7565b348015610d0357600080fd5b50610d17610d123660046135ef565b611448565b005b348015610d2557600080fd5b50610bd0610d34366004613613565b601660209081526000928352604080842090915290825290205460ff1681565b348015610d6057600080fd5b50610bd0610d6f36600461364c565b6114ba565b348015610d8057600080fd5b50601454610d94906001600160a01b031681565b6040516001600160a01b039091168152602001610ba7565b348015610db857600080fd5b5060405160128152602001610ba7565b348015610dd457600080fd5b50601554610bd090600160b01b900460ff1681565b348015610df557600080fd5b50610bd0610e043660046135aa565b6114de565b348015610e1557600080fd5b50601254610d94906001600160a01b031681565b348015610e3557600080fd5b50610c00610e443660046135d6565b611500565b348015610e5557600080fd5b50600a54610d94906001600160a01b031681565b348015610e7557600080fd5b50610c00610e843660046135ef565b6001600160a01b031660009081526020819052604090205490565b348015610eab57600080fd5b50610d17611510565b348015610ec057600080fd5b50601154610d94906001600160a01b031681565b348015610ee057600080fd5b50600d54610d94906001600160a01b031681565b348015610f0057600080fd5b50601054610d94906001600160a01b031681565b348015610f2057600080fd5b50610c0060095481565b348015610f3657600080fd5b506005546001600160a01b0316610d94565b348015610f5457600080fd5b50610b9a611524565b348015610f6957600080fd5b50610d17611533565b348015610f7e57600080fd5b50610bd0610f8d3660046135aa565b6115f0565b348015610f9e57600080fd5b50610bd0610fad3660046135aa565b61166b565b348015610fbe57600080fd5b50600b54610d94906001600160a01b031681565b348015610fde57600080fd5b50610d17611679565b348015610ff357600080fd5b50610bd06110023660046135ef565b600f6020526000908152604090205460ff1681565b34801561102357600080fd5b50601554610bd090600160a81b900460ff1681565b34801561104457600080fd5b50600c54610d94906001600160a01b031681565b34801561106457600080fd5b50610d176116f0565b34801561107957600080fd5b50601354610d94906001600160a01b031681565b34801561109957600080fd5b50601554610d94906001600160a01b031681565b3480156110b957600080fd5b50610bd06110c83660046135ef565b600e6020526000908152604090205460ff1681565b3480156110e957600080fd5b50601554610bd090600160a01b900460ff1681565b34801561110a57600080fd5b50610c00611119366004613613565b611767565b34801561112a57600080fd5b50610d176111393660046135ef565b611792565b34801561114a57600080fd5b50610d176111593660046135d6565b61180b565b600061116a828461368d565b90505b92915050565b600061116a82846136a4565b600061116a82846134ca565b6001600160a01b0381166000818152601760209081526040918290206001810154835194855291840191909152917f2a5c3ee768d1c9d9e961d2a5461ad9e60b0182d849dfa1219c72416682c1b4fe910160405180910390a1600060018201819055600682018190556004820181905560058201819055600282015560038101541561122d57806003015460096000828254611227919061347d565b90915550505b600060039091015550565b6005805460ff60a01b1916600160a01b179055604080516002808252606082018352600092839291906020830190803683375050600b5482519293506001600160a01b03169183915060009061129057611290613490565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106112c4576112c4613490565b6001600160a01b039283166020918202929092010152600a546010546040516338ed173960e01b8152918316926338ed1739926113109288926000928892909116904290600401613720565b600060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b50506010546001600160a01b0316600081815260208190526040902054925061136991503083611963565b6005805460ff60a01b191690559392505050565b60606003805461138c9061375c565b80601f01602080910402602001604051908101604052809291908181526020018280546113b89061375c565b80156114055780601f106113da57610100808354040283529160200191611405565b820191906000526020600020905b8154815290600101906020018083116113e857829003601f168201915b5050505050905090565b60003361141d818585611b09565b5060019392505050565b6006818154811061143757600080fd5b600091825260209091200154905081565b611450611c2d565b6013546008546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161148591309186916004016134a6565b600060405180830381600087803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b5050505050565b6000336114c8858285611c87565b6114d3858585611cfb565b506001949350505050565b60003361141d8185856114f18383611767565b6114fb919061347d565b611b09565b6007818154811061143757600080fd5b611518611c2d565b6115226000611f6f565b565b60606004805461138c9061375c565b6014546001600160a01b031633146115895760405162461bcd60e51b8152602060048201526019602482015278212a2416a2a92199181d1032b939103832b936b4b9b9b4b7b760391b60448201526064016102bb565b601554600160b01b900460ff16156115db5760405162461bcd60e51b81526020600482015260156024820152744254482d45524332303a206572722073746174757360581b60448201526064016102bb565b6015805460ff60b01b1916600160b01b179055565b600033816115fe8286611767565b90508381101561165e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016102bb565b6114d38286868403611b09565b60003361141d818585611cfb565b611681611c2d565b601554600160a01b900460ff16156116db5760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a20696e7669746572207374617274656400000000000060448201526064016102bb565b6015805460ff60a01b1916600160a01b179055565b6116f8611c2d565b601554600160a81b900460ff16156117525760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a20696e7669746572207374617274656400000000000060448201526064016102bb565b6015805460ff60a81b1916600160a81b179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61179a611c2d565b6001600160a01b0381166117ff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102bb565b61180881611f6f565b50565b8060095410156118555760405162461bcd60e51b81526020600482015260156024820152741095120b515490cc8c0e88195c9c88185b5bdd5b9d605a1b60448201526064016102bb565b6014546001600160a01b031633146118ab5760405162461bcd60e51b8152602060048201526019602482015278212a2416a2a92199181d1032b939103832b936b4b9b9b4b7b760391b60448201526064016102bb565b600b54600a5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611901573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119259190613796565b50600a546119409030906001600160a01b0316600019611b09565b61194981611fc1565b806009600082825461195b91906134ca565b909155505050565b6001600160a01b0383166119c75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016102bb565b6001600160a01b038216611a295760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016102bb565b6001600160a01b03831660009081526020819052604090205481811015611aa15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016102bb565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b6001600160a01b038316611b6b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016102bb565b6001600160a01b038216611bcc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016102bb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146115225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bb565b6000611c938484611767565b90506000198114611b035781811015611cee5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016102bb565b611b038484848403611b09565b816001600160a01b0316836001600160a01b031603611d5c5760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a206d7573742066726f6d20213d20746f00000000000060448201526064016102bb565b60008111611dac5760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a206d75737420616d6f756e74203e203000000000000060448201526064016102bb565b600554600160a01b900460ff1680611e1457506001600160a01b0383166000908152600e602052604090205460ff1680611dfe57506001600160a01b0382166000908152600e602052604090205460ff165b8015611e145750601554600160a01b900460ff16155b15611e2957611e24838383611963565b505050565b6001600160a01b0383166000908152600f602052604090205460ff1615611edf57601554600160b01b900460ff16611ea35760405162461bcd60e51b815260206004820152601c60248201527f4254482d45524332303a2053776170204254482044697361626c65640000000060448201526064016102bb565b6000611eb0826014611173565b601154909150611ecb9085906001600160a01b031683611963565b611b038484611eda858561117f565b611963565b6001600160a01b0382166000908152600f602052604090205460ff1615611f30576000611f0d826014611173565b601154909150611f289085906001600160a01b031683611963565b611ecb61238b565b823b158015611f4757506001600160a01b03821630145b15611f5a57611f5583612829565b611f64565b611f648383612b52565b611e24838383611963565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60135460085460405163133f757160e31b81526004810191909152600091829182916001600160a01b0316906399fbab889060240161018060405180830381865afa158015612014573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203891906137e8565b50506015546040516374f31d7b60e11b81527336696169c63e42cd08ce11f5deebbcebae6520506004820152600287810b602483015286900b60448201526001600160801b0385166064820152959d50939b5091995060009850506001600160a01b03909116955063e9e63af694505060840191506120b49050565b6040805180830381865afa1580156120d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f491906138c9565b91505084811015801561211057506000826001600160801b0316115b61215c5760405162461bcd60e51b815260206004820152601e60248201527f4254482d45524332303a2020496e73756666696369656e742066756e6473000060448201526064016102bb565b6000816121726001600160801b0385168861368d565b61217c91906136a4565b9050600061218b8260016138ed565b9050836001600160801b0316816001600160801b031611156121aa5750825b6013546040805160a08101825260085481526001600160801b038481166020830190815260008385018181526060850182815242608087019081529651630624e65f60e11b81529551600487015292519093166024850152915160448401525160648301529151608482015290916001600160a01b031690630c49ccbe9060a40160408051808303816000875af1158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d91906138c9565b915050600081116122c05760405162461bcd60e51b815260206004820181905260248201527f4254482d45524332303a20496e73756666696369656e7420706f736974696f6e60448201526064016102bb565b60135460408051608081018252600854815230602082019081526001600160801b0382840181815260608401828152945163fc6f786560e01b81529351600485015291516001600160a01b0390811660248501529151811660448401529251909216606482015291169063fc6f78659060840160408051808303816000875af1158015612351573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237591906138c9565b505061238081611238565b505050505050505050565b6005805460ff60a01b1916600160a01b1790556011546001600160a01b0316600081815260208190526040902054906123c5903083611963565b6123d73061dead611eda846005611173565b60006123e9600561047784600361115e565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061242357612423613490565b6001600160a01b039283166020918202929092010152600b5482519116908290600190811061245457612454613490565b6001600160a01b039283166020918202929092010152600a546010546040516338ed173960e01b8152918316926338ed1739926124a09287926000928892909116904290600401613720565b600060405180830381600087803b1580156124ba57600080fd5b505af11580156124ce573d6000803e3d6000fd5b5050600b546010546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015612521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125459190613914565b601054600b54604051636ce5768960e11b81529293506001600160a01b039182169263d9caed129261257f921690309086906004016134a6565b600060405180830381600087803b15801561259957600080fd5b505af11580156125ad573d6000803e3d6000fd5b5050600a54600b546001600160a01b03918216935063e8e3370092501630846125d7896005611173565b6040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260006084820181905260a48201527366add9dd2dc3aaaff708beadb1219a5305c7c10e60c48201524260e4820152610104016060604051808303816000875af115801561265f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612683919061392d565b5050600b546040516370a0823160e01b81523060048201526001600160a01b0390911691506370a0823190602401602060405180830381865afa1580156126ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f29190613914565b600b54604051632e1a7d4d60e01b8152600481018390529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561273957600080fd5b505af115801561274d573d6000803e3d6000fd5b50505050600061276760028361117390919063ffffffff16565b60405190915073cad734be9ecaa4a90db7a5e857701c106d4b90d99082156108fc029083906000818181858888f193505050501580156127ab573d6000803e3d6000fd5b50600d60009054906101000a90046001600160a01b03166001600160a01b031663b60d4288826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156127fc57600080fd5b505af1158015612810573d6000803e3d6000fd5b50506005805460ff60a01b191690555050505050505050565b336001600160a01b0382168114801561284a57506001600160a01b03811632145b61288f5760405162461bcd60e51b81526020600482015260166024820152754254482d45524332303a20426f74205761726e696e6760501b60448201526064016102bb565b6001600160a01b03821660009081526017602052604090206001810154806129085760405162461bcd60e51b815260206004820152602660248201527f4254482d45524332303a20496e73756666696369656e74204465706f73697420604482015265105b5bdd5b9d60d21b60648201526084016102bb565b6000826006015411801561292b575060068201546129289061708061347d565b43115b6129835760405162461bcd60e51b815260206004820152602360248201527f4254482d45524332303a20496e73756666696369656e74205265776172642054604482015262696d6560e81b60648201526084016102bb565b60006129a261708061047785600601544361117f90919063ffffffff16565b905060006129c16103e8610477600f6129bb878761115e565b9061115e565b905060006129dc856005015483612e0f90919063ffffffff16565b600386015490915015612a2f5760048501546000906129fb908561115e565b90508560030154811115612a10575060038501545b612a1981611fc1565b6003860154612a28908261117f565b6003870155505b84600201548110612ab4576000612a498660020154612e1b565b9050612a56308983611963565b6002860154604080516001600160a01b038b168152602081019290925281018290527f02a6a2be713fedf52f113c0a759f1c1a23a113476d9b1b1a2a453c910660de4e9060600160405180910390a1612aae8861118b565b50612b32565b6000612abf82612e1b565b9050612acc308983611963565b6002860154612adb908361117f565b6002870155436006870155604080516001600160a01b038a168152602081018490529081018290527f02a6a2be713fedf52f113c0a759f1c1a23a113476d9b1b1a2a453c910660de4e9060600160405180910390a1505b8454612b499088906001600160a01b031684612f43565b50505050505050565b600060176000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806101200160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815250509050600060176000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806101200160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815250509050612cc4843b151590565b80612ccf5750823b15155b80612ce45750601554600160a81b900460ff16155b15612cef5750505050565b80516001600160a01b0316158015612d10575081516001600160a01b031615155b15612d4b5750506001600160a01b0391821660009081526016602090815260408083209390941682529190915220805460ff19166001179055565b81516001600160a01b0316158015612d6c575080516001600160a01b031615155b8015612d9d57506001600160a01b0380841660009081526016602090815260408083209388168352929052205460ff165b15611b03576001600160a01b0384811660008181526017602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527f9e1d21960b45ed875cc138c8defc17d63422807cf3e78660e198ccb2dbf2a791910160405180910390a150505050565b600061116a828461347d565b604080516002808252606082018352600092839291906020830190803683375050600b5482519293506001600160a01b031691839150600090612e6057612e60613490565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612e9457612e94613490565b6001600160a01b039283166020918202929092010152600a5460405163d06ca61f60e01b8152600092919091169063d06ca61f90612ed8908790869060040161395b565b600060405180830381865afa158015612ef5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f1d919081019061397c565b905080600181518110612f3257612f32613490565b602002602001015192505050919050565b60006007805480602002602001604051908101604052809291908181526020018280548015612f9157602002820191906000526020600020905b815481526020019060010190808311612f7d575b505050505090506000805b60328160ff16101561345f576001600160a01b0385161561345f576001600160a01b03851660009081526017602052604081206002810154909103612fe1575061344d565b600a8260ff16108015612ffa575080600701548260ff16105b801561300a575060008160010154115b156130a15760006130456064610477878660ff168151811061302e5761302e613490565b60200260200101518961115e90919063ffffffff16565b90508082600501600082825461305b919061347d565b90915550506040517f4edb2540f973940fec64742f3f2dfafa9de29f469dad2974e9d5205a649a784d90613097908a908a908590600190613a3a565b60405180910390a1505b600069152d02c7e14af680000082600801541061313a5760646130c58560326134ca565b6130cf908861368d565b6130d991906136a4565b9050808260050160008282546130ef919061347d565b90915550506040517f4edb2540f973940fec64742f3f2dfafa9de29f469dad2974e9d5205a649a784d9061312b908a908a908590600090613a3a565b60405180910390a1505061345f565b690a968163f0a57b4000008260080154101580156131585750602d84105b1561318957606461316a85602d6134ca565b613174908861368d565b61317e91906136a4565b9050602d93506133e0565b69043c33c19375648000008260080154101580156131a75750602884105b156131d85760646131b98560286134ca565b6131c3908861368d565b6131cd91906136a4565b9050602893506133e0565b69021e19e0c9bab24000008260080154101580156131f65750602384105b156132275760646132088560236134ca565b613212908861368d565b61321c91906136a4565b9050602393506133e0565b69010f0cf064dd592000008260080154101580156132455750601e84105b1561327657606461325785601e6134ca565b613261908861368d565b61326b91906136a4565b9050601e93506133e0565b686c6b935b8bbd4000008260080154101580156132935750601984105b156132c45760646132a58560196134ca565b6132af908861368d565b6132b991906136a4565b9050601993506133e0565b683635c9adc5dea000008260080154101580156132e15750601484105b156133125760646132f38560146134ca565b6132fd908861368d565b61330791906136a4565b9050601493506133e0565b681b1ae4d6e2ef50000082600801541015801561332f5750600f84105b1561336057606461334185600f6134ca565b61334b908861368d565b61335591906136a4565b9050600f93506133e0565b680ad78ebc5ac620000082600801541015801561337d5750600a84105b156133ae57606461338f85600a6134ca565b613399908861368d565b6133a391906136a4565b9050600a93506133e0565b6802b5e3af16b18800008260080154101580156133c9575083155b156133e0576133d96014876136a4565b9050600593505b801561343f57808260050160008282546133fa919061347d565b90915550506040517f4edb2540f973940fec64742f3f2dfafa9de29f469dad2974e9d5205a649a784d90613436908a908a908590600090613a3a565b60405180910390a15b50546001600160a01b031694505b8061345781613a63565b915050612f9c565b505050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561116d5761116d613467565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b8181038181111561116d5761116d613467565b6000600182016134ef576134ef613467565b5060010190565b80516001600160801b038116811461350d57600080fd5b919050565b60008060006060848603121561352757600080fd5b613530846134f6565b925060208401519150604084015190509250925092565b600060208083528351808285015260005b8181101561357457858101830151858201604001528201613558565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461180857600080fd5b600080604083850312156135bd57600080fd5b82356135c881613595565b946020939093013593505050565b6000602082840312156135e857600080fd5b5035919050565b60006020828403121561360157600080fd5b813561360c81613595565b9392505050565b6000806040838503121561362657600080fd5b823561363181613595565b9150602083013561364181613595565b809150509250929050565b60008060006060848603121561366157600080fd5b833561366c81613595565b9250602084013561367c81613595565b929592945050506040919091013590565b808202811582820484141761116d5761116d613467565b6000826136c157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600081518084526020808501945080840160005b838110156137155781516001600160a01b0316875295820195908201906001016136f0565b509495945050505050565b85815284602082015260a06040820152600061373f60a08301866136dc565b6001600160a01b0394909416606083015250608001529392505050565b600181811c9082168061377057607f821691505b60208210810361379057634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156137a857600080fd5b8151801515811461360c57600080fd5b805161350d81613595565b805162ffffff8116811461350d57600080fd5b8051600281900b811461350d57600080fd5b6000806000806000806000806000806000806101808d8f03121561380b57600080fd5b8c516bffffffffffffffffffffffff8116811461382757600080fd5b9b5061383560208e016137b8565b9a5061384360408e016137b8565b995061385160608e016137b8565b985061385f60808e016137c3565b975061386d60a08e016137d6565b965061387b60c08e016137d6565b955061388960e08e016134f6565b94506101008d015193506101208d015192506138a86101408e016134f6565b91506138b76101608e016134f6565b90509295989b509295989b509295989b565b600080604083850312156138dc57600080fd5b505080516020909101519092909150565b6001600160801b0381811683821601908082111561390d5761390d613467565b5092915050565b60006020828403121561392657600080fd5b5051919050565b60008060006060848603121561394257600080fd5b8351925060208401519150604084015190509250925092565b82815260406020820152600061397460408301846136dc565b949350505050565b6000602080838503121561398f57600080fd5b825167ffffffffffffffff808211156139a757600080fd5b818501915085601f8301126139bb57600080fd5b8151818111156139cd576139cd6136c6565b8060051b604051601f19603f830116810181811085821117156139f2576139f26136c6565b604052918252848201925083810185019188831115613a1057600080fd5b938501935b82851015613a2e57845184529385019392850192613a15565b98975050505050505050565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b600060ff821660ff8103613a7957613a79613467565b6001019291505056fef308a723e9c47ac8fbcb789c52b746d3397b6b14344ad5ac9f9d60dee1092610a264697066735822122093924a797fc22ef785c934c77ad4a415bda629d709fb318279927404af7ba0ef64736f6c63430008130033608060405234801561001057600080fd5b5060405161026738038061026783398101604081905261002f91610054565b600080546001600160a01b0319166001600160a01b0392909216919091179055610084565b60006020828403121561006657600080fd5b81516001600160a01b038116811461007d57600080fd5b9392505050565b6101d4806100936000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063d9caed1214610030575b600080fd5b61004361003e366004610134565b610045565b005b6000546001600160a01b031633146100a35760405162461bcd60e51b815260206004820152601860248201527f4175746f537761703a207065726d697373696f6e206572720000000000000000604482015260640160405180910390fd5b60405163a9059cbb60e01b81526001600160a01b0383811660048301526024820183905284169063a9059cbb906044016020604051808303816000875af11580156100f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101169190610175565b50505050565b6001600160a01b038116811461013157600080fd5b50565b60008060006060848603121561014957600080fd5b83356101548161011c565b925060208401356101648161011c565b929592945050506040919091013590565b60006020828403121561018757600080fd5b8151801515811461019757600080fd5b939250505056fea2646970667358221220c5dc3940315c435c6beabfca4959bfa711b1f5b385ee48cabed45e61bb615dba64736f6c63430008130033

Deployed Bytecode

0x60806040526004361061023f5760003560e01c8063770048511161012e578063bb67e7b7116100ab578063dcace9ab1161006f578063dcace9ab146110ad578063dccacf43146110dd578063dd62ed3e146110fe578063f2fde38b1461111e578063fbef6d171461113e57600080fd5b8063bb67e7b714611017578063c54e44eb14611038578063c8d9928114611058578063d5009f921461106d578063d52dd8901461108d57600080fd5b8063a457c2d7116100f2578063a457c2d714610f72578063a9059cbb14610f92578063ad5c464814610fb2578063b3892c6414610fd2578063b62496f514610fe757600080fd5b80637700485114610ef45780638b35eba814610f145780638da5cb5b14610f2a57806395d89b4114610f48578063a335239b14610f5d57600080fd5b8063313ce567116101bc5780634dc32eff116101805780634dc32eff14610e4957806370a0823114610e69578063715018a614610e9f57806371c3e4bb14610eb457806373f2e22d14610ed457600080fd5b8063313ce56714610dac5780633351c43114610dc85780633950935114610de957806341fbb05014610e0957806347a4f02814610e2957600080fd5b80631959a002116102035780631959a00214610c395780631ac2827114610cf75780631cef38b214610d1957806323b872dd14610d545780632874e21714610d7457600080fd5b806306fdde0314610b85578063095ea7b314610bb0578063173b034c14610be057806317d70f7c14610c0e57806318160ddd14610c2457600080fd5b36610b80573334813b1515808061025f5750326001600160a01b03841614155b1561026657005b601554600160a01b900460ff166102c45760405162461bcd60e51b815260206004820152601760248201527f4254482d45524332303a204e6f7420796574206f70656e00000000000000000060448201526064015b60405180910390fd5b6001600160a01b038316600090815260176020526040902060018101541580156102f057506002810154155b61033c5760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a204465706f736974206578736973747300000000000060448201526064016102bb565b670de0b6b3a764000083101561038c5760405162461bcd60e51b8152602060048201526015602482015274084a8905a8aa48664607440e0c2e6e6406240cae8d605b1b60448201526064016102bb565b80546001600160a01b031680156108a9576001600160a01b038116600090815260176020526040812060078101805491926001926103cb90849061347d565b92505081905550848160080160008282546103e6919061347d565b925050819055506000600680548060200260200160405190810160405280929190818152602001828054801561043b57602002820191906000526020600020905b815481526020019060010190808311610427575b50505050509050600061047d6103e86104778460008151811061046057610460613490565b60200260200101518a61115e90919063ffffffff16565b90611173565b90508260020154811061054b5760028301546040516001600160a01b0386169180156108fc02916000818181858888f193505050501580156104c3573d6000803e3d6000fd5b5060145460028401546001600160a01b03909116906108fc906104e790849061117f565b6040518115909202916000818181858888f1935050505015801561050f573d6000803e3d6000fd5b50600080516020613a8383398151915288858560020154604051610535939291906134a6565b60405180910390a16105468461118b565b6105c6565b6040516001600160a01b0385169082156108fc029083906000818181858888f19350505050158015610581573d6000803e3d6000fd5b508083600201600082825461059691906134ca565b9091555050604051600080516020613a83833981519152906105bd908a90879085906134a6565b60405180910390a15b60015b600581101561084057835483516001600160a01b039091169550610618906103e8906104779086908590811061060157610601613490565b60200260200101518b61115e90919063ffffffff16565b91506001600160a01b038516610668576014546040516001600160a01b039091169083156108fc029084906000818181858888f19350505050158015610662573d6000803e3d6000fd5b5061082e565b6001600160a01b03851660009081526017602052604081206008810180549196508a92909161069890849061347d565b90915550506002840154156107f257836002015482106107735760028401546040516001600160a01b0387169180156108fc02916000818181858888f193505050501580156106eb573d6000803e3d6000fd5b5060145460028501546001600160a01b03909116906108fc9061070f90859061117f565b6040518115909202916000818181858888f19350505050158015610737573d6000803e3d6000fd5b50600080516020613a838339815191528986866002015460405161075d939291906134a6565b60405180910390a161076e8561118b565b61082e565b6040516001600160a01b0386169083156108fc029084906000818181858888f193505050501580156107a9573d6000803e3d6000fd5b50818460020160008282546107be91906134ca565b9091555050604051600080516020613a83833981519152906107e5908b90889086906134a6565b60405180910390a161082e565b6014546040516001600160a01b039091169083156108fc029084906000818181858888f1935050505015801561082c573d6000803e3d6000fd5b505b80610838816134dd565b9150506105c9565b5060005b60328110156108a4576001600160a01b038516156108a45787846008016000828254610870919061347d565b909155505092546001600160a01b03166000818152601760205260409020909450928061089c816134dd565b915050610844565b505050505b600182018490556108c0606461047786604f61115e565b60038301556108d5606461047786609661115e565b60028301556108e5846064611173565b6004808401829055436006850155600b5460408051630d0e30db60e41b815290516001600160a01b039092169363d0e30db0939092828201926000929082900301818588803b15801561093757600080fd5b505af115801561094b573d6000803e3d6000fd5b505050505061095d8260040154611238565b50600d546001600160a01b031663b60d428861097a86600a611173565b6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156109a557600080fd5b505af11580156109b9573d6000803e3d6000fd5b507357c8e60641f283fa40098189f9241dd6ea4a932993506108fc92506109e591508790506014611173565b6040518115909202916000818181858888f19350505050158015610a0d573d6000803e3d6000fd5b50478015610b3c576013546040805160c081018252600854815260006020820181815282840186815260608401838152608085018881524260a08701908152965163219f5d1760e01b8152955160048701529251602486015290516044850152516064840152516084830152915160a4820152909182916001600160a01b039091169063219f5d1790859060c40160606040518083038185885af1158015610ab9573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ade9190613512565b92505091506000826001600160801b0316118015610afb57508281145b610b395760405162461bcd60e51b815260206004820152600f60248201526e2232b837b9b4ba2b199022b93937b960891b60448201526064016102bb565b50505b604080516001600160a01b0388168152602081018790527fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c910160405180910390a1005b600080fd5b348015610b9157600080fd5b50610b9a61137d565b604051610ba79190613547565b60405180910390f35b348015610bbc57600080fd5b50610bd0610bcb3660046135aa565b61140f565b6040519015158152602001610ba7565b348015610bec57600080fd5b50610c00610bfb3660046135d6565b611427565b604051908152602001610ba7565b348015610c1a57600080fd5b50610c0060085481565b348015610c3057600080fd5b50600254610c00565b348015610c4557600080fd5b50610ca9610c543660046135ef565b6017602052600090815260409020805460018201546002830154600384015460048501546005860154600687015460078801546008909801546001600160a01b03909716979596949593949293919290919089565b604080516001600160a01b03909a168a5260208a0198909852968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610ba7565b348015610d0357600080fd5b50610d17610d123660046135ef565b611448565b005b348015610d2557600080fd5b50610bd0610d34366004613613565b601660209081526000928352604080842090915290825290205460ff1681565b348015610d6057600080fd5b50610bd0610d6f36600461364c565b6114ba565b348015610d8057600080fd5b50601454610d94906001600160a01b031681565b6040516001600160a01b039091168152602001610ba7565b348015610db857600080fd5b5060405160128152602001610ba7565b348015610dd457600080fd5b50601554610bd090600160b01b900460ff1681565b348015610df557600080fd5b50610bd0610e043660046135aa565b6114de565b348015610e1557600080fd5b50601254610d94906001600160a01b031681565b348015610e3557600080fd5b50610c00610e443660046135d6565b611500565b348015610e5557600080fd5b50600a54610d94906001600160a01b031681565b348015610e7557600080fd5b50610c00610e843660046135ef565b6001600160a01b031660009081526020819052604090205490565b348015610eab57600080fd5b50610d17611510565b348015610ec057600080fd5b50601154610d94906001600160a01b031681565b348015610ee057600080fd5b50600d54610d94906001600160a01b031681565b348015610f0057600080fd5b50601054610d94906001600160a01b031681565b348015610f2057600080fd5b50610c0060095481565b348015610f3657600080fd5b506005546001600160a01b0316610d94565b348015610f5457600080fd5b50610b9a611524565b348015610f6957600080fd5b50610d17611533565b348015610f7e57600080fd5b50610bd0610f8d3660046135aa565b6115f0565b348015610f9e57600080fd5b50610bd0610fad3660046135aa565b61166b565b348015610fbe57600080fd5b50600b54610d94906001600160a01b031681565b348015610fde57600080fd5b50610d17611679565b348015610ff357600080fd5b50610bd06110023660046135ef565b600f6020526000908152604090205460ff1681565b34801561102357600080fd5b50601554610bd090600160a81b900460ff1681565b34801561104457600080fd5b50600c54610d94906001600160a01b031681565b34801561106457600080fd5b50610d176116f0565b34801561107957600080fd5b50601354610d94906001600160a01b031681565b34801561109957600080fd5b50601554610d94906001600160a01b031681565b3480156110b957600080fd5b50610bd06110c83660046135ef565b600e6020526000908152604090205460ff1681565b3480156110e957600080fd5b50601554610bd090600160a01b900460ff1681565b34801561110a57600080fd5b50610c00611119366004613613565b611767565b34801561112a57600080fd5b50610d176111393660046135ef565b611792565b34801561114a57600080fd5b50610d176111593660046135d6565b61180b565b600061116a828461368d565b90505b92915050565b600061116a82846136a4565b600061116a82846134ca565b6001600160a01b0381166000818152601760209081526040918290206001810154835194855291840191909152917f2a5c3ee768d1c9d9e961d2a5461ad9e60b0182d849dfa1219c72416682c1b4fe910160405180910390a1600060018201819055600682018190556004820181905560058201819055600282015560038101541561122d57806003015460096000828254611227919061347d565b90915550505b600060039091015550565b6005805460ff60a01b1916600160a01b179055604080516002808252606082018352600092839291906020830190803683375050600b5482519293506001600160a01b03169183915060009061129057611290613490565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106112c4576112c4613490565b6001600160a01b039283166020918202929092010152600a546010546040516338ed173960e01b8152918316926338ed1739926113109288926000928892909116904290600401613720565b600060405180830381600087803b15801561132a57600080fd5b505af115801561133e573d6000803e3d6000fd5b50506010546001600160a01b0316600081815260208190526040902054925061136991503083611963565b6005805460ff60a01b191690559392505050565b60606003805461138c9061375c565b80601f01602080910402602001604051908101604052809291908181526020018280546113b89061375c565b80156114055780601f106113da57610100808354040283529160200191611405565b820191906000526020600020905b8154815290600101906020018083116113e857829003601f168201915b5050505050905090565b60003361141d818585611b09565b5060019392505050565b6006818154811061143757600080fd5b600091825260209091200154905081565b611450611c2d565b6013546008546040516323b872dd60e01b81526001600160a01b03909216916323b872dd9161148591309186916004016134a6565b600060405180830381600087803b15801561149f57600080fd5b505af11580156114b3573d6000803e3d6000fd5b5050505050565b6000336114c8858285611c87565b6114d3858585611cfb565b506001949350505050565b60003361141d8185856114f18383611767565b6114fb919061347d565b611b09565b6007818154811061143757600080fd5b611518611c2d565b6115226000611f6f565b565b60606004805461138c9061375c565b6014546001600160a01b031633146115895760405162461bcd60e51b8152602060048201526019602482015278212a2416a2a92199181d1032b939103832b936b4b9b9b4b7b760391b60448201526064016102bb565b601554600160b01b900460ff16156115db5760405162461bcd60e51b81526020600482015260156024820152744254482d45524332303a206572722073746174757360581b60448201526064016102bb565b6015805460ff60b01b1916600160b01b179055565b600033816115fe8286611767565b90508381101561165e5760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016102bb565b6114d38286868403611b09565b60003361141d818585611cfb565b611681611c2d565b601554600160a01b900460ff16156116db5760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a20696e7669746572207374617274656400000000000060448201526064016102bb565b6015805460ff60a01b1916600160a01b179055565b6116f8611c2d565b601554600160a81b900460ff16156117525760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a20696e7669746572207374617274656400000000000060448201526064016102bb565b6015805460ff60a81b1916600160a81b179055565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61179a611c2d565b6001600160a01b0381166117ff5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016102bb565b61180881611f6f565b50565b8060095410156118555760405162461bcd60e51b81526020600482015260156024820152741095120b515490cc8c0e88195c9c88185b5bdd5b9d605a1b60448201526064016102bb565b6014546001600160a01b031633146118ab5760405162461bcd60e51b8152602060048201526019602482015278212a2416a2a92199181d1032b939103832b936b4b9b9b4b7b760391b60448201526064016102bb565b600b54600a5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af1158015611901573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119259190613796565b50600a546119409030906001600160a01b0316600019611b09565b61194981611fc1565b806009600082825461195b91906134ca565b909155505050565b6001600160a01b0383166119c75760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016102bb565b6001600160a01b038216611a295760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016102bb565b6001600160a01b03831660009081526020819052604090205481811015611aa15760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016102bb565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35b50505050565b6001600160a01b038316611b6b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016102bb565b6001600160a01b038216611bcc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016102bb565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6005546001600160a01b031633146115225760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016102bb565b6000611c938484611767565b90506000198114611b035781811015611cee5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016102bb565b611b038484848403611b09565b816001600160a01b0316836001600160a01b031603611d5c5760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a206d7573742066726f6d20213d20746f00000000000060448201526064016102bb565b60008111611dac5760405162461bcd60e51b815260206004820152601a60248201527f4254482d45524332303a206d75737420616d6f756e74203e203000000000000060448201526064016102bb565b600554600160a01b900460ff1680611e1457506001600160a01b0383166000908152600e602052604090205460ff1680611dfe57506001600160a01b0382166000908152600e602052604090205460ff165b8015611e145750601554600160a01b900460ff16155b15611e2957611e24838383611963565b505050565b6001600160a01b0383166000908152600f602052604090205460ff1615611edf57601554600160b01b900460ff16611ea35760405162461bcd60e51b815260206004820152601c60248201527f4254482d45524332303a2053776170204254482044697361626c65640000000060448201526064016102bb565b6000611eb0826014611173565b601154909150611ecb9085906001600160a01b031683611963565b611b038484611eda858561117f565b611963565b6001600160a01b0382166000908152600f602052604090205460ff1615611f30576000611f0d826014611173565b601154909150611f289085906001600160a01b031683611963565b611ecb61238b565b823b158015611f4757506001600160a01b03821630145b15611f5a57611f5583612829565b611f64565b611f648383612b52565b611e24838383611963565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60135460085460405163133f757160e31b81526004810191909152600091829182916001600160a01b0316906399fbab889060240161018060405180830381865afa158015612014573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061203891906137e8565b50506015546040516374f31d7b60e11b81527336696169c63e42cd08ce11f5deebbcebae6520506004820152600287810b602483015286900b60448201526001600160801b0385166064820152959d50939b5091995060009850506001600160a01b03909116955063e9e63af694505060840191506120b49050565b6040805180830381865afa1580156120d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120f491906138c9565b91505084811015801561211057506000826001600160801b0316115b61215c5760405162461bcd60e51b815260206004820152601e60248201527f4254482d45524332303a2020496e73756666696369656e742066756e6473000060448201526064016102bb565b6000816121726001600160801b0385168861368d565b61217c91906136a4565b9050600061218b8260016138ed565b9050836001600160801b0316816001600160801b031611156121aa5750825b6013546040805160a08101825260085481526001600160801b038481166020830190815260008385018181526060850182815242608087019081529651630624e65f60e11b81529551600487015292519093166024850152915160448401525160648301529151608482015290916001600160a01b031690630c49ccbe9060a40160408051808303816000875af1158015612249573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061226d91906138c9565b915050600081116122c05760405162461bcd60e51b815260206004820181905260248201527f4254482d45524332303a20496e73756666696369656e7420706f736974696f6e60448201526064016102bb565b60135460408051608081018252600854815230602082019081526001600160801b0382840181815260608401828152945163fc6f786560e01b81529351600485015291516001600160a01b0390811660248501529151811660448401529251909216606482015291169063fc6f78659060840160408051808303816000875af1158015612351573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061237591906138c9565b505061238081611238565b505050505050505050565b6005805460ff60a01b1916600160a01b1790556011546001600160a01b0316600081815260208190526040902054906123c5903083611963565b6123d73061dead611eda846005611173565b60006123e9600561047784600361115e565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061242357612423613490565b6001600160a01b039283166020918202929092010152600b5482519116908290600190811061245457612454613490565b6001600160a01b039283166020918202929092010152600a546010546040516338ed173960e01b8152918316926338ed1739926124a09287926000928892909116904290600401613720565b600060405180830381600087803b1580156124ba57600080fd5b505af11580156124ce573d6000803e3d6000fd5b5050600b546010546040516370a0823160e01b81526001600160a01b03918216600482015260009450911691506370a0823190602401602060405180830381865afa158015612521573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125459190613914565b601054600b54604051636ce5768960e11b81529293506001600160a01b039182169263d9caed129261257f921690309086906004016134a6565b600060405180830381600087803b15801561259957600080fd5b505af11580156125ad573d6000803e3d6000fd5b5050600a54600b546001600160a01b03918216935063e8e3370092501630846125d7896005611173565b6040516001600160e01b031960e087901b1681526001600160a01b0394851660048201529390921660248401526044830152606482015260006084820181905260a48201527366add9dd2dc3aaaff708beadb1219a5305c7c10e60c48201524260e4820152610104016060604051808303816000875af115801561265f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612683919061392d565b5050600b546040516370a0823160e01b81523060048201526001600160a01b0390911691506370a0823190602401602060405180830381865afa1580156126ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126f29190613914565b600b54604051632e1a7d4d60e01b8152600481018390529192506001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561273957600080fd5b505af115801561274d573d6000803e3d6000fd5b50505050600061276760028361117390919063ffffffff16565b60405190915073cad734be9ecaa4a90db7a5e857701c106d4b90d99082156108fc029083906000818181858888f193505050501580156127ab573d6000803e3d6000fd5b50600d60009054906101000a90046001600160a01b03166001600160a01b031663b60d4288826040518263ffffffff1660e01b81526004016000604051808303818588803b1580156127fc57600080fd5b505af1158015612810573d6000803e3d6000fd5b50506005805460ff60a01b191690555050505050505050565b336001600160a01b0382168114801561284a57506001600160a01b03811632145b61288f5760405162461bcd60e51b81526020600482015260166024820152754254482d45524332303a20426f74205761726e696e6760501b60448201526064016102bb565b6001600160a01b03821660009081526017602052604090206001810154806129085760405162461bcd60e51b815260206004820152602660248201527f4254482d45524332303a20496e73756666696369656e74204465706f73697420604482015265105b5bdd5b9d60d21b60648201526084016102bb565b6000826006015411801561292b575060068201546129289061708061347d565b43115b6129835760405162461bcd60e51b815260206004820152602360248201527f4254482d45524332303a20496e73756666696369656e74205265776172642054604482015262696d6560e81b60648201526084016102bb565b60006129a261708061047785600601544361117f90919063ffffffff16565b905060006129c16103e8610477600f6129bb878761115e565b9061115e565b905060006129dc856005015483612e0f90919063ffffffff16565b600386015490915015612a2f5760048501546000906129fb908561115e565b90508560030154811115612a10575060038501545b612a1981611fc1565b6003860154612a28908261117f565b6003870155505b84600201548110612ab4576000612a498660020154612e1b565b9050612a56308983611963565b6002860154604080516001600160a01b038b168152602081019290925281018290527f02a6a2be713fedf52f113c0a759f1c1a23a113476d9b1b1a2a453c910660de4e9060600160405180910390a1612aae8861118b565b50612b32565b6000612abf82612e1b565b9050612acc308983611963565b6002860154612adb908361117f565b6002870155436006870155604080516001600160a01b038a168152602081018490529081018290527f02a6a2be713fedf52f113c0a759f1c1a23a113476d9b1b1a2a453c910660de4e9060600160405180910390a1505b8454612b499088906001600160a01b031684612f43565b50505050505050565b600060176000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806101200160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815250509050600060176000846001600160a01b03166001600160a01b03168152602001908152602001600020604051806101200160405290816000820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b03168152602001600182015481526020016002820154815260200160038201548152602001600482015481526020016005820154815260200160068201548152602001600782015481526020016008820154815250509050612cc4843b151590565b80612ccf5750823b15155b80612ce45750601554600160a81b900460ff16155b15612cef5750505050565b80516001600160a01b0316158015612d10575081516001600160a01b031615155b15612d4b5750506001600160a01b0391821660009081526016602090815260408083209390941682529190915220805460ff19166001179055565b81516001600160a01b0316158015612d6c575080516001600160a01b031615155b8015612d9d57506001600160a01b0380841660009081526016602090815260408083209388168352929052205460ff165b15611b03576001600160a01b0384811660008181526017602090815260409182902080546001600160a01b031916948816948517905581519283528201929092527f9e1d21960b45ed875cc138c8defc17d63422807cf3e78660e198ccb2dbf2a791910160405180910390a150505050565b600061116a828461347d565b604080516002808252606082018352600092839291906020830190803683375050600b5482519293506001600160a01b031691839150600090612e6057612e60613490565b60200260200101906001600160a01b031690816001600160a01b0316815250503081600181518110612e9457612e94613490565b6001600160a01b039283166020918202929092010152600a5460405163d06ca61f60e01b8152600092919091169063d06ca61f90612ed8908790869060040161395b565b600060405180830381865afa158015612ef5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612f1d919081019061397c565b905080600181518110612f3257612f32613490565b602002602001015192505050919050565b60006007805480602002602001604051908101604052809291908181526020018280548015612f9157602002820191906000526020600020905b815481526020019060010190808311612f7d575b505050505090506000805b60328160ff16101561345f576001600160a01b0385161561345f576001600160a01b03851660009081526017602052604081206002810154909103612fe1575061344d565b600a8260ff16108015612ffa575080600701548260ff16105b801561300a575060008160010154115b156130a15760006130456064610477878660ff168151811061302e5761302e613490565b60200260200101518961115e90919063ffffffff16565b90508082600501600082825461305b919061347d565b90915550506040517f4edb2540f973940fec64742f3f2dfafa9de29f469dad2974e9d5205a649a784d90613097908a908a908590600190613a3a565b60405180910390a1505b600069152d02c7e14af680000082600801541061313a5760646130c58560326134ca565b6130cf908861368d565b6130d991906136a4565b9050808260050160008282546130ef919061347d565b90915550506040517f4edb2540f973940fec64742f3f2dfafa9de29f469dad2974e9d5205a649a784d9061312b908a908a908590600090613a3a565b60405180910390a1505061345f565b690a968163f0a57b4000008260080154101580156131585750602d84105b1561318957606461316a85602d6134ca565b613174908861368d565b61317e91906136a4565b9050602d93506133e0565b69043c33c19375648000008260080154101580156131a75750602884105b156131d85760646131b98560286134ca565b6131c3908861368d565b6131cd91906136a4565b9050602893506133e0565b69021e19e0c9bab24000008260080154101580156131f65750602384105b156132275760646132088560236134ca565b613212908861368d565b61321c91906136a4565b9050602393506133e0565b69010f0cf064dd592000008260080154101580156132455750601e84105b1561327657606461325785601e6134ca565b613261908861368d565b61326b91906136a4565b9050601e93506133e0565b686c6b935b8bbd4000008260080154101580156132935750601984105b156132c45760646132a58560196134ca565b6132af908861368d565b6132b991906136a4565b9050601993506133e0565b683635c9adc5dea000008260080154101580156132e15750601484105b156133125760646132f38560146134ca565b6132fd908861368d565b61330791906136a4565b9050601493506133e0565b681b1ae4d6e2ef50000082600801541015801561332f5750600f84105b1561336057606461334185600f6134ca565b61334b908861368d565b61335591906136a4565b9050600f93506133e0565b680ad78ebc5ac620000082600801541015801561337d5750600a84105b156133ae57606461338f85600a6134ca565b613399908861368d565b6133a391906136a4565b9050600a93506133e0565b6802b5e3af16b18800008260080154101580156133c9575083155b156133e0576133d96014876136a4565b9050600593505b801561343f57808260050160008282546133fa919061347d565b90915550506040517f4edb2540f973940fec64742f3f2dfafa9de29f469dad2974e9d5205a649a784d90613436908a908a908590600090613a3a565b60405180910390a15b50546001600160a01b031694505b8061345781613a63565b915050612f9c565b505050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561116d5761116d613467565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b039384168152919092166020820152604081019190915260600190565b8181038181111561116d5761116d613467565b6000600182016134ef576134ef613467565b5060010190565b80516001600160801b038116811461350d57600080fd5b919050565b60008060006060848603121561352757600080fd5b613530846134f6565b925060208401519150604084015190509250925092565b600060208083528351808285015260005b8181101561357457858101830151858201604001528201613558565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b038116811461180857600080fd5b600080604083850312156135bd57600080fd5b82356135c881613595565b946020939093013593505050565b6000602082840312156135e857600080fd5b5035919050565b60006020828403121561360157600080fd5b813561360c81613595565b9392505050565b6000806040838503121561362657600080fd5b823561363181613595565b9150602083013561364181613595565b809150509250929050565b60008060006060848603121561366157600080fd5b833561366c81613595565b9250602084013561367c81613595565b929592945050506040919091013590565b808202811582820484141761116d5761116d613467565b6000826136c157634e487b7160e01b600052601260045260246000fd5b500490565b634e487b7160e01b600052604160045260246000fd5b600081518084526020808501945080840160005b838110156137155781516001600160a01b0316875295820195908201906001016136f0565b509495945050505050565b85815284602082015260a06040820152600061373f60a08301866136dc565b6001600160a01b0394909416606083015250608001529392505050565b600181811c9082168061377057607f821691505b60208210810361379057634e487b7160e01b600052602260045260246000fd5b50919050565b6000602082840312156137a857600080fd5b8151801515811461360c57600080fd5b805161350d81613595565b805162ffffff8116811461350d57600080fd5b8051600281900b811461350d57600080fd5b6000806000806000806000806000806000806101808d8f03121561380b57600080fd5b8c516bffffffffffffffffffffffff8116811461382757600080fd5b9b5061383560208e016137b8565b9a5061384360408e016137b8565b995061385160608e016137b8565b985061385f60808e016137c3565b975061386d60a08e016137d6565b965061387b60c08e016137d6565b955061388960e08e016134f6565b94506101008d015193506101208d015192506138a86101408e016134f6565b91506138b76101608e016134f6565b90509295989b509295989b509295989b565b600080604083850312156138dc57600080fd5b505080516020909101519092909150565b6001600160801b0381811683821601908082111561390d5761390d613467565b5092915050565b60006020828403121561392657600080fd5b5051919050565b60008060006060848603121561394257600080fd5b8351925060208401519150604084015190509250925092565b82815260406020820152600061397460408301846136dc565b949350505050565b6000602080838503121561398f57600080fd5b825167ffffffffffffffff808211156139a757600080fd5b818501915085601f8301126139bb57600080fd5b8151818111156139cd576139cd6136c6565b8060051b604051601f19603f830116810181811085821117156139f2576139f26136c6565b604052918252848201925083810185019188831115613a1057600080fd5b938501935b82851015613a2e57845184529385019392850192613a15565b98975050505050505050565b6001600160a01b0394851681529290931660208301526040820152901515606082015260800190565b600060ff821660ff8103613a7957613a79613467565b6001019291505056fef308a723e9c47ac8fbcb789c52b746d3397b6b14344ad5ac9f9d60dee1092610a264697066735822122093924a797fc22ef785c934c77ad4a415bda629d709fb318279927404af7ba0ef64736f6c63430008130033

Deployed Bytecode Sourcemap

306:19268:8:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4076:10;4117:9;16359:20;;16407:8;;;;4185:31;;-1:-1:-1;4196:9:8;-1:-1:-1;;;;;4196:19:8;;;;4185:31;4182:68;;;4232:7;4182:68;4268:9;;-1:-1:-1;;;4268:9:8;;;;4260:44;;;;-1:-1:-1;;;4260:44:8;;216:2:9;4260:44:8;;;198:21:9;255:2;235:18;;;228:30;294:25;274:18;;;267:53;337:18;;4260:44:8;;;;;;;;;-1:-1:-1;;;;;4339:16:8;;4317:21;4339:16;;;:8;:16;;;;;4376:14;;;;:18;:41;;;;-1:-1:-1;4396:18:8;;;;:21;4376:41;4368:79;;;;-1:-1:-1;;;4368:79:8;;568:2:9;4368:79:8;;;550:21:9;607:2;587:18;;;580:30;646:28;626:18;;;619:56;692:18;;4368:79:8;366:350:9;4368:79:8;4479:4;4466:9;:17;;4458:50;;;;-1:-1:-1;;;4458:50:8;;923:2:9;4458:50:8;;;905:21:9;962:2;942:18;;;935:30;-1:-1:-1;;;981:18:9;;;974:51;1042:18;;4458:50:8;721:345:9;4458:50:8;4536:12;;-1:-1:-1;;;;;4536:12:8;4572:20;;4569:2419;;-1:-1:-1;;;;;4636:16:8;;4608:27;4636:16;;;:8;:16;;;;;4667:26;;;:29;;4636:16;;4695:1;;4667:29;;4695:1;;4667:29;:::i;:::-;;;;;;;;4734:9;4711:10;:21;;;:32;;;;;;;:::i;:::-;;;;;;;;4760:25;4786:13;4760:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4814:20;4835:36;4866:4;4835:26;4849:8;4858:1;4849:11;;;;;;;;:::i;:::-;;;;;;;4835:9;:13;;:26;;;;:::i;:::-;:30;;:36::i;:::-;4814:57;;4917:10;:24;;;4903:12;:38;4900:525;;4986:24;;;;4961:50;;-1:-1:-1;;;;;4961:24:8;;;:50;;;;;;;;;4986:24;4961;:50;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5038:10:8;;5076:24;;;;-1:-1:-1;;;;;5038:10:8;;;;5030:72;;5059:42;;:12;;:16;:42::i;:::-;5030:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;5138:6:8;5145;5152:10;:24;;;5126:51;;;;;;;;:::i;:::-;;;;;;;;5196:16;5205:6;5196:8;:16::i;:::-;4900:525;;;5251:38;;-1:-1:-1;;;;;5251:24:8;;;:38;;;;;5276:12;;5251:38;;;;5276:12;5251:24;:38;;;;;;;;;;;;;;;;;;;;;5334:12;5308:10;:24;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;5370:39:8;;-1:-1:-1;;;;;;;;;;;5370:39:8;;;5382:6;;5389;;5396:12;;5370:39;:::i;:::-;;;;;;;;4900:525;5452:1;5441:1237;5456:1;5454;:3;5441:1237;;;5488:18;;5552:11;;-1:-1:-1;;;;;5488:18:8;;;;-1:-1:-1;5538:36:8;;5569:4;;5538:26;;5552:8;;5561:1;;5552:11;;;;;;:::i;:::-;;;;;;;5538:9;:13;;:26;;;;:::i;:36::-;5525:49;-1:-1:-1;;;;;;5598:20:8;;5595:140;;5650:10;;5642:42;;-1:-1:-1;;;;;5650:10:8;;;;5642:42;;;;;5671:12;;5650:10;5642:42;5650:10;5642:42;5671:12;5650:10;5642:42;;;;;;;;;;;;;;;;;;;;;5707:8;;5595:140;-1:-1:-1;;;;;5782:16:8;;;;;;:8;:16;;;;;5817:21;;;:32;;5782:16;;-1:-1:-1;5840:9:8;;5817:21;;:32;;5840:9;;5817:32;:::i;:::-;;;;-1:-1:-1;;5889:24:8;;;;:26;5886:759;;5956:10;:24;;;5942:12;:38;5939:598;;6033:24;;;;6008:50;;-1:-1:-1;;;;;6008:24:8;;;:50;;;;;;;;;6033:24;6008;:50;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6094:10:8;;6132:24;;;;-1:-1:-1;;;;;6094:10:8;;;;6085:73;;6115:42;;:12;;:16;:42::i;:::-;6085:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;6202:6:8;6209;6216:10;:24;;;6190:51;;;;;;;;:::i;:::-;;;;;;;;6268:16;6277:6;6268:8;:16::i;:::-;5886:759;;5939:598;6339:38;;-1:-1:-1;;;;;6339:24:8;;;:38;;;;;6364:12;;6339:38;;;;6364:12;6339:24;:38;;;;;;;;;;;;;;;;;;;;;6430:12;6404:10;:24;;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;6474:39:8;;-1:-1:-1;;;;;;;;;;;6474:39:8;;;6486:6;;6493;;6500:12;;6474:39;:::i;:::-;;;;;;;;5886:759;;;6591:10;;6583:42;;-1:-1:-1;;;;;6591:10:8;;;;6583:42;;;;;6612:12;;6591:10;6583:42;6591:10;6583:42;6612:12;6591:10;6583:42;;;;;;;;;;;;;;;;;;;;;5886:759;5458:3;;;;:::i;:::-;;;;5441:1237;;;;6706:9;6702:275;6720:2;6718:1;:4;6702:275;;;-1:-1:-1;;;;;6749:19:8;;6746:71;6792:5;6746:71;6860:9;6837:10;:21;;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;;6897:18:8;;-1:-1:-1;;;;;6897:18:8;;6945:16;;;:8;:16;;;;;6897:18;;-1:-1:-1;6945:16:8;6723:3;;;;:::i;:::-;;;;6702:275;;;;4593:2395;;;4569:2419;7000:14;;;:24;;;7059:26;7081:3;7059:17;7015:9;7073:2;7059:13;:17::i;:26::-;7035:23;;;:50;7120:27;7143:3;7120:18;:9;7134:3;7120:13;:18::i;:27::-;7101:18;;;:46;7175:18;:9;7189:3;7175:13;:18::i;:::-;7158:16;;;;:35;;;7226:12;7205:20;;;:33;7251:4;;:38;;;-1:-1:-1;;;7251:38:8;;;;-1:-1:-1;;;;;7251:4:8;;;;:12;;7158:35;;7251:38;;;;-1:-1:-1;;7251:38:8;;;;;;7158:35;7251:4;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7302:31;7316:4;:16;;;7302:13;:31::i;:::-;-1:-1:-1;7362:7:8;;-1:-1:-1;;;;;7362:7:8;:12;7381:17;:9;7395:2;7381:13;:17::i;:::-;7362:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7422:42:8;;-1:-1:-1;7414:79:8;;-1:-1:-1;7475:17:8;;-1:-1:-1;7475:9:8;;-1:-1:-1;7489:2:8;7475:13;:17::i;:::-;7414:79;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;7528:21:8;7573:13;;7570:507;;7640:8;;7687:297;;;;;;;;7766:7;;7687:297;;-1:-1:-1;7687:297:8;;;;;;;;;;;;;;;;;;;;;;;;7953:15;7687:297;;;;;;7640:345;;-1:-1:-1;;;7640:345:8;;2365:13:9;;7640:345:8;;;2347:32:9;2417:24;;2395:20;;;2388:54;2480:24;;2458:20;;;2451:54;2543:24;2521:20;;;2514:54;2606:24;2584:20;;;2577:54;2669:24;;2647:20;;;2640:54;-1:-1:-1;;;;;;;;;7640:8:8;;;;:26;;7687:297;;2319:19:9;;7640:345:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7602:383;;;;;8019:1;8010:8;-1:-1:-1;;;;;8010:10:8;;:36;;;;;8035:11;8024:7;:22;8010:36;8002:63;;;;-1:-1:-1;;;8002:63:8;;3439:2:9;8002:63:8;;;3421:21:9;3478:2;3458:18;;;3451:30;-1:-1:-1;;;3497:18:9;;;3490:45;3552:18;;8002:63:8;3237:339:9;8002:63:8;7587:490;;7570:507;8102:25;;;-1:-1:-1;;;;;3773:32:9;;3755:51;;3837:2;3822:18;;3815:34;;;8102:25:8;;3728:18:9;8102:25:8;;;;;;;4048:4093;306:19268;;;;2158:98:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4444:197;;;;;;;;;;-1:-1:-1;4444:197:2;;;;;:::i;:::-;;:::i;:::-;;;5034:14:9;;5027:22;5009:41;;4997:2;4982:18;4444:197:2;4869:187:9;871:30:8;;;;;;;;;;-1:-1:-1;871:30:8;;;;;:::i;:::-;;:::i;:::-;;;5392:25:9;;;5380:2;5365:18;871:30:8;5246:177:9;946:22:8;;;;;;;;;;;;;;;;3255:106:2;;;;;;;;;;-1:-1:-1;3342:12:2;;3255:106;;1653:44:8;;;;;;;;;;-1:-1:-1;1653:44:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1653:44:8;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6069:32:9;;;6051:51;;6133:2;6118:18;;6111:34;;;;6161:18;;;6154:34;;;;6219:2;6204:18;;6197:34;;;;6262:3;6247:19;;6240:35;;;;6089:3;6291:19;;6284:35;6350:3;6335:19;;6328:35;6394:3;6379:19;;6372:35;6438:3;6423:19;;6416:35;6038:3;6023:19;1653:44:8;5680:777:9;19450:121:8;;;;;;;;;;-1:-1:-1;19450:121:8;;;;;:::i;:::-;;:::i;:::-;;1587:57;;;;;;;;;;-1:-1:-1;1587:57:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;5203:256:2;;;;;;;;;;-1:-1:-1;5203:256:2;;;;;:::i;:::-;;:::i;1418:25:8:-;;;;;;;;;;-1:-1:-1;1418:25:8;;;;-1:-1:-1;;;;;1418:25:8;;;;;;-1:-1:-1;;;;;7480:32:9;;;7462:51;;7450:2;7435:18;1418:25:8;7316:203:9;3104:91:2;;;;;;;;;;-1:-1:-1;3104:91:2;;3186:2;7666:36:9;;7654:2;7639:18;3104:91:2;7524:184:9;1557:23:8;;;;;;;;;;-1:-1:-1;1557:23:8;;;;-1:-1:-1;;;1557:23:8;;;;;;5854:234:2;;;;;;;;;;-1:-1:-1;5854:234:2;;;;;:::i;:::-;;:::i;1323:25:8:-;;;;;;;;;;-1:-1:-1;1323:25:8;;;;-1:-1:-1;;;;;1323:25:8;;;908:29;;;;;;;;;;-1:-1:-1;908:29:8;;;;;:::i;:::-;;:::i;1010:::-;;;;;;;;;;-1:-1:-1;1010:29:8;;;;-1:-1:-1;;;;;1010:29:8;;;3419:125:2;;;;;;;;;;-1:-1:-1;3419:125:2;;;;;:::i;:::-;-1:-1:-1;;;;;3519:18:2;3493:7;3519:18;;;;;;;;;;;;3419:125;1824:101:1;;;;;;;;;;;;;:::i;1286:28:8:-;;;;;;;;;;-1:-1:-1;1286:28:8;;;;-1:-1:-1;;;;;1286:28:8;;;1115:20;;;;;;;;;;-1:-1:-1;1115:20:8;;;;-1:-1:-1;;;;;1115:20:8;;;1255:24;;;;;;;;;;-1:-1:-1;1255:24:8;;;;-1:-1:-1;;;;;1255:24:8;;;977;;;;;;;;;;;;;;;;1201:85:1;;;;;;;;;;-1:-1:-1;1273:6:1;;-1:-1:-1;;;;;1273:6:1;1201:85;;2369:102:2;;;;;;;;;;;;;:::i;19252:190:8:-;;;;;;;;;;;;;:::i;6575:427:2:-;;;;;;;;;;-1:-1:-1;6575:427:2;;;;;:::i;:::-;;:::i;3740:189::-;;;;;;;;;;-1:-1:-1;3740:189:2;;;;;:::i;:::-;;:::i;1046:17:8:-;;;;;;;;;;-1:-1:-1;1046:17:8;;;;-1:-1:-1;;;;;1046:17:8;;;18960:129;;;;;;;;;;;;;:::i;1191:55::-;;;;;;;;;;-1:-1:-1;1191:55:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;1523:27;;;;;;;;;;-1:-1:-1;1523:27:8;;;;-1:-1:-1;;;1523:27:8;;;;;;1080:18;;;;;;;;;;-1:-1:-1;1080:18:8;;;;-1:-1:-1;;;;;1080:18:8;;;19097:147;;;;;;;;;;;;;:::i;1355:43::-;;;;;;;;;;-1:-1:-1;1355:43:8;;;;-1:-1:-1;;;;;1355:43:8;;;1451:31;;;;;;;;;;-1:-1:-1;1451:31:8;;;;-1:-1:-1;;;;;1451:31:8;;;1142:42;;;;;;;;;;-1:-1:-1;1142:42:8;;;;;:::i;:::-;;;;;;;;;;;;;;;;1495:21;;;;;;;;;;-1:-1:-1;1495:21:8;;;;-1:-1:-1;;;1495:21:8;;;;;;3987:149:2;;;;;;;;;;-1:-1:-1;3987:149:2;;;;;:::i;:::-;;:::i;2074:198:1:-;;;;;;;;;;-1:-1:-1;2074:198:1;;;;;:::i;:::-;;:::i;18560:392:8:-;;;;;;;;;;-1:-1:-1;18560:392:8;;;;;:::i;:::-;;:::i;3465:96:0:-;3523:7;3549:5;3553:1;3549;:5;:::i;:::-;3542:12;;3465:96;;;;;:::o;3850:::-;3908:7;3934:5;3938:1;3934;:5;:::i;3122:96::-;3180:7;3206:5;3210:1;3206;:5;:::i;8149:447:8:-;-1:-1:-1;;;;;8223:14:8;;8201:21;8223:14;;;:8;:14;;;;;;;;;8277;;;;8263:29;;3755:51:9;;;3822:18;;;3815:34;;;;8223:14:8;8263:29;;3728:18:9;8263:29:8;;;;;;;8320:1;8305:14;;;:16;;;8332:20;;;:22;;;8365:16;;;:18;;;8394:23;;;:25;;;-1:-1:-1;8430:18:8;;:20;-1:-1:-1;8466:23:8;;;:25;8463:90;;8518:4;:23;;;8507:9;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;;8463:90:8;8587:1;8563:23;;;;:25;-1:-1:-1;8149:447:8:o;17723:497::-;809:6;:11;;-1:-1:-1;;;;809:11:8;-1:-1:-1;;;809:11:8;;;17835:16:::1;::::0;;17849:1:::1;17835:16:::0;;;;;::::1;::::0;;-1:-1:-1;;;;17835:16:8;17849:1;17835:16:::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;17880:4:8::1;::::0;17862:7;;;;-1:-1:-1;;;;;;17880:4:8::1;::::0;17862:7;;-1:-1:-1;17880:4:8::1;::::0;17862:7:::1;;;;:::i;:::-;;;;;;:23;-1:-1:-1::0;;;;;17862:23:8::1;;;-1:-1:-1::0;;;;;17862:23:8::1;;;::::0;::::1;17949:4;17931;17936:1;17931:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;17931:23:8;;::::1;:7;::::0;;::::1;::::0;;;;;:23;17967:10:::1;::::0;18029:8:::1;::::0;17967:88:::1;::::0;-1:-1:-1;;;17967:88:8;;:10;;::::1;::::0;:35:::1;::::0;:88:::1;::::0;18003:10;;17967::::1;::::0;18016:4;;18029:8;;::::1;::::0;18039:15:::1;::::0;17967:88:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;18102:8:8::1;::::0;-1:-1:-1;;;;;18102:8:8::1;18066:17;3519:18:2::0;;;;;;;;;;;;-1:-1:-1;18123:60:8::1;::::0;-1:-1:-1;18166:4:8::1;3519:18:2::0;18123:15:8::1;:60::i;:::-;843:6:::0;:12;;-1:-1:-1;;;;843:12:8;;;18203:9;17723:497;-1:-1:-1;;;17723:497:8:o;2158:98:2:-;2212:13;2244:5;2237:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2158:98;:::o;4444:197::-;4527:4;719:10:6;4581:32:2;719:10:6;4597:7:2;4606:6;4581:8;:32::i;:::-;-1:-1:-1;4630:4:2;;4444:197;-1:-1:-1;;;4444:197:2:o;871:30:8:-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;871:30:8;:::o;19450:121::-;1094:13:1;:11;:13::i;:::-;19514:8:8::1;::::0;19555:7:::1;::::0;19514:49:::1;::::0;-1:-1:-1;;;19514:49:8;;-1:-1:-1;;;;;19514:8:8;;::::1;::::0;:21:::1;::::0;:49:::1;::::0;19544:4:::1;::::0;19551:2;;19514:49:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;19450:121:::0;:::o;5203:256:2:-;5300:4;719:10:6;5356:38:2;5372:4;719:10:6;5387:6:2;5356:15;:38::i;:::-;5404:27;5414:4;5420:2;5424:6;5404:9;:27::i;:::-;-1:-1:-1;5448:4:2;;5203:256;-1:-1:-1;;;;5203:256:2:o;5854:234::-;5942:4;719:10:6;5996:64:2;719:10:6;6012:7:2;6049:10;6021:25;719:10:6;6012:7:2;6021:9;:25::i;:::-;:38;;;;:::i;:::-;5996:8;:64::i;908:29:8:-;;;;;;;;;;;;1824:101:1;1094:13;:11;:13::i;:::-;1888:30:::1;1915:1;1888:18;:30::i;:::-;1824:101::o:0;2369:102:2:-;2425:13;2457:7;2450:14;;;;;:::i;19252:190:8:-;19311:10;;-1:-1:-1;;;;;19311:10:8;19299;:22;19291:59;;;;-1:-1:-1;;;19291:59:8;;11468:2:9;19291:59:8;;;11450:21:9;11507:2;11487:18;;;11480:30;-1:-1:-1;;;11526:18:9;;;11519:55;11591:18;;19291:59:8;11266:349:9;19291:59:8;19371:11;;-1:-1:-1;;;19371:11:8;;;;19370:12;19362:45;;;;-1:-1:-1;;;19362:45:8;;11822:2:9;19362:45:8;;;11804:21:9;11861:2;11841:18;;;11834:30;-1:-1:-1;;;11880:18:9;;;11873:51;11941:18;;19362:45:8;11620:345:9;19362:45:8;19418:11;:16;;-1:-1:-1;;;;19418:16:8;-1:-1:-1;;;19418:16:8;;;19252:190::o;6575:427:2:-;6668:4;719:10:6;6668:4:2;6749:25;719:10:6;6766:7:2;6749:9;:25::i;:::-;6722:52;;6812:15;6792:16;:35;;6784:85;;;;-1:-1:-1;;;6784:85:2;;12172:2:9;6784:85:2;;;12154:21:9;12211:2;12191:18;;;12184:30;12250:34;12230:18;;;12223:62;-1:-1:-1;;;12301:18:9;;;12294:35;12346:19;;6784:85:2;11970:401:9;6784:85:2;6903:60;6912:5;6919:7;6947:15;6928:16;:34;6903:8;:60::i;3740:189::-;3819:4;719:10:6;3873:28:2;719:10:6;3890:2:2;3894:6;3873:9;:28::i;18960:129:8:-;1094:13:1;:11;:13::i;:::-;19015:9:8::1;::::0;-1:-1:-1;;;19015:9:8;::::1;;;19014:10;19006:48;;;::::0;-1:-1:-1;;;19006:48:8;;12578:2:9;19006:48:8::1;::::0;::::1;12560:21:9::0;12617:2;12597:18;;;12590:30;12656:28;12636:18;;;12629:56;12702:18;;19006:48:8::1;12376:350:9::0;19006:48:8::1;19065:9;:16:::0;;-1:-1:-1;;;;19065:16:8::1;-1:-1:-1::0;;;19065:16:8::1;::::0;;18960:129::o;19097:147::-;1094:13:1;:11;:13::i;:::-;19158:15:8::1;::::0;-1:-1:-1;;;19158:15:8;::::1;;;19157:16;19149:54;;;::::0;-1:-1:-1;;;19149:54:8;;12578:2:9;19149:54:8::1;::::0;::::1;12560:21:9::0;12617:2;12597:18;;;12590:30;12656:28;12636:18;;;12629:56;12702:18;;19149:54:8::1;12376:350:9::0;19149:54:8::1;19214:15;:22:::0;;-1:-1:-1;;;;19214:22:8::1;-1:-1:-1::0;;;19214:22:8::1;::::0;;19097:147::o;3987:149:2:-;-1:-1:-1;;;;;4102:18:2;;;4076:7;4102:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3987:149::o;2074:198:1:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2162:22:1;::::1;2154:73;;;::::0;-1:-1:-1;;;2154:73:1;;12933:2:9;2154:73:1::1;::::0;::::1;12915:21:9::0;12972:2;12952:18;;;12945:30;13011:34;12991:18;;;12984:62;-1:-1:-1;;;13062:18:9;;;13055:36;13108:19;;2154:73:1::1;12731:402:9::0;2154:73:1::1;2237:28;2256:8;2237:18;:28::i;:::-;2074:198:::0;:::o;18560:392:8:-;18631:6;18620:9;;:17;;18612:50;;;;-1:-1:-1;;;18612:50:8;;13340:2:9;18612:50:8;;;13322:21:9;13379:2;13359:18;;;13352:30;-1:-1:-1;;;13398:18:9;;;13391:51;13459:18;;18612:50:8;13138:345:9;18612:50:8;18694:10;;-1:-1:-1;;;;;18694:10:8;18682;:22;18674:59;;;;-1:-1:-1;;;18674:59:8;;11468:2:9;18674:59:8;;;11450:21:9;11507:2;11487:18;;;11480:30;-1:-1:-1;;;11526:18:9;;;11519:55;11591:18;;18674:59:8;11266:349:9;18674:59:8;18755:4;;18776:10;;18755:52;;-1:-1:-1;;;18755:52:8;;-1:-1:-1;;;;;18776:10:8;;;18755:52;;;3755:51:9;-1:-1:-1;;3822:18:9;;;3815:34;18755:4:8;;;:12;;3728:18:9;;18755:52:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;18850:10:8;;18818:63;;18835:4;;-1:-1:-1;;;;;18850:10:8;-1:-1:-1;;18818:8:8;:63::i;:::-;18894:22;18909:6;18894:14;:22::i;:::-;18938:6;18927:9;;:17;;;;;;;:::i;:::-;;;;-1:-1:-1;;;18560:392:8:o;7456:788:2:-;-1:-1:-1;;;;;7552:18:2;;7544:68;;;;-1:-1:-1;;;7544:68:2;;13972:2:9;7544:68:2;;;13954:21:9;14011:2;13991:18;;;13984:30;14050:34;14030:18;;;14023:62;-1:-1:-1;;;14101:18:9;;;14094:35;14146:19;;7544:68:2;13770:401:9;7544:68:2;-1:-1:-1;;;;;7630:16:2;;7622:64;;;;-1:-1:-1;;;7622:64:2;;14378:2:9;7622:64:2;;;14360:21:9;14417:2;14397:18;;;14390:30;14456:34;14436:18;;;14429:62;-1:-1:-1;;;14507:18:9;;;14500:33;14550:19;;7622:64:2;14176:399:9;7622:64:2;-1:-1:-1;;;;;7768:15:2;;7746:19;7768:15;;;;;;;;;;;7801:21;;;;7793:72;;;;-1:-1:-1;;;7793:72:2;;14782:2:9;7793:72:2;;;14764:21:9;14821:2;14801:18;;;14794:30;14860:34;14840:18;;;14833:62;-1:-1:-1;;;14911:18:9;;;14904:36;14957:19;;7793:72:2;14580:402:9;7793:72:2;-1:-1:-1;;;;;7899:15:2;;;:9;:15;;;;;;;;;;;7917:20;;;7899:38;;8114:13;;;;;;;;;;:23;;;;;;8163:26;;5392:25:9;;;8114:13:2;;8163:26;;5365:18:9;8163:26:2;;;;;;;8200:37;7534:710;7456:788;;;:::o;10457:340::-;-1:-1:-1;;;;;10558:19:2;;10550:68;;;;-1:-1:-1;;;10550:68:2;;15189:2:9;10550:68:2;;;15171:21:9;15228:2;15208:18;;;15201:30;15267:34;15247:18;;;15240:62;-1:-1:-1;;;15318:18:9;;;15311:34;15362:19;;10550:68:2;14987:400:9;10550:68:2;-1:-1:-1;;;;;10636:21:2;;10628:68;;;;-1:-1:-1;;;10628:68:2;;15594:2:9;10628:68:2;;;15576:21:9;15633:2;15613:18;;;15606:30;15672:34;15652:18;;;15645:62;-1:-1:-1;;;15723:18:9;;;15716:32;15765:19;;10628:68:2;15392:398:9;10628:68:2;-1:-1:-1;;;;;10707:18:2;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;10758:32;;5392:25:9;;;10758:32:2;;5365:18:9;10758:32:2;;;;;;;10457:340;;;:::o;1359:130:1:-;1273:6;;-1:-1:-1;;;;;1273:6:1;719:10:6;1422:23:1;1414:68;;;;-1:-1:-1;;;1414:68:1;;15997:2:9;1414:68:1;;;15979:21:9;;;16016:18;;;16009:30;16075:34;16055:18;;;16048:62;16127:18;;1414:68:1;15795:356:9;11078:411:2;11178:24;11205:25;11215:5;11222:7;11205:9;:25::i;:::-;11178:52;;-1:-1:-1;;11244:16:2;:37;11240:243;;11325:6;11305:16;:26;;11297:68;;;;-1:-1:-1;;;11297:68:2;;16358:2:9;11297:68:2;;;16340:21:9;16397:2;16377:18;;;16370:30;16436:31;16416:18;;;16409:59;16485:18;;11297:68:2;16156:353:9;11297:68:2;11407:51;11416:5;11423:7;11451:6;11432:16;:25;11407:8;:51::i;8604:1111:8:-;8744:2;-1:-1:-1;;;;;8736:10:8;:4;-1:-1:-1;;;;;8736:10:8;;8728:48;;;;-1:-1:-1;;;8728:48:8;;16716:2:9;8728:48:8;;;16698:21:9;16755:2;16735:18;;;16728:30;16794:28;16774:18;;;16767:56;16840:18;;8728:48:8;16514:350:9;8728:48:8;8803:1;8795:6;:9;8787:48;;;;-1:-1:-1;;;8787:48:8;;17071:2:9;8787:48:8;;;17053:21:9;17110:2;17090:18;;;17083:30;17149:28;17129:18;;;17122:56;17195:18;;8787:48:8;16869:350:9;8787:48:8;8859:6;;-1:-1:-1;;;8859:6:8;;;;;:62;;-1:-1:-1;;;;;;8871:18:8;;;;;;:12;:18;;;;;;;;;:36;;-1:-1:-1;;;;;;8891:16:8;;;;;;:12;:16;;;;;;;;8871:36;8870:50;;;;-1:-1:-1;8911:9:8;;-1:-1:-1;;;8911:9:8;;;;8910:10;8870:50;8856:132;;;8945:31;8961:4;8966:2;8969:6;8945:15;:31::i;:::-;8604:1111;;;:::o;8856:132::-;-1:-1:-1;;;;;9003:31:8;;;;;;:25;:31;;;;;;;;9000:662;;;9058:11;;-1:-1:-1;;;9058:11:8;;;;9050:51;;;;-1:-1:-1;;;9050:51:8;;17426:2:9;9050:51:8;;;17408:21:9;17465:2;17445:18;;;17438:30;17504;17484:18;;;17477:58;17552:18;;9050:51:8;17224:352:9;9050:51:8;9116:12;9129:14;:6;9140:2;9129:10;:14::i;:::-;9188:12;;9116:27;;-1:-1:-1;9158:50:8;;9174:4;;-1:-1:-1;;;;;9188:12:8;9116:27;9158:15;:50::i;:::-;9230:41;9246:4;9251:2;9254:16;:6;9265:4;9254:10;:16::i;:::-;9230:15;:41::i;9000:662::-;-1:-1:-1;;;;;9291:29:8;;;;;;:25;:29;;;;;;;;9288:374;;;9336:12;9349:14;:6;9360:2;9349:10;:14::i;:::-;9408:12;;9336:27;;-1:-1:-1;9378:50:8;;9394:4;;-1:-1:-1;;;;;9408:12:8;9336:27;9378:15;:50::i;:::-;9443:9;:7;:9::i;9288:374::-;16359:20;;16407:8;;;9535:38;;-1:-1:-1;;;;;;9554:19:8;;9568:4;9554:19;9535:38;9532:130;;;9589:12;9596:4;9589:6;:12::i;:::-;9532:130;;;9632:18;9642:4;9647:2;9632:9;:18::i;:::-;9674:33;9690:4;9696:2;9700:6;9674:15;:33::i;2426:187:1:-;2518:6;;;-1:-1:-1;;;;;2534:17:1;;;-1:-1:-1;;;;;;2534:17:1;;;;;;;2566:40;;2518:6;;;2534:17;2518:6;;2566:40;;2499:16;;2566:40;2489:124;2426:187;:::o;16431:1284:8:-;16560:8;;16579:7;;16560:27;;-1:-1:-1;;;16560:27:8;;;;;5392:25:9;;;;16503:15:8;;;;;;-1:-1:-1;;;;;16560:8:8;;:18;;5365::9;;16560:27:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;16632:16:8;;16624:109;;-1:-1:-1;;;16624:109:8;;16660:42;16624:109;;;19477:51:9;19575:1;19564:21;;;19544:18;;;19537:49;19622:21;;;19602:18;;;19595:49;-1:-1:-1;;;;;19680:47:9;;19660:18;;;19653:75;16497:90:8;;-1:-1:-1;16497:90:8;;-1:-1:-1;16497:90:8;;-1:-1:-1;16602:18:8;;-1:-1:-1;;;;;;;16632:16:8;;;;-1:-1:-1;16624:35:8;;-1:-1:-1;;19449:19:9;;;-1:-1:-1;16624:109:8;;-1:-1:-1;19254:480:9;16624:109:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16600:133;;;16768:10;16754;:24;;:37;;;;;16790:1;16780:9;-1:-1:-1;;;;;16780:11:8;;16754:37;16746:79;;;;-1:-1:-1;;;16746:79:8;;20191:2:9;16746:79:8;;;20173:21:9;20230:2;20210:18;;;20203:30;20269:32;20249:18;;;20242:60;20319:18;;16746:79:8;19989:354:9;16746:79:8;16838:15;16881:10;16856:22;-1:-1:-1;;;;;16856:22:8;;:10;:22;:::i;:::-;:35;;;;:::i;:::-;16838:53;-1:-1:-1;16904:17:8;16924:18;16838:53;16941:1;16924:18;:::i;:::-;16904:38;;16976:9;-1:-1:-1;;;;;16966:19:8;:9;-1:-1:-1;;;;;16966:19:8;;16963:71;;;-1:-1:-1;17013:9:8;16963:71;17065:8;;17092:226;;;;;;;;17168:7;;17092:226;;-1:-1:-1;;;;;17092:226:8;;;;;;;;;-1:-1:-1;17092:226:8;;;;;;;;;;;;17291:15;17092:226;;;;;;17065:254;;-1:-1:-1;;;17065:254:8;;20797:13:9;;17065:254:8;;;20779:32:9;20853:24;;20849:65;;;20827:20;;;20820:95;20953:24;;20931:20;;;20924:54;21016:24;20994:20;;;20987:54;21079:24;;21057:20;;;21050:54;-1:-1:-1;;;;;;;17065:8:8;;:26;;20751:19:9;;17065:254:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17046:273;;;17346:1;17340:5;:7;17332:51;;;;-1:-1:-1;;;17332:51:8;;21317:2:9;17332:51:8;;;21299:21:9;;;21336:18;;;21329:30;21395:34;21375:18;;;21368:62;21447:18;;17332:51:8;21115:356:9;17332:51:8;17394:8;;17411:252;;;;;;;;17476:7;;17411:252;;17516:4;17411:252;;;;;;-1:-1:-1;;;;;17411:252:8;;;;;;;;;;;;17394:270;;-1:-1:-1;;;17394:270:8;;21703:13:9;;17394:270:8;;;21685:32:9;21759:24;;-1:-1:-1;;;;;21755:50:9;;;21733:20;;;21726:80;21835:24;;21950:21;;21928:20;;;21921:51;22014:24;;22010:33;;;21988:20;;;21981:63;17394:8:8;;;:16;;21657:19:9;;17394:270:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;17677:20;17691:5;17677:13;:20::i;:::-;;16484:1231;;;;;;;16431:1284;:::o;10339:1127::-;809:6;:11;;-1:-1:-1;;;;809:11:8;-1:-1:-1;;;809:11:8;;;10425:12:::1;::::0;-1:-1:-1;;;;;10425:12:8::1;-1:-1:-1::0;3519:18:2;;;;;;;;;;;;10450:66:8::1;::::0;10497:4:::1;3519:18:2::0;10450:15:8::1;:66::i;:::-;10527:67;10551:4;10566:6;10575:18;:11:::0;10591:1:::1;10575:15;:18::i;10527:67::-;10607:18;10628:25;10651:1;10628:18;:11:::0;10644:1:::1;10628:15;:18::i;:25::-;10698:16;::::0;;10712:1:::1;10698:16:::0;;;;;::::1;::::0;;10607:46;;-1:-1:-1;10674:21:8::1;::::0;10698:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;10698:16:8::1;10674:40;;10743:4;10725;10730:1;10725:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10725:23:8;;::::1;:7;::::0;;::::1;::::0;;;;;:23;10777:4:::1;::::0;10759:7;;10777:4;::::1;::::0;10759;;10777;;10759:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;10759:23:8;;::::1;:7;::::0;;::::1;::::0;;;;;:23;10795:10:::1;::::0;10857:8:::1;::::0;10795:88:::1;::::0;-1:-1:-1;;;10795:88:8;;:10;;::::1;::::0;:35:::1;::::0;:88:::1;::::0;10831:10;;10795::::1;::::0;10844:4;;10857:8;;::::1;::::0;10867:15:::1;::::0;10795:88:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;10916:4:8::1;::::0;10939:8:::1;::::0;10916:33:::1;::::0;-1:-1:-1;;;10916:33:8;;-1:-1:-1;;;;;10939:8:8;;::::1;10916:33;::::0;::::1;7462:51:9::0;10896:18:8::1;::::0;-1:-1:-1;10916:4:8;::::1;::::0;-1:-1:-1;10916:14:8::1;::::0;7435:18:9;;10916:33:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;10962:8;::::0;10980:4:::1;::::0;10962:50:::1;::::0;-1:-1:-1;;;10962:50:8;;10896:53;;-1:-1:-1;;;;;;10962:8:8;;::::1;::::0;:17:::1;::::0;:50:::1;::::0;10980:4:::1;::::0;10994::::1;::::0;10896:53;;10962:50:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;11025:10:8::1;::::0;11057:4:::1;::::0;-1:-1:-1;;;;;11025:10:8;;::::1;::::0;-1:-1:-1;11025:23:8::1;::::0;-1:-1:-1;11057:4:8::1;11072;11080:10:::0;11092:18:::1;:11:::0;11108:1:::1;11092:15;:18::i;:::-;11025:153;::::0;-1:-1:-1;;;;;;11025:153:8::1;::::0;;;;;;-1:-1:-1;;;;;23053:15:9;;;11025:153:8::1;::::0;::::1;23035:34:9::0;23105:15;;;;23085:18;;;23078:43;23137:18;;;23130:34;23180:18;;;23173:34;11112:1:8::1;23223:19:9::0;;;23216:35;;;23267:19;;;23260:35;11118:42:8::1;23311:19:9::0;;;23304:44;11162:15:8::1;23364:19:9::0;;;23357:35;22969:19;;11025:153:8::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;11210:4:8::1;::::0;:29:::1;::::0;-1:-1:-1;;;11210:29:8;;11233:4:::1;11210:29;::::0;::::1;7462:51:9::0;-1:-1:-1;;;;;11210:4:8;;::::1;::::0;-1:-1:-1;11210:14:8::1;::::0;7435:18:9;;11210:29:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11260:4;::::0;:25:::1;::::0;-1:-1:-1;;;11260:25:8;;::::1;::::0;::::1;5392::9::0;;;11199:40:8;;-1:-1:-1;;;;;;11260:4:8::1;::::0;:13:::1;::::0;5365:18:9;;11260:25:8::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;11296:18;11315:17;11330:1;11315:10;:14;;:17;;;;:::i;:::-;11343:72;::::0;11296:36;;-1:-1:-1;11351:42:8::1;::::0;11343:72;::::1;;;::::0;11296:36;;11343:72:::1;::::0;;;11296:36;11351:42;11343:72;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;11426:7;;;;;;;;;-1:-1:-1::0;;;;;11426:7:8::1;-1:-1:-1::0;;;;;11426:12:8::1;;11445:10;11426:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;843:6:8;:12;;-1:-1:-1;;;;843:12:8;;;-1:-1:-1;;;;;;;;10339:1127:8:o;11474:1859::-;11541:10;-1:-1:-1;;;;;11570:14:8;;;;:37;;;;-1:-1:-1;;;;;;11588:19:8;;11598:9;11588:19;11570:37;11562:71;;;;-1:-1:-1;;;11562:71:8;;23916:2:9;11562:71:8;;;23898:21:9;23955:2;23935:18;;;23928:30;-1:-1:-1;;;23974:18:9;;;23967:52;24036:18;;11562:71:8;23714:346:9;11562:71:8;-1:-1:-1;;;;;11672:14:8;;11646:25;11672:14;;;:8;:14;;;;;11719:18;;;;11766:11;11758:61;;;;-1:-1:-1;;;11758:61:8;;24267:2:9;11758:61:8;;;24249:21:9;24306:2;24286:18;;;24279:30;24345:34;24325:18;;;24318:62;-1:-1:-1;;;24396:18:9;;;24389:36;24442:19;;11758:61:8;24065:402:9;11758:61:8;11865:1;11840:8;:24;;;:26;:71;;;;-1:-1:-1;11881:24:8;;;;:30;;11906:5;11881:30;:::i;:::-;11868:12;:43;11840:71;11832:118;;;;-1:-1:-1;;;11832:118:8;;24674:2:9;11832:118:8;;;24656:21:9;24713:2;24693:18;;;24686:30;24752:34;24732:18;;;24725:62;-1:-1:-1;;;24803:18:9;;;24796:33;24846:19;;11832:118:8;24472:399:9;11832:118:8;11963:14;11980:53;12027:5;11980:42;11997:8;:24;;;11980:12;:16;;:42;;;;:::i;:53::-;11963:70;-1:-1:-1;12046:21:8;12070:39;12104:4;12070:29;12096:2;12070:21;:9;11963:70;12070:13;:21::i;:::-;:25;;:29::i;:39::-;12046:63;;12122:21;12144:46;12162:8;:27;;;12144:13;:17;;:46;;;;:::i;:::-;12214:27;;;;12122:68;;-1:-1:-1;12214:29:8;12211:396;;12295:20;;;;12273:21;;12295:32;;12320:6;12295:24;:32::i;:::-;12273:54;;12359:8;:27;;;12345:13;:41;12342:121;;;-1:-1:-1;12420:27:8;;;;12342:121;12477:29;12492:13;12477:14;:29::i;:::-;12549:27;;;;:46;;12581:13;12549:31;:46::i;:::-;12521:27;;;:74;-1:-1:-1;12211:396:8;12647:8;:22;;;12632:13;:37;12629:629;;12685:18;12704:38;12719:8;:22;;;12704:14;:38::i;:::-;12685:57;;12757:48;12781:4;12788;12794:10;12757:15;:48::i;:::-;12838:22;;;;12825:47;;;-1:-1:-1;;;;;25096:32:9;;25078:51;;25160:2;25145:18;;25138:34;;;;25188:18;;25181:34;;;12825:47:8;;25066:2:9;25051:18;12825:47:8;;;;;;;12887:14;12896:4;12887:8;:14::i;:::-;12670:257;12629:629;;;12946:18;12965:29;12980:13;12965:14;:29::i;:::-;12946:48;;13009;13033:4;13040;13045:10;13009:15;:48::i;:::-;13095:22;;;;:41;;13122:13;13095:26;:41::i;:::-;13072:22;;;:64;13176:12;13151:24;;;:37;13208:38;;;-1:-1:-1;;;;;25096:32:9;;25078:51;;25160:2;25145:18;;25138:34;;;25188:18;;;25181:34;;;13208:38:8;;25066:2:9;25051:18;13208:38:8;;;;;;;12931:327;12629:629;13294:16;;13278:47;;13289:4;;-1:-1:-1;;;;;13294:16:8;13311:13;13278:10;:47::i;:::-;11513:1820;;;;;;11474:1859;:::o;9729:600::-;9793:24;9818:8;:14;9827:4;-1:-1:-1;;;;;9818:14:8;-1:-1:-1;;;;;9818:14:8;;;;;;;;;;;;9793:39;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9793:39:8;-1:-1:-1;;;;;9793:39:8;-1:-1:-1;;;;;9793:39:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9843:22;9866:8;:12;9875:2;-1:-1:-1;;;;;9866:12:8;-1:-1:-1;;;;;9866:12:8;;;;;;;;;;;;9843:35;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9843:35:8;-1:-1:-1;;;;;9843:35:8;-1:-1:-1;;;;;9843:35:8;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9892:16;9903:4;16359:20;16407:8;;;16227:196;9892:16;:32;;;-1:-1:-1;16359:20:8;;16407:8;;9910:14;9892:50;;;-1:-1:-1;9927:15:8;;-1:-1:-1;;;9927:15:8;;;;9926:16;9892:50;9889:87;;;9958:7;;9729:600;;:::o;9889:87::-;9991:14;;-1:-1:-1;;;;;9991:28:8;;:59;;;;-1:-1:-1;10021:16:8;;-1:-1:-1;;;;;10021:29:8;;;9991:59;9988:137;;;-1:-1:-1;;;;;;;10066:15:8;;;;;;;:9;:15;;;;;;;;:19;;;;;;;;;;;:26;;-1:-1:-1;;10066:26:8;10088:4;10066:26;;;9729:600::o;9988:137::-;10140:16;;-1:-1:-1;;;;;10140:30:8;;:59;;;;-1:-1:-1;10172:14:8;;-1:-1:-1;;;;;10172:27:8;;;10140:59;:80;;;;-1:-1:-1;;;;;;10201:13:8;;;;;;;:9;:13;;;;;;;;:19;;;;;;;;;;;;10140:80;10137:175;;;-1:-1:-1;;;;;10236:14:8;;;;;;;:8;:14;;;;;;;;;:27;;-1:-1:-1;;;;;;10236:27:8;;;;;;;;;10283:17;;25438:34:9;;;25488:18;;25481:43;;;;10283:17:8;;25373:18:9;10283:17:8;;;;;;;9782:547;;9729:600;;:::o;2755:96:0:-;2813:7;2839:5;2843:1;2839;:5;:::i;18228:320:8:-;18336:16;;;18350:1;18336:16;;;;;;;;18293:7;;;;18336:16;18350:1;18336:16;;;;;;;;-1:-1:-1;;18381:4:8;;18363:7;;;;-1:-1:-1;;;;;;18381:4:8;;18363:7;;-1:-1:-1;18381:4:8;;18363:7;;;;:::i;:::-;;;;;;:23;-1:-1:-1;;;;;18363:23:8;;;-1:-1:-1;;;;;18363:23:8;;;;;18415:4;18397;18402:1;18397:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;18397:23:8;;;:7;;;;;;;;;:23;18470:10;;18458:54;;-1:-1:-1;;;18458:54:8;;18431:24;;18470:10;;;;;18458:37;;:54;;18496:9;;18507:4;;18458:54;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;18458:54:8;;;;;;;;;;;;:::i;:::-;18431:81;;18530:7;18538:1;18530:10;;;;;;;;:::i;:::-;;;;;;;18523:17;;;;18228:320;;;:::o;13341:2878::-;13438:25;13464:12;13438:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13489:21;13537:7;13533:2679;13549:2;13547:1;:4;;;13533:2679;;;-1:-1:-1;;;;;13574:21:8;;13571:65;13615:5;13571:65;-1:-1:-1;;;;;13674:17:8;;13650:23;13674:17;;;:8;:17;;;;;13719:20;;;;13674:17;;13719:23;13716:71;;13762:8;;;13716:71;13808:2;13806:1;:4;;;:30;;;;;13814:6;:22;;;13812:1;:24;;;13806:30;:50;;;;;13855:1;13838:6;:16;;;:18;13806:50;13803:274;;;13876:19;13898:38;13932:3;13898:29;13915:8;13924:1;13915:11;;;;;;;;;;:::i;:::-;;;;;;;13898:12;:16;;:29;;;;:::i;:38::-;13876:60;;13983:11;13955:6;:25;;;:39;;;;;;;:::i;:::-;;;;-1:-1:-1;;14018:43:8;;;;;;14029:4;;14035:7;;14044:11;;14056:4;;14018:43;:::i;:::-;;;;;;;;13857:220;13803:274;14105:18;14162:9;14141:6;:17;;;:30;14138:1853;;14242:3;14220:18;14225:13;14220:2;:18;:::i;:::-;14204:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;14191:54;;14291:10;14264:6;:25;;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;;14325:43:8;;;;;;14336:4;;14342:7;;14351:10;;14362:5;;14325:43;:::i;:::-;;;;;;;;14387:5;;;;14138:1853;14437:8;14416:6;:17;;;:29;;:47;;;;;14461:2;14447:13;:16;14416:47;14413:1578;;;14534:3;14512:18;14517:13;14512:2;:18;:::i;:::-;14496:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;14483:54;;14570:2;14556:16;;14413:1578;;;14617:8;14596:6;:17;;;:29;;:47;;;;;14641:2;14627:13;:16;14596:47;14593:1398;;;14714:3;14692:18;14697:13;14692:2;:18;:::i;:::-;14676:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;14663:54;;14750:2;14736:16;;14593:1398;;;14797:8;14776:6;:17;;;:29;;:47;;;;;14821:2;14807:13;:16;14776:47;14773:1218;;;14894:3;14872:18;14877:13;14872:2;:18;:::i;:::-;14856:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;14843:54;;14930:2;14916:16;;14773:1218;;;14977:7;14956:6;:17;;;:28;;:46;;;;;15000:2;14986:13;:16;14956:46;14953:1038;;;15073:3;15051:18;15056:13;15051:2;:18;:::i;:::-;15035:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;15022:54;;15109:2;15095:16;;14953:1038;;;15156:7;15135:6;:17;;;:28;;:46;;;;;15179:2;15165:13;:16;15135:46;15132:859;;;15252:3;15230:18;15235:13;15230:2;:18;:::i;:::-;15214:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;15201:54;;15288:2;15274:16;;15132:859;;;15335:7;15314:6;:17;;;:28;;:46;;;;;15358:2;15344:13;:16;15314:46;15311:680;;;15431:3;15409:18;15414:13;15409:2;:18;:::i;:::-;15393:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;15380:54;;15467:2;15453:16;;15311:680;;;15514:6;15493;:17;;;:27;;:45;;;;;15536:2;15522:13;:16;15493:45;15490:501;;;15609:3;15587:18;15592:13;15587:2;:18;:::i;:::-;15571:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;15558:54;;15645:2;15631:16;;15490:501;;;15692:6;15671;:17;;;:27;;:45;;;;;15714:2;15700:13;:16;15671:45;15668:323;;;15787:3;15765:18;15770:13;15765:2;:18;:::i;:::-;15749:35;;:12;:35;:::i;:::-;:41;;;;:::i;:::-;15736:54;;15823:2;15809:16;;15668:323;;;15870:5;15849:6;:17;;;:26;;:44;;;;-1:-1:-1;15877:16:8;;15849:44;15846:145;;;15926:15;15939:2;15926:12;:15;:::i;:::-;15913:28;;15974:1;15960:15;;15846:145;16010:12;;16007:155;;16069:10;16042:6;:25;;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;;16103:43:8;;;;;;16114:4;;16120:7;;16129:10;;16140:5;;16103:43;:::i;:::-;;;;;;;;16007:155;-1:-1:-1;16186:14:8;-1:-1:-1;;;;;16186:14:8;;-1:-1:-1;13533:2679:8;13552:3;;;;:::i;:::-;;;;13533:2679;;;;13421:2798;;13341:2878;;;:::o;1071:127:9:-;1132:10;1127:3;1123:20;1120:1;1113:31;1163:4;1160:1;1153:15;1187:4;1184:1;1177:15;1203:125;1268:9;;;1289:10;;;1286:36;;;1302:18;;:::i;1333:127::-;1394:10;1389:3;1385:20;1382:1;1375:31;1425:4;1422:1;1415:15;1449:4;1446:1;1439:15;1465:375;-1:-1:-1;;;;;1723:15:9;;;1705:34;;1775:15;;;;1770:2;1755:18;;1748:43;1822:2;1807:18;;1800:34;;;;1655:2;1640:18;;1465:375::o;1845:128::-;1912:9;;;1933:11;;;1930:37;;;1947:18;;:::i;1978:135::-;2017:3;2038:17;;;2035:43;;2058:18;;:::i;:::-;-1:-1:-1;2105:1:9;2094:13;;1978:135::o;2705:192::-;2784:13;;-1:-1:-1;;;;;2826:46:9;;2816:57;;2806:85;;2887:1;2884;2877:12;2806:85;2705:192;;;:::o;2902:330::-;2990:6;2998;3006;3059:2;3047:9;3038:7;3034:23;3030:32;3027:52;;;3075:1;3072;3065:12;3027:52;3098:40;3128:9;3098:40;:::i;:::-;3088:50;;3178:2;3167:9;3163:18;3157:25;3147:35;;3222:2;3211:9;3207:18;3201:25;3191:35;;2902:330;;;;;:::o;3860:548::-;3972:4;4001:2;4030;4019:9;4012:21;4062:6;4056:13;4105:6;4100:2;4089:9;4085:18;4078:34;4130:1;4140:140;4154:6;4151:1;4148:13;4140:140;;;4249:14;;;4245:23;;4239:30;4215:17;;;4234:2;4211:26;4204:66;4169:10;;4140:140;;;4144:3;4329:1;4324:2;4315:6;4304:9;4300:22;4296:31;4289:42;4399:2;4392;4388:7;4383:2;4375:6;4371:15;4367:29;4356:9;4352:45;4348:54;4340:62;;;;3860:548;;;;:::o;4413:131::-;-1:-1:-1;;;;;4488:31:9;;4478:42;;4468:70;;4534:1;4531;4524:12;4549:315;4617:6;4625;4678:2;4666:9;4657:7;4653:23;4649:32;4646:52;;;4694:1;4691;4684:12;4646:52;4733:9;4720:23;4752:31;4777:5;4752:31;:::i;:::-;4802:5;4854:2;4839:18;;;;4826:32;;-1:-1:-1;;;4549:315:9:o;5061:180::-;5120:6;5173:2;5161:9;5152:7;5148:23;5144:32;5141:52;;;5189:1;5186;5179:12;5141:52;-1:-1:-1;5212:23:9;;5061:180;-1:-1:-1;5061:180:9:o;5428:247::-;5487:6;5540:2;5528:9;5519:7;5515:23;5511:32;5508:52;;;5556:1;5553;5546:12;5508:52;5595:9;5582:23;5614:31;5639:5;5614:31;:::i;:::-;5664:5;5428:247;-1:-1:-1;;;5428:247:9:o;6462:388::-;6530:6;6538;6591:2;6579:9;6570:7;6566:23;6562:32;6559:52;;;6607:1;6604;6597:12;6559:52;6646:9;6633:23;6665:31;6690:5;6665:31;:::i;:::-;6715:5;-1:-1:-1;6772:2:9;6757:18;;6744:32;6785:33;6744:32;6785:33;:::i;:::-;6837:7;6827:17;;;6462:388;;;;;:::o;6855:456::-;6932:6;6940;6948;7001:2;6989:9;6980:7;6976:23;6972:32;6969:52;;;7017:1;7014;7007:12;6969:52;7056:9;7043:23;7075:31;7100:5;7075:31;:::i;:::-;7125:5;-1:-1:-1;7182:2:9;7167:18;;7154:32;7195:33;7154:32;7195:33;:::i;:::-;6855:456;;7247:7;;-1:-1:-1;;;7301:2:9;7286:18;;;;7273:32;;6855:456::o;9301:168::-;9374:9;;;9405;;9422:15;;;9416:22;;9402:37;9392:71;;9443:18;;:::i;9474:217::-;9514:1;9540;9530:132;;9584:10;9579:3;9575:20;9572:1;9565:31;9619:4;9616:1;9609:15;9647:4;9644:1;9637:15;9530:132;-1:-1:-1;9676:9:9;;9474:217::o;9696:127::-;9757:10;9752:3;9748:20;9745:1;9738:31;9788:4;9785:1;9778:15;9812:4;9809:1;9802:15;9828:461;9881:3;9919:5;9913:12;9946:6;9941:3;9934:19;9972:4;10001:2;9996:3;9992:12;9985:19;;10038:2;10031:5;10027:14;10059:1;10069:195;10083:6;10080:1;10077:13;10069:195;;;10148:13;;-1:-1:-1;;;;;10144:39:9;10132:52;;10204:12;;;;10239:15;;;;10180:1;10098:9;10069:195;;;-1:-1:-1;10280:3:9;;9828:461;-1:-1:-1;;;;;9828:461:9:o;10294:582::-;10593:6;10582:9;10575:25;10636:6;10631:2;10620:9;10616:18;10609:34;10679:3;10674:2;10663:9;10659:18;10652:31;10556:4;10700:57;10752:3;10741:9;10737:19;10729:6;10700:57;:::i;:::-;-1:-1:-1;;;;;10793:32:9;;;;10788:2;10773:18;;10766:60;-1:-1:-1;10857:3:9;10842:19;10835:35;10692:65;10294:582;-1:-1:-1;;;10294:582:9:o;10881:380::-;10960:1;10956:12;;;;11003;;;11024:61;;11078:4;11070:6;11066:17;11056:27;;11024:61;11131:2;11123:6;11120:14;11100:18;11097:38;11094:161;;11177:10;11172:3;11168:20;11165:1;11158:31;11212:4;11209:1;11202:15;11240:4;11237:1;11230:15;11094:161;;10881:380;;;:::o;13488:277::-;13555:6;13608:2;13596:9;13587:7;13583:23;13579:32;13576:52;;;13624:1;13621;13614:12;13576:52;13656:9;13650:16;13709:5;13702:13;13695:21;13688:5;13685:32;13675:60;;13731:1;13728;13721:12;17581:138;17660:13;;17682:31;17660:13;17682:31;:::i;17724:165::-;17802:13;;17855:8;17844:20;;17834:31;;17824:59;;17879:1;17876;17869:12;17894:164;17971:13;;18024:1;18013:20;;;18003:31;;17993:59;;18048:1;18045;18038:12;18063:1186;18226:6;18234;18242;18250;18258;18266;18274;18282;18290;18298;18306:7;18315;18369:3;18357:9;18348:7;18344:23;18340:33;18337:53;;;18386:1;18383;18376:12;18337:53;18418:9;18412:16;18468:26;18461:5;18457:38;18450:5;18447:49;18437:77;;18510:1;18507;18500:12;18437:77;18533:5;-1:-1:-1;18557:49:9;18602:2;18587:18;;18557:49;:::i;:::-;18547:59;;18625:49;18670:2;18659:9;18655:18;18625:49;:::i;:::-;18615:59;;18693:49;18738:2;18727:9;18723:18;18693:49;:::i;:::-;18683:59;;18761:49;18805:3;18794:9;18790:19;18761:49;:::i;:::-;18751:59;;18829:48;18872:3;18861:9;18857:19;18829:48;:::i;:::-;18819:58;;18896:48;18939:3;18928:9;18924:19;18896:48;:::i;:::-;18886:58;;18963:50;19008:3;18997:9;18993:19;18963:50;:::i;:::-;18953:60;;19053:3;19042:9;19038:19;19032:26;19022:36;;19098:3;19087:9;19083:19;19077:26;19067:36;;19123:50;19168:3;19157:9;19153:19;19123:50;:::i;:::-;19112:61;;19193:50;19238:3;19227:9;19223:19;19193:50;:::i;:::-;19182:61;;18063:1186;;;;;;;;;;;;;;:::o;19739:245::-;19818:6;19826;19879:2;19867:9;19858:7;19854:23;19850:32;19847:52;;;19895:1;19892;19885:12;19847:52;-1:-1:-1;;19918:16:9;;19974:2;19959:18;;;19953:25;19918:16;;19953:25;;-1:-1:-1;19739:245:9:o;20348:197::-;-1:-1:-1;;;;;20470:10:9;;;20482;;;20466:27;;20505:11;;;20502:37;;;20519:18;;:::i;:::-;20502:37;20348:197;;;;:::o;22055:184::-;22125:6;22178:2;22166:9;22157:7;22153:23;22149:32;22146:52;;;22194:1;22191;22184:12;22146:52;-1:-1:-1;22217:16:9;;22055:184;-1:-1:-1;22055:184:9:o;23403:306::-;23491:6;23499;23507;23560:2;23548:9;23539:7;23535:23;23531:32;23528:52;;;23576:1;23573;23566:12;23528:52;23605:9;23599:16;23589:26;;23655:2;23644:9;23640:18;23634:25;23624:35;;23699:2;23688:9;23684:18;23678:25;23668:35;;23403:306;;;;;:::o;25535:332::-;25742:6;25731:9;25724:25;25785:2;25780;25769:9;25765:18;25758:30;25705:4;25805:56;25857:2;25846:9;25842:18;25834:6;25805:56;:::i;:::-;25797:64;25535:332;-1:-1:-1;;;;25535:332:9:o;25872:1105::-;25967:6;25998:2;26041;26029:9;26020:7;26016:23;26012:32;26009:52;;;26057:1;26054;26047:12;26009:52;26090:9;26084:16;26119:18;26160:2;26152:6;26149:14;26146:34;;;26176:1;26173;26166:12;26146:34;26214:6;26203:9;26199:22;26189:32;;26259:7;26252:4;26248:2;26244:13;26240:27;26230:55;;26281:1;26278;26271:12;26230:55;26310:2;26304:9;26332:2;26328;26325:10;26322:36;;;26338:18;;:::i;:::-;26384:2;26381:1;26377:10;26416:2;26410:9;26479:2;26475:7;26470:2;26466;26462:11;26458:25;26450:6;26446:38;26534:6;26522:10;26519:22;26514:2;26502:10;26499:18;26496:46;26493:72;;;26545:18;;:::i;:::-;26581:2;26574:22;26631:18;;;26665:15;;;;-1:-1:-1;26707:11:9;;;26703:20;;;26735:19;;;26732:39;;;26767:1;26764;26757:12;26732:39;26791:11;;;;26811:135;26827:6;26822:3;26819:15;26811:135;;;26893:10;;26881:23;;26844:12;;;;26924;;;;26811:135;;;26965:6;25872:1105;-1:-1:-1;;;;;;;;25872:1105:9:o;26982:457::-;-1:-1:-1;;;;;27263:15:9;;;27245:34;;27315:15;;;;27310:2;27295:18;;27288:43;27362:2;27347:18;;27340:34;27417:14;;27410:22;27405:2;27390:18;;27383:50;27194:3;27179:19;;26982:457::o;27444:175::-;27481:3;27525:4;27518:5;27514:16;27554:4;27545:7;27542:17;27539:43;;27562:18;;:::i;:::-;27611:1;27598:15;;27444:175;-1:-1:-1;;27444:175:9:o

Swarm Source

ipfs://c5dc3940315c435c6beabfca4959bfa711b1f5b385ee48cabed45e61bb615dba
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.