S Price: $0.523825 (-12.25%)

Contract

0xF2488d965ae5548b26260EDF099E5c06c01f7BDC

Overview

S Balance

Sonic LogoSonic LogoSonic Logo1.037275492365702585 S

S Value

$0.54 (@ $0.52/S)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Process Liquidit...114887582025-03-03 22:22:2412 hrs ago1741040544IN
0xF2488d96...6c01f7BDC
0 S0.0016862455
Trigger Processi...114887172025-03-03 22:22:0812 hrs ago1741040528IN
0xF2488d96...6c01f7BDC
0 S0.0049383955
Add Initial Liqu...114884102025-03-03 22:20:0012 hrs ago1741040400IN
0xF2488d96...6c01f7BDC
0.05 S0.0113465555
Approve114879832025-03-03 22:17:1512 hrs ago1741040235IN
0xF2488d96...6c01f7BDC
0 S0.0029225460
Approve114875962025-03-03 22:14:4512 hrs ago1741040085IN
0xF2488d96...6c01f7BDC
0 S0.0018606160.5
Approve114872062025-03-03 22:12:0612 hrs ago1741039926IN
0xF2488d96...6c01f7BDC
0 S0.0029225460
Transfer114871102025-03-03 22:11:2312 hrs ago1741039883IN
0xF2488d96...6c01f7BDC
1 S0.0013929663.01
Add Initial Liqu...114868692025-03-03 22:09:3612 hrs ago1741039776IN
0xF2488d96...6c01f7BDC
50 S0.015189955
Approve Treasury...114868242025-03-03 22:09:1712 hrs ago1741039757IN
0xF2488d96...6c01f7BDC
0 S0.0029301255
Initialize114867672025-03-03 22:08:5412 hrs ago1741039734IN
0xF2488d96...6c01f7BDC
0 S0.1294028455

Latest 3 internal transactions

Parent Transaction Hash Block From To
114884102025-03-03 22:20:0012 hrs ago1741040400
0xF2488d96...6c01f7BDC
0.03727549 S
114884102025-03-03 22:20:0012 hrs ago1741040400
0xF2488d96...6c01f7BDC
0.05 S
114868692025-03-03 22:09:3612 hrs ago1741039776
0xF2488d96...6c01f7BDC
50 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FARMER

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at SonicScan.org on 2025-03-03
*/

/**
 *Submitted for verification at SonicScan.org on 2025-03-02
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.17;

// OpenZeppelin Contracts v5.0.1

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 amount) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address from, address to, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 */
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;
    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        require(_status != _ENTERED, "R1");
        _status = _ENTERED;
        _;
        _status = _NOT_ENTERED;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism
 */
abstract contract Ownable {
    address private _owner;

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

    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert("O1");
        }
        _transferOwnership(initialOwner);
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    function _checkOwner() internal view virtual {
        require(owner() == msg.sender, "O2");
    }

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "O1");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @dev Implementation of the {IERC20} interface.
 */
contract ERC20 is IERC20 {
    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

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

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

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

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

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

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

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

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, amount);
        return true;
    }

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

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, amount);
        return true;
    }

    function transferFrom(address from, address to, uint256 amount) public virtual returns (bool) {
        address spender = msg.sender;
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

    function _transfer(address from, address to, uint256 amount) internal virtual {
        require(from != address(0) && to != address(0), "E1");
        _beforeTokenTransfer(from, to, amount);
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "E2");
        unchecked {
            _balances[from] = fromBalance - amount;
            _balances[to] += amount;
        }
        emit Transfer(from, to, amount);
        _afterTokenTransfer(from, to, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "E3");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply += amount;
        unchecked {
            _balances[account] += amount;
        }
        emit Transfer(address(0), account, amount);
        _afterTokenTransfer(address(0), account, amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0) && spender != address(0), "E4");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _spendAllowance(address owner, address spender, uint256 amount) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        require(currentAllowance >= amount, "E5");
        unchecked {
            _approve(owner, spender, currentAllowance - amount);
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        // Boş implementasyon
    }
}

interface IMetropolisRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    // Mevcut fonksiyonlar
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    
    function swapExactTokensForTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);

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

    // Yeni eklenen fonksiyonlar
    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;

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

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
    
    function swapExactTokensForETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    // WETH ile ilgili fonksiyonlar
    function swapExactTokensForWETH(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
    
    function swapExactWETHForETH(
        uint wethAmount,
        uint amountOutMin,
        address to,
        uint deadline
    ) external returns (uint[] memory amounts);
}

interface IMetropolisFactory {
    function getPair(address tokenA, address tokenB) external view returns (address pair);
    function createPair(address tokenA, address tokenB) external returns (address pair);
}

// Pair interface'ini de ekleyelim
interface IMetropolisPair {
    function token0() external view returns (address);
    function token1() external view returns (address);
    function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
    function mint(address to) external returns (uint liquidity);
    function burn(address to) external returns (uint amount0, uint amount1);
    function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
}

