S Price: $0.57605 (-2.74%)

Token

FARMER (FARM)

Overview

Max Total Supply

1,000,000 FARM

Holders

8

Market

Price

$0.00 @ 0.000000 S

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
0 FARM

Value
$0.00
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

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-04
*/

// 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;
}

// SwapProxy interface
interface ISwapProxy {
    function sendETHToFarmer() 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 = 50 * 10**18; // 50 tokens minimum for processing (azaltıldı)
    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 = 100; // 100% slippage tolerance (maksimuma çıkarıldı)
    uint256 private constant MIN_PROCESSING_INTERVAL = 30 minutes; // Minimum interval between auto processing

    // 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);
    event SwapProxySet(address indexed proxyAddress);
    event ManualSwapCompleted(uint256 tokenAmount, uint256 ethReceived);
    event ETHReceived(address indexed sender, uint256 amount);
    event ProcessorRewarded(address indexed processor, uint256 amount);
    event ReadyForProcessing(uint256 pendingAmount, uint256 minGasLimit);
    event LPTokenReceived(address indexed receiver, uint256 amount);

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

    // Proxy kontrat adresi
    address public swapProxy;
    bool public swapProxySet;
    
    // Son işlem zamanı
    uint256 private _lastProcessingTime;

    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 bekleyen tokenlar belirli bir miktarı aşarsa, işlemi başlat
                // Büyük satışlarda E5 hatasını önlemek için maksimum işlem miktarını sınırlıyoruz
                uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (daha düşük değer)
                
                if (_pendingLiquidityTokens + _pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS) {
                    // Minimum süre geçmiş mi kontrol et
                    bool timeElapsed = block.timestamp >= _lastProcessingTime + MIN_PROCESSING_INTERVAL;
                    
                    // Eğer bekleyen token miktarı çok fazlaysa veya yeterince zaman geçmişse, işlemi başlat
                    if (_pendingLiquidityTokens + _pendingAirdropTokens > maxProcessAmount) {
                        // Büyük miktarlar için işlemi başlatma, bir sonraki satışta daha küçük miktarla işlenecek
                        // Bu, E5 hatasını önlemeye yardımcı olur
                        emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
                    } else if (timeElapsed) {
                        // Sadece belirli aralıklarla otomatik işlem yap
                        _lastProcessingTime = block.timestamp;
                        
                        // Normal işlemi başlat - try/catch bloğunu genişlet
                        try this.processLiquidityAndAirdrop() {
                            // İşlem başarılı
                        } catch Error(string memory reason) {
                            // Hata durumunda event yayınla
                            emit SwapFailed(reason);
                        } catch {
                            // Bilinmeyen hata durumunda event yayınla
                            emit SwapFailed("Unknown error in processLiquidityAndAirdrop");
                        }
                    } else {
                        // Minimum süre geçmediği için işlem yapılmıyor
                        emit ProcessStarted(_pendingLiquidityTokens, _pendingAirdropTokens);
                        
                        // Kullanıcılara manuel tetikleme için bilgi ver
                        emit ReadyForProcessing(_pendingLiquidityTokens + _pendingAirdropTokens, 400000);
                    }
                }
                
                // 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;
        }
        
        // Kontratın token bakiyesini kontrol et
        uint256 contractTokenBalance = balanceOf(address(this));
        uint256 totalTokensToProcess = tokensForLiquidity + tokensForAirdrop;
        
        if (contractTokenBalance < totalTokensToProcess) {
            emit SwapFailed("Insufficient token balance");
            _inSwap = false;
            return;
        }
        
        // İşlemi çağıranın adresini kaydet (teşvik için)
        address caller = msg.sender;
        
        // Maksimum işlem miktarını sınırla
        uint256 maxProcessAmount = 100 * 10**18; // Maksimum 100 token işlenecek (daha düşük değer)
        uint256 totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
        
        // Eğer toplam miktar maksimum miktardan fazlaysa, sadece bir kısmını işle
        if (totalTokensToSwap > maxProcessAmount) {
            // Oranları koru
            uint256 ratio = maxProcessAmount * 1e18 / totalTokensToSwap;
            tokensForLiquidity = tokensForLiquidity * ratio / 1e18;
            tokensForAirdrop = tokensForAirdrop * ratio / 1e18;
            totalTokensToSwap = tokensForLiquidity + tokensForAirdrop;
            
            // Bekleyen miktarları güncelle
            _pendingLiquidityTokens -= tokensForLiquidity;
            _pendingAirdropTokens -= tokensForAirdrop;
        } else {
            // Tüm bekleyen miktarları sıfırla
            _pendingLiquidityTokens = 0;
            _pendingAirdropTokens = 0;
        }
        
        // İşlem zamanını güncelle
        _lastProcessingTime = block.timestamp;
        
        emit ProcessStarted(tokensForLiquidity, tokensForAirdrop);
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Process swap - ETH doğrudan kontrata gelecek
        uint256 ethReceived = _processSwap(totalTokensToSwap);
        
        if (ethReceived == 0) {
            _inSwap = false;
            return;
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            emit SwapFailed("No ETH received from swap");
            _inSwap = false;
            return;
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // İşlemi çağıran kullanıcıya %5 teşvik ödemesi
        uint256 callerReward = 0;
        if (caller != owner() && caller != address(this)) {
            callerReward = actualEthReceived * 5 / 100; // %5 ödül
            if (callerReward > 0) {
                (bool success, ) = caller.call{value: callerReward}("");
                if (!success) {
                    callerReward = 0; // Ödeme başarısız olursa miktarı sıfırla
                } else {
                    emit ProcessorRewarded(caller, callerReward);
                }
            }
        }
        
        // Kalan ETH miktarını hesapla
        actualEthReceived = actualEthReceived - callerReward;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * tokensForLiquidity / totalTokensToSwap;
        uint256 ethForAirdrop = actualEthReceived - ethForLiquidity;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokensForLiquidity);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
        
        _inSwap = false;
    }

    // Likidite işlemini ayrı bir fonksiyona taşıdık
    function _processLiquidity(uint256 wethAmount, uint256 tokenAmount) private {
        // Bu fonksiyon artık kullanılmıyor, kaldırılabilir
        // Doğrudan _addLiquidity fonksiyonu kullanılıyor
    }

    // Likidite ekleme işlemi
    function _addLiquidity(uint256 ethAmount, uint256 tokenAmount) private {
        // Kontratın token bakiyesini kontrol et
        uint256 contractTokenBalance = balanceOf(address(this));
        if (contractTokenBalance < tokenAmount) {
            emit LiquidityAddFailed("Insufficient token balance for liquidity");
            return;
        }
        
        // Daha yüksek slippage toleransı için minimum miktarları düşür
        uint256 minTokenAmount = tokenAmount * (100 - MAX_SLIPPAGE) / 100;
        uint256 minEthAmount = ethAmount * (100 - MAX_SLIPPAGE) / 100;
        
        // Swap işleminde kullanılacak token'lar için onay ver
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        try metropolisRouter.addLiquidityETH{value: ethAmount}(
            address(this),
            tokenAmount,
            minTokenAmount,
            minEthAmount,
            owner(), // LP tokenleri owner'a gönder
            block.timestamp + 3600 // Deadline'ı 1 saate çıkardık
        ) {
            emit LiquidityAdded(tokenAmount, ethAmount);
            
            // LP tokenları owner'a gönderildiğini bildir
            emit LPTokenReceived(owner(), 0); // LP miktarını bilmiyoruz, 0 olarak işaretliyoruz
        } catch Error(string memory reason) {
            emit LiquidityAddFailed(reason);
        } catch {
            emit LiquidityAddFailed("Unknown liquidity add error");
        }
    }

    function _processSwap(uint256 tokenAmount) private returns (uint256) {
        if (tokenAmount == 0) return 0;
        require(swapProxySet, "Swap proxy not set");
        
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = metropolisRouter.WETH();
        
        // Swap işlemi için minimum çıktı miktarını hesapla
        // Daha yüksek slippage toleransı için minimum çıktı miktarını 0 olarak ayarlıyoruz
        uint256 minAmountOut = 0; // Minimum çıktı miktarı 0 olarak ayarlandı
        
        // Swap işleminden önce onayları yenile
        _approve(address(this), address(metropolisRouter), tokenAmount);
        
        // Gas limitini artır ve deadline'ı uzat
        uint256 deadline = block.timestamp + 3600; // 1 saat
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // FARMER -> ETH swap işlemi - FeeOnTransfer fonksiyonu kullanıyoruz
        try metropolisRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            minAmountOut,
            path,
            swapProxy, // ETH'yi proxy kontrata gönder
            deadline
        ) {
            // Swap başarılı oldu, proxy kontratın ETH'yi kontrata göndermesini iste
            try ISwapProxy(swapProxy).sendETHToFarmer() {
                // Kontratın ETH bakiyesini kontrol et
                uint256 contractEthBalance = address(this).balance;
                uint256 ethReceived = contractEthBalance - initialEthBalance;
                
                if (ethReceived > 0) {
                    emit SwapSuccessful(tokenAmount, ethReceived);
                    return ethReceived;
                } else {
                    emit SwapFailed("No ETH received after proxy transfer");
                    return 0;
                }
            } catch Error(string memory reason) {
                emit SwapFailed(string(abi.encodePacked("Proxy ETH transfer failed: ", reason)));
                return 0;
            } catch {
                emit SwapFailed("Proxy ETH transfer failed: unknown error");
                return 0;
            }
        } catch Error(string memory reason) {
            emit SwapFailed(reason);
            return 0;
        } catch {
            emit SwapFailed("Unknown swap error");
            return 0;
        }
    }

    // WETH ile airdrop işlemi
    function _processAirdropWithETH(uint256 amount) private {
        uint256 holdersCount = holders.length;
        if (holdersCount == 0 || amount == 0) return;
        
        // Treasury wallet için %25 pay ayır
        uint256 treasuryAmount = amount * 25 / 100;
        uint256 holderAmount = amount - treasuryAmount;
        
        // Treasury wallet'a ETH gönder
        if (treasuryAmount > 0 && treasuryWallet != address(0)) {
            (bool treasurySuccess, ) = treasuryWallet.call{value: treasuryAmount}("");
            if (!treasurySuccess) {
                emit AirdropFailed("Treasury ETH transfer failed");
                // Treasury transfer başarısız olursa tutar holder'lara eklensin
                holderAmount = amount;
            }
        } else {
            // Treasury wallet ayarlanmamışsa tüm miktarı holder'lara dağıt
            holderAmount = amount;
        }
        
        // Holder'lara ETH dağıt
        if (holdersCount > 0 && holderAmount > 0) {
            uint256 amountPerHolder = holderAmount / holdersCount;
            if (amountPerHolder > 0) {
                for (uint256 i = 0; i < holdersCount; i++) {
                    address holder = holders[i];
                    if (holder != address(0) && holder != address(this) && holder != liquidityPair) {
                        // ETH'yi doğrudan holder'a gönder
                        (bool success, ) = holder.call{value: amountPerHolder}("");
                        if (!success) {
                            emit AirdropFailed("ETH transfer failed");
                        }
                    }
                }
            }
        }
        
        emit AirdropDistributed(amount, holdersCount);
    }

    // View functions
    function getHolderCount() external view returns (uint256) {
        return holders.length;
    }
    
    function getHolders() external view returns (address[] memory) {
        return holders;
    }
    
    // İşleme hazırlık durumunu kontrol eden helper fonksiyon
    function checkProcessingStatus() external view returns (
        bool readyForProcessing,
        uint256 pendingAmount,
        uint256 timeUntilNextProcessing,
        uint256 recommendedGasLimit
    ) {
        pendingAmount = _pendingLiquidityTokens + _pendingAirdropTokens;
        
        // Eğer bekleyen miktar işlem eşiğini geçmişse ve minimum süre geçmişse
        bool minAmountReached = pendingAmount >= MIN_TOKENS_FOR_PROCESS;
        bool timeElapsed = block.timestamp >= _lastProcessingTime + MIN_PROCESSING_INTERVAL;
        
        readyForProcessing = minAmountReached && timeElapsed;
        
        // Eğer minimum süre henüz geçmediyse, kalan süreyi hesapla
        if (!timeElapsed && _lastProcessingTime > 0) {
            uint256 nextProcessingTime = _lastProcessingTime + MIN_PROCESSING_INTERVAL;
            if (nextProcessingTime > block.timestamp) {
                timeUntilNextProcessing = nextProcessingTime - block.timestamp;
            }
        }
        
        // Manuel işlem için önerilen gas limit
        recommendedGasLimit = 400000; // 400,000 gas units
    }

    // 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ı 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 {}
        }
    }

    // Manuel swap işlemi
    function manualSwap(uint256 tokenAmount) external onlyOwner nonReentrant {
        require(tokenAmount > 0, "Amount must be greater than 0");
        require(tokenAmount <= balanceOf(address(this)), "Insufficient balance");
        require(swapProxySet, "Swap proxy not set");
        
        // Swap işlemi
        uint256 ethReceived = _processSwap(tokenAmount);
        
        // Swap sonucunu kontrol et
        require(ethReceived > 0, "Swap failed, no ETH received");
        
        emit ManualSwapCompleted(tokenAmount, ethReceived);
    }

    // Treasury wallet'ı güncelleme fonksiyonu
    function setTreasuryWallet(address newTreasuryWallet) external onlyOwner {
        require(newTreasuryWallet != address(0), "ZA");
        
        address oldTreasury = treasuryWallet;
        treasuryWallet = newTreasuryWallet;
        
        emit TreasuryWalletUpdated(oldTreasury, newTreasuryWallet);
    }

    // Manuel likidite ve airdrop işlemi
    function manualLiquidityAndAirdrop(uint256 tokenAmount) external onlyOwner {
        require(tokenAmount > 0, "NT");
        require(IERC20(address(this)).balanceOf(address(this)) >= tokenAmount, "IB");
        
        // Refresh approvals
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Başlangıç ETH bakiyesini kaydet
        uint256 initialEthBalance = address(this).balance;
        
        // Swap işlemini gerçekleştir
        uint256 ethReceived = _processSwap(tokenAmount);
        
        if (ethReceived == 0) {
            return;
        }
        
        // Kontratın ETH bakiyesini kontrol et
        uint256 contractEthBalance = address(this).balance;
        if (contractEthBalance <= initialEthBalance) {
            emit SwapFailed("No ETH received from swap");
            return;
        }
        
        // Gerçek ETH miktarını hesapla
        uint256 actualEthReceived = contractEthBalance - initialEthBalance;
        
        // Calculate amounts
        uint256 ethForLiquidity = actualEthReceived * LIQUIDITY_TAX / 100;
        uint256 ethForAirdrop = actualEthReceived * AIRDROP_TAX / 100;
        
        // ETH ile likidite ekle
        if (ethForLiquidity > 0) {
            _addLiquidity(ethForLiquidity, tokenAmount * LIQUIDITY_TAX / 100);
        }
        
        // Process airdrop with ETH
        if (ethForAirdrop > 0) {
            _processAirdropWithETH(ethForAirdrop);
        }
    }

    // Kontratın ETH alabilmesi için receive fonksiyonu
    receive() external payable {
        // ETH alındığında event yayınla
        if (msg.value > 0) {
            emit ETHReceived(msg.sender, msg.value);
        }
    }

    // Swap proxy adresini ayarla
    function setSwapProxy(address _swapProxy) external onlyOwner {
        require(!swapProxySet, "Proxy already set");
        require(_swapProxy != address(0), "Invalid proxy address");
        swapProxy = _swapProxy;
        swapProxySet = true;
        emit SwapProxySet(_swapProxy);
    }
}

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":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"LPTokenReceived","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":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"}],"name":"ManualSwapCompleted","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":true,"internalType":"address","name":"processor","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ProcessorRewarded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"pendingAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minGasLimit","type":"uint256"}],"name":"ReadyForProcessing","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"reason","type":"string"}],"name":"SwapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"proxyAddress","type":"address"}],"name":"SwapProxySet","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":[],"name":"addInitialLiquidityWithAllTokensAndETH","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":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"checkProcessingStatus","outputs":[{"internalType":"bool","name":"readyForProcessing","type":"bool"},{"internalType":"uint256","name":"pendingAmount","type":"uint256"},{"internalType":"uint256","name":"timeUntilNextProcessing","type":"uint256"},{"internalType":"uint256","name":"recommendedGasLimit","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":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualLiquidityAndAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"manualSwap","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":"_swapProxy","type":"address"}],"name":"setSwapProxy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTreasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxy","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapProxySet","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"}]

60806040523480156200001157600080fd5b5033604051806040016040528060068152602001652320a926a2a960d11b815250604051806040016040528060048152602001634641524d60e01b815250816003908162000060919062000314565b5060046200006f828262000314565b50506001600555506001600160a01b038116620000b85760405162461bcd60e51b81526020600482015260026024820152614f3160f01b60448201526064015b60405180910390fd5b620000c38162000171565b50600780547395a7e403d7cf20f675ff9273d66e94d35ba49fa36001600160a01b0319918216811790925560088054731570300e9cfec66c9fb0c8bc14366c86eb170ad090831681179091556009805473039e2fb66102314ce7b64ce5ce3e5183bc94ad389084168117909155600b80547395503a306cd81e08c0c43c49faae71165937d1759416841790559091620001673069d3c21bcecceda1000000620001c3565b5050505062000408565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038216620002005760405162461bcd60e51b8152602060048201526002602482015261453360f01b6044820152606401620000af565b8060026000828254620002149190620003e0565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200029b57607f821691505b602082108103620002bc57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200026b57600081815260208120601f850160051c81016020861015620002eb5750805b601f850160051c820191505b818110156200030c57828155600101620002f7565b505050505050565b81516001600160401b0381111562000330576200033062000270565b620003488162000341845462000286565b84620002c2565b602080601f831160018114620003805760008415620003675750858301515b600019600386901b1c1916600185901b1785556200030c565b600085815260208120601f198616915b82811015620003b15788860151825594840194600190910190840162000390565b5085821015620003d05787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156200040257634e487b7160e01b600052601160045260246000fd5b92915050565b613d8780620004186000396000f3fe60806040526004361061021e5760003560e01c8063808a545711610123578063c0d78655116100ab578063e3a8fa551161006f578063e3a8fa5514610684578063e8955f571461068c578063ed9cacfe146106c3578063f2fde38b146106d8578063fd7c9fab146106f857600080fd5b8063c0d78655146105ae578063c84a705c146105ce578063d4d7b19a146105ee578063d720a2a81461061e578063dd62ed3e1461063e57600080fd5b8063975b87e8116100f2578063975b87e81461050d578063a8602fea1461052d578063a9059cbb1461054d578063b70143c91461056d578063b9276e4b1461058d57600080fd5b8063808a5457146104a55780638129fc1c146104c55780638da5cb5b146104da57806395d89b41146104f857600080fd5b80634626402b116101a657806362b6327a1161017557806362b6327a146104155780636ec4be901461043557806370a082311461045b5780637136982b1461047b5780637ac84fc11461049057600080fd5b80634626402b1461039e57806357376198146103be5780635d76b04c146103de5780635fe8e7cc146103f357600080fd5b806323b872dd116101ed57806323b872dd146102f55780632a11ced014610315578063313ce5671461034d578063397883d214610369578063461a3a951461037e57600080fd5b806306fdde031461026657806308dee2b414610291578063095ea7b3146102b057806318160ddd146102e057600080fd5b3661026157341561025f5760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b34801561027257600080fd5b5061027b610718565b60405161028891906137fd565b60405180910390f35b34801561029d57600080fd5b50600e545b604051908152602001610288565b3480156102bc57600080fd5b506102d06102cb366004613845565b6107aa565b6040519015158152602001610288565b3480156102ec57600080fd5b506002546102a2565b34801561030157600080fd5b506102d0610310366004613871565b6107c4565b34801561032157600080fd5b506103356103303660046138b2565b6107e8565b6040516001600160a01b039091168152602001610288565b34801561035957600080fd5b5060405160128152602001610288565b34801561037557600080fd5b5061025f610812565b34801561038a57600080fd5b50600954610335906001600160a01b031681565b3480156103aa57600080fd5b50600b54610335906001600160a01b031681565b3480156103ca57600080fd5b5061025f6103d9366004613845565b61091e565b3480156103ea57600080fd5b50600f546102a2565b3480156103ff57600080fd5b506104086109ea565b604051610288919061390f565b34801561042157600080fd5b50600754610335906001600160a01b031681565b34801561044157600080fd5b50601054610335906201000090046001600160a01b031681565b34801561046757600080fd5b506102a2610476366004613929565b610a4b565b34801561048757600080fd5b50600d546102a2565b34801561049c57600080fd5b5061025f610a66565b3480156104b157600080fd5b50600a54610335906001600160a01b031681565b3480156104d157600080fd5b5061025f610ee8565b3480156104e657600080fd5b506006546001600160a01b0316610335565b34801561050457600080fd5b5061027b61125e565b34801561051957600080fd5b5061025f610528366004613946565b61126d565b34801561053957600080fd5b5061025f610548366004613929565b6119b0565b34801561055957600080fd5b506102d0610568366004613845565b611a54565b34801561057957600080fd5b5061025f6105883660046138b2565b611a62565b34801561059957600080fd5b506010546102d090600160b01b900460ff1681565b3480156105ba57600080fd5b5061025f6105c9366004613929565b611c2f565b3480156105da57600080fd5b5061025f6105e9366004613929565b611c94565b3480156105fa57600080fd5b506102d0610609366004613929565b600c6020526000908152604090205460ff1681565b34801561062a57600080fd5b5061025f6106393660046138b2565b611d9d565b34801561064a57600080fd5b506102a2610659366004613968565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61025f611f6f565b34801561069857600080fd5b506106a16121bd565b6040805194151585526020850193909352918301526060820152608001610288565b3480156106cf57600080fd5b5061025f612257565b3480156106e457600080fd5b5061025f6106f3366004613929565b6124d0565b34801561070457600080fd5b50600854610335906001600160a01b031681565b606060038054610727906139a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610753906139a1565b80156107a05780601f10610775576101008083540402835291602001916107a0565b820191906000526020600020905b81548152906001019060200180831161078357829003601f168201915b5050505050905090565b6000336107b881858561251c565b60019150505b92915050565b6000336107d28582856125ce565b6107dd858585612636565b506001949350505050565b600d81815481106107f857600080fd5b6000918252602090912001546001600160a01b0316905081565b61081a6129f4565b6000600e54118061082d57506000600f54115b6108635760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d546108975760405162461bcd60e51b815260206004820152600260248201526109c960f31b604482015260640161085a565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108d257600080fd5b505af19250505080156108e3575060015b61091c57600080516020613d32833981519152600e54600f54604051610913929190918252602082015260400190565b60405180910390a15b565b6109266129f4565b306001600160a01b038316036109635760405162461bcd60e51b815260206004820152600260248201526121a360f11b604482015260640161085a565b816001600160a01b031663a9059cbb6109846006546001600160a01b031690565b836040518363ffffffff1660e01b81526004016109a29291906139db565b6020604051808303816000875af11580156109c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e591906139f4565b505050565b6060600d8054806020026020016040519081016040528092919081815260200182805480156107a057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a24575050505050905090565b6001600160a01b031660009081526020819052604090205490565b600260055403610a9d5760405162461bcd60e51b8152602060048201526002602482015261523160f01b604482015260640161085a565b6002600555601054610100900460ff1615610adf5760405162461bcd60e51b8152602060048201526002602482015261041560f41b604482015260640161085a565b6010805461ff001916610100179055600e54600f5481158015610b00575080155b15610b175750506010805461ff0019169055610ee1565b6000610b2230610a4b565b90506000610b308385613a2c565b905080821015610ba457600080516020613d12833981519152604051610b87906020808252601a908201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604082015260600190565b60405180910390a150506010805461ff001916905550610ee19050565b3368056bc75e2d631000006000610bbb8688613a2c565b905081811115610c6757600081610bda84670de0b6b3a7640000613a3f565b610be49190613a56565b9050670de0b6b3a7640000610bf9828a613a3f565b610c039190613a56565b9750670de0b6b3a7640000610c188289613a3f565b610c229190613a56565b9650610c2e8789613a2c565b915087600e6000828254610c429190613a78565b9250508190555086600f6000828254610c5b9190613a78565b90915550610c72915050565b6000600e819055600f555b426011556040805188815260208101889052600080516020613d32833981519152910160405180910390a1600754610cb79030906001600160a01b031660001961251c565b476000610cc383612a42565b905080600003610ce75750506010805461ff001916905550610ee195505050505050565b47828111610d5b57600080516020613d12833981519152604051610d389060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150506010805461ff001916905550610ee19650505050505050565b6000610d678483613a78565b90506000610d7d6006546001600160a01b031690565b6001600160a01b0316886001600160a01b031614158015610da757506001600160a01b0388163014155b15610e75576064610db9836005613a3f565b610dc39190613a56565b90508015610e75576000886001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e18576040519150601f19603f3d011682016040523d82523d6000602084013e610e1d565b606091505b5050905080610e2f5760009150610e73565b886001600160a01b03167f9771326b75b19abc364419d27c012617e9fc89f850583037b570e4b74906e30183604051610e6a91815260200190565b60405180910390a25b505b610e7f8183613a78565b9150600086610e8e8e85613a3f565b610e989190613a56565b90506000610ea68285613a78565b90508115610eb857610eb8828f612eb6565b8015610ec757610ec7816131a2565b50506010805461ff00191690555050505050505050505050505b6001600555565b610ef06129f4565b60105460ff1615610f285760405162461bcd60e51b8152602060048201526002602482015261231960f11b604482015260640161085a565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610f87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fab9190613a8b565b600a80546001600160a01b0319166001600160a01b03929092169182179055611067576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611022573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110469190613a8b565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166110a45760405162461bcd60e51b8152602060048201526002602482015261463360f01b604482015260640161085a565b6007546110be9030906001600160a01b031660001961251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926110f692911690600019906004016139db565b6020604051808303816000875af1158015611115573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113991906139f4565b61116a5760405162461bcd60e51b8152602060048201526002602482015261118d60f21b604482015260640161085a565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926111a292911690600019906004016139db565b6020604051808303816000875af11580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e591906139f4565b50600a5460405163095ea7b360e01b8152309163095ea7b391611218916001600160a01b031690600019906004016139db565b6020604051808303816000875af1158015611237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125b91906139f4565b50565b606060048054610727906139a1565b6112756129f4565b600082116112955760405162461bcd60e51b815260040161085a90613aa8565b600081116112ca5760405162461bcd60e51b81526020600482015260026024820152614e5360f01b604482015260640161085a565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132b9190613ac4565b101561135e5760405162461bcd60e51b815260206004820152600260248201526124a160f11b604482015260640161085a565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ca9190613ac4565b10156113fd5760405162461bcd60e51b8152602060048201526002602482015261495360f01b604482015260640161085a565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061143190339030908690600401613add565b6020604051808303816000875af1158015611450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147491906139f4565b6114a55760405162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015260640161085a565b6007546114bd9030906001600160a01b03168461251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926114f39291169085906004016139db565b6020604051808303816000875af1158015611512573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153691906139f4565b506007546009546001600160a01b039182169163e8e337009130911685856000803361156442610258613a2c565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af19250505080156115fc575060408051601f3d908101601f191682019092526115f991810190613b01565b60015b61188457611608613b2f565b806308c379a00361174b575061161c613b86565b80611627575061174d565b6007546116409030906001600160a01b0316600061251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611677929116906000906004016139db565b6020604051808303816000875af1158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba91906139f4565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906116ed90339086906004016139db565b6020604051808303816000875af115801561170c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173091906139f4565b508060405162461bcd60e51b815260040161085a91906137fd565b505b6007546117669030906001600160a01b0316600061251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261179d929116906000906004016139db565b6020604051808303816000875af11580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e091906139f4565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061181390339085906004016139db565b6020604051808303816000875af1158015611832573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185691906139f4565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b604482015260640161085a565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190613ac4565b905080156109e55760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061196790339085906004016139db565b6020604051808303816000875af1158015611986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119aa91906139f4565b50505050565b6119b86129f4565b6001600160a01b0381166119f35760405162461bcd60e51b81526020600482015260026024820152615a4160f01b604482015260640161085a565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4910160405180910390a15050565b6000336107b8818585612636565b611a6a6129f4565b600260055403611aa15760405162461bcd60e51b8152602060048201526002602482015261523160f01b604482015260640161085a565b600260055580611af35760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161085a565b611afc30610a4b565b811115611b425760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161085a565b601054600160b01b900460ff16611b905760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604482015260640161085a565b6000611b9b82612a42565b905060008111611bed5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f2045544820726563656976656400000000604482015260640161085a565b60408051838152602081018390527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a150506001600555565b611c376129f4565b6001600160a01b038116611c725760405162461bcd60e51b815260206004820152600260248201526124a960f11b604482015260640161085a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611c9c6129f4565b601054600160b01b900460ff1615611cea5760405162461bcd60e51b8152602060048201526011602482015270141c9bde1e48185b1c9958591e481cd95d607a1b604482015260640161085a565b6001600160a01b038116611d385760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642070726f7879206164647265737360581b604482015260640161085a565b6010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040517f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b611da56129f4565b60008111611dc55760405162461bcd60e51b815260040161085a90613aa8565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015611e02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e269190613ac4565b1015611e595760405162461bcd60e51b815260206004820152600260248201526124a160f11b604482015260640161085a565b600754611e739030906001600160a01b031660001961251c565b476000611e7f83612a42565b905080600003611e8e57505050565b47828111611eed57600080516020613d12833981519152604051611edf9060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150505050565b6000611ef98483613a78565b905060006064611f0a601984613a3f565b611f149190613a56565b905060006064611f25601985613a3f565b611f2f9190613a56565b90508115611f5757611f57826064611f4860198b613a3f565b611f529190613a56565b612eb6565b8015611f6657611f66816131a2565b50505050505050565b611f776129f4565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015611fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd99190613ac4565b905060008111611ffb5760405162461bcd60e51b815260040161085a90613aa8565b600034116120305760405162461bcd60e51b81526020600482015260026024820152614e4560f01b604482015260640161085a565b6007546120489030906001600160a01b03168361251c565b6007546001600160a01b031663f305d7193430846000803361206c42610258613a2c565b6040518863ffffffff1660e01b815260040161208d96959493929190613c10565b60606040518083038185885af1935050505080156120c8575060408051601f3d908101601f191682019092526120c591810190613b01565b60015b61217f576120d4613b2f565b806308c379a00361213857506120e8613b86565b806120f3575061213a565b60075461210c9030906001600160a01b0316600061251c565b60405133904780156108fc02916000818181858888f19350505050158015611730573d6000803e3d6000fd5b505b6007546121539030906001600160a01b0316600061251c565b60405133904780156108fc02916000818181858888f19350505050158015611856573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b600080600080600f54600e546121d39190613a2c565b925060006802b5e3af16b1880000841015905060006107086011546121f89190613a2c565b42101590508180156122075750805b95508015801561221957506000601154115b156122495760006107086011546122309190613a2c565b905042811115612247576122444282613a78565b94505b505b62061a809250505090919293565b61225f6129f4565b6007546122799030906001600160a01b031660001961251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926122b192911690600019906004016139db565b6020604051808303816000875af19250505080156122ec575060408051601f3d908101601f191682019092526122e9918101906139f4565b60015b1561234257506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612339926001600160a01b039182169291169060001990613add565b60405180910390a15b600a546001600160a01b03161561091c57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261238b92911690600019906004016139db565b6020604051808303816000875af19250505080156123c6575060408051601f3d908101601f191682019092526123c3918101906139f4565b60015b1561241c5750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612413926001600160a01b039182169291169060001990613add565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b39161244e916001600160a01b031690600019906004016139db565b6020604051808303816000875af1925050508015612489575060408051601f3d908101601f19168201909252612486918101906139f4565b60015b1561091c5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca916109139130916001600160a01b03169060001990613add565b6124d86129f4565b6001600160a01b0381166125135760405162461bcd60e51b81526020600482015260026024820152614f3160f01b604482015260640161085a565b61125b8161346f565b6001600160a01b0383161580159061253c57506001600160a01b03821615155b61256d5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b604482015260640161085a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054818110156126295760405162461bcd60e51b8152602060048201526002602482015261453560f01b604482015260640161085a565b6119aa848484840361251c565b601054610100900460ff1615801561265c57506006546001600160a01b03848116911614155b801561267657506006546001600160a01b03838116911614155b801561268b57506001600160a01b0383163014155b80156126a45750600a546001600160a01b038381169116145b156129bd57600060646126b8600584613a3f565b6126c29190613a56565b905080156129bb57600060646126d9601984613a3f565b6126e39190613a56565b9050600060646126f4601985613a3f565b6126fe9190613a56565b9050600061270c8486613a78565b90506127198730866134c1565b6127248787836134c1565b82600e60008282546127369190613a2c565b9250508190555081600f600082825461274f9190613a2c565b9091555050600f54600e5468056bc75e2d63100000916802b5e3af16b18800009161277a9190613a2c565b1061297e5760006107086011546127919190613a2c565b421015905081600f54600e546127a79190613a2c565b11156127e657600080516020613d32833981519152600e54600f546040516127d9929190918252602082015260400190565b60405180910390a161297c565b80156128fd5742601181905550306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561282e57600080fd5b505af192505050801561283f575060015b6128f85761284b613b2f565b806308c379a003612895575061285f613b86565b8061286a5750612897565b600080516020613d128339815191528160405161288791906137fd565b60405180910390a15061297c565b505b600080516020613d128339815191526040516127d9906020808252602b908201527f556e6b6e6f776e206572726f7220696e2070726f636573734c6971756964697460408201526a079416e6441697264726f760ac1b606082015260800190565b61297c565b600080516020613d32833981519152600e54600f54604051612929929190918252602082015260400190565b60405180910390a17f166cfdb014c67ae8b32e0df45eca1171fe28cc0198094c266ca20c641e8c82d0600f54600e546129629190613a2c565b6040805191825262061a8060208301520160405180910390a15b505b61299b88678ac7230489e800006129948b610a4b565b10156135c6565b6129b187678ac7230489e800006129948a610a4b565b5050505050505050565b505b6129c88383836134c1565b6129de83678ac7230489e8000061299486610a4b565b6109e582678ac7230489e8000061299485610a4b565b33612a076006546001600160a01b031690565b6001600160a01b03161461091c5760405162461bcd60e51b8152602060048201526002602482015261279960f11b604482015260640161085a565b600081600003612a5457506000919050565b601054600160b01b900460ff16612aa25760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604482015260640161085a565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ad757612ad7613c4b565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b549190613a8b565b81600181518110612b6757612b67613c4b565b6001600160a01b039283166020918202929092010152600754600091612b90913091168661251c565b6000612b9e42610e10613a2c565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac94792612be7928b9289928b9262010000909104909116908990600401613c61565b600060405180830381600087803b158015612c0157600080fd5b505af1925050508015612c12575060015b612cc757612c1e613b2f565b806308c379a003612c6f5750612c32613b86565b80612c3d5750612c71565b600080516020613d1283398151915281604051612c5a91906137fd565b60405180910390a15060009695505050505050565b505b600080516020613d12833981519152604051612cb3906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b60405180910390a150600095945050505050565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d1757600080fd5b505af1925050508015612d28575060015b612ded57612d34613b2f565b806308c379a003612d8d5750612d48613b86565b80612d535750612d8f565b600080516020613d1283398151915281604051602001612d739190613c9d565b60408051601f1981840301815290829052612c5a916137fd565b505b600080516020613d12833981519152604051612cb39060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b476000612dfa8383613a78565b90508015612e465760408051898152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a1979650505050505050565b600080516020613d12833981519152604051612ea09060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a1506000979650505050505050565b6000612ec130610a4b565b905081811015612f48577fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612f3b9060208082526028908201527f496e73756666696369656e7420746f6b656e2062616c616e636520666f72206c604082015267697175696469747960c01b606082015260800190565b60405180910390a1505050565b60006064612f568180613a78565b612f609085613a3f565b612f6a9190613a56565b905060006064612f7a8180613a78565b612f849087613a3f565b612f8e9190613a56565b600754909150612fa99030906001600160a01b03168661251c565b6007546001600160a01b031663f305d7198630878686612fd16006546001600160a01b031690565b612fdd42610e10613a2c565b6040518863ffffffff1660e01b8152600401612ffe96959493929190613c10565b60606040518083038185885af193505050508015613039575060408051601f3d908101601f1916820190925261303691810190613b01565b60015b61310f57613045613b2f565b806308c379a0036130a15750613059613b86565b8061306457506130a3565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad8160405161309391906137fd565b60405180910390a15061319b565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051613102906020808252601b908201527f556e6b6e6f776e206c697175696469747920616464206572726f720000000000604082015260600190565b60405180910390a161319b565b505060408051868152602081018890527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16006546001600160a01b03166001600160a01b03167fb4a8f0077e5aebb5cf42d9b6adf858fcb4dfd47ce2ecd5ae56708582389d449d600060405161319291815260200190565b60405180910390a25b5050505050565b600d548015806131b0575081155b156131b9575050565b600060646131c8846019613a3f565b6131d29190613a56565b905060006131e08285613a78565b90506000821180156131fc5750600b546001600160a01b031615155b156132cd57600b546040516000916001600160a01b03169084908381818185875af1925050503d806000811461324e576040519150601f19603f3d011682016040523d82523d6000602084013e613253565b606091505b50509050806132c7577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b116146040516132bb906020808252601c908201527f547265617375727920455448207472616e73666572206661696c656400000000604082015260600190565b60405180910390a18491505b506132d0565b50825b6000831180156132e05750600081115b156134395760006132f18483613a56565b905080156134375760005b84811015613435576000600d828154811061331957613319613c4b565b6000918252602090912001546001600160a01b03169050801580159061334857506001600160a01b0381163014155b80156133625750600a546001600160a01b03828116911614155b15613422576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146133b4576040519150601f19603f3d011682016040523d82523d6000602084013e6133b9565b606091505b5050905080613420577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161341790602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b508061342d81613ce2565b9150506132fc565b505b505b60408051858152602081018590527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c2179101611edf565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316158015906134e157506001600160a01b03821615155b6135125760405162461bcd60e51b8152602060048201526002602482015261453160f01b604482015260640161085a565b6001600160a01b038316600090815260208190526040902054818110156135605760405162461bcd60e51b8152602060048201526002602482015261229960f11b604482015260640161085a565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119aa565b600a546001600160a01b038381169116148015906135ed57506001600160a01b0382163014155b156137d55780801561361857506001600160a01b0382166000908152600c602052604090205460ff16155b1561368457506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b801580156136aa57506001600160a01b0382166000908152600c602052604090205460ff165b156137d5576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d548110156109e557826001600160a01b0316600d82815481106136f7576136f7613c4b565b6000918252602090912001546001600160a01b0316036137c357600d805461372190600190613a78565b8154811061373157613731613c4b565b600091825260209091200154600d80546001600160a01b03909216918390811061375d5761375d613c4b565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d80548061379c5761379c613cfb565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806137cd81613ce2565b9150506136d0565b5050565b60005b838110156137f45781810151838201526020016137dc565b50506000910152565b602081526000825180602084015261381c8160408501602087016137d9565b601f01601f19169190910160400192915050565b6001600160a01b038116811461125b57600080fd5b6000806040838503121561385857600080fd5b823561386381613830565b946020939093013593505050565b60008060006060848603121561388657600080fd5b833561389181613830565b925060208401356138a181613830565b929592945050506040919091013590565b6000602082840312156138c457600080fd5b5035919050565b600081518084526020808501945080840160005b838110156139045781516001600160a01b0316875295820195908201906001016138df565b509495945050505050565b60208152600061392260208301846138cb565b9392505050565b60006020828403121561393b57600080fd5b813561392281613830565b6000806040838503121561395957600080fd5b50508035926020909101359150565b6000806040838503121561397b57600080fd5b823561398681613830565b9150602083013561399681613830565b809150509250929050565b600181811c908216806139b557607f821691505b6020821081036139d557634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215613a0657600080fd5b8151801515811461392257600080fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156107be576107be613a16565b80820281158282048414176107be576107be613a16565b600082613a7357634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156107be576107be613a16565b600060208284031215613a9d57600080fd5b815161392281613830565b602080825260029082015261139560f21b604082015260600190565b600060208284031215613ad657600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600080600060608486031215613b1657600080fd5b8351925060208401519150604084015190509250925092565b600060033d1115613b485760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715613b7f57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015613b945790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715613bc457505050505090565b8285019150815181811115613bdc5750505050505090565b843d8701016020828501011115613bf65750505050505090565b613c0560208286010187613b4b565b509095945050505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a060408201526000613c8060a08301866138cb565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a200000000000815260008251613cd581601b8501602087016137d9565b91909101601b0192915050565b600060018201613cf457613cf4613a16565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec07236f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cda2646970667358221220f1f36df5a300608644ea07302dc5c2a7009c44af75293c7c3bb498cd9e426b0964736f6c63430008110033

Deployed Bytecode

0x60806040526004361061021e5760003560e01c8063808a545711610123578063c0d78655116100ab578063e3a8fa551161006f578063e3a8fa5514610684578063e8955f571461068c578063ed9cacfe146106c3578063f2fde38b146106d8578063fd7c9fab146106f857600080fd5b8063c0d78655146105ae578063c84a705c146105ce578063d4d7b19a146105ee578063d720a2a81461061e578063dd62ed3e1461063e57600080fd5b8063975b87e8116100f2578063975b87e81461050d578063a8602fea1461052d578063a9059cbb1461054d578063b70143c91461056d578063b9276e4b1461058d57600080fd5b8063808a5457146104a55780638129fc1c146104c55780638da5cb5b146104da57806395d89b41146104f857600080fd5b80634626402b116101a657806362b6327a1161017557806362b6327a146104155780636ec4be901461043557806370a082311461045b5780637136982b1461047b5780637ac84fc11461049057600080fd5b80634626402b1461039e57806357376198146103be5780635d76b04c146103de5780635fe8e7cc146103f357600080fd5b806323b872dd116101ed57806323b872dd146102f55780632a11ced014610315578063313ce5671461034d578063397883d214610369578063461a3a951461037e57600080fd5b806306fdde031461026657806308dee2b414610291578063095ea7b3146102b057806318160ddd146102e057600080fd5b3661026157341561025f5760405134815233907fbfe611b001dfcd411432f7bf0d79b82b4b2ee81511edac123a3403c357fb972a9060200160405180910390a25b005b600080fd5b34801561027257600080fd5b5061027b610718565b60405161028891906137fd565b60405180910390f35b34801561029d57600080fd5b50600e545b604051908152602001610288565b3480156102bc57600080fd5b506102d06102cb366004613845565b6107aa565b6040519015158152602001610288565b3480156102ec57600080fd5b506002546102a2565b34801561030157600080fd5b506102d0610310366004613871565b6107c4565b34801561032157600080fd5b506103356103303660046138b2565b6107e8565b6040516001600160a01b039091168152602001610288565b34801561035957600080fd5b5060405160128152602001610288565b34801561037557600080fd5b5061025f610812565b34801561038a57600080fd5b50600954610335906001600160a01b031681565b3480156103aa57600080fd5b50600b54610335906001600160a01b031681565b3480156103ca57600080fd5b5061025f6103d9366004613845565b61091e565b3480156103ea57600080fd5b50600f546102a2565b3480156103ff57600080fd5b506104086109ea565b604051610288919061390f565b34801561042157600080fd5b50600754610335906001600160a01b031681565b34801561044157600080fd5b50601054610335906201000090046001600160a01b031681565b34801561046757600080fd5b506102a2610476366004613929565b610a4b565b34801561048757600080fd5b50600d546102a2565b34801561049c57600080fd5b5061025f610a66565b3480156104b157600080fd5b50600a54610335906001600160a01b031681565b3480156104d157600080fd5b5061025f610ee8565b3480156104e657600080fd5b506006546001600160a01b0316610335565b34801561050457600080fd5b5061027b61125e565b34801561051957600080fd5b5061025f610528366004613946565b61126d565b34801561053957600080fd5b5061025f610548366004613929565b6119b0565b34801561055957600080fd5b506102d0610568366004613845565b611a54565b34801561057957600080fd5b5061025f6105883660046138b2565b611a62565b34801561059957600080fd5b506010546102d090600160b01b900460ff1681565b3480156105ba57600080fd5b5061025f6105c9366004613929565b611c2f565b3480156105da57600080fd5b5061025f6105e9366004613929565b611c94565b3480156105fa57600080fd5b506102d0610609366004613929565b600c6020526000908152604090205460ff1681565b34801561062a57600080fd5b5061025f6106393660046138b2565b611d9d565b34801561064a57600080fd5b506102a2610659366004613968565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61025f611f6f565b34801561069857600080fd5b506106a16121bd565b6040805194151585526020850193909352918301526060820152608001610288565b3480156106cf57600080fd5b5061025f612257565b3480156106e457600080fd5b5061025f6106f3366004613929565b6124d0565b34801561070457600080fd5b50600854610335906001600160a01b031681565b606060038054610727906139a1565b80601f0160208091040260200160405190810160405280929190818152602001828054610753906139a1565b80156107a05780601f10610775576101008083540402835291602001916107a0565b820191906000526020600020905b81548152906001019060200180831161078357829003601f168201915b5050505050905090565b6000336107b881858561251c565b60019150505b92915050565b6000336107d28582856125ce565b6107dd858585612636565b506001949350505050565b600d81815481106107f857600080fd5b6000918252602090912001546001600160a01b0316905081565b61081a6129f4565b6000600e54118061082d57506000600f54115b6108635760405162461bcd60e51b815260206004820152600260248201526104e560f41b60448201526064015b60405180910390fd5b600d546108975760405162461bcd60e51b815260206004820152600260248201526109c960f31b604482015260640161085a565b306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156108d257600080fd5b505af19250505080156108e3575060015b61091c57600080516020613d32833981519152600e54600f54604051610913929190918252602082015260400190565b60405180910390a15b565b6109266129f4565b306001600160a01b038316036109635760405162461bcd60e51b815260206004820152600260248201526121a360f11b604482015260640161085a565b816001600160a01b031663a9059cbb6109846006546001600160a01b031690565b836040518363ffffffff1660e01b81526004016109a29291906139db565b6020604051808303816000875af11580156109c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e591906139f4565b505050565b6060600d8054806020026020016040519081016040528092919081815260200182805480156107a057602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610a24575050505050905090565b6001600160a01b031660009081526020819052604090205490565b600260055403610a9d5760405162461bcd60e51b8152602060048201526002602482015261523160f01b604482015260640161085a565b6002600555601054610100900460ff1615610adf5760405162461bcd60e51b8152602060048201526002602482015261041560f41b604482015260640161085a565b6010805461ff001916610100179055600e54600f5481158015610b00575080155b15610b175750506010805461ff0019169055610ee1565b6000610b2230610a4b565b90506000610b308385613a2c565b905080821015610ba457600080516020613d12833981519152604051610b87906020808252601a908201527f496e73756666696369656e7420746f6b656e2062616c616e6365000000000000604082015260600190565b60405180910390a150506010805461ff001916905550610ee19050565b3368056bc75e2d631000006000610bbb8688613a2c565b905081811115610c6757600081610bda84670de0b6b3a7640000613a3f565b610be49190613a56565b9050670de0b6b3a7640000610bf9828a613a3f565b610c039190613a56565b9750670de0b6b3a7640000610c188289613a3f565b610c229190613a56565b9650610c2e8789613a2c565b915087600e6000828254610c429190613a78565b9250508190555086600f6000828254610c5b9190613a78565b90915550610c72915050565b6000600e819055600f555b426011556040805188815260208101889052600080516020613d32833981519152910160405180910390a1600754610cb79030906001600160a01b031660001961251c565b476000610cc383612a42565b905080600003610ce75750506010805461ff001916905550610ee195505050505050565b47828111610d5b57600080516020613d12833981519152604051610d389060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150506010805461ff001916905550610ee19650505050505050565b6000610d678483613a78565b90506000610d7d6006546001600160a01b031690565b6001600160a01b0316886001600160a01b031614158015610da757506001600160a01b0388163014155b15610e75576064610db9836005613a3f565b610dc39190613a56565b90508015610e75576000886001600160a01b03168260405160006040518083038185875af1925050503d8060008114610e18576040519150601f19603f3d011682016040523d82523d6000602084013e610e1d565b606091505b5050905080610e2f5760009150610e73565b886001600160a01b03167f9771326b75b19abc364419d27c012617e9fc89f850583037b570e4b74906e30183604051610e6a91815260200190565b60405180910390a25b505b610e7f8183613a78565b9150600086610e8e8e85613a3f565b610e989190613a56565b90506000610ea68285613a78565b90508115610eb857610eb8828f612eb6565b8015610ec757610ec7816131a2565b50506010805461ff00191690555050505050505050505050505b6001600555565b610ef06129f4565b60105460ff1615610f285760405162461bcd60e51b8152602060048201526002602482015261231960f11b604482015260640161085a565b6010805460ff1916600117905560085460095460405163e6a4390560e01b81523060048201526001600160a01b03918216602482015291169063e6a4390590604401602060405180830381865afa158015610f87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fab9190613a8b565b600a80546001600160a01b0319166001600160a01b03929092169182179055611067576008546009546040516364e329cb60e11b81523060048201526001600160a01b03918216602482015291169063c9c65396906044016020604051808303816000875af1158015611022573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110469190613a8b565b600a80546001600160a01b0319166001600160a01b03929092169190911790555b600a546001600160a01b03166110a45760405162461bcd60e51b8152602060048201526002602482015261463360f01b604482015260640161085a565b6007546110be9030906001600160a01b031660001961251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926110f692911690600019906004016139db565b6020604051808303816000875af1158015611115573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061113991906139f4565b61116a5760405162461bcd60e51b8152602060048201526002602482015261118d60f21b604482015260640161085a565b600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926111a292911690600019906004016139db565b6020604051808303816000875af11580156111c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111e591906139f4565b50600a5460405163095ea7b360e01b8152309163095ea7b391611218916001600160a01b031690600019906004016139db565b6020604051808303816000875af1158015611237573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125b91906139f4565b50565b606060048054610727906139a1565b6112756129f4565b600082116112955760405162461bcd60e51b815260040161085a90613aa8565b600081116112ca5760405162461bcd60e51b81526020600482015260026024820152614e5360f01b604482015260640161085a565b6040516370a0823160e01b8152306004820181905283916370a0823190602401602060405180830381865afa158015611307573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061132b9190613ac4565b101561135e5760405162461bcd60e51b815260206004820152600260248201526124a160f11b604482015260640161085a565b6009546040516370a0823160e01b815233600482015282916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113a6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ca9190613ac4565b10156113fd5760405162461bcd60e51b8152602060048201526002602482015261495360f01b604482015260640161085a565b6009546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061143190339030908690600401613add565b6020604051808303816000875af1158015611450573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061147491906139f4565b6114a55760405162461bcd60e51b81526020600482015260026024820152612a2360f11b604482015260640161085a565b6007546114bd9030906001600160a01b03168461251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926114f39291169085906004016139db565b6020604051808303816000875af1158015611512573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153691906139f4565b506007546009546001600160a01b039182169163e8e337009130911685856000803361156442610258613a2c565b60405160e08a901b6001600160e01b03191681526001600160a01b039889166004820152968816602488015260448701959095526064860193909352608485019190915260a484015290921660c482015260e4810191909152610104016060604051808303816000875af19250505080156115fc575060408051601f3d908101601f191682019092526115f991810190613b01565b60015b61188457611608613b2f565b806308c379a00361174b575061161c613b86565b80611627575061174d565b6007546116409030906001600160a01b0316600061251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392611677929116906000906004016139db565b6020604051808303816000875af1158015611696573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116ba91906139f4565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906116ed90339086906004016139db565b6020604051808303816000875af115801561170c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061173091906139f4565b508060405162461bcd60e51b815260040161085a91906137fd565b505b6007546117669030906001600160a01b0316600061251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261179d929116906000906004016139db565b6020604051808303816000875af11580156117bc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e091906139f4565b5060095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061181390339085906004016139db565b6020604051808303816000875af1158015611832573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061185691906139f4565b5060405162461bcd60e51b8152602060048201526002602482015261119360f21b604482015260640161085a565b505060408051848152602081018490527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16009546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015611909573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061192d9190613ac4565b905080156109e55760095460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061196790339085906004016139db565b6020604051808303816000875af1158015611986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119aa91906139f4565b50505050565b6119b86129f4565b6001600160a01b0381166119f35760405162461bcd60e51b81526020600482015260026024820152615a4160f01b604482015260640161085a565b600b80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb4910160405180910390a15050565b6000336107b8818585612636565b611a6a6129f4565b600260055403611aa15760405162461bcd60e51b8152602060048201526002602482015261523160f01b604482015260640161085a565b600260055580611af35760405162461bcd60e51b815260206004820152601d60248201527f416d6f756e74206d7573742062652067726561746572207468616e2030000000604482015260640161085a565b611afc30610a4b565b811115611b425760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b604482015260640161085a565b601054600160b01b900460ff16611b905760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604482015260640161085a565b6000611b9b82612a42565b905060008111611bed5760405162461bcd60e51b815260206004820152601c60248201527f53776170206661696c65642c206e6f2045544820726563656976656400000000604482015260640161085a565b60408051838152602081018390527f83dcf65fd6004d3203d0b493e4d86ef58c3565fa57812dbd28c5a903e247c44f910160405180910390a150506001600555565b611c376129f4565b6001600160a01b038116611c725760405162461bcd60e51b815260206004820152600260248201526124a960f11b604482015260640161085a565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b611c9c6129f4565b601054600160b01b900460ff1615611cea5760405162461bcd60e51b8152602060048201526011602482015270141c9bde1e48185b1c9958591e481cd95d607a1b604482015260640161085a565b6001600160a01b038116611d385760405162461bcd60e51b8152602060048201526015602482015274496e76616c69642070726f7879206164647265737360581b604482015260640161085a565b6010805460ff60b01b196001600160a01b0384166201000081029190911662010000600160b81b031990921691909117600160b01b179091556040517f65c4b302ff508168aab64a17ebe745806b65caba61b745d8aff18fb69cb0937290600090a250565b611da56129f4565b60008111611dc55760405162461bcd60e51b815260040161085a90613aa8565b6040516370a0823160e01b8152306004820181905282916370a0823190602401602060405180830381865afa158015611e02573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e269190613ac4565b1015611e595760405162461bcd60e51b815260206004820152600260248201526124a160f11b604482015260640161085a565b600754611e739030906001600160a01b031660001961251c565b476000611e7f83612a42565b905080600003611e8e57505050565b47828111611eed57600080516020613d12833981519152604051611edf9060208082526019908201527804e6f204554482072656365697665642066726f6d207377617603c1b604082015260600190565b60405180910390a150505050565b6000611ef98483613a78565b905060006064611f0a601984613a3f565b611f149190613a56565b905060006064611f25601985613a3f565b611f2f9190613a56565b90508115611f5757611f57826064611f4860198b613a3f565b611f529190613a56565b612eb6565b8015611f6657611f66816131a2565b50505050505050565b611f776129f4565b6040516370a0823160e01b815230600482018190526000916370a0823190602401602060405180830381865afa158015611fb5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fd99190613ac4565b905060008111611ffb5760405162461bcd60e51b815260040161085a90613aa8565b600034116120305760405162461bcd60e51b81526020600482015260026024820152614e4560f01b604482015260640161085a565b6007546120489030906001600160a01b03168361251c565b6007546001600160a01b031663f305d7193430846000803361206c42610258613a2c565b6040518863ffffffff1660e01b815260040161208d96959493929190613c10565b60606040518083038185885af1935050505080156120c8575060408051601f3d908101601f191682019092526120c591810190613b01565b60015b61217f576120d4613b2f565b806308c379a00361213857506120e8613b86565b806120f3575061213a565b60075461210c9030906001600160a01b0316600061251c565b60405133904780156108fc02916000818181858888f19350505050158015611730573d6000803e3d6000fd5b505b6007546121539030906001600160a01b0316600061251c565b60405133904780156108fc02916000818181858888f19350505050158015611856573d6000803e3d6000fd5b5050604080518381523460208201527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a150565b600080600080600f54600e546121d39190613a2c565b925060006802b5e3af16b1880000841015905060006107086011546121f89190613a2c565b42101590508180156122075750805b95508015801561221957506000601154115b156122495760006107086011546122309190613a2c565b905042811115612247576122444282613a78565b94505b505b62061a809250505090919293565b61225f6129f4565b6007546122799030906001600160a01b031660001961251c565b60095460075460405163095ea7b360e01b81526001600160a01b039283169263095ea7b3926122b192911690600019906004016139db565b6020604051808303816000875af19250505080156122ec575060408051601f3d908101601f191682019092526122e9918101906139f4565b60015b1561234257506009546007546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612339926001600160a01b039182169291169060001990613add565b60405180910390a15b600a546001600160a01b03161561091c57600954600a5460405163095ea7b360e01b81526001600160a01b039283169263095ea7b39261238b92911690600019906004016139db565b6020604051808303816000875af19250505080156123c6575060408051601f3d908101601f191682019092526123c3918101906139f4565b60015b1561241c5750600954600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca92612413926001600160a01b039182169291169060001990613add565b60405180910390a15b600a5460405163095ea7b360e01b8152309163095ea7b39161244e916001600160a01b031690600019906004016139db565b6020604051808303816000875af1925050508015612489575060408051601f3d908101601f19168201909252612486918101906139f4565b60015b1561091c5750600a546040517fa0987595c5ce4728f286a8db17fbc0811d0c09919776fbd0bb191a97660d2cca916109139130916001600160a01b03169060001990613add565b6124d86129f4565b6001600160a01b0381166125135760405162461bcd60e51b81526020600482015260026024820152614f3160f01b604482015260640161085a565b61125b8161346f565b6001600160a01b0383161580159061253c57506001600160a01b03821615155b61256d5760405162461bcd60e51b8152602060048201526002602482015261114d60f21b604482015260640161085a565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054818110156126295760405162461bcd60e51b8152602060048201526002602482015261453560f01b604482015260640161085a565b6119aa848484840361251c565b601054610100900460ff1615801561265c57506006546001600160a01b03848116911614155b801561267657506006546001600160a01b03838116911614155b801561268b57506001600160a01b0383163014155b80156126a45750600a546001600160a01b038381169116145b156129bd57600060646126b8600584613a3f565b6126c29190613a56565b905080156129bb57600060646126d9601984613a3f565b6126e39190613a56565b9050600060646126f4601985613a3f565b6126fe9190613a56565b9050600061270c8486613a78565b90506127198730866134c1565b6127248787836134c1565b82600e60008282546127369190613a2c565b9250508190555081600f600082825461274f9190613a2c565b9091555050600f54600e5468056bc75e2d63100000916802b5e3af16b18800009161277a9190613a2c565b1061297e5760006107086011546127919190613a2c565b421015905081600f54600e546127a79190613a2c565b11156127e657600080516020613d32833981519152600e54600f546040516127d9929190918252602082015260400190565b60405180910390a161297c565b80156128fd5742601181905550306001600160a01b0316637ac84fc16040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561282e57600080fd5b505af192505050801561283f575060015b6128f85761284b613b2f565b806308c379a003612895575061285f613b86565b8061286a5750612897565b600080516020613d128339815191528160405161288791906137fd565b60405180910390a15061297c565b505b600080516020613d128339815191526040516127d9906020808252602b908201527f556e6b6e6f776e206572726f7220696e2070726f636573734c6971756964697460408201526a079416e6441697264726f760ac1b606082015260800190565b61297c565b600080516020613d32833981519152600e54600f54604051612929929190918252602082015260400190565b60405180910390a17f166cfdb014c67ae8b32e0df45eca1171fe28cc0198094c266ca20c641e8c82d0600f54600e546129629190613a2c565b6040805191825262061a8060208301520160405180910390a15b505b61299b88678ac7230489e800006129948b610a4b565b10156135c6565b6129b187678ac7230489e800006129948a610a4b565b5050505050505050565b505b6129c88383836134c1565b6129de83678ac7230489e8000061299486610a4b565b6109e582678ac7230489e8000061299485610a4b565b33612a076006546001600160a01b031690565b6001600160a01b03161461091c5760405162461bcd60e51b8152602060048201526002602482015261279960f11b604482015260640161085a565b600081600003612a5457506000919050565b601054600160b01b900460ff16612aa25760405162461bcd60e51b815260206004820152601260248201527114ddd85c081c1c9bde1e481b9bdd081cd95d60721b604482015260640161085a565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110612ad757612ad7613c4b565b6001600160a01b03928316602091820292909201810191909152600754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612b30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b549190613a8b565b81600181518110612b6757612b67613c4b565b6001600160a01b039283166020918202929092010152600754600091612b90913091168661251c565b6000612b9e42610e10613a2c565b60075460105460405163791ac94760e01b815292935047926001600160a01b039283169263791ac94792612be7928b9289928b9262010000909104909116908990600401613c61565b600060405180830381600087803b158015612c0157600080fd5b505af1925050508015612c12575060015b612cc757612c1e613b2f565b806308c379a003612c6f5750612c32613b86565b80612c3d5750612c71565b600080516020613d1283398151915281604051612c5a91906137fd565b60405180910390a15060009695505050505050565b505b600080516020613d12833981519152604051612cb3906020808252601290820152712ab735b737bbb71039bbb0b81032b93937b960711b604082015260600190565b60405180910390a150600095945050505050565b601060029054906101000a90046001600160a01b03166001600160a01b0316636ab2fe586040518163ffffffff1660e01b8152600401600060405180830381600087803b158015612d1757600080fd5b505af1925050508015612d28575060015b612ded57612d34613b2f565b806308c379a003612d8d5750612d48613b86565b80612d535750612d8f565b600080516020613d1283398151915281604051602001612d739190613c9d565b60408051601f1981840301815290829052612c5a916137fd565b505b600080516020613d12833981519152604051612cb39060208082526028908201527f50726f787920455448207472616e73666572206661696c65643a20756e6b6e6f6040820152673bb71032b93937b960c11b606082015260800190565b476000612dfa8383613a78565b90508015612e465760408051898152602081018390527fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc01910160405180910390a1979650505050505050565b600080516020613d12833981519152604051612ea09060208082526024908201527f4e6f204554482072656365697665642061667465722070726f7879207472616e60408201526339b332b960e11b606082015260800190565b60405180910390a1506000979650505050505050565b6000612ec130610a4b565b905081811015612f48577fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051612f3b9060208082526028908201527f496e73756666696369656e7420746f6b656e2062616c616e636520666f72206c604082015267697175696469747960c01b606082015260800190565b60405180910390a1505050565b60006064612f568180613a78565b612f609085613a3f565b612f6a9190613a56565b905060006064612f7a8180613a78565b612f849087613a3f565b612f8e9190613a56565b600754909150612fa99030906001600160a01b03168661251c565b6007546001600160a01b031663f305d7198630878686612fd16006546001600160a01b031690565b612fdd42610e10613a2c565b6040518863ffffffff1660e01b8152600401612ffe96959493929190613c10565b60606040518083038185885af193505050508015613039575060408051601f3d908101601f1916820190925261303691810190613b01565b60015b61310f57613045613b2f565b806308c379a0036130a15750613059613b86565b8061306457506130a3565b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad8160405161309391906137fd565b60405180910390a15061319b565b505b7fa31e27a09b547b7d81f05436d3ed82a86121c091c82f730e0ab84b988ae730ad604051613102906020808252601b908201527f556e6b6e6f776e206c697175696469747920616464206572726f720000000000604082015260600190565b60405180910390a161319b565b505060408051868152602081018890527f38f8a0c92f4c5b0b6877f878cb4c0c8d348a47b76d716c8e78f425043df9515b92500160405180910390a16006546001600160a01b03166001600160a01b03167fb4a8f0077e5aebb5cf42d9b6adf858fcb4dfd47ce2ecd5ae56708582389d449d600060405161319291815260200190565b60405180910390a25b5050505050565b600d548015806131b0575081155b156131b9575050565b600060646131c8846019613a3f565b6131d29190613a56565b905060006131e08285613a78565b90506000821180156131fc5750600b546001600160a01b031615155b156132cd57600b546040516000916001600160a01b03169084908381818185875af1925050503d806000811461324e576040519150601f19603f3d011682016040523d82523d6000602084013e613253565b606091505b50509050806132c7577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b116146040516132bb906020808252601c908201527f547265617375727920455448207472616e73666572206661696c656400000000604082015260600190565b60405180910390a18491505b506132d0565b50825b6000831180156132e05750600081115b156134395760006132f18483613a56565b905080156134375760005b84811015613435576000600d828154811061331957613319613c4b565b6000918252602090912001546001600160a01b03169050801580159061334857506001600160a01b0381163014155b80156133625750600a546001600160a01b03828116911614155b15613422576000816001600160a01b03168460405160006040518083038185875af1925050503d80600081146133b4576040519150601f19603f3d011682016040523d82523d6000602084013e6133b9565b606091505b5050905080613420577fa38bdb001325b55fb77601b29dc4c8f483a0d03519ba5bea9ca2ee06e8b1161460405161341790602080825260139082015272115512081d1c985b9cd9995c8819985a5b1959606a1b604082015260600190565b60405180910390a15b505b508061342d81613ce2565b9150506132fc565b505b505b60408051858152602081018590527f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c2179101611edf565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038316158015906134e157506001600160a01b03821615155b6135125760405162461bcd60e51b8152602060048201526002602482015261453160f01b604482015260640161085a565b6001600160a01b038316600090815260208190526040902054818110156135605760405162461bcd60e51b8152602060048201526002602482015261229960f11b604482015260640161085a565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36119aa565b600a546001600160a01b038381169116148015906135ed57506001600160a01b0382163014155b156137d55780801561361857506001600160a01b0382166000908152600c602052604090205460ff16155b1561368457506001600160a01b03166000818152600c60205260408120805460ff19166001908117909155600d805491820181559091527fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50180546001600160a01b0319169091179055565b801580156136aa57506001600160a01b0382166000908152600c602052604090205460ff165b156137d5576001600160a01b0382166000908152600c60205260408120805460ff191690555b600d548110156109e557826001600160a01b0316600d82815481106136f7576136f7613c4b565b6000918252602090912001546001600160a01b0316036137c357600d805461372190600190613a78565b8154811061373157613731613c4b565b600091825260209091200154600d80546001600160a01b03909216918390811061375d5761375d613c4b565b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550600d80548061379c5761379c613cfb565b600082815260209020810160001990810180546001600160a01b0319169055019055505050565b806137cd81613ce2565b9150506136d0565b5050565b60005b838110156137f45781810151838201526020016137dc565b50506000910152565b602081526000825180602084015261381c8160408501602087016137d9565b601f01601f19169190910160400192915050565b6001600160a01b038116811461125b57600080fd5b6000806040838503121561385857600080fd5b823561386381613830565b946020939093013593505050565b60008060006060848603121561388657600080fd5b833561389181613830565b925060208401356138a181613830565b929592945050506040919091013590565b6000602082840312156138c457600080fd5b5035919050565b600081518084526020808501945080840160005b838110156139045781516001600160a01b0316875295820195908201906001016138df565b509495945050505050565b60208152600061392260208301846138cb565b9392505050565b60006020828403121561393b57600080fd5b813561392281613830565b6000806040838503121561395957600080fd5b50508035926020909101359150565b6000806040838503121561397b57600080fd5b823561398681613830565b9150602083013561399681613830565b809150509250929050565b600181811c908216806139b557607f821691505b6020821081036139d557634e487b7160e01b600052602260045260246000fd5b50919050565b6001600160a01b03929092168252602082015260400190565b600060208284031215613a0657600080fd5b8151801515811461392257600080fd5b634e487b7160e01b600052601160045260246000fd5b808201808211156107be576107be613a16565b80820281158282048414176107be576107be613a16565b600082613a7357634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156107be576107be613a16565b600060208284031215613a9d57600080fd5b815161392281613830565b602080825260029082015261139560f21b604082015260600190565b600060208284031215613ad657600080fd5b5051919050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b600080600060608486031215613b1657600080fd5b8351925060208401519150604084015190509250925092565b600060033d1115613b485760046000803e5060005160e01c5b90565b601f8201601f1916810167ffffffffffffffff81118282101715613b7f57634e487b7160e01b600052604160045260246000fd5b6040525050565b600060443d1015613b945790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715613bc457505050505090565b8285019150815181811115613bdc5750505050505090565b843d8701016020828501011115613bf65750505050505090565b613c0560208286010187613b4b565b509095945050505050565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b634e487b7160e01b600052603260045260246000fd5b85815284602082015260a060408201526000613c8060a08301866138cb565b6001600160a01b0394909416606083015250608001529392505050565b7f50726f787920455448207472616e73666572206661696c65643a200000000000815260008251613cd581601b8501602087016137d9565b91909101601b0192915050565b600060018201613cf457613cf4613a16565b5060010190565b634e487b7160e01b600052603160045260246000fdfe4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec07236f85944d879d05feade37c54fd09ce05482d063b08c263185a9400ecb991e5cda2646970667358221220f1f36df5a300608644ea07302dc5c2a7009c44af75293c7c3bb498cd9e426b0964736f6c63430008110033

Deployed Bytecode Sourcemap

9170:30184:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38925:9;:13;38921:85;;38960:34;;38984:9;160:25:1;;38972:10:0;;38960:34;;148:2:1;133:18;38960:34:0;;;;;;;38921:85;9170:30184;;;;;2801:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34526:118;;;;;;;;;;-1:-1:-1;34613:23:0;;34526:118;;;160:25:1;;;148:2;133:18;34526:118:0;14:177:1;3668:190:0;;;;;;;;;;-1:-1:-1;3668:190:0;;;;;:::i;:::-;;:::i;:::-;;;1473:14:1;;1466:22;1448:41;;1436:2;1421:18;3668:190:0;1308:187:1;3095:99:0;;;;;;;;;;-1:-1:-1;3174:12:0;;3095:99;;3866:250;;;;;;;;;;-1:-1:-1;3866:250:0;;;;;:::i;:::-;;:::i;10385:24::-;;;;;;;;;;-1:-1:-1;10385:24:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2310:32:1;;;2292:51;;2280:2;2265:18;10385:24:0;2146:203:1;3003:84:0;;;;;;;;;;-1:-1:-1;3003:84:0;;3077:2;2496:36:1;;2484:2;2469:18;3003:84:0;2354:184:1;34825:378:0;;;;;;;;;;;;;:::i;10209:25::-;;;;;;;;;;-1:-1:-1;10209:25:0;;;;-1:-1:-1;;;;;10209:25:0;;;10276:29;;;;;;;;;;-1:-1:-1;10276:29:0;;;;-1:-1:-1;;;;;10276:29:0;;;34292:183;;;;;;;;;;-1:-1:-1;34292:183:0;;;;;:::i;:::-;;:::i;34652:114::-;;;;;;;;;;-1:-1:-1;34737:21:0;;34652:114;;29069:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;10111:41::-;;;;;;;;;;-1:-1:-1;10111:41:0;;;;-1:-1:-1;;;;;10111:41:0;;;11651:24;;;;;;;;;;-1:-1:-1;11651:24:0;;;;;;;-1:-1:-1;;;;;11651:24:0;;;3202:118;;;;;;;;;;-1:-1:-1;3202:118:0;;;;;:::i;:::-;;:::i;28959:98::-;;;;;;;;;;-1:-1:-1;29035:7:0;:14;28959:98;;18483:4301;;;;;;;;;;;;;:::i;10241:28::-;;;;;;;;;;-1:-1:-1;10241:28:0;;;;-1:-1:-1;;;;;10241:28:0;;;12600:836;;;;;;;;;;;;;:::i;1789:87::-;;;;;;;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;1862:6:0;1789:87;;2900:95;;;;;;;;;;;;;:::i;30446:2260::-;;;;;;;;;;-1:-1:-1;30446:2260:0;;;;;:::i;:::-;;:::i;36865:319::-;;;;;;;;;;-1:-1:-1;36865:319:0;;;;;:::i;:::-;;:::i;3328:182::-;;;;;;;;;;-1:-1:-1;3328:182:0;;;;;:::i;:::-;;:::i;36243:564::-;;;;;;;;;;-1:-1:-1;36243:564:0;;;;;:::i;:::-;;:::i;11682:24::-;;;;;;;;;;-1:-1:-1;11682:24:0;;;;-1:-1:-1;;;11682:24:0;;;;;;34118:166;;;;;;;;;;-1:-1:-1;34118:166:0;;;;;:::i;:::-;;:::i;39056:295::-;;;;;;;;;;-1:-1:-1;39056:295:0;;;;;:::i;:::-;;:::i;10338:40::-;;;;;;;;;;-1:-1:-1;10338:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;37235:1534;;;;;;;;;;-1:-1:-1;37235:1534:0;;;;;:::i;:::-;;:::i;3518:142::-;;;;;;;;;;-1:-1:-1;3518:142:0;;;;;:::i;:::-;-1:-1:-1;;;;;3625:18:0;;;3598:7;3625:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;3518:142;32791:1319;;;:::i;29244:1147::-;;;;;;;;;;;;;:::i;:::-;;;;4656:14:1;;4649:22;4631:41;;4703:2;4688:18;;4681:34;;;;4731:18;;;4724:34;4789:2;4774:18;;4767:34;4618:3;4603:19;29244:1147:0;4406:401:1;35249:958:0;;;;;;;;;;;;;:::i;1992:165::-;;;;;;;;;;-1:-1:-1;1992:165:0;;;;;:::i;:::-;;:::i;10159:43::-;;;;;;;;;;-1:-1:-1;10159:43:0;;;;-1:-1:-1;;;;;10159:43:0;;;2801:91;2846:13;2879:5;2872:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2801:91;:::o;3668:190::-;3742:4;3775:10;3796:32;3775:10;3812:7;3821:6;3796:8;:32::i;:::-;3846:4;3839:11;;;3668:190;;;;;:::o;3866:250::-;3954:4;3989:10;4010:38;4026:4;3989:10;4041:6;4010:15;:38::i;:::-;4059:27;4069:4;4075:2;4079:6;4059:9;:27::i;:::-;-1:-1:-1;4104:4:0;;3866:250;-1:-1:-1;;;;3866:250:0:o;10385:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10385:24:0;;-1:-1:-1;10385:24:0;:::o;34825:378::-;1748:13;:11;:13::i;:::-;34918:1:::1;34892:23;;:27;:56;;;;34947:1;34923:21;;:25;34892:56;34884:71;;;::::0;-1:-1:-1;;;34884:71:0;;5633:2:1;34884:71:0::1;::::0;::::1;5615:21:1::0;5672:1;5652:18;;;5645:29;-1:-1:-1;;;5690:18:1;;;5683:32;5732:18;;34884:71:0::1;;;;;;;;;34974:7;:14:::0;34966:33:::1;;;::::0;-1:-1:-1;;;34966:33:0;;5963:2:1;34966:33:0::1;::::0;::::1;5945:21:1::0;6002:1;5982:18;;;5975:29;-1:-1:-1;;;6020:18:1;;;6013:32;6062:18;;34966:33:0::1;5761:325:1::0;34966:33:0::1;35014:4;-1:-1:-1::0;;;;;35014:31:0::1;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;35010:186;;-1:-1:-1::0;;;;;;;;;;;35137:23:0::1;;35162:21;;35122:62;;;;;;6265:25:1::0;;;6321:2;6306:18;;6299:34;6253:2;6238:18;;6091:248;35122:62:0::1;;;;;;;;35010:186;34825:378::o:0;34292:183::-;1748:13;:11;:13::i;:::-;34403:4:::1;-1:-1:-1::0;;;;;34385:23:0;::::1;::::0;34377:38:::1;;;::::0;-1:-1:-1;;;34377:38:0;;6546:2:1;34377:38:0::1;::::0;::::1;6528:21:1::0;6585:1;6565:18;;;6558:29;-1:-1:-1;;;6603:18:1;;;6596:32;6645:18;;34377:38:0::1;6344:325:1::0;34377:38:0::1;34433:6;-1:-1:-1::0;;;;;34426:23:0::1;;34450:7;1862:6:::0;;-1:-1:-1;;;;;1862:6:0;;1789:87;34450:7:::1;34459;34426:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34292:183:::0;;:::o;29069:96::-;29114:16;29150:7;29143:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;29143:14:0;;;;;;;;;;;;;;;;;;;;;;29069:96;:::o;3202:118::-;-1:-1:-1;;;;;3294:18:0;3267:7;3294:18;;;;;;;;;;;;3202:118::o;18483:4301::-;1042:1;1188:7;;:19;1180:34;;;;-1:-1:-1;;;1180:34:0;;7437:2:1;1180:34:0;;;7419:21:1;7476:1;7456:18;;;7449:29;-1:-1:-1;;;7494:18:1;;;7487:32;7536:18;;1180:34:0;7235:325:1;1180:34:0;1042:1;1225:7;:18;18563:7:::1;::::0;::::1;::::0;::::1;;;18562:8;18554:23;;;::::0;-1:-1:-1;;;18554:23:0;;7767:2:1;18554:23:0::1;::::0;::::1;7749:21:1::0;7806:1;7786:18;;;7779:29;-1:-1:-1;;;7824:18:1;;;7817:32;7866:18;;18554:23:0::1;7565:325:1::0;18554:23:0::1;18588:7;:14:::0;;-1:-1:-1;;18588:14:0::1;;;::::0;;18652:23:::1;::::0;18713:21:::1;::::0;18759:23;;:48;::::1;;;-1:-1:-1::0;18786:21:0;;18759:48:::1;18755:117;;;-1:-1:-1::0;;18824:7:0::1;:15:::0;;-1:-1:-1;;18824:15:0::1;::::0;;18854:7:::1;;18755:117;18943:28;18974:24;18992:4;18974:9;:24::i;:::-;18943:55:::0;-1:-1:-1;19009:28:0::1;19040:37;19061:16:::0;19040:18;:37:::1;:::i;:::-;19009:68;;19125:20;19102;:43;19098:172;;;-1:-1:-1::0;;;;;;;;;;;19167:40:0::1;;;;8359:2:1::0;8341:21;;;8398:2;8378:18;;;8371:30;8437:28;8432:2;8417:18;;8410:56;8498:2;8483:18;;8157:350;19167:40:0::1;;;;;;;;-1:-1:-1::0;;19222:7:0::1;:15:::0;;-1:-1:-1;;19222:15:0::1;::::0;;-1:-1:-1;19252:7:0::1;::::0;-1:-1:-1;19252:7:0::1;19098:172;19374:10;19482:12;19357:14;19589:37;19610:16:::0;19589:18;:37:::1;:::i;:::-;19561:65;;19760:16;19740:17;:36;19736:694;;;19824:13;19866:17:::0;19840:23:::1;:16:::0;19859:4:::1;19840:23;:::i;:::-;:43;;;;:::i;:::-;19824:59:::0;-1:-1:-1;19948:4:0::1;19919:26;19824:59:::0;19919:18;:26:::1;:::i;:::-;:33;;;;:::i;:::-;19898:54:::0;-1:-1:-1;20013:4:0::1;19986:24;20005:5:::0;19986:16;:24:::1;:::i;:::-;:31;;;;:::i;:::-;19967:50:::0;-1:-1:-1;20052:37:0::1;19967:50:::0;20052:18;:37:::1;:::i;:::-;20032:57;;20192:18;20165:23;;:45;;;;;;;:::i;:::-;;;;;;;;20250:16;20225:21;;:41;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;19736:694:0::1;::::0;-1:-1:-1;;19736:694:0::1;;20377:1;20351:23;:27:::0;;;20393:21:::1;:25:::0;19736:694:::1;20513:15;20491:19;:37:::0;20554:52:::1;::::0;;6265:25:1;;;6321:2;6306:18;;6299:34;;;-1:-1:-1;;;;;;;;;;;20554:52:0;6238:18:1;20554:52:0::1;;;;;;;20689:16;::::0;20657:69:::1;::::0;20674:4:::1;::::0;-1:-1:-1;;;;;20689:16:0::1;-1:-1:-1::0;;20657:8:0::1;:69::i;:::-;20822:21;20794:25;20944:31;20957:17:::0;20944:12:::1;:31::i;:::-;20922:53;;21000:11;21015:1;21000:16:::0;20996:85:::1;;-1:-1:-1::0;;21033:7:0::1;:15:::0;;-1:-1:-1;;21033:15:0::1;::::0;;-1:-1:-1;21063:7:0::1;::::0;-1:-1:-1;;;;;;21063:7:0::1;20996:85;21179:21;21215:39:::0;;::::1;21211:167;;-1:-1:-1::0;;;;;;;;;;;21276:39:0::1;;;;9242:2:1::0;9224:21;;;9281:2;9261:18;;;9254:30;-1:-1:-1;;;9315:2:1;9300:18;;9293:55;9380:2;9365:18;;9040:349;21276:39:0::1;;;;;;;;-1:-1:-1::0;;21330:7:0::1;:15:::0;;-1:-1:-1;;21330:15:0::1;::::0;;-1:-1:-1;21360:7:0::1;::::0;-1:-1:-1;;;;;;;21360:7:0::1;21211:167;21442:25;21470:38;21491:17:::0;21470:18;:38:::1;:::i;:::-;21442:66;;21595:20;21644:7;1862:6:::0;;-1:-1:-1;;;;;1862:6:0;;1789:87;21644:7:::1;-1:-1:-1::0;;;;;21634:17:0::1;:6;-1:-1:-1::0;;;;;21634:17:0::1;;;:44;;;;-1:-1:-1::0;;;;;;21655:23:0;::::1;21673:4;21655:23;;21634:44;21630:491;;;21734:3;21710:21;:17:::0;21730:1:::1;21710:21;:::i;:::-;:27;;;;:::i;:::-;21695:42:::0;-1:-1:-1;21769:16:0;;21765:345:::1;;21807:12;21825:6;-1:-1:-1::0;;;;;21825:11:0::1;21844:12;21825:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21806:55;;;21885:7;21880:215;;21932:1;21917:16;;21880:215;;;22054:6;-1:-1:-1::0;;;;;22036:39:0::1;;22062:12;22036:39;;;;160:25:1::0;;148:2;133:18;;14:177;22036:39:0::1;;;;;;;;21880:215;21787:323;21765:345;22203:32;22223:12:::0;22203:17;:32:::1;:::i;:::-;22183:52:::0;-1:-1:-1;22286:23:0::1;22353:17:::0;22312:38:::1;22332:18:::0;22183:52;22312:38:::1;:::i;:::-;:58;;;;:::i;:::-;22286:84:::0;-1:-1:-1;22381:21:0::1;22405:35;22286:84:::0;22405:17;:35:::1;:::i;:::-;22381:59:::0;-1:-1:-1;22499:19:0;;22495:102:::1;;22535:50;22549:15;22566:18;22535:13;:50::i;:::-;22658:17:::0;;22654:87:::1;;22692:37;22715:13;22692:22;:37::i;:::-;-1:-1:-1::0;;22761:7:0::1;:15:::0;;-1:-1:-1;;22761:15:0::1;::::0;;-1:-1:-1;;;;;;;;;;;;1254:1:0::1;998::::0;1266:7;:22;18483:4301::o;12600:836::-;1748:13;:11;:13::i;:::-;12661:12:::1;::::0;::::1;;12660:13;12652:28;;;::::0;-1:-1:-1;;;12652:28:0;;9806:2:1;12652:28:0::1;::::0;::::1;9788:21:1::0;9845:1;9825:18;;;9818:29;-1:-1:-1;;;9863:18:1;;;9856:32;9905:18;;12652:28:0::1;9604:325:1::0;12652:28:0::1;12691:12;:19:::0;;-1:-1:-1;;12691:19:0::1;12706:4;12691:19;::::0;;12782:17:::1;::::0;12823:10:::1;::::0;12782:52:::1;::::0;-1:-1:-1;;;12782:52:0;;12816:4:::1;12782:52;::::0;::::1;10146:34:1::0;-1:-1:-1;;;;;12823:10:0;;::::1;10196:18:1::0;;;10189:43;12782:17:0;::::1;::::0;:25:::1;::::0;10081:18:1;;12782:52:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12766:13;:68:::0;;-1:-1:-1;;;;;;12766:68:0::1;-1:-1:-1::0;;;;;12766:68:0;;;::::1;::::0;;::::1;::::0;;12900:131:::1;;12964:17;::::0;13008:10:::1;::::0;12964:55:::1;::::0;-1:-1:-1;;;12964:55:0;;13001:4:::1;12964:55;::::0;::::1;10146:34:1::0;-1:-1:-1;;;;;13008:10:0;;::::1;10196:18:1::0;;;10189:43;12964:17:0;::::1;::::0;:28:::1;::::0;10081:18:1;;12964:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12948:13;:71:::0;;-1:-1:-1;;;;;;12948:71:0::1;-1:-1:-1::0;;;;;12948:71:0;;;::::1;::::0;;;::::1;::::0;;12900:131:::1;13059:13;::::0;-1:-1:-1;;;;;13059:13:0::1;13051:42;;;::::0;-1:-1:-1;;;13051:42:0;;10701:2:1;13051:42:0::1;::::0;::::1;10683:21:1::0;10740:1;10720:18;;;10713:29;-1:-1:-1;;;10758:18:1;;;10751:32;10800:18;;13051:42:0::1;10499:325:1::0;13051:42:0::1;13138:16;::::0;13106:69:::1;::::0;13123:4:::1;::::0;-1:-1:-1;;;;;13138:16:0::1;-1:-1:-1::0;;13106:8:0::1;:69::i;:::-;13211:10;::::0;13239:16:::1;::::0;13204:72:::1;::::0;-1:-1:-1;;;13204:72:0;;-1:-1:-1;;;;;13211:10:0;;::::1;::::0;13204:26:::1;::::0;:72:::1;::::0;13239:16;::::1;::::0;-1:-1:-1;;13258:17:0;13204:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13196:87;;;::::0;-1:-1:-1;;;13196:87:0;;11031:2:1;13196:87:0::1;::::0;::::1;11013:21:1::0;11070:1;11050:18;;;11043:29;-1:-1:-1;;;11088:18:1;;;11081:32;11130:18;;13196:87:0::1;10829:325:1::0;13196:87:0::1;13301:10;::::0;13321:13:::1;::::0;13294:60:::1;::::0;-1:-1:-1;;;13294:60:0;;-1:-1:-1;;;;;13301:10:0;;::::1;::::0;13294:26:::1;::::0;:60:::1;::::0;13321:13;::::1;::::0;-1:-1:-1;;13336:17:0;13294:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;13395:13:0::1;::::0;13365:63:::1;::::0;-1:-1:-1;;;13365:63:0;;13380:4:::1;::::0;13365:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;13395:13:0::1;::::0;-1:-1:-1;;13410:17:0;13365:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;12600:836::o:0;2900:95::-;2947:13;2980:7;2973:14;;;;;:::i;30446:2260::-;1748:13;:11;:13::i;:::-;30579:1:::1;30565:11;:15;30557:30;;;;-1:-1:-1::0;;;30557:30:0::1;;;;;;;:::i;:::-;30620:1;30606:11;:15;30598:30;;;::::0;-1:-1:-1;;;30598:30:0;;11691:2:1;30598:30:0::1;::::0;::::1;11673:21:1::0;11730:1;11710:18;;;11703:29;-1:-1:-1;;;11748:18:1;;;11741:32;11790:18;;30598:30:0::1;11489:325:1::0;30598:30:0::1;30671:46;::::0;-1:-1:-1;;;30671:46:0;;30686:4:::1;30671:46;::::0;::::1;2292:51:1::0;;;30721:11:0;;30671:31:::1;::::0;2265:18:1;;30671:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;30649:113;;;::::0;-1:-1:-1;;;30649:113:0;;12210:2:1;30649:113:0::1;::::0;::::1;12192:21:1::0;12249:1;12229:18;;;12222:29;-1:-1:-1;;;12267:18:1;;;12260:32;12309:18;;30649:113:0::1;12008:325:1::0;30649:113:0::1;30812:10;::::0;30805:40:::1;::::0;-1:-1:-1;;;30805:40:0;;30834:10:::1;30805:40;::::0;::::1;2292:51:1::0;30849:11:0;;-1:-1:-1;;;;;30812:10:0::1;::::0;30805:28:::1;::::0;2265:18:1;;30805:40:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;30783:107;;;::::0;-1:-1:-1;;;30783:107:0;;12540:2:1;30783:107:0::1;::::0;::::1;12522:21:1::0;12579:1;12559:18;;;12552:29;-1:-1:-1;;;12597:18:1;;;12590:32;12639:18;;30783:107:0::1;12338:325:1::0;30783:107:0::1;30992:10;::::0;30985:71:::1;::::0;-1:-1:-1;;;30985:71:0;;-1:-1:-1;;;;;30992:10:0;;::::1;::::0;30985:31:::1;::::0;:71:::1;::::0;31017:10:::1;::::0;31037:4:::1;::::0;31044:11;;30985:71:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30963:123;;;::::0;-1:-1:-1;;;30963:123:0;;13250:2:1;30963:123:0::1;::::0;::::1;13232:21:1::0;13289:1;13269:18;;;13262:29;-1:-1:-1;;;13307:18:1;;;13300:32;13349:18;;30963:123:0::1;13048:325:1::0;30963:123:0::1;31165:16;::::0;31133:63:::1;::::0;31150:4:::1;::::0;-1:-1:-1;;;;;31165:16:0::1;31184:11:::0;31133:8:::1;:63::i;:::-;31214:10;::::0;31242:16:::1;::::0;31207:66:::1;::::0;-1:-1:-1;;;31207:66:0;;-1:-1:-1;;;;;31214:10:0;;::::1;::::0;31207:26:::1;::::0;:66:::1;::::0;31242:16;::::1;::::0;31261:11;;31207:66:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31298:16:0::1;::::0;31370:10:::1;::::0;-1:-1:-1;;;;;31298:16:0;;::::1;::::0;:29:::1;::::0;31350:4:::1;::::0;31370:10:::1;31395:11:::0;31421;31298:16:::1;::::0;31571:10:::1;31596:21;:15;31614:3;31596:21;:::i;:::-;31298:356;::::0;::::1;::::0;;;-1:-1:-1;;;;;;31298:356:0;;;-1:-1:-1;;;;;13793:15:1;;;31298:356:0::1;::::0;::::1;13775:34:1::0;13845:15;;;13825:18;;;13818:43;13877:18;;;13870:34;;;;13920:18;;;13913:34;;;;13963:19;;;13956:35;;;;14007:19;;;14000:35;14072:15;;;14051:19;;;14044:44;14104:19;;;14097:35;;;;13709:19;;31298:356:0::1;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;31298:356:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;31298:356:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;31294:1147;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;31809:16;::::0;31777:53:::1;::::0;31794:4:::1;::::0;-1:-1:-1;;;;;31809:16:0::1;;31777:8;:53::i;:::-;31852:10;::::0;31880:16:::1;::::0;31845:56:::1;::::0;-1:-1:-1;;;31845:56:0;;-1:-1:-1;;;;;31852:10:0;;::::1;::::0;31845:26:::1;::::0;:56:::1;::::0;31880:16;::::1;::::0;31852:10:::1;::::0;31845:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;31985:10:0::1;::::0;31978:52:::1;::::0;-1:-1:-1;;;31978:52:0;;-1:-1:-1;;;;;31985:10:0;;::::1;::::0;31978:27:::1;::::0;:52:::1;::::0;32006:10:::1;::::0;32018:11;;31978:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32066:6;32059:14;;-1:-1:-1::0;;;32059:14:0::1;;;;;;;;:::i;31294:1147::-;;;32167:16;::::0;32135:53:::1;::::0;32152:4:::1;::::0;-1:-1:-1;;;;;32167:16:0::1;;32135:8;:53::i;:::-;32210:10;::::0;32238:16:::1;::::0;32203:56:::1;::::0;-1:-1:-1;;;32203:56:0;;-1:-1:-1;;;;;32210:10:0;;::::1;::::0;32203:26:::1;::::0;:56:::1;::::0;32238:16;::::1;::::0;32210:10:::1;::::0;32203:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;32343:10:0::1;::::0;32336:52:::1;::::0;-1:-1:-1;;;32336:52:0;;-1:-1:-1;;;;;32343:10:0;;::::1;::::0;32336:27:::1;::::0;:52:::1;::::0;32364:10:::1;::::0;32376:11;;32336:52:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;32417:12:0::1;::::0;-1:-1:-1;;;32417:12:0;;16286:2:1;32417:12:0::1;::::0;::::1;16268:21:1::0;16325:1;16305:18;;;16298:29;-1:-1:-1;;;16343:18:1;;;16336:32;16385:18;;32417:12:0::1;16084:325:1::0;31294:1147:0::1;-1:-1:-1::0;;31675:40:0::1;::::0;;6265:25:1;;;6321:2;6306:18;;6299:34;;;31675:40:0::1;::::0;-1:-1:-1;6238:18:1;31675:40:0::1;;;;;;;32544:10;::::0;32537:43:::1;::::0;-1:-1:-1;;;32537:43:0;;32574:4:::1;32537:43;::::0;::::1;2292:51:1::0;32511:23:0::1;::::0;-1:-1:-1;;;;;32544:10:0::1;::::0;32537:28:::1;::::0;2265:18:1;;32537:43:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32511:69:::0;-1:-1:-1;32595:19:0;;32591:108:::1;;32638:10;::::0;32631:56:::1;::::0;-1:-1:-1;;;32631:56:0;;-1:-1:-1;;;;;32638:10:0;;::::1;::::0;32631:27:::1;::::0;:56:::1;::::0;32659:10:::1;::::0;32671:15;;32631:56:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;30546:2160;30446:2260:::0;;:::o;36865:319::-;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;36957:31:0;::::1;36949:46;;;::::0;-1:-1:-1;;;36949:46:0;;16616:2:1;36949:46:0::1;::::0;::::1;16598:21:1::0;16655:1;16635:18;;;16628:29;-1:-1:-1;;;16673:18:1;;;16666:32;16715:18;;36949:46:0::1;16414:325:1::0;36949:46:0::1;37038:14;::::0;;-1:-1:-1;;;;;37063:34:0;;::::1;-1:-1:-1::0;;;;;;37063:34:0;::::1;::::0;::::1;::::0;;;37123:53:::1;::::0;;37038:14;;;::::1;10146:34:1::0;;;10211:2;10196:18;;10189:43;;;;37123:53:0::1;::::0;10081:18:1;37123:53:0::1;;;;;;;36938:246;36865:319:::0;:::o;3328:182::-;3398:4;3431:10;3452:28;3431:10;3469:2;3473:6;3452:9;:28::i;36243:564::-;1748:13;:11;:13::i;:::-;1042:1:::1;1188:7;;:19:::0;1180:34:::1;;;::::0;-1:-1:-1;;;1180:34:0;;7437:2:1;1180:34:0::1;::::0;::::1;7419:21:1::0;7476:1;7456:18;;;7449:29;-1:-1:-1;;;7494:18:1;;;7487:32;7536:18;;1180:34:0::1;7235:325:1::0;1180:34:0::1;1042:1;1225:7;:18:::0;36335:15;36327:57:::2;;;::::0;-1:-1:-1;;;36327:57:0;;16946:2:1;36327:57:0::2;::::0;::::2;16928:21:1::0;16985:2;16965:18;;;16958:30;17024:31;17004:18;;;16997:59;17073:18;;36327:57:0::2;16744:353:1::0;36327:57:0::2;36418:24;36436:4;36418:9;:24::i;:::-;36403:11;:39;;36395:72;;;::::0;-1:-1:-1;;;36395:72:0;;17304:2:1;36395:72:0::2;::::0;::::2;17286:21:1::0;17343:2;17323:18;;;17316:30;-1:-1:-1;;;17362:18:1;;;17355:50;17422:18;;36395:72:0::2;17102:344:1::0;36395:72:0::2;36486:12;::::0;-1:-1:-1;;;36486:12:0;::::2;;;36478:43;;;::::0;-1:-1:-1;;;36478:43:0;;17653:2:1;36478:43:0::2;::::0;::::2;17635:21:1::0;17692:2;17672:18;;;17665:30;-1:-1:-1;;;17711:18:1;;;17704:48;17769:18;;36478:43:0::2;17451:342:1::0;36478:43:0::2;36567:19;36589:25;36602:11;36589:12;:25::i;:::-;36567:47;;36694:1;36680:11;:15;36672:56;;;::::0;-1:-1:-1;;;36672:56:0;;18000:2:1;36672:56:0::2;::::0;::::2;17982:21:1::0;18039:2;18019:18;;;18012:30;18078;18058:18;;;18051:58;18126:18;;36672:56:0::2;17798:352:1::0;36672:56:0::2;36754:45;::::0;;6265:25:1;;;6321:2;6306:18;;6299:34;;;36754:45:0::2;::::0;6238:18:1;36754:45:0::2;;;;;;;-1:-1:-1::0;;998:1:0::1;1266:7;:22:::0;36243:564::o;34118:166::-;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;34192:21:0;::::1;34184:36;;;::::0;-1:-1:-1;;;34184:36:0;;18357:2:1;34184:36:0::1;::::0;::::1;18339:21:1::0;18396:1;18376:18;;;18369:29;-1:-1:-1;;;18414:18:1;;;18407:32;18456:18;;34184:36:0::1;18155:325:1::0;34184:36:0::1;34231:16;:45:::0;;-1:-1:-1;;;;;;34231:45:0::1;-1:-1:-1::0;;;;;34231:45:0;;;::::1;::::0;;;::::1;::::0;;34118:166::o;39056:295::-;1748:13;:11;:13::i;:::-;39137:12:::1;::::0;-1:-1:-1;;;39137:12:0;::::1;;;39136:13;39128:43;;;::::0;-1:-1:-1;;;39128:43:0;;18687:2:1;39128:43:0::1;::::0;::::1;18669:21:1::0;18726:2;18706:18;;;18699:30;-1:-1:-1;;;18745:18:1;;;18738:47;18802:18;;39128:43:0::1;18485:341:1::0;39128:43:0::1;-1:-1:-1::0;;;;;39190:24:0;::::1;39182:58;;;::::0;-1:-1:-1;;;39182:58:0;;19033:2:1;39182:58:0::1;::::0;::::1;19015:21:1::0;19072:2;19052:18;;;19045:30;-1:-1:-1;;;19091:18:1;;;19084:51;19152:18;;39182:58:0::1;18831:345:1::0;39182:58:0::1;39251:9;:22:::0;;-1:-1:-1;;;;;;;;;39251:22:0;::::1;::::0;;::::1;39284:19:::0;;;;-1:-1:-1;;;;;;39284:19:0;;;;;;;-1:-1:-1;;;39284:19:0::1;::::0;;;39319:24:::1;::::0;::::1;::::0;-1:-1:-1;;39319:24:0::1;39056:295:::0;:::o;37235:1534::-;1748:13;:11;:13::i;:::-;37343:1:::1;37329:11;:15;37321:30;;;;-1:-1:-1::0;;;37321:30:0::1;;;;;;;:::i;:::-;37370:46;::::0;-1:-1:-1;;;37370:46:0;;37385:4:::1;37370:46;::::0;::::1;2292:51:1::0;;;37420:11:0;;37370:31:::1;::::0;2265:18:1;;37370:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;37362:76;;;::::0;-1:-1:-1;;;37362:76:0;;12210:2:1;37362:76:0::1;::::0;::::1;12192:21:1::0;12249:1;12229:18;;;12222:29;-1:-1:-1;;;12267:18:1;;;12260:32;12309:18;;37362:76:0::1;12008:325:1::0;37362:76:0::1;37521:16;::::0;37489:69:::1;::::0;37506:4:::1;::::0;-1:-1:-1;;;;;37521:16:0::1;-1:-1:-1::0;;37489:8:0::1;:69::i;:::-;37654:21;37626:25;37760;37773:11:::0;37760:12:::1;:25::i;:::-;37738:47;;37810:11;37825:1;37810:16:::0;37806:55:::1;;37843:7;;13365:63;12600:836::o:0;37806:55::-:1;37959:21;37995:39:::0;;::::1;37991:137;;-1:-1:-1::0;;;;;;;;;;;38056:39:0::1;;;;9242:2:1::0;9224:21;;;9281:2;9261:18;;;9254:30;-1:-1:-1;;;9315:2:1;9300:18;;9293:55;9380:2;9365:18;;9040:349;38056:39:0::1;;;;;;;;38110:7;;;13365:63;12600:836::o:0;37991:137::-:1;38192:25;38220:38;38241:17:::0;38220:18;:38:::1;:::i;:::-;38192:66:::0;-1:-1:-1;38309:23:0::1;38371:3;38335:33;9402:2;38192:66:::0;38335:33:::1;:::i;:::-;:39;;;;:::i;:::-;38309:65:::0;-1:-1:-1;38385:21:0::1;38443:3;38409:31;9458:2;38409:17:::0;:31:::1;:::i;:::-;:37;;;;:::i;:::-;38385:61:::0;-1:-1:-1;38505:19:0;;38501:117:::1;;38541:65;38555:15:::0;38602:3:::1;38572:27;9402:2;38572:11:::0;:27:::1;:::i;:::-;:33;;;;:::i;:::-;38541:13;:65::i;:::-;38679:17:::0;;38675:87:::1;;38713:37;38736:13;38713:22;:37::i;:::-;37310:1459;;;;;;37235:1534:::0;:::o;32791:1319::-;1748:13;:11;:13::i;:::-;32901:46:::1;::::0;-1:-1:-1;;;32901:46:0;;32916:4:::1;32901:46;::::0;::::1;2292:51:1::0;;;32879:19:0::1;::::0;32901:31:::1;::::0;2265:18:1;;32901:46:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32879:68;;32980:1;32966:11;:15;32958:30;;;;-1:-1:-1::0;;;32958:30:0::1;;;;;;;:::i;:::-;33019:1;33007:9;:13;32999:28;;;::::0;-1:-1:-1;;;32999:28:0;;19383:2:1;32999:28:0::1;::::0;::::1;19365:21:1::0;19422:1;19402:18;;;19395:29;-1:-1:-1;;;19440:18:1;;;19433:32;19482:18;;32999:28:0::1;19181:325:1::0;32999:28:0::1;33106:16;::::0;33074:63:::1;::::0;33091:4:::1;::::0;-1:-1:-1;;;;;33106:16:0::1;33125:11:::0;33074:8:::1;:63::i;:::-;33162:16;::::0;-1:-1:-1;;;;;33162:16:0::1;:32;33202:9;33235:4;33255:11:::0;33162:16:::1;::::0;33403:10:::1;33428:21;:15;33446:3;33428:21;:::i;:::-;33162:324;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;33162:324:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;33162:324:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;33158:945;;;;:::i;:::-;;;::::0;::::1;;;;;:::i;:::-;;;;;;;;33639:16;::::0;33607:53:::1;::::0;33624:4:::1;::::0;-1:-1:-1;;;;;33639:16:0::1;;33607:8;:53::i;:::-;33725:51;::::0;33733:10:::1;::::0;33754:21:::1;33725:51:::0;::::1;;;::::0;::::1;::::0;;;33754:21;33733:10;33725:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;33158:945;;;33913:16;::::0;33881:53:::1;::::0;33898:4:::1;::::0;-1:-1:-1;;;;;33913:16:0::1;;33881:8;:53::i;:::-;33999:51;::::0;34007:10:::1;::::0;34028:21:::1;33999:51:::0;::::1;;;::::0;::::1;::::0;;;34028:21;34007:10;33999:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;33158:945;-1:-1:-1::0;;33507:38:0::1;::::0;;6265:25:1;;;33535:9:0::1;6321:2:1::0;6306:18;;6299:34;33507:38:0::1;::::0;-1:-1:-1;6238:18:1;33507:38:0::1;;;;;;;32868:1242;32791:1319::o:0;29244:1147::-;29310:23;29344:21;29376:31;29418:27;29506:21;;29480:23;;:47;;;;:::i;:::-;29464:63;;29638:21;9627:11;29662:13;:39;;29638:63;;29712:16;10015:10;29750:19;;:45;;;;:::i;:::-;29731:15;:64;;29712:83;;29837:16;:31;;;;;29857:11;29837:31;29816:52;;29968:11;29967:12;:39;;;;;30005:1;29983:19;;:23;29967:39;29963:299;;;30023:26;10015:10;30052:19;;:45;;;;:::i;:::-;30023:74;;30137:15;30116:18;:36;30112:139;;;30199:36;30220:15;30199:18;:36;:::i;:::-;30173:62;;30112:139;30008:254;29963:299;30356:6;30334:28;;29453:938;;29244:1147;;;;:::o;35249:958::-;1748:13;:11;:13::i;:::-;35384:16:::1;::::0;35352:69:::1;::::0;35369:4:::1;::::0;-1:-1:-1;;;;;35384:16:0::1;-1:-1:-1::0;;35352:8:0::1;:69::i;:::-;35500:10;::::0;35528:16:::1;::::0;35493:72:::1;::::0;-1:-1:-1;;;35493:72:0;;-1:-1:-1;;;;;35500:10:0;;::::1;::::0;35493:26:::1;::::0;:72:::1;::::0;35528:16;::::1;::::0;-1:-1:-1;;35547:17:0;35493:72:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;35493:72:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;35493:72:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;35489:193:::0;::::1;;-1:-1:-1::0;35604:10:0::1;::::0;35624:16:::1;::::0;35586:75:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;35604:10:0;;::::1;::::0;35624:16;::::1;::::0;-1:-1:-1;;35643:17:0;35586:75:::1;:::i;:::-;;;;;;;;35489:193;35757:13;::::0;-1:-1:-1;;;;;35757:13:0::1;:27:::0;35753:447:::1;;35812:10;::::0;35832:13:::1;::::0;35805:60:::1;::::0;-1:-1:-1;;;35805:60:0;;-1:-1:-1;;;;;35812:10:0;;::::1;::::0;35805:26:::1;::::0;:60:::1;::::0;35832:13;::::1;::::0;-1:-1:-1;;35847:17:0;35805:60:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;35805:60:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;35805:60:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;35801:177:::0;::::1;;-1:-1:-1::0;35908:10:0::1;::::0;35920:13:::1;::::0;35890:63:::1;::::0;::::1;::::0;::::1;::::0;-1:-1:-1;;;;;35908:10:0;;::::1;::::0;35920:13;::::1;::::0;-1:-1:-1;;35935:17:0;35890:63:::1;:::i;:::-;;;;;;;;35801:177;36040:13;::::0;36010:63:::1;::::0;-1:-1:-1;;;36010:63:0;;36025:4:::1;::::0;36010:29:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;36040:13:0::1;::::0;-1:-1:-1;;36055:17:0;36010:63:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;36010:63:0::1;::::0;;::::1;;::::0;;::::1;-1:-1:-1::0;;36010:63:0::1;::::0;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;:::i;:::-;;;36006:183:::0;::::1;;-1:-1:-1::0;36131:13:0::1;::::0;36098:66:::1;::::0;::::1;::::0;::::1;::::0;36124:4:::1;::::0;-1:-1:-1;;;;;36131:13:0::1;::::0;-1:-1:-1;;36146:17:0;36098:66:::1;:::i;1992:165::-:0;1748:13;:11;:13::i;:::-;-1:-1:-1;;;;;2081:22:0;::::1;2073:37;;;::::0;-1:-1:-1;;;2073:37:0;;20325:2:1;2073:37:0::1;::::0;::::1;20307:21:1::0;20364:1;20344:18;;;20337:29;-1:-1:-1;;;20382:18:1;;;20375:32;20424:18;;2073:37:0::1;20123:325:1::0;2073:37:0::1;2121:28;2140:8;2121:18;:28::i;5047:256::-:0;-1:-1:-1;;;;;5149:19:0;;;;;;:44;;-1:-1:-1;;;;;;5172:21:0;;;;5149:44;5141:59;;;;-1:-1:-1;;;5141:59:0;;20655:2:1;5141:59:0;;;20637:21:1;20694:1;20674:18;;;20667:29;-1:-1:-1;;;20712:18:1;;;20705:32;20754:18;;5141:59:0;20453:325:1;5141:59:0;-1:-1:-1;;;;;5211:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;5263:32;;160:25:1;;;5263:32:0;;133:18:1;5263:32:0;;;;;;;5047:256;;;:::o;5311:311::-;-1:-1:-1;;;;;3625:18:0;;;5412:24;3625:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;5483:26;;;;5475:41;;;;-1:-1:-1;;;5475:41:0;;20985:2:1;5475:41:0;;;20967:21:1;21024:1;21004:18;;;20997:29;-1:-1:-1;;;21042:18:1;;;21035:32;21084:18;;5475:41:0;20783:325:1;5475:41:0;5552:51;5561:5;5568:7;5596:6;5577:16;:25;5552:8;:51::i;13444:4244::-;13632:7;;;;;;;13631:8;:41;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;13657:15:0;;;1862:6;;13657:15;;13631:41;:72;;;;-1:-1:-1;1862:6:0;;-1:-1:-1;;;;;13690:13:0;;;1862:6;;13690:13;;13631:72;:111;;;;-1:-1:-1;;;;;;13721:21:0;;13737:4;13721:21;;13631:111;:148;;;;-1:-1:-1;13766:13:0;;-1:-1:-1;;;;;13760:19:0;;;13766:13;;13760:19;13631:148;13613:3806;;;13836:17;13876:3;13856:17;9347:1;13856:6;:17;:::i;:::-;:23;;;;:::i;:::-;13836:43;-1:-1:-1;13912:13:0;;13908:3500;;14006:23;14060:3;14032:25;9402:2;14032:9;:25;:::i;:::-;:31;;;;:::i;:::-;14006:57;-1:-1:-1;14082:21:0;14132:3;14106:23;9458:2;14106:9;:23;:::i;:::-;:29;;;;:::i;:::-;14082:53;-1:-1:-1;14230:22:0;14255:18;14264:9;14255:6;:18;:::i;:::-;14230:43;;14353:47;14369:4;14383;14390:9;14353:15;:47::i;:::-;14488:41;14504:4;14510:2;14514:14;14488:15;:41::i;:::-;14644:15;14617:23;;:42;;;;;;;:::i;:::-;;;;;;;;14703:13;14678:21;;:38;;;;;;;:::i;:::-;;;;-1:-1:-1;;15119:21:0;;15093:23;;14984:12;;9627:11;;15093:47;;15119:21;15093:47;:::i;:::-;:73;15089:2049;;15252:16;10015:10;15290:19;;:45;;;;:::i;:::-;15271:15;:64;;15252:83;;15551:16;15527:21;;15501:23;;:47;;;;:::i;:::-;:66;15497:1622;;;-1:-1:-1;;;;;;;;;;;15815:23:0;;15840:21;;15800:62;;;;;;6265:25:1;;;6321:2;6306:18;;6299:34;6253:2;6238:18;;6091:248;15800:62:0;;;;;;;;15497:1622;;;15896:11;15892:1227;;;16034:15;16012:19;:37;;;;16188:4;-1:-1:-1;;;;;16188:31:0;;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16184:498;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;16446:6:0;16435:18;;;;;;:::i;:::-;;;;;;;;16303:178;15892:1227;;16184:498;;;-1:-1:-1;;;;;;;;;;;16597:57:0;;;;21315:2:1;21297:21;;;21354:2;21334:18;;;21327:30;21393:34;21388:2;21373:18;;21366:62;-1:-1:-1;;;21459:2:1;21444:18;;21437:41;21510:3;21495:19;;21113:407;16184:498:0;15892:1227;;;-1:-1:-1;;;;;;;;;;;16838:23:0;;16863:21;;16823:62;;;;;;6265:25:1;;;6321:2;6306:18;;6299:34;6253:2;6238:18;;6091:248;16823:62:0;;;;;;;;17020:75;17065:21;;17039:23;;:47;;;;:::i;:::-;17020:75;;;6265:25:1;;;17088:6:0;6321:2:1;6306:18;;6299:34;6238:18;17020:75:0;;;;;;;15892:1227;15168:1970;15089:2049;17220:57;17234:4;9520:11;17240:15;17250:4;17240:9;:15::i;:::-;:36;;17220:13;:57::i;:::-;17296:53;17310:2;9520:11;17314:13;17324:2;17314:9;:13::i;17296:53::-;17386:7;;;;;13444:4244;;;:::o;13908:3500::-;13791:3628;13613:3806;17467:33;17483:4;17489:2;17493:6;17467:15;:33::i;:::-;17559:57;17573:4;9520:11;17579:15;17589:4;17579:9;:15::i;17559:57::-;17627:53;17641:2;9520:11;17645:13;17655:2;17645:9;:13::i;1884:100::-;1959:10;1948:7;1862:6;;-1:-1:-1;;;;;1862:6:0;;1789:87;1948:7;-1:-1:-1;;;;;1948:21:0;;1940:36;;;;-1:-1:-1;;;1940:36:0;;21993:2:1;1940:36:0;;;21975:21:1;22032:1;22012:18;;;22005:29;-1:-1:-1;;;22050:18:1;;;22043:32;22092:18;;1940:36:0;21791:325:1;24611:2497:0;24671:7;24695:11;24710:1;24695:16;24691:30;;-1:-1:-1;24720:1:0;;24611:2497;-1:-1:-1;24611:2497:0:o;24691:30::-;24740:12;;-1:-1:-1;;;24740:12:0;;;;24732:43;;;;-1:-1:-1;;;24732:43:0;;17653:2:1;24732:43:0;;;17635:21:1;17692:2;17672:18;;;17665:30;-1:-1:-1;;;17711:18:1;;;17704:48;17769:18;;24732:43:0;17451:342:1;24732:43:0;24820:16;;;24834:1;24820:16;;;;;;;;24796:21;;24820:16;;;;;;;;;;-1:-1:-1;24820:16:0;24796:40;;24865:4;24847;24852:1;24847:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24847:23:0;;;:7;;;;;;;;;;:23;;;;24891:16;;:23;;;-1:-1:-1;;;24891:23:0;;;;:16;;;;;:21;;:23;;;;;24847:7;;24891:23;;;;;:16;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24881:4;24886:1;24881:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;24881:33:0;;;:7;;;;;;;;;:33;25283:16;;25105:20;;25251:63;;25268:4;;25283:16;25302:11;25251:8;:63::i;:::-;25387:16;25406:22;:15;25424:4;25406:22;:::i;:::-;25660:16;;25814:9;;25660:230;;-1:-1:-1;;;25660:230:0;;25387:41;;-1:-1:-1;25534:21:0;;-1:-1:-1;;;;;25660:16:0;;;;:67;;:230;;25742:11;;25768:12;;25795:4;;25814:9;;;;;;;;25387:41;;25660:230;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25656:1445;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;26965:6:0;26954:18;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;26994:1:0;;24611:2497;-1:-1:-1;;;;;;24611:2497:0:o;25656:1445::-;;;-1:-1:-1;;;;;;;;;;;27034:32:0;;;;23034:2:1;23016:21;;;23073:2;23053:18;;;23046:30;-1:-1:-1;;;23107:2:1;23092:18;;23085:48;23165:2;23150:18;;22832:342;27034:32:0;;;;;;;;-1:-1:-1;27088:1:0;;24611:2497;-1:-1:-1;;;;;24611:2497:0:o;25656:1445::-;26012:9;;;;;;;;;-1:-1:-1;;;;;26012:9:0;-1:-1:-1;;;;;26001:37:0;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25997:891;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;;;;;;;26708:6:0;26660:55;;;;;;;;:::i;:::-;;;;-1:-1:-1;;26660:55:0;;;;;;;;;;26642:75;;;:::i;25997:891::-;;;-1:-1:-1;;;;;;;;;;;26791:54:0;;;;23845:2:1;23827:21;;;23884:2;23864:18;;;23857:30;23923:34;23918:2;23903:18;;23896:62;-1:-1:-1;;;23989:2:1;23974:18;;23967:38;24037:3;24022:19;;23643:404;25997:891:0;26146:21;26117:26;26208:38;26229:17;26146:21;26208:38;:::i;:::-;26186:60;-1:-1:-1;26287:15:0;;26283:285;;26332:40;;;6265:25:1;;;6321:2;6306:18;;6299:34;;;26332:40:0;;6238:18:1;26332:40:0;;;;;;;26402:11;24611:2497;-1:-1:-1;;;;;;;24611:2497:0:o;26283:285::-;-1:-1:-1;;;;;;;;;;;26467:50:0;;;;24254:2:1;24236:21;;;24293:2;24273:18;;;24266:30;24332:34;24327:2;24312:18;;24305:62;-1:-1:-1;;;24398:2:1;24383:18;;24376:34;24442:3;24427:19;;24052:400;26467:50:0;;;;;;;;-1:-1:-1;26547:1:0;;24611:2497;-1:-1:-1;;;;;;;24611:2497:0:o;23103:1500::-;23236:28;23267:24;23285:4;23267:9;:24::i;:::-;23236:55;;23329:11;23306:20;:34;23302:155;;;23362:62;;;;;24659:2:1;24641:21;;;24698:2;24678:18;;;24671:30;24737:34;24732:2;24717:18;;24710:62;-1:-1:-1;;;24803:2:1;24788:18;;24781:38;24851:3;24836:19;;24457:404;23362:62:0;;;;;;;;23439:7;23103:1500;;:::o;23302:155::-;23557:22;23619:3;23597:18;23619:3;;23597:18;:::i;:::-;23582:34;;:11;:34;:::i;:::-;:40;;;;:::i;:::-;23557:65;-1:-1:-1;23633:20:0;23691:3;23669:18;23691:3;;23669:18;:::i;:::-;23656:32;;:9;:32;:::i;:::-;:38;;;;:::i;:::-;23814:16;;23633:61;;-1:-1:-1;23782:63:0;;23799:4;;-1:-1:-1;;;;;23814:16:0;23833:11;23782:8;:63::i;:::-;23870:16;;-1:-1:-1;;;;;23870:16:0;:32;23910:9;23943:4;23963:11;23989:14;24018:12;24045:7;1862:6;;-1:-1:-1;;;;;1862:6:0;;1789:87;24045:7;24099:22;:15;24117:4;24099:22;:::i;:::-;23870:297;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;23870:297:0;;;;;;;;-1:-1:-1;;23870:297:0;;;;;;;;;;;;:::i;:::-;;;23866:730;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;24470:26;24489:6;24470:26;;;;;;:::i;:::-;;;;;;;;24416:92;23866:730;;;;;24535:49;;;;;25664:2:1;25646:21;;;25703:2;25683:18;;;25676:30;25742:29;25737:2;25722:18;;25715:57;25804:2;25789:18;;25462:351;24535:49:0;;;;;;;;23866:730;;;-1:-1:-1;;24188:38:0;;;6265:25:1;;;6321:2;6306:18;;6299:34;;;24188:38:0;;-1:-1:-1;6238:18:1;24188:38:0;;;;;;;1862:6;;-1:-1:-1;;;;;1862:6:0;-1:-1:-1;;;;;24322:27:0;;24347:1;24322:27;;;;160:25:1;;148:2;133:18;;14:177;24322:27:0;;;;;;;;23866:730;23174:1429;;;23103:1500;;:::o;27149:1779::-;27239:7;:14;27268:17;;;:32;;-1:-1:-1;27289:11:0;;27268:32;27264:45;;;27302:7;27149:1779;:::o;27264:45::-;27377:22;27416:3;27402:11;:6;27411:2;27402:11;:::i;:::-;:17;;;;:::i;:::-;27377:42;-1:-1:-1;27430:20:0;27453:23;27377:42;27453:6;:23;:::i;:::-;27430:46;;27560:1;27543:14;:18;:50;;;;-1:-1:-1;27565:14:0;;-1:-1:-1;;;;;27565:14:0;:28;;27543:50;27539:539;;;27637:14;;:46;;27611:20;;-1:-1:-1;;;;;27637:14:0;;27664;;27611:20;27637:46;27611:20;27637:46;27664:14;27637;:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27610:73;;;27703:15;27698:232;;27744:45;;;;;26210:2:1;26192:21;;;26249:2;26229:18;;;26222:30;26288;26283:2;26268:18;;26261:58;26351:2;26336:18;;26008:352;27744:45:0;;;;;;;;27908:6;27893:21;;27698:232;27595:346;27539:539;;;-1:-1:-1;28060:6:0;27539:539;28153:1;28138:12;:16;:36;;;;;28173:1;28158:12;:16;28138:36;28134:721;;;28191:23;28217:27;28232:12;28217;:27;:::i;:::-;28191:53;-1:-1:-1;28263:19:0;;28259:585;;28308:9;28303:526;28327:12;28323:1;:16;28303:526;;;28369:14;28386:7;28394:1;28386:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;28386:10:0;;-1:-1:-1;28423:20:0;;;;;:47;;-1:-1:-1;;;;;;28447:23:0;;28465:4;28447:23;;28423:47;:74;;;;-1:-1:-1;28484:13:0;;-1:-1:-1;;;;;28474:23:0;;;28484:13;;28474:23;;28423:74;28419:391;;;28589:12;28607:6;-1:-1:-1;;;;;28607:11:0;28626:15;28607:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28588:58;;;28678:7;28673:114;;28723:36;;;;;26567:2:1;26549:21;;;26606:2;26586:18;;;26579:30;-1:-1:-1;;;26640:2:1;26625:18;;26618:49;26699:2;26684:18;;26365:343;28723:36:0;;;;;;;;28673:114;28499:311;28419:391;-1:-1:-1;28341:3:0;;;;:::i;:::-;;;;28303:526;;;;28259:585;28176:679;28134:721;28880:40;;;6265:25:1;;;6321:2;6306:18;;6299:34;;;28880:40:0;;6238:18:1;28880:40:0;6091:248:1;2165:191:0;2258:6;;;-1:-1:-1;;;;;2275:17:0;;;-1:-1:-1;;;;;;2275:17:0;;;;;;;2308:40;;2258:6;;;2275:17;2258:6;;2308:40;;2239:16;;2308:40;2228:128;2165:191;:::o;4124:507::-;-1:-1:-1;;;;;4221:18:0;;;;;;:38;;-1:-1:-1;;;;;;4243:16:0;;;;4221:38;4213:53;;;;-1:-1:-1;;;4213:53:0;;27055:2:1;4213:53:0;;;27037:21:1;27094:1;27074:18;;;27067:29;-1:-1:-1;;;27112:18:1;;;27105:32;27154:18;;4213:53:0;26853:325:1;4213:53:0;-1:-1:-1;;;;;4348:15:0;;4326:19;4348:15;;;;;;;;;;;4382:21;;;;4374:36;;;;-1:-1:-1;;;4374:36:0;;27385:2:1;4374:36:0;;;27367:21:1;27424:1;27404:18;;;27397:29;-1:-1:-1;;;27442:18:1;;;27435:32;27484:18;;4374:36:0;27183:325:1;4374:36:0;-1:-1:-1;;;;;4446:15:0;;;:9;:15;;;;;;;;;;;4464:20;;;4446:38;;4499:13;;;;;;;;;;:23;;;;;;4549:26;;160:25:1;;;4499:13:0;;4549:26;;133:18:1;4549:26:0;;;;;;;4586:37;34292:183;17696:779;17791:13;;-1:-1:-1;;;;;17780:24:0;;;17791:13;;17780:24;;;;:52;;-1:-1:-1;;;;;;17808:24:0;;17827:4;17808:24;;17780:52;17776:692;;;17853:14;:36;;;;-1:-1:-1;;;;;;17872:17:0;;;;;;:8;:17;;;;;;;;17871:18;17853:36;17849:608;;;-1:-1:-1;;;;;;17910:17:0;;;;;:8;:17;;;;;:24;;-1:-1:-1;;17910:24:0;17930:4;17910:24;;;;;;17953:7;:21;;;;;;;;;;;;;;-1:-1:-1;;;;;;17953:21:0;;;;;;17696:779::o;17849:608::-;18001:14;18000:15;:36;;;;-1:-1:-1;;;;;;18019:17:0;;;;;;:8;:17;;;;;;;;18000:36;17996:461;;;-1:-1:-1;;;;;18057:17:0;;18077:5;18057:17;;;:8;:17;;;;;:25;;-1:-1:-1;;18057:25:0;;;18165:277;18189:7;:14;18185:18;;18165:277;;;18251:7;-1:-1:-1;;;;;18237:21:0;:7;18245:1;18237:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;18237:10:0;:21;18233:190;;18300:7;18308:14;;:18;;18325:1;;18308:18;:::i;:::-;18300:27;;;;;;;;:::i;:::-;;;;;;;;;;;18287:7;:10;;-1:-1:-1;;;;;18300:27:0;;;;18295:1;;18287:10;;;;;;:::i;:::-;;;;;;;;;:40;;;;;-1:-1:-1;;;;;18287:40:0;;;;;-1:-1:-1;;;;;18287:40:0;;;;;;18354:7;:13;;;;;;;:::i;:::-;;;;;;;;;;-1:-1:-1;;18354:13:0;;;;;-1:-1:-1;;;;;;18354:13:0;;;;;;34426:41:::1;34292:183:::0;;:::o;18233:190::-;18205:3;;;;:::i;:::-;;;;18165:277;;17996:461;17696:779;;:::o;196:250:1:-;281:1;291:113;305:6;302:1;299:13;291:113;;;381:11;;;375:18;362:11;;;355:39;327:2;320:10;291:113;;;-1:-1:-1;;438:1:1;420:16;;413:27;196:250::o;451:396::-;600:2;589:9;582:21;563:4;632:6;626:13;675:6;670:2;659:9;655:18;648:34;691:79;763:6;758:2;747:9;743:18;738:2;730:6;726:15;691:79;:::i;:::-;831:2;810:15;-1:-1:-1;;806:29:1;791:45;;;;838:2;787:54;;451:396;-1:-1:-1;;451:396:1:o;852:131::-;-1:-1:-1;;;;;927:31:1;;917:42;;907:70;;973:1;970;963:12;988:315;1056:6;1064;1117:2;1105:9;1096:7;1092:23;1088:32;1085:52;;;1133:1;1130;1123:12;1085:52;1172:9;1159:23;1191:31;1216:5;1191:31;:::i;:::-;1241:5;1293:2;1278:18;;;;1265:32;;-1:-1:-1;;;988:315:1:o;1500:456::-;1577:6;1585;1593;1646:2;1634:9;1625:7;1621:23;1617:32;1614:52;;;1662:1;1659;1652:12;1614:52;1701:9;1688:23;1720:31;1745:5;1720:31;:::i;:::-;1770:5;-1:-1:-1;1827:2:1;1812:18;;1799:32;1840:33;1799:32;1840:33;:::i;:::-;1500:456;;1892:7;;-1:-1:-1;;;1946:2:1;1931:18;;;;1918:32;;1500:456::o;1961:180::-;2020:6;2073:2;2061:9;2052:7;2048:23;2044:32;2041:52;;;2089:1;2086;2079:12;2041:52;-1:-1:-1;2112:23:1;;1961:180;-1:-1:-1;1961:180:1:o;2543:461::-;2596:3;2634:5;2628:12;2661:6;2656:3;2649:19;2687:4;2716:2;2711:3;2707:12;2700:19;;2753:2;2746:5;2742:14;2774:1;2784:195;2798:6;2795:1;2792:13;2784:195;;;2863:13;;-1:-1:-1;;;;;2859:39:1;2847:52;;2919:12;;;;2954:15;;;;2895:1;2813:9;2784:195;;;-1:-1:-1;2995:3:1;;2543:461;-1:-1:-1;;;;;2543:461:1:o;3009:261::-;3188:2;3177:9;3170:21;3151:4;3208:56;3260:2;3249:9;3245:18;3237:6;3208:56;:::i;:::-;3200:64;3009:261;-1:-1:-1;;;3009:261:1:o;3508:247::-;3567:6;3620:2;3608:9;3599:7;3595:23;3591:32;3588:52;;;3636:1;3633;3626:12;3588:52;3675:9;3662:23;3694:31;3719:5;3694:31;:::i;3760:248::-;3828:6;3836;3889:2;3877:9;3868:7;3864:23;3860:32;3857:52;;;3905:1;3902;3895:12;3857:52;-1:-1:-1;;3928:23:1;;;3998:2;3983:18;;;3970:32;;-1:-1:-1;3760:248:1:o;4013:388::-;4081:6;4089;4142:2;4130:9;4121:7;4117:23;4113:32;4110:52;;;4158:1;4155;4148:12;4110:52;4197:9;4184:23;4216:31;4241:5;4216:31;:::i;:::-;4266:5;-1:-1:-1;4323:2:1;4308:18;;4295:32;4336:33;4295:32;4336:33;:::i;:::-;4388:7;4378:17;;;4013:388;;;;;:::o;5046:380::-;5125:1;5121:12;;;;5168;;;5189:61;;5243:4;5235:6;5231:17;5221:27;;5189:61;5296:2;5288:6;5285:14;5265:18;5262:38;5259:161;;5342:10;5337:3;5333:20;5330:1;5323:31;5377:4;5374:1;5367:15;5405:4;5402:1;5395:15;5259:161;;5046:380;;;:::o;6674:274::-;-1:-1:-1;;;;;6866:32:1;;;;6848:51;;6930:2;6915:18;;6908:34;6836:2;6821:18;;6674:274::o;6953:277::-;7020:6;7073:2;7061:9;7052:7;7048:23;7044:32;7041:52;;;7089:1;7086;7079:12;7041:52;7121:9;7115:16;7174:5;7167:13;7160:21;7153:5;7150:32;7140:60;;7196:1;7193;7186:12;7895:127;7956:10;7951:3;7947:20;7944:1;7937:31;7987:4;7984:1;7977:15;8011:4;8008:1;8001:15;8027:125;8092:9;;;8113:10;;;8110:36;;;8126:18;;:::i;8512:168::-;8585:9;;;8616;;8633:15;;;8627:22;;8613:37;8603:71;;8654:18;;:::i;8685:217::-;8725:1;8751;8741:132;;8795:10;8790:3;8786:20;8783:1;8776:31;8830:4;8827:1;8820:15;8858:4;8855:1;8848:15;8741:132;-1:-1:-1;8887:9:1;;8685:217::o;8907:128::-;8974:9;;;8995:11;;;8992:37;;;9009:18;;:::i;10243:251::-;10313:6;10366:2;10354:9;10345:7;10341:23;10337:32;10334:52;;;10382:1;10379;10372:12;10334:52;10414:9;10408:16;10433:31;10458:5;10433:31;:::i;11159:325::-;11361:2;11343:21;;;11400:1;11380:18;;;11373:29;-1:-1:-1;;;11433:2:1;11418:18;;11411:32;11475:2;11460:18;;11159:325::o;11819:184::-;11889:6;11942:2;11930:9;11921:7;11917:23;11913:32;11910:52;;;11958:1;11955;11948:12;11910:52;-1:-1:-1;11981:16:1;;11819:184;-1:-1:-1;11819:184:1:o;12668:375::-;-1:-1:-1;;;;;12926:15:1;;;12908:34;;12978:15;;;;12973:2;12958:18;;12951:43;13025:2;13010:18;;13003:34;;;;12858:2;12843:18;;12668:375::o;14143:306::-;14231:6;14239;14247;14300:2;14288:9;14279:7;14275:23;14271:32;14268:52;;;14316:1;14313;14306:12;14268:52;14345:9;14339:16;14329:26;;14395:2;14384:9;14380:18;14374:25;14364:35;;14439:2;14428:9;14424:18;14418:25;14408:35;;14143:306;;;;;:::o;14454:179::-;14489:3;14531:1;14513:16;14510:23;14507:120;;;14577:1;14574;14571;14556:23;-1:-1:-1;14614:1:1;14608:8;14603:3;14599:18;14507:120;14454:179;:::o;14770:346::-;14880:2;14861:13;;-1:-1:-1;;14857:27:1;14845:40;;14915:18;14900:34;;14936:22;;;14897:62;14894:185;;;15001:10;14996:3;14992:20;14989:1;14982:31;15036:4;15033:1;15026:15;15064:4;15061:1;15054:15;14894:185;15095:2;15088:22;-1:-1:-1;;14770:346:1:o;15121:671::-;15160:3;15202:4;15184:16;15181:26;15178:39;;;15121:671;:::o;15178:39::-;15244:2;15238:9;-1:-1:-1;;15309:16:1;15305:25;;15302:1;15238:9;15281:50;15360:4;15354:11;15384:16;15419:18;15490:2;15483:4;15475:6;15471:17;15468:25;15463:2;15455:6;15452:14;15449:45;15446:58;;;15497:5;;;;;15121:671;:::o;15446:58::-;15534:6;15528:4;15524:17;15513:28;;15570:3;15564:10;15597:2;15589:6;15586:14;15583:27;;;15603:5;;;;;;15121:671;:::o;15583:27::-;15687:2;15668:16;15662:4;15658:27;15654:36;15647:4;15638:6;15633:3;15629:16;15625:27;15622:69;15619:82;;;15694:5;;;;;;15121:671;:::o;15619:82::-;15710:57;15761:4;15752:6;15744;15740:19;15736:30;15730:4;15710:57;:::i;:::-;-1:-1:-1;15783:3:1;;15121:671;-1:-1:-1;;;;;15121:671:1:o;19511:607::-;-1:-1:-1;;;;;19870:15:1;;;19852:34;;19917:2;19902:18;;19895:34;;;;19960:2;19945:18;;19938:34;;;;20003:2;19988:18;;19981:34;;;;20052:15;;;20046:3;20031:19;;20024:44;19832:3;20084:19;;20077:35;;;;19801:3;19786:19;;19511:607::o;22121:127::-;22182:10;22177:3;22173:20;22170:1;22163:31;22213:4;22210:1;22203:15;22237:4;22234:1;22227:15;22253:574;22544:6;22533:9;22526:25;22587:6;22582:2;22571:9;22567:18;22560:34;22630:3;22625:2;22614:9;22610:18;22603:31;22507:4;22651:57;22703:3;22692:9;22688:19;22680:6;22651:57;:::i;:::-;-1:-1:-1;;;;;22744:32:1;;;;22739:2;22724:18;;22717:60;-1:-1:-1;22808:3:1;22793:19;22786:35;22643:65;22253:574;-1:-1:-1;;;22253:574:1:o;23179:459::-;23441:29;23436:3;23429:42;23411:3;23500:6;23494:13;23516:75;23584:6;23579:2;23574:3;23570:12;23563:4;23555:6;23551:17;23516:75;:::i;:::-;23611:16;;;;23629:2;23607:25;;23179:459;-1:-1:-1;;23179:459:1:o;26713:135::-;26752:3;26773:17;;;26770:43;;26793:18;;:::i;:::-;-1:-1:-1;26840:1:1;26829:13;;26713:135::o;27513:127::-;27574:10;27569:3;27565:20;27562:1;27555:31;27605:4;27602:1;27595:15;27629:4;27626:1;27619:15

Swarm Source

ipfs://f1f36df5a300608644ea07302dc5c2a7009c44af75293c7c3bb498cd9e426b09
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.