S Price: $0.543714 (-8.92%)

Contract

0xE1Ae1D1905b54F282abf94dED4DE18D735b1Ef3A

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Treasury Wal...112694622025-03-02 21:50:3231 hrs ago1740952232IN
0xE1Ae1D19...735b1Ef3A
0 S0.0017062655
Check And Refres...112694032025-03-02 21:50:0631 hrs ago1740952206IN
0xE1Ae1D19...735b1Ef3A
0 S0.003304455
Add Initial Liqu...112693792025-03-02 21:49:5531 hrs ago1740952195IN
0xE1Ae1D19...735b1Ef3A
50 S0.0152089855
Initialize112693502025-03-02 21:49:4631 hrs ago1740952186IN
0xE1Ae1D19...735b1Ef3A
0 S0.1297064455
Approve112693372025-03-02 21:49:4131 hrs ago1740952181IN
0xE1Ae1D19...735b1Ef3A
0 S0.0025808755

Latest 1 internal transaction

Parent Transaction Hash Block From To
112693792025-03-02 21:49:5531 hrs ago1740952195
0xE1Ae1D19...735b1Ef3A
50 S
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
FARMER

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

// 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.
 */
abstract 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), "E0");
        _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);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "E5");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

interface IMetropolisRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);
    
    function 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);

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

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

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint amountIn,
        uint amountOutMin,
        address[] calldata path,
        address to,
        uint deadline
    ) external;
}

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

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;
    function sync() 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 MIN_HOLDER_AMOUNT = 100 * 10**18; // 100 tokens minimum for holder status
    uint256 private constant MIN_TOKENS_FOR_PROCESS = 1000 * 10**18; // 1000 tokens minimum for processing
    uint256 private constant MAX_SLIPPAGE = 30; // 30% slippage tolerance
    uint256 private constant TREASURY_PERCENTAGE = 25; // 25% to treasury
    uint256 private constant HOLDERS_PERCENTAGE = 75; // 75% to holders

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

    // Optimize events
    event AirdropDistributed(uint256 indexed amount, uint256 indexed holdersCount);
    event TreasuryTransferred(uint256 indexed amount, address indexed treasuryWallet);
    event SwapFailed(string indexed reason);
    event ProcessStarted(uint256 indexed tokensForAirdrop);
    event SwapSuccessful(uint256 indexed tokensSwapped, uint256 indexed wethReceived);
    event PairReservesUpdated(uint256 indexed farmReserve, uint256 indexed wethReserve);
    event ContractInitialized(address indexed router, address indexed factory, address indexed sonic);
    event TreasuryWalletUpdated(address indexed oldWallet, address indexed newWallet);

    uint256 private _pendingAirdropTokens;
    bool private _initialized;

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

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

        metropolisRouter = IMetropolisRouter(_metropolisRouter);
        metropolisFactory = IMetropolisFactory(_metropolisFactory);
        sonicToken = _sonicToken;
        treasuryWallet = msg.sender; // Default treasury is owner

        _mint(address(this), TOTAL_SUPPLY);
    }

    function initialize() external onlyOwner {
        require(!_initialized, "E1");
        
        // 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), "E5");
        
        // Tüm onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max);
        
        try IERC20(sonicToken).approve(liquidityPair, type(uint256).max) {} catch {}
        try IERC20(address(this)).approve(liquidityPair, type(uint256).max) {} catch {}
        
        _initialized = true;
        emit ContractInitialized(address(metropolisRouter), address(metropolisFactory), sonicToken);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        // Boş implementasyon kaldırıldı
    }

    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        // Boş implementasyon kaldırıldı
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual override {
        require(from != address(0) && to != address(0), "E0");
        
        // Skip tax for owner and contract transfers
        if (from == owner() || to == owner() || from == address(this) || to == address(this) || !_initialized) {
            super._transfer(from, to, amount);
            _updateHolder(from);
            _updateHolder(to);
            return;
        }

        bool isSellOrBuy = to == liquidityPair || from == liquidityPair;
        if (isSellOrBuy) {
            // Calculate tax amount (5%)
            uint256 totalTax = (amount * TAX_RATE) / 100;
            uint256 transferAmount = amount - totalTax;
            
            // First transfer main amount to recipient
            super._transfer(from, to, transferAmount);
            
            // Then transfer tax to contract
            super._transfer(from, address(this), totalTax);

            // Tüm tax'ı airdrop için ayır
            _pendingAirdropTokens += totalTax;

            // Try to process if we have enough tokens
            if (_pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS && holders.length > 0) {
                // Refresh all approvals first
                _approve(address(this), address(metropolisRouter), type(uint256).max);
                
                try IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max) {} catch {}
                
                if (liquidityPair != address(0)) {
                    try IERC20(sonicToken).approve(liquidityPair, type(uint256).max) {} catch {}
                    try IERC20(address(this)).approve(liquidityPair, type(uint256).max) {} catch {}
                }
                
                try this.processAirdrop() {
                    // Process successful
                } catch Error(string memory reason) {
                    emit SwapFailed(string(abi.encodePacked("Auto process failed: ", reason)));
                } catch {
                    emit SwapFailed("Unknown error in automatic processing");
                }
            }
        } else {
            // Normal transfer without tax
            super._transfer(from, to, amount);
        }
        
        // Update holder status for both addresses
        _updateHolder(from);
        _updateHolder(to);
    }

    function _updateHolder(address account) private {
        if (account != liquidityPair && account != address(this)) {
            uint256 balance = balanceOf(account);
            bool isCurrentlyHolder = isHolder[account];
            
            if (balance >= MIN_HOLDER_AMOUNT && !isCurrentlyHolder) {
                isHolder[account] = true;
                holders.push(account);
            } else if (balance < MIN_HOLDER_AMOUNT && isCurrentlyHolder) {
                isHolder[account] = false;
                _removeHolder(account);
            }
        }
    }

    function _removeHolder(address account) private {
        for (uint256 i = 0; i < holders.length; i++) {
            if (holders[i] == account) {
                holders[i] = holders[holders.length - 1];
                holders.pop();
                break;
            }
        }
    }

    function processAirdrop() external nonReentrant {
        require(_pendingAirdropTokens > 0, "E5");
        require(holders.length > 0, "E6");
        require(_pendingAirdropTokens >= MIN_TOKENS_FOR_PROCESS, "E7");
        
        emit ProcessStarted(_pendingAirdropTokens);

        // Reset pending amounts
        uint256 tempAirdropTokens = _pendingAirdropTokens;
        _pendingAirdropTokens = 0;

        // Tüm tokenleri SONIC'e çevir
        uint256 sonicReceived = _swapTokensForSonic(tempAirdropTokens);
        
        // Airdrop dağıt
        if (sonicReceived > 0) {
            // Treasury için %25 ayır
            uint256 treasuryAmount = (sonicReceived * TREASURY_PERCENTAGE) / 100;
            uint256 holdersAmount = sonicReceived - treasuryAmount;
            
            // Treasury'ye gönder
            if (treasuryAmount > 0 && treasuryWallet != address(0)) {
                try IERC20(sonicToken).transfer(treasuryWallet, treasuryAmount) {
                    emit TreasuryTransferred(treasuryAmount, treasuryWallet);
                } catch {
                    // Treasury transferi başarısız olursa, bu miktarı da holderlara dağıt
                    holdersAmount = sonicReceived;
                }
            } else {
                // Treasury wallet yoksa tüm miktarı holderlara dağıt
                holdersAmount = sonicReceived;
            }
            
            // Kalan %75'i holderlara dağıt
            if (holdersAmount > 0) {
                _processAirdrop(holdersAmount);
            }
        } else {
            // Swap başarısız olursa tokenleri geri ekle
            _pendingAirdropTokens = tempAirdropTokens;
        }
    }

    function _swapTokensForSonic(uint256 tokenAmount) private returns (uint256) {
        if (tokenAmount == 0) return 0;

        // Swap hesaplaması yapılıyor
        (bool success, uint256 expectedSonicOut, ) = _calculateSwapOutput(tokenAmount);
        if (!success || expectedSonicOut == 0) return 0;
        
        // Pair kontratına FARMER tokenları gönder
        super._transfer(address(this), liquidityPair, tokenAmount);
        
        // Pair'ı senkronize et
        try IMetropolisPair(liquidityPair).sync() {} catch {}
        
        // Router'a onayları yenile
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        // Router üzerinden swap yap
        uint256 minAmountOut = expectedSonicOut * (100 - MAX_SLIPPAGE) / 100; // %30 slippage toleransı ile
        
        // Swap için path oluştur: FARMER -> SONIC
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = sonicToken;
        
        uint256 initialSonicBalance = IERC20(sonicToken).balanceOf(address(this));
        
        try metropolisRouter.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            tokenAmount,
            minAmountOut,
            path,
            address(this), // Direkt kontrata gönder
            block.timestamp + 300
        ) {
            // Swap başarılı oldu, alınan SONIC miktarını hesapla
            uint256 finalSonicBalance = IERC20(sonicToken).balanceOf(address(this));
            uint256 received = finalSonicBalance - initialSonicBalance;
            
            if (received > 0) {
                emit SwapSuccessful(tokenAmount, received);
                return received;
            } else {
                emit SwapFailed("No SONIC received after swap");
                return 0;
            }
        } catch Error(string memory reason) {
            emit SwapFailed(string(abi.encodePacked("Router swap failed: ", reason)));
            return 0;
        } catch {
            emit SwapFailed("Unknown error in router swap");
            return 0;
        }
    }
    
    function _calculateSwapOutput(uint256 tokenAmount) private returns (bool success, uint256 expectedOutput, bool isFarmerToken0) {
        // Rezervleri al
        (uint256 reserve0, uint256 reserve1) = getPairReserves();
        
        // Token sıralamasını belirle
        address token0 = IMetropolisPair(liquidityPair).token0();
        isFarmerToken0 = token0 == address(this);
        
        // Farmer ve SONIC için rezervleri ayarla
        uint256 farmerReserve = isFarmerToken0 ? reserve0 : reserve1;
        uint256 sonicReserve = isFarmerToken0 ? reserve1 : reserve0;
        
        if (farmerReserve == 0 || sonicReserve == 0) {
            emit SwapFailed("Insufficient pair reserves");
            return (false, 0, isFarmerToken0);
        }
        
        // Swap'tan beklenen çıktıyı hesapla (0.3% fee ile)
        uint256 amountInWithFee = tokenAmount * 997;
        uint256 numerator = amountInWithFee * sonicReserve;
        uint256 denominator = (farmerReserve * 1000) + amountInWithFee;
        expectedOutput = numerator / denominator;
        
        if (expectedOutput == 0) {
            emit SwapFailed("Calculated output amount is zero");
            return (false, 0, isFarmerToken0);
        }
        
        return (true, expectedOutput, isFarmerToken0);
    }

    function _processAirdrop(uint256 sonicAmount) private {
        if (sonicAmount == 0 || holders.length == 0) return;
        
        uint256 amountPerHolder = sonicAmount / holders.length;
        if (amountPerHolder == 0) return;

        uint256 successfulTransfers = 0;
        uint256 totalDistributed = 0;

        for (uint256 i = 0; i < holders.length && i < 100; i++) {
            if (holders[i] != address(0)) {
                try IERC20(sonicToken).transfer(holders[i], amountPerHolder) {
                    successfulTransfers++;
                    totalDistributed += amountPerHolder;
                } catch {
                    continue;
                }
            }
        }
        
        emit AirdropDistributed(totalDistributed, successfulTransfers);
    }

    // Treasury wallet ayarlama fonksiyonu
    function setTreasuryWallet(address _treasuryWallet) external onlyOwner {
        require(_treasuryWallet != address(0), "Treasury cannot be zero address");
        address oldWallet = treasuryWallet;
        treasuryWallet = _treasuryWallet;
        emit TreasuryWalletUpdated(oldWallet, _treasuryWallet);
    }

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

    // Initial liquidity function (must be called by owner with ETH)
    function addInitialLiquidity(uint256 tokenAmount) external payable onlyOwner {
        require(msg.value > 0, "E8");
        require(tokenAmount > 0, "E9");
        
        require(
            IERC20(address(this)).balanceOf(address(this)) >= tokenAmount,
            "Insufficient token balance in contract"
        );

        _approve(address(this), address(metropolisRouter), tokenAmount);

        try metropolisRouter.addLiquidityETH{value: msg.value}(
            address(this),
            tokenAmount,
            0,
            0,
            msg.sender,
            block.timestamp
        ) {
            // Başarılı
        } catch {
            _approve(address(this), address(metropolisRouter), 0);
            revert("Failed to add liquidity");
        }

        uint256 remainingETH = address(this).balance;
        if (remainingETH > 0) {
            payable(msg.sender).transfer(remainingETH);
        }
    }

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

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

    // Transfer tokens to owner
    function withdrawTokensToOwner(uint256 amount) external onlyOwner {
        require(
            IERC20(address(this)).balanceOf(address(this)) >= amount,
            "Insufficient balance"
        );
        _transfer(address(this), msg.sender, amount);
    }

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

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

    function checkAndRefreshAllowances() external onlyOwner {
        uint256 farmAllowance = IERC20(address(this)).allowance(address(this), address(metropolisRouter));
        if (farmAllowance < TOTAL_SUPPLY) {
            _approve(address(this), address(metropolisRouter), TOTAL_SUPPLY);
        }

        uint256 wethBalance = IERC20(sonicToken).balanceOf(address(this));
        if (wethBalance > 0) {
            uint256 wethAllowance = IERC20(sonicToken).allowance(address(this), address(metropolisRouter));
            if (wethAllowance < wethBalance) {
                IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max);
            }
        }
    }

    // Debug function
    function getSwapInfo() public view returns (uint256, uint256, bool, address) {
        return (
            balanceOf(address(this)),
            IERC20(sonicToken).allowance(address(this), address(metropolisRouter)),
            liquidityPair != address(0),
            liquidityPair
        );
    }

    function getPairReserves() public view returns (uint256 farmReserve, uint256 wethReserve) {
        (uint112 reserve0, uint112 reserve1,) = IMetropolisPair(liquidityPair).getReserves();
        address token0 = IMetropolisPair(liquidityPair).token0();
        if (token0 == address(this)) {
            return (uint256(reserve0), uint256(reserve1));
        }
        return (uint256(reserve1), uint256(reserve0));
    }

    function getMinimumOutputWithSlippage(uint256 amountIn) public view returns (uint256) {
        (uint256 farmReserve, uint256 wethReserve) = getPairReserves();
        if (farmReserve == 0 || wethReserve == 0) return 0;
        
        uint256 amountInWithFee = amountIn * 997; // 0.3% fee
        uint256 numerator = amountInWithFee * wethReserve;
        uint256 denominator = (farmReserve * 1000) + amountInWithFee;
        uint256 amountOut = numerator / denominator;
        
        // Apply slippage tolerance (30%)
        return amountOut * (100 - MAX_SLIPPAGE) / 100;
    }

    // aprov all
    function refreshAllApprovals() external onlyOwner {
        _approve(address(this), address(metropolisRouter), type(uint256).max);
        
        try IERC20(sonicToken).approve(address(metropolisRouter), type(uint256).max) {} catch {}
        
        if (liquidityPair != address(0)) {
            try IERC20(sonicToken).approve(liquidityPair, type(uint256).max) {} catch {}
            try IERC20(address(this)).approve(liquidityPair, type(uint256).max) {} catch {}
        }
    }

    receive() external payable {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"holdersCount","type":"uint256"}],"name":"AirdropDistributed","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":true,"internalType":"address","name":"router","type":"address"},{"indexed":true,"internalType":"address","name":"factory","type":"address"},{"indexed":true,"internalType":"address","name":"sonic","type":"address"}],"name":"ContractInitialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"farmReserve","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"wethReserve","type":"uint256"}],"name":"PairReservesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokensForAirdrop","type":"uint256"}],"name":"ProcessStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"reason","type":"string"}],"name":"SwapFailed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":true,"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":true,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":true,"internalType":"address","name":"treasuryWallet","type":"address"}],"name":"TreasuryTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"TreasuryWalletUpdated","type":"event"},{"inputs":[{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"addInitialLiquidity","outputs":[],"stateMutability":"payable","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":"checkAndRefreshAllowances","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"getMinimumOutputWithSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPairReserves","outputs":[{"internalType":"uint256","name":"farmReserve","type":"uint256"},{"internalType":"uint256","name":"wethReserve","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPendingAirdropTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bool","name":"","type":"bool"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"holders","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isHolder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"processAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refreshAllApprovals","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_router","type":"address"}],"name":"setRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasuryWallet","type":"address"}],"name":"setTreasuryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sonicToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasuryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"triggerProcessing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTokensToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60806040523480156200001157600080fd5b50336040518060400160405280600681526020017f4641524d455200000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4641524d00000000000000000000000000000000000000000000000000000000815250816003908162000090919062000843565b508060049081620000a2919062000843565b5050506001600581905550600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200011f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000116906200098b565b60405180910390fd5b62000130816200038c60201b60201c565b5060007395a7e403d7cf20f675ff9273d66e94d35ba49fa390506000731570300e9cfec66c9fb0c8bc14366c86eb170ad09050600073039e2fb66102314ce7b64ce5ce3e5183bc94ad389050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015620001e75750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b8015620002215750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b62000263576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200025a90620009fd565b60405180910390fd5b82600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003833069d3c21bcecceda10000006200045260201b60201c565b50505062000b29565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004c4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004bb9062000a6f565b60405180910390fd5b620004d860008383620005bf60201b60201c565b8060026000828254620004ec919062000ac0565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200059f919062000b0c565b60405180910390a3620005bb60008383620005c460201b60201c565b5050565b505050565b505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200064b57607f821691505b60208210810362000661576200066062000603565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620006cb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200068c565b620006d786836200068c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620007246200071e6200071884620006ef565b620006f9565b620006ef565b9050919050565b6000819050919050565b620007408362000703565b620007586200074f826200072b565b84845462000699565b825550505050565b600090565b6200076f62000760565b6200077c81848462000735565b505050565b5b81811015620007a4576200079860008262000765565b60018101905062000782565b5050565b601f821115620007f357620007bd8162000667565b620007c8846200067c565b81016020851015620007d8578190505b620007f0620007e7856200067c565b83018262000781565b50505b505050565b600082821c905092915050565b60006200081860001984600802620007f8565b1980831691505092915050565b600062000833838362000805565b9150826002028217905092915050565b6200084e82620005c9565b67ffffffffffffffff8111156200086a5762000869620005d4565b5b62000876825462000632565b62000883828285620007a8565b600060209050601f831160018114620008bb5760008415620008a6578287015190505b620008b2858262000825565b86555062000922565b601f198416620008cb8662000667565b60005b82811015620008f557848901518255600182019150602085019450602081019050620008ce565b8683101562000915578489015162000911601f89168262000805565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f4f31000000000000000000000000000000000000000000000000000000000000600082015250565b6000620009736002836200092a565b915062000980826200093b565b602082019050919050565b60006020820190508181036000830152620009a68162000964565b9050919050565b7f4531000000000000000000000000000000000000000000000000000000000000600082015250565b6000620009e56002836200092a565b9150620009f282620009ad565b602082019050919050565b6000602082019050818103600083015262000a1881620009d6565b9050919050565b7f4533000000000000000000000000000000000000000000000000000000000000600082015250565b600062000a576002836200092a565b915062000a648262000a1f565b602082019050919050565b6000602082019050818103600083015262000a8a8162000a48565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000acd82620006ef565b915062000ada83620006ef565b925082820190508082111562000af55762000af462000a91565b5b92915050565b62000b0681620006ef565b82525050565b600060208201905062000b23600083018462000afb565b92915050565b615b778062000b396000396000f3fe6080604052600436106101fd5760003560e01c80637136982b1161010d578063a9059cbb116100a0578063dd62ed3e1161006f578063dd62ed3e146106f1578063ed9cacfe1461072e578063f2fde38b14610745578063f4ea42de1461076e578063fd7c9fab146107ab57610204565b8063a9059cbb14610637578063c026d93a14610674578063c0d786551461068b578063d4d7b19a146106b457610204565b80638da5cb5b116100dc5780638da5cb5b1461058c57806395d89b41146105b75780639df93f6c146105e2578063a8602fea1461060e57610204565b80637136982b146104f657806379304bec14610521578063808a54571461054a5780638129fc1c1461057557610204565b806341a22cc211610190578063573761981161015f578063573761981461040f5780635d76b04c146104385780635fe8e7cc1461046357806362b6327a1461048e57806370a08231146104b957610204565b806341a22cc214610386578063461a3a95146103a25780634626402b146103cd57806356058261146103f857610204565b806323b872dd116101cc57806323b872dd146102ca5780632a11ced014610307578063313ce56714610344578063397883d21461036f57610204565b806306fdde0314610209578063095ea7b31461023457806318160ddd146102715780631b26c80d1461029c57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e6107d6565b60405161022b91906144e7565b60405180910390f35b34801561024057600080fd5b5061025b600480360381019061025691906145ac565b610868565b6040516102689190614607565b60405180910390f35b34801561027d57600080fd5b50610286610884565b6040516102939190614631565b60405180910390f35b3480156102a857600080fd5b506102b161088e565b6040516102c1949392919061465b565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906146a0565b6109e1565b6040516102fe9190614607565b60405180910390f35b34801561031357600080fd5b5061032e600480360381019061032991906146f3565b610a09565b60405161033b9190614720565b60405180910390f35b34801561035057600080fd5b50610359610a48565b6040516103669190614757565b60405180910390f35b34801561037b57600080fd5b50610384610a51565b005b6103a0600480360381019061039b91906146f3565b610b7a565b005b3480156103ae57600080fd5b506103b7610e5e565b6040516103c49190614720565b60405180910390f35b3480156103d957600080fd5b506103e2610e84565b6040516103ef9190614720565b60405180910390f35b34801561040457600080fd5b5061040d610eaa565b005b34801561041b57600080fd5b50610436600480360381019061043191906145ac565b61121d565b005b34801561044457600080fd5b5061044d61131d565b60405161045a9190614631565b60405180910390f35b34801561046f57600080fd5b50610478611327565b6040516104859190614830565b60405180910390f35b34801561049a57600080fd5b506104a36113b5565b6040516104b091906148b1565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db91906148cc565b6113db565b6040516104ed9190614631565b60405180910390f35b34801561050257600080fd5b5061050b611423565b6040516105189190614631565b60405180910390f35b34801561052d57600080fd5b50610548600480360381019061054391906146f3565b611430565b005b34801561055657600080fd5b5061055f611502565b60405161056c9190614720565b60405180910390f35b34801561058157600080fd5b5061058a611528565b005b34801561059857600080fd5b506105a1611c30565b6040516105ae9190614720565b60405180910390f35b3480156105c357600080fd5b506105cc611c5a565b6040516105d991906144e7565b60405180910390f35b3480156105ee57600080fd5b506105f7611cec565b6040516106059291906148f9565b60405180910390f35b34801561061a57600080fd5b50610635600480360381019061063091906148cc565b611eac565b005b34801561064357600080fd5b5061065e600480360381019061065991906145ac565b611fe9565b60405161066b9190614607565b60405180910390f35b34801561068057600080fd5b50610689612005565b005b34801561069757600080fd5b506106b260048036038101906106ad91906148cc565b612358565b005b3480156106c057600080fd5b506106db60048036038101906106d691906148cc565b612413565b6040516106e89190614607565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190614922565b612433565b6040516107259190614631565b60405180910390f35b34801561073a57600080fd5b506107436124ba565b005b34801561075157600080fd5b5061076c600480360381019061076791906148cc565b6127ec565b005b34801561077a57600080fd5b50610795600480360381019061079091906146f3565b61286f565b6040516107a29190614631565b60405180910390f35b3480156107b757600080fd5b506107c0612921565b6040516107cd9190614983565b60405180910390f35b6060600380546107e5906149cd565b80601f0160208091040260200160405190810160405280929190818152602001828054610811906149cd565b801561085e5780601f106108335761010080835404028352916020019161085e565b820191906000526020600020905b81548152906001019060200180831161084157829003601f168201915b5050505050905090565b600080339050610879818585612947565b600191505092915050565b6000600254905090565b60008060008061089d306113db565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161091c9291906149fe565b602060405180830381865afa158015610939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095d9190614a3c565b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935093509350935090919293565b6000803390506109f2858285612adb565b6109fd858585612b67565b60019150509392505050565b600d8181548110610a1957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b610a596132eb565b6000600e5411610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590614ab5565b60405180910390fd5b6000600d8054905011610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90614b21565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663560582616040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b2e57600080fd5b505af1925050508015610b3f575060015b610b7757600e547f8faa165691120ea9e8f0b47ca56df6cc2c0c3929e407ebf1bca1af937ca3ed9660405160405180910390a2610b78565b5b565b610b826132eb565b60003411610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614b8d565b60405180910390fd5b60008111610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90614bf9565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c429190614720565b602060405180830381865afa158015610c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c839190614a3c565b1015610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90614c8b565b60405180910390fd5b610cf130600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612947565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008033426040518863ffffffff1660e01b8152600401610d5896959493929190614ce6565b60606040518083038185885af193505050508015610d9457506040513d601f19601f82011682018060405250810190610d919190614d47565b60015b610e0157610dc630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612947565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df890614de6565b60405180910390fd5b50505060004790506000811115610e5a573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e58573d6000803e3d6000fd5b505b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260055403610eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee690614e52565b60405180910390fd5b60026005819055506000600e5411610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3390614ab5565b60405180910390fd5b6000600d8054905011610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614b21565b60405180910390fd5b683635c9adc5dea00000600e541015610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990614ebe565b60405180910390fd5b600e547f8faa165691120ea9e8f0b47ca56df6cc2c0c3929e407ebf1bca1af937ca3ed9660405160405180910390a26000600e5490506000600e81905550600061101b82613362565b9050600081111561120957600060646019836110379190614f0d565b6110419190614f7e565b9050600081836110519190614faf565b90506000821180156110b25750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156111eb57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611136929190614fe3565b6020604051808303816000875af192505050801561117257506040513d601f19601f8201168201806040525081019061116f9190615038565b60015b61117e578290506111e6565b50600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16827fa6eefe65b46990724d0b11ebce74cdd26bcaf5268a248780e65997b6c57323e860405160405180910390a35b6111ef565b8290505b6000811115611202576112018161393c565b5b5050611211565b81600e819055505b50506001600581905550565b6112256132eb565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a906150b1565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112b7611c30565b836040518363ffffffff1660e01b81526004016112d5929190614fe3565b6020604051808303816000875af11580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113189190615038565b505050565b6000600e54905090565b6060600d8054806020026020016040519081016040528092919081815260200182805480156113ab57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611361575b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d80549050905090565b6114386132eb565b803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114729190614720565b602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b39190614a3c565b10156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb9061511d565b60405180910390fd5b6114ff303383612b67565b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115306132eb565b600f60009054906101000a900460ff1615611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790615189565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016115ff9291906149fe565b602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164091906151be565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036117d957600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016117559291906149fe565b6020604051808303816000875af1158015611774573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179891906151be565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186190614ab5565b60405180910390fd5b6118b730600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612947565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611956929190614fe3565b6020604051808303816000875af1158015611975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119999190615038565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611a39929190614fe3565b6020604051808303816000875af1925050508015611a7557506040513d601f19601f82011682018060405250810190611a729190615038565b60015b15611a7c57505b3073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611af9929190614fe3565b6020604051808303816000875af1925050508015611b3557506040513d601f19601f82011682018060405250810190611b329190615038565b60015b15611b3c57505b6001600f60006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4ca662a5f1f012e4d740b256559dce10a6b72cdec96be0142f5e2eb49dd37a6e60405160405180910390a4565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611c69906149cd565b80601f0160208091040260200160405190810160405280929190818152602001828054611c95906149cd565b8015611ce25780601f10611cb757610100808354040283529160200191611ce2565b820191906000526020600020905b815481529060010190602001808311611cc557829003601f168201915b5050505050905090565b600080600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d83919061526d565b50915091506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1b91906151be565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e7e57826dffffffffffffffffffffffffffff16826dffffffffffffffffffffffffffff1694509450505050611ea8565b816dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff16945094505050505b9091565b611eb46132eb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a9061530c565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb460405160405180910390a35050565b600080339050611ffa818585612b67565b600191505092915050565b61200d6132eb565b60003073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161206c9291906149fe565b602060405180830381865afa158015612089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ad9190614a3c565b905069d3c21bcecceda10000008110156120f9576120f830600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1669d3c21bcecceda1000000612947565b5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121569190614720565b602060405180830381865afa158015612173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121979190614a3c565b90506000811115612354576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016122239291906149fe565b602060405180830381865afa158015612240573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122649190614a3c565b90508181101561235257600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161230d929190614fe3565b6020604051808303816000875af115801561232c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123509190615038565b505b505b5050565b6123606132eb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690615378565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6124c26132eb565b61250f30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612947565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016125ae929190614fe3565b6020604051808303816000875af19250505080156125ea57506040513d601f19601f820116820180604052508101906125e79190615038565b60015b156125f157505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127ea57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016126e6929190614fe3565b6020604051808303816000875af192505050801561272257506040513d601f19601f8201168201806040525081019061271f9190615038565b60015b1561272957505b3073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016127a6929190614fe3565b6020604051808303816000875af19250505080156127e257506040513d601f19601f820116820180604052508101906127df9190615038565b60015b156127e957505b5b565b6127f46132eb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a906153e4565b60405180910390fd5b61286c81613b4c565b50565b600080600061287c611cec565b91509150600082148061288f5750600081145b1561289f5760009250505061291c565b60006103e5856128af9190614f0d565b9050600082826128bf9190614f0d565b90506000826103e8866128d29190614f0d565b6128dc9190615404565b9050600081836128ec9190614f7e565b90506064601e60646128fe9190614faf565b826129099190614f0d565b6129139190614f7e565b96505050505050505b919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156129b15750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e790615484565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612ace9190614631565b60405180910390a3505050565b6000612ae78484612433565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612b615781811015612b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4a90614ab5565b60405180910390fd5b612b608484848403612947565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612bd15750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906154f0565b60405180910390fd5b612c18611c30565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612c835750612c54611c30565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612cb957503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80612cef57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612d075750600f60009054906101000a900460ff16155b15612d2e57612d17838383613c12565b612d2083613e53565b612d2982613e53565b6132e6565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612dd95750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b905080156132c65760006064600584612df29190614f0d565b612dfc9190614f7e565b905060008184612e0c9190614faf565b9050612e19868683613c12565b612e24863084613c12565b81600e6000828254612e369190615404565b92505081905550683635c9adc5dea00000600e5410158015612e5d57506000600d80549050115b156132bf57612eaf30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612947565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612f4e929190614fe3565b6020604051808303816000875af1925050508015612f8a57506040513d601f19601f82011682018060405250810190612f879190615038565b60015b15612f9157505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461318a57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401613086929190614fe3565b6020604051808303816000875af19250505080156130c257506040513d601f19601f820116820180604052508101906130bf9190615038565b60015b156130c957505b3073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401613146929190614fe3565b6020604051808303816000875af192505050801561318257506040513d601f19601f8201168201806040525081019061317f9190615038565b60015b1561318957505b5b3073ffffffffffffffffffffffffffffffffffffffff1663560582616040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156131d257600080fd5b505af19250505080156131e3575060015b6132bd576131ef61551d565b806308c379a003613275575061320361559f565b8061320e5750613277565b8060405160200161321f91906156b7565b60405160208183030381529060405260405161323b91906156d9565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a2506132b8565b505b60405161328390615762565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a25b6132be565b5b5b50506132d2565b6132d1848484613c12565b5b6132db84613e53565b6132e483613e53565b505b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661330a611c30565b73ffffffffffffffffffffffffffffffffffffffff1614613360576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613357906157c3565b60405180910390fd5b565b60008082036133745760009050613937565b6000806133808461409f565b50915091508115806133925750600081145b156133a257600092505050613937565b6133cf30600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686613c12565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561343957600080fd5b505af192505050801561344a575060015b5061349830600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612947565b60006064601e60646134aa9190614faf565b836134b59190614f0d565b6134bf9190614f7e565b90506000600267ffffffffffffffff8111156134de576134dd61553f565b5b60405190808252806020026020018201604052801561350c5781602001602082028036833780820191505090505b5090503081600081518110613524576135236157e3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613595576135946157e3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161362c9190614720565b602060405180830381865afa158015613649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366d9190614a3c565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958885853061012c426136bf9190615404565b6040518663ffffffff1660e01b81526004016136df959493929190615812565b600060405180830381600087803b1580156136f957600080fd5b505af192505050801561370a575060015b6137f55761371661551d565b806308c379a0036137a5575061372a61559f565b8061373557506137a7565b8060405160200161374691906158b8565b60405160208183030381529060405260405161376291906156d9565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a260009650505050505050613937565b505b6040516137b390615926565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a2600095505050505050613937565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016138529190614720565b602060405180830381865afa15801561386f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138939190614a3c565b9050600082826138a39190614faf565b905060008111156138eb5780897fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc0160405160405180910390a380975050505050505050613937565b6040516138f790615987565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a260009750505050505050505b919050565b600081148061395057506000600d80549050145b613b49576000600d80549050826139679190614f7e565b9050600081036139775750613b49565b60008060005b600d80549050811080156139915750606481105b15613b1657600073ffffffffffffffffffffffffffffffffffffffff16600d82815481106139c2576139c16157e3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b0257600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600d8381548110613a5a57613a596157e3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401613aa3929190614fe3565b6020604051808303816000875af1925050508015613adf57506040513d601f19601f82011682018060405250810190613adc9190615038565b60015b15613b0357508280613af09061599c565b9350508382613aff9190615404565b91505b5b8080613b0e9061599c565b91505061397d565b5081817f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c21760405160405180910390a35050505b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613c7c5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cb2906154f0565b60405180910390fd5b613cc68383836142bd565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4390615a30565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e3a9190614631565b60405180910390a3613e4d8484846142c2565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613edd57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561409c576000613eed826113db565b90506000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905068056bc75e2d631000008210158015613f57575080155b1561401c576001600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614099565b68056bc75e2d63100000821080156140315750805b15614098576000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550614097836142c7565b5b5b50505b50565b60008060008060006140af611cec565b915091506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015614122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061414691906151be565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161493506000846141865782614188565b835b90506000856141975784614199565b835b905060008214806141aa5750600081145b15614200576040516141bb90615a9c565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a26000809750975050505050506142b6565b60006103e58a6142109190614f0d565b9050600082826142209190614f0d565b90506000826103e8866142339190614f0d565b61423d9190615404565b9050808261424b9190614f7e565b995060008a036142a95760405161426190615afd565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a26000809a509a5050505050505050506142b6565b60019a5050505050505050505b9193909250565b505050565b505050565b60005b600d80549050811015614453578173ffffffffffffffffffffffffffffffffffffffff16600d8281548110614302576143016157e3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361444057600d6001600d8054905061435c9190614faf565b8154811061436d5761436c6157e3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d82815481106143ac576143ab6157e3565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d80548061440657614405615b12565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055614453565b808061444b9061599c565b9150506142ca565b5050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614491578082015181840152602081019050614476565b60008484015250505050565b6000601f19601f8301169050919050565b60006144b982614457565b6144c38185614462565b93506144d3818560208601614473565b6144dc8161449d565b840191505092915050565b6000602082019050818103600083015261450181846144ae565b905092915050565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061454382614518565b9050919050565b61455381614538565b811461455e57600080fd5b50565b6000813590506145708161454a565b92915050565b6000819050919050565b61458981614576565b811461459457600080fd5b50565b6000813590506145a681614580565b92915050565b600080604083850312156145c3576145c2614513565b5b60006145d185828601614561565b92505060206145e285828601614597565b9150509250929050565b60008115159050919050565b614601816145ec565b82525050565b600060208201905061461c60008301846145f8565b92915050565b61462b81614576565b82525050565b60006020820190506146466000830184614622565b92915050565b61465581614538565b82525050565b60006080820190506146706000830187614622565b61467d6020830186614622565b61468a60408301856145f8565b614697606083018461464c565b95945050505050565b6000806000606084860312156146b9576146b8614513565b5b60006146c786828701614561565b93505060206146d886828701614561565b92505060406146e986828701614597565b9150509250925092565b60006020828403121561470957614708614513565b5b600061471784828501614597565b91505092915050565b6000602082019050614735600083018461464c565b92915050565b600060ff82169050919050565b6147518161473b565b82525050565b600060208201905061476c6000830184614748565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147a781614538565b82525050565b60006147b9838361479e565b60208301905092915050565b6000602082019050919050565b60006147dd82614772565b6147e7818561477d565b93506147f28361478e565b8060005b8381101561482357815161480a88826147ad565b9750614815836147c5565b9250506001810190506147f6565b5085935050505092915050565b6000602082019050818103600083015261484a81846147d2565b905092915050565b6000819050919050565b600061487761487261486d84614518565b614852565b614518565b9050919050565b60006148898261485c565b9050919050565b600061489b8261487e565b9050919050565b6148ab81614890565b82525050565b60006020820190506148c660008301846148a2565b92915050565b6000602082840312156148e2576148e1614513565b5b60006148f084828501614561565b91505092915050565b600060408201905061490e6000830185614622565b61491b6020830184614622565b9392505050565b6000806040838503121561493957614938614513565b5b600061494785828601614561565b925050602061495885828601614561565b9150509250929050565b600061496d8261487e565b9050919050565b61497d81614962565b82525050565b60006020820190506149986000830184614974565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149e557607f821691505b6020821081036149f8576149f761499e565b5b50919050565b6000604082019050614a13600083018561464c565b614a20602083018461464c565b9392505050565b600081519050614a3681614580565b92915050565b600060208284031215614a5257614a51614513565b5b6000614a6084828501614a27565b91505092915050565b7f4535000000000000000000000000000000000000000000000000000000000000600082015250565b6000614a9f600283614462565b9150614aaa82614a69565b602082019050919050565b60006020820190508181036000830152614ace81614a92565b9050919050565b7f4536000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b0b600283614462565b9150614b1682614ad5565b602082019050919050565b60006020820190508181036000830152614b3a81614afe565b9050919050565b7f4538000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b77600283614462565b9150614b8282614b41565b602082019050919050565b60006020820190508181036000830152614ba681614b6a565b9050919050565b7f4539000000000000000000000000000000000000000000000000000000000000600082015250565b6000614be3600283614462565b9150614bee82614bad565b602082019050919050565b60006020820190508181036000830152614c1281614bd6565b9050919050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520696e20636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000614c75602683614462565b9150614c8082614c19565b604082019050919050565b60006020820190508181036000830152614ca481614c68565b9050919050565b6000819050919050565b6000614cd0614ccb614cc684614cab565b614852565b614576565b9050919050565b614ce081614cb5565b82525050565b600060c082019050614cfb600083018961464c565b614d086020830188614622565b614d156040830187614cd7565b614d226060830186614cd7565b614d2f608083018561464c565b614d3c60a0830184614622565b979650505050505050565b600080600060608486031215614d6057614d5f614513565b5b6000614d6e86828701614a27565b9350506020614d7f86828701614a27565b9250506040614d9086828701614a27565b9150509250925092565b7f4661696c656420746f20616464206c6971756964697479000000000000000000600082015250565b6000614dd0601783614462565b9150614ddb82614d9a565b602082019050919050565b60006020820190508181036000830152614dff81614dc3565b9050919050565b7f5231000000000000000000000000000000000000000000000000000000000000600082015250565b6000614e3c600283614462565b9150614e4782614e06565b602082019050919050565b60006020820190508181036000830152614e6b81614e2f565b9050919050565b7f4537000000000000000000000000000000000000000000000000000000000000600082015250565b6000614ea8600283614462565b9150614eb382614e72565b602082019050919050565b60006020820190508181036000830152614ed781614e9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614f1882614576565b9150614f2383614576565b9250828202614f3181614576565b91508282048414831517614f4857614f47614ede565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f8982614576565b9150614f9483614576565b925082614fa457614fa3614f4f565b5b828204905092915050565b6000614fba82614576565b9150614fc583614576565b9250828203905081811115614fdd57614fdc614ede565b5b92915050565b6000604082019050614ff8600083018561464c565b6150056020830184614622565b9392505050565b615015816145ec565b811461502057600080fd5b50565b6000815190506150328161500c565b92915050565b60006020828403121561504e5761504d614513565b5b600061505c84828501615023565b91505092915050565b7f43616e6e6f7420726573637565204641524d455220746f6b656e730000000000600082015250565b600061509b601b83614462565b91506150a682615065565b602082019050919050565b600060208201905081810360008301526150ca8161508e565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000615107601483614462565b9150615112826150d1565b602082019050919050565b60006020820190508181036000830152615136816150fa565b9050919050565b7f4531000000000000000000000000000000000000000000000000000000000000600082015250565b6000615173600283614462565b915061517e8261513d565b602082019050919050565b600060208201905081810360008301526151a281615166565b9050919050565b6000815190506151b88161454a565b92915050565b6000602082840312156151d4576151d3614513565b5b60006151e2848285016151a9565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b61520e816151eb565b811461521957600080fd5b50565b60008151905061522b81615205565b92915050565b600063ffffffff82169050919050565b61524a81615231565b811461525557600080fd5b50565b60008151905061526781615241565b92915050565b60008060006060848603121561528657615285614513565b5b60006152948682870161521c565b93505060206152a58682870161521c565b92505060406152b686828701615258565b9150509250925092565b7f54726561737572792063616e6e6f74206265207a65726f206164647265737300600082015250565b60006152f6601f83614462565b9150615301826152c0565b602082019050919050565b60006020820190508181036000830152615325816152e9565b9050919050565b7f4531310000000000000000000000000000000000000000000000000000000000600082015250565b6000615362600383614462565b915061536d8261532c565b602082019050919050565b6000602082019050818103600083015261539181615355565b9050919050565b7f4f31000000000000000000000000000000000000000000000000000000000000600082015250565b60006153ce600283614462565b91506153d982615398565b602082019050919050565b600060208201905081810360008301526153fd816153c1565b9050919050565b600061540f82614576565b915061541a83614576565b925082820190508082111561543257615431614ede565b5b92915050565b7f4534000000000000000000000000000000000000000000000000000000000000600082015250565b600061546e600283614462565b915061547982615438565b602082019050919050565b6000602082019050818103600083015261549d81615461565b9050919050565b7f4530000000000000000000000000000000000000000000000000000000000000600082015250565b60006154da600283614462565b91506154e5826154a4565b602082019050919050565b60006020820190508181036000830152615509816154cd565b9050919050565b60008160e01c9050919050565b600060033d111561553c5760046000803e615539600051615510565b90505b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6155778261449d565b810181811067ffffffffffffffff821117156155965761559561553f565b5b80604052505050565b600060443d1061562c576155b1614509565b60043d036004823e80513d602482011167ffffffffffffffff821117156155d957505061562c565b808201805167ffffffffffffffff8111156155f7575050505061562c565b80602083010160043d03850181111561561457505050505061562c565b6156238260200185018661556e565b82955050505050505b90565b600081905092915050565b7f4175746f2070726f63657373206661696c65643a200000000000000000000000600082015250565b600061567060158361562f565b915061567b8261563a565b601582019050919050565b600061569182614457565b61569b818561562f565b93506156ab818560208601614473565b80840191505092915050565b60006156c282615663565b91506156ce8284615686565b915081905092915050565b60006156e58284615686565b915081905092915050565b7f556e6b6e6f776e206572726f7220696e206175746f6d617469632070726f636560008201527f7373696e67000000000000000000000000000000000000000000000000000000602082015250565b600061574c60258361562f565b9150615757826156f0565b602582019050919050565b600061576d8261573f565b9150819050919050565b7f4f32000000000000000000000000000000000000000000000000000000000000600082015250565b60006157ad600283614462565b91506157b882615777565b602082019050919050565b600060208201905081810360008301526157dc816157a0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a0820190506158276000830188614622565b6158346020830187614622565b818103604083015261584681866147d2565b9050615855606083018561464c565b6158626080830184614622565b9695505050505050565b7f526f757465722073776170206661696c65643a20000000000000000000000000600082015250565b60006158a260148361562f565b91506158ad8261586c565b601482019050919050565b60006158c382615895565b91506158cf8284615686565b915081905092915050565b7f556e6b6e6f776e206572726f7220696e20726f75746572207377617000000000600082015250565b6000615910601c8361562f565b915061591b826158da565b601c82019050919050565b600061593182615903565b9150819050919050565b7f4e6f20534f4e4943207265636569766564206166746572207377617000000000600082015250565b6000615971601c8361562f565b915061597c8261593b565b601c82019050919050565b600061599282615964565b9150819050919050565b60006159a782614576565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159d9576159d8614ede565b5b600182019050919050565b7f4532000000000000000000000000000000000000000000000000000000000000600082015250565b6000615a1a600283614462565b9150615a25826159e4565b602082019050919050565b60006020820190508181036000830152615a4981615a0d565b9050919050565b7f496e73756666696369656e742070616972207265736572766573000000000000600082015250565b6000615a86601a8361562f565b9150615a9182615a50565b601a82019050919050565b6000615aa782615a79565b9150819050919050565b7f43616c63756c61746564206f757470757420616d6f756e74206973207a65726f600082015250565b6000615ae760208361562f565b9150615af282615ab1565b602082019050919050565b6000615b0882615ada565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212203cb2f5ac2323bec98f4eeefd1175213b44fdd2362f7a48779654778b44e1b9b564736f6c63430008130033

Deployed Bytecode

0x6080604052600436106101fd5760003560e01c80637136982b1161010d578063a9059cbb116100a0578063dd62ed3e1161006f578063dd62ed3e146106f1578063ed9cacfe1461072e578063f2fde38b14610745578063f4ea42de1461076e578063fd7c9fab146107ab57610204565b8063a9059cbb14610637578063c026d93a14610674578063c0d786551461068b578063d4d7b19a146106b457610204565b80638da5cb5b116100dc5780638da5cb5b1461058c57806395d89b41146105b75780639df93f6c146105e2578063a8602fea1461060e57610204565b80637136982b146104f657806379304bec14610521578063808a54571461054a5780638129fc1c1461057557610204565b806341a22cc211610190578063573761981161015f578063573761981461040f5780635d76b04c146104385780635fe8e7cc1461046357806362b6327a1461048e57806370a08231146104b957610204565b806341a22cc214610386578063461a3a95146103a25780634626402b146103cd57806356058261146103f857610204565b806323b872dd116101cc57806323b872dd146102ca5780632a11ced014610307578063313ce56714610344578063397883d21461036f57610204565b806306fdde0314610209578063095ea7b31461023457806318160ddd146102715780631b26c80d1461029c57610204565b3661020457005b600080fd5b34801561021557600080fd5b5061021e6107d6565b60405161022b91906144e7565b60405180910390f35b34801561024057600080fd5b5061025b600480360381019061025691906145ac565b610868565b6040516102689190614607565b60405180910390f35b34801561027d57600080fd5b50610286610884565b6040516102939190614631565b60405180910390f35b3480156102a857600080fd5b506102b161088e565b6040516102c1949392919061465b565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec91906146a0565b6109e1565b6040516102fe9190614607565b60405180910390f35b34801561031357600080fd5b5061032e600480360381019061032991906146f3565b610a09565b60405161033b9190614720565b60405180910390f35b34801561035057600080fd5b50610359610a48565b6040516103669190614757565b60405180910390f35b34801561037b57600080fd5b50610384610a51565b005b6103a0600480360381019061039b91906146f3565b610b7a565b005b3480156103ae57600080fd5b506103b7610e5e565b6040516103c49190614720565b60405180910390f35b3480156103d957600080fd5b506103e2610e84565b6040516103ef9190614720565b60405180910390f35b34801561040457600080fd5b5061040d610eaa565b005b34801561041b57600080fd5b50610436600480360381019061043191906145ac565b61121d565b005b34801561044457600080fd5b5061044d61131d565b60405161045a9190614631565b60405180910390f35b34801561046f57600080fd5b50610478611327565b6040516104859190614830565b60405180910390f35b34801561049a57600080fd5b506104a36113b5565b6040516104b091906148b1565b60405180910390f35b3480156104c557600080fd5b506104e060048036038101906104db91906148cc565b6113db565b6040516104ed9190614631565b60405180910390f35b34801561050257600080fd5b5061050b611423565b6040516105189190614631565b60405180910390f35b34801561052d57600080fd5b50610548600480360381019061054391906146f3565b611430565b005b34801561055657600080fd5b5061055f611502565b60405161056c9190614720565b60405180910390f35b34801561058157600080fd5b5061058a611528565b005b34801561059857600080fd5b506105a1611c30565b6040516105ae9190614720565b60405180910390f35b3480156105c357600080fd5b506105cc611c5a565b6040516105d991906144e7565b60405180910390f35b3480156105ee57600080fd5b506105f7611cec565b6040516106059291906148f9565b60405180910390f35b34801561061a57600080fd5b50610635600480360381019061063091906148cc565b611eac565b005b34801561064357600080fd5b5061065e600480360381019061065991906145ac565b611fe9565b60405161066b9190614607565b60405180910390f35b34801561068057600080fd5b50610689612005565b005b34801561069757600080fd5b506106b260048036038101906106ad91906148cc565b612358565b005b3480156106c057600080fd5b506106db60048036038101906106d691906148cc565b612413565b6040516106e89190614607565b60405180910390f35b3480156106fd57600080fd5b5061071860048036038101906107139190614922565b612433565b6040516107259190614631565b60405180910390f35b34801561073a57600080fd5b506107436124ba565b005b34801561075157600080fd5b5061076c600480360381019061076791906148cc565b6127ec565b005b34801561077a57600080fd5b50610795600480360381019061079091906146f3565b61286f565b6040516107a29190614631565b60405180910390f35b3480156107b757600080fd5b506107c0612921565b6040516107cd9190614983565b60405180910390f35b6060600380546107e5906149cd565b80601f0160208091040260200160405190810160405280929190818152602001828054610811906149cd565b801561085e5780601f106108335761010080835404028352916020019161085e565b820191906000526020600020905b81548152906001019060200180831161084157829003601f168201915b5050505050905090565b600080339050610879818585612947565b600191505092915050565b6000600254905090565b60008060008061089d306113db565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161091c9291906149fe565b602060405180830381865afa158015610939573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095d9190614a3c565b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16935093509350935090919293565b6000803390506109f2858285612adb565b6109fd858585612b67565b60019150509392505050565b600d8181548110610a1957600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60006012905090565b610a596132eb565b6000600e5411610a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9590614ab5565b60405180910390fd5b6000600d8054905011610ae6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610add90614b21565b60405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff1663560582616040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610b2e57600080fd5b505af1925050508015610b3f575060015b610b7757600e547f8faa165691120ea9e8f0b47ca56df6cc2c0c3929e407ebf1bca1af937ca3ed9660405160405180910390a2610b78565b5b565b610b826132eb565b60003411610bc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbc90614b8d565b60405180910390fd5b60008111610c08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bff90614bf9565b60405180910390fd5b803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610c429190614720565b602060405180830381865afa158015610c5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c839190614a3c565b1015610cc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cbb90614c8b565b60405180910390fd5b610cf130600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683612947565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f305d71934308460008033426040518863ffffffff1660e01b8152600401610d5896959493929190614ce6565b60606040518083038185885af193505050508015610d9457506040513d601f19601f82011682018060405250810190610d919190614d47565b60015b610e0157610dc630600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166000612947565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df890614de6565b60405180910390fd5b50505060004790506000811115610e5a573373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e58573d6000803e3d6000fd5b505b5050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600260055403610eef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee690614e52565b60405180910390fd5b60026005819055506000600e5411610f3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3390614ab5565b60405180910390fd5b6000600d8054905011610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614b21565b60405180910390fd5b683635c9adc5dea00000600e541015610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc990614ebe565b60405180910390fd5b600e547f8faa165691120ea9e8f0b47ca56df6cc2c0c3929e407ebf1bca1af937ca3ed9660405160405180910390a26000600e5490506000600e81905550600061101b82613362565b9050600081111561120957600060646019836110379190614f0d565b6110419190614f7e565b9050600081836110519190614faf565b90506000821180156110b25750600073ffffffffffffffffffffffffffffffffffffffff16600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b156111eb57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401611136929190614fe3565b6020604051808303816000875af192505050801561117257506040513d601f19601f8201168201806040525081019061116f9190615038565b60015b61117e578290506111e6565b50600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16827fa6eefe65b46990724d0b11ebce74cdd26bcaf5268a248780e65997b6c57323e860405160405180910390a35b6111ef565b8290505b6000811115611202576112018161393c565b5b5050611211565b81600e819055505b50506001600581905550565b6112256132eb565b3073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611293576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128a906150b1565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb6112b7611c30565b836040518363ffffffff1660e01b81526004016112d5929190614fe3565b6020604051808303816000875af11580156112f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113189190615038565b505050565b6000600e54905090565b6060600d8054806020026020016040519081016040528092919081815260200182805480156113ab57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311611361575b5050505050905090565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600d80549050905090565b6114386132eb565b803073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016114729190614720565b602060405180830381865afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b39190614a3c565b10156114f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114eb9061511d565b60405180910390fd5b6114ff303383612b67565b50565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6115306132eb565b600f60009054906101000a900460ff1615611580576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157790615189565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663e6a4390530600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016115ff9291906149fe565b602060405180830381865afa15801561161c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061164091906151be565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036117d957600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016117559291906149fe565b6020604051808303816000875af1158015611774573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061179891906151be565b600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186190614ab5565b60405180910390fd5b6118b730600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612947565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611956929190614fe3565b6020604051808303816000875af1158015611975573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119999190615038565b50600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611a39929190614fe3565b6020604051808303816000875af1925050508015611a7557506040513d601f19601f82011682018060405250810190611a729190615038565b60015b15611a7c57505b3073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401611af9929190614fe3565b6020604051808303816000875af1925050508015611b3557506040513d601f19601f82011682018060405250810190611b329190615038565b60015b15611b3c57505b6001600f60006101000a81548160ff021916908315150217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f4ca662a5f1f012e4d740b256559dce10a6b72cdec96be0142f5e2eb49dd37a6e60405160405180910390a4565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611c69906149cd565b80601f0160208091040260200160405190810160405280929190818152602001828054611c95906149cd565b8015611ce25780601f10611cb757610100808354040283529160200191611ce2565b820191906000526020600020905b815481529060010190602001808311611cc557829003601f168201915b5050505050905090565b600080600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611d5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d83919061526d565b50915091506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015611df7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1b91906151be565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611e7e57826dffffffffffffffffffffffffffff16826dffffffffffffffffffffffffffff1694509450505050611ea8565b816dffffffffffffffffffffffffffff16836dffffffffffffffffffffffffffff16945094505050505b9091565b611eb46132eb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1a9061530c565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fa982575859d7ad2f390dc12b23f7dab8bbda047f9d0140ac68344b27bf34bfb460405160405180910390a35050565b600080339050611ffa818585612b67565b600191505092915050565b61200d6132eb565b60003073ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b815260040161206c9291906149fe565b602060405180830381865afa158015612089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ad9190614a3c565b905069d3c21bcecceda10000008110156120f9576120f830600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1669d3c21bcecceda1000000612947565b5b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016121569190614720565b602060405180830381865afa158015612173573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121979190614a3c565b90506000811115612354576000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dd62ed3e30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016122239291906149fe565b602060405180830381865afa158015612240573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122649190614a3c565b90508181101561235257600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b815260040161230d929190614fe3565b6020604051808303816000875af115801561232c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123509190615038565b505b505b5050565b6123606132eb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690615378565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c6020528060005260406000206000915054906101000a900460ff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6124c26132eb565b61250f30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612947565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016125ae929190614fe3565b6020604051808303816000875af19250505080156125ea57506040513d601f19601f820116820180604052508101906125e79190615038565b60015b156125f157505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146127ea57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016126e6929190614fe3565b6020604051808303816000875af192505050801561272257506040513d601f19601f8201168201806040525081019061271f9190615038565b60015b1561272957505b3073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016127a6929190614fe3565b6020604051808303816000875af19250505080156127e257506040513d601f19601f820116820180604052508101906127df9190615038565b60015b156127e957505b5b565b6127f46132eb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612863576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285a906153e4565b60405180910390fd5b61286c81613b4c565b50565b600080600061287c611cec565b91509150600082148061288f5750600081145b1561289f5760009250505061291c565b60006103e5856128af9190614f0d565b9050600082826128bf9190614f0d565b90506000826103e8866128d29190614f0d565b6128dc9190615404565b9050600081836128ec9190614f7e565b90506064601e60646128fe9190614faf565b826129099190614f0d565b6129139190614f7e565b96505050505050505b919050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156129b15750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b6129f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e790615484565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92583604051612ace9190614631565b60405180910390a3505050565b6000612ae78484612433565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114612b615781811015612b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b4a90614ab5565b60405180910390fd5b612b608484848403612947565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015612bd15750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b612c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c07906154f0565b60405180910390fd5b612c18611c30565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612c835750612c54611c30565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612cb957503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b80612cef57503073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80612d075750600f60009054906101000a900460ff16155b15612d2e57612d17838383613c12565b612d2083613e53565b612d2982613e53565b6132e6565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612dd95750600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16145b905080156132c65760006064600584612df29190614f0d565b612dfc9190614f7e565b905060008184612e0c9190614faf565b9050612e19868683613c12565b612e24863084613c12565b81600e6000828254612e369190615404565b92505081905550683635c9adc5dea00000600e5410158015612e5d57506000600d80549050115b156132bf57612eaf30600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612947565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401612f4e929190614fe3565b6020604051808303816000875af1925050508015612f8a57506040513d601f19601f82011682018060405250810190612f879190615038565b60015b15612f9157505b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461318a57600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401613086929190614fe3565b6020604051808303816000875af19250505080156130c257506040513d601f19601f820116820180604052508101906130bf9190615038565b60015b156130c957505b3073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401613146929190614fe3565b6020604051808303816000875af192505050801561318257506040513d601f19601f8201168201806040525081019061317f9190615038565b60015b1561318957505b5b3073ffffffffffffffffffffffffffffffffffffffff1663560582616040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156131d257600080fd5b505af19250505080156131e3575060015b6132bd576131ef61551d565b806308c379a003613275575061320361559f565b8061320e5750613277565b8060405160200161321f91906156b7565b60405160208183030381529060405260405161323b91906156d9565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a2506132b8565b505b60405161328390615762565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a25b6132be565b5b5b50506132d2565b6132d1848484613c12565b5b6132db84613e53565b6132e483613e53565b505b505050565b3373ffffffffffffffffffffffffffffffffffffffff1661330a611c30565b73ffffffffffffffffffffffffffffffffffffffff1614613360576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613357906157c3565b60405180910390fd5b565b60008082036133745760009050613937565b6000806133808461409f565b50915091508115806133925750600081145b156133a257600092505050613937565b6133cf30600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1686613c12565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663fff6cae96040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561343957600080fd5b505af192505050801561344a575060015b5061349830600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff612947565b60006064601e60646134aa9190614faf565b836134b59190614f0d565b6134bf9190614f7e565b90506000600267ffffffffffffffff8111156134de576134dd61553f565b5b60405190808252806020026020018201604052801561350c5781602001602082028036833780820191505090505b5090503081600081518110613524576135236157e3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613595576135946157e3565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250506000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161362c9190614720565b602060405180830381865afa158015613649573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061366d9190614a3c565b9050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635c11d7958885853061012c426136bf9190615404565b6040518663ffffffff1660e01b81526004016136df959493929190615812565b600060405180830381600087803b1580156136f957600080fd5b505af192505050801561370a575060015b6137f55761371661551d565b806308c379a0036137a5575061372a61559f565b8061373557506137a7565b8060405160200161374691906158b8565b60405160208183030381529060405260405161376291906156d9565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a260009650505050505050613937565b505b6040516137b390615926565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a2600095505050505050613937565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016138529190614720565b602060405180830381865afa15801561386f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138939190614a3c565b9050600082826138a39190614faf565b905060008111156138eb5780897fdd819f6d4da11821175805e17c46b8094c817290420e3de00dee96b4d256dc0160405160405180910390a380975050505050505050613937565b6040516138f790615987565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a260009750505050505050505b919050565b600081148061395057506000600d80549050145b613b49576000600d80549050826139679190614f7e565b9050600081036139775750613b49565b60008060005b600d80549050811080156139915750606481105b15613b1657600073ffffffffffffffffffffffffffffffffffffffff16600d82815481106139c2576139c16157e3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614613b0257600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600d8381548110613a5a57613a596157e3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866040518363ffffffff1660e01b8152600401613aa3929190614fe3565b6020604051808303816000875af1925050508015613adf57506040513d601f19601f82011682018060405250810190613adc9190615038565b60015b15613b0357508280613af09061599c565b9350508382613aff9190615404565b91505b5b8080613b0e9061599c565b91505061397d565b5081817f6570e65a772d8d30d76e42c8d07c41bf88b28ecf39ca57095a61b4a76584c21760405160405180910390a35050505b50565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614158015613c7c5750600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614155b613cbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613cb2906154f0565b60405180910390fd5b613cc68383836142bd565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015613d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613d4390615a30565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051613e3a9190614631565b60405180910390a3613e4d8484846142c2565b50505050565b600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614158015613edd57503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b1561409c576000613eed826113db565b90506000600c60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905068056bc75e2d631000008210158015613f57575080155b1561401c576001600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600d839080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550614099565b68056bc75e2d63100000821080156140315750805b15614098576000600c60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550614097836142c7565b5b5b50505b50565b60008060008060006140af611cec565b915091506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630dfe16816040518163ffffffff1660e01b8152600401602060405180830381865afa158015614122573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061414691906151be565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161493506000846141865782614188565b835b90506000856141975784614199565b835b905060008214806141aa5750600081145b15614200576040516141bb90615a9c565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a26000809750975050505050506142b6565b60006103e58a6142109190614f0d565b9050600082826142209190614f0d565b90506000826103e8866142339190614f0d565b61423d9190615404565b9050808261424b9190614f7e565b995060008a036142a95760405161426190615afd565b60405180910390207f4ecb9b6d2e2efee3f1b1b86927f5895fc3f627ac91d5ebfe344df8ae1eec072360405160405180910390a26000809a509a5050505050505050506142b6565b60019a5050505050505050505b9193909250565b505050565b505050565b60005b600d80549050811015614453578173ffffffffffffffffffffffffffffffffffffffff16600d8281548110614302576143016157e3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361444057600d6001600d8054905061435c9190614faf565b8154811061436d5761436c6157e3565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600d82815481106143ac576143ab6157e3565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600d80548061440657614405615b12565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690559055614453565b808061444b9061599c565b9150506142ca565b5050565b600081519050919050565b600082825260208201905092915050565b60005b83811015614491578082015181840152602081019050614476565b60008484015250505050565b6000601f19601f8301169050919050565b60006144b982614457565b6144c38185614462565b93506144d3818560208601614473565b6144dc8161449d565b840191505092915050565b6000602082019050818103600083015261450181846144ae565b905092915050565b6000604051905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061454382614518565b9050919050565b61455381614538565b811461455e57600080fd5b50565b6000813590506145708161454a565b92915050565b6000819050919050565b61458981614576565b811461459457600080fd5b50565b6000813590506145a681614580565b92915050565b600080604083850312156145c3576145c2614513565b5b60006145d185828601614561565b92505060206145e285828601614597565b9150509250929050565b60008115159050919050565b614601816145ec565b82525050565b600060208201905061461c60008301846145f8565b92915050565b61462b81614576565b82525050565b60006020820190506146466000830184614622565b92915050565b61465581614538565b82525050565b60006080820190506146706000830187614622565b61467d6020830186614622565b61468a60408301856145f8565b614697606083018461464c565b95945050505050565b6000806000606084860312156146b9576146b8614513565b5b60006146c786828701614561565b93505060206146d886828701614561565b92505060406146e986828701614597565b9150509250925092565b60006020828403121561470957614708614513565b5b600061471784828501614597565b91505092915050565b6000602082019050614735600083018461464c565b92915050565b600060ff82169050919050565b6147518161473b565b82525050565b600060208201905061476c6000830184614748565b92915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6147a781614538565b82525050565b60006147b9838361479e565b60208301905092915050565b6000602082019050919050565b60006147dd82614772565b6147e7818561477d565b93506147f28361478e565b8060005b8381101561482357815161480a88826147ad565b9750614815836147c5565b9250506001810190506147f6565b5085935050505092915050565b6000602082019050818103600083015261484a81846147d2565b905092915050565b6000819050919050565b600061487761487261486d84614518565b614852565b614518565b9050919050565b60006148898261485c565b9050919050565b600061489b8261487e565b9050919050565b6148ab81614890565b82525050565b60006020820190506148c660008301846148a2565b92915050565b6000602082840312156148e2576148e1614513565b5b60006148f084828501614561565b91505092915050565b600060408201905061490e6000830185614622565b61491b6020830184614622565b9392505050565b6000806040838503121561493957614938614513565b5b600061494785828601614561565b925050602061495885828601614561565b9150509250929050565b600061496d8261487e565b9050919050565b61497d81614962565b82525050565b60006020820190506149986000830184614974565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806149e557607f821691505b6020821081036149f8576149f761499e565b5b50919050565b6000604082019050614a13600083018561464c565b614a20602083018461464c565b9392505050565b600081519050614a3681614580565b92915050565b600060208284031215614a5257614a51614513565b5b6000614a6084828501614a27565b91505092915050565b7f4535000000000000000000000000000000000000000000000000000000000000600082015250565b6000614a9f600283614462565b9150614aaa82614a69565b602082019050919050565b60006020820190508181036000830152614ace81614a92565b9050919050565b7f4536000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b0b600283614462565b9150614b1682614ad5565b602082019050919050565b60006020820190508181036000830152614b3a81614afe565b9050919050565b7f4538000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b77600283614462565b9150614b8282614b41565b602082019050919050565b60006020820190508181036000830152614ba681614b6a565b9050919050565b7f4539000000000000000000000000000000000000000000000000000000000000600082015250565b6000614be3600283614462565b9150614bee82614bad565b602082019050919050565b60006020820190508181036000830152614c1281614bd6565b9050919050565b7f496e73756666696369656e7420746f6b656e2062616c616e636520696e20636f60008201527f6e74726163740000000000000000000000000000000000000000000000000000602082015250565b6000614c75602683614462565b9150614c8082614c19565b604082019050919050565b60006020820190508181036000830152614ca481614c68565b9050919050565b6000819050919050565b6000614cd0614ccb614cc684614cab565b614852565b614576565b9050919050565b614ce081614cb5565b82525050565b600060c082019050614cfb600083018961464c565b614d086020830188614622565b614d156040830187614cd7565b614d226060830186614cd7565b614d2f608083018561464c565b614d3c60a0830184614622565b979650505050505050565b600080600060608486031215614d6057614d5f614513565b5b6000614d6e86828701614a27565b9350506020614d7f86828701614a27565b9250506040614d9086828701614a27565b9150509250925092565b7f4661696c656420746f20616464206c6971756964697479000000000000000000600082015250565b6000614dd0601783614462565b9150614ddb82614d9a565b602082019050919050565b60006020820190508181036000830152614dff81614dc3565b9050919050565b7f5231000000000000000000000000000000000000000000000000000000000000600082015250565b6000614e3c600283614462565b9150614e4782614e06565b602082019050919050565b60006020820190508181036000830152614e6b81614e2f565b9050919050565b7f4537000000000000000000000000000000000000000000000000000000000000600082015250565b6000614ea8600283614462565b9150614eb382614e72565b602082019050919050565b60006020820190508181036000830152614ed781614e9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614f1882614576565b9150614f2383614576565b9250828202614f3181614576565b91508282048414831517614f4857614f47614ede565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f8982614576565b9150614f9483614576565b925082614fa457614fa3614f4f565b5b828204905092915050565b6000614fba82614576565b9150614fc583614576565b9250828203905081811115614fdd57614fdc614ede565b5b92915050565b6000604082019050614ff8600083018561464c565b6150056020830184614622565b9392505050565b615015816145ec565b811461502057600080fd5b50565b6000815190506150328161500c565b92915050565b60006020828403121561504e5761504d614513565b5b600061505c84828501615023565b91505092915050565b7f43616e6e6f7420726573637565204641524d455220746f6b656e730000000000600082015250565b600061509b601b83614462565b91506150a682615065565b602082019050919050565b600060208201905081810360008301526150ca8161508e565b9050919050565b7f496e73756666696369656e742062616c616e6365000000000000000000000000600082015250565b6000615107601483614462565b9150615112826150d1565b602082019050919050565b60006020820190508181036000830152615136816150fa565b9050919050565b7f4531000000000000000000000000000000000000000000000000000000000000600082015250565b6000615173600283614462565b915061517e8261513d565b602082019050919050565b600060208201905081810360008301526151a281615166565b9050919050565b6000815190506151b88161454a565b92915050565b6000602082840312156151d4576151d3614513565b5b60006151e2848285016151a9565b91505092915050565b60006dffffffffffffffffffffffffffff82169050919050565b61520e816151eb565b811461521957600080fd5b50565b60008151905061522b81615205565b92915050565b600063ffffffff82169050919050565b61524a81615231565b811461525557600080fd5b50565b60008151905061526781615241565b92915050565b60008060006060848603121561528657615285614513565b5b60006152948682870161521c565b93505060206152a58682870161521c565b92505060406152b686828701615258565b9150509250925092565b7f54726561737572792063616e6e6f74206265207a65726f206164647265737300600082015250565b60006152f6601f83614462565b9150615301826152c0565b602082019050919050565b60006020820190508181036000830152615325816152e9565b9050919050565b7f4531310000000000000000000000000000000000000000000000000000000000600082015250565b6000615362600383614462565b915061536d8261532c565b602082019050919050565b6000602082019050818103600083015261539181615355565b9050919050565b7f4f31000000000000000000000000000000000000000000000000000000000000600082015250565b60006153ce600283614462565b91506153d982615398565b602082019050919050565b600060208201905081810360008301526153fd816153c1565b9050919050565b600061540f82614576565b915061541a83614576565b925082820190508082111561543257615431614ede565b5b92915050565b7f4534000000000000000000000000000000000000000000000000000000000000600082015250565b600061546e600283614462565b915061547982615438565b602082019050919050565b6000602082019050818103600083015261549d81615461565b9050919050565b7f4530000000000000000000000000000000000000000000000000000000000000600082015250565b60006154da600283614462565b91506154e5826154a4565b602082019050919050565b60006020820190508181036000830152615509816154cd565b9050919050565b60008160e01c9050919050565b600060033d111561553c5760046000803e615539600051615510565b90505b90565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6155778261449d565b810181811067ffffffffffffffff821117156155965761559561553f565b5b80604052505050565b600060443d1061562c576155b1614509565b60043d036004823e80513d602482011167ffffffffffffffff821117156155d957505061562c565b808201805167ffffffffffffffff8111156155f7575050505061562c565b80602083010160043d03850181111561561457505050505061562c565b6156238260200185018661556e565b82955050505050505b90565b600081905092915050565b7f4175746f2070726f63657373206661696c65643a200000000000000000000000600082015250565b600061567060158361562f565b915061567b8261563a565b601582019050919050565b600061569182614457565b61569b818561562f565b93506156ab818560208601614473565b80840191505092915050565b60006156c282615663565b91506156ce8284615686565b915081905092915050565b60006156e58284615686565b915081905092915050565b7f556e6b6e6f776e206572726f7220696e206175746f6d617469632070726f636560008201527f7373696e67000000000000000000000000000000000000000000000000000000602082015250565b600061574c60258361562f565b9150615757826156f0565b602582019050919050565b600061576d8261573f565b9150819050919050565b7f4f32000000000000000000000000000000000000000000000000000000000000600082015250565b60006157ad600283614462565b91506157b882615777565b602082019050919050565b600060208201905081810360008301526157dc816157a0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060a0820190506158276000830188614622565b6158346020830187614622565b818103604083015261584681866147d2565b9050615855606083018561464c565b6158626080830184614622565b9695505050505050565b7f526f757465722073776170206661696c65643a20000000000000000000000000600082015250565b60006158a260148361562f565b91506158ad8261586c565b601482019050919050565b60006158c382615895565b91506158cf8284615686565b915081905092915050565b7f556e6b6e6f776e206572726f7220696e20726f75746572207377617000000000600082015250565b6000615910601c8361562f565b915061591b826158da565b601c82019050919050565b600061593182615903565b9150819050919050565b7f4e6f20534f4e4943207265636569766564206166746572207377617000000000600082015250565b6000615971601c8361562f565b915061597c8261593b565b601c82019050919050565b600061599282615964565b9150819050919050565b60006159a782614576565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036159d9576159d8614ede565b5b600182019050919050565b7f4532000000000000000000000000000000000000000000000000000000000000600082015250565b6000615a1a600283614462565b9150615a25826159e4565b602082019050919050565b60006020820190508181036000830152615a4981615a0d565b9050919050565b7f496e73756666696369656e742070616972207265736572766573000000000000600082015250565b6000615a86601a8361562f565b9150615a9182615a50565b601a82019050919050565b6000615aa782615a79565b9150819050919050565b7f43616c63756c61746564206f757470757420616d6f756e74206973207a65726f600082015250565b6000615ae760208361562f565b9150615af282615ab1565b602082019050919050565b6000615b0882615ada565b9150819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212203cb2f5ac2323bec98f4eeefd1175213b44fdd2362f7a48779654778b44e1b9b564736f6c63430008130033

Deployed Bytecode Sourcemap

8424:18818:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2882:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3749:190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3176:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25336:308;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;3947:250;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9359:24;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3084:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24296:310;;;;;;;;;;;;;:::i;:::-;;22411:963;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9183:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9250:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15642:1749;;;;;;;;;;;;;:::i;:::-;;23557:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24123:114;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22237:96;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9085:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3283:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22127:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23806:266;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9215:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10868:1013;;;;;;;;;;;;;:::i;:::-;;1861:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2981:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25652:427;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;21780:316;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3409:182;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24614:691;;;;;;;;;;;;;:::i;:::-;;23382:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9312:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3599:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26708:494;;;;;;;;;;;;;:::i;:::-;;2064:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26087:595;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9133:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2882:91;2927:13;2960:5;2953:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2882:91;:::o;3749:190::-;3823:4;3840:13;3856:10;3840:26;;3877:32;3886:5;3893:7;3902:6;3877:8;:32::i;:::-;3927:4;3920:11;;;3749:190;;;;:::o;3176:99::-;3228:7;3255:12;;3248:19;;3176:99;:::o;25336:308::-;25380:7;25389;25398:4;25404:7;25446:24;25464:4;25446:9;:24::i;:::-;25492:10;;;;;;;;;;;25485:28;;;25522:4;25537:16;;;;;;;;;;;25485:70;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25595:1;25570:27;;:13;;;;;;;;;;;:27;;;;25612:13;;;;;;;;;;;25424:212;;;;;;;;25336:308;;;;:::o;3947:250::-;4035:4;4052:15;4070:10;4052:28;;4091:38;4107:4;4113:7;4122:6;4091:15;:38::i;:::-;4140:27;4150:4;4156:2;4160:6;4140:9;:27::i;:::-;4185:4;4178:11;;;3947:250;;;;;:::o;9359:24::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3084:84::-;3133:5;3158:2;3151:9;;3084:84;:::o;24296:310::-;1820:13;:11;:13::i;:::-;24387:1:::1;24363:21;;:25;24355:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;24431:1;24414:7;:14;;;;:18;24406:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;24454:4;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;24450:149;;24565:21;;24550:37;;;;;;;;;;24450:149;;;;24296:310::o:0;22411:963::-;1820:13;:11;:13::i;:::-;22519:1:::1;22507:9;:13;22499:28;;;;;;;;;;;;:::i;:::-;;;;;;;;;22560:1;22546:11;:15;22538:30;;;;;;;;;;;;:::i;:::-;;;;;;;;;22661:11;22626:4;22611:31;;;22651:4;22611:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:61;;22589:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;22751:63;22768:4;22783:16;;;;;;;;;;;22802:11;22751:8;:63::i;:::-;22831:16;;;;;;;;;;;:32;;;22871:9;22904:4;22924:11;22950:1;22966::::0;22982:10:::1;23007:15;22831:202;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;22827:382;;23096:53;23113:4;23128:16;;;;;;;;;;;23147:1;23096:8;:53::i;:::-;23164:33;;;;;;;;;;:::i;:::-;;;;;;;;22827:382;;;;23221:20;23244:21;23221:44;;23295:1;23280:12;:16;23276:91;;;23321:10;23313:28;;:42;23342:12;23313:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;23276:91;22488:886;22411:963:::0;:::o;9183:25::-;;;;;;;;;;;;;:::o;9250:29::-;;;;;;;;;;;;;:::o;15642:1749::-;1114:1;1260:7;;:19;1252:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;1114:1;1297:7;:18;;;;15733:1:::1;15709:21;;:25;15701:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;15777:1;15760:7;:14;;;;:18;15752:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;8769:13;15804:21;;:47;;15796:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;15899:21;;15884:37;;;;;;;;;;15968:25;15996:21;;15968:49;;16052:1;16028:21;:25;;;;16108:21;16132:38;16152:17;16132:19;:38::i;:::-;16108:62;;16239:1;16223:13;:17;16219:1165;;;16298:22;16363:3;8949:2;16324:13;:35;;;;:::i;:::-;16323:43;;;;:::i;:::-;16298:68;;16381:21;16421:14;16405:13;:30;;;;:::i;:::-;16381:54;;16521:1;16504:14;:18;:50;;;;;16552:1;16526:28;;:14;;;;;;;;;;;:28;;;;16504:50;16500:575;;;16586:10;;;;;;;;;;;16579:27;;;16607:14;;;;;;;;;;;16623;16579:59;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;16575:340;;16882:13;16866:29;;16575:340;;;;16703:14;;;;;;;;;;;16667:51;;16687:14;16667:51;;;;;;;;;;16575:340;16500:575;;;17046:13;17030:29;;16500:575;17170:1;17154:13;:17;17150:88;;;17192:30;17208:13;17192:15;:30::i;:::-;17150:88;16242:1007;;16219:1165;;;17355:17;17331:21;:41;;;;16219:1165;15690:1701;;1070:1:::0;1338:7;:22;;;;15642:1749::o;23557:208::-;1820:13;:11;:13::i;:::-;23668:4:::1;23650:23;;:6;:23;;::::0;23642:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23723:6;23716:23;;;23740:7;:5;:7::i;:::-;23749;23716:41;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;23557:208:::0;;:::o;24123:114::-;24181:7;24208:21;;24201:28;;24123:114;:::o;22237:96::-;22282:16;22318:7;22311:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22237:96;:::o;9085:41::-;;;;;;;;;;;;;:::o;3283:118::-;3348:7;3375:9;:18;3385:7;3375:18;;;;;;;;;;;;;;;;3368:25;;3283:118;;;:::o;22127:98::-;22176:7;22203;:14;;;;22196:21;;22127:98;:::o;23806:266::-;1820:13;:11;:13::i;:::-;23955:6:::1;23920:4;23905:31;;;23945:4;23905:46;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;23883:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;24020:44;24038:4;24045:10;24057:6;24020:9;:44::i;:::-;23806:266:::0;:::o;9215:28::-;;;;;;;;;;;;;:::o;10868:1013::-;1820:13;:11;:13::i;:::-;10929:12:::1;;;;;;;;;;;10928:13;10920:28;;;;;;;;;;;;:::i;:::-;;;;;;;;;11028:17;;;;;;;;;;;:25;;;11062:4;11069:10;;;;;;;;;;;11028:52;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11012:13;;:68;;;;;;;;;;;;;;;;;;11175:1;11150:27;;:13;;;;;;;;;;;:27;;::::0;11146:131:::1;;11210:17;;;;;;;;;;;:28;;;11247:4;11254:10;;;;;;;;;;;11210:55;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11194:13;;:71;;;;;;;;;;;;;;;;;;11146:131;11330:1;11305:27;;:13;;;;;;;;;;;:27;;::::0;11297:42:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11394:69;11411:4;11426:16;;;;;;;;;;;11445:17;11394:8;:69::i;:::-;11481:10;;;;;;;;;;;11474:26;;;11509:16;;;;;;;;;;;11528:17;11474:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;11578:10;;;;;;;;;;;11571:26;;;11598:13;;;;;;;;;;;11613:17;11571:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11567:76:::0;::::1;;;;11672:4;11657:29;;;11687:13;;;;;;;;;;;11702:17;11657:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11653:79:::0;::::1;;;;11767:4;11752:12;;:19;;;;;;;;;;;;;;;;;;11862:10;;;;;;;;;;;11787:86;;11842:17;;;;;;;;;;;11787:86;;11815:16;;;;;;;;;;;11787:86;;;;;;;;;;;;10868:1013::o:0;1861:87::-;1907:7;1934:6;;;;;;;;;;;1927:13;;1861:87;:::o;2981:95::-;3028:13;3061:7;3054:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2981:95;:::o;25652:427::-;25700:19;25721;25754:16;25772;25809:13;;;;;;;;;;;25793:42;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25753:84;;;;;25848:14;25881:13;;;;;;;;;;;25865:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25848:56;;25937:4;25919:23;;:6;:23;;;25915:101;;25975:8;25967:17;;25994:8;25986:17;;25959:45;;;;;;;;;25915:101;26042:8;26034:17;;26061:8;26053:17;;26026:45;;;;;;;25652:427;;;:::o;21780:316::-;1820:13;:11;:13::i;:::-;21897:1:::1;21870:29;;:15;:29;;::::0;21862:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;21946:17;21966:14;;;;;;;;;;;21946:34;;22008:15;21991:14;;:32;;;;;;;;;;;;;;;;;;22072:15;22039:49;;22061:9;22039:49;;;;;;;;;;;;21851:245;21780:316:::0;:::o;3409:182::-;3479:4;3496:13;3512:10;3496:26;;3533:28;3543:5;3550:2;3554:6;3533:9;:28::i;:::-;3579:4;3572:11;;;3409:182;;;;:::o;24614:691::-;1820:13;:11;:13::i;:::-;24681:21:::1;24720:4;24705:31;;;24745:4;24760:16;;;;;;;;;;;24705:73;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24681:97;;8540:18;24793:13;:28;24789:125;;;24838:64;24855:4;24870:16;;;;;;;;;;;8540:18;24838:8;:64::i;:::-;24789:125;24926:19;24955:10;;;;;;;;;;;24948:28;;;24985:4;24948:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24926:65;;25020:1;25006:11;:15;25002:296;;;25038:21;25069:10;;;;;;;;;;;25062:28;;;25099:4;25114:16;;;;;;;;;;;25062:70;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;25038:94;;25167:11;25151:13;:27;25147:140;;;25206:10;;;;;;;;;;;25199:26;;;25234:16;;;;;;;;;;;25253:17;25199:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25147:140;25023:275;25002:296;24670:635;;24614:691::o:0;23382:167::-;1820:13;:11;:13::i;:::-;23475:1:::1;23456:21;;:7;:21;;::::0;23448:37:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;23533:7;23496:16;;:45;;;;;;;;;;;;;;;;;;23382:167:::0;:::o;9312:40::-;;;;;;;;;;;;;;;;;;;;;;:::o;3599:142::-;3679:7;3706:11;:18;3718:5;3706:18;;;;;;;;;;;;;;;:27;3725:7;3706:27;;;;;;;;;;;;;;;;3699:34;;3599:142;;;;:::o;26708:494::-;1820:13;:11;:13::i;:::-;26769:69:::1;26786:4;26801:16;;;;;;;;;;;26820:17;26769:8;:69::i;:::-;26870:10;;;;;;;;;;;26863:26;;;26898:16;;;;;;;;;;;26917:17;26863:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26859:88:::0;::::1;;;;26996:1;26971:27;;:13;;;;;;;;;;;:27;;;26967:228;;27026:10;;;;;;;;;;;27019:26;;;27046:13;;;;;;;;;;;27061:17;27019:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27015:76:::0;::::1;;;;27124:4;27109:29;;;27139:13;;;;;;;;;;;27154:17;27109:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;27105:79:::0;::::1;;;;26967:228;26708:494::o:0;2064:165::-;1820:13;:11;:13::i;:::-;2173:1:::1;2153:22;;:8;:22;;::::0;2145:37:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2193:28;2212:8;2193:18;:28::i;:::-;2064:165:::0;:::o;26087:595::-;26164:7;26185:19;26206;26229:17;:15;:17::i;:::-;26184:62;;;;26276:1;26261:11;:16;:36;;;;26296:1;26281:11;:16;26261:36;26257:50;;;26306:1;26299:8;;;;;;26257:50;26328:23;26365:3;26354:8;:14;;;;:::i;:::-;26328:40;;26391:17;26429:11;26411:15;:29;;;;:::i;:::-;26391:49;;26451:19;26496:15;26488:4;26474:11;:18;;;;:::i;:::-;26473:38;;;;:::i;:::-;26451:60;;26522:17;26554:11;26542:9;:23;;;;:::i;:::-;26522:43;;26671:3;8867:2;26649:3;:18;;;;:::i;:::-;26636:9;:32;;;;:::i;:::-;:38;;;;:::i;:::-;26629:45;;;;;;;;26087:595;;;;:::o;9133:43::-;;;;;;;;;;;;;:::o;5128:256::-;5247:1;5230:19;;:5;:19;;;;:44;;;;;5272:1;5253:21;;:7;:21;;;;5230:44;5222:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;5322:6;5292:11;:18;5304:5;5292:18;;;;;;;;;;;;;;;:27;5311:7;5292:27;;;;;;;;;;;;;;;:36;;;;5360:7;5344:32;;5353:5;5344:32;;;5369:6;5344:32;;;;;;:::i;:::-;;;;;;;;5128:256;;;:::o;5392:392::-;5493:24;5520:25;5530:5;5537:7;5520:9;:25::i;:::-;5493:52;;5580:17;5560:16;:37;5556:221;;5642:6;5622:16;:26;;5614:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;5699:51;5708:5;5715:7;5743:6;5724:16;:25;5699:8;:51::i;:::-;5556:221;5482:302;5392:392;;;:::o;12276:2459::-;12432:1;12416:18;;:4;:18;;;;:38;;;;;12452:1;12438:16;;:2;:16;;;;12416:38;12408:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;12548:7;:5;:7::i;:::-;12540:15;;:4;:15;;;:32;;;;12565:7;:5;:7::i;:::-;12559:13;;:2;:13;;;12540:32;:57;;;;12592:4;12576:21;;:4;:21;;;12540:57;:80;;;;12615:4;12601:19;;:2;:19;;;12540:80;:97;;;;12625:12;;;;;;;;;;;12624:13;12540:97;12536:250;;;12654:33;12670:4;12676:2;12680:6;12654:15;:33::i;:::-;12702:19;12716:4;12702:13;:19::i;:::-;12736:17;12750:2;12736:13;:17::i;:::-;12768:7;;12536:250;12798:16;12823:13;;;;;;;;;;;12817:19;;:2;:19;;;:44;;;;12848:13;;;;;;;;;;;12840:21;;:4;:21;;;12817:44;12798:63;;12876:11;12872:1736;;;12946:16;12987:3;8601:1;12966:6;:17;;;;:::i;:::-;12965:25;;;;:::i;:::-;12946:44;;13005:22;13039:8;13030:6;:17;;;;:::i;:::-;13005:42;;13132:41;13148:4;13154:2;13158:14;13132:15;:41::i;:::-;13248:46;13264:4;13278;13285:8;13248:15;:46::i;:::-;13384:8;13359:21;;:33;;;;;;;:::i;:::-;;;;;;;;8769:13;13469:21;;:47;;:69;;;;;13537:1;13520:7;:14;;;;:18;13469:69;13465:1022;;;13607:69;13624:4;13639:16;;;;;;;;;;;13658:17;13607:8;:69::i;:::-;13724:10;;;;;;;;;;;13717:26;;;13752:16;;;;;;;;;;;13771:17;13717:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13713:88;;;;;13866:1;13841:27;;:13;;;;;;;;;;;:27;;;13837:252;;13904:10;;;;;;;;;;;13897:26;;;13924:13;;;;;;;;;;;13939:17;13897:60;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13893:76;;;;;14010:4;13995:29;;;14025:13;;;;;;;;;;;14040:17;13995:63;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;13991:79;;;;;13837:252;14129:4;:19;;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14125:347;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;14337:6;14295:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;14277:69;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;14215:151;14125:347;;;;;14401:51;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;14125:347;;;;;13465:1022;12889:1609;;12872:1736;;;14563:33;14579:4;14585:2;14589:6;14563:15;:33::i;:::-;12872:1736;14680:19;14694:4;14680:13;:19::i;:::-;14710:17;14724:2;14710:13;:17::i;:::-;12397:2338;12276:2459;;;;:::o;1956:100::-;2031:10;2020:21;;:7;:5;:7::i;:::-;:21;;;2012:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;1956:100::o;17399:2165::-;17466:7;17505:1;17490:11;:16;17486:30;;17515:1;17508:8;;;;17486:30;17572:12;17586:24;17616:33;17637:11;17616:20;:33::i;:::-;17571:78;;;;;17665:7;17664:8;:33;;;;17696:1;17676:16;:21;17664:33;17660:47;;;17706:1;17699:8;;;;;;17660:47;17783:58;17807:4;17814:13;;;;;;;;;;;17829:11;17783:15;:58::i;:::-;17916:13;;;;;;;;;;;17900:35;;;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17896:53;18007:69;18024:4;18039:16;;;;;;;;;;;18058:17;18007:8;:69::i;:::-;18136:20;18201:3;8867:2;18179:3;:18;;;;:::i;:::-;18159:16;:39;;;;:::i;:::-;:45;;;;:::i;:::-;18136:68;;18310:21;18348:1;18334:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18310:40;;18379:4;18361;18366:1;18361:7;;;;;;;;:::i;:::-;;;;;;;:23;;;;;;;;;;;18405:10;;;;;;;;;;;18395:4;18400:1;18395:7;;;;;;;;:::i;:::-;;;;;;;:20;;;;;;;;;;;18436:27;18473:10;;;;;;;;;;;18466:28;;;18503:4;18466:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18436:73;;18534:16;;;;;;;;;;;:70;;;18619:11;18645:12;18672:4;18699;18764:3;18746:15;:21;;;;:::i;:::-;18534:244;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18530:1027;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;19409:6;19368:48;;;;;;;;:::i;:::-;;;;;;;;;;;;;19350:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19440:1;19433:8;;;;;;;;;;18530:1027;;;19480:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19544:1;19537:8;;;;;;;;;18530:1027;18867:25;18902:10;;;;;;;;;;;18895:28;;;18932:4;18895:43;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18867:71;;18953:16;18992:19;18972:17;:39;;;;:::i;:::-;18953:58;;19055:1;19044:8;:12;19040:244;;;19110:8;19097:11;19082:37;;;;;;;;;;19145:8;19138:15;;;;;;;;;;;19040:244;19199:42;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;19267:1;19260:8;;;;;;;;;17399:2165;;;;:::o;20921:807::-;21005:1;20990:11;:16;:39;;;;21028:1;21010:7;:14;;;;:19;20990:39;21031:7;20986:52;21058:23;21098:7;:14;;;;21084:11;:28;;;;:::i;:::-;21058:54;;21146:1;21127:15;:20;21123:33;;21149:7;;;21123:33;21168:27;21210:24;21256:9;21251:387;21275:7;:14;;;;21271:1;:18;:29;;;;;21297:3;21293:1;:7;21271:29;21251:387;;;21348:1;21326:24;;:7;21334:1;21326:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:24;;;21322:305;;21382:10;;;;;;;;;;;21375:27;;;21403:7;21411:1;21403:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21415:15;21375:56;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;21371:241;21584:8;21371:241;;21455:21;;;;;:::i;:::-;;;;21519:15;21499:35;;;;;:::i;:::-;;;21322:305;21251:387;21302:3;;;;;:::i;:::-;;;;21251:387;;;;21700:19;21682:16;21663:57;;;;;;;;;;20975:753;;;20921:807;;:::o;2237:191::-;2311:16;2330:6;;;;;;;;;;;2311:25;;2356:8;2347:6;;:17;;;;;;;;;;;;;;;;;;2411:8;2380:40;;2401:8;2380:40;;;;;;;;;;;;2300:128;2237:191;:::o;4205:507::-;4318:1;4302:18;;:4;:18;;;;:38;;;;;4338:1;4324:16;;:2;:16;;;;4302:38;4294:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;4358:38;4379:4;4385:2;4389:6;4358:20;:38::i;:::-;4407:19;4429:9;:15;4439:4;4429:15;;;;;;;;;;;;;;;;4407:37;;4478:6;4463:11;:21;;4455:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;4559:6;4545:11;:20;4527:9;:15;4537:4;4527:15;;;;;;;;;;;;;;;:38;;;;4597:6;4580:9;:13;4590:2;4580:13;;;;;;;;;;;;;;;;:23;;;;;;;;;;;4645:2;4630:26;;4639:4;4630:26;;;4649:6;4630:26;;;;;;:::i;:::-;;;;;;;;4667:37;4687:4;4693:2;4697:6;4667:19;:37::i;:::-;4283:429;4205:507;;;:::o;14743:588::-;14817:13;;;;;;;;;;;14806:24;;:7;:24;;;;:52;;;;;14853:4;14834:24;;:7;:24;;;;14806:52;14802:522;;;14875:15;14893:18;14903:7;14893:9;:18::i;:::-;14875:36;;14926:22;14951:8;:17;14960:7;14951:17;;;;;;;;;;;;;;;;;;;;;;;;;14926:42;;8660:12;15001:7;:28;;:50;;;;;15034:17;15033:18;15001:50;14997:316;;;15092:4;15072:8;:17;15081:7;15072:17;;;;;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;15115:7;15128;15115:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14997:316;;;8660:12;15162:7;:27;:48;;;;;15193:17;15162:48;15158:155;;;15251:5;15231:8;:17;15240:7;15231:17;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;15275:22;15289:7;15275:13;:22::i;:::-;15158:155;14997:316;14860:464;;14802:522;14743:588;:::o;19576:1337::-;19644:12;19658:22;19682:19;19741:16;19759;19779:17;:15;:17::i;:::-;19740:56;;;;19859:14;19892:13;;;;;;;;;;;19876:37;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19859:56;;19961:4;19943:23;;:6;:23;;;19926:40;;20039:21;20063:14;:36;;20091:8;20063:36;;;20080:8;20063:36;20039:60;;20110:20;20133:14;:36;;20161:8;20133:36;;;20150:8;20133:36;20110:59;;20211:1;20194:13;:18;:39;;;;20232:1;20216:12;:17;20194:39;20190:165;;;20255:40;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;20318:5;20325:1;20310:33;;;;;;;;;;;20190:165;20440:23;20480:3;20466:11;:17;;;;:::i;:::-;20440:43;;20494:17;20532:12;20514:15;:30;;;;:::i;:::-;20494:50;;20555:19;20602:15;20594:4;20578:13;:20;;;;:::i;:::-;20577:40;;;;:::i;:::-;20555:62;;20657:11;20645:9;:23;;;;:::i;:::-;20628:40;;20711:1;20693:14;:19;20689:151;;20734:46;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;20803:5;20810:1;20795:33;;;;;;;;;;;;;;20689:151;20868:4;20860:45;;;;;;;;;;19576:1337;;;;;;:::o;11889:186::-;;;;:::o;12083:185::-;;;;:::o;15339:295::-;15403:9;15398:229;15422:7;:14;;;;15418:1;:18;15398:229;;;15476:7;15462:21;;:7;15470:1;15462:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:21;;;15458:158;;15517:7;15542:1;15525:7;:14;;;;:18;;;;:::i;:::-;15517:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;15504:7;15512:1;15504:10;;;;;;;;:::i;:::-;;;;;;;;;;:40;;;;;;;;;;;;;;;;;;15563:7;:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;15595:5;;15458:158;15438:3;;;;;:::i;:::-;;;;15398:229;;;;15339:295;:::o;7:99:1:-;59:6;93:5;87:12;77:22;;7:99;;;:::o;112:169::-;196:11;230:6;225:3;218:19;270:4;265:3;261:14;246:29;;112:169;;;;:::o;287:246::-;368:1;378:113;392:6;389:1;386:13;378:113;;;477:1;472:3;468:11;462:18;458:1;453:3;449:11;442:39;414:2;411:1;407:10;402:15;;378:113;;;525:1;516:6;511:3;507:16;500:27;349:184;287:246;;;:::o;539:102::-;580:6;631:2;627:7;622:2;615:5;611:14;607:28;597:38;;539:102;;;:::o;647:377::-;735:3;763:39;796:5;763:39;:::i;:::-;818:71;882:6;877:3;818:71;:::i;:::-;811:78;;898:65;956:6;951:3;944:4;937:5;933:16;898:65;:::i;:::-;988:29;1010:6;988:29;:::i;:::-;983:3;979:39;972:46;;739:285;647:377;;;;:::o;1030:313::-;1143:4;1181:2;1170:9;1166:18;1158:26;;1230:9;1224:4;1220:20;1216:1;1205:9;1201:17;1194:47;1258:78;1331:4;1322:6;1258:78;:::i;:::-;1250:86;;1030:313;;;;:::o;1349:75::-;1382:6;1415:2;1409:9;1399:19;;1349:75;:::o;1430:117::-;1539:1;1536;1529:12;1676:126;1713:7;1753:42;1746:5;1742:54;1731:65;;1676:126;;;:::o;1808:96::-;1845:7;1874:24;1892:5;1874:24;:::i;:::-;1863:35;;1808:96;;;:::o;1910:122::-;1983:24;2001:5;1983:24;:::i;:::-;1976:5;1973:35;1963:63;;2022:1;2019;2012:12;1963:63;1910:122;:::o;2038:139::-;2084:5;2122:6;2109:20;2100:29;;2138:33;2165:5;2138:33;:::i;:::-;2038:139;;;;:::o;2183:77::-;2220:7;2249:5;2238:16;;2183:77;;;:::o;2266:122::-;2339:24;2357:5;2339:24;:::i;:::-;2332:5;2329:35;2319:63;;2378:1;2375;2368:12;2319:63;2266:122;:::o;2394:139::-;2440:5;2478:6;2465:20;2456:29;;2494:33;2521:5;2494:33;:::i;:::-;2394:139;;;;:::o;2539:474::-;2607:6;2615;2664:2;2652:9;2643:7;2639:23;2635:32;2632:119;;;2670:79;;:::i;:::-;2632:119;2790:1;2815:53;2860:7;2851:6;2840:9;2836:22;2815:53;:::i;:::-;2805:63;;2761:117;2917:2;2943:53;2988:7;2979:6;2968:9;2964:22;2943:53;:::i;:::-;2933:63;;2888:118;2539:474;;;;;:::o;3019:90::-;3053:7;3096:5;3089:13;3082:21;3071:32;;3019:90;;;:::o;3115:109::-;3196:21;3211:5;3196:21;:::i;:::-;3191:3;3184:34;3115:109;;:::o;3230:210::-;3317:4;3355:2;3344:9;3340:18;3332:26;;3368:65;3430:1;3419:9;3415:17;3406:6;3368:65;:::i;:::-;3230:210;;;;:::o;3446:118::-;3533:24;3551:5;3533:24;:::i;:::-;3528:3;3521:37;3446:118;;:::o;3570:222::-;3663:4;3701:2;3690:9;3686:18;3678:26;;3714:71;3782:1;3771:9;3767:17;3758:6;3714:71;:::i;:::-;3570:222;;;;:::o;3798:118::-;3885:24;3903:5;3885:24;:::i;:::-;3880:3;3873:37;3798:118;;:::o;3922:541::-;4093:4;4131:3;4120:9;4116:19;4108:27;;4145:71;4213:1;4202:9;4198:17;4189:6;4145:71;:::i;:::-;4226:72;4294:2;4283:9;4279:18;4270:6;4226:72;:::i;:::-;4308:66;4370:2;4359:9;4355:18;4346:6;4308:66;:::i;:::-;4384:72;4452:2;4441:9;4437:18;4428:6;4384:72;:::i;:::-;3922:541;;;;;;;:::o;4469:619::-;4546:6;4554;4562;4611:2;4599:9;4590:7;4586:23;4582:32;4579:119;;;4617:79;;:::i;:::-;4579:119;4737:1;4762:53;4807:7;4798:6;4787:9;4783:22;4762:53;:::i;:::-;4752:63;;4708:117;4864:2;4890:53;4935:7;4926:6;4915:9;4911:22;4890:53;:::i;:::-;4880:63;;4835:118;4992:2;5018:53;5063:7;5054:6;5043:9;5039:22;5018:53;:::i;:::-;5008:63;;4963:118;4469:619;;;;;:::o;5094:329::-;5153:6;5202:2;5190:9;5181:7;5177:23;5173:32;5170:119;;;5208:79;;:::i;:::-;5170:119;5328:1;5353:53;5398:7;5389:6;5378:9;5374:22;5353:53;:::i;:::-;5343:63;;5299:117;5094:329;;;;:::o;5429:222::-;5522:4;5560:2;5549:9;5545:18;5537:26;;5573:71;5641:1;5630:9;5626:17;5617:6;5573:71;:::i;:::-;5429:222;;;;:::o;5657:86::-;5692:7;5732:4;5725:5;5721:16;5710:27;;5657:86;;;:::o;5749:112::-;5832:22;5848:5;5832:22;:::i;:::-;5827:3;5820:35;5749:112;;:::o;5867:214::-;5956:4;5994:2;5983:9;5979:18;5971:26;;6007:67;6071:1;6060:9;6056:17;6047:6;6007:67;:::i;:::-;5867:214;;;;:::o;6087:114::-;6154:6;6188:5;6182:12;6172:22;;6087:114;;;:::o;6207:184::-;6306:11;6340:6;6335:3;6328:19;6380:4;6375:3;6371:14;6356:29;;6207:184;;;;:::o;6397:132::-;6464:4;6487:3;6479:11;;6517:4;6512:3;6508:14;6500:22;;6397:132;;;:::o;6535:108::-;6612:24;6630:5;6612:24;:::i;:::-;6607:3;6600:37;6535:108;;:::o;6649:179::-;6718:10;6739:46;6781:3;6773:6;6739:46;:::i;:::-;6817:4;6812:3;6808:14;6794:28;;6649:179;;;;:::o;6834:113::-;6904:4;6936;6931:3;6927:14;6919:22;;6834:113;;;:::o;6983:732::-;7102:3;7131:54;7179:5;7131:54;:::i;:::-;7201:86;7280:6;7275:3;7201:86;:::i;:::-;7194:93;;7311:56;7361:5;7311:56;:::i;:::-;7390:7;7421:1;7406:284;7431:6;7428:1;7425:13;7406:284;;;7507:6;7501:13;7534:63;7593:3;7578:13;7534:63;:::i;:::-;7527:70;;7620:60;7673:6;7620:60;:::i;:::-;7610:70;;7466:224;7453:1;7450;7446:9;7441:14;;7406:284;;;7410:14;7706:3;7699:10;;7107:608;;;6983:732;;;;:::o;7721:373::-;7864:4;7902:2;7891:9;7887:18;7879:26;;7951:9;7945:4;7941:20;7937:1;7926:9;7922:17;7915:47;7979:108;8082:4;8073:6;7979:108;:::i;:::-;7971:116;;7721:373;;;;:::o;8100:60::-;8128:3;8149:5;8142:12;;8100:60;;;:::o;8166:142::-;8216:9;8249:53;8267:34;8276:24;8294:5;8276:24;:::i;:::-;8267:34;:::i;:::-;8249:53;:::i;:::-;8236:66;;8166:142;;;:::o;8314:126::-;8364:9;8397:37;8428:5;8397:37;:::i;:::-;8384:50;;8314:126;;;:::o;8446:151::-;8521:9;8554:37;8585:5;8554:37;:::i;:::-;8541:50;;8446:151;;;:::o;8603:181::-;8715:62;8771:5;8715:62;:::i;:::-;8710:3;8703:75;8603:181;;:::o;8790:272::-;8908:4;8946:2;8935:9;8931:18;8923:26;;8959:96;9052:1;9041:9;9037:17;9028:6;8959:96;:::i;:::-;8790:272;;;;:::o;9068:329::-;9127:6;9176:2;9164:9;9155:7;9151:23;9147:32;9144:119;;;9182:79;;:::i;:::-;9144:119;9302:1;9327:53;9372:7;9363:6;9352:9;9348:22;9327:53;:::i;:::-;9317:63;;9273:117;9068:329;;;;:::o;9403:332::-;9524:4;9562:2;9551:9;9547:18;9539:26;;9575:71;9643:1;9632:9;9628:17;9619:6;9575:71;:::i;:::-;9656:72;9724:2;9713:9;9709:18;9700:6;9656:72;:::i;:::-;9403:332;;;;;:::o;9741:474::-;9809:6;9817;9866:2;9854:9;9845:7;9841:23;9837:32;9834:119;;;9872:79;;:::i;:::-;9834:119;9992:1;10017:53;10062:7;10053:6;10042:9;10038:22;10017:53;:::i;:::-;10007:63;;9963:117;10119:2;10145:53;10190:7;10181:6;10170:9;10166:22;10145:53;:::i;:::-;10135:63;;10090:118;9741:474;;;;;:::o;10221:152::-;10297:9;10330:37;10361:5;10330:37;:::i;:::-;10317:50;;10221:152;;;:::o;10379:183::-;10492:63;10549:5;10492:63;:::i;:::-;10487:3;10480:76;10379:183;;:::o;10568:274::-;10687:4;10725:2;10714:9;10710:18;10702:26;;10738:97;10832:1;10821:9;10817:17;10808:6;10738:97;:::i;:::-;10568:274;;;;:::o;10848:180::-;10896:77;10893:1;10886:88;10993:4;10990:1;10983:15;11017:4;11014:1;11007:15;11034:320;11078:6;11115:1;11109:4;11105:12;11095:22;;11162:1;11156:4;11152:12;11183:18;11173:81;;11239:4;11231:6;11227:17;11217:27;;11173:81;11301:2;11293:6;11290:14;11270:18;11267:38;11264:84;;11320:18;;:::i;:::-;11264:84;11085:269;11034:320;;;:::o;11360:332::-;11481:4;11519:2;11508:9;11504:18;11496:26;;11532:71;11600:1;11589:9;11585:17;11576:6;11532:71;:::i;:::-;11613:72;11681:2;11670:9;11666:18;11657:6;11613:72;:::i;:::-;11360:332;;;;;:::o;11698:143::-;11755:5;11786:6;11780:13;11771:22;;11802:33;11829:5;11802:33;:::i;:::-;11698:143;;;;:::o;11847:351::-;11917:6;11966:2;11954:9;11945:7;11941:23;11937:32;11934:119;;;11972:79;;:::i;:::-;11934:119;12092:1;12117:64;12173:7;12164:6;12153:9;12149:22;12117:64;:::i;:::-;12107:74;;12063:128;11847:351;;;;:::o;12204:152::-;12344:4;12340:1;12332:6;12328:14;12321:28;12204:152;:::o;12362:365::-;12504:3;12525:66;12589:1;12584:3;12525:66;:::i;:::-;12518:73;;12600:93;12689:3;12600:93;:::i;:::-;12718:2;12713:3;12709:12;12702:19;;12362:365;;;:::o;12733:419::-;12899:4;12937:2;12926:9;12922:18;12914:26;;12986:9;12980:4;12976:20;12972:1;12961:9;12957:17;12950:47;13014:131;13140:4;13014:131;:::i;:::-;13006:139;;12733:419;;;:::o;13158:152::-;13298:4;13294:1;13286:6;13282:14;13275:28;13158:152;:::o;13316:365::-;13458:3;13479:66;13543:1;13538:3;13479:66;:::i;:::-;13472:73;;13554:93;13643:3;13554:93;:::i;:::-;13672:2;13667:3;13663:12;13656:19;;13316:365;;;:::o;13687:419::-;13853:4;13891:2;13880:9;13876:18;13868:26;;13940:9;13934:4;13930:20;13926:1;13915:9;13911:17;13904:47;13968:131;14094:4;13968:131;:::i;:::-;13960:139;;13687:419;;;:::o;14112:152::-;14252:4;14248:1;14240:6;14236:14;14229:28;14112:152;:::o;14270:365::-;14412:3;14433:66;14497:1;14492:3;14433:66;:::i;:::-;14426:73;;14508:93;14597:3;14508:93;:::i;:::-;14626:2;14621:3;14617:12;14610:19;;14270:365;;;:::o;14641:419::-;14807:4;14845:2;14834:9;14830:18;14822:26;;14894:9;14888:4;14884:20;14880:1;14869:9;14865:17;14858:47;14922:131;15048:4;14922:131;:::i;:::-;14914:139;;14641:419;;;:::o;15066:152::-;15206:4;15202:1;15194:6;15190:14;15183:28;15066:152;:::o;15224:365::-;15366:3;15387:66;15451:1;15446:3;15387:66;:::i;:::-;15380:73;;15462:93;15551:3;15462:93;:::i;:::-;15580:2;15575:3;15571:12;15564:19;;15224:365;;;:::o;15595:419::-;15761:4;15799:2;15788:9;15784:18;15776:26;;15848:9;15842:4;15838:20;15834:1;15823:9;15819:17;15812:47;15876:131;16002:4;15876:131;:::i;:::-;15868:139;;15595:419;;;:::o;16020:225::-;16160:34;16156:1;16148:6;16144:14;16137:58;16229:8;16224:2;16216:6;16212:15;16205:33;16020:225;:::o;16251:366::-;16393:3;16414:67;16478:2;16473:3;16414:67;:::i;:::-;16407:74;;16490:93;16579:3;16490:93;:::i;:::-;16608:2;16603:3;16599:12;16592:19;;16251:366;;;:::o;16623:419::-;16789:4;16827:2;16816:9;16812:18;16804:26;;16876:9;16870:4;16866:20;16862:1;16851:9;16847:17;16840:47;16904:131;17030:4;16904:131;:::i;:::-;16896:139;;16623:419;;;:::o;17048:85::-;17093:7;17122:5;17111:16;;17048:85;;;:::o;17139:158::-;17197:9;17230:61;17248:42;17257:32;17283:5;17257:32;:::i;:::-;17248:42;:::i;:::-;17230:61;:::i;:::-;17217:74;;17139:158;;;:::o;17303:147::-;17398:45;17437:5;17398:45;:::i;:::-;17393:3;17386:58;17303:147;;:::o;17456:807::-;17705:4;17743:3;17732:9;17728:19;17720:27;;17757:71;17825:1;17814:9;17810:17;17801:6;17757:71;:::i;:::-;17838:72;17906:2;17895:9;17891:18;17882:6;17838:72;:::i;:::-;17920:80;17996:2;17985:9;17981:18;17972:6;17920:80;:::i;:::-;18010;18086:2;18075:9;18071:18;18062:6;18010:80;:::i;:::-;18100:73;18168:3;18157:9;18153:19;18144:6;18100:73;:::i;:::-;18183;18251:3;18240:9;18236:19;18227:6;18183:73;:::i;:::-;17456:807;;;;;;;;;:::o;18269:663::-;18357:6;18365;18373;18422:2;18410:9;18401:7;18397:23;18393:32;18390:119;;;18428:79;;:::i;:::-;18390:119;18548:1;18573:64;18629:7;18620:6;18609:9;18605:22;18573:64;:::i;:::-;18563:74;;18519:128;18686:2;18712:64;18768:7;18759:6;18748:9;18744:22;18712:64;:::i;:::-;18702:74;;18657:129;18825:2;18851:64;18907:7;18898:6;18887:9;18883:22;18851:64;:::i;:::-;18841:74;;18796:129;18269:663;;;;;:::o;18938:173::-;19078:25;19074:1;19066:6;19062:14;19055:49;18938:173;:::o;19117:366::-;19259:3;19280:67;19344:2;19339:3;19280:67;:::i;:::-;19273:74;;19356:93;19445:3;19356:93;:::i;:::-;19474:2;19469:3;19465:12;19458:19;;19117:366;;;:::o;19489:419::-;19655:4;19693:2;19682:9;19678:18;19670:26;;19742:9;19736:4;19732:20;19728:1;19717:9;19713:17;19706:47;19770:131;19896:4;19770:131;:::i;:::-;19762:139;;19489:419;;;:::o;19914:152::-;20054:4;20050:1;20042:6;20038:14;20031:28;19914:152;:::o;20072:365::-;20214:3;20235:66;20299:1;20294:3;20235:66;:::i;:::-;20228:73;;20310:93;20399:3;20310:93;:::i;:::-;20428:2;20423:3;20419:12;20412:19;;20072:365;;;:::o;20443:419::-;20609:4;20647:2;20636:9;20632:18;20624:26;;20696:9;20690:4;20686:20;20682:1;20671:9;20667:17;20660:47;20724:131;20850:4;20724:131;:::i;:::-;20716:139;;20443:419;;;:::o;20868:152::-;21008:4;21004:1;20996:6;20992:14;20985:28;20868:152;:::o;21026:365::-;21168:3;21189:66;21253:1;21248:3;21189:66;:::i;:::-;21182:73;;21264:93;21353:3;21264:93;:::i;:::-;21382:2;21377:3;21373:12;21366:19;;21026:365;;;:::o;21397:419::-;21563:4;21601:2;21590:9;21586:18;21578:26;;21650:9;21644:4;21640:20;21636:1;21625:9;21621:17;21614:47;21678:131;21804:4;21678:131;:::i;:::-;21670:139;;21397:419;;;:::o;21822:180::-;21870:77;21867:1;21860:88;21967:4;21964:1;21957:15;21991:4;21988:1;21981:15;22008:410;22048:7;22071:20;22089:1;22071:20;:::i;:::-;22066:25;;22105:20;22123:1;22105:20;:::i;:::-;22100:25;;22160:1;22157;22153:9;22182:30;22200:11;22182:30;:::i;:::-;22171:41;;22361:1;22352:7;22348:15;22345:1;22342:22;22322:1;22315:9;22295:83;22272:139;;22391:18;;:::i;:::-;22272:139;22056:362;22008:410;;;;:::o;22424:180::-;22472:77;22469:1;22462:88;22569:4;22566:1;22559:15;22593:4;22590:1;22583:15;22610:185;22650:1;22667:20;22685:1;22667:20;:::i;:::-;22662:25;;22701:20;22719:1;22701:20;:::i;:::-;22696:25;;22740:1;22730:35;;22745:18;;:::i;:::-;22730:35;22787:1;22784;22780:9;22775:14;;22610:185;;;;:::o;22801:194::-;22841:4;22861:20;22879:1;22861:20;:::i;:::-;22856:25;;22895:20;22913:1;22895:20;:::i;:::-;22890:25;;22939:1;22936;22932:9;22924:17;;22963:1;22957:4;22954:11;22951:37;;;22968:18;;:::i;:::-;22951:37;22801:194;;;;:::o;23001:332::-;23122:4;23160:2;23149:9;23145:18;23137:26;;23173:71;23241:1;23230:9;23226:17;23217:6;23173:71;:::i;:::-;23254:72;23322:2;23311:9;23307:18;23298:6;23254:72;:::i;:::-;23001:332;;;;;:::o;23339:116::-;23409:21;23424:5;23409:21;:::i;:::-;23402:5;23399:32;23389:60;;23445:1;23442;23435:12;23389:60;23339:116;:::o;23461:137::-;23515:5;23546:6;23540:13;23531:22;;23562:30;23586:5;23562:30;:::i;:::-;23461:137;;;;:::o;23604:345::-;23671:6;23720:2;23708:9;23699:7;23695:23;23691:32;23688:119;;;23726:79;;:::i;:::-;23688:119;23846:1;23871:61;23924:7;23915:6;23904:9;23900:22;23871:61;:::i;:::-;23861:71;;23817:125;23604:345;;;;:::o;23955:177::-;24095:29;24091:1;24083:6;24079:14;24072:53;23955:177;:::o;24138:366::-;24280:3;24301:67;24365:2;24360:3;24301:67;:::i;:::-;24294:74;;24377:93;24466:3;24377:93;:::i;:::-;24495:2;24490:3;24486:12;24479:19;;24138:366;;;:::o;24510:419::-;24676:4;24714:2;24703:9;24699:18;24691:26;;24763:9;24757:4;24753:20;24749:1;24738:9;24734:17;24727:47;24791:131;24917:4;24791:131;:::i;:::-;24783:139;;24510:419;;;:::o;24935:170::-;25075:22;25071:1;25063:6;25059:14;25052:46;24935:170;:::o;25111:366::-;25253:3;25274:67;25338:2;25333:3;25274:67;:::i;:::-;25267:74;;25350:93;25439:3;25350:93;:::i;:::-;25468:2;25463:3;25459:12;25452:19;;25111:366;;;:::o;25483:419::-;25649:4;25687:2;25676:9;25672:18;25664:26;;25736:9;25730:4;25726:20;25722:1;25711:9;25707:17;25700:47;25764:131;25890:4;25764:131;:::i;:::-;25756:139;;25483:419;;;:::o;25908:152::-;26048:4;26044:1;26036:6;26032:14;26025:28;25908:152;:::o;26066:365::-;26208:3;26229:66;26293:1;26288:3;26229:66;:::i;:::-;26222:73;;26304:93;26393:3;26304:93;:::i;:::-;26422:2;26417:3;26413:12;26406:19;;26066:365;;;:::o;26437:419::-;26603:4;26641:2;26630:9;26626:18;26618:26;;26690:9;26684:4;26680:20;26676:1;26665:9;26661:17;26654:47;26718:131;26844:4;26718:131;:::i;:::-;26710:139;;26437:419;;;:::o;26862:143::-;26919:5;26950:6;26944:13;26935:22;;26966:33;26993:5;26966:33;:::i;:::-;26862:143;;;;:::o;27011:351::-;27081:6;27130:2;27118:9;27109:7;27105:23;27101:32;27098:119;;;27136:79;;:::i;:::-;27098:119;27256:1;27281:64;27337:7;27328:6;27317:9;27313:22;27281:64;:::i;:::-;27271:74;;27227:128;27011:351;;;;:::o;27368:114::-;27405:7;27445:30;27438:5;27434:42;27423:53;;27368:114;;;:::o;27488:122::-;27561:24;27579:5;27561:24;:::i;:::-;27554:5;27551:35;27541:63;;27600:1;27597;27590:12;27541:63;27488:122;:::o;27616:143::-;27673:5;27704:6;27698:13;27689:22;;27720:33;27747:5;27720:33;:::i;:::-;27616:143;;;;:::o;27765:93::-;27801:7;27841:10;27834:5;27830:22;27819:33;;27765:93;;;:::o;27864:120::-;27936:23;27953:5;27936:23;:::i;:::-;27929:5;27926:34;27916:62;;27974:1;27971;27964:12;27916:62;27864:120;:::o;27990:141::-;28046:5;28077:6;28071:13;28062:22;;28093:32;28119:5;28093:32;:::i;:::-;27990:141;;;;:::o;28137:661::-;28224:6;28232;28240;28289:2;28277:9;28268:7;28264:23;28260:32;28257:119;;;28295:79;;:::i;:::-;28257:119;28415:1;28440:64;28496:7;28487:6;28476:9;28472:22;28440:64;:::i;:::-;28430:74;;28386:128;28553:2;28579:64;28635:7;28626:6;28615:9;28611:22;28579:64;:::i;:::-;28569:74;;28524:129;28692:2;28718:63;28773:7;28764:6;28753:9;28749:22;28718:63;:::i;:::-;28708:73;;28663:128;28137:661;;;;;:::o;28804:181::-;28944:33;28940:1;28932:6;28928:14;28921:57;28804:181;:::o;28991:366::-;29133:3;29154:67;29218:2;29213:3;29154:67;:::i;:::-;29147:74;;29230:93;29319:3;29230:93;:::i;:::-;29348:2;29343:3;29339:12;29332:19;;28991:366;;;:::o;29363:419::-;29529:4;29567:2;29556:9;29552:18;29544:26;;29616:9;29610:4;29606:20;29602:1;29591:9;29587:17;29580:47;29644:131;29770:4;29644:131;:::i;:::-;29636:139;;29363:419;;;:::o;29788:153::-;29928:5;29924:1;29916:6;29912:14;29905:29;29788:153;:::o;29947:365::-;30089:3;30110:66;30174:1;30169:3;30110:66;:::i;:::-;30103:73;;30185:93;30274:3;30185:93;:::i;:::-;30303:2;30298:3;30294:12;30287:19;;29947:365;;;:::o;30318:419::-;30484:4;30522:2;30511:9;30507:18;30499:26;;30571:9;30565:4;30561:20;30557:1;30546:9;30542:17;30535:47;30599:131;30725:4;30599:131;:::i;:::-;30591:139;;30318:419;;;:::o;30743:152::-;30883:4;30879:1;30871:6;30867:14;30860:28;30743:152;:::o;30901:365::-;31043:3;31064:66;31128:1;31123:3;31064:66;:::i;:::-;31057:73;;31139:93;31228:3;31139:93;:::i;:::-;31257:2;31252:3;31248:12;31241:19;;30901:365;;;:::o;31272:419::-;31438:4;31476:2;31465:9;31461:18;31453:26;;31525:9;31519:4;31515:20;31511:1;31500:9;31496:17;31489:47;31553:131;31679:4;31553:131;:::i;:::-;31545:139;;31272:419;;;:::o;31697:191::-;31737:3;31756:20;31774:1;31756:20;:::i;:::-;31751:25;;31790:20;31808:1;31790:20;:::i;:::-;31785:25;;31833:1;31830;31826:9;31819:16;;31854:3;31851:1;31848:10;31845:36;;;31861:18;;:::i;:::-;31845:36;31697:191;;;;:::o;31894:152::-;32034:4;32030:1;32022:6;32018:14;32011:28;31894:152;:::o;32052:365::-;32194:3;32215:66;32279:1;32274:3;32215:66;:::i;:::-;32208:73;;32290:93;32379:3;32290:93;:::i;:::-;32408:2;32403:3;32399:12;32392:19;;32052:365;;;:::o;32423:419::-;32589:4;32627:2;32616:9;32612:18;32604:26;;32676:9;32670:4;32666:20;32662:1;32651:9;32647:17;32640:47;32704:131;32830:4;32704:131;:::i;:::-;32696:139;;32423:419;;;:::o;32848:152::-;32988:4;32984:1;32976:6;32972:14;32965:28;32848:152;:::o;33006:365::-;33148:3;33169:66;33233:1;33228:3;33169:66;:::i;:::-;33162:73;;33244:93;33333:3;33244:93;:::i;:::-;33362:2;33357:3;33353:12;33346:19;;33006:365;;;:::o;33377:419::-;33543:4;33581:2;33570:9;33566:18;33558:26;;33630:9;33624:4;33620:20;33616:1;33605:9;33601:17;33594:47;33658:131;33784:4;33658:131;:::i;:::-;33650:139;;33377:419;;;:::o;33802:106::-;33846:8;33895:5;33890:3;33886:15;33865:36;;33802:106;;;:::o;33914:183::-;33949:3;33987:1;33969:16;33966:23;33963:128;;;34025:1;34022;34019;34004:23;34047:34;34078:1;34072:8;34047:34;:::i;:::-;34040:41;;33963:128;33914:183;:::o;34103:180::-;34151:77;34148:1;34141:88;34248:4;34245:1;34238:15;34272:4;34269:1;34262:15;34289:281;34372:27;34394:4;34372:27;:::i;:::-;34364:6;34360:40;34502:6;34490:10;34487:22;34466:18;34454:10;34451:34;34448:62;34445:88;;;34513:18;;:::i;:::-;34445:88;34553:10;34549:2;34542:22;34332:238;34289:281;;:::o;34576:711::-;34615:3;34653:4;34635:16;34632:26;34661:5;34629:39;34690:20;;:::i;:::-;34765:1;34747:16;34743:24;34740:1;34734:4;34719:49;34798:4;34792:11;34897:16;34890:4;34882:6;34878:17;34875:39;34842:18;34834:6;34831:30;34815:113;34812:146;;;34943:5;;;;34812:146;34989:6;34983:4;34979:17;35025:3;35019:10;35052:18;35044:6;35041:30;35038:43;;;35074:5;;;;;;35038:43;35122:6;35115:4;35110:3;35106:14;35102:27;35181:1;35163:16;35159:24;35153:4;35149:35;35144:3;35141:44;35138:57;;;35188:5;;;;;;;35138:57;35205;35253:6;35247:4;35243:17;35235:6;35231:30;35225:4;35205:57;:::i;:::-;35278:3;35271:10;;34619:668;;;;;34576:711;;:::o;35293:148::-;35395:11;35432:3;35417:18;;35293:148;;;;:::o;35447:171::-;35587:23;35583:1;35575:6;35571:14;35564:47;35447:171;:::o;35624:402::-;35784:3;35805:85;35887:2;35882:3;35805:85;:::i;:::-;35798:92;;35899:93;35988:3;35899:93;:::i;:::-;36017:2;36012:3;36008:12;36001:19;;35624:402;;;:::o;36032:390::-;36138:3;36166:39;36199:5;36166:39;:::i;:::-;36221:89;36303:6;36298:3;36221:89;:::i;:::-;36214:96;;36319:65;36377:6;36372:3;36365:4;36358:5;36354:16;36319:65;:::i;:::-;36409:6;36404:3;36400:16;36393:23;;36142:280;36032:390;;;;:::o;36428:541::-;36661:3;36683:148;36827:3;36683:148;:::i;:::-;36676:155;;36848:95;36939:3;36930:6;36848:95;:::i;:::-;36841:102;;36960:3;36953:10;;36428:541;;;;:::o;36975:275::-;37107:3;37129:95;37220:3;37211:6;37129:95;:::i;:::-;37122:102;;37241:3;37234:10;;36975:275;;;;:::o;37256:224::-;37396:34;37392:1;37384:6;37380:14;37373:58;37465:7;37460:2;37452:6;37448:15;37441:32;37256:224;:::o;37486:402::-;37646:3;37667:85;37749:2;37744:3;37667:85;:::i;:::-;37660:92;;37761:93;37850:3;37761:93;:::i;:::-;37879:2;37874:3;37870:12;37863:19;;37486:402;;;:::o;37894:381::-;38079:3;38101:148;38245:3;38101:148;:::i;:::-;38094:155;;38266:3;38259:10;;37894:381;;;:::o;38281:152::-;38421:4;38417:1;38409:6;38405:14;38398:28;38281:152;:::o;38439:365::-;38581:3;38602:66;38666:1;38661:3;38602:66;:::i;:::-;38595:73;;38677:93;38766:3;38677:93;:::i;:::-;38795:2;38790:3;38786:12;38779:19;;38439:365;;;:::o;38810:419::-;38976:4;39014:2;39003:9;38999:18;38991:26;;39063:9;39057:4;39053:20;39049:1;39038:9;39034:17;39027:47;39091:131;39217:4;39091:131;:::i;:::-;39083:139;;38810:419;;;:::o;39235:180::-;39283:77;39280:1;39273:88;39380:4;39377:1;39370:15;39404:4;39401:1;39394:15;39421:815;39676:4;39714:3;39703:9;39699:19;39691:27;;39728:71;39796:1;39785:9;39781:17;39772:6;39728:71;:::i;:::-;39809:72;39877:2;39866:9;39862:18;39853:6;39809:72;:::i;:::-;39928:9;39922:4;39918:20;39913:2;39902:9;39898:18;39891:48;39956:108;40059:4;40050:6;39956:108;:::i;:::-;39948:116;;40074:72;40142:2;40131:9;40127:18;40118:6;40074:72;:::i;:::-;40156:73;40224:3;40213:9;40209:19;40200:6;40156:73;:::i;:::-;39421:815;;;;;;;;:::o;40242:170::-;40382:22;40378:1;40370:6;40366:14;40359:46;40242:170;:::o;40418:402::-;40578:3;40599:85;40681:2;40676:3;40599:85;:::i;:::-;40592:92;;40693:93;40782:3;40693:93;:::i;:::-;40811:2;40806:3;40802:12;40795:19;;40418:402;;;:::o;40826:541::-;41059:3;41081:148;41225:3;41081:148;:::i;:::-;41074:155;;41246:95;41337:3;41328:6;41246:95;:::i;:::-;41239:102;;41358:3;41351:10;;40826:541;;;;:::o;41373:178::-;41513:30;41509:1;41501:6;41497:14;41490:54;41373:178;:::o;41557:402::-;41717:3;41738:85;41820:2;41815:3;41738:85;:::i;:::-;41731:92;;41832:93;41921:3;41832:93;:::i;:::-;41950:2;41945:3;41941:12;41934:19;;41557:402;;;:::o;41965:381::-;42150:3;42172:148;42316:3;42172:148;:::i;:::-;42165:155;;42337:3;42330:10;;41965:381;;;:::o;42352:178::-;42492:30;42488:1;42480:6;42476:14;42469:54;42352:178;:::o;42536:402::-;42696:3;42717:85;42799:2;42794:3;42717:85;:::i;:::-;42710:92;;42811:93;42900:3;42811:93;:::i;:::-;42929:2;42924:3;42920:12;42913:19;;42536:402;;;:::o;42944:381::-;43129:3;43151:148;43295:3;43151:148;:::i;:::-;43144:155;;43316:3;43309:10;;42944:381;;;:::o;43331:233::-;43370:3;43393:24;43411:5;43393:24;:::i;:::-;43384:33;;43439:66;43432:5;43429:77;43426:103;;43509:18;;:::i;:::-;43426:103;43556:1;43549:5;43545:13;43538:20;;43331:233;;;:::o;43570:152::-;43710:4;43706:1;43698:6;43694:14;43687:28;43570:152;:::o;43728:365::-;43870:3;43891:66;43955:1;43950:3;43891:66;:::i;:::-;43884:73;;43966:93;44055:3;43966:93;:::i;:::-;44084:2;44079:3;44075:12;44068:19;;43728:365;;;:::o;44099:419::-;44265:4;44303:2;44292:9;44288:18;44280:26;;44352:9;44346:4;44342:20;44338:1;44327:9;44323:17;44316:47;44380:131;44506:4;44380:131;:::i;:::-;44372:139;;44099:419;;;:::o;44524:176::-;44664:28;44660:1;44652:6;44648:14;44641:52;44524:176;:::o;44706:402::-;44866:3;44887:85;44969:2;44964:3;44887:85;:::i;:::-;44880:92;;44981:93;45070:3;44981:93;:::i;:::-;45099:2;45094:3;45090:12;45083:19;;44706:402;;;:::o;45114:381::-;45299:3;45321:148;45465:3;45321:148;:::i;:::-;45314:155;;45486:3;45479:10;;45114:381;;;:::o;45501:182::-;45641:34;45637:1;45629:6;45625:14;45618:58;45501:182;:::o;45689:402::-;45849:3;45870:85;45952:2;45947:3;45870:85;:::i;:::-;45863:92;;45964:93;46053:3;45964:93;:::i;:::-;46082:2;46077:3;46073:12;46066:19;;45689:402;;;:::o;46097:381::-;46282:3;46304:148;46448:3;46304:148;:::i;:::-;46297:155;;46469:3;46462:10;;46097:381;;;:::o;46484:180::-;46532:77;46529:1;46522:88;46629:4;46626:1;46619:15;46653:4;46650:1;46643:15

Swarm Source

ipfs://3cb2f5ac2323bec98f4eeefd1175213b44fdd2362f7a48779654778b44e1b9b5

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

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

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