// FARMER Token Contract
contract FARMER is ERC20, ReentrancyGuard, Ownable {
    // Constants
    uint256 private constant TOTAL_SUPPLY = 1_000_000 * 10**18;
    uint256 private constant TAX_RATE = 5; // 5%
    uint256 private constant LIQUIDITY_TAX = 25; // 2.5%
    uint256 private constant AIRDROP_TAX = 25; // 2.5%
    uint256 private constant MIN_HOLDER_AMOUNT = 10 * 10**18; // 10 tokens minimum for holder status
    uint256 private constant MIN_TOKENS_FOR_PROCESS = 100 * 10**18; // 100 tokens minimum for processing
    uint256 private constant SWAP_PERCENTAGE = 75; // 75% will be swapped
    uint256 private constant LIQUIDITY_PERCENTAGE = 25; // 25% will be used for liquidity
    uint256 private constant MAX_SLIPPAGE = 30; // 30% slippage tolerance

    // Metropolis DEX addresses
    IMetropolisRouter public metropolisRouter;
    IMetropolisFactory public metropolisFactory;
    address public sonicToken;
    address public liquidityPair;
    address public treasuryWallet;

    // Holder tracking
    mapping(address => bool) public isHolder;
    address[] public holders;

    // Events
    event LiquidityAdded(uint256 tokenAmount, uint256 sonicAmount);
    event AirdropDistributed(uint256 amount, uint256 holdersCount);
    event SwapFailed(string reason);
    event ProcessStarted(uint256 tokensForLiquidity, uint256 tokensForAirdrop);
    event SwapSuccessful(uint256 tokensSwapped, uint256 wethReceived);
    event TreasuryWalletUpdated(address oldTreasury, address newTreasury);
    event LiquidityAddFailed(string reason);
    event AirdropFailed(string reason);
    event ApprovalRefreshed(address token, address spender, uint256 amount);
    event WaitingForTreasuryTransfer(uint256 amount);

    uint256 private _pendingLiquidityTokens;
    uint256 private _pendingAirdropTokens;
    bool private _initialized;
    bool private _inSwap;

    constructor() ERC20("FARMER", "FARM") Ownable(msg.sender) {
        address _metropolisRouter = 0x95a7e403d7cF20F675fF9273D66e94d35ba49fA3;
        address _metropolisFactory = 0x1570300e9cFEC66c9Fb0C8bc14366C86EB170Ad0;
        address _sonicToken = 0x039e2fB66102314Ce7b64Ce5Ce3E5183bc94aD38;
        address _treasuryWallet = 0x95503A306cD81e08c0c43C49FAae71165937d175;

        require(_metropolisRouter != address(0) && _metropolisFactory != address(0) && _sonicToken != address(0) && _treasuryWallet != address(0), "F1");

        metropolisRouter = IMetropolisRouter(_metropolisRouter);
        metropolisFactory = IMetropolisFactory(_metropolisFactory);
        sonicToken = _sonicToken;
        treasuryWallet = _treasuryWallet;

        _mint(address(this), TOTAL_SUPPLY);
    }

    function initialize() external onlyOwner {
        require(!_initialized, "F2");
        _initialized = true;

        // Try to get existing pair first
        liquidityPair = metropolisFactory.getPair(address(this), sonicToken);
        
        // If pair doesn't exist, create it
        if (liquidityPair == address(0)) {
            liquidityPair = metropolisFactory.createPair(address(this), sonicToken);
        }
        
        require(liquidityPair != address(0), "F3");

        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        require(IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max), "F4");
        IERC20(sonicToken).approve(liquidityPair, type(uint256).max);
        IERC20(address(this)).approve(liquidityPair, type(uint256).max);
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        // Vergi işleme mantığı
        if (
            !_inSwap && 
            from != owner() && 
            to != owner() && 
            from != address(this) && 
            to == liquidityPair
        ) {
            // Vergi hesapla
            uint256 taxAmount = amount * TAX_RATE / 100;
            
            if (taxAmount > 0) {
                // Vergiyi likidite ve airdrop için ayır
                uint256 liquidityTokens = taxAmount * LIQUIDITY_TAX / 100;
                uint256 airdropTokens = taxAmount * AIRDROP_TAX / 100;
                
                // Vergi miktarını ana miktardan düş
                uint256 transferAmount = amount - taxAmount;
                
                // Vergiyi kontrata aktar
                super._transfer(from, address(this), taxAmount);
                
                // Kalan miktarı alıcıya aktar
                super._transfer(from, to, transferAmount);
                
                // Bekleyen miktarları güncelle
                _pendingLiquidityTokens += liquidityTokens;
                _pendingAirdropTokens += airdropTokens;
                
                // Eğer yeterli miktarda token biriktiysek işlemi başlat
                if (_pendingLiquidityTokens + _pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS) {
                    try this.processLiquidityAndAirdrop() {} catch {}
                }
                
                // Holder durumunu güncelle
                _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
                _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
                
                return;
            }
        }
        
        // Normal transfer
        super._transfer(from, to, amount);
        
        // Holder durumunu güncelle
        _updateHolder(from, balanceOf(from) >= MIN_HOLDER_AMOUNT);
        _updateHolder(to, balanceOf(to) >= MIN_HOLDER_AMOUNT);
    }

    function _updateHolder(address account, bool isHolderStatus) private {
        if (account != liquidityPair && account != address(this)) {
            if (isHolderStatus && !isHolder[account]) {
                isHolder[account] = true;
                holders.push(account);
            } else if (!isHolderStatus && isHolder[account]) {
                isHolder[account] = false;
                
                // Remove from holders array
                for (uint256 i = 0; i < holders.length; i++) {
                    if (holders[i] == account) {
                        holders[i] = holders[holders.length - 1];
                        holders.pop();
                        break;
                    }
                }
            }
        }
    }

    function processLiquidityAndAirdrop() external nonReentrant {
        require(!_inSwap, "AP");
        _inSwap = true;
        
        uint256 tokensForLiquidity = _pendingLiquidityTokens;
        uint256 tokensForAirdrop = _pendingAirdropTokens;
        
        if (tokensForLiquidity == 0 && tokensForAirdrop == 0) {
            _inSwap = false;
            return;
        }
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Reset pending amounts
        _pendingLiquidityTokens = 0;
        _pendingAirdropTokens = 0;
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Process swap
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        uint256 wethReceived = _processSwap(totalTokensToSwap);
        
        if (wethReceived == 0) {
            _inSwap = false;
            return;
        }
        
        // Treasury wallet'tan WETH'yi kontrata transfer etmeyi dene
        uint256 treasuryWethBalance = IERC20(sonicToken).balanceOf(treasuryWallet);
        if (treasuryWethBalance >= wethReceived) {
            // Treasury wallet'ın WETH'yi kontrata transfer etmesi için onayı kontrol et
            if (IERC20(sonicToken).allowance(treasuryWallet, address(this)) >= wethReceived) {
                // Treasury wallet'tan WETH'yi kontrata transfer et
                bool success = IERC20(sonicToken).transferFrom(treasuryWallet, address(this), wethReceived);
                
                if (!success) {
                    emit SwapFailed("WETH transfer from treasury failed");
                    _inSwap = false;
                    return;
                }
            } else {
                emit SwapFailed("Treasury wallet has not approved WETH transfer");
                _inSwap = false;
                return;
            }
        } else {
            emit SwapFailed("Treasury wallet does not have enough WETH");
            _inSwap = false;
            return;
        }
        
        // Kontratın WETH bakiyesini kontrol et
        uint256 contractWETHBalance = IERC20(sonicToken).balanceOf(address(this));
        if (contractWETHBalance == 0) {
            emit SwapFailed("No WETH received from treasury wallet");
            _inSwap = false;
            return;
        }
        
        // Calculate amounts
        uint256 wethForLiquidity = contractWETHBalance * tokensForLiquidity / totalTokensToSwap;
        uint256 wethForAirdrop = contractWETHBalance - wethForLiquidity;
        
        // WETH'nin bir kısmını ETH'ye çevir ve likidite ekle
        if (wethForLiquidity > 0) {
            _processLiquidity(wethForLiquidity, tokensForLiquidity);
        }
        
        // Process airdrop with WETH
        if (wethForAirdrop > 0) {
            _processAirdropWithWETH(wethForAirdrop);
        }
        
        _inSwap = false;
    }

    // Likidite işlemini ayrı bir fonksiyona taşıdık
    function _processLiquidity(uint256 wethAmount, uint256 tokenAmount) private {
        // WETH -> ETH dönüşümü için onay ver
        IERC20(sonicToken).approve(address(metropolisRouter), wethAmount);
        
        // Adres dizisini oluştur
        address[] memory path = new address[](2);
        path[0] = sonicToken;
        path[1] = metropolisRouter.WETH();
        
        try metropolisRouter.swapExactTokensForETH(
            wethAmount,
            0, // Minimum çıktı miktarı
            path,
            address(this),
            block.timestamp + 600
        ) {
            // ETH alındı, şimdi likidite ekle
            uint256 ethBalance = address(this).balance;
            if (ethBalance > 0) {
                _addLiquidity(ethBalance, tokenAmount);
            }
        } catch Error(string memory reason) {
            emit SwapFailed(reason);
        } catch {
            emit SwapFailed("WETH to ETH swap failed");
        }
    }

    // Likidite ekleme işlemini ayrı bir fonksiyona taşıdık
    function _addLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        uint256 minTokenAmount = tokenAmount * (100 - MAX_SLIPPAGE) / 100;
        uint256 minEthAmount = ethAmount * (100 - MAX_SLIPPAGE) / 100;
        
        try metropolisRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            minTokenAmount,
            minEthAmount,
            address(this),
            block.timestamp + 600
        ) {
            emit LiquidityAdded(tokenAmount, ethAmount);
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("E");
        }
    }

    function _processSwap(uint256 tokenAmount) private returns (uint256) {
        if (tokenAmount == 0) return 0;
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = sonicToken;
        
        // FARMER -> WETH swap işlemi
        try metropolisRouter.swapExactTokensForTokens(
            tokenAmount,
            0, // Minimum çıktı miktarı
            path,
            treasuryWallet, // WETH'yi treasury wallet'a gönder
            block.timestamp + 600
        ) returns (uint[] memory amounts) {
            uint256 wethReceived = amounts[amounts.length - 1];
            emit SwapSuccessful(tokenAmount, wethReceived);
            return wethReceived;
        } catch Error(string memory reason) {
            emit SwapFailed(reason);
            return 0;
        } catch {
            emit SwapFailed("E");
            return 0;
        }
    }

    // WETH ile airdrop işlemi
    function _processAirdropWithWETH(uint256 amount) private {
        uint256 holdersCount = holders.length;
        if (holdersCount == 0 || amount == 0) return;
        
        uint256 amountPerHolder = amount / holdersCount;
        if (amountPerHolder == 0) return;
        
        for (uint256 i = 0; i < holdersCount; i++) {
            address holder = holders[i];
            if (holder != address(0) && holder != address(this) && holder != liquidityPair) {
                bool success = IERC20(sonicToken).transfer(holder, amountPerHolder);
                if (!success) {
                    // Başarısız olursa sessizce devam et
                }
            }
        }
        
        emit AirdropDistributed(amount, holdersCount);
    }

    // View functions
    function getHolderCount() external view returns (uint256) {
        return holders.length;
    }
    
    function getHolders() external view returns (address[] memory) {
        return holders;
    }

    // Initial liquidity function with WSonic
    function addInitialLiquidityWithWSonic(uint256 tokenAmount, uint256 sonicAmount) external onlyOwner {
        require(tokenAmount > 0, "NT");
        require(sonicAmount > 0, "NS");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "IB"
        );
        
        require(
            IERC20(sonicToken).balanceOf(msg.sender) >= sonicAmount,
            "IS"
        );
        
        // WSonic token'ları kontrata transfer et
        require(
            IERC20(sonicToken).transferFrom(msg.sender, address(this), sonicAmount),
            "TF"
        );
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        IERC20(sonicToken).approve(address(metropolisRouter), sonicAmount);
        
        try metropolisRouter.addLiquidity(
            address(this),
            sonicToken,
            tokenAmount,
            sonicAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum sonic miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, sonicAmount);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert("FL");
        }
        
        // Kalan WSonic token'ları geri gönder
        uint256 remainingWSonic = IERC20(sonicToken).balanceOf(address(this));
        if (remainingWSonic > 0) {
            IERC20(sonicToken).transfer(msg.sender, remainingWSonic);
        }
    }

    // Tüm FARMER tokenlarını likiditeye eklemek için fonksiyon
    function addInitialLiquidityWithAllTokens(uint256 sonicAmount) external onlyOwner {
        uint256 tokenAmount = IERC20(address(this)).balanceOf(address(this));
        require(tokenAmount > 0, "NT");
        require(sonicAmount > 0, "NS");
        
        require(
            IERC20(sonicToken).balanceOf(msg.sender) >= sonicAmount,
            "IS"
        );
        
        // WSonic token'ları kontrata transfer et
        require(
            IERC20(sonicToken).transferFrom(msg.sender, address(this), sonicAmount),
            "TF"
        );
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        IERC20(sonicToken).approve(address(metropolisRouter), sonicAmount);
        
        try metropolisRouter.addLiquidity(
            address(this),
            sonicToken,
            tokenAmount,
            sonicAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum sonic miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, sonicAmount);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            IERC20(sonicToken).approve(address(metropolisRouter), 0);
            
            // WSonic token'ları geri gönder
            IERC20(sonicToken).transfer(msg.sender, sonicAmount);
            
            revert("FL");
        }
        
        // Kalan WSonic token'ları geri gönder
        uint256 remainingWSonic = IERC20(sonicToken).balanceOf(address(this));
        if (remainingWSonic > 0) {
            IERC20(sonicToken).transfer(msg.sender, remainingWSonic);
        }
    }

    // ETH ile başlangıç likidite ekleme fonksiyonu
    function addInitialLiquidityWithETH(uint256 tokenAmount) external payable onlyOwner {
        require(tokenAmount > 0, "NT");
        require(msg.value > 0, "NE");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "IB"
        );
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum ETH miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, msg.value);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert("FL");
        }
    }

    // Tüm FARMER tokenlarını ETH ile likiditeye eklemek için fonksiyon
    function addInitialLiquidityWithAllTokensAndETH() external payable onlyOwner {
        uint256 tokenAmount = IERC20(address(this)).balanceOf(address(this));
        require(tokenAmount > 0, "NT");
        require(msg.value > 0, "NE");
        
        // Onayları ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0, // Minimum token miktarı 0 olarak ayarlandı
            0, // Minimum ETH miktarı 0 olarak ayarlandı
            msg.sender,
            block.timestamp + 600 // Deadline'ı artırdık
        ) {
            emit LiquidityAdded(tokenAmount, msg.value);
        } catch Error(string memory reason) {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert(reason); // Hata mesajını döndür
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            
            // ETH'yi geri gönder
            payable(msg.sender).transfer(address(this).balance);
            
            revert("FL");
        }
    }

    function setRouter(address _router) external onlyOwner {
        require(_router != address(0), "IR");
        metropolisRouter = IMetropolisRouter(_router);
    }

    function rescueTokens(address _token, uint256 _amount) external onlyOwner {
        require(_token != address(this), "CF");
        IERC20(_token).transfer(owner(), _amount);
    }

    // View functions for pending amounts
    function getPendingLiquidityTokens() external view returns (uint256) {
        return _pendingLiquidityTokens;
    }

    function getPendingAirdropTokens() external view returns (uint256) {
        return _pendingAirdropTokens;
    }

    // Manual trigger for processing (only owner)
    function triggerProcessing() external onlyOwner {
        require(_pendingLiquidityTokens > 0 || _pendingAirdropTokens > 0, "NP");
        require(holders.length > 0, "NH");
        try this.processLiquidityAndAirdrop() {
            // Process successful
        } catch {
            emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
        }
    }

    // Router için onayları yenile
    function refreshAllApprovals() external onlyOwner {
        // Router için onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Sonic token için onayları yenile
        try IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max) {
            emit ApprovalRefreshed(sonicToken, address(metropolisRouter), type(uint256).max);
        } catch {}
        
        // Likidite çifti için onayları yenile
        if (liquidityPair != address(0)) {
            try IERC20(sonicToken).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(sonicToken, liquidityPair, type(uint256).max);
            } catch {}
            
            try IERC20(address(this)).approve(liquidityPair, type(uint256).max) {
                emit ApprovalRefreshed(address(this), liquidityPair, type(uint256).max);
            } catch {}
        }
    }

    // Set treasury wallet (only owner)
    function setTreasuryWallet(address _treasuryWallet) external onlyOwner {
        require(_treasuryWallet != address(0), "IT");
        address oldTreasury = treasuryWallet;
        treasuryWallet = _treasuryWallet;
        emit TreasuryWalletUpdated(oldTreasury, _treasuryWallet);
    }

    // Treasury wallet'ın kontrata WSonic token transferi için onay vermesini sağla
    function approveTreasuryToContract() external {
        require(msg.sender == treasuryWallet, "OT");
        require(IERC20(sonicToken).approve(address(this), type(uint256).max), "AF");
    }

    function manualLiquidityAndAirdrop() external onlyOwner {
        require(!_inSwap, "AP");
        _inSwap = true;
        
        // Calculate amounts based on tax rates
        uint256 contractBalance = IERC20(address(this)).balanceOf(address(this));
        require(contractBalance > 0, "NB");
        
        uint256 tokensForLiquidity = contractBalance * LIQUIDITY_TAX / (LIQUIDITY_TAX + AIRDROP_TAX);
        uint256 tokensForAirdrop = contractBalance - tokensForLiquidity;
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Process swap
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        uint256 wethReceived = _processSwap(totalTokensToSwap);
        
        if (wethReceived == 0) {
            _inSwap = false;
            return;
        }
        
        // Treasury wallet'tan WETH transferini bekle
        emit WaitingForTreasuryTransfer(wethReceived);
        
        // Kontratın WETH bakiyesini kontrol et
        uint256 contractWETHBalance = IERC20(sonicToken).balanceOf(address(this));
        if (contractWETHBalance == 0) {
            emit SwapFailed("No WETH received from treasury wallet");
            _inSwap = false;
            return;
        }
        
        // Calculate amounts
        uint256 wethForLiquidity = contractWETHBalance * tokensForLiquidity / totalTokensToSwap;
        uint256 wethForAirdrop = contractWETHBalance - wethForLiquidity;
        
        // WETH'nin bir kısmını ETH'ye çevir ve likidite ekle
        if (wethForLiquidity > 0) {
            _processLiquidity(wethForLiquidity, tokensForLiquidity);
        }
        
        // Process airdrop with WETH
        if (wethForAirdrop > 0) {
            _processAirdropWithWETH(wethForAirdrop);
        }
        
        _inSwap = false;
    }

    receive() external payable {}

    // ETH ile airdrop işlemi
    function _processAirdropWithETH(uint256 amount) private {
        uint256 holdersCount = holders.length;
        if (holdersCount == 0 || amount == 0) return;
        
        uint256 amountPerHolder = amount / holdersCount;
        if (amountPerHolder == 0) return;
        
        for (uint256 i = 0; i < holdersCount; i++) {
            address holder = holders[i];
            if (holder != address(0) && holder != address(this) && holder != liquidityPair) {
                (bool success, ) = payable(holder).call{value: amountPerHolder}("");
                if (!success) {
                    // Başarısız olursa sessizce devam et
                }
            }
        }
        
        emit AirdropDistributed(amount, holdersCount);
    }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"holdersCount","type":"uint256"}],"name":"AirdropDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"AirdropFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ApprovalRefreshed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"LiquidityAddFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"LiquidityAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensForLiquidity","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensForAirdrop","type":"uint256"}],"name":"ProcessStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"SwapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"wethReceived","type":"uint256"}],"name":"SwapSuccessful","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldTreasury","type":"address"},{"indexed":false,"internalType":"address","name":"newTreasury","type":"address"}],"name":"TreasuryWalletUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WaitingForTreasuryTransfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"addInitialLiquidityWithAllTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addInitialLiquidityWithAllTokensAndETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"addInitialLiquidityWithETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"internalType":"uint256","name":"sonicAmount","type":"uint256"}],"name":"addInitialLiquidityWithWSonic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"approveTreasuryToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolderCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getHolders","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingAirdropTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingLiquidityTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"metropolisFactory","outputs":[{"internalType":"contract IMetropolisFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metropolisRouter","outputs":[{"internalType":"contract IMetropolisRouter","name":"","type":"address"}],"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":"processLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshAllApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b5033604051806040016040528060068152602001652320a926a2a960d11b815250604051806040016040528060048152602001634641524d60e01b815250816003908162000060919062000314565b5060046200006f828262000314565b50506001600555506001600160a01b038116620000b85760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064015b60405180910390fd5b620000c38162000171565b50600780547395a7e403d7cf20f675ff9273d66e94d35ba49fa36001600160a01b0319918216811790925560088054731570300e9cfec66c9fb0c8bc14366c86eb170ad090831681179091556009805473039e2fb66102314ce7b64ce5ce3e5183bc94ad389084168117909155600b80547395503a306cd81e08c0c43c49faae71165937d1759416841790559091620001673069d3c21bcecceda1000000620001c3565b5050505062000408565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002005760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401620000af565b8060026000828254620002149190620003e0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200029b57607f821691505b602082108103620002bc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026b57600081815260208120601f850160051c81016020861015620002eb5750805b601f850160051c820191505b818110156200030c57828155600101620002f7565b505050505050565b81516001600160401b0381111562000330576200033062000270565b620003488162000341845462000286565b84620002c2565b602080601f831160018114620003805760008415620003675750858301515b600019600386901b1c1916600185901b1785556200030c565b600085815260208120601f198616915b82811015620003b15788860151825594840194600190910190840162000390565b5085821015620003d05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200040257634e487b7160e01b600052601160045260246000fd5b92915050565b613eb280620004186000396000f3fe6080604052600436106102085760003560e01c80637ac84fc111610118578063ac3508e8116100a0578063dd62ed3e1161006f578063dd62ed3e146105ba578063e3a8fa5514610600578063ed9cacfe14610608578063f2fde38b1461061d578063fd7c9fab1461063d57600080fd5b8063ac3508e814610542578063c0d7865514610555578063c5eaf1e914610575578063d4d7b19a1461058a57600080fd5b80638da5cb5b116100e75780638da5cb5b146104af57806395d89b41146104cd578063975b87e8146104e2578063a8602fea14610502578063a9059cbb1461052257600080fd5b80637ac84fc1146104505780637ff793d314610465578063808a54571461047a5780638129fc1c1461049a57600080fd5b8063397883d21161019b5780635d76b04c1161016a5780635d76b04c146103ae5780635fe8e7cc146103c357806362b6327a146103e557806370a08231146104055780637136982b1461043b57600080fd5b8063397883d214610339578063461a3a951461034e5780634626402b1461036e578063573761981461038e57600080fd5b80631fed05c3116101d75780631fed05c3146102a357806323b872dd146102c55780632a11ced0146102e5578063313ce5671461031d57600080fd5b806306fdde031461021457806308dee2b41461023f578063095ea7b31461025e57806318160ddd1461028e57600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b5061022961065d565b604051610236919061381b565b60405180910390f35b34801561024b57600080fd5b50600e545b604051908152602001610236565b34801561026a57600080fd5b5061027e61027936600461387e565b6106ef565b6040519015158152602001610236565b34801561029a57600080fd5b50600254610250565b3480156102af57600080fd5b506102c36102be3660046138aa565b610709565b005b3480156102d157600080fd5b5061027e6102e03660046138c3565b610ddb565b3480156102f157600080fd5b506103056103003660046138aa565b610dff565b6040516001600160a01b039091168152602001610236565b34801561032957600080fd5b5060405160128152602001610236565b34801561034557600080fd5b506102c3610e29565b34801561035a57600080fd5b50600954610305906001600160a01b031681565b34801561037a57600080fd5b50600b54610305906001600160a01b031681565b34801561039a57600080fd5b506102c36103a936600461387e565b610f42565b3480156103ba57600080fd5b50600f54610250565b3480156103cf57600080fd5b506103d8611009565b6040516102369190613948565b3480156103f157600080fd5b50600754610305906001600160a01b031681565b34801561041157600080fd5b50610250610420366004613962565b6001600160a01b031660009081526020819052604090205490565b34801561044757600080fd5b50600d54610250565b34801561045c57600080fd5b506102c361106a565b34801561047157600080fd5b506102c3611584565b34801561048657600080fd5b50600a54610305906001600160a01b031681565b3480156104a657600080fd5b506102c361166b565b3480156104bb57600080fd5b506006546001600160a01b0316610305565b3480156104d957600080fd5b506102296119e1565b3480156104ee57600080fd5b506102c36104fd36600461397f565b6119f0565b34801561050e57600080fd5b506102c361051d366004613962565b611f25565b34801561052e57600080fd5b5061027e61053d36600461387e565b611fc9565b6102c36105503660046138aa565b611fd7565b34801561056157600080fd5b506102c3610570366004613962565b612243565b34801561058157600080fd5b506102c36122a8565b34801561059657600080fd5b5061027e6105a5366004613962565b600c6020526000908152604090205460ff1681565b3480156105c657600080fd5b506102506105d53660046139a1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102c3612593565b34801561061457600080fd5b506102c3612654565b34801561062957600080fd5b506102c3610638366004613962565b6128cd565b34801561064957600080fd5b50600854610305906001600160a01b031681565b60606003805461066c906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054610698906139da565b80156106e55780601f106106ba576101008083540402835291602001916106e5565b820191906000526020600020905b8154815290600101906020018083116106c857829003601f168201915b5050505050905090565b6000336106fd818585612919565b60019150505b92915050565b6107116129cb565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561074f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107739190613a0e565b90506000811161079e5760405162461bcd60e51b815260040161079590613a27565b60405180910390fd5b600082116107d35760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610795565b6009546040516370a0823160e01b815233600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f9190613a0e565b10156108725760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610795565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906108a690339030908790600401613a43565b6020604051808303816000875af11580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613a67565b61091a5760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610795565b6007546109329030906001600160a01b031683612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610968929116908690600401613a89565b6020604051808303816000875af1158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613a67565b506007546009546001600160a01b039182169163e8e33700913091168486600080336109d942610258613ab8565b6040518963ffffffff1660e01b81526004016109fc989796959493929190613acb565b6060604051808303816000875af1925050508015610a37575060408051601f3d908101601f19168201909252610a3491810190613b14565b60015b610cbf57610a43613b42565b806308c379a003610b865750610a57613ba1565b80610a625750610b88565b600754610a7b9030906001600160a01b03166000612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610ab292911690600090600401613a89565b6020604051808303816000875af1158015610ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af59190613a67565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610b289033908790600401613a89565b6020604051808303816000875af1158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b9190613a67565b508060405162461bcd60e51b8152600401610795919061381b565b505b600754610ba19030906001600160a01b03166000612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610bd892911690600090600401613a89565b6020604051808303816000875af1158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613a67565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610c4e9033908690600401613a89565b6020604051808303816000875af1158015610c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c919190613a67565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610795565b50506040805183815260208101859052600080516020613e5d8339815191529250015b60405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d579190613a0e565b90508015610dd65760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d919033908590600401613a89565b6020604051808303816000875af1158015610db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd49190613a67565b505b505050565b600033610de9858285612a19565b610df4858585612a81565b506001949350505050565b600d8181548110610e0f57600080fd5b6000918252602090912001546001600160a01b0316905081565b610e316129cb565b6000600e541180610e4457506000600f54115b610e755760405162461bcd60e51b815260206004820152600260248201526104e560f41b6044820152606401610795565b600d54610ea95760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610795565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ee457600080fd5b505af1925050508015610ef5575060015b610f40577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f54604051610f37929190918252602082015260400190565b60405180910390a15b565b610f4a6129cb565b306001600160a01b03831603610f875760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610795565b816001600160a01b031663a9059cbb610fa86006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610fc6929190613a89565b6020604051808303816000875af1158015610fe5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190613a67565b6060600d8054806020026020016040519081016040528092919081815260200182805480156106e557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611043575050505050905090565b6002600554036110a15760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610795565b6002600555601054610100900460ff16156110e35760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610795565b6010805461ff001916610100179055600e54600f5481158015611104575080155b1561111b5750506010805461ff001916905561157d565b60408051838152602081018390527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16000600e819055600f556007546111789030906001600160a01b0316600019612919565b60006111848284613ab8565b9050600061119182612cd9565b9050806000036111b05750506010805461ff00191690555061157d9050565b600954600b546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015611201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112259190613a0e565b905081811061143257600954600b54604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528492919091169063dd62ed3e90604401602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a89190613a0e565b106113b057600954600b546040516323b872dd60e01b81526000926001600160a01b03908116926323b872dd926112e9929091169030908890600401613a43565b6020604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190613a67565b9050806113aa57600080516020613e3d83398151915260405161138b9060208082526022908201527f57455448207472616e736665722066726f6d207472656173757279206661696c604082015261195960f21b606082015260800190565b60405180910390a150506010805461ff00191690555061157d92505050565b50611491565b600080516020613e3d833981519152604051611414906020808252602e908201527f54726561737572792077616c6c657420686173206e6f7420617070726f76656460408201526d102ba2aa24103a3930b739b332b960911b606082015260800190565b60405180910390a150506010805461ff00191690555061157d915050565b600080516020613e3d8339815191526040516114149060208082526029908201527f54726561737572792077616c6c657420646f6573206e6f74206861766520656e6040820152680deeaced040ae8aa8960bb1b606082015260800190565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe9190613a0e565b90508060000361152357600080516020613e3d83398151915260405161138b90613c2b565b6000846115308884613c70565b61153a9190613c87565b905060006115488284613ca9565b9050811561155a5761155a8289612f04565b801561156957611569816131a3565b50506010805461ff00191690555050505050505b6001600555565b600b546001600160a01b031633146115c35760405162461bcd60e51b815260206004820152600260248201526113d560f21b6044820152606401610795565b60095460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906115f790309060001990600401613a89565b6020604051808303816000875af1158015611616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163a9190613a67565b610f405760405162461bcd60e51b815260206004820152600260248201526120a360f11b6044820152606401610795565b6116736129cb565b60105460ff16156116ab5760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610795565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa15801561170a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172e9190613cbc565b600a80546001600160a01b0319166001600160a01b039290921691821790556117ea576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613cbc565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166118275760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610795565b6007546118419030906001600160a01b0316600019612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926118799291169060001990600401613a89565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613a67565b6118ed5760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610795565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926119259291169060001990600401613a89565b6020604051808303816000875af1158015611944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119689190613a67565b50600a5460405163095ea7b360e01b8152309163095ea7b39161199b916001600160a01b03169060001990600401613a89565b6020604051808303816000875af11580156119ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119de9190613a67565b50565b60606004805461066c906139da565b6119f86129cb565b60008211611a185760405162461bcd60e51b815260040161079590613a27565b60008111611a4d5760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610795565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aae9190613a0e565b1015611ae15760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610795565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4d9190613a0e565b1015611b805760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610795565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611bb490339030908690600401613a43565b6020604051808303816000875af1158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf79190613a67565b611c285760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610795565b600754611c409030906001600160a01b031684612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611c76929116908590600401613a89565b6020604051808303816000875af1158015611c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb99190613a67565b506007546009546001600160a01b039182169163e8e3370091309116858560008033611ce742610258613ab8565b6040518963ffffffff1660e01b8152600401611d0a989796959493929190613acb565b6060604051808303816000875af1925050508015611d45575060408051601f3d908101601f19168201909252611d4291810190613b14565b60015b611efe57611d51613b42565b806308c379a003611e365750611d65613ba1565b80611d705750611e38565b600754611d899030906001600160a01b03166000612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611dc092911690600090600401613a89565b6020604051808303816000875af1158015611ddf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e039190613a67565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610b289033908690600401613a89565b505b600754611e519030906001600160a01b03166000612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611e8892911690600090600401613a89565b6020604051808303816000875af1158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190613a67565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610c4e9033908590600401613a89565b50506040805184815260208101849052600080516020613e5d833981519152925001610ce2565b611f2d6129cb565b6001600160a01b038116611f685760405162461bcd60e51b8152602060048201526002602482015261125560f21b6044820152606401610795565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4910160405180910390a15050565b6000336106fd818585612a81565b611fdf6129cb565b60008111611fff5760405162461bcd60e51b815260040161079590613a27565b600034116120345760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610795565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120959190613a0e565b10156120c85760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610795565b6007546120e09030906001600160a01b031683612919565b6007546001600160a01b031663f305d7193430846000803361210442610258613ab8565b6040518863ffffffff1660e01b815260040161212596959493929190613cd9565b60606040518083038185885af193505050508015612160575060408051601f3d908101601f1916820190925261215d91810190613b14565b60015b6122175761216c613b42565b806308c379a0036121d05750612180613ba1565b8061218b57506121d2565b6007546121a49030906001600160a01b03166000612919565b60405133904780156108fc02916000818181858888f19350505050158015610b6b573d6000803e3d6000fd5b505b6007546121eb9030906001600160a01b03166000612919565b60405133904780156108fc02916000818181858888f19350505050158015610c91573d6000803e3d6000fd5b505060408051838152346020820152600080516020613e5d83398151915292500160405180910390a150565b61224b6129cb565b6001600160a01b0381166122865760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610795565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6122b06129cb565b601054610100900460ff16156122ed5760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610795565b6010805461ff0019166101001790556040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561233a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235e9190613a0e565b9050600081116123955760405162461bcd60e51b8152602060048201526002602482015261272160f11b6044820152606401610795565b60006123a2601980613ab8565b6123ad601984613c70565b6123b79190613c87565b905060006123c58284613ca9565b60408051848152602081018390529192507f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a160075461241b9030906001600160a01b0316600019612919565b60006124278284613ab8565b9050600061243482612cd9565b9050806000036124545750506010805461ff001916905550610f40915050565b6040518181527f0feedab68cd870984eb1996ea868562d5f26bf492165c4ff94e43910877acdad9060200160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156124d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f49190613a0e565b90508060000361253857600080516020613e3d83398151915260405161251990613c2b565b60405180910390a150506010805461ff001916905550610f4092505050565b6000836125458784613c70565b61254f9190613c87565b9050600061255d8284613ca9565b9050811561256f5761256f8288612f04565b801561257e5761257e816131a3565b50506010805461ff0019169055505050505050565b61259b6129cb565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa1580156125d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fd9190613a0e565b90506000811161261f5760405162461bcd60e51b815260040161079590613a27565b600034116120c85760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610795565b61265c6129cb565b6007546126769030906001600160a01b0316600019612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926126ae9291169060001990600401613a89565b6020604051808303816000875af19250505080156126e9575060408051601f3d908101601f191682019092526126e691810190613a67565b60015b1561273f57506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612736926001600160a01b039182169291169060001990613a43565b60405180910390a15b600a546001600160a01b031615610f4057600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926127889291169060001990600401613a89565b6020604051808303816000875af19250505080156127c3575060408051601f3d908101601f191682019092526127c091810190613a67565b60015b156128195750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612810926001600160a01b039182169291169060001990613a43565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b39161284b916001600160a01b03169060001990600401613a89565b6020604051808303816000875af1925050508015612886575060408051601f3d908101601f1916820190925261288391810190613a67565b60015b15610f405750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca91610f379130916001600160a01b03169060001990613a43565b6128d56129cb565b6001600160a01b0381166129105760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610795565b6119de81613306565b6001600160a01b0383161580159061293957506001600160a01b03821615155b61296a5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610795565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b336129de6006546001600160a01b031690565b6001600160a01b031614610f405760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610795565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205481811015612a745760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610795565b610dd48484848403612919565b601054610100900460ff16158015612aa757506006546001600160a01b03848116911614155b8015612ac157506006546001600160a01b03838116911614155b8015612ad657506001600160a01b0383163014155b8015612aef5750600a546001600160a01b038381169116145b15612c765760006064612b03600584613c70565b612b0d9190613c87565b90508015612c745760006064612b24601984613c70565b612b2e9190613c87565b905060006064612b3f601985613c70565b612b499190613c87565b90506000612b578486613ca9565b9050612b64873086613358565b612b6f878783613358565b82600e6000828254612b819190613ab8565b9250508190555081600f6000828254612b9a9190613ab8565b9091555050600f54600e5468056bc75e2d6310000091612bb991613ab8565b10612c0c57306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612bf957600080fd5b505af1925050508015612c0a575060015b505b612c3f87678ac7230489e80000612c388a6001600160a01b031660009081526020819052604090205490565b101561345d565b612c6b86678ac7230489e80000612c38896001600160a01b031660009081526020819052604090205490565b50505050505050565b505b612c81838383613358565b612cad83678ac7230489e80000612c38866001600160a01b031660009081526020819052604090205490565b610dd682678ac7230489e80000612c38856001600160a01b031660009081526020819052604090205490565b600081600003612ceb57506000919050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612d2057612d20613d14565b6001600160a01b039283166020918202929092010152600954825191169082906001908110612d5157612d51613d14565b6001600160a01b039283166020918202929092010152600754600b54908216916338ed1739918691600091869116612d8b42610258613ab8565b6040518663ffffffff1660e01b8152600401612dab959493929190613d2a565b6000604051808303816000875af1925050508015612deb57506040513d6000823e601f3d908101601f19168201604052612de89190810190613d66565b60015b612e8957612df7613b42565b806308c379a003612e455750612e0b613ba1565b80612e165750612e47565b600080516020613e3d83398151915281604051612e33919061381b565b60405180910390a15060009392505050565b505b600080516020613e3d833981519152604051612e78906020808252600190820152604560f81b604082015260600190565b60405180910390a150600092915050565b60008160018351612e9a9190613ca9565b81518110612eaa57612eaa613d14565b602002602001015190507fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc018582604051612eee929190918252602082015260400190565b60405180910390a1949350505050565b50919050565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392612f3a929116908690600401613a89565b6020604051808303816000875af1158015612f59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7d9190613a67565b50604080516002808252606082018352600092602083019080368337505060095482519293506001600160a01b031691839150600090612fbf57612fbf613d14565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303c9190613cbc565b8160018151811061304f5761304f613d14565b6001600160a01b039283166020918202929092010152600754166318cbafe5846000843061307f42610258613ab8565b6040518663ffffffff1660e01b815260040161309f959493929190613d2a565b6000604051808303816000875af19250505080156130df57506040513d6000823e601f3d908101601f191682016040526130dc9190810190613d66565b60015b613191576130eb613b42565b806308c379a00361313557506130ff613ba1565b8061310a5750613137565b600080516020613e3d83398151915281604051613127919061381b565b60405180910390a150505050565b505b600080516020613e3d8339815191526040516131849060208082526017908201527f5745544820746f204554482073776170206661696c6564000000000000000000604082015260600190565b60405180910390a1505050565b50478015610dd457610dd48184613670565b600d548015806131b1575081155b156131ba575050565b60006131c68284613c87565b9050806000036131d557505050565b60005b828110156132cf576000600d82815481106131f5576131f5613d14565b6000918252602090912001546001600160a01b03169050801580159061322457506001600160a01b0381163014155b801561323e5750600a546001600160a01b03828116911614155b156132bc5760095460405163a9059cbb60e01b81526000916001600160a01b03169063a9059cbb906132769085908890600401613a89565b6020604051808303816000875af1158015613295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b99190613a67565b50505b50806132c781613e0d565b9150506131d8565b5060408051848152602081018490527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c2179101613184565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383161580159061337857506001600160a01b03821615155b6133a95760405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606401610795565b6001600160a01b038316600090815260208190526040902054818110156133f75760405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606401610795565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610dd4565b600a546001600160a01b0383811691161480159061348457506001600160a01b0382163014155b1561366c578080156134af57506001600160a01b0382166000908152600c602052604090205460ff16155b1561351b57506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b8015801561354157506001600160a01b0382166000908152600c602052604090205460ff165b1561366c576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610dd657826001600160a01b0316600d828154811061358e5761358e613d14565b6000918252602090912001546001600160a01b03160361365a57600d80546135b890600190613ca9565b815481106135c8576135c8613d14565b600091825260209091200154600d80546001600160a01b0390921691839081106135f4576135f4613d14565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d80548061363357613633613e26565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061366481613e0d565b915050613567565b5050565b6000606461367f601e82613ca9565b6136899084613c70565b6136939190613c87565b9050600060646136a4601e82613ca9565b6136ae9086613c70565b6136b89190613c87565b6007549091506001600160a01b031663f305d7198530868686836136de42610258613ab8565b6040518863ffffffff1660e01b81526004016136ff96959493929190613cd9565b60606040518083038185885af19350505050801561373a575060408051601f3d908101601f1916820190925261373791810190613b14565b60015b6137f457613746613b42565b806308c379a0036137a2575061375a613ba1565b8061376557506137a4565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad81604051613794919061381b565b60405180910390a150610dd4565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad6040516137e7906020808252600190820152604560f81b604082015260600190565b60405180910390a1610dd4565b50506040805185815260208101879052600080516020613e5d833981519152925001613127565b600060208083528351808285015260005b818110156138485785810183015185820160400152820161382c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146119de57600080fd5b6000806040838503121561389157600080fd5b823561389c81613869565b946020939093013593505050565b6000602082840312156138bc57600080fd5b5035919050565b6000806000606084860312156138d857600080fd5b83356138e381613869565b925060208401356138f381613869565b929592945050506040919091013590565b600081518084526020808501945080840160005b8381101561393d5781516001600160a01b031687529582019590820190600101613918565b509495945050505050565b60208152600061395b6020830184613904565b9392505050565b60006020828403121561397457600080fd5b813561395b81613869565b6000806040838503121561399257600080fd5b50508035926020909101359150565b600080604083850312156139b457600080fd5b82356139bf81613869565b915060208301356139cf81613869565b809150509250929050565b600181811c908216806139ee57607f821691505b602082108103612efe57634e487b7160e01b600052602260045260246000fd5b600060208284031215613a2057600080fd5b5051919050565b602080825260029082015261139560f21b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215613a7957600080fd5b8151801515811461395b57600080fd5b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561070357610703613aa2565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b600080600060608486031215613b2957600080fd5b8351925060208401519150604084015190509250925092565b600060033d1115613b5b5760046000803e5060005160e01c5b90565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715613b9a57613b9a613b5e565b6040525050565b600060443d1015613baf5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715613bdf57505050505090565b8285019150815181811115613bf75750505050505090565b843d8701016020828501011115613c115750505050505090565b613c2060208286010187613b74565b509095945050505050565b60208082526025908201527f4e6f20574554482072656365697665642066726f6d2074726561737572792077604082015264185b1b195d60da1b606082015260800190565b808202811582820484141761070357610703613aa2565b600082613ca457634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561070357610703613aa2565b600060208284031215613cce57600080fd5b815161395b81613869565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a060408201526000613d4960a0830186613904565b6001600160a01b0394909416606083015250608001529392505050565b60006020808385031215613d7957600080fd5b825167ffffffffffffffff80821115613d9157600080fd5b818501915085601f830112613da557600080fd5b815181811115613db757613db7613b5e565b8060051b9150604051613dcc85840182613b74565b81815291830184019184810188841115613de557600080fd5b938501935b83851015613e015784518152938501938501613dea565b50979650505050505050565b600060018201613e1f57613e1f613aa2565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072338f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515ba26469706673582212209ebb49f109b10fe59a5ca3dffd3d9f73aa15ba066a3dd8d264fa5df0afa82efa64736f6c63430008110033

Deployed Bytecode

0x6080604052600436106102085760003560e01c80637ac84fc111610118578063ac3508e8116100a0578063dd62ed3e1161006f578063dd62ed3e146105ba578063e3a8fa5514610600578063ed9cacfe14610608578063f2fde38b1461061d578063fd7c9fab1461063d57600080fd5b8063ac3508e814610542578063c0d7865514610555578063c5eaf1e914610575578063d4d7b19a1461058a57600080fd5b80638da5cb5b116100e75780638da5cb5b146104af57806395d89b41146104cd578063975b87e8146104e2578063a8602fea14610502578063a9059cbb1461052257600080fd5b80637ac84fc1146104505780637ff793d314610465578063808a54571461047a5780638129fc1c1461049a57600080fd5b8063397883d21161019b5780635d76b04c1161016a5780635d76b04c146103ae5780635fe8e7cc146103c357806362b6327a146103e557806370a08231146104055780637136982b1461043b57600080fd5b8063397883d214610339578063461a3a951461034e5780634626402b1461036e578063573761981461038e57600080fd5b80631fed05c3116101d75780631fed05c3146102a357806323b872dd146102c55780632a11ced0146102e5578063313ce5671461031d57600080fd5b806306fdde031461021457806308dee2b41461023f578063095ea7b31461025e57806318160ddd1461028e57600080fd5b3661020f57005b600080fd5b34801561022057600080fd5b5061022961065d565b604051610236919061381b565b60405180910390f35b34801561024b57600080fd5b50600e545b604051908152602001610236565b34801561026a57600080fd5b5061027e61027936600461387e565b6106ef565b6040519015158152602001610236565b34801561029a57600080fd5b50600254610250565b3480156102af57600080fd5b506102c36102be3660046138aa565b610709565b005b3480156102d157600080fd5b5061027e6102e03660046138c3565b610ddb565b3480156102f157600080fd5b506103056103003660046138aa565b610dff565b6040516001600160a01b039091168152602001610236565b34801561032957600080fd5b5060405160128152602001610236565b34801561034557600080fd5b506102c3610e29565b34801561035a57600080fd5b50600954610305906001600160a01b031681565b34801561037a57600080fd5b50600b54610305906001600160a01b031681565b34801561039a57600080fd5b506102c36103a936600461387e565b610f42565b3480156103ba57600080fd5b50600f54610250565b3480156103cf57600080fd5b506103d8611009565b6040516102369190613948565b3480156103f157600080fd5b50600754610305906001600160a01b031681565b34801561041157600080fd5b50610250610420366004613962565b6001600160a01b031660009081526020819052604090205490565b34801561044757600080fd5b50600d54610250565b34801561045c57600080fd5b506102c361106a565b34801561047157600080fd5b506102c3611584565b34801561048657600080fd5b50600a54610305906001600160a01b031681565b3480156104a657600080fd5b506102c361166b565b3480156104bb57600080fd5b506006546001600160a01b0316610305565b3480156104d957600080fd5b506102296119e1565b3480156104ee57600080fd5b506102c36104fd36600461397f565b6119f0565b34801561050e57600080fd5b506102c361051d366004613962565b611f25565b34801561052e57600080fd5b5061027e61053d36600461387e565b611fc9565b6102c36105503660046138aa565b611fd7565b34801561056157600080fd5b506102c3610570366004613962565b612243565b34801561058157600080fd5b506102c36122a8565b34801561059657600080fd5b5061027e6105a5366004613962565b600c6020526000908152604090205460ff1681565b3480156105c657600080fd5b506102506105d53660046139a1565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6102c3612593565b34801561061457600080fd5b506102c3612654565b34801561062957600080fd5b506102c3610638366004613962565b6128cd565b34801561064957600080fd5b50600854610305906001600160a01b031681565b60606003805461066c906139da565b80601f0160208091040260200160405190810160405280929190818152602001828054610698906139da565b80156106e55780601f106106ba576101008083540402835291602001916106e5565b820191906000526020600020905b8154815290600101906020018083116106c857829003601f168201915b5050505050905090565b6000336106fd818585612919565b60019150505b92915050565b6107116129cb565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561074f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107739190613a0e565b90506000811161079e5760405162461bcd60e51b815260040161079590613a27565b60405180910390fd5b600082116107d35760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610795565b6009546040516370a0823160e01b815233600482015283916001600160a01b0316906370a0823190602401602060405180830381865afa15801561081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061083f9190613a0e565b10156108725760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610795565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd906108a690339030908790600401613a43565b6020604051808303816000875af11580156108c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108e99190613a67565b61091a5760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610795565b6007546109329030906001600160a01b031683612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610968929116908690600401613a89565b6020604051808303816000875af1158015610987573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab9190613a67565b506007546009546001600160a01b039182169163e8e33700913091168486600080336109d942610258613ab8565b6040518963ffffffff1660e01b81526004016109fc989796959493929190613acb565b6060604051808303816000875af1925050508015610a37575060408051601f3d908101601f19168201909252610a3491810190613b14565b60015b610cbf57610a43613b42565b806308c379a003610b865750610a57613ba1565b80610a625750610b88565b600754610a7b9030906001600160a01b03166000612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610ab292911690600090600401613a89565b6020604051808303816000875af1158015610ad1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af59190613a67565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610b289033908790600401613a89565b6020604051808303816000875af1158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b9190613a67565b508060405162461bcd60e51b8152600401610795919061381b565b505b600754610ba19030906001600160a01b03166000612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392610bd892911690600090600401613a89565b6020604051808303816000875af1158015610bf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c1b9190613a67565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610c4e9033908690600401613a89565b6020604051808303816000875af1158015610c6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c919190613a67565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b6044820152606401610795565b50506040805183815260208101859052600080516020613e5d8339815191529250015b60405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d579190613a0e565b90508015610dd65760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610d919033908590600401613a89565b6020604051808303816000875af1158015610db0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd49190613a67565b505b505050565b600033610de9858285612a19565b610df4858585612a81565b506001949350505050565b600d8181548110610e0f57600080fd5b6000918252602090912001546001600160a01b0316905081565b610e316129cb565b6000600e541180610e4457506000600f54115b610e755760405162461bcd60e51b815260206004820152600260248201526104e560f41b6044820152606401610795565b600d54610ea95760405162461bcd60e51b815260206004820152600260248201526109c960f31b6044820152606401610795565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ee457600080fd5b505af1925050508015610ef5575060015b610f40577f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd600e54600f54604051610f37929190918252602082015260400190565b60405180910390a15b565b610f4a6129cb565b306001600160a01b03831603610f875760405162461bcd60e51b815260206004820152600260248201526121a360f11b6044820152606401610795565b816001600160a01b031663a9059cbb610fa86006546001600160a01b031690565b836040518363ffffffff1660e01b8152600401610fc6929190613a89565b6020604051808303816000875af1158015610fe5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd69190613a67565b6060600d8054806020026020016040519081016040528092919081815260200182805480156106e557602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611043575050505050905090565b6002600554036110a15760405162461bcd60e51b8152602060048201526002602482015261523160f01b6044820152606401610795565b6002600555601054610100900460ff16156110e35760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610795565b6010805461ff001916610100179055600e54600f5481158015611104575080155b1561111b5750506010805461ff001916905561157d565b60408051838152602081018390527f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a16000600e819055600f556007546111789030906001600160a01b0316600019612919565b60006111848284613ab8565b9050600061119182612cd9565b9050806000036111b05750506010805461ff00191690555061157d9050565b600954600b546040516370a0823160e01b81526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015611201573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112259190613a0e565b905081811061143257600954600b54604051636eb1769f60e11b81526001600160a01b0391821660048201523060248201528492919091169063dd62ed3e90604401602060405180830381865afa158015611284573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112a89190613a0e565b106113b057600954600b546040516323b872dd60e01b81526000926001600160a01b03908116926323b872dd926112e9929091169030908890600401613a43565b6020604051808303816000875af1158015611308573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132c9190613a67565b9050806113aa57600080516020613e3d83398151915260405161138b9060208082526022908201527f57455448207472616e736665722066726f6d207472656173757279206661696c604082015261195960f21b606082015260800190565b60405180910390a150506010805461ff00191690555061157d92505050565b50611491565b600080516020613e3d833981519152604051611414906020808252602e908201527f54726561737572792077616c6c657420686173206e6f7420617070726f76656460408201526d102ba2aa24103a3930b739b332b960911b606082015260800190565b60405180910390a150506010805461ff00191690555061157d915050565b600080516020613e3d8339815191526040516114149060208082526029908201527f54726561737572792077616c6c657420646f6573206e6f74206861766520656e6040820152680deeaced040ae8aa8960bb1b606082015260800190565b6009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156114da573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114fe9190613a0e565b90508060000361152357600080516020613e3d83398151915260405161138b90613c2b565b6000846115308884613c70565b61153a9190613c87565b905060006115488284613ca9565b9050811561155a5761155a8289612f04565b801561156957611569816131a3565b50506010805461ff00191690555050505050505b6001600555565b600b546001600160a01b031633146115c35760405162461bcd60e51b815260206004820152600260248201526113d560f21b6044820152606401610795565b60095460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906115f790309060001990600401613a89565b6020604051808303816000875af1158015611616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163a9190613a67565b610f405760405162461bcd60e51b815260206004820152600260248201526120a360f11b6044820152606401610795565b6116736129cb565b60105460ff16156116ab5760405162461bcd60e51b8152602060048201526002602482015261231960f11b6044820152606401610795565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa15801561170a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061172e9190613cbc565b600a80546001600160a01b0319166001600160a01b039290921691821790556117ea576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af11580156117a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117c99190613cbc565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166118275760405162461bcd60e51b8152602060048201526002602482015261463360f01b6044820152606401610795565b6007546118419030906001600160a01b0316600019612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926118799291169060001990600401613a89565b6020604051808303816000875af1158015611898573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bc9190613a67565b6118ed5760405162461bcd60e51b8152602060048201526002602482015261118d60f21b6044820152606401610795565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926119259291169060001990600401613a89565b6020604051808303816000875af1158015611944573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119689190613a67565b50600a5460405163095ea7b360e01b8152309163095ea7b39161199b916001600160a01b03169060001990600401613a89565b6020604051808303816000875af11580156119ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119de9190613a67565b50565b60606004805461066c906139da565b6119f86129cb565b60008211611a185760405162461bcd60e51b815260040161079590613a27565b60008111611a4d5760405162461bcd60e51b81526020600482015260026024820152614e5360f01b6044820152606401610795565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aae9190613a0e565b1015611ae15760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610795565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa158015611b29573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b4d9190613a0e565b1015611b805760405162461bcd60e51b8152602060048201526002602482015261495360f01b6044820152606401610795565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd90611bb490339030908690600401613a43565b6020604051808303816000875af1158015611bd3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf79190613a67565b611c285760405162461bcd60e51b81526020600482015260026024820152612a2360f11b6044820152606401610795565b600754611c409030906001600160a01b031684612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611c76929116908590600401613a89565b6020604051808303816000875af1158015611c95573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cb99190613a67565b506007546009546001600160a01b039182169163e8e3370091309116858560008033611ce742610258613ab8565b6040518963ffffffff1660e01b8152600401611d0a989796959493929190613acb565b6060604051808303816000875af1925050508015611d45575060408051601f3d908101601f19168201909252611d4291810190613b14565b60015b611efe57611d51613b42565b806308c379a003611e365750611d65613ba1565b80611d705750611e38565b600754611d899030906001600160a01b03166000612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611dc092911690600090600401613a89565b6020604051808303816000875af1158015611ddf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e039190613a67565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610b289033908690600401613a89565b505b600754611e519030906001600160a01b03166000612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611e8892911690600090600401613a89565b6020604051808303816000875af1158015611ea7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ecb9190613a67565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb90610c4e9033908590600401613a89565b50506040805184815260208101849052600080516020613e5d833981519152925001610ce2565b611f2d6129cb565b6001600160a01b038116611f685760405162461bcd60e51b8152602060048201526002602482015261125560f21b6044820152606401610795565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4910160405180910390a15050565b6000336106fd818585612a81565b611fdf6129cb565b60008111611fff5760405162461bcd60e51b815260040161079590613a27565b600034116120345760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610795565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015612071573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120959190613a0e565b10156120c85760405162461bcd60e51b815260206004820152600260248201526124a160f11b6044820152606401610795565b6007546120e09030906001600160a01b031683612919565b6007546001600160a01b031663f305d7193430846000803361210442610258613ab8565b6040518863ffffffff1660e01b815260040161212596959493929190613cd9565b60606040518083038185885af193505050508015612160575060408051601f3d908101601f1916820190925261215d91810190613b14565b60015b6122175761216c613b42565b806308c379a0036121d05750612180613ba1565b8061218b57506121d2565b6007546121a49030906001600160a01b03166000612919565b60405133904780156108fc02916000818181858888f19350505050158015610b6b573d6000803e3d6000fd5b505b6007546121eb9030906001600160a01b03166000612919565b60405133904780156108fc02916000818181858888f19350505050158015610c91573d6000803e3d6000fd5b505060408051838152346020820152600080516020613e5d83398151915292500160405180910390a150565b61224b6129cb565b6001600160a01b0381166122865760405162461bcd60e51b815260206004820152600260248201526124a960f11b6044820152606401610795565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6122b06129cb565b601054610100900460ff16156122ed5760405162461bcd60e51b8152602060048201526002602482015261041560f41b6044820152606401610795565b6010805461ff0019166101001790556040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa15801561233a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061235e9190613a0e565b9050600081116123955760405162461bcd60e51b8152602060048201526002602482015261272160f11b6044820152606401610795565b60006123a2601980613ab8565b6123ad601984613c70565b6123b79190613c87565b905060006123c58284613ca9565b60408051848152602081018390529192507f6f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cd910160405180910390a160075461241b9030906001600160a01b0316600019612919565b60006124278284613ab8565b9050600061243482612cd9565b9050806000036124545750506010805461ff001916905550610f40915050565b6040518181527f0feedab68cd870984eb1996ea868562d5f26bf492165c4ff94e43910877acdad9060200160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156124d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124f49190613a0e565b90508060000361253857600080516020613e3d83398151915260405161251990613c2b565b60405180910390a150506010805461ff001916905550610f4092505050565b6000836125458784613c70565b61254f9190613c87565b9050600061255d8284613ca9565b9050811561256f5761256f8288612f04565b801561257e5761257e816131a3565b50506010805461ff0019169055505050505050565b61259b6129cb565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa1580156125d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125fd9190613a0e565b90506000811161261f5760405162461bcd60e51b815260040161079590613a27565b600034116120c85760405162461bcd60e51b81526020600482015260026024820152614e4560f01b6044820152606401610795565b61265c6129cb565b6007546126769030906001600160a01b0316600019612919565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926126ae9291169060001990600401613a89565b6020604051808303816000875af19250505080156126e9575060408051601f3d908101601f191682019092526126e691810190613a67565b60015b1561273f57506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612736926001600160a01b039182169291169060001990613a43565b60405180910390a15b600a546001600160a01b031615610f4057600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926127889291169060001990600401613a89565b6020604051808303816000875af19250505080156127c3575060408051601f3d908101601f191682019092526127c091810190613a67565b60015b156128195750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612810926001600160a01b039182169291169060001990613a43565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b39161284b916001600160a01b03169060001990600401613a89565b6020604051808303816000875af1925050508015612886575060408051601f3d908101601f1916820190925261288391810190613a67565b60015b15610f405750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca91610f379130916001600160a01b03169060001990613a43565b6128d56129cb565b6001600160a01b0381166129105760405162461bcd60e51b81526020600482015260026024820152614f3160f01b6044820152606401610795565b6119de81613306565b6001600160a01b0383161580159061293957506001600160a01b03821615155b61296a5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b6044820152606401610795565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b336129de6006546001600160a01b031690565b6001600160a01b031614610f405760405162461bcd60e51b8152602060048201526002602482015261279960f11b6044820152606401610795565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205481811015612a745760405162461bcd60e51b8152602060048201526002602482015261453560f01b6044820152606401610795565b610dd48484848403612919565b601054610100900460ff16158015612aa757506006546001600160a01b03848116911614155b8015612ac157506006546001600160a01b03838116911614155b8015612ad657506001600160a01b0383163014155b8015612aef5750600a546001600160a01b038381169116145b15612c765760006064612b03600584613c70565b612b0d9190613c87565b90508015612c745760006064612b24601984613c70565b612b2e9190613c87565b905060006064612b3f601985613c70565b612b499190613c87565b90506000612b578486613ca9565b9050612b64873086613358565b612b6f878783613358565b82600e6000828254612b819190613ab8565b9250508190555081600f6000828254612b9a9190613ab8565b9091555050600f54600e5468056bc75e2d6310000091612bb991613ab8565b10612c0c57306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612bf957600080fd5b505af1925050508015612c0a575060015b505b612c3f87678ac7230489e80000612c388a6001600160a01b031660009081526020819052604090205490565b101561345d565b612c6b86678ac7230489e80000612c38896001600160a01b031660009081526020819052604090205490565b50505050505050565b505b612c81838383613358565b612cad83678ac7230489e80000612c38866001600160a01b031660009081526020819052604090205490565b610dd682678ac7230489e80000612c38856001600160a01b031660009081526020819052604090205490565b600081600003612ceb57506000919050565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612d2057612d20613d14565b6001600160a01b039283166020918202929092010152600954825191169082906001908110612d5157612d51613d14565b6001600160a01b039283166020918202929092010152600754600b54908216916338ed1739918691600091869116612d8b42610258613ab8565b6040518663ffffffff1660e01b8152600401612dab959493929190613d2a565b6000604051808303816000875af1925050508015612deb57506040513d6000823e601f3d908101601f19168201604052612de89190810190613d66565b60015b612e8957612df7613b42565b806308c379a003612e455750612e0b613ba1565b80612e165750612e47565b600080516020613e3d83398151915281604051612e33919061381b565b60405180910390a15060009392505050565b505b600080516020613e3d833981519152604051612e78906020808252600190820152604560f81b604082015260600190565b60405180910390a150600092915050565b60008160018351612e9a9190613ca9565b81518110612eaa57612eaa613d14565b602002602001015190507fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc018582604051612eee929190918252602082015260400190565b60405180910390a1949350505050565b50919050565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392612f3a929116908690600401613a89565b6020604051808303816000875af1158015612f59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f7d9190613a67565b50604080516002808252606082018352600092602083019080368337505060095482519293506001600160a01b031691839150600090612fbf57612fbf613d14565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613018573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061303c9190613cbc565b8160018151811061304f5761304f613d14565b6001600160a01b039283166020918202929092010152600754166318cbafe5846000843061307f42610258613ab8565b6040518663ffffffff1660e01b815260040161309f959493929190613d2a565b6000604051808303816000875af19250505080156130df57506040513d6000823e601f3d908101601f191682016040526130dc9190810190613d66565b60015b613191576130eb613b42565b806308c379a00361313557506130ff613ba1565b8061310a5750613137565b600080516020613e3d83398151915281604051613127919061381b565b60405180910390a150505050565b505b600080516020613e3d8339815191526040516131849060208082526017908201527f5745544820746f204554482073776170206661696c6564000000000000000000604082015260600190565b60405180910390a1505050565b50478015610dd457610dd48184613670565b600d548015806131b1575081155b156131ba575050565b60006131c68284613c87565b9050806000036131d557505050565b60005b828110156132cf576000600d82815481106131f5576131f5613d14565b6000918252602090912001546001600160a01b03169050801580159061322457506001600160a01b0381163014155b801561323e5750600a546001600160a01b03828116911614155b156132bc5760095460405163a9059cbb60e01b81526000916001600160a01b03169063a9059cbb906132769085908890600401613a89565b6020604051808303816000875af1158015613295573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132b99190613a67565b50505b50806132c781613e0d565b9150506131d8565b5060408051848152602081018490527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c2179101613184565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383161580159061337857506001600160a01b03821615155b6133a95760405162461bcd60e51b8152602060048201526002602482015261453160f01b6044820152606401610795565b6001600160a01b038316600090815260208190526040902054818110156133f75760405162461bcd60e51b8152602060048201526002602482015261229960f11b6044820152606401610795565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a3610dd4565b600a546001600160a01b0383811691161480159061348457506001600160a01b0382163014155b1561366c578080156134af57506001600160a01b0382166000908152600c602052604090205460ff16155b1561351b57506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b8015801561354157506001600160a01b0382166000908152600c602052604090205460ff165b1561366c576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d54811015610dd657826001600160a01b0316600d828154811061358e5761358e613d14565b6000918252602090912001546001600160a01b03160361365a57600d80546135b890600190613ca9565b815481106135c8576135c8613d14565b600091825260209091200154600d80546001600160a01b0390921691839081106135f4576135f4613d14565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d80548061363357613633613e26565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b8061366481613e0d565b915050613567565b5050565b6000606461367f601e82613ca9565b6136899084613c70565b6136939190613c87565b9050600060646136a4601e82613ca9565b6136ae9086613c70565b6136b89190613c87565b6007549091506001600160a01b031663f305d7198530868686836136de42610258613ab8565b6040518863ffffffff1660e01b81526004016136ff96959493929190613cd9565b60606040518083038185885af19350505050801561373a575060408051601f3d908101601f1916820190925261373791810190613b14565b60015b6137f457613746613b42565b806308c379a0036137a2575061375a613ba1565b8061376557506137a4565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad81604051613794919061381b565b60405180910390a150610dd4565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad6040516137e7906020808252600190820152604560f81b604082015260600190565b60405180910390a1610dd4565b50506040805185815260208101879052600080516020613e5d833981519152925001613127565b600060208083528351808285015260005b818110156138485785810183015185820160400152820161382c565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146119de57600080fd5b6000806040838503121561389157600080fd5b823561389c81613869565b946020939093013593505050565b6000602082840312156138bc57600080fd5b5035919050565b6000806000606084860312156138d857600080fd5b83356138e381613869565b925060208401356138f381613869565b929592945050506040919091013590565b600081518084526020808501945080840160005b8381101561393d5781516001600160a01b031687529582019590820190600101613918565b509495945050505050565b60208152600061395b6020830184613904565b9392505050565b60006020828403121561397457600080fd5b813561395b81613869565b6000806040838503121561399257600080fd5b50508035926020909101359150565b600080604083850312156139b457600080fd5b82356139bf81613869565b915060208301356139cf81613869565b809150509250929050565b600181811c908216806139ee57607f821691505b602082108103612efe57634e487b7160e01b600052602260045260246000fd5b600060208284031215613a2057600080fd5b5051919050565b602080825260029082015261139560f21b604082015260600190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600060208284031215613a7957600080fd5b8151801515811461395b57600080fd5b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b8082018082111561070357610703613aa2565b6001600160a01b039889168152968816602088015260408701959095526060860193909352608085019190915260a084015290921660c082015260e08101919091526101000190565b600080600060608486031215613b2957600080fd5b8351925060208401519150604084015190509250925092565b600060033d1115613b5b5760046000803e5060005160e01c5b90565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff81118282101715613b9a57613b9a613b5e565b6040525050565b600060443d1015613baf5790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715613bdf57505050505090565b8285019150815181811115613bf75750505050505090565b843d8701016020828501011115613c115750505050505090565b613c2060208286010187613b74565b509095945050505050565b60208082526025908201527f4e6f20574554482072656365697665642066726f6d2074726561737572792077604082015264185b1b195d60da1b606082015260800190565b808202811582820484141761070357610703613aa2565b600082613ca457634e487b7160e01b600052601260045260246000fd5b500490565b8181038181111561070357610703613aa2565b600060208284031215613cce57600080fd5b815161395b81613869565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a060408201526000613d4960a0830186613904565b6001600160a01b0394909416606083015250608001529392505050565b60006020808385031215613d7957600080fd5b825167ffffffffffffffff80821115613d9157600080fd5b818501915085601f830112613da557600080fd5b815181811115613db757613db7613b5e565b8060051b9150604051613dcc85840182613b74565b81815291830184019184810188841115613de557600080fd5b938501935b83851015613e015784518152938501938501613dea565b50979650505050505050565b600060018201613e1f57613e1f613aa2565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072338f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515ba26469706673582212209ebb49f109b10fe59a5ca3dffd3d9f73aa15ba066a3dd8d264fa5df0afa82efa64736f6c63430008110033

Deployed Bytecode Sourcemap

9147:26354:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2873:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30324:118;;;;;;;;;;-1:-1:-1;30411:23:0;;30324:118;;;713:25:1;;;701:2;686:18;30324:118:0;567:177:1;3740:190:0;;;;;;;;;;-1:-1:-1;3740:190:0;;;;;:::i;:::-;;:::i;:::-;;;1370:14:1;;1363:22;1345:41;;1333:2;1318:18;3740:190:0;1205:187:1;3167:99:0;;;;;;;;;;-1:-1:-1;3246:12:0;;3167:99;;24872:2187;;;;;;;;;;-1:-1:-1;24872:2187:0;;;;;:::i;:::-;;:::i;:::-;;3938:250;;;;;;;;;;-1:-1:-1;3938:250:0;;;;;:::i;:::-;;:::i;10210:24::-;;;;;;;;;;-1:-1:-1;10210:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2207:32:1;;;2189:51;;2177:2;2162:18;10210:24:0;2043:203:1;3075:84:0;;;;;;;;;;-1:-1:-1;3075:84:0;;3149:2;2393:36:1;;2381:2;2366:18;3075:84:0;2251:184:1;30623:378:0;;;;;;;;;;;;;:::i;10034:25::-;;;;;;;;;;-1:-1:-1;10034:25:0;;;;-1:-1:-1;;;;;10034:25:0;;;10101:29;;;;;;;;;;-1:-1:-1;10101:29:0;;;;-1:-1:-1;;;;;10101:29:0;;;30090:183;;;;;;;;;;-1:-1:-1;30090:183:0;;;;;:::i;:::-;;:::i;30450:114::-;;;;;;;;;;-1:-1:-1;30535:21:0;;30450:114;;22384:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9936:41::-;;;;;;;;;;-1:-1:-1;9936:41:0;;;;-1:-1:-1;;;;;9936:41:0;;;3274:118;;;;;;;;;;-1:-1:-1;3274:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;22274:98;;;;;;;;;;-1:-1:-1;22350:7:0;:14;22274:98;;15591:3036;;;;;;;;;;;;;:::i;32441:194::-;;;;;;;;;;;;;:::i;10066:28::-;;;;;;;;;;-1:-1:-1;10066:28:0;;;;-1:-1:-1;;;;;10066:28:0;;;11846:836;;;;;;;;;;;;;:::i;1861:87::-;;;;;;;;;;-1:-1:-1;1934:6:0;;-1:-1:-1;;;;;1934:6:0;1861:87;;2972:95;;;;;;;;;;;;;:::i;22535:2260::-;;;;;;;;;;-1:-1:-1;22535:2260:0;;;;;:::i;:::-;;:::i;32054:291::-;;;;;;;;;;-1:-1:-1;32054:291:0;;;;;:::i;:::-;;:::i;3400:182::-;;;;;;;;;;-1:-1:-1;3400:182:0;;;;;:::i;:::-;;:::i;27123:1381::-;;;;;;:::i;:::-;;:::i;29916:166::-;;;;;;;;;;-1:-1:-1;29916:166:0;;;;;:::i;:::-;;:::i;32643:2007::-;;;;;;;;;;;;;:::i;10163:40::-;;;;;;;;;;-1:-1:-1;10163:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;3590:142;;;;;;;;;;-1:-1:-1;3590:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;3697:18:0;;;3670:7;3697:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3590:142;28589:1319;;;:::i;31047:958::-;;;;;;;;;;;;;:::i;2064:165::-;;;;;;;;;;-1:-1:-1;2064:165:0;;;;;:::i;:::-;;:::i;9984:43::-;;;;;;;;;;-1:-1:-1;9984:43:0;;;;-1:-1:-1;;;;;9984:43:0;;;2873:91;2918:13;2951:5;2944:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2873:91;:::o;3740:190::-;3814:4;3847:10;3868:32;3847:10;3884:7;3893:6;3868:8;:32::i;:::-;3918:4;3911:11;;;3740:190;;;;;:::o;24872:2187::-;1820:13;:11;:13::i;:::-;24987:46:::1;::::0;-1:-1:-1;;;24987:46:0;;25002:4:::1;24987:46;::::0;::::1;2189:51:1::0;;;24965:19:0::1;::::0;24987:31:::1;::::0;2162:18:1;;24987:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24965:68;;25066:1;25052:11;:15;25044:30;;;;-1:-1:-1::0;;;25044:30:0::1;;;;;;;:::i;:::-;;;;;;;;;25107:1;25093:11;:15;25085:30;;;::::0;-1:-1:-1;;;25085:30:0;;5643:2:1;25085:30:0::1;::::0;::::1;5625:21:1::0;5682:1;5662:18;;;5655:29;-1:-1:-1;;;5700:18:1;;;5693:32;5742:18;;25085:30:0::1;5441:325:1::0;25085:30:0::1;25165:10;::::0;25158:40:::1;::::0;-1:-1:-1;;;25158:40:0;;25187:10:::1;25158:40;::::0;::::1;2189:51:1::0;25202:11:0;;-1:-1:-1;;;;;25165:10:0::1;::::0;25158:28:::1;::::0;2162:18:1;;25158:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;25136:107;;;::::0;-1:-1:-1;;;25136:107:0;;5973:2:1;25136:107:0::1;::::0;::::1;5955:21:1::0;6012:1;5992:18;;;5985:29;-1:-1:-1;;;6030:18:1;;;6023:32;6072:18;;25136:107:0::1;5771:325:1::0;25136:107:0::1;25345:10;::::0;25338:71:::1;::::0;-1:-1:-1;;;25338:71:0;;-1:-1:-1;;;;;25345:10:0;;::::1;::::0;25338:31:::1;::::0;:71:::1;::::0;25370:10:::1;::::0;25390:4:::1;::::0;25397:11;;25338:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25316:123;;;::::0;-1:-1:-1;;;25316:123:0;;6965:2:1;25316:123:0::1;::::0;::::1;6947:21:1::0;7004:1;6984:18;;;6977:29;-1:-1:-1;;;7022:18:1;;;7015:32;7064:18;;25316:123:0::1;6763:325:1::0;25316:123:0::1;25518:16;::::0;25486:63:::1;::::0;25503:4:::1;::::0;-1:-1:-1;;;;;25518:16:0::1;25537:11:::0;25486:8:::1;:63::i;:::-;25567:10;::::0;25595:16:::1;::::0;25560:66:::1;::::0;-1:-1:-1;;;25560:66:0;;-1:-1:-1;;;;;25567:10:0;;::::1;::::0;25560:26:::1;::::0;:66:::1;::::0;25595:16;::::1;::::0;25614:11;;25560:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;25651:16:0::1;::::0;25723:10:::1;::::0;-1:-1:-1;;;;;25651:16:0;;::::1;::::0;:29:::1;::::0;25703:4:::1;::::0;25723:10:::1;25748:11:::0;25774;25651:16:::1;::::0;25924:10:::1;25949:21;:15;25967:3;25949:21;:::i;:::-;25651:356;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;25651:356:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;25651:356:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;25647:1147;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;26162:16;::::0;26130:53:::1;::::0;26147:4:::1;::::0;-1:-1:-1;;;;;26162:16:0::1;;26130:8;:53::i;:::-;26205:10;::::0;26233:16:::1;::::0;26198:56:::1;::::0;-1:-1:-1;;;26198:56:0;;-1:-1:-1;;;;;26205:10:0;;::::1;::::0;26198:26:::1;::::0;:56:::1;::::0;26233:16;::::1;::::0;26205:10:::1;::::0;26198:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;26338:10:0::1;::::0;26331:52:::1;::::0;-1:-1:-1;;;26331:52:0;;-1:-1:-1;;;;;26338:10:0;;::::1;::::0;26331:27:::1;::::0;:52:::1;::::0;26359:10:::1;::::0;26371:11;;26331:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26419:6;26412:14;;-1:-1:-1::0;;;26412:14:0::1;;;;;;;;:::i;25647:1147::-;;;26520:16;::::0;26488:53:::1;::::0;26505:4:::1;::::0;-1:-1:-1;;;;;26520:16:0::1;;26488:8;:53::i;:::-;26563:10;::::0;26591:16:::1;::::0;26556:56:::1;::::0;-1:-1:-1;;;26556:56:0;;-1:-1:-1;;;;;26563:10:0;;::::1;::::0;26556:26:::1;::::0;:56:::1;::::0;26591:16;::::1;::::0;26563:10:::1;::::0;26556:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;26696:10:0::1;::::0;26689:52:::1;::::0;-1:-1:-1;;;26689:52:0;;-1:-1:-1;;;;;26696:10:0;;::::1;::::0;26689:27:::1;::::0;:52:::1;::::0;26717:10:::1;::::0;26729:11;;26689:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;26770:12:0::1;::::0;-1:-1:-1;;;26770:12:0;;10445:2:1;26770:12:0::1;::::0;::::1;10427:21:1::0;10484:1;10464:18;;;10457:29;-1:-1:-1;;;10502:18:1;;;10495:32;10544:18;;26770:12:0::1;10243:325:1::0;25647:1147:0::1;-1:-1:-1::0;;26028:40:0::1;::::0;;10747:25:1;;;10803:2;10788:18;;10781:34;;;-1:-1:-1;;;;;;;;;;;26028:40:0;-1:-1:-1;10720:18:1;26028:40:0::1;;;;;;;;26897:10;::::0;26890:43:::1;::::0;-1:-1:-1;;;26890:43:0;;26927:4:::1;26890:43;::::0;::::1;2189:51:1::0;26864:23:0::1;::::0;-1:-1:-1;;;;;26897:10:0::1;::::0;26890:28:::1;::::0;2162:18:1;;26890:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;26864:69:::0;-1:-1:-1;26948:19:0;;26944:108:::1;;26991:10;::::0;26984:56:::1;::::0;-1:-1:-1;;;26984:56:0;;-1:-1:-1;;;;;26991:10:0;;::::1;::::0;26984:27:::1;::::0;:56:::1;::::0;27012:10:::1;::::0;27024:15;;26984:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;26944:108;24954:2105;;24872:2187:::0;:::o;3938:250::-;4026:4;4061:10;4082:38;4098:4;4061:10;4113:6;4082:15;:38::i;:::-;4131:27;4141:4;4147:2;4151:6;4131:9;:27::i;:::-;-1:-1:-1;4176:4:0;;3938:250;-1:-1:-1;;;;3938:250:0:o;10210:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10210:24:0;;-1:-1:-1;10210:24:0;:::o;30623:378::-;1820:13;:11;:13::i;:::-;30716:1:::1;30690:23;;:27;:56;;;;30745:1;30721:21;;:25;30690:56;30682:71;;;::::0;-1:-1:-1;;;30682:71:0;;11028:2:1;30682:71:0::1;::::0;::::1;11010:21:1::0;11067:1;11047:18;;;11040:29;-1:-1:-1;;;11085:18:1;;;11078:32;11127:18;;30682:71:0::1;10826:325:1::0;30682:71:0::1;30772:7;:14:::0;30764:33:::1;;;::::0;-1:-1:-1;;;30764:33:0;;11358:2:1;30764:33:0::1;::::0;::::1;11340:21:1::0;11397:1;11377:18;;;11370:29;-1:-1:-1;;;11415:18:1;;;11408:32;11457:18;;30764:33:0::1;11156:325:1::0;30764:33:0::1;30812:4;-1:-1:-1::0;;;;;30812:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;30808:186;;30920:62;30935:23;;30960:21;;30920:62;;;;;;10747:25:1::0;;;10803:2;10788:18;;10781:34;10735:2;10720:18;;10573:248;30920:62:0::1;;;;;;;;30808:186;30623:378::o:0;30090:183::-;1820:13;:11;:13::i;:::-;30201:4:::1;-1:-1:-1::0;;;;;30183:23:0;::::1;::::0;30175:38:::1;;;::::0;-1:-1:-1;;;30175:38:0;;11688:2:1;30175:38:0::1;::::0;::::1;11670:21:1::0;11727:1;11707:18;;;11700:29;-1:-1:-1;;;11745:18:1;;;11738:32;11787:18;;30175:38:0::1;11486:325:1::0;30175:38:0::1;30231:6;-1:-1:-1::0;;;;;30224:23:0::1;;30248:7;1934:6:::0;;-1:-1:-1;;;;;1934:6:0;;1861:87;30248:7:::1;30257;30224:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;22384:96::-:0;22429:16;22465:7;22458:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22458:14:0;;;;;;;;;;;;;;;;;;;;;;22384:96;:::o;15591:3036::-;1114:1;1260:7;;:19;1252:34;;;;-1:-1:-1;;;1252:34:0;;12018:2:1;1252:34:0;;;12000:21:1;12057:1;12037:18;;;12030:29;-1:-1:-1;;;12075:18:1;;;12068:32;12117:18;;1252:34:0;11816:325:1;1252:34:0;1114:1;1297:7;:18;15671:7:::1;::::0;::::1;::::0;::::1;;;15670:8;15662:23;;;::::0;-1:-1:-1;;;15662:23:0;;12348:2:1;15662:23:0::1;::::0;::::1;12330:21:1::0;12387:1;12367:18;;;12360:29;-1:-1:-1;;;12405:18:1;;;12398:32;12447:18;;15662:23:0::1;12146:325:1::0;15662:23:0::1;15696:7;:14:::0;;-1:-1:-1;;15696:14:0::1;;;::::0;;15760:23:::1;::::0;15821:21:::1;::::0;15867:23;;:48;::::1;;;-1:-1:-1::0;15894:21:0;;15867:48:::1;15863:117;;;-1:-1:-1::0;;15932:7:0::1;:15:::0;;-1:-1:-1;;15932:15:0::1;::::0;;15962:7:::1;;15863:117;16005:52;::::0;;10747:25:1;;;10803:2;10788:18;;10781:34;;;16005:52:0::1;::::0;10720:18:1;16005:52:0::1;;;;;;;16138:1;16112:23;:27:::0;;;16150:21:::1;:25:::0;16258:16:::1;::::0;16226:69:::1;::::0;16243:4:::1;::::0;-1:-1:-1;;;;;16258:16:0::1;-1:-1:-1::0;;16226:8:0::1;:69::i;:::-;16341:25;16369:37;16390:16:::0;16369:18;:37:::1;:::i;:::-;16341:65;;16417:20;16440:31;16453:17;16440:12;:31::i;:::-;16417:54;;16496:12;16512:1;16496:17:::0;16492:86:::1;;-1:-1:-1::0;;16530:7:0::1;:15:::0;;-1:-1:-1;;16530:15:0::1;::::0;;-1:-1:-1;16560:7:0::1;::::0;-1:-1:-1;16560:7:0::1;16492:86;16705:10;::::0;16727:14:::1;::::0;16698:44:::1;::::0;-1:-1:-1;;;16698:44:0;;-1:-1:-1;;;;;16727:14:0;;::::1;16698:44;::::0;::::1;2189:51:1::0;16668:27:0::1;::::0;16705:10;;;::::1;::::0;16698:28:::1;::::0;2162:18:1;;16698:44:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;16668:74;;16780:12;16757:19;:35;16753:958;;16913:10;::::0;16935:14:::1;::::0;16906:59:::1;::::0;-1:-1:-1;;;16906:59:0;;-1:-1:-1;;;;;16935:14:0;;::::1;16906:59;::::0;::::1;12688:34:1::0;16959:4:0::1;12738:18:1::0;;;12731:43;16969:12:0;;16913:10;;;::::1;::::0;16906:28:::1;::::0;12623:18:1;;16906:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:75;16902:654;;17093:10;::::0;17118:14:::1;::::0;17086:76:::1;::::0;-1:-1:-1;;;17086:76:0;;17071:12:::1;::::0;-1:-1:-1;;;;;17093:10:0;;::::1;::::0;17086:31:::1;::::0;:76:::1;::::0;17118:14;;::::1;::::0;17142:4:::1;::::0;17149:12;;17086:76:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17071:91;;17204:7;17199:177;;-1:-1:-1::0;;;;;;;;;;;17241:48:0::1;;;;12987:2:1::0;12969:21;;;13026:2;13006:18;;;12999:30;13065:34;13060:2;13045:18;;13038:62;-1:-1:-1;;;13131:2:1;13116:18;;13109:32;13173:3;13158:19;;12785:398;17241:48:0::1;;;;;;;;-1:-1:-1::0;;17312:7:0::1;:15:::0;;-1:-1:-1;;17312:15:0::1;::::0;;-1:-1:-1;17350:7:0::1;::::0;-1:-1:-1;;;17350:7:0::1;17199:177;16983:408;16753:958;;16902:654;-1:-1:-1::0;;;;;;;;;;;17421:60:0::1;;;;13390:2:1::0;13372:21;;;13429:2;13409:18;;;13402:30;13468:34;13463:2;13448:18;;13441:62;-1:-1:-1;;;13534:2:1;13519:18;;13512:44;13588:3;13573:19;;13188:410;17421:60:0::1;;;;;;;;-1:-1:-1::0;;17500:7:0::1;:15:::0;;-1:-1:-1;;17500:15:0::1;::::0;;-1:-1:-1;17534:7:0::1;::::0;-1:-1:-1;;17534:7:0::1;16753:958;-1:-1:-1::0;;;;;;;;;;;17593:55:0::1;;;;13805:2:1::0;13787:21;;;13844:2;13824:18;;;13817:30;13883:34;13878:2;13863:18;;13856:62;-1:-1:-1;;;13949:2:1;13934:18;;13927:39;13998:3;13983:19;;13603:405;16753:958:0::1;17818:10;::::0;17811:43:::1;::::0;-1:-1:-1;;;17811:43:0;;17848:4:::1;17811:43;::::0;::::1;2189:51:1::0;17781:27:0::1;::::0;-1:-1:-1;;;;;17818:10:0::1;::::0;17811:28:::1;::::0;2162:18:1;;17811:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17781:73;;17869:19;17892:1;17869:24:::0;17865:164:::1;;-1:-1:-1::0;;;;;;;;;;;17915:51:0::1;;;;;:::i;17865:164::-;18079:24;18149:17:::0;18106:40:::1;18128:18:::0;18106:19;:40:::1;:::i;:::-;:60;;;;:::i;:::-;18079:87:::0;-1:-1:-1;18177:22:0::1;18202:38;18079:87:::0;18202:19;:38:::1;:::i;:::-;18177:63:::0;-1:-1:-1;18332:20:0;;18328:108:::1;;18369:55;18387:16;18405:18;18369:17;:55::i;:::-;18498:18:::0;;18494:90:::1;;18533:39;18557:14;18533:23;:39::i;:::-;-1:-1:-1::0;;18604:7:0::1;:15:::0;;-1:-1:-1;;18604:15:0::1;::::0;;-1:-1:-1;;;;;;1326:1:0::1;1070::::0;1338:7;:22;15591:3036::o;32441:194::-;32520:14;;-1:-1:-1;;;;;32520:14:0;32506:10;:28;32498:43;;;;-1:-1:-1;;;32498:43:0;;15149:2:1;32498:43:0;;;15131:21:1;15188:1;15168:18;;;15161:29;-1:-1:-1;;;15206:18:1;;;15199:32;15248:18;;32498:43:0;14947:325:1;32498:43:0;32567:10;;32560:60;;-1:-1:-1;;;32560:60:0;;-1:-1:-1;;;;;32567:10:0;;;;32560:26;;:60;;32595:4;;-1:-1:-1;;32602:17:0;32560:60;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32552:75;;;;-1:-1:-1;;;32552:75:0;;15479:2:1;32552:75:0;;;15461:21:1;15518:1;15498:18;;;15491:29;-1:-1:-1;;;15536:18:1;;;15529:32;15578:18;;32552:75:0;15277:325:1;11846:836:0;1820:13;:11;:13::i;:::-;11907:12:::1;::::0;::::1;;11906:13;11898:28;;;::::0;-1:-1:-1;;;11898:28:0;;15809:2:1;11898:28:0::1;::::0;::::1;15791:21:1::0;15848:1;15828:18;;;15821:29;-1:-1:-1;;;15866:18:1;;;15859:32;15908:18;;11898:28:0::1;15607:325:1::0;11898:28:0::1;11937:12;:19:::0;;-1:-1:-1;;11937:19:0::1;11952:4;11937:19;::::0;;12028:17:::1;::::0;12069:10:::1;::::0;12028:52:::1;::::0;-1:-1:-1;;;12028:52:0;;12062:4:::1;12028:52;::::0;::::1;12688:34:1::0;-1:-1:-1;;;;;12069:10:0;;::::1;12738:18:1::0;;;12731:43;12028:17:0;::::1;::::0;:25:::1;::::0;12623:18:1;;12028:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12012:13;:68:::0;;-1:-1:-1;;;;;;12012:68:0::1;-1:-1:-1::0;;;;;12012:68:0;;;::::1;::::0;;::::1;::::0;;12146:131:::1;;12210:17;::::0;12254:10:::1;::::0;12210:55:::1;::::0;-1:-1:-1;;;12210:55:0;;12247:4:::1;12210:55;::::0;::::1;12688:34:1::0;-1:-1:-1;;;;;12254:10:0;;::::1;12738:18:1::0;;;12731:43;12210:17:0;::::1;::::0;:28:::1;::::0;12623:18:1;;12210:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12194:13;:71:::0;;-1:-1:-1;;;;;;12194:71:0::1;-1:-1:-1::0;;;;;12194:71:0;;;::::1;::::0;;;::::1;::::0;;12146:131:::1;12305:13;::::0;-1:-1:-1;;;;;12305:13:0::1;12297:42;;;::::0;-1:-1:-1;;;12297:42:0;;16395:2:1;12297:42:0::1;::::0;::::1;16377:21:1::0;16434:1;16414:18;;;16407:29;-1:-1:-1;;;16452:18:1;;;16445:32;16494:18;;12297:42:0::1;16193:325:1::0;12297:42:0::1;12384:16;::::0;12352:69:::1;::::0;12369:4:::1;::::0;-1:-1:-1;;;;;12384:16:0::1;-1:-1:-1::0;;12352:8:0::1;:69::i;:::-;12457:10;::::0;12485:16:::1;::::0;12450:72:::1;::::0;-1:-1:-1;;;12450:72:0;;-1:-1:-1;;;;;12457:10:0;;::::1;::::0;12450:26:::1;::::0;:72:::1;::::0;12485:16;::::1;::::0;-1:-1:-1;;12504:17:0;12450:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12442:87;;;::::0;-1:-1:-1;;;12442:87:0;;16725:2:1;12442:87:0::1;::::0;::::1;16707:21:1::0;16764:1;16744:18;;;16737:29;-1:-1:-1;;;16782:18:1;;;16775:32;16824:18;;12442:87:0::1;16523:325:1::0;12442:87:0::1;12547:10;::::0;12567:13:::1;::::0;12540:60:::1;::::0;-1:-1:-1;;;12540:60:0;;-1:-1:-1;;;;;12547:10:0;;::::1;::::0;12540:26:::1;::::0;:60:::1;::::0;12567:13;::::1;::::0;-1:-1:-1;;12582:17:0;12540:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;12641:13:0::1;::::0;12611:63:::1;::::0;-1:-1:-1;;;12611:63:0;;12626:4:::1;::::0;12611:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;12641:13:0::1;::::0;-1:-1:-1;;12656:17:0;12611:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11846:836::o:0;2972:95::-;3019:13;3052:7;3045:14;;;;;:::i;22535:2260::-;1820:13;:11;:13::i;:::-;22668:1:::1;22654:11;:15;22646:30;;;;-1:-1:-1::0;;;22646:30:0::1;;;;;;;:::i;:::-;22709:1;22695:11;:15;22687:30;;;::::0;-1:-1:-1;;;22687:30:0;;5643:2:1;22687:30:0::1;::::0;::::1;5625:21:1::0;5682:1;5662:18;;;5655:29;-1:-1:-1;;;5700:18:1;;;5693:32;5742:18;;22687:30:0::1;5441:325:1::0;22687:30:0::1;22760:46;::::0;-1:-1:-1;;;22760:46:0;;22775:4:::1;22760:46;::::0;::::1;2189:51:1::0;;;22810:11:0;;22760:31:::1;::::0;2162:18:1;;22760:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;22738:113;;;::::0;-1:-1:-1;;;22738:113:0;;17055:2:1;22738:113:0::1;::::0;::::1;17037:21:1::0;17094:1;17074:18;;;17067:29;-1:-1:-1;;;17112:18:1;;;17105:32;17154:18;;22738:113:0::1;16853:325:1::0;22738:113:0::1;22901:10;::::0;22894:40:::1;::::0;-1:-1:-1;;;22894:40:0;;22923:10:::1;22894:40;::::0;::::1;2189:51:1::0;22938:11:0;;-1:-1:-1;;;;;22901:10:0::1;::::0;22894:28:::1;::::0;2162:18:1;;22894:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;22872:107;;;::::0;-1:-1:-1;;;22872:107:0;;5973:2:1;22872:107:0::1;::::0;::::1;5955:21:1::0;6012:1;5992:18;;;5985:29;-1:-1:-1;;;6030:18:1;;;6023:32;6072:18;;22872:107:0::1;5771:325:1::0;22872:107:0::1;23081:10;::::0;23074:71:::1;::::0;-1:-1:-1;;;23074:71:0;;-1:-1:-1;;;;;23081:10:0;;::::1;::::0;23074:31:::1;::::0;:71:::1;::::0;23106:10:::1;::::0;23126:4:::1;::::0;23133:11;;23074:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;23052:123;;;::::0;-1:-1:-1;;;23052:123:0;;6965:2:1;23052:123:0::1;::::0;::::1;6947:21:1::0;7004:1;6984:18;;;6977:29;-1:-1:-1;;;7022:18:1;;;7015:32;7064:18;;23052:123:0::1;6763:325:1::0;23052:123:0::1;23254:16;::::0;23222:63:::1;::::0;23239:4:::1;::::0;-1:-1:-1;;;;;23254:16:0::1;23273:11:::0;23222:8:::1;:63::i;:::-;23303:10;::::0;23331:16:::1;::::0;23296:66:::1;::::0;-1:-1:-1;;;23296:66:0;;-1:-1:-1;;;;;23303:10:0;;::::1;::::0;23296:26:::1;::::0;:66:::1;::::0;23331:16;::::1;::::0;23350:11;;23296:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;23387:16:0::1;::::0;23459:10:::1;::::0;-1:-1:-1;;;;;23387:16:0;;::::1;::::0;:29:::1;::::0;23439:4:::1;::::0;23459:10:::1;23484:11:::0;23510;23387:16:::1;::::0;23660:10:::1;23685:21;:15;23703:3;23685:21;:::i;:::-;23387:356;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;23387:356:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;23387:356:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;23383:1147;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;23898:16;::::0;23866:53:::1;::::0;23883:4:::1;::::0;-1:-1:-1;;;;;23898:16:0::1;;23866:8;:53::i;:::-;23941:10;::::0;23969:16:::1;::::0;23934:56:::1;::::0;-1:-1:-1;;;23934:56:0;;-1:-1:-1;;;;;23941:10:0;;::::1;::::0;23934:26:::1;::::0;:56:::1;::::0;23969:16;::::1;::::0;23941:10:::1;::::0;23934:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;24074:10:0::1;::::0;24067:52:::1;::::0;-1:-1:-1;;;24067:52:0;;-1:-1:-1;;;;;24074:10:0;;::::1;::::0;24067:27:::1;::::0;:52:::1;::::0;24095:10:::1;::::0;24107:11;;24067:52:::1;;;:::i;23383:1147::-;;;24256:16;::::0;24224:53:::1;::::0;24241:4:::1;::::0;-1:-1:-1;;;;;24256:16:0::1;;24224:8;:53::i;:::-;24299:10;::::0;24327:16:::1;::::0;24292:56:::1;::::0;-1:-1:-1;;;24292:56:0;;-1:-1:-1;;;;;24299:10:0;;::::1;::::0;24292:26:::1;::::0;:56:::1;::::0;24327:16;::::1;::::0;24299:10:::1;::::0;24292:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;24432:10:0::1;::::0;24425:52:::1;::::0;-1:-1:-1;;;24425:52:0;;-1:-1:-1;;;;;24432:10:0;;::::1;::::0;24425:27:::1;::::0;:52:::1;::::0;24453:10:::1;::::0;24465:11;;24425:52:::1;;;:::i;23383:1147::-;-1:-1:-1::0;;23764:40:0::1;::::0;;10747:25:1;;;10803:2;10788:18;;10781:34;;;-1:-1:-1;;;;;;;;;;;23764:40:0;-1:-1:-1;10720:18:1;23764:40:0::1;10573:248:1::0;32054:291:0;1820:13;:11;:13::i;:::-;-1:-1:-1;;;;;32144:29:0;::::1;32136:44;;;::::0;-1:-1:-1;;;32136:44:0;;17385:2:1;32136:44:0::1;::::0;::::1;17367:21:1::0;17424:1;17404:18;;;17397:29;-1:-1:-1;;;17442:18:1;;;17435:32;17484:18;;32136:44:0::1;17183:325:1::0;32136:44:0::1;32213:14;::::0;;-1:-1:-1;;;;;32238:32:0;;::::1;-1:-1:-1::0;;;;;;32238:32:0;::::1;::::0;::::1;::::0;;;32286:51:::1;::::0;;32213:14;;;::::1;12688:34:1::0;;;12753:2;12738:18;;12731:43;;;;32286:51:0::1;::::0;12623:18:1;32286:51:0::1;;;;;;;32125:220;32054:291:::0;:::o;3400:182::-;3470:4;3503:10;3524:28;3503:10;3541:2;3545:6;3524:9;:28::i;27123:1381::-;1820:13;:11;:13::i;:::-;27240:1:::1;27226:11;:15;27218:30;;;;-1:-1:-1::0;;;27218:30:0::1;;;;;;;:::i;:::-;27279:1;27267:9;:13;27259:28;;;::::0;-1:-1:-1;;;27259:28:0;;17715:2:1;27259:28:0::1;::::0;::::1;17697:21:1::0;17754:1;17734:18;;;17727:29;-1:-1:-1;;;17772:18:1;;;17765:32;17814:18;;27259:28:0::1;17513:325:1::0;27259:28:0::1;27330:46;::::0;-1:-1:-1;;;27330:46:0;;27345:4:::1;27330:46;::::0;::::1;2189:51:1::0;;;27380:11:0;;27330:31:::1;::::0;2162:18:1;;27330:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;27308:113;;;::::0;-1:-1:-1;;;27308:113:0;;17055:2:1;27308:113:0::1;::::0;::::1;17037:21:1::0;17094:1;17074:18;;;17067:29;-1:-1:-1;;;17112:18:1;;;17105:32;17154:18;;27308:113:0::1;16853:325:1::0;27308:113:0::1;27500:16;::::0;27468:63:::1;::::0;27485:4:::1;::::0;-1:-1:-1;;;;;27500:16:0::1;27519:11:::0;27468:8:::1;:63::i;:::-;27556:16;::::0;-1:-1:-1;;;;;27556:16:0::1;:32;27596:9;27629:4;27649:11:::0;27556:16:::1;::::0;27797:10:::1;27822:21;:15;27840:3;27822:21;:::i;:::-;27556:324;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;27556:324:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;27556:324:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;27552:945;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;28033:16;::::0;28001:53:::1;::::0;28018:4:::1;::::0;-1:-1:-1;;;;;28033:16:0::1;;28001:8;:53::i;:::-;28119:51;::::0;28127:10:::1;::::0;28148:21:::1;28119:51:::0;::::1;;;::::0;::::1;::::0;;;28148:21;28127:10;28119:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;27552:945;;;28307:16;::::0;28275:53:::1;::::0;28292:4:::1;::::0;-1:-1:-1;;;;;28307:16:0::1;;28275:8;:53::i;:::-;28393:51;::::0;28401:10:::1;::::0;28422:21:::1;28393:51:::0;::::1;;;::::0;::::1;::::0;;;28422:21;28401:10;28393:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;27552:945;-1:-1:-1::0;;27901:38:0::1;::::0;;10747:25:1;;;27929:9:0::1;10803:2:1::0;10788:18;;10781:34;-1:-1:-1;;;;;;;;;;;27901:38:0;-1:-1:-1;10720:18:1;27901:38:0::1;;;;;;;27123:1381:::0;:::o;29916:166::-;1820:13;:11;:13::i;:::-;-1:-1:-1;;;;;29990:21:0;::::1;29982:36;;;::::0;-1:-1:-1;;;29982:36:0;;18657:2:1;29982:36:0::1;::::0;::::1;18639:21:1::0;18696:1;18676:18;;;18669:29;-1:-1:-1;;;18714:18:1;;;18707:32;18756:18;;29982:36:0::1;18455:325:1::0;29982:36:0::1;30029:16;:45:::0;;-1:-1:-1;;;;;;30029:45:0::1;-1:-1:-1::0;;;;;30029:45:0;;;::::1;::::0;;;::::1;::::0;;29916:166::o;32643:2007::-;1820:13;:11;:13::i;:::-;32719:7:::1;::::0;::::1;::::0;::::1;;;32718:8;32710:23;;;::::0;-1:-1:-1;;;32710:23:0;;12348:2:1;32710:23:0::1;::::0;::::1;12330:21:1::0;12387:1;12367:18;;;12360:29;-1:-1:-1;;;12405:18:1;;;12398:32;12447:18;;32710:23:0::1;12146:325:1::0;32710:23:0::1;32744:7;:14:::0;;-1:-1:-1;;32744:14:0::1;;;::::0;;32854:46:::1;::::0;-1:-1:-1;;;32854:46:0;;32869:4:::1;32854:46;::::0;::::1;2189:51:1::0;;;-1:-1:-1;;32854:31:0::1;::::0;2162:18:1;;32854:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32828:72;;32937:1;32919:15;:19;32911:34;;;::::0;-1:-1:-1;;;32911:34:0;;18987:2:1;32911:34:0::1;::::0;::::1;18969:21:1::0;19026:1;19006:18;;;18999:29;-1:-1:-1;;;19044:18:1;;;19037:32;19086:18;;32911:34:0::1;18785:325:1::0;32911:34:0::1;32966:26;33030:27;9435:2;::::0;33030:27:::1;:::i;:::-;32995:31;9379:2;32995:15:::0;:31:::1;:::i;:::-;:63;;;;:::i;:::-;32966:92:::0;-1:-1:-1;33069:24:0::1;33096:36;32966:92:::0;33096:15;:36:::1;:::i;:::-;33158:52;::::0;;10747:25:1;;;10803:2;10788:18;;10781:34;;;33069:63:0;;-1:-1:-1;33158:52:0::1;::::0;10720:18:1;33158:52:0::1;;;;;;;33293:16;::::0;33261:69:::1;::::0;33278:4:::1;::::0;-1:-1:-1;;;;;33293:16:0::1;-1:-1:-1::0;;33261:8:0::1;:69::i;:::-;33376:25;33404:37;33425:16:::0;33404:18;:37:::1;:::i;:::-;33376:65;;33452:20;33475:31;33488:17;33475:12;:31::i;:::-;33452:54;;33531:12;33547:1;33531:17:::0;33527:86:::1;;-1:-1:-1::0;;33565:7:0::1;:15:::0;;-1:-1:-1;;33565:15:0::1;::::0;;-1:-1:-1;33595:7:0::1;::::0;-1:-1:-1;;33595:7:0::1;33527:86;33693:40;::::0;713:25:1;;;33693:40:0::1;::::0;701:2:1;686:18;33693:40:0::1;;;;;;;33841:10;::::0;33834:43:::1;::::0;-1:-1:-1;;;33834:43:0;;33871:4:::1;33834:43;::::0;::::1;2189:51:1::0;33804:27:0::1;::::0;-1:-1:-1;;;;;33841:10:0::1;::::0;33834:28:::1;::::0;2162:18:1;;33834:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33804:73;;33892:19;33915:1;33892:24:::0;33888:164:::1;;-1:-1:-1::0;;;;;;;;;;;33938:51:0::1;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;34004:7:0::1;:15:::0;;-1:-1:-1;;34004:15:0::1;::::0;;-1:-1:-1;34034:7:0::1;::::0;-1:-1:-1;;;34034:7:0::1;33888:164;34102:24;34172:17:::0;34129:40:::1;34151:18:::0;34129:19;:40:::1;:::i;:::-;:60;;;;:::i;:::-;34102:87:::0;-1:-1:-1;34200:22:0::1;34225:38;34102:87:::0;34225:19;:38:::1;:::i;:::-;34200:63:::0;-1:-1:-1;34355:20:0;;34351:108:::1;;34392:55;34410:16;34428:18;34392:17;:55::i;:::-;34521:18:::0;;34517:90:::1;;34556:39;34580:14;34556:23;:39::i;:::-;-1:-1:-1::0;;34627:7:0::1;:15:::0;;-1:-1:-1;;34627:15:0::1;::::0;;-1:-1:-1;;;;;;32643:2007:0:o;28589:1319::-;1820:13;:11;:13::i;:::-;28699:46:::1;::::0;-1:-1:-1;;;28699:46:0;;28714:4:::1;28699:46;::::0;::::1;2189:51:1::0;;;28677:19:0::1;::::0;28699:31:::1;::::0;2162:18:1;;28699:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28677:68;;28778:1;28764:11;:15;28756:30;;;;-1:-1:-1::0;;;28756:30:0::1;;;;;;;:::i;:::-;28817:1;28805:9;:13;28797:28;;;::::0;-1:-1:-1;;;28797:28:0;;17715:2:1;28797:28:0::1;::::0;::::1;17697:21:1::0;17754:1;17734:18;;;17727:29;-1:-1:-1;;;17772:18:1;;;17765:32;17814:18;;28797:28:0::1;17513:325:1::0;31047:958:0;1820:13;:11;:13::i;:::-;31182:16:::1;::::0;31150:69:::1;::::0;31167:4:::1;::::0;-1:-1:-1;;;;;31182:16:0::1;-1:-1:-1::0;;31150:8:0::1;:69::i;:::-;31298:10;::::0;31326:16:::1;::::0;31291:72:::1;::::0;-1:-1:-1;;;31291:72:0;;-1:-1:-1;;;;;31298:10:0;;::::1;::::0;31291:26:::1;::::0;:72:::1;::::0;31326:16;::::1;::::0;-1:-1:-1;;31345:17:0;31291:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;31291:72:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;31291:72:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;31287:193:::0;::::1;;-1:-1:-1::0;31402:10:0::1;::::0;31422:16:::1;::::0;31384:75:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;31402:10:0;;::::1;::::0;31422:16;::::1;::::0;-1:-1:-1;;31441:17:0;31384:75:::1;:::i;:::-;;;;;;;;31287:193;31555:13;::::0;-1:-1:-1;;;;;31555:13:0::1;:27:::0;31551:447:::1;;31610:10;::::0;31630:13:::1;::::0;31603:60:::1;::::0;-1:-1:-1;;;31603:60:0;;-1:-1:-1;;;;;31610:10:0;;::::1;::::0;31603:26:::1;::::0;:60:::1;::::0;31630:13;::::1;::::0;-1:-1:-1;;31645:17:0;31603:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;31603:60:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;31603:60:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;31599:177:::0;::::1;;-1:-1:-1::0;31706:10:0::1;::::0;31718:13:::1;::::0;31688:63:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;31706:10:0;;::::1;::::0;31718:13;::::1;::::0;-1:-1:-1;;31733:17:0;31688:63:::1;:::i;:::-;;;;;;;;31599:177;31838:13;::::0;31808:63:::1;::::0;-1:-1:-1;;;31808:63:0;;31823:4:::1;::::0;31808:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;31838:13:0::1;::::0;-1:-1:-1;;31853:17:0;31808:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;31808:63:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;31808:63:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;31804:183:::0;::::1;;-1:-1:-1::0;31929:13:0::1;::::0;31896:66:::1;::::0;::::1;::::0;::::1;::::0;31922:4:::1;::::0;-1:-1:-1;;;;;31929:13:0::1;::::0;-1:-1:-1;;31944:17:0;31896:66:::1;:::i;2064:165::-:0;1820:13;:11;:13::i;:::-;-1:-1:-1;;;;;2153:22:0;::::1;2145:37;;;::::0;-1:-1:-1;;;2145:37:0;;19317:2:1;2145:37:0::1;::::0;::::1;19299:21:1::0;19356:1;19336:18;;;19329:29;-1:-1:-1;;;19374:18:1;;;19367:32;19416:18;;2145:37:0::1;19115:325:1::0;2145:37:0::1;2193:28;2212:8;2193:18;:28::i;5119:256::-:0;-1:-1:-1;;;;;5221:19:0;;;;;;:44;;-1:-1:-1;;;;;;5244:21:0;;;;5221:44;5213:59;;;;-1:-1:-1;;;5213:59:0;;19647:2:1;5213:59:0;;;19629:21:1;19686:1;19666:18;;;19659:29;-1:-1:-1;;;19704:18:1;;;19697:32;19746:18;;5213:59:0;19445:325:1;5213:59:0;-1:-1:-1;;;;;5283:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5335:32;;713:25:1;;;5335:32:0;;686:18:1;5335:32:0;;;;;;;5119:256;;;:::o;1956:100::-;2031:10;2020:7;1934:6;;-1:-1:-1;;;;;1934:6:0;;1861:87;2020:7;-1:-1:-1;;;;;2020:21:0;;2012:36;;;;-1:-1:-1;;;2012:36:0;;19977:2:1;2012:36:0;;;19959:21:1;20016:1;19996:18;;;19989:29;-1:-1:-1;;;20034:18:1;;;20027:32;20076:18;;2012:36:0;19775:325:1;5383:311:0;-1:-1:-1;;;;;3697:18:0;;;5484:24;3697:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;5555:26;;;;5547:41;;;;-1:-1:-1;;;5547:41:0;;20307:2:1;5547:41:0;;;20289:21:1;20346:1;20326:18;;;20319:29;-1:-1:-1;;;20364:18:1;;;20357:32;20406:18;;5547:41:0;20105:325:1;5547:41:0;5624:51;5633:5;5640:7;5668:6;5649:16;:25;5624:8;:51::i;12690:2106::-;12878:7;;;;;;;12877:8;:41;;;;-1:-1:-1;1934:6:0;;-1:-1:-1;;;;;12903:15:0;;;1934:6;;12903:15;;12877:41;:72;;;;-1:-1:-1;1934:6:0;;-1:-1:-1;;;;;12936:13:0;;;1934:6;;12936:13;;12877:72;:111;;;;-1:-1:-1;;;;;;12967:21:0;;12983:4;12967:21;;12877:111;:148;;;;-1:-1:-1;13012:13:0;;-1:-1:-1;;;;;13006:19:0;;;13012:13;;13006:19;12877:148;12859:1668;;;13082:17;13122:3;13102:17;9324:1;13102:6;:17;:::i;:::-;:23;;;;:::i;:::-;13082:43;-1:-1:-1;13158:13:0;;13154:1362;;13252:23;13306:3;13278:25;9379:2;13278:9;:25;:::i;:::-;:31;;;;:::i;:::-;13252:57;-1:-1:-1;13328:21:0;13378:3;13352:23;9435:2;13352:9;:23;:::i;:::-;:29;;;;:::i;:::-;13328:53;-1:-1:-1;13476:22:0;13501:18;13510:9;13501:6;:18;:::i;:::-;13476:43;;13599:47;13615:4;13629;13636:9;13599:15;:47::i;:::-;13734:41;13750:4;13756:2;13760:14;13734:15;:41::i;:::-;13890:15;13863:23;;:42;;;;;;;:::i;:::-;;;;;;;;13949:13;13924:21;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;14106:21:0;;14080:23;;9604:12;;14080:47;;;:::i;:::-;:73;14076:170;;14182:4;-1:-1:-1;;;;;14182:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14178:49;;14328:57;14342:4;9497:11;14348:15;14358:4;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;14348:15;:36;;14328:13;:57::i;:::-;14404:53;14418:2;9497:11;14422:13;14432:2;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;14404:53;14494:7;;;;12690:2106;;;:::o;13154:1362::-;13037:1490;12859:1668;14575:33;14591:4;14597:2;14601:6;14575:15;:33::i;:::-;14667:57;14681:4;9497:11;14687:15;14697:4;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;14667:57;14735:53;14749:2;9497:11;14753:13;14763:2;-1:-1:-1;;;;;3366:18:0;3339:7;3366:18;;;;;;;;;;;;3274:118;20488:942;20548:7;20572:11;20587:1;20572:16;20568:30;;-1:-1:-1;20597:1:0;;20488:942;-1:-1:-1;20488:942:0:o;20568:30::-;20643:16;;;20657:1;20643:16;;;;;;;;20619:21;;20643:16;;;;;;;;;;-1:-1:-1;20643:16:0;20619:40;;20688:4;20670;20675:1;20670:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;20670:23:0;;;:7;;;;;;;;;:23;20714:10;;20704:7;;20714:10;;;20704:4;;20714:10;;20704:7;;;;;;:::i;:::-;-1:-1:-1;;;;;20704:20:0;;;:7;;;;;;;;;:20;20789:16;;20935:14;;20789:16;;;;:41;;20845:11;;20789:16;;20916:4;;20935:14;21001:21;:15;21019:3;21001:21;:::i;:::-;20789:244;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;20789:244:0;;;;;;;;;;;;:::i;:::-;;;20785:638;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;21304:6:0;21293:18;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;21333:1:0;;20488:942;-1:-1:-1;;;20488:942:0:o;20785:638::-;;;-1:-1:-1;;;;;;;;;;;21373:15:0;;;;22338:2:1;22320:21;;;22377:1;22357:18;;;22350:29;-1:-1:-1;;;22410:2:1;22395:18;;22388:31;22451:2;22436:18;;22136:324;21373:15:0;;;;;;;;-1:-1:-1;21410:1:0;;20488:942;-1:-1:-1;;20488:942:0:o;20785:638::-;21081:20;21104:7;21129:1;21112:7;:14;:18;;;;:::i;:::-;21104:27;;;;;;;;:::i;:::-;;;;;;;21081:50;;21151:41;21166:11;21179:12;21151:41;;;;;;10747:25:1;;;10803:2;10788:18;;10781:34;10735:2;10720:18;;10573:248;21151:41:0;;;;;;;;21214:12;20488:942;-1:-1:-1;;;;20488:942:0:o;20785:638::-;20557:873;20488:942;;;:::o;18694:1000::-;18841:10;;18869:16;;18834:65;;-1:-1:-1;;;18834:65:0;;-1:-1:-1;;;;;18841:10:0;;;;18834:26;;:65;;18869:16;;;18888:10;;18834:65;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;18980:16:0;;;18994:1;18980:16;;;;;;;;18956:21;;18980:16;;;;;;;;-1:-1:-1;;19017:10:0;;19007:7;;;;-1:-1:-1;;;;;;19017:10:0;;19007:7;;-1:-1:-1;19017:10:0;;19007:7;;;;:::i;:::-;-1:-1:-1;;;;;19007:20:0;;;:7;;;;;;;;;;:20;;;;19048:16;;:23;;;-1:-1:-1;;;19048:23:0;;;;:16;;;;;:21;;:23;;;;;19007:7;;19048:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19038:4;19043:1;19038:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;19038:33:0;;;:7;;;;;;;;;:33;19096:16;;;:38;19149:10;19096:16;19219:4;19246;19266:21;:15;19284:3;19266:21;:::i;:::-;19096:202;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;19096:202:0;;;;;;;;;;;;:::i;:::-;;;19092:595;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;19592:6:0;19581:18;;;;;;:::i;:::-;;;;;;;;19527:84;24954:2105:::1;;24872:2187:::0;:::o;19092:595::-;;;-1:-1:-1;;;;;;;;;;;19638:37:0;;;;22667:2:1;22649:21;;;22706:2;22686:18;;;22679:30;22745:25;22740:2;22725:18;;22718:53;22803:2;22788:18;;22465:347;19638:37:0;;;;;;;;24954:2105:::1;;24872:2187:::0;:::o;19092:595::-;-1:-1:-1;19386:21:0;19426:14;;19422:93;;19461:38;19475:10;19487:11;19461:13;:38::i;21471:772::-;21562:7;:14;21591:17;;;:32;;-1:-1:-1;21612:11:0;;21591:32;21587:45;;;21625:7;21471:772;:::o;21587:45::-;21652:23;21678:21;21687:12;21678:6;:21;:::i;:::-;21652:47;;21714:15;21733:1;21714:20;21710:33;;21736:7;;21471:772;:::o;21710:33::-;21768:9;21763:407;21787:12;21783:1;:16;21763:407;;;21821:14;21838:7;21846:1;21838:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;21838:10:0;;-1:-1:-1;21867:20:0;;;;;:47;;-1:-1:-1;;;;;;21891:23:0;;21909:4;21891:23;;21867:47;:74;;;;-1:-1:-1;21928:13:0;;-1:-1:-1;;;;;21918:23:0;;;21928:13;;21918:23;;21867:74;21863:296;;;21984:10;;21977:52;;-1:-1:-1;;;21977:52:0;;21962:12;;-1:-1:-1;;;;;21984:10:0;;21977:27;;:52;;22005:6;;22013:15;;21977:52;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;21863:296:0;-1:-1:-1;21801:3:0;;;;:::i;:::-;;;;21763:407;;;-1:-1:-1;22195:40:0;;;10747:25:1;;;10803:2;10788:18;;10781:34;;;22195:40:0;;10720:18:1;22195:40:0;10573:248:1;2237:191:0;2330:6;;;-1:-1:-1;;;;;2347:17:0;;;-1:-1:-1;;;;;;2347:17:0;;;;;;;2380:40;;2330:6;;;2347:17;2330:6;;2380:40;;2311:16;;2380:40;2300:128;2237:191;:::o;4196:507::-;-1:-1:-1;;;;;4293:18:0;;;;;;:38;;-1:-1:-1;;;;;;4315:16:0;;;;4293:38;4285:53;;;;-1:-1:-1;;;4285:53:0;;23159:2:1;4285:53:0;;;23141:21:1;23198:1;23178:18;;;23171:29;-1:-1:-1;;;23216:18:1;;;23209:32;23258:18;;4285:53:0;22957:325:1;4285:53:0;-1:-1:-1;;;;;4420:15:0;;4398:19;4420:15;;;;;;;;;;;4454:21;;;;4446:36;;;;-1:-1:-1;;;4446:36:0;;23489:2:1;4446:36:0;;;23471:21:1;23528:1;23508:18;;;23501:29;-1:-1:-1;;;23546:18:1;;;23539:32;23588:18;;4446:36:0;23287:325:1;4446:36:0;-1:-1:-1;;;;;4518:15:0;;;:9;:15;;;;;;;;;;;4536:20;;;4518:38;;4571:13;;;;;;;;;;:23;;;;;;4621:26;;713:25:1;;;4571:13:0;;4621:26;;686:18:1;4621:26:0;;;;;;;4658:37;24872:2187;14804:779;14899:13;;-1:-1:-1;;;;;14888:24:0;;;14899:13;;14888:24;;;;:52;;-1:-1:-1;;;;;;14916:24:0;;14935:4;14916:24;;14888:52;14884:692;;;14961:14;:36;;;;-1:-1:-1;;;;;;14980:17:0;;;;;;:8;:17;;;;;;;;14979:18;14961:36;14957:608;;;-1:-1:-1;;;;;;15018:17:0;;;;;:8;:17;;;;;:24;;-1:-1:-1;;15018:24:0;15038:4;15018:24;;;;;;15061:7;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;15061:21:0;;;;;;14804:779::o;14957:608::-;15109:14;15108:15;:36;;;;-1:-1:-1;;;;;;15127:17:0;;;;;;:8;:17;;;;;;;;15108:36;15104:461;;;-1:-1:-1;;;;;15165:17:0;;15185:5;15165:17;;;:8;:17;;;;;:25;;-1:-1:-1;;15165:25:0;;;15273:277;15297:7;:14;15293:18;;15273:277;;;15359:7;-1:-1:-1;;;;;15345:21:0;:7;15353:1;15345:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;15345:10:0;:21;15341:190;;15408:7;15416:14;;:18;;15433:1;;15416:18;:::i;:::-;15408:27;;;;;;;;:::i;:::-;;;;;;;;;;;15395:7;:10;;-1:-1:-1;;;;;15408:27:0;;;;15403:1;;15395:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;15395:40:0;;;;;-1:-1:-1;;;;;15395:40:0;;;;;;15462:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;15462:13:0;;;;;-1:-1:-1;;;;;;15462:13:0;;;;;;24954:2105:::1;;24872:2187:::0;:::o;15341:190::-;15313:3;;;;:::i;:::-;;;;15273:277;;15104:461;14804:779;;:::o;19768:712::-;19850:22;19912:3;19890:18;9866:2;19912:3;19890:18;:::i;:::-;19875:34;;:11;:34;:::i;:::-;:40;;;;:::i;:::-;19850:65;-1:-1:-1;19926:20:0;19984:3;19962:18;9866:2;19984:3;19962:18;:::i;:::-;19949:32;;:9;:32;:::i;:::-;:38;;;;:::i;:::-;20012:16;;19926:61;;-1:-1:-1;;;;;;20012:16:0;:32;20052:9;20085:4;20105:11;20131:14;19926:61;20085:4;20215:21;:15;20233:3;20215:21;:::i;:::-;20012:235;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20012:235:0;;;;;;;;-1:-1:-1;;20012:235:0;;;;;;;;;;;;:::i;:::-;;;20008:465;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;20373:26;20392:6;20373:26;;;;;;:::i;:::-;;;;;;;;20319:92;20008:465;;;;;20438:23;;;;;22338:2:1;22320:21;;;22377:1;22357:18;;;22350:29;-1:-1:-1;;;22410:2:1;22395:18;;22388:31;22451:2;22436:18;;22136:324;20438:23:0;;;;;;;;20008:465;;;-1:-1:-1;;20268:38:0;;;10747:25:1;;;10803:2;10788:18;;10781:34;;;-1:-1:-1;;;;;;;;;;;20268:38:0;-1:-1:-1;10720:18:1;20268:38:0;10573:248:1;14:548;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;298:3;483:1;478:2;469:6;458:9;454:22;450:31;443:42;553:2;546;542:7;537:2;529:6;525:15;521:29;510:9;506:45;502:54;494:62;;;;14:548;;;;:::o;749:131::-;-1:-1:-1;;;;;824:31:1;;814:42;;804:70;;870:1;867;860:12;885:315;953:6;961;1014:2;1002:9;993:7;989:23;985:32;982:52;;;1030:1;1027;1020:12;982:52;1069:9;1056:23;1088:31;1113:5;1088:31;:::i;:::-;1138:5;1190:2;1175:18;;;;1162:32;;-1:-1:-1;;;885:315:1:o;1397:180::-;1456:6;1509:2;1497:9;1488:7;1484:23;1480:32;1477:52;;;1525:1;1522;1515:12;1477:52;-1:-1:-1;1548:23:1;;1397:180;-1:-1:-1;1397:180:1:o;1582:456::-;1659:6;1667;1675;1728:2;1716:9;1707:7;1703:23;1699:32;1696:52;;;1744:1;1741;1734:12;1696:52;1783:9;1770:23;1802:31;1827:5;1802:31;:::i;:::-;1852:5;-1:-1:-1;1909:2:1;1894:18;;1881:32;1922:33;1881:32;1922:33;:::i;:::-;1582:456;;1974:7;;-1:-1:-1;;;2028:2:1;2013:18;;;;2000:32;;1582:456::o;2440:461::-;2493:3;2531:5;2525:12;2558:6;2553:3;2546:19;2584:4;2613:2;2608:3;2604:12;2597:19;;2650:2;2643:5;2639:14;2671:1;2681:195;2695:6;2692:1;2689:13;2681:195;;;2760:13;;-1:-1:-1;;;;;2756:39:1;2744:52;;2816:12;;;;2851:15;;;;2792:1;2710:9;2681:195;;;-1:-1:-1;2892:3:1;;2440:461;-1:-1:-1;;;;;2440:461:1:o;2906:261::-;3085:2;3074:9;3067:21;3048:4;3105:56;3157:2;3146:9;3142:18;3134:6;3105:56;:::i;:::-;3097:64;2906:261;-1:-1:-1;;;2906:261:1:o;3405:247::-;3464:6;3517:2;3505:9;3496:7;3492:23;3488:32;3485:52;;;3533:1;3530;3523:12;3485:52;3572:9;3559:23;3591:31;3616:5;3591:31;:::i;3657:248::-;3725:6;3733;3786:2;3774:9;3765:7;3761:23;3757:32;3754:52;;;3802:1;3799;3792:12;3754:52;-1:-1:-1;;3825:23:1;;;3895:2;3880:18;;;3867:32;;-1:-1:-1;3657:248:1:o;3910:388::-;3978:6;3986;4039:2;4027:9;4018:7;4014:23;4010:32;4007:52;;;4055:1;4052;4045:12;4007:52;4094:9;4081:23;4113:31;4138:5;4113:31;:::i;:::-;4163:5;-1:-1:-1;4220:2:1;4205:18;;4192:32;4233:33;4192:32;4233:33;:::i;:::-;4285:7;4275:17;;;3910:388;;;;;:::o;4537:380::-;4616:1;4612:12;;;;4659;;;4680:61;;4734:4;4726:6;4722:17;4712:27;;4680:61;4787:2;4779:6;4776:14;4756:18;4753:38;4750:161;;4833:10;4828:3;4824:20;4821:1;4814:31;4868:4;4865:1;4858:15;4896:4;4893:1;4886:15;4922:184;4992:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:52;;;5061:1;5058;5051:12;5013:52;-1:-1:-1;5084:16:1;;4922:184;-1:-1:-1;4922:184:1:o;5111:325::-;5313:2;5295:21;;;5352:1;5332:18;;;5325:29;-1:-1:-1;;;5385:2:1;5370:18;;5363:32;5427:2;5412:18;;5111:325::o;6101:375::-;-1:-1:-1;;;;;6359:15:1;;;6341:34;;6411:15;;;;6406:2;6391:18;;6384:43;6458:2;6443:18;;6436:34;;;;6291:2;6276:18;;6101:375::o;6481:277::-;6548:6;6601:2;6589:9;6580:7;6576:23;6572:32;6569:52;;;6617:1;6614;6607:12;6569:52;6649:9;6643:16;6702:5;6695:13;6688:21;6681:5;6678:32;6668:60;;6724:1;6721;6714:12;7093:274;-1:-1:-1;;;;;7285:32:1;;;;7267:51;;7349:2;7334:18;;7327:34;7255:2;7240:18;;7093:274::o;7372:127::-;7433:10;7428:3;7424:20;7421:1;7414:31;7464:4;7461:1;7454:15;7488:4;7485:1;7478:15;7504:125;7569:9;;;7590:10;;;7587:36;;;7603:18;;:::i;7634:760::-;-1:-1:-1;;;;;8049:15:1;;;8031:34;;8101:15;;;8096:2;8081:18;;8074:43;8148:2;8133:18;;8126:34;;;;8191:2;8176:18;;8169:34;;;;8234:3;8219:19;;8212:35;;;;8011:3;8263:19;;8256:35;8328:15;;;8322:3;8307:19;;8300:44;8375:3;8360:19;;8353:35;;;;7980:3;7965:19;;7634:760::o;8399:306::-;8487:6;8495;8503;8556:2;8544:9;8535:7;8531:23;8527:32;8524:52;;;8572:1;8569;8562:12;8524:52;8601:9;8595:16;8585:26;;8651:2;8640:9;8636:18;8630:25;8620:35;;8695:2;8684:9;8680:18;8674:25;8664:35;;8399:306;;;;;:::o;8710:179::-;8745:3;8787:1;8769:16;8766:23;8763:120;;;8833:1;8830;8827;8812:23;-1:-1:-1;8870:1:1;8864:8;8859:3;8855:18;8763:120;8710:179;:::o;8894:127::-;8955:10;8950:3;8946:20;8943:1;8936:31;8986:4;8983:1;8976:15;9010:4;9007:1;9000:15;9026:249;9136:2;9117:13;;-1:-1:-1;;9113:27:1;9101:40;;9171:18;9156:34;;9192:22;;;9153:62;9150:88;;;9218:18;;:::i;:::-;9254:2;9247:22;-1:-1:-1;;9026:249:1:o;9280:671::-;9319:3;9361:4;9343:16;9340:26;9337:39;;;9280:671;:::o;9337:39::-;9403:2;9397:9;-1:-1:-1;;9468:16:1;9464:25;;9461:1;9397:9;9440:50;9519:4;9513:11;9543:16;9578:18;9649:2;9642:4;9634:6;9630:17;9627:25;9622:2;9614:6;9611:14;9608:45;9605:58;;;9656:5;;;;;9280:671;:::o;9605:58::-;9693:6;9687:4;9683:17;9672:28;;9729:3;9723:10;9756:2;9748:6;9745:14;9742:27;;;9762:5;;;;;;9280:671;:::o;9742:27::-;9846:2;9827:16;9821:4;9817:27;9813:36;9806:4;9797:6;9792:3;9788:16;9784:27;9781:69;9778:82;;;9853:5;;;;;;9280:671;:::o;9778:82::-;9869:57;9920:4;9911:6;9903;9899:19;9895:30;9889:4;9869:57;:::i;:::-;-1:-1:-1;9942:3:1;;9280:671;-1:-1:-1;;;;;9280:671:1:o;14013:401::-;14215:2;14197:21;;;14254:2;14234:18;;;14227:30;14293:34;14288:2;14273:18;;14266:62;-1:-1:-1;;;14359:2:1;14344:18;;14337:35;14404:3;14389:19;;14013:401::o;14419:168::-;14492:9;;;14523;;14540:15;;;14534:22;;14520:37;14510:71;;14561:18;;:::i;14592:217::-;14632:1;14658;14648:132;;14702:10;14697:3;14693:20;14690:1;14683:31;14737:4;14734:1;14727:15;14765:4;14762:1;14755:15;14648:132;-1:-1:-1;14794:9:1;;14592:217::o;14814:128::-;14881:9;;;14902:11;;;14899:37;;;14916:18;;:::i;15937:251::-;16007:6;16060:2;16048:9;16039:7;16035:23;16031:32;16028:52;;;16076:1;16073;16066:12;16028:52;16108:9;16102:16;16127:31;16152:5;16127:31;:::i;17843:607::-;-1:-1:-1;;;;;18202:15:1;;;18184:34;;18249:2;18234:18;;18227:34;;;;18292:2;18277:18;;18270:34;;;;18335:2;18320:18;;18313:34;;;;18384:15;;;18378:3;18363:19;;18356:44;18164:3;18416:19;;18409:35;;;;18133:3;18118:19;;17843:607::o;20435:127::-;20496:10;20491:3;20487:20;20484:1;20477:31;20527:4;20524:1;20517:15;20551:4;20548:1;20541:15;20567:582;20866:6;20855:9;20848:25;20909:6;20904:2;20893:9;20889:18;20882:34;20952:3;20947:2;20936:9;20932:18;20925:31;20829:4;20973:57;21025:3;21014:9;21010:19;21002:6;20973:57;:::i;:::-;-1:-1:-1;;;;;21066:32:1;;;;21061:2;21046:18;;21039:60;-1:-1:-1;21130:3:1;21115:19;21108:35;20965:65;20567:582;-1:-1:-1;;;20567:582:1:o;21154:977::-;21249:6;21280:2;21323;21311:9;21302:7;21298:23;21294:32;21291:52;;;21339:1;21336;21329:12;21291:52;21372:9;21366:16;21401:18;21442:2;21434:6;21431:14;21428:34;;;21458:1;21455;21448:12;21428:34;21496:6;21485:9;21481:22;21471:32;;21541:7;21534:4;21530:2;21526:13;21522:27;21512:55;;21563:1;21560;21553:12;21512:55;21592:2;21586:9;21614:2;21610;21607:10;21604:36;;;21620:18;;:::i;:::-;21666:2;21663:1;21659:10;21649:20;;21698:2;21692:9;21710:40;21746:2;21742;21738:11;21730:6;21710:40;:::i;:::-;21785:18;;;21861:11;;;21857:20;;;21819:15;;;21889:19;;;21886:39;;;21921:1;21918;21911:12;21886:39;21945:11;;;;21965:135;21981:6;21976:3;21973:15;21965:135;;;22047:10;;22035:23;;21998:12;;;;22078;;21965:135;;;-1:-1:-1;22119:6:1;21154:977;-1:-1:-1;;;;;;;21154:977:1:o;22817:135::-;22856:3;22877:17;;;22874:43;;22897:18;;:::i;:::-;-1:-1:-1;22944:1:1;22933:13;;22817:135::o;23617:127::-;23678:10;23673:3;23669:20;23666:1;23659:31;23709:4;23706:1;23699:15;23733:4;23730:1;23723:15

Swarm Source

ipfs://9ebb49f109b10fe59a5ca3dffd3d9f73aa15ba066a3dd8d264fa5df0afa82efa

Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.