ETH Price: $2,516.20 (-0.35%)

Token

Reap Lend (REAP)
 

Overview

Max Total Supply

546,464,223.095521012288395446 REAP

Holders

69

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,342,965.22655381505651955 REAP

Value
$0.00
0xefec1b91a5547a20df10969bd7dd2dc0209f389f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ReapLend

Compiler Version
v0.8.20+commit.a1b79de6

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-08-23
*/

/* REAP LEND: https://www.reaplend.com */

//SPDX-License-Identifier: UNLICENSED

pragma solidity >= 0.8.20;

/**
 * @title SafeMath
 * @dev Math operations with safety checks that revert on error
 */
library SafeMath {

    int256 constant private INT256_MIN = -2**255;

    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Multiplies two signed integers, reverts on overflow.
    */
    function mul(int256 a, int256 b) internal pure returns (int256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        require(!(a == -1 && b == INT256_MIN)); // This is the only case of overflow not detected by the check below

        int256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Integer division of two signed integers truncating the quotient, reverts on division by zero.
    */
    function div(int256 a, int256 b) internal pure returns (int256) {
        require(b != 0); // Solidity only automatically asserts when dividing by 0
        require(!(b == -1 && a == INT256_MIN)); // This is the only case of overflow

        int256 c = a / b;

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Subtracts two signed integers, reverts on overflow.
    */
    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Adds two signed integers, reverts on overflow.
    */
    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

interface IERC20 {
    function totalSupply() external view returns (uint256);
    function balanceOf(address who) external view returns (uint256);
    function allowance(address _owner, address spender) external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

interface IOwnable {
    function owner() external view returns (address);
}

interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);
    function addLiquidityETH(address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline) external payable returns (uint amountToken, uint amountETH, uint liquidity);
    function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function swapExactTokensForETHSupportingFeeOnTransferTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
    function addLiquidity(address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline) external returns (uint amountA, uint amountB, uint liquidity);    
    function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts);
}

interface IBurnable {
    function burn(uint256 value) external;
    function burnFrom(address account, uint256 value) external;
}

interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function process(uint256 gas) external;
    function inSwap() external view returns (bool);
    function depositNative() external payable;
    function depositToken(address from, uint256 amount) external;
}

interface IWalletDistributor {
    function receiveToken(address token, address from, uint256 amount) external;
}

interface IFeeAllocator {
    receive() external payable;
    function lastSwapTime() external view returns (uint256);
    function createFeeWallet(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createFeeDistributor(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external;
    function createFeeDividend(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external;
    function createFeeBurn(string memory name, uint256 buyTax, uint256 sellTax) external;
    function inSwap() external view returns (bool);
    function createFeeLiquidity(string memory name, uint256 buyTax, uint256 sellTax, address holder) external;
    function setFeeWallet(string memory taxName, address wallet) external;
    function setSellTax(string memory taxName, uint256 taxPercentage) external;
    function setBuyTax(string memory taxName, uint256 taxPercentage) external;
    function takeSellTax(uint256 value) external returns (uint256);
    function allocateFee() external;
    function getSellTax() external view returns (uint256);
    function getBuyTax() external view returns (uint256);
    function takeBuyTax(uint256 value) external returns (uint256);
}

abstract contract BaseErc20 is IERC20, IOwnable {

    mapping (address => uint256) internal _balances;
    mapping (address => mapping (address => uint256)) internal _allowance;
    uint256 internal _totalSupply;
    bool internal _useSafeTransfer;
    
    string public symbol;
    string public  name;
    uint8 public decimals;
    
    address public override owner;
    bool public isTradingEnabled = true;
    address public operator;
    bool public launched;
    
    mapping (address => bool) public canAlwaysTrade;
    mapping (address => bool) public excludedFromSelling;
    mapping (address => bool) public exchanges;
    
    modifier onlyOwner() {
        require(msg.sender == owner, "can only be called by the contract owner");
        _;
    }
    
    modifier isLaunched() {
        require(launched, "can only be called once token is launched");
        _;
    }

    // @dev Trading is allowed before launch if the sender is the owner, we are transferring from the owner, or in canAlwaysTrade list
    modifier tradingEnabled(address from) {
        require((isTradingEnabled && launched) || from == owner || canAlwaysTrade[msg.sender], "trading not enabled");
        _;
    }
    
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    function configure(address _owner) internal virtual {
        owner = _owner;
        canAlwaysTrade[owner] = true;
        operator = owner;
    }

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() external override view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param _owner The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address _owner) external override view returns (uint256) {
        return _balances[_owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address _owner, address spender) external override view returns (uint256) {
        return _allowance[_owner][spender];
    }

    /**
    * @dev Transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) external override tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowance[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) external override tradingEnabled(from) returns (bool) {
        _allowance[from][msg.sender] = _allowance[from][msg.sender] - value;
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowance[from][msg.sender]);
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowance[msg.sender][spender] = _allowance[msg.sender][spender] + addedValue;
        emit Approval(msg.sender, spender, _allowance[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) external tradingEnabled(msg.sender) returns (bool) {
        require(spender != address(0), "cannot approve the 0 address");

        _allowance[msg.sender][spender] = _allowance[msg.sender][spender] - subtractedValue;
        emit Approval(msg.sender, spender, _allowance[msg.sender][spender]);
        return true;
    }

    
    
    // Virtual methods
    function startLaunch() virtual public onlyOwner {
        launched = true;
    }
    
    function preTransfer(address from, address to, uint256 value) virtual internal { }

    function calcTransferAmount(address from, address to, uint256 value) virtual internal returns (uint256) {
        require(from != to, "you cannot transfer to yourself");
        return value;
    }
    
    function postTransfer(address from, address to) virtual internal { }
    
    // Admin methods
    function updateOwner(address who) external onlyOwner {
        require(who != address(0), "cannot be zero address");
        owner = who;
    }

    function renounceOwnership() external onlyOwner {
        emit OwnershipTransferred(owner, address(0));
        owner = address(0);
    }

    function removeEth() external {
        uint256 balance = address(this).balance;
        payable(operator).transfer(balance);
    }


    function transferTokens(address token, address to) external onlyOwner returns(bool){
        uint256 balance = IERC20(token).balanceOf(address(this));
        return IERC20(token).transfer(to, balance);
    }
    
    function setExchange(address who, bool isExchange) external onlyOwner {
        exchanges[who] = isExchange;
    }

    function setCanAlwaysTrade(address who, bool enabled) external onlyOwner {
        canAlwaysTrade[who] = enabled;
    }
   
    // Private methods

    function getRouter() internal view returns (address routerAddress) {
        if (block.chainid == 1 || block.chainid == 5) {
            routerAddress = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if (block.chainid == 97) {
            routerAddress = 0xc99f3718dB7c90b020cBBbb47eD26b0BA0C6512B;
        } else if (block.chainid == 56) {
            routerAddress = 0x10ED43C718714eb63d5aA57B78B54704E256024E;
        } else {
            revert("Unknown Network");
        }
    }

    /**
    * @dev Transfer token for a specified addresses
    * @param from The address to transfer from.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function _transfer(address from, address to, uint256 value) private {
        require(to != address(0), "cannot be zero address");
        require(excludedFromSelling[from] == false, "address is not allowed to sell");
        
        if (_useSafeTransfer) {

            _balances[from] = _balances[from] - value;
            _balances[to] = _balances[to] + value;
            emit Transfer(from, to, value);

        } else {
            preTransfer(from, to, value);

            uint256 modifiedAmount = calcTransferAmount(from, to, value);
            _balances[from] = _balances[from] - value;
            _balances[to] = _balances[to] + modifiedAmount;

            emit Transfer(from, to, modifiedAmount);

            postTransfer(from, to);
        }
    }
}

abstract contract Taxable is BaseErc20 {
    
    IFeeAllocator feeAllocator;
    uint256 public minimumTokensBeforeSwap;
    uint256 swapStartTime;
    bool public autoSwapTax;
    uint256 public minimumTimeBetweenSwaps;
    mapping (address => bool) public excludedFromTax;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        excludedFromTax[_owner] = true;
        super.configure(_owner);
    }
    
    function calcTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        
        uint256 amountAfterTax = value;

        if (excludedFromTax[from] == false && excludedFromTax[to] == false && launched) {
            if (exchanges[from]) {
                // we are BUYING
                amountAfterTax = feeAllocator.takeBuyTax(value);
            } else if (exchanges[to]) {
                // we are SELLING
                amountAfterTax = feeAllocator.takeSellTax(value);
            }
        }

        uint256 taxAmount = value - amountAfterTax;
        if (taxAmount > 0) {
            _balances[address(feeAllocator)] = _balances[address(feeAllocator)] + taxAmount;
            emit Transfer(from, address(feeAllocator), taxAmount);
        }
        return super.calcTransferAmount(from, to, amountAfterTax);
    }


    function preTransfer(address from, address to, uint256 value) override virtual internal {
        if (
            launched && 
            autoSwapTax && 
            exchanges[to] && 
            swapStartTime + 10 <= block.timestamp &&
            _balances[address(feeAllocator)] >= minimumTokensBeforeSwap &&
            !excludedFromTax[from] &&
            feeAllocator.inSwap() == false
        ) {
            swapStartTime = block.timestamp;
            feeAllocator.allocateFee();
        }
        super.preTransfer(from, to, value);
    }

    
    // Public methods
    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function buyTax() external view returns (uint256) {
        return feeAllocator.getBuyTax();
    }

    /**
     * @dev Return the current total sell tax from the tax distributor
     */
    function sellTax() external view returns (uint256) {
        return feeAllocator.getSellTax();
    }

    /**
     * @dev Return the address of the tax distributor contract
     */
    function feeAllocatorAddress() external view returns (address) {
        return address(feeAllocator);
    }    
    
    
    // Admin methods

    function setAutoSwaptax(bool enabled) external onlyOwner {
        autoSwapTax = enabled;
    }

    function setExcludedFromTax(address who, bool enabled) external onlyOwner {
        require(exchanges[who] == false || enabled == false, "Cannot exclude an exchange from tax");
        excludedFromTax[who] = enabled;
    }

    function setTaxDistributionThresholds(uint256 minAmount, uint256 minTime) external onlyOwner {
        minimumTokensBeforeSwap = minAmount;
        minimumTimeBetweenSwaps = minTime;
    }
    
    function setSellTax(string memory taxName, uint256 taxAmount) external onlyOwner {
        feeAllocator.setSellTax(taxName, taxAmount);
    }

    function setBuyTax(string memory taxName, uint256 taxAmount) external onlyOwner {
        feeAllocator.setBuyTax(taxName, taxAmount);
    }
    
    function setFeeWallet(string memory taxName, address wallet) external {
        if (msg.sender == operator) {
            feeAllocator.setFeeWallet(taxName, wallet);
        }
    }
    
    function manualAllocate() external isLaunched {
        if (msg.sender == operator) {
            feeAllocator.allocateFee();
        }
    }
}

interface IAntiSniperBot {
  function setTokenOwner(address owner) external;
  function onPreTransferCheck(address from, address to, uint256 amount) external;
}

abstract contract Burnable is BaseErc20, IBurnable {
    
    mapping (address => bool) public ableToBurn;

    // Overrides
    
    function configure(address _owner) internal virtual override {
        ableToBurn[_owner] = true;
        super.configure(_owner);
    }
    
    modifier onlyBurner() {
        require(ableToBurn[msg.sender], "no burn permissions");
        _;
    }

    // Admin methods

    function setAbleToBurn(address who, bool enabled) external onlyOwner {
        ableToBurn[who] = enabled;
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param value The amount that will be burnt.
     */
    function burn(uint256 value) external override onlyBurner {
        _burn(msg.sender, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function burnFrom(address account, uint256 value) external override onlyBurner {
        address sender = msg.sender;
        uint256 allowance = _allowance[account][sender];
        if (allowance < value) {
            _allowance[account][sender] = 0;
        } else {
            _allowance[account][sender] = allowance - value;
        }
        _burn(account, value);
        emit Approval(account, sender, _allowance[account][sender]);
    }

    // Private methods
    function _burn(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply - value;
        _balances[account] = _balances[account] - value;
        emit Transfer(account, address(0), value);
    }
}

abstract contract AntiSniper is BaseErc20 {
    
    IAntiSniperBot public pinkAntiBot;
    bool private pinkAntiBotConfigured;

    bool public enableSniperBlocking;
    bool public enableBlockLogProtection;
    bool public enableHighTaxCountdown;
    bool public enablePinkAntiBot;
    
    uint256 public msPercentage;
    uint256 public mhPercentage;
    uint256 public maxGasLimit;

    uint256 public launchTime;
    uint256 public launchBlock;
    uint256 public snipersCaught;
    
    mapping (address => bool) public isSniper;
    mapping (address => bool) public isNeverSniper;
    mapping (address => uint256) public transactionBlockLog;
    
    // Overrides
    
    function configure(address _owner) internal virtual override {
        isNeverSniper[_owner] = true;
        super.configure(_owner);
    }
    
    function startLaunch() override virtual public onlyOwner {
        super.startLaunch();
        launchTime = block.timestamp;
        launchBlock = block.number;
    }
    
    function preTransfer(address from, address to, uint256 value) override virtual internal {
        require(enableSniperBlocking == false || isSniper[msg.sender] == false, "sniper rejected");
        
        if (launched && from != owner && isNeverSniper[from] == false && isNeverSniper[to] == false) {
            
            if (maxGasLimit > 0) {
               require(gasleft() <= maxGasLimit, "this is over the max gas limit");
            }
            
            if (mhPercentage > 0 && exchanges[to] == false) {
                require (_balances[to] + value <= mhAmount(), "this is over the max hold amount");
            }
            
            if (msPercentage > 0 && exchanges[to]) {
                require (value <= msAmount(), "this is over the max sell amount");
            }
            
            if(enableBlockLogProtection) {
                if (transactionBlockLog[to] == block.number) {
                    isSniper[to] = true;
                    snipersCaught ++;
                }
                if (transactionBlockLog[from] == block.number) {
                    isSniper[from] = true;
                    snipersCaught ++;
                }
                if (exchanges[to] == false) {
                    transactionBlockLog[to] = block.number;
                }
                if (exchanges[from] == false) {
                    transactionBlockLog[from] = block.number;
                }
            }
            
            if (enablePinkAntiBot) {
                pinkAntiBot.onPreTransferCheck(from, to, value);
            }
        }
        
        super.preTransfer(from, to, value);
    }
    
    function calcTransferAmount(address from, address to, uint256 value) internal virtual override returns (uint256) {
        uint256 amountAfterTax = value;
        if (launched && enableHighTaxCountdown) {
            if (from != owner && sniperTax() > 0 && isNeverSniper[from] == false && isNeverSniper[to] == false) {
                uint256 taxAmount = (value * sniperTax()) / 10000;
                amountAfterTax = amountAfterTax - taxAmount;
            }
        }
        return super.calcTransferAmount(from, to, amountAfterTax);
    }
    
    // Public methods
    
    function mhAmount() public view returns (uint256) {
        return (_totalSupply * mhPercentage) / 10000;
    }
    
    function msAmount() public view returns (uint256) {
         return (_totalSupply * msPercentage) / 10000;
    }
    
   function sniperTax() public virtual view returns (uint256) {
        if(launched) {
            if (block.number - launchBlock < 3) {
                return 7900;
            }
        }
        return 0;
    }
    
    // Admin methods
    
    function configurePinkAntiBot(address antiBot) external onlyOwner {
        pinkAntiBot = IAntiSniperBot(antiBot);
        pinkAntiBot.setTokenOwner(owner);
        pinkAntiBotConfigured = true;
        enablePinkAntiBot = true;
    }
    
    function setSniperBlocking(bool enabled) external onlyOwner {
        enableSniperBlocking = enabled;
    }
    
    function setBlockLogProtection(bool enabled) external onlyOwner {
        enableBlockLogProtection = enabled;
    }
    
    function setHighTaxCountdown(bool enabled) external onlyOwner {
        enableHighTaxCountdown = enabled;
    }
    
    function setPinkAntiBot(bool enabled) external onlyOwner {
        require(pinkAntiBotConfigured, "pink anti bot is not configured");
        enablePinkAntiBot = enabled;
    }
    
    function setMsPercentage(uint256 amount) external onlyOwner {
        msPercentage = amount;
    }
    
    function setMhPercentage(uint256 amount) external onlyOwner {
        mhPercentage = amount;
    }
    
    function setMaxGasLimit(uint256 amount) external onlyOwner {
        maxGasLimit = amount;
    }
    
    function setIsSniper(address who, bool enabled) external onlyOwner {
        isSniper[who] = enabled;
    }

    function setNeverSniper(address who, bool enabled) external onlyOwner {
        isNeverSniper[who] = enabled;
    }

    function removeLimits() external onlyOwner {
        mhPercentage = 0;
        msPercentage = 0;
    }
    // private methods
}

contract FeeAllocator is IFeeAllocator {

    IDEXRouter private _router;
    address immutable private _weth;
    address immutable private _token;
    address immutable public routerAddress;
    address immutable public tokenPair;
    bool public override inSwap;
    uint256 public override lastSwapTime;

    uint256 immutable public maxSellTax;
    uint256 immutable public maxBuyTax;

    enum FeeType { WALLET, DIVIDEND, LIQUIDITY, DISTRIBUTOR, BURN }
    struct Tax {
        string taxName;
        uint256 buyTaxPercentage;
        uint256 sellTaxPercentage;
        uint256 taxPool;
        FeeType taxType;
        address location;
        uint256 share;
        bool convertToNative;
    }
    Tax[] public taxes;

    event DistributionError(string text);
    event TaxesDistributed(uint256 tokensSwapped, uint256 ethReceived);

    modifier onlyToken() {
        require(msg.sender == _token, "no permissions");
        _;
    }

    modifier swapLock() {
        require(inSwap == false, "already swapping");
        inSwap = true;
        _;
        inSwap = false;
    }

    receive() external override payable {}

    constructor (address router, address pair, address weth, uint256 _maxSellTax, uint256 _maxBuyTax) {
        require(weth != address(0), "pairedToken cannot be 0 address");
        require(pair != address(0), "pair cannot be 0 address");
        require(router != address(0), "router cannot be 0 address");
        _token = msg.sender;
        _weth = weth;
        _router = IDEXRouter(router);
        maxSellTax = _maxSellTax;
        maxBuyTax = _maxBuyTax;
        tokenPair = pair;
        routerAddress = router;
    }

    function createFeeLiquidity(string memory name, uint256 buyTax, uint256 sellTax, address holder) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, FeeType.LIQUIDITY, holder, 0, false));
    }

    function createFeeWallet(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, FeeType.WALLET, wallet, 0, convertToNative));
    }

    function createFeeDividend(string memory name, uint256 buyTax, uint256 sellTax, address dividendDistributor, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, FeeType.DIVIDEND, dividendDistributor, 0, convertToNative));
    }
    
    function createFeeBurn(string memory name, uint256 buyTax, uint256 sellTax) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, FeeType.BURN, address(0), 0, false));
    }

    function createFeeDistributor(string memory name, uint256 buyTax, uint256 sellTax, address wallet, bool convertToNative) external override onlyToken {
        taxes.push(Tax(name, buyTax, sellTax, 0, FeeType.DISTRIBUTOR, wallet, 0, convertToNative));
    }

    function allocateFee() external override onlyToken swapLock {
        address[] memory path = new address[](2);
        path[0] = _token;
        path[1] = _weth;
        IERC20 token = IERC20(_token);

        uint256 totalTokens;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].taxType == FeeType.LIQUIDITY) {
                uint256 half = taxes[i].taxPool / 2; totalTokens += taxes[i].taxPool - half;
            } else if (taxes[i].convertToNative) {
                totalTokens += taxes[i].taxPool;
            }
        }
        totalTokens = checkTokenAmount(token, totalTokens);
        if (checkTokenAmount(token, totalTokens) != totalTokens) {
            emit DistributionError("Insufficient tokens to swap. Please add more tokens");
            return;
        }

        uint256[] memory amts = _router.swapExactTokensForETH(
            totalTokens,
            0,
            path,
            address(this),
            block.timestamp + 300
        );
        uint256 amountETH = address(this).balance;

        if (totalTokens != amts[0] || amountETH != amts[1] ) {
            emit DistributionError("Unexpected amounts returned from swap");
        }

        // Calculate the fee allocation
        uint256 toAllocate = amountETH;

        for (uint256 i = 0; i < taxes.length; i++) {

            if (taxes[i].convertToNative || taxes[i].taxType == FeeType.LIQUIDITY) {
                if (i == taxes.length - 1) {
                    taxes[i].share = toAllocate;
                } else if (taxes[i].taxType == FeeType.LIQUIDITY) {
                    uint256 half = taxes[i].taxPool / 2;
                    uint256 share = (amountETH * (taxes[i].taxPool - half)) / totalTokens;
                    taxes[i].share = share;
                    toAllocate = toAllocate - share;
                } else {
                    uint256 share = (amountETH * taxes[i].taxPool) / totalTokens;
                    taxes[i].share = share;
                    toAllocate = toAllocate - share;
                }
            }
        }

        // Distribute the coins
        for (uint256 i = 0; i < taxes.length; i++) {
            
            if (taxes[i].taxType == FeeType.WALLET) {
                if (taxes[i].convertToNative) {
                    payable(taxes[i].location).transfer(taxes[i].share);
                } else {
                    token.transfer(taxes[i].location, checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == FeeType.DISTRIBUTOR) {
                if (taxes[i].convertToNative) {
                    payable(taxes[i].location).transfer(taxes[i].share);
                } else {
                    token.approve(taxes[i].location, taxes[i].taxPool);
                    IWalletDistributor(taxes[i].location).receiveToken(_token, address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == FeeType.DIVIDEND) {
               if (taxes[i].convertToNative) {
                    IDividendDistributor(taxes[i].location).depositNative{value: taxes[i].share}();
                } else {
                    IDividendDistributor(taxes[i].location).depositToken(address(this), checkTokenAmount(token, taxes[i].taxPool));
                }
            }
            else if (taxes[i].taxType == FeeType.BURN) {
                IBurnable(_token).burn(checkTokenAmount(token, taxes[i].taxPool));
            }
            else if (taxes[i].taxType == FeeType.LIQUIDITY) {
                if(taxes[i].share > 0){
                    uint256 half = checkTokenAmount(token, taxes[i].taxPool / 2);
                    _router.addLiquidityETH{value: taxes[i].share}(
                        _token,
                        half,
                        0,
                        0,
                        taxes[i].location,
                        block.timestamp + 300
                    );
                }
            }
            
            taxes[i].taxPool = 0;
            taxes[i].share = 0;
        }

        emit TaxesDistributed(totalTokens, amountETH);

        lastSwapTime = block.timestamp;
    }

    function getSellTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].sellTaxPercentage;
        }
        return taxAmount;
    }

    function getBuyTax() public override onlyToken view returns (uint256) {
        uint256 taxAmount;
        for (uint256 i = 0; i < taxes.length; i++) {
            taxAmount += taxes[i].buyTaxPercentage;
        }
        return taxAmount;
    }
    
    function setFeeWallet(string memory taxName, address wallet) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].taxType == FeeType.WALLET && compStrings(taxes[i].taxName, taxName)) {
                taxes[i].location = wallet;
                updated = true;
            }
        }
        require(updated, "could not find tax to update");
    }

    function setSellTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            if (compStrings(taxes[i].taxName, taxName)) {
                taxes[i].sellTaxPercentage = taxPercentage; updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getSellTax() <= maxSellTax, "tax cannot be set this high");
    }

    function setBuyTax(string memory taxName, uint256 taxPercentage) external override onlyToken {
        bool updated;
        for (uint256 i = 0; i < taxes.length; i++) {
            //if (taxes[i].taxName == taxName) {
            if (compStrings(taxes[i].taxName, taxName)) {
                taxes[i].buyTaxPercentage = taxPercentage; updated = true;
            }
        }
        require(updated, "could not find tax to update");
        require(getBuyTax() <= maxBuyTax, "tax cannot be set this high");
    }

    function takeSellTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].sellTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].sellTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }

    function takeBuyTax(uint256 value) external override onlyToken returns (uint256) {
        for (uint256 i = 0; i < taxes.length; i++) {
            if (taxes[i].buyTaxPercentage > 0) {
                uint256 taxAmount = (value * taxes[i].buyTaxPercentage) / 10000;
                taxes[i].taxPool += taxAmount;
                value = value - taxAmount;
            }
        }
        return value;
    }

    
    // Private methods
    function checkTokenAmount(IERC20 token, uint256 amount) private view returns (uint256) {
        uint256 balance = token.balanceOf(address(this));
        if (balance > amount) { return amount; }
        return balance;
    }

    function compStrings(string memory a, string memory b) private pure returns (bool) {
        return (keccak256(abi.encodePacked((a))) == keccak256(abi.encodePacked((b))));
    }

}

contract ReapLend is BaseErc20, AntiSniper, Burnable, Taxable {

    uint256 public rewardsThreshold;
    mapping(address => bool) public rewardsClaimable;

    constructor () {
        configure(msg.sender);

        symbol = "REAP";
        name = "Reap Lend";
        decimals = 18;

        // Swap
        address routerAddress = getRouter();
        IDEXRouter router = IDEXRouter(routerAddress);
        address WETH = router.WETH();
        address pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        feeAllocator = new FeeAllocator(routerAddress, pair, WETH, 1500, 1500);
        exchanges[pair] = true;

        // Anti Sniper
        enableSniperBlocking = true;
        isNeverSniper[address(feeAllocator)] = true;
        mhPercentage = 300;
        msPercentage = 300;
        enableHighTaxCountdown = true;

        // Tax
        minimumTimeBetweenSwaps = 16 seconds;
        minimumTokensBeforeSwap = 1_000_000 * 10 ** decimals;
        excludedFromTax[address(feeAllocator)] = true;
        feeAllocator.createFeeWallet("Treasury", 200, 100, 0xC773bfe0903f01A422aDaB7944f56406C881AcC2, true);
        feeAllocator.createFeeWallet("Marketing", 100, 200, 0x3c617470b9Ddc70c824b99b1F51dB4c28A5E3042, true);
        autoSwapTax = true;
        enableBlockLogProtection = true;

        // Burnable
        ableToBurn[address(feeAllocator)] = true;

        // Rewards
        rewardsClaimable[owner] = true;
        rewardsThreshold = 10_000_000 * 10 ** decimals;

        _totalSupply = _totalSupply + (1_000_000_000 * 10 ** decimals);
        _allowance[address(feeAllocator)][routerAddress] = 2**256 - 1;
        _balances[owner] = _balances[owner] + _totalSupply;
        emit Transfer(address(0), owner, _totalSupply);
    }


    // Overrides
    function startLaunch() public override(AntiSniper, BaseErc20) onlyOwner {
        super.startLaunch();
    }

    function configure(address _owner) internal override(AntiSniper, Burnable, Taxable, BaseErc20) {
        super.configure(_owner);
    }
    
    function calcTransferAmount(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal returns (uint256) {
        return super.calcTransferAmount(from, to, value);
    }

    function preTransfer(address from, address to, uint256 value) override(AntiSniper, Taxable, BaseErc20) internal {
        super.preTransfer(from, to, value);
    }
    
    
    function postTransfer(address from, address to) override(BaseErc20) internal {
        super.postTransfer(from, to);
    }

    // Public Functions

    function claimableRewards(address who) external view returns(bool) {
        return rewardsClaimable[who] || _balances[who] >= rewardsThreshold;
    }

    // Admin Functions

    function setRewardsClaimable(address who, bool on) external onlyOwner {
        rewardsClaimable[who] = on;
    }

    function setRewardsThreshold(uint256 amount) external onlyOwner {
        rewardsThreshold = amount;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"ableToBurn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoSwapTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"canAlwaysTrade","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"claimableRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"antiBot","type":"address"}],"name":"configurePinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"enableBlockLogProtection","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableHighTaxCountdown","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enablePinkAntiBot","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableSniperBlocking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"exchanges","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromSelling","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"excludedFromTax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAllocatorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isNeverSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSniper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualAllocate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxGasLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mhPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTimeBetweenSwaps","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"msPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pinkAntiBot","outputs":[{"internalType":"contract IAntiSniperBot","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"removeEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsClaimable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAbleToBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setAutoSwaptax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setBlockLogProtection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setBuyTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setCanAlwaysTrade","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"isExchange","type":"bool"}],"name":"setExchange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setExcludedFromTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"address","name":"wallet","type":"address"}],"name":"setFeeWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setHighTaxCountdown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setIsSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMaxGasLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMhPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setMsPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setNeverSniper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setPinkAntiBot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"},{"internalType":"bool","name":"on","type":"bool"}],"name":"setRewardsClaimable","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setRewardsThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"taxName","type":"string"},{"internalType":"uint256","name":"taxAmount","type":"uint256"}],"name":"setSellTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"setSniperBlocking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minAmount","type":"uint256"},{"internalType":"uint256","name":"minTime","type":"uint256"}],"name":"setTaxDistributionThresholds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sniperTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"snipersCaught","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startLaunch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"transactionBlockLog","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526006805460ff60a81b1916600160a81b17905534801562000023575f80fd5b506200002f33620005eb565b604080518082019091526004808252630524541560e41b602083015290620000589082620007f4565b506040805180820190915260098152681499585c0813195b9960ba1b6020820152600590620000889082620007f4565b506006805460ff191660121790555f620000a162000694565b90505f8190505f816001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000e5573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906200010b9190620008bc565b90505f826001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200014b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001719190620008bc565b6040516364e329cb60e11b81526001600160a01b038481166004830152306024830152919091169063c9c65396906044016020604051808303815f875af1158015620001bf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620001e59190620008bc565b90508381836105dc80604051620001fc9062000746565b6001600160a01b03958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103905ff08015801562000244573d5f803e3d5ffd5b50601680546001600160a01b039283166001600160a01b03199091161781558282165f908152600a60208181526040808420805460ff199081166001908117909255600b805460ff60a81b1916600160a81b178155965490971685526013909252909220805490941690911790925561012c600d819055600c55805460ff60b81b1916600160b81b1790556010601a55600654620002e99160ff9190911690620009fa565b620002f890620f424062000a0a565b601755601680546001600160a01b039081165f908152601b602052604090819020805460ff191660019081179091559254905163b02096c360e01b815260a06004820152600860a482015267547265617375727960c01b60c482015260c8602482015260646044820181905273c773bfe0903f01a422adab7944f56406c881acc2908201526084810193909352169063b02096c39060e4015f604051808303815f87803b158015620003a8575f80fd5b505af1158015620003bb573d5f803e3d5ffd5b505060165460405163b02096c360e01b815260a06004820152600960a4820152684d61726b6574696e6760b81b60c482015260646024820181905260c86044830152733c617470b9ddc70c824b99b1f51db4c28a5e304290820152600160848201526001600160a01b03909116925063b02096c3915060e4015f604051808303815f87803b1580156200044c575f80fd5b505af11580156200045f573d5f803e3d5ffd5b50506019805460ff199081166001908117909255600b805460ff60b01b1916600160b01b1790556016546001600160a01b039081165f90815260156020908152604080832080548616871790556006805461010090049094168352601d90915290208054909216909217905554620004df925060ff169050600a620009fa565b620004ee906298968062000a0a565b601c55600654620005049060ff16600a620009fa565b6200051490633b9aca0062000a0a565b60025462000523919062000a24565b60029081556016546001600160a01b039081165f908152600160209081526040808320898516845282528083205f199055935460065461010090049093168252819052919091205462000577919062000a24565b600680546001600160a01b036101009182900481165f90815260208190526040808220959095559254600254945192900416927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91620005d991815260200190565b60405180910390a35050505062000a3a565b62000691816001600160a01b038181165f818152601b602090815260408083208054600160ff19918216811790925560158452828520805482168317905560138452828520805482168317905560068054610100978802610100600160a81b03199091161780825587900488168652600890945291909320805490911690921790915554600780546001600160a01b031916929091049092161790556200069181818181565b50565b5f4660011480620006a55750466005145b15620006c45750737a250d5630b4cf539739df2c5dacb4c659f2488d90565b46606103620006e6575073c99f3718db7c90b020cbbbb47ed26b0ba0c6512b90565b466038036200070857507310ed43c718714eb63d5aa57b78b54704e256024e90565b60405162461bcd60e51b815260206004820152600f60248201526e556e6b6e6f776e204e6574776f726b60881b604482015260640160405180910390fd5b612c81806200397383390190565b634e487b7160e01b5f52604160045260245ffd5b600181811c908216806200077d57607f821691505b6020821081036200079c57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f821115620007ef575f81815260208120601f850160051c81016020861015620007ca5750805b601f850160051c820191505b81811015620007eb57828155600101620007d6565b5050505b505050565b81516001600160401b0381111562000810576200081062000754565b620008288162000821845462000768565b84620007a2565b602080601f8311600181146200085e575f8415620008465750858301515b5f19600386901b1c1916600185901b178555620007eb565b5f85815260208120601f198616915b828110156200088e578886015182559484019460019091019084016200086d565b5085821015620008ac57878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f60208284031215620008cd575f80fd5b81516001600160a01b0381168114620008e4575f80fd5b9392505050565b634e487b7160e01b5f52601160045260245ffd5b600181815b808511156200093f57815f1904821115620009235762000923620008eb565b808516156200093157918102915b93841c939080029062000904565b509250929050565b5f826200095757506001620009f4565b816200096557505f620009f4565b81600181146200097e57600281146200098957620009a9565b6001915050620009f4565b60ff8411156200099d576200099d620008eb565b50506001821b620009f4565b5060208310610133831016604e8410600b8410161715620009ce575081810a620009f4565b620009da8383620008ff565b805f1904821115620009f057620009f0620008eb565b0290505b92915050565b5f620008e460ff84168362000947565b8082028115828204841417620009f457620009f4620008eb565b80820180821115620009f457620009f4620008eb565b612f2b8062000a485f395ff3fe608060405234801561000f575f80fd5b5060043610610443575f3560e01c8063715018a611610237578063c20c5caf11610135578063d430d1bd116100bf578063e79d416011610084578063e79d4160146109ba578063e948474b146109c3578063ede49a19146109e5578063f19fffcb146109f9578063f1f5cd9114610a0d575f80fd5b8063d430d1bd1461093e578063db38a41d14610947578063dba61c5814610966578063dc01f60d1461096f578063dd62ed3e14610982575f80fd5b8063cc1776d311610105578063cc1776d3146108fe578063d00efb2f14610906578063d2d7ad831461090f578063d31acb2814610918578063d3b0066f1461092b575f80fd5b8063c20c5caf146108bc578063c2ed286b146108cf578063c4a5abcd146108e2578063c552f4c5146108eb575f80fd5b806389d53c01116101c1578063a457c2d711610186578063a457c2d71461083f578063a9059cbb14610852578063b02b605e14610865578063b0ad3ebf14610878578063c10fde1b1461089a575f80fd5b806389d53c01146107d75780638da5cb5b146107ea578063904b01301461080257806395d89b4114610815578063989763ef1461081d575f80fd5b806379cc67901161020757806379cc6790146107795780638091f3bf1461078c57806381045345146107a057806382b75953146107b3578063880cdc31146107c4575f80fd5b8063715018a61461073e5780637412dbb314610746578063751039fc14610768578063790ca41314610770575f80fd5b8063407133d21161034457806359a945e9116102ce5780636508c57e116102935780636508c57e146106db5780636a092e79146106ee5780636b8f2f3b146107015780636f8645521461070e57806370a0823114610716575f80fd5b806359a945e91461069c5780635d90bbaf146106a45780635d9d7d43146106b75780635e45da23146106ca5780636331bf65146106d3575f80fd5b80634f72e2a2116103145780634f72e2a21461063c5780634fbc27751461064f57806352c6dbc4146106625780635543379a14610676578063570ca73514610689575f80fd5b8063407133d2146105ed57806342966c681461061857806345541cba1461062b5780634f7041a514610634575f80fd5b80631e19ae77116103d057806330bd85c51161039557806330bd85c514610572578063313ce567146105865780633164df8b146105a557806336827499146105c757806339509351146105da575f80fd5b80631e19ae771461050f5780631f4a6d321461052257806323b872dd1461052a57806328be90381461053d5780632b75062714610550575f80fd5b80630f3a325f116104165780630f3a325f146104ad5780631776834a146104cf57806318160ddd146104e2578063182561e1146104f45780631b0109d514610507575f80fd5b8063064a59d01461044757806306fdde031461047057806307a1cfbd14610485578063095ea7b31461049a575b5f80fd5b60065461045b90600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b610478610a15565b6040516104679190612a39565b610498610493366004612aef565b610aa1565b005b61045b6104a8366004612b4c565b610b3c565b61045b6104bb366004612b74565b60126020525f908152604090205460ff1681565b6104986104dd366004612b8d565b610c2c565b6002545b604051908152602001610467565b610498610502366004612bb1565b610c60565b610498610cb9565b61049861051d366004612bb1565b610d9b565b610498610df4565b61045b610538366004612be6565b610e2f565b61049861054b366004612bb1565b610f54565b61045b61055e366004612b74565b60136020525f908152604090205460ff1681565b600b5461045b90600160c01b900460ff1681565b6006546105939060ff1681565b60405160ff9091168152602001610467565b61045b6105b3366004612b74565b60156020525f908152604090205460ff1681565b6104986105d5366004612c1f565b610fad565b61045b6105e8366004612b4c565b610ffa565b600b54610600906001600160a01b031681565b6040516001600160a01b039091168152602001610467565b610498610626366004612b8d565b611109565b6104e6600c5481565b6104e661116a565b61049861064a366004612c1f565b6111da565b61049861065d366004612bb1565b61121c565b600b5461045b90600160b01b900460ff1681565b610498610684366004612c1f565b611275565b600754610600906001600160a01b031681565b6104986112c2565b6104986106b2366004612bb1565b6112f9565b6104986106c5366004612bb1565b611352565b6104e6600e5481565b6104e66113ab565b6104986106e9366004612aef565b6113c9565b61045b6106fc366004612c3a565b61142a565b60195461045b9060ff1681565b6104e6611541565b6104e6610724366004612b74565b6001600160a01b03165f9081526020819052604090205490565b610498611555565b61045b610754366004612b74565b600a6020525f908152604090205460ff1681565b6104986115d3565b6104e6600f5481565b610498610787366004612b4c565b61160d565b60075461045b90600160a01b900460ff1681565b6104986107ae366004612b8d565b61173f565b6016546001600160a01b0316610600565b6104986107d2366004612b74565b611773565b6104986107e5366004612c1f565b611819565b6006546106009061010090046001600160a01b031681565b610498610810366004612c6b565b6118bf565b610478611903565b61045b61082b366004612b74565b601b6020525f908152604090205460ff1681565b61045b61084d366004612b4c565b611910565b61045b610860366004612b4c565b6119dc565b610498610873366004612b8d565b611a69565b61045b610886366004612b74565b60086020525f908152604090205460ff1681565b61045b6108a8366004612b74565b601d6020525f908152604090205460ff1681565b6104986108ca366004612b8d565b611a9d565b6104986108dd366004612bb1565b611ad1565b6104e6600d5481565b6104986108f9366004612c1f565b611ba7565b6104e6611bf4565b6104e660105481565b6104e660175481565b610498610926366004612cad565b611c3b565b610498610939366004612b74565b611c75565b6104e6601c5481565b6104e6610955366004612b74565b60146020525f908152604090205481565b6104e6601a5481565b61045b61097d366004612b74565b611d36565b6104e6610990366004612c3a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104e660115481565b61045b6109d1366004612b74565b60096020525f908152604090205460ff1681565b600b5461045b90600160a81b900460ff1681565b600b5461045b90600160b81b900460ff1681565b6104e6611d7a565b60058054610a2290612ccd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e90612ccd565b8015610a995780601f10610a7057610100808354040283529160200191610a99565b820191905f5260205f20905b815481529060010190602001808311610a7c57829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610ad95760405162461bcd60e51b8152600401610ad090612d05565b60405180910390fd5b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b0b9085908590600401612d4d565b5f604051808303815f87803b158015610b22575f80fd5b505af1158015610b34573d5f803e3d5ffd5b505050505050565b6006545f903390600160a81b900460ff168015610b625750600754600160a01b900460ff165b80610b7f57506006546001600160a01b0382811661010090920416145b80610b985750335f9081526008602052604090205460ff165b610bb45760405162461bcd60e51b8152600401610ad090612d6e565b6001600160a01b038416610bda5760405162461bcd60e51b8152600401610ad090612d9b565b335f8181526001602090815260408083206001600160a01b03891680855290835292819020879055518681529192915f80516020612ed683398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610c5b5760405162461bcd60e51b8152600401610ad090612d05565b600e55565b60065461010090046001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152601d60205260409020805460ff1916911515919091179055565b600754600160a01b900460ff16610d245760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610ad0565b6007546001600160a01b03163303610d995760165f9054906101000a90046001600160a01b03166001600160a01b031663774195846040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610d82575f80fd5b505af1158015610d94573d5f803e3d5ffd5b505050505b565b60065461010090046001600160a01b03163314610dca5760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083905f818181858888f19350505050158015610e2b573d5f803e3d5ffd5b5050565b6006545f908490600160a81b900460ff168015610e555750600754600160a01b900460ff165b80610e7257506006546001600160a01b0382811661010090920416145b80610e8b5750335f9081526008602052604090205460ff165b610ea75760405162461bcd60e51b8152600401610ad090612d6e565b6001600160a01b0385165f908152600160209081526040808320338452909152902054610ed5908490612de6565b6001600160a01b0386165f908152600160209081526040808320338452909152902055610f03858585611db0565b6001600160a01b0385165f81815260016020908152604080832033808552908352928190205490519081529192915f80516020612ed6833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610f835760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610fdc5760405162461bcd60e51b8152600401610ad090612d05565b600b8054911515600160b81b0260ff60b81b19909216919091179055565b6006545f903390600160a81b900460ff1680156110205750600754600160a01b900460ff165b8061103d57506006546001600160a01b0382811661010090920416145b806110565750335f9081526008602052604090205460ff165b6110725760405162461bcd60e51b8152600401610ad090612d6e565b6001600160a01b0384166110985760405162461bcd60e51b8152600401610ad090612d9b565b335f9081526001602090815260408083206001600160a01b03881684529091529020546110c6908490612df9565b335f8181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290925f80516020612ed68339815191529101610c1a565b335f9081526015602052604090205460ff1661115d5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610ad0565b6111673382611fbf565b50565b60165460408051631296b91d60e11b815290515f926001600160a01b03169163252d723a9160048083019260209291908290030181865afa1580156111b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d59190612e0c565b905090565b60065461010090046001600160a01b031633146112095760405162461bcd60e51b8152600401610ad090612d05565b6019805460ff1916911515919091179055565b60065461010090046001600160a01b0316331461124b5760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146112a45760405162461bcd60e51b8152600401610ad090612d05565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b60065461010090046001600160a01b031633146112f15760405162461bcd60e51b8152600401610ad090612d05565b610d99612044565b60065461010090046001600160a01b031633146113285760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152601260205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146113815760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b5f612710600d546002546113bf9190612e23565b6111d59190612e3a565b60065461010090046001600160a01b031633146113f85760405162461bcd60e51b8152600401610ad090612d05565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b0b9085908590600401612d4d565b6006545f9061010090046001600160a01b0316331461145b5760405162461bcd60e51b8152600401610ad090612d05565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa15801561149f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c39190612e0c565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015611513573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115379190612e59565b9150505b92915050565b5f612710600c546002546113bf9190612e23565b60065461010090046001600160a01b031633146115845760405162461bcd60e51b8152600401610ad090612d05565b6006546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146116025760405162461bcd60e51b8152600401610ad090612d05565b5f600d819055600c55565b335f9081526015602052604090205460ff166116615760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610ad0565b6001600160a01b0382165f90815260016020908152604080832033808552925290912054828110156116b9576001600160a01b038085165f9081526001602090815260408083209386168352929052908120556116e9565b6116c38382612de6565b6001600160a01b038086165f908152600160209081526040808320938716835292905220555b6116f38484611fbf565b6001600160a01b038481165f818152600160209081526040808320948716808452948252918290205491519182525f80516020612ed6833981519152910160405180910390a350505050565b60065461010090046001600160a01b0316331461176e5760405162461bcd60e51b8152600401610ad090612d05565b600d55565b60065461010090046001600160a01b031633146117a25760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b0381166117f15760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610ad0565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60065461010090046001600160a01b031633146118485760405162461bcd60e51b8152600401610ad090612d05565b600b54600160a01b900460ff166118a15760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610ad0565b600b8054911515600160c01b0260ff60c01b19909216919091179055565b6007546001600160a01b03163303610e2b57601654604051630904b01360e41b81526001600160a01b039091169063904b013090610b0b9085908590600401612e74565b60048054610a2290612ccd565b6006545f903390600160a81b900460ff1680156119365750600754600160a01b900460ff165b8061195357506006546001600160a01b0382811661010090920416145b8061196c5750335f9081526008602052604090205460ff165b6119885760405162461bcd60e51b8152600401610ad090612d6e565b6001600160a01b0384166119ae5760405162461bcd60e51b8152600401610ad090612d9b565b335f9081526001602090815260408083206001600160a01b03881684529091529020546110c6908490612de6565b6006545f903390600160a81b900460ff168015611a025750600754600160a01b900460ff165b80611a1f57506006546001600160a01b0382811661010090920416145b80611a385750335f9081526008602052604090205460ff165b611a545760405162461bcd60e51b8152600401610ad090612d6e565b611a5f338585611db0565b5060019392505050565b60065461010090046001600160a01b03163314611a985760405162461bcd60e51b8152600401610ad090612d05565b601c55565b60065461010090046001600160a01b03163314611acc5760405162461bcd60e51b8152600401610ad090612d05565b600c55565b60065461010090046001600160a01b03163314611b005760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b0382165f908152600a602052604090205460ff161580611b25575080155b611b7d5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610ad0565b6001600160a01b03919091165f908152601b60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611bd65760405162461bcd60e51b8152600401610ad090612d05565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6016546040805163585e42ef60e11b815290515f926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa1580156111b1573d5f803e3d5ffd5b60065461010090046001600160a01b03163314611c6a5760405162461bcd60e51b8152600401610ad090612d05565b601791909155601a55565b60065461010090046001600160a01b03163314611ca45760405162461bcd60e51b8152600401610ad090612d05565b600b80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd9906024015f604051808303815f87803b158015611d02575f80fd5b505af1158015611d14573d5f803e3d5ffd5b5050600b805464ff000000ff60a01b191664010000000160a01b179055505050565b6001600160a01b0381165f908152601d602052604081205460ff168061153b5750601c546001600160a01b0383165f90815260208190526040902054101592915050565b6007545f90600160a01b900460ff1615611dab57600360105443611d9e9190612de6565b1015611dab5750611edc90565b505f90565b6001600160a01b038216611dff5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610ad0565b6001600160a01b0383165f9081526009602052604090205460ff1615611e675760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610ad0565b60035460ff1615611f09576001600160a01b0383165f90815260208190526040902054611e95908290612de6565b6001600160a01b038085165f908152602081905260408082209390935590841681522054611ec4908290612df9565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616915f80516020612eb6833981519152910160405180910390a3505050565b611f14838383612085565b5f611f20848484612090565b6001600160a01b0385165f90815260208190526040902054909150611f46908390612de6565b6001600160a01b038086165f908152602081905260408082209390935590851681522054611f75908290612df9565b6001600160a01b038481165f818152602081815260409182902094909455518481529092918716915f80516020612eb6833981519152910160405180910390a3610d94565b505050565b6001600160a01b038216611fd1575f80fd5b80600254611fdf9190612de6565b6002556001600160a01b0382165f90815260208190526040902054612005908290612de6565b6001600160a01b0383165f8181526020818152604080832094909455925184815290925f80516020612eb6833981519152910160405180910390a35050565b60065461010090046001600160a01b031633146120735760405162461bcd60e51b8152600401610ad090612d05565b61207b6120a4565b42600f5543601055565b611fba8383836120e8565b5f61209c848484612277565b949350505050565b60065461010090046001600160a01b031633146120d35760405162461bcd60e51b8152600401610ad090612d05565b6007805460ff60a01b1916600160a01b179055565b600754600160a01b900460ff168015612103575060195460ff165b801561212657506001600160a01b0382165f908152600a602052604090205460ff165b8015612140575042601854600a61213d9190612df9565b11155b801561216757506017546016546001600160a01b03165f9081526020819052604090205410155b801561218b57506001600160a01b0383165f908152601b602052604090205460ff16155b8015612208575060165f9054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122069190612e59565b155b1561226c574260185560165460408051631dd0656160e21b815290516001600160a01b03909216916377419584916004808201925f9290919082900301818387803b158015612255575f80fd5b505af1158015612267573d5f803e3d5ffd5b505050505b611fba83838361248c565b6001600160a01b0383165f908152601b6020526040812054829060ff161580156122b957506001600160a01b0384165f908152601b602052604090205460ff16155b80156122ce5750600754600160a01b900460ff165b156123f5576001600160a01b0385165f908152600a602052604090205460ff16156123665760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303815f875af115801561233b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061235f9190612e0c565b90506123f5565b6001600160a01b0384165f908152600a602052604090205460ff16156123f557601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303815f875af11580156123ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f29190612e0c565b90505b5f6124008285612de6565b90508015612477576016546001600160a01b03165f9081526020819052604090205461242d908290612df9565b601680546001600160a01b039081165f9081526020818152604091829020949094559154915184815291811692908916915f80516020612eb6833981519152910160405180910390a35b6124828686846128a8565b9695505050505050565b600b54600160a81b900460ff1615806124b45750335f9081526012602052604090205460ff16155b6124f25760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610ad0565b600754600160a01b900460ff16801561251e57506006546001600160a01b038481166101009092041614155b801561254257506001600160a01b0383165f9081526013602052604090205460ff16155b801561256657506001600160a01b0382165f9081526013602052604090205460ff16155b15611fba57600e54156125c557600e545a11156125c55760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610ad0565b5f600d541180156125ee57506001600160a01b0382165f908152600a602052604090205460ff16155b1561266c576125fb6113ab565b6001600160a01b0383165f9081526020819052604090205461261e908390612df9565b111561266c5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610ad0565b5f600c5411801561269457506001600160a01b0382165f908152600a602052604090205460ff165b156126f0576126a1611541565b8111156126f05760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610ad0565b600b54600160b01b900460ff1615612828576001600160a01b0382165f90815260146020526040902054439003612757576001600160a01b0382165f908152601260205260408120805460ff19166001179055601180549161275183612e9d565b91905055505b6001600160a01b0383165f908152601460205260409020544390036127ac576001600160a01b0383165f908152601260205260408120805460ff1916600117905560118054916127a683612e9d565b91905055505b6001600160a01b0382165f908152600a602052604081205460ff16151590036127ea576001600160a01b0382165f9081526014602052604090204390555b6001600160a01b0383165f908152600a602052604081205460ff1615159003612828576001600160a01b0383165f9081526014602052604090204390555b600b54600160c01b900460ff1615611fba57600b5460405163090ec10b60e31b81526001600160a01b038581166004830152848116602483015260448201849052909116906348760858906064015f604051808303815f87803b15801561288d575f80fd5b505af115801561289f573d5f803e3d5ffd5b50505050505050565b6007545f908290600160a01b900460ff1680156128ce5750600b54600160b81b900460ff165b15612979576006546001600160a01b0386811661010090920416148015906128fc57505f6128fa611d7a565b115b801561292057506001600160a01b0385165f9081526013602052604090205460ff16155b801561294457506001600160a01b0384165f9081526013602052604090205460ff16155b15612979575f612710612955611d7a565b61295f9086612e23565b6129699190612e3a565b90506129758183612de6565b9150505b61298485858361298d565b95945050505050565b5f826001600160a01b0316846001600160a01b0316036129ef5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610ad0565b5092915050565b5f81518084525f5b81811015612a1a576020818501810151868301820152016129fe565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f612a4b60208301846129f6565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612a75575f80fd5b813567ffffffffffffffff80821115612a9057612a90612a52565b604051601f8301601f19908116603f01168101908282118183101715612ab857612ab8612a52565b81604052838152866020858801011115612ad0575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215612b00575f80fd5b823567ffffffffffffffff811115612b16575f80fd5b612b2285828601612a66565b95602094909401359450505050565b80356001600160a01b0381168114612b47575f80fd5b919050565b5f8060408385031215612b5d575f80fd5b612b6683612b31565b946020939093013593505050565b5f60208284031215612b84575f80fd5b612a4b82612b31565b5f60208284031215612b9d575f80fd5b5035919050565b8015158114611167575f80fd5b5f8060408385031215612bc2575f80fd5b612bcb83612b31565b91506020830135612bdb81612ba4565b809150509250929050565b5f805f60608486031215612bf8575f80fd5b612c0184612b31565b9250612c0f60208501612b31565b9150604084013590509250925092565b5f60208284031215612c2f575f80fd5b8135612a4b81612ba4565b5f8060408385031215612c4b575f80fd5b612c5483612b31565b9150612c6260208401612b31565b90509250929050565b5f8060408385031215612c7c575f80fd5b823567ffffffffffffffff811115612c92575f80fd5b612c9e85828601612a66565b925050612c6260208401612b31565b5f8060408385031215612cbe575f80fd5b50508035926020909101359150565b600181811c90821680612ce157607f821691505b602082108103612cff57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b604081525f612d5f60408301856129f6565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561153b5761153b612dd2565b8082018082111561153b5761153b612dd2565b5f60208284031215612e1c575f80fd5b5051919050565b808202811582820484141761153b5761153b612dd2565b5f82612e5457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612e69575f80fd5b8151612a4b81612ba4565b604081525f612e8660408301856129f6565b905060018060a01b03831660208301529392505050565b5f60018201612eae57612eae612dd2565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220f455b8d6c69a6eda94b187fe3719ceb1cda9a712b98c25838fe9638fc8b11f3164736f6c6343000814003361014060405234801562000011575f80fd5b5060405162002c8138038062002c8183398101604081905262000034916200019b565b6001600160a01b038316620000905760405162461bcd60e51b815260206004820152601f60248201527f706169726564546f6b656e2063616e6e6f74206265203020616464726573730060448201526064015b60405180910390fd5b6001600160a01b038416620000e85760405162461bcd60e51b815260206004820152601860248201527f706169722063616e6e6f74206265203020616464726573730000000000000000604482015260640162000087565b6001600160a01b038516620001405760405162461bcd60e51b815260206004820152601a60248201527f726f757465722063616e6e6f7420626520302061646472657373000000000000604482015260640162000087565b3360a0526001600160a01b039283166080525f80546001600160a01b031916958416958617905561010091909152610120521660e05260c052620001f4565b80516001600160a01b038116811462000196575f80fd5b919050565b5f805f805f60a08688031215620001b0575f80fd5b620001bb866200017f565b9450620001cb602087016200017f565b9350620001db604087016200017f565b6060870151608090970151959894975095949392505050565b60805160a05160c05160e05161010051610120516129c0620002c15f395f8181610349015261057d01525f81816102b00152610cbf01525f6103ca01525f6101d501525f8181610416015281816106020152818161076f015281816108cf0152818161096d01528181610a8a01528181610bfc01528181610cf101528181610dae01528181610e4d01528181611747015281816119d101528181611b1301528181611cc801528181611df701528181611e7801528181611ffb015261210e01525f610e0101526129c05ff3fe60806040526004361061011e575f3560e01c8063904b01301161009d578063c8e956ab11610062578063c8e956ab14610338578063d83067861461036b578063db017dc71461039a578063ee16c160146103b9578063f0154197146103ec575f80fd5b8063904b013014610280578063a411209a1461029f578063b02096c3146102d2578063b0bc85de146102f1578063c5be2bc714610305575f80fd5b80633268cc56116100e35780633268cc56146101c45780634fa26fd51461020f57806355ecc1411461022e5780636508c57e1461024d578063774195841461026c575f80fd5b806307a1cfbd146101295780630dd871571461014a5780631fbd1236146101725780632528e80f14610191578063252d723a146101b0575f80fd5b3661012557005b5f80fd5b348015610134575f80fd5b50610148610143366004612312565b61040b565b005b348015610155575f80fd5b5061015f60015481565b6040519081526020015b60405180910390f35b34801561017d575f80fd5b5061014861018c36600461236a565b6105f7565b34801561019c575f80fd5b506101486101ab3660046123c7565b610764565b3480156101bb575f80fd5b5061015f6108c3565b3480156101cf575f80fd5b506101f77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610169565b34801561021a575f80fd5b5061015f610229366004612411565b610961565b348015610239575f80fd5b50610148610248366004612438565b610a7f565b348015610258575f80fd5b50610148610267366004612312565b610bf1565b348015610277575f80fd5b50610148610ce6565b34801561028b575f80fd5b5061014861029a3660046124a9565b611cbd565b3480156102aa575f80fd5b5061015f7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102dd575f80fd5b506101486102ec366004612438565b611dec565b3480156102fc575f80fd5b5061015f611e6c565b348015610310575f80fd5b5061032461031f366004612411565b611f04565b60405161016998979695949392919061252a565b348015610343575f80fd5b5061015f7f000000000000000000000000000000000000000000000000000000000000000081565b348015610376575f80fd5b505f5461038a90600160a01b900460ff1681565b6040519015158152602001610169565b3480156103a5575f80fd5b5061015f6103b4366004612411565b611fef565b3480156103c4575f80fd5b506101f77f000000000000000000000000000000000000000000000000000000000000000081565b3480156103f7575f80fd5b50610148610406366004612438565b612103565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461045c5760405162461bcd60e51b8152600401610453906125c6565b60405180910390fd5b5f805b60025481101561055d5761051a6002828154811061047f5761047f6125ee565b905f5260205f2090600702015f01805461049890612602565b80601f01602080910402602001604051908101604052809291908181526020018280546104c490612602565b801561050f5780601f106104e65761010080835404028352916020019161050f565b820191905f5260205f20905b8154815290600101906020018083116104f257829003601f168201915b505050505085612184565b1561054b578260028281548110610533576105336125ee565b905f5260205f20906007020160010181905550600191505b806105558161264e565b91505061045f565b508061057b5760405162461bcd60e51b815260040161045390612666565b7f00000000000000000000000000000000000000000000000000000000000000006105a46108c3565b11156105f25760405162461bcd60e51b815260206004820152601b60248201527f7461782063616e6e6f74206265207365742074686973206869676800000000006044820152606401610453565b505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461063f5760405162461bcd60e51b8152600401610453906125c6565b60026040518061010001604052808681526020018581526020018481526020015f81526020016002600481111561067857610678612516565b81526001600160a01b0384166020808301919091525f6040830181905260609092018290528354600181018555938252902081519192600702019081906106bf90826126ea565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083600481111561070757610707612516565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff191691151591909117905550505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146107ac5760405162461bcd60e51b8152600401610453906125c6565b60026040518061010001604052808581526020018481526020018381526020015f81526020016004808111156107e4576107e4612516565b81525f6020808301829052604083018290526060909201819052835460018101855593815220815191926007020190819061081f90826126ea565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff0219169083600481111561086757610867612516565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff1916911515919091179055505050565b5f336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461090c5760405162461bcd60e51b8152600401610453906125c6565b5f805b60025481101561095b576002818154811061092c5761092c6125ee565b905f5260205f209060070201600101548261094791906127a6565b9150806109538161264e565b91505061090f565b50905090565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146109aa5760405162461bcd60e51b8152600401610453906125c6565b5f5b600254811015610a75575f600282815481106109ca576109ca6125ee565b905f5260205f209060070201600201541115610a63575f612710600283815481106109f7576109f76125ee565b905f5260205f2090600702016002015485610a1291906127b9565b610a1c91906127d0565b90508060028381548110610a3257610a326125ee565b905f5260205f2090600702016003015f828254610a4f91906127a6565b90915550610a5f905081856127ef565b9350505b80610a6d8161264e565b9150506109ac565b508190505b919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ac75760405162461bcd60e51b8152600401610453906125c6565b60026040518061010001604052808781526020018681526020018581526020015f815260200160036004811115610b0057610b00612516565b81526001600160a01b0385166020808301919091525f60408301819052851515606090930192909252835460018101855593825290208151919260070201908190610b4b90826126ea565b506020820151816001015560408201518160020155606082015181600301556080820151816004015f6101000a81548160ff02191690836004811115610b9357610b93612516565b021790555060a0820151600482018054610100600160a81b0319166101006001600160a01b039093169290920291909117905560c0820151600582015560e0909101516006909101805460ff19169115159190911790555050505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c395760405162461bcd60e51b8152600401610453906125c6565b5f805b600254811015610c9f57610c5c6002828154811061047f5761047f6125ee565b15610c8d578260028281548110610c7557610c756125ee565b905f5260205f20906007020160020181905550600191505b80610c978161264e565b915050610c3c565b5080610cbd5760405162461bcd60e51b815260040161045390612666565b7f00000000000000000000000000000000000000000000000000000000000000006105a4611e6c565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d2e5760405162461bcd60e51b8152600401610453906125c6565b5f54600160a01b900460ff1615610d7a5760405162461bcd60e51b815260206004820152601060248201526f616c7265616479207377617070696e6760801b6044820152606401610453565b5f805460ff60a01b1916600160a01b17815560408051600280825260608201835290916020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000815f81518110610ddf57610ddf6125ee565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000000000000000000000000000000000000000000081600181518110610e3357610e336125ee565b6001600160a01b03909216602092830291909101909101527f00000000000000000000000000000000000000000000000000000000000000005f805b600254811015610f9b576002808281548110610e8d57610e8d6125ee565b5f9182526020909120600460079092020181015460ff1690811115610eb457610eb4612516565b03610f2a575f6002808381548110610ece57610ece6125ee565b905f5260205f20906007020160030154610ee891906127d0565b90508060028381548110610efe57610efe6125ee565b905f5260205f20906007020160030154610f1891906127ef565b610f2290846127a6565b925050610f89565b60028181548110610f3d57610f3d6125ee565b5f91825260209091206006600790920201015460ff1615610f895760028181548110610f6b57610f6b6125ee565b905f5260205f2090600702016003015482610f8691906127a6565b91505b80610f938161264e565b915050610e6f565b50610fa682826121dd565b905080610fb383836121dd565b14611043577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516110339060208082526033908201527f496e73756666696369656e7420746f6b656e7320746f20737761702e20506c6560408201527261736520616464206d6f726520746f6b656e7360681b606082015260800190565b60405180910390a1505050611caf565b5f80546001600160a01b03166318cbafe5838387306110644261012c6127a6565b6040518663ffffffff1660e01b8152600401611084959493929190612802565b5f604051808303815f875af115801561109f573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526110c69190810190612871565b90505f479050815f815181106110de576110de6125ee565b60200260200101518314158061110e575081600181518110611102576111026125ee565b60200260200101518114155b15611189577fde3142f93c040ab4be0d03a16ac06c502816c1205865dd41d9848727102570d16040516111809060208082526025908201527f556e657870656374656420616d6f756e74732072657475726e65642066726f6d604082015264020737761760dc1b606082015260800190565b60405180910390a15b805f5b6002548110156113bc57600281815481106111a9576111a96125ee565b5f91825260209091206006600790920201015460ff1680611202575060028082815481106111d9576111d96125ee565b5f9182526020909120600460079092020181015460ff169081111561120057611200612516565b145b156113aa57600254611216906001906127ef565b8103611248578160028281548110611230576112306125ee565b905f5260205f209060070201600501819055506113aa565b600280828154811061125c5761125c6125ee565b5f9182526020909120600460079092020181015460ff169081111561128357611283612516565b03611339575f600280838154811061129d5761129d6125ee565b905f5260205f209060070201600301546112b791906127d0565b90505f8682600285815481106112cf576112cf6125ee565b905f5260205f209060070201600301546112e991906127ef565b6112f390876127b9565b6112fd91906127d0565b90508060028481548110611313576113136125ee565b5f91825260209091206005600790920201015561133081856127ef565b935050506113aa565b5f856002838154811061134e5761134e6125ee565b905f5260205f209060070201600301548561136991906127b9565b61137391906127d0565b90508060028381548110611389576113896125ee565b5f9182526020909120600560079092020101556113a681846127ef565b9250505b806113b48161264e565b91505061118c565b505f5b600254811015611c6a575f600282815481106113dd576113dd6125ee565b5f9182526020909120600460079092020181015460ff169081111561140457611404612516565b036115a7576002818154811061141c5761141c6125ee565b5f91825260209091206006600790920201015460ff16156114ca576002818154811061144a5761144a6125ee565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166001600160a01b03166108fc6002838154811061148c5761148c6125ee565b905f5260205f2090600702016005015490811502906040515f60405180830381858888f193505050501580156114c4573d5f803e3d5ffd5b50611c0a565b856001600160a01b031663a9059cbb600283815481106114ec576114ec6125ee565b905f5260205f20906007020160040160019054906101000a90046001600160a01b031661153b8960028681548110611526576115266125ee565b905f5260205f209060070201600301546121dd565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af1158015611583573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c49190612912565b6003600282815481106115bc576115bc6125ee565b5f9182526020909120600460079092020181015460ff16908111156115e3576115e3612516565b036117e657600281815481106115fb576115fb6125ee565b5f91825260209091206006600790920201015460ff1615611629576002818154811061144a5761144a6125ee565b856001600160a01b031663095ea7b36002838154811061164b5761164b6125ee565b905f5260205f20906007020160040160019054906101000a90046001600160a01b031660028481548110611681576116816125ee565b5f9182526020909120600360079092020101546040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303815f875af11580156116dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117009190612912565b5060028181548110611714576117146125ee565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166001600160a01b0316634ec109f47f00000000000000000000000000000000000000000000000000000000000000003061177e8a60028781548110611526576115266125ee565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064015b5f604051808303815f87803b1580156117cb575f80fd5b505af11580156117dd573d5f803e3d5ffd5b50505050611c0a565b6001600282815481106117fb576117fb6125ee565b5f9182526020909120600460079092020181015460ff169081111561182257611822612516565b0361198e576002818154811061183a5761183a6125ee565b5f91825260209091206006600790920201015460ff16156119015760028181548110611868576118686125ee565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663db6b5246600283815481106118ac576118ac6125ee565b905f5260205f209060070201600501546040518263ffffffff1660e01b81526004015f604051808303818588803b1580156118e5575f80fd5b505af11580156118f7573d5f803e3d5ffd5b5050505050611c0a565b60028181548110611914576119146125ee565b905f5260205f20906007020160040160019054906101000a90046001600160a01b03166001600160a01b031663338b5dea3061195d8960028681548110611526576115266125ee565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016117b4565b6004600282815481106119a3576119a36125ee565b5f9182526020909120600460079092020181015460ff16908111156119ca576119ca612516565b03611a33577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68611a158860028581548110611526576115266125ee565b6040518263ffffffff1660e01b81526004016117b491815260200190565b6002808281548110611a4757611a476125ee565b5f9182526020909120600460079092020181015460ff1690811115611a6e57611a6e612516565b03611c0a575f60028281548110611a8757611a876125ee565b905f5260205f209060070201600501541115611c0a575f611ad5876002808581548110611ab657611ab66125ee565b905f5260205f20906007020160030154611ad091906127d0565b6121dd565b5f54600280549293506001600160a01b039091169163f305d719919085908110611b0157611b016125ee565b905f5260205f209060070201600501547f0000000000000000000000000000000000000000000000000000000000000000845f8060028981548110611b4857611b486125ee565b5f91825260209091206007909102016004015461010090046001600160a01b0316611b754261012c6127a6565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af1158015611be0573d5f803e3d5ffd5b50505050506040513d601f19601f82011682018060405250810190611c05919061292d565b505050505b5f60028281548110611c1e57611c1e6125ee565b905f5260205f209060070201600301819055505f60028281548110611c4557611c456125ee565b5f91825260209091206005600790920201015580611c628161264e565b9150506113bf565b5060408051858152602081018490527f5e20c9aee521e656eed033c4ae35378c79c584706f5ce7f410ab3fba389607a1910160405180910390a1505042600155505050505b5f805460ff60a01b19169055565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611d055760405162461bcd60e51b8152600401610453906125c6565b5f805b600254811015611dce575f60028281548110611d2657611d266125ee565b5f9182526020909120600460079092020181015460ff1690811115611d4d57611d4d612516565b148015611d6b5750611d6b6002828154811061047f5761047f6125ee565b15611dbc578260028281548110611d8457611d846125ee565b905f5260205f20906007020160040160016101000a8154816001600160a01b0302191690836001600160a01b03160217905550600191505b80611dc68161264e565b915050611d08565b50806105f25760405162461bcd60e51b815260040161045390612666565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611e345760405162461bcd60e51b8152600401610453906125c6565b60026040518061010001604052808781526020018681526020018581526020015f81526020015f6004811115610b0057610b00612516565b5f336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611eb55760405162461bcd60e51b8152600401610453906125c6565b5f805b60025481101561095b5760028181548110611ed557611ed56125ee565b905f5260205f2090600702016002015482611ef091906127a6565b915080611efc8161264e565b915050611eb8565b60028181548110611f13575f80fd5b905f5260205f2090600702015f91509050805f018054611f3290612602565b80601f0160208091040260200160405190810160405280929190818152602001828054611f5e90612602565b8015611fa95780601f10611f8057610100808354040283529160200191611fa9565b820191905f5260205f20905b815481529060010190602001808311611f8c57829003601f168201915b505050506001830154600284015460038501546004860154600587015460069097015495969395929450909260ff808316936101009093046001600160a01b0316921688565b5f336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146120385760405162461bcd60e51b8152600401610453906125c6565b5f5b600254811015610a75575f60028281548110612058576120586125ee565b905f5260205f2090600702016001015411156120f1575f61271060028381548110612085576120856125ee565b905f5260205f20906007020160010154856120a091906127b9565b6120aa91906127d0565b905080600283815481106120c0576120c06125ee565b905f5260205f2090600702016003015f8282546120dd91906127a6565b909155506120ed905081856127ef565b9350505b806120fb8161264e565b91505061203a565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461214b5760405162461bcd60e51b8152600401610453906125c6565b60026040518061010001604052808781526020018681526020018581526020015f815260200160016004811115610b0057610b00612516565b5f816040516020016121969190612958565b60405160208183030381529060405280519060200120836040516020016121bd9190612958565b604051602081830303815290604052805190602001201490505b92915050565b6040516370a0823160e01b81523060048201525f9081906001600160a01b038516906370a0823190602401602060405180830381865afa158015612223573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122479190612973565b90508281111561225a57829150506121d7565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561229e5761229e612261565b604052919050565b5f82601f8301126122b5575f80fd5b813567ffffffffffffffff8111156122cf576122cf612261565b6122e2601f8201601f1916602001612275565b8181528460208386010111156122f6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215612323575f80fd5b823567ffffffffffffffff811115612339575f80fd5b612345858286016122a6565b95602094909401359450505050565b80356001600160a01b0381168114610a7a575f80fd5b5f805f806080858703121561237d575f80fd5b843567ffffffffffffffff811115612393575f80fd5b61239f878288016122a6565b94505060208501359250604085013591506123bc60608601612354565b905092959194509250565b5f805f606084860312156123d9575f80fd5b833567ffffffffffffffff8111156123ef575f80fd5b6123fb868287016122a6565b9660208601359650604090950135949350505050565b5f60208284031215612421575f80fd5b5035919050565b8015158114612435575f80fd5b50565b5f805f805f60a0868803121561244c575f80fd5b853567ffffffffffffffff811115612462575f80fd5b61246e888289016122a6565b955050602086013593506040860135925061248b60608701612354565b9150608086013561249b81612428565b809150509295509295909350565b5f80604083850312156124ba575f80fd5b823567ffffffffffffffff8111156124d0575f80fd5b6124dc858286016122a6565b9250506124eb60208401612354565b90509250929050565b5f5b8381101561250e5781810151838201526020016124f6565b50505f910152565b634e487b7160e01b5f52602160045260245ffd5b5f6101008083528a518082850152610120915061254d8183860160208f016124f4565b602084018b9052604084018a905260608401899052601f01601f191683010190506005861061258a57634e487b7160e01b5f52602160045260245ffd5b8560808301526125a560a08301866001600160a01b03169052565b8360c08301526125b960e083018415159052565b9998505050505050505050565b6020808252600e908201526d6e6f207065726d697373696f6e7360901b604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b600181811c9082168061261657607f821691505b60208210810361263457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b5f6001820161265f5761265f61263a565b5060010190565b6020808252601c908201527f636f756c64206e6f742066696e642074617820746f2075706461746500000000604082015260600190565b601f8211156105f2575f81815260208120601f850160051c810160208610156126c35750805b601f850160051c820191505b818110156126e2578281556001016126cf565b505050505050565b815167ffffffffffffffff81111561270457612704612261565b612718816127128454612602565b8461269d565b602080601f83116001811461274b575f84156127345750858301515b5f19600386901b1c1916600185901b1785556126e2565b5f85815260208120601f198616915b828110156127795788860151825594840194600190910190840161275a565b508582101561279657878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b808201808211156121d7576121d761263a565b80820281158282048414176121d7576121d761263a565b5f826127ea57634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156121d7576121d761263a565b5f60a082018783526020878185015260a0604085015281875180845260c08601915082890193505f5b818110156128505784516001600160a01b03168352938301939183019160010161282b565b50506001600160a01b03969096166060850152505050608001529392505050565b5f6020808385031215612882575f80fd5b825167ffffffffffffffff80821115612899575f80fd5b818501915085601f8301126128ac575f80fd5b8151818111156128be576128be612261565b8060051b91506128cf848301612275565b81815291830184019184810190888411156128e8575f80fd5b938501935b83851015612906578451825293850193908501906128ed565b98975050505050505050565b5f60208284031215612922575f80fd5b815161225a81612428565b5f805f6060848603121561293f575f80fd5b8351925060208401519150604084015190509250925092565b5f82516129698184602087016124f4565b9190910192915050565b5f60208284031215612983575f80fd5b505191905056fea2646970667358221220b494fb4c7756629bfc0f6eb41b532c01f9eb94acd4ec125aa15643cf92361d4064736f6c63430008140033

Deployed Bytecode

0x608060405234801561000f575f80fd5b5060043610610443575f3560e01c8063715018a611610237578063c20c5caf11610135578063d430d1bd116100bf578063e79d416011610084578063e79d4160146109ba578063e948474b146109c3578063ede49a19146109e5578063f19fffcb146109f9578063f1f5cd9114610a0d575f80fd5b8063d430d1bd1461093e578063db38a41d14610947578063dba61c5814610966578063dc01f60d1461096f578063dd62ed3e14610982575f80fd5b8063cc1776d311610105578063cc1776d3146108fe578063d00efb2f14610906578063d2d7ad831461090f578063d31acb2814610918578063d3b0066f1461092b575f80fd5b8063c20c5caf146108bc578063c2ed286b146108cf578063c4a5abcd146108e2578063c552f4c5146108eb575f80fd5b806389d53c01116101c1578063a457c2d711610186578063a457c2d71461083f578063a9059cbb14610852578063b02b605e14610865578063b0ad3ebf14610878578063c10fde1b1461089a575f80fd5b806389d53c01146107d75780638da5cb5b146107ea578063904b01301461080257806395d89b4114610815578063989763ef1461081d575f80fd5b806379cc67901161020757806379cc6790146107795780638091f3bf1461078c57806381045345146107a057806382b75953146107b3578063880cdc31146107c4575f80fd5b8063715018a61461073e5780637412dbb314610746578063751039fc14610768578063790ca41314610770575f80fd5b8063407133d21161034457806359a945e9116102ce5780636508c57e116102935780636508c57e146106db5780636a092e79146106ee5780636b8f2f3b146107015780636f8645521461070e57806370a0823114610716575f80fd5b806359a945e91461069c5780635d90bbaf146106a45780635d9d7d43146106b75780635e45da23146106ca5780636331bf65146106d3575f80fd5b80634f72e2a2116103145780634f72e2a21461063c5780634fbc27751461064f57806352c6dbc4146106625780635543379a14610676578063570ca73514610689575f80fd5b8063407133d2146105ed57806342966c681461061857806345541cba1461062b5780634f7041a514610634575f80fd5b80631e19ae77116103d057806330bd85c51161039557806330bd85c514610572578063313ce567146105865780633164df8b146105a557806336827499146105c757806339509351146105da575f80fd5b80631e19ae771461050f5780631f4a6d321461052257806323b872dd1461052a57806328be90381461053d5780632b75062714610550575f80fd5b80630f3a325f116104165780630f3a325f146104ad5780631776834a146104cf57806318160ddd146104e2578063182561e1146104f45780631b0109d514610507575f80fd5b8063064a59d01461044757806306fdde031461047057806307a1cfbd14610485578063095ea7b31461049a575b5f80fd5b60065461045b90600160a81b900460ff1681565b60405190151581526020015b60405180910390f35b610478610a15565b6040516104679190612a39565b610498610493366004612aef565b610aa1565b005b61045b6104a8366004612b4c565b610b3c565b61045b6104bb366004612b74565b60126020525f908152604090205460ff1681565b6104986104dd366004612b8d565b610c2c565b6002545b604051908152602001610467565b610498610502366004612bb1565b610c60565b610498610cb9565b61049861051d366004612bb1565b610d9b565b610498610df4565b61045b610538366004612be6565b610e2f565b61049861054b366004612bb1565b610f54565b61045b61055e366004612b74565b60136020525f908152604090205460ff1681565b600b5461045b90600160c01b900460ff1681565b6006546105939060ff1681565b60405160ff9091168152602001610467565b61045b6105b3366004612b74565b60156020525f908152604090205460ff1681565b6104986105d5366004612c1f565b610fad565b61045b6105e8366004612b4c565b610ffa565b600b54610600906001600160a01b031681565b6040516001600160a01b039091168152602001610467565b610498610626366004612b8d565b611109565b6104e6600c5481565b6104e661116a565b61049861064a366004612c1f565b6111da565b61049861065d366004612bb1565b61121c565b600b5461045b90600160b01b900460ff1681565b610498610684366004612c1f565b611275565b600754610600906001600160a01b031681565b6104986112c2565b6104986106b2366004612bb1565b6112f9565b6104986106c5366004612bb1565b611352565b6104e6600e5481565b6104e66113ab565b6104986106e9366004612aef565b6113c9565b61045b6106fc366004612c3a565b61142a565b60195461045b9060ff1681565b6104e6611541565b6104e6610724366004612b74565b6001600160a01b03165f9081526020819052604090205490565b610498611555565b61045b610754366004612b74565b600a6020525f908152604090205460ff1681565b6104986115d3565b6104e6600f5481565b610498610787366004612b4c565b61160d565b60075461045b90600160a01b900460ff1681565b6104986107ae366004612b8d565b61173f565b6016546001600160a01b0316610600565b6104986107d2366004612b74565b611773565b6104986107e5366004612c1f565b611819565b6006546106009061010090046001600160a01b031681565b610498610810366004612c6b565b6118bf565b610478611903565b61045b61082b366004612b74565b601b6020525f908152604090205460ff1681565b61045b61084d366004612b4c565b611910565b61045b610860366004612b4c565b6119dc565b610498610873366004612b8d565b611a69565b61045b610886366004612b74565b60086020525f908152604090205460ff1681565b61045b6108a8366004612b74565b601d6020525f908152604090205460ff1681565b6104986108ca366004612b8d565b611a9d565b6104986108dd366004612bb1565b611ad1565b6104e6600d5481565b6104986108f9366004612c1f565b611ba7565b6104e6611bf4565b6104e660105481565b6104e660175481565b610498610926366004612cad565b611c3b565b610498610939366004612b74565b611c75565b6104e6601c5481565b6104e6610955366004612b74565b60146020525f908152604090205481565b6104e6601a5481565b61045b61097d366004612b74565b611d36565b6104e6610990366004612c3a565b6001600160a01b039182165f90815260016020908152604080832093909416825291909152205490565b6104e660115481565b61045b6109d1366004612b74565b60096020525f908152604090205460ff1681565b600b5461045b90600160a81b900460ff1681565b600b5461045b90600160b81b900460ff1681565b6104e6611d7a565b60058054610a2290612ccd565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4e90612ccd565b8015610a995780601f10610a7057610100808354040283529160200191610a99565b820191905f5260205f20905b815481529060010190602001808311610a7c57829003601f168201915b505050505081565b60065461010090046001600160a01b03163314610ad95760405162461bcd60e51b8152600401610ad090612d05565b60405180910390fd5b6016546040516307a1cfbd60e01b81526001600160a01b03909116906307a1cfbd90610b0b9085908590600401612d4d565b5f604051808303815f87803b158015610b22575f80fd5b505af1158015610b34573d5f803e3d5ffd5b505050505050565b6006545f903390600160a81b900460ff168015610b625750600754600160a01b900460ff165b80610b7f57506006546001600160a01b0382811661010090920416145b80610b985750335f9081526008602052604090205460ff165b610bb45760405162461bcd60e51b8152600401610ad090612d6e565b6001600160a01b038416610bda5760405162461bcd60e51b8152600401610ad090612d9b565b335f8181526001602090815260408083206001600160a01b03891680855290835292819020879055518681529192915f80516020612ed683398151915291015b60405180910390a35060019392505050565b60065461010090046001600160a01b03163314610c5b5760405162461bcd60e51b8152600401610ad090612d05565b600e55565b60065461010090046001600160a01b03163314610c8f5760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152601d60205260409020805460ff1916911515919091179055565b600754600160a01b900460ff16610d245760405162461bcd60e51b815260206004820152602960248201527f63616e206f6e6c792062652063616c6c6564206f6e636520746f6b656e206973604482015268081b185d5b98da195960ba1b6064820152608401610ad0565b6007546001600160a01b03163303610d995760165f9054906101000a90046001600160a01b03166001600160a01b031663774195846040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610d82575f80fd5b505af1158015610d94573d5f803e3d5ffd5b505050505b565b60065461010090046001600160a01b03163314610dca5760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152601560205260409020805460ff1916911515919091179055565b60075460405147916001600160a01b03169082156108fc029083905f818181858888f19350505050158015610e2b573d5f803e3d5ffd5b5050565b6006545f908490600160a81b900460ff168015610e555750600754600160a01b900460ff165b80610e7257506006546001600160a01b0382811661010090920416145b80610e8b5750335f9081526008602052604090205460ff165b610ea75760405162461bcd60e51b8152600401610ad090612d6e565b6001600160a01b0385165f908152600160209081526040808320338452909152902054610ed5908490612de6565b6001600160a01b0386165f908152600160209081526040808320338452909152902055610f03858585611db0565b6001600160a01b0385165f81815260016020908152604080832033808552908352928190205490519081529192915f80516020612ed6833981519152910160405180910390a3506001949350505050565b60065461010090046001600160a01b03163314610f835760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152600a60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314610fdc5760405162461bcd60e51b8152600401610ad090612d05565b600b8054911515600160b81b0260ff60b81b19909216919091179055565b6006545f903390600160a81b900460ff1680156110205750600754600160a01b900460ff165b8061103d57506006546001600160a01b0382811661010090920416145b806110565750335f9081526008602052604090205460ff165b6110725760405162461bcd60e51b8152600401610ad090612d6e565b6001600160a01b0384166110985760405162461bcd60e51b8152600401610ad090612d9b565b335f9081526001602090815260408083206001600160a01b03881684529091529020546110c6908490612df9565b335f8181526001602090815260408083206001600160a01b038a16808552908352928190208590555193845290925f80516020612ed68339815191529101610c1a565b335f9081526015602052604090205460ff1661115d5760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610ad0565b6111673382611fbf565b50565b60165460408051631296b91d60e11b815290515f926001600160a01b03169163252d723a9160048083019260209291908290030181865afa1580156111b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111d59190612e0c565b905090565b60065461010090046001600160a01b031633146112095760405162461bcd60e51b8152600401610ad090612d05565b6019805460ff1916911515919091179055565b60065461010090046001600160a01b0316331461124b5760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152600860205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146112a45760405162461bcd60e51b8152600401610ad090612d05565b600b8054911515600160b01b0260ff60b01b19909216919091179055565b60065461010090046001600160a01b031633146112f15760405162461bcd60e51b8152600401610ad090612d05565b610d99612044565b60065461010090046001600160a01b031633146113285760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152601260205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b031633146113815760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b03919091165f908152601360205260409020805460ff1916911515919091179055565b5f612710600d546002546113bf9190612e23565b6111d59190612e3a565b60065461010090046001600160a01b031633146113f85760405162461bcd60e51b8152600401610ad090612d05565b60165460405163328462bf60e11b81526001600160a01b0390911690636508c57e90610b0b9085908590600401612d4d565b6006545f9061010090046001600160a01b0316331461145b5760405162461bcd60e51b8152600401610ad090612d05565b6040516370a0823160e01b81523060048201525f906001600160a01b038516906370a0823190602401602060405180830381865afa15801561149f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906114c39190612e0c565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018390529192509085169063a9059cbb906044016020604051808303815f875af1158015611513573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115379190612e59565b9150505b92915050565b5f612710600c546002546113bf9190612e23565b60065461010090046001600160a01b031633146115845760405162461bcd60e51b8152600401610ad090612d05565b6006546040515f9161010090046001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a360068054610100600160a81b0319169055565b60065461010090046001600160a01b031633146116025760405162461bcd60e51b8152600401610ad090612d05565b5f600d819055600c55565b335f9081526015602052604090205460ff166116615760405162461bcd60e51b81526020600482015260136024820152726e6f206275726e207065726d697373696f6e7360681b6044820152606401610ad0565b6001600160a01b0382165f90815260016020908152604080832033808552925290912054828110156116b9576001600160a01b038085165f9081526001602090815260408083209386168352929052908120556116e9565b6116c38382612de6565b6001600160a01b038086165f908152600160209081526040808320938716835292905220555b6116f38484611fbf565b6001600160a01b038481165f818152600160209081526040808320948716808452948252918290205491519182525f80516020612ed6833981519152910160405180910390a350505050565b60065461010090046001600160a01b0316331461176e5760405162461bcd60e51b8152600401610ad090612d05565b600d55565b60065461010090046001600160a01b031633146117a25760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b0381166117f15760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610ad0565b600680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60065461010090046001600160a01b031633146118485760405162461bcd60e51b8152600401610ad090612d05565b600b54600160a01b900460ff166118a15760405162461bcd60e51b815260206004820152601f60248201527f70696e6b20616e746920626f74206973206e6f7420636f6e66696775726564006044820152606401610ad0565b600b8054911515600160c01b0260ff60c01b19909216919091179055565b6007546001600160a01b03163303610e2b57601654604051630904b01360e41b81526001600160a01b039091169063904b013090610b0b9085908590600401612e74565b60048054610a2290612ccd565b6006545f903390600160a81b900460ff1680156119365750600754600160a01b900460ff165b8061195357506006546001600160a01b0382811661010090920416145b8061196c5750335f9081526008602052604090205460ff165b6119885760405162461bcd60e51b8152600401610ad090612d6e565b6001600160a01b0384166119ae5760405162461bcd60e51b8152600401610ad090612d9b565b335f9081526001602090815260408083206001600160a01b03881684529091529020546110c6908490612de6565b6006545f903390600160a81b900460ff168015611a025750600754600160a01b900460ff165b80611a1f57506006546001600160a01b0382811661010090920416145b80611a385750335f9081526008602052604090205460ff165b611a545760405162461bcd60e51b8152600401610ad090612d6e565b611a5f338585611db0565b5060019392505050565b60065461010090046001600160a01b03163314611a985760405162461bcd60e51b8152600401610ad090612d05565b601c55565b60065461010090046001600160a01b03163314611acc5760405162461bcd60e51b8152600401610ad090612d05565b600c55565b60065461010090046001600160a01b03163314611b005760405162461bcd60e51b8152600401610ad090612d05565b6001600160a01b0382165f908152600a602052604090205460ff161580611b25575080155b611b7d5760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206578636c75646520616e2065786368616e67652066726f6d206044820152620e8c2f60eb1b6064820152608401610ad0565b6001600160a01b03919091165f908152601b60205260409020805460ff1916911515919091179055565b60065461010090046001600160a01b03163314611bd65760405162461bcd60e51b8152600401610ad090612d05565b600b8054911515600160a81b0260ff60a81b19909216919091179055565b6016546040805163585e42ef60e11b815290515f926001600160a01b03169163b0bc85de9160048083019260209291908290030181865afa1580156111b1573d5f803e3d5ffd5b60065461010090046001600160a01b03163314611c6a5760405162461bcd60e51b8152600401610ad090612d05565b601791909155601a55565b60065461010090046001600160a01b03163314611ca45760405162461bcd60e51b8152600401610ad090612d05565b600b80546001600160a01b0319166001600160a01b038381169182179092556006546040516318e02bd960e01b81526101009091049092166004830152906318e02bd9906024015f604051808303815f87803b158015611d02575f80fd5b505af1158015611d14573d5f803e3d5ffd5b5050600b805464ff000000ff60a01b191664010000000160a01b179055505050565b6001600160a01b0381165f908152601d602052604081205460ff168061153b5750601c546001600160a01b0383165f90815260208190526040902054101592915050565b6007545f90600160a01b900460ff1615611dab57600360105443611d9e9190612de6565b1015611dab5750611edc90565b505f90565b6001600160a01b038216611dff5760405162461bcd60e51b815260206004820152601660248201527563616e6e6f74206265207a65726f206164647265737360501b6044820152606401610ad0565b6001600160a01b0383165f9081526009602052604090205460ff1615611e675760405162461bcd60e51b815260206004820152601e60248201527f61646472657373206973206e6f7420616c6c6f77656420746f2073656c6c00006044820152606401610ad0565b60035460ff1615611f09576001600160a01b0383165f90815260208190526040902054611e95908290612de6565b6001600160a01b038085165f908152602081905260408082209390935590841681522054611ec4908290612df9565b6001600160a01b038381165f818152602081815260409182902094909455518481529092918616915f80516020612eb6833981519152910160405180910390a3505050565b611f14838383612085565b5f611f20848484612090565b6001600160a01b0385165f90815260208190526040902054909150611f46908390612de6565b6001600160a01b038086165f908152602081905260408082209390935590851681522054611f75908290612df9565b6001600160a01b038481165f818152602081815260409182902094909455518481529092918716915f80516020612eb6833981519152910160405180910390a3610d94565b505050565b6001600160a01b038216611fd1575f80fd5b80600254611fdf9190612de6565b6002556001600160a01b0382165f90815260208190526040902054612005908290612de6565b6001600160a01b0383165f8181526020818152604080832094909455925184815290925f80516020612eb6833981519152910160405180910390a35050565b60065461010090046001600160a01b031633146120735760405162461bcd60e51b8152600401610ad090612d05565b61207b6120a4565b42600f5543601055565b611fba8383836120e8565b5f61209c848484612277565b949350505050565b60065461010090046001600160a01b031633146120d35760405162461bcd60e51b8152600401610ad090612d05565b6007805460ff60a01b1916600160a01b179055565b600754600160a01b900460ff168015612103575060195460ff165b801561212657506001600160a01b0382165f908152600a602052604090205460ff165b8015612140575042601854600a61213d9190612df9565b11155b801561216757506017546016546001600160a01b03165f9081526020819052604090205410155b801561218b57506001600160a01b0383165f908152601b602052604090205460ff16155b8015612208575060165f9054906101000a90046001600160a01b03166001600160a01b031663d83067866040518163ffffffff1660e01b8152600401602060405180830381865afa1580156121e2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122069190612e59565b155b1561226c574260185560165460408051631dd0656160e21b815290516001600160a01b03909216916377419584916004808201925f9290919082900301818387803b158015612255575f80fd5b505af1158015612267573d5f803e3d5ffd5b505050505b611fba83838361248c565b6001600160a01b0383165f908152601b6020526040812054829060ff161580156122b957506001600160a01b0384165f908152601b602052604090205460ff16155b80156122ce5750600754600160a01b900460ff165b156123f5576001600160a01b0385165f908152600a602052604090205460ff16156123665760165460405163db017dc760e01b8152600481018590526001600160a01b039091169063db017dc7906024016020604051808303815f875af115801561233b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061235f9190612e0c565b90506123f5565b6001600160a01b0384165f908152600a602052604090205460ff16156123f557601654604051634fa26fd560e01b8152600481018590526001600160a01b0390911690634fa26fd5906024016020604051808303815f875af11580156123ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123f29190612e0c565b90505b5f6124008285612de6565b90508015612477576016546001600160a01b03165f9081526020819052604090205461242d908290612df9565b601680546001600160a01b039081165f9081526020818152604091829020949094559154915184815291811692908916915f80516020612eb6833981519152910160405180910390a35b6124828686846128a8565b9695505050505050565b600b54600160a81b900460ff1615806124b45750335f9081526012602052604090205460ff16155b6124f25760405162461bcd60e51b815260206004820152600f60248201526e1cdb9a5c195c881c995a9958dd1959608a1b6044820152606401610ad0565b600754600160a01b900460ff16801561251e57506006546001600160a01b038481166101009092041614155b801561254257506001600160a01b0383165f9081526013602052604090205460ff16155b801561256657506001600160a01b0382165f9081526013602052604090205460ff16155b15611fba57600e54156125c557600e545a11156125c55760405162461bcd60e51b815260206004820152601e60248201527f74686973206973206f76657220746865206d617820676173206c696d697400006044820152606401610ad0565b5f600d541180156125ee57506001600160a01b0382165f908152600a602052604090205460ff16155b1561266c576125fb6113ab565b6001600160a01b0383165f9081526020819052604090205461261e908390612df9565b111561266c5760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d617820686f6c6420616d6f756e746044820152606401610ad0565b5f600c5411801561269457506001600160a01b0382165f908152600a602052604090205460ff165b156126f0576126a1611541565b8111156126f05760405162461bcd60e51b815260206004820181905260248201527f74686973206973206f76657220746865206d61782073656c6c20616d6f756e746044820152606401610ad0565b600b54600160b01b900460ff1615612828576001600160a01b0382165f90815260146020526040902054439003612757576001600160a01b0382165f908152601260205260408120805460ff19166001179055601180549161275183612e9d565b91905055505b6001600160a01b0383165f908152601460205260409020544390036127ac576001600160a01b0383165f908152601260205260408120805460ff1916600117905560118054916127a683612e9d565b91905055505b6001600160a01b0382165f908152600a602052604081205460ff16151590036127ea576001600160a01b0382165f9081526014602052604090204390555b6001600160a01b0383165f908152600a602052604081205460ff1615159003612828576001600160a01b0383165f9081526014602052604090204390555b600b54600160c01b900460ff1615611fba57600b5460405163090ec10b60e31b81526001600160a01b038581166004830152848116602483015260448201849052909116906348760858906064015f604051808303815f87803b15801561288d575f80fd5b505af115801561289f573d5f803e3d5ffd5b50505050505050565b6007545f908290600160a01b900460ff1680156128ce5750600b54600160b81b900460ff165b15612979576006546001600160a01b0386811661010090920416148015906128fc57505f6128fa611d7a565b115b801561292057506001600160a01b0385165f9081526013602052604090205460ff16155b801561294457506001600160a01b0384165f9081526013602052604090205460ff16155b15612979575f612710612955611d7a565b61295f9086612e23565b6129699190612e3a565b90506129758183612de6565b9150505b61298485858361298d565b95945050505050565b5f826001600160a01b0316846001600160a01b0316036129ef5760405162461bcd60e51b815260206004820152601f60248201527f796f752063616e6e6f74207472616e7366657220746f20796f757273656c66006044820152606401610ad0565b5092915050565b5f81518084525f5b81811015612a1a576020818501810151868301820152016129fe565b505f602082860101526020601f19601f83011685010191505092915050565b602081525f612a4b60208301846129f6565b9392505050565b634e487b7160e01b5f52604160045260245ffd5b5f82601f830112612a75575f80fd5b813567ffffffffffffffff80821115612a9057612a90612a52565b604051601f8301601f19908116603f01168101908282118183101715612ab857612ab8612a52565b81604052838152866020858801011115612ad0575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f8060408385031215612b00575f80fd5b823567ffffffffffffffff811115612b16575f80fd5b612b2285828601612a66565b95602094909401359450505050565b80356001600160a01b0381168114612b47575f80fd5b919050565b5f8060408385031215612b5d575f80fd5b612b6683612b31565b946020939093013593505050565b5f60208284031215612b84575f80fd5b612a4b82612b31565b5f60208284031215612b9d575f80fd5b5035919050565b8015158114611167575f80fd5b5f8060408385031215612bc2575f80fd5b612bcb83612b31565b91506020830135612bdb81612ba4565b809150509250929050565b5f805f60608486031215612bf8575f80fd5b612c0184612b31565b9250612c0f60208501612b31565b9150604084013590509250925092565b5f60208284031215612c2f575f80fd5b8135612a4b81612ba4565b5f8060408385031215612c4b575f80fd5b612c5483612b31565b9150612c6260208401612b31565b90509250929050565b5f8060408385031215612c7c575f80fd5b823567ffffffffffffffff811115612c92575f80fd5b612c9e85828601612a66565b925050612c6260208401612b31565b5f8060408385031215612cbe575f80fd5b50508035926020909101359150565b600181811c90821680612ce157607f821691505b602082108103612cff57634e487b7160e01b5f52602260045260245ffd5b50919050565b60208082526028908201527f63616e206f6e6c792062652063616c6c65642062792074686520636f6e74726160408201526731ba1037bbb732b960c11b606082015260800190565b604081525f612d5f60408301856129f6565b90508260208301529392505050565b6020808252601390820152721d1c98591a5b99c81b9bdd08195b98589b1959606a1b604082015260600190565b6020808252601c908201527f63616e6e6f7420617070726f7665207468652030206164647265737300000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561153b5761153b612dd2565b8082018082111561153b5761153b612dd2565b5f60208284031215612e1c575f80fd5b5051919050565b808202811582820484141761153b5761153b612dd2565b5f82612e5457634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612e69575f80fd5b8151612a4b81612ba4565b604081525f612e8660408301856129f6565b905060018060a01b03831660208301529392505050565b5f60018201612eae57612eae612dd2565b506001019056feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925a2646970667358221220f455b8d6c69a6eda94b187fe3719ceb1cda9a712b98c25838fe9638fc8b11f3164736f6c63430008140033

Deployed Bytecode Sourcemap

38952:3085:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7999:35;;;;;-1:-1:-1;;;7999:35:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;7999:35:0;;;;;;;;7903:19;;;:::i;:::-;;;;;;;:::i;20360:141::-;;;;;;:::i;:::-;;:::i;:::-;;11093:316;;;;;;:::i;:::-;;:::i;23513:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27878:98;;;;;;:::i;:::-;;:::i;9173:102::-;9255:12;;9173:102;;;3069:25:1;;;3057:2;3042:18;9173:102:0;2923:177:1;41803:115:0;;;;;;:::i;:::-;;:::i;20710:145::-;;;:::i;21459:113::-;;;;;;:::i;:::-;;:::i;14879:134::-;;;:::i;11882:334::-;;;;;;:::i;:::-;;:::i;15246:116::-;;;;;;:::i;:::-;;:::i;23561:46::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23262:29;;;;;-1:-1:-1;;;23262:29:0;;;;;;7929:21;;;;;;;;;;;;4053:4:1;4041:17;;;4023:36;;4011:2;3996:18;7929:21:0;3881:184:1;21093:43:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27338:113;;;;;;:::i;:::-;;:::i;12731:387::-;;;;;;:::i;:::-;;:::i;23056:33::-;;;;;-1:-1:-1;;;;;23056:33:0;;;;;;-1:-1:-1;;;;;4503:32:1;;;4485:51;;4473:2;4458:18;23056:33:0;4316:226:1;21743:101:0;;;;;;:::i;:::-;;:::i;23304:27::-;;;;;;19122:100;;;:::i;19668:97::-;;;;;;:::i;:::-;;:::i;15370:121::-;;;;;;:::i;:::-;;:::i;23178:36::-;;;;;-1:-1:-1;;;23178:36:0;;;;;;27209:117;;;;;;:::i;:::-;;:::i;8041:23::-;;;;;-1:-1:-1;;;;;8041:23:0;;;40796:110;;;:::i;27988:109::-;;;;;;:::i;:::-;;:::i;28105:117::-;;;;;;:::i;:::-;;:::i;23372:26::-;;;;;;26330:113;;;:::i;20209:143::-;;;;;;:::i;:::-;;:::i;15023:211::-;;;;;;:::i;:::-;;:::i;17208:23::-;;;;;;;;;26455:114;;;:::i;9492:119::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9586:17:0;9559:7;9586:17;;;;;;;;;;;;9492:119;14731:140;;;:::i;8217:42::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;28230:105;;;:::i;23407:25::-;;;;;;22243:456;;;;;;:::i;:::-;;:::i;8071:20::-;;;;;-1:-1:-1;;;8071:20:0;;;;;;27766:100;;;;;;:::i;:::-;;:::i;19512:110::-;19601:12;;-1:-1:-1;;;;;19601:12:0;19512:110;;14577:146;;;;;;:::i;:::-;;:::i;27463:179::-;;;;;;:::i;:::-;;:::i;7963:29::-;;;;;;;;-1:-1:-1;;;;;7963:29:0;;;20513:185;;;;;;:::i;:::-;;:::i;7876:20::-;;;:::i;17283:48::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;13638:397;;;;;;:::i;:::-;;:::i;10268:178::-;;;;;;:::i;:::-;;:::i;41926:108::-;;;;;;:::i;:::-;;:::i;8104:47::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39061:48;;;;;;:::i;:::-;;;;;;;;;;;;;;;;27654:100;;;;;;:::i;:::-;;:::i;19773:225::-;;;;;;:::i;:::-;;:::i;23338:27::-;;;;;;27088:109;;;;;;:::i;:::-;;:::i;19320:102::-;;;:::i;23439:26::-;;;;;;17135:38;;;;;;20006:191;;;;;;:::i;:::-;;:::i;26837:239::-;;;;;;:::i;:::-;;:::i;39023:31::-;;;;;;23614:55;;;;;;:::i;:::-;;;;;;;;;;;;;;17238:38;;;;;;41617:152;;;;;;:::i;:::-;;:::i;9951:146::-;;;;;;:::i;:::-;-1:-1:-1;;;;;10062:18:0;;;10035:7;10062:18;;;:10;:18;;;;;;;;:27;;;;;;;;;;;;;9951:146;23472:28;;;;;;8158:52;;;;;;:::i;:::-;;;;;;;;;;;;;;;;23139:32;;;;;-1:-1:-1;;;23139:32:0;;;;;;23221:34;;;;;-1:-1:-1;;;23221:34:0;;;;;;26580:217;;;:::i;7903:19::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20360:141::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;;;;;;;;;20451:12:::1;::::0;:42:::1;::::0;-1:-1:-1;;;20451:42:0;;-1:-1:-1;;;;;20451:12:0;;::::1;::::0;:22:::1;::::0;:42:::1;::::0;20474:7;;20483:9;;20451:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20360:141:::0;;:::o;11093:316::-;8725:16;;11196:4;;11175:10;;-1:-1:-1;;;8725:16:0;;;;:28;;;;-1:-1:-1;8745:8:0;;-1:-1:-1;;;8745:8:0;;;;8725:28;8724:47;;;-1:-1:-1;8766:5:0;;-1:-1:-1;;;;;8758:13:0;;;8766:5;;;;;8758:13;8724:47;:77;;;-1:-1:-1;8790:10:0;8775:26;;;;:14;:26;;;;;;;;8724:77;8716:109;;;;-1:-1:-1;;;8716:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;11221:21:0;::::1;11213:62;;;;-1:-1:-1::0;;;11213:62:0::1;;;;;;;:::i;:::-;11299:10;11288:22;::::0;;;:10:::1;:22;::::0;;;;;;;-1:-1:-1;;;;;11288:31:0;::::1;::::0;;;;;;;;;;:39;;;11343:36;3069:25:1;;;11288:31:0;;11299:10;-1:-1:-1;;;;;;;;;;;11343:36:0;3042:18:1;11343:36:0::1;;;;;;;;-1:-1:-1::0;11397:4:0::1;::::0;11093:316;-1:-1:-1;;;11093:316:0:o;27878:98::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;27948:11:::1;:20:::0;27878:98::o;41803:115::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;41884:21:0;;;::::1;;::::0;;;:16:::1;:21;::::0;;;;:26;;-1:-1:-1;;41884:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;41803:115::o;20710:145::-;8449:8;;-1:-1:-1;;;8449:8:0;;;;8441:62;;;;-1:-1:-1;;;8441:62:0;;7671:2:1;8441:62:0;;;7653:21:1;7710:2;7690:18;;;7683:30;7749:34;7729:18;;;7722:62;-1:-1:-1;;;7800:18:1;;;7793:39;7849:19;;8441:62:0;7469:405:1;8441:62:0;20785:8:::1;::::0;-1:-1:-1;;;;;20785:8:0::1;20771:10;:22:::0;20767:81:::1;;20810:12;;;;;;;;;-1:-1:-1::0;;;;;20810:12:0::1;-1:-1:-1::0;;;;;20810:24:0::1;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;20767:81;20710:145::o:0;21459:113::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;21539:15:0;;;::::1;;::::0;;;:10:::1;:15;::::0;;;;:25;;-1:-1:-1;;21539:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;21459:113::o;14879:134::-;14978:8;;14970:35;;14938:21;;-1:-1:-1;;;;;14978:8:0;;14970:35;;;;;14938:21;;14920:15;14970:35;14920:15;14970:35;14938:21;14978:8;14970:35;;;;;;;;;;;;;;;;;;;;;14909:104;14879:134::o;11882:334::-;8725:16;;11993:4;;11978;;-1:-1:-1;;;8725:16:0;;;;:28;;;;-1:-1:-1;8745:8:0;;-1:-1:-1;;;8745:8:0;;;;8725:28;8724:47;;;-1:-1:-1;8766:5:0;;-1:-1:-1;;;;;8758:13:0;;;8766:5;;;;;8758:13;8724:47;:77;;;-1:-1:-1;8790:10:0;8775:26;;;;:14;:26;;;;;;;;8724:77;8716:109;;;;-1:-1:-1;;;8716:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12041:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;;;12058:10:::1;12041:28:::0;;;;;;;;:36:::1;::::0;12072:5;;12041:36:::1;:::i;:::-;-1:-1:-1::0;;;;;12010:16:0;::::1;;::::0;;;:10:::1;:16;::::0;;;;;;;12027:10:::1;12010:28:::0;;;;;;;:67;12088:26:::1;12021:4:::0;12104:2;12108:5;12088:9:::1;:26::i;:::-;-1:-1:-1::0;;;;;12130:56:0;::::1;12157:16;::::0;;;:10:::1;:16;::::0;;;;;;;12145:10:::1;12157:28:::0;;;;;;;;;;;12130:56;;3069:25:1;;;12145:10:0;;12130:56;-1:-1:-1;;;;;;;;;;;12130:56:0;3042:18:1;12130:56:0::1;;;;;;;-1:-1:-1::0;12204:4:0::1;::::0;11882:334;-1:-1:-1;;;;11882:334:0:o;15246:116::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15327:14:0;;;::::1;;::::0;;;:9:::1;:14;::::0;;;;:27;;-1:-1:-1;;15327:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15246:116::o;27338:113::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;27411:22:::1;:32:::0;;;::::1;;-1:-1:-1::0;;;27411:32:0::1;-1:-1:-1::0;;;;27411:32:0;;::::1;::::0;;;::::1;::::0;;27338:113::o;12731:387::-;8725:16;;12840:4;;12819:10;;-1:-1:-1;;;8725:16:0;;;;:28;;;;-1:-1:-1;8745:8:0;;-1:-1:-1;;;8745:8:0;;;;8725:28;8724:47;;;-1:-1:-1;8766:5:0;;-1:-1:-1;;;;;8758:13:0;;;8766:5;;;;;8758:13;8724:47;:77;;;-1:-1:-1;8790:10:0;8775:26;;;;:14;:26;;;;;;;;8724:77;8716:109;;;;-1:-1:-1;;;8716:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12865:21:0;::::1;12857:62;;;;-1:-1:-1::0;;;12857:62:0::1;;;;;;;:::i;:::-;12977:10;12966:22;::::0;;;:10:::1;:22;::::0;;;;;;;-1:-1:-1;;;;;12966:31:0;::::1;::::0;;;;;;;;:44:::1;::::0;13000:10;;12966:44:::1;:::i;:::-;12943:10;12932:22;::::0;;;:10:::1;:22;::::0;;;;;;;-1:-1:-1;;;;;12932:31:0;::::1;::::0;;;;;;;;;;:78;;;13026:62;3069:25:1;;;12932:31:0;;-1:-1:-1;;;;;;;;;;;13026:62:0;3042:18:1;13026:62:0::1;2923:177:1::0;21743:101:0;21372:10;21361:22;;;;:10;:22;;;;;;;;21353:54;;;;-1:-1:-1;;;21353:54:0;;8476:2:1;21353:54:0;;;8458:21:1;8515:2;8495:18;;;8488:30;-1:-1:-1;;;8534:18:1;;;8527:49;8593:18;;21353:54:0;8274:343:1;21353:54:0;21812:24:::1;21818:10;21830:5;21812;:24::i;:::-;21743:101:::0;:::o;19122:100::-;19190:12;;:24;;;-1:-1:-1;;;19190:24:0;;;;19163:7;;-1:-1:-1;;;;;19190:12:0;;:22;;:24;;;;;;;;;;;;;;:12;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;19183:31;;19122:100;:::o;19668:97::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;19736:11:::1;:21:::0;;-1:-1:-1;;19736:21:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19668:97::o;15370:121::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15454:19:0;;;::::1;;::::0;;;:14:::1;:19;::::0;;;;:29;;-1:-1:-1;;15454:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;15370:121::o;27209:117::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;27284:24:::1;:34:::0;;;::::1;;-1:-1:-1::0;;;27284:34:0::1;-1:-1:-1::0;;;;27284:34:0;;::::1;::::0;;;::::1;::::0;;27209:117::o;40796:110::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;40879:19:::1;:17;:19::i;27988:109::-:0;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28066:13:0;;;::::1;;::::0;;;:8:::1;:13;::::0;;;;:23;;-1:-1:-1;;28066:23:0::1;::::0;::::1;;::::0;;;::::1;::::0;;27988:109::o;28105:117::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28186:18:0;;;::::1;;::::0;;;:13:::1;:18;::::0;;;;:28;;-1:-1:-1;;28186:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;28105:117::o;26330:113::-;26371:7;26430:5;26414:12;;26399;;:27;;;;:::i;:::-;26398:37;;;;:::i;20209:143::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;20301:12:::1;::::0;:43:::1;::::0;-1:-1:-1;;;20301:43:0;;-1:-1:-1;;;;;20301:12:0;;::::1;::::0;:23:::1;::::0;:43:::1;::::0;20325:7;;20334:9;;20301:43:::1;;;:::i;15023:211::-:0;8326:5;;15101:4;;8326:5;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;15135:38:::1;::::0;-1:-1:-1;;;15135:38:0;;15167:4:::1;15135:38;::::0;::::1;4485:51:1::0;15117:15:0::1;::::0;-1:-1:-1;;;;;15135:23:0;::::1;::::0;::::1;::::0;4458:18:1;;15135:38:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15191:35;::::0;-1:-1:-1;;;15191:35:0;;-1:-1:-1;;;;;9398:32:1;;;15191:35:0::1;::::0;::::1;9380:51:1::0;9447:18;;;9440:34;;;15117:56:0;;-1:-1:-1;15191:22:0;;::::1;::::0;::::1;::::0;9353:18:1;;15191:35:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;15184:42;;;8387:1;15023:211:::0;;;;:::o;26455:114::-;26496:7;26556:5;26540:12;;26525;;:27;;;;:::i;14731:140::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;14816:5:::1;::::0;14795:39:::1;::::0;14831:1:::1;::::0;14816:5:::1;::::0;::::1;-1:-1:-1::0;;;;;14816:5:0::1;::::0;14795:39:::1;::::0;14831:1;;14795:39:::1;14845:5;:18:::0;;-1:-1:-1;;;;;;14845:18:0::1;::::0;;14731:140::o;28230:105::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;28299:1:::1;28284:12;:16:::0;;;28311:12:::1;:16:::0;28230:105::o;22243:456::-;21372:10;21361:22;;;;:10;:22;;;;;;;;21353:54;;;;-1:-1:-1;;;21353:54:0;;8476:2:1;21353:54:0;;;8458:21:1;8515:2;8495:18;;;8488:30;-1:-1:-1;;;8534:18:1;;;8527:49;8593:18;;21353:54:0;8274:343:1;21353:54:0;-1:-1:-1;;;;;22391:19:0;::::1;22333:14;22391:19:::0;;;:10:::1;:19;::::0;;;;;;;22350:10:::1;22391:27:::0;;;;;;;;;22433:17;;::::1;22429:161;;;-1:-1:-1::0;;;;;22467:19:0;;::::1;22497:1;22467:19:::0;;;:10:::1;:19;::::0;;;;;;;:27;;::::1;::::0;;;;;;;;:31;22429:161:::1;;;22561:17;22573:5:::0;22561:9;:17:::1;:::i;:::-;-1:-1:-1::0;;;;;22531:19:0;;::::1;;::::0;;;:10:::1;:19;::::0;;;;;;;:27;;::::1;::::0;;;;;;:47;22429:161:::1;22600:21;22606:7;22615:5;22600;:21::i;:::-;-1:-1:-1::0;;;;;22637:54:0;;::::1;22663:19;::::0;;;:10:::1;:19;::::0;;;;;;;22637:54;;::::1;22663:27:::0;;;;;;;;;;;22637:54;;3069:25:1;;;-1:-1:-1;;;;;;;;;;;22637:54:0;3042:18:1;22637:54:0::1;;;;;;;22322:377;;22243:456:::0;;:::o;27766:100::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;27837:12:::1;:21:::0;27766:100::o;14577:146::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;14649:17:0;::::1;14641:52;;;::::0;-1:-1:-1;;;14641:52:0;;9937:2:1;14641:52:0::1;::::0;::::1;9919:21:1::0;9976:2;9956:18;;;9949:30;-1:-1:-1;;;9995:18:1;;;9988:52;10057:18;;14641:52:0::1;9735:346:1::0;14641:52:0::1;14704:5;:11:::0;;-1:-1:-1;;;;;14704:11:0;;::::1;;;-1:-1:-1::0;;;;;;14704:11:0;;::::1;::::0;;;::::1;::::0;;14577:146::o;27463:179::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;27539:21:::1;::::0;-1:-1:-1;;;27539:21:0;::::1;;;27531:65;;;::::0;-1:-1:-1;;;27531:65:0;;10288:2:1;27531:65:0::1;::::0;::::1;10270:21:1::0;10327:2;10307:18;;;10300:30;10366:33;10346:18;;;10339:61;10417:18;;27531:65:0::1;10086:355:1::0;27531:65:0::1;27607:17;:27:::0;;;::::1;;-1:-1:-1::0;;;27607:27:0::1;-1:-1:-1::0;;;;27607:27:0;;::::1;::::0;;;::::1;::::0;;27463:179::o;20513:185::-;20612:8;;-1:-1:-1;;;;;20612:8:0;20598:10;:22;20594:97;;20637:12;;:42;;-1:-1:-1;;;20637:42:0;;-1:-1:-1;;;;;20637:12:0;;;;:25;;:42;;20663:7;;20672:6;;20637:42;;;:::i;7876:20::-;;;;;;;:::i;13638:397::-;8725:16;;13752:4;;13731:10;;-1:-1:-1;;;8725:16:0;;;;:28;;;;-1:-1:-1;8745:8:0;;-1:-1:-1;;;8745:8:0;;;;8725:28;8724:47;;;-1:-1:-1;8766:5:0;;-1:-1:-1;;;;;8758:13:0;;;8766:5;;;;;8758:13;8724:47;:77;;;-1:-1:-1;8790:10:0;8775:26;;;;:14;:26;;;;;;;;8724:77;8716:109;;;;-1:-1:-1;;;8716:109:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;13777:21:0;::::1;13769:62;;;;-1:-1:-1::0;;;13769:62:0::1;;;;;;;:::i;:::-;13889:10;13878:22;::::0;;;:10:::1;:22;::::0;;;;;;;-1:-1:-1;;;;;13878:31:0;::::1;::::0;;;;;;;;:49:::1;::::0;13912:15;;13878:49:::1;:::i;10268:178::-:0;8725:16;;10367:4;;10346:10;;-1:-1:-1;;;8725:16:0;;;;:28;;;;-1:-1:-1;8745:8:0;;-1:-1:-1;;;8745:8:0;;;;8725:28;8724:47;;;-1:-1:-1;8766:5:0;;-1:-1:-1;;;;;8758:13:0;;;8766:5;;;;;8758:13;8724:47;:77;;;-1:-1:-1;8790:10:0;8775:26;;;;:14;:26;;;;;;;;8724:77;8716:109;;;;-1:-1:-1;;;8716:109:0;;;;;;;:::i;:::-;10384:32:::1;10394:10;10406:2;10410:5;10384:9;:32::i;:::-;-1:-1:-1::0;10434:4:0::1;::::0;10268:178;-1:-1:-1;;;10268:178:0:o;41926:108::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;42001:16:::1;:25:::0;41926:108::o;27654:100::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;27725:12:::1;:21:::0;27654:100::o;19773:225::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19866:14:0;::::1;;::::0;;;:9:::1;:14;::::0;;;;;::::1;;:23;::::0;:43:::1;;-1:-1:-1::0;19893:16:0;::::1;19866:43;19858:91;;;::::0;-1:-1:-1;;;19858:91:0;;10970:2:1;19858:91:0::1;::::0;::::1;10952:21:1::0;11009:2;10989:18;;;10982:30;11048:34;11028:18;;;11021:62;-1:-1:-1;;;11099:18:1;;;11092:33;11142:19;;19858:91:0::1;10768:399:1::0;19858:91:0::1;-1:-1:-1::0;;;;;19960:20:0;;;::::1;;::::0;;;:15:::1;:20;::::0;;;;:30;;-1:-1:-1;;19960:30:0::1;::::0;::::1;;::::0;;;::::1;::::0;;19773:225::o;27088:109::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;27159:20:::1;:30:::0;;;::::1;;-1:-1:-1::0;;;27159:30:0::1;-1:-1:-1::0;;;;27159:30:0;;::::1;::::0;;;::::1;::::0;;27088:109::o;19320:102::-;19389:12;;:25;;;-1:-1:-1;;;19389:25:0;;;;19362:7;;-1:-1:-1;;;;;19389:12:0;;:23;;:25;;;;;;;;;;;;;;:12;:25;;;;;;;;;;;;;;20006:191;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;20110:23:::1;:35:::0;;;;20156:23:::1;:33:::0;20006:191::o;26837:239::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;26914:11:::1;:37:::0;;-1:-1:-1;;;;;;26914:37:0::1;-1:-1:-1::0;;;;;26914:37:0;;::::1;::::0;;::::1;::::0;;;26988:5:::1;::::0;26962:32:::1;::::0;-1:-1:-1;;;26962:32:0;;26914:37:::1;26988:5:::0;;::::1;::::0;;::::1;26962:32;::::0;::::1;4485:51:1::0;26914:37:0;26962:25:::1;::::0;4458:18:1;;26962:32:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;27005:21:0::1;:28:::0;;-1:-1:-1;;;;27044:24:0;-1:-1:-1;;;27044:24:0;;;-1:-1:-1;;;26837:239:0:o;41617:152::-;-1:-1:-1;;;;;41702:21:0;;41678:4;41702:21;;;:16;:21;;;;;;;;;:59;;-1:-1:-1;41745:16:0;;-1:-1:-1;;;;;41727:14:0;;:9;:14;;;;;;;;;;;:34;;41695:66;41617:152;-1:-1:-1;;41617:152:0:o;26580:217::-;26653:8;;26630:7;;-1:-1:-1;;;26653:8:0;;;;26650:121;;;26711:1;26697:11;;26682:12;:26;;;;:::i;:::-;:30;26678:82;;;-1:-1:-1;26740:4:0;;26580:217::o;26678:82::-;-1:-1:-1;26788:1:0;;26580:217::o;16256:787::-;-1:-1:-1;;;;;16343:16:0;;16335:51;;;;-1:-1:-1;;;16335:51:0;;9937:2:1;16335:51:0;;;9919:21:1;9976:2;9956:18;;;9949:30;-1:-1:-1;;;9995:18:1;;;9988:52;10057:18;;16335:51:0;9735:346:1;16335:51:0;-1:-1:-1;;;;;16405:25:0;;;;;;:19;:25;;;;;;;;:34;16397:77;;;;-1:-1:-1;;;16397:77:0;;11374:2:1;16397:77:0;;;11356:21:1;11413:2;11393:18;;;11386:30;11452:32;11432:18;;;11425:60;11502:18;;16397:77:0;11172:354:1;16397:77:0;16499:16;;;;16495:541;;;-1:-1:-1;;;;;16552:15:0;;:9;:15;;;;;;;;;;;:23;;16570:5;;16552:23;:::i;:::-;-1:-1:-1;;;;;16534:15:0;;;:9;:15;;;;;;;;;;;:41;;;;16606:13;;;;;;;:21;;16622:5;;16606:21;:::i;:::-;-1:-1:-1;;;;;16590:13:0;;;:9;:13;;;;;;;;;;;;:37;;;;16647:25;3069::1;;;16590:13:0;;16647:25;;;;-1:-1:-1;;;;;;;;;;;16647:25:0;3042:18:1;16647:25:0;;;;;;;16256:787;;;:::o;16495:541::-;16707:28;16719:4;16725:2;16729:5;16707:11;:28::i;:::-;16752:22;16777:35;16796:4;16802:2;16806:5;16777:18;:35::i;:::-;-1:-1:-1;;;;;16845:15:0;;:9;:15;;;;;;;;;;;16752:60;;-1:-1:-1;16845:23:0;;16863:5;;16845:23;:::i;:::-;-1:-1:-1;;;;;16827:15:0;;;:9;:15;;;;;;;;;;;:41;;;;16899:13;;;;;;;:30;;16915:14;;16899:30;:::i;:::-;-1:-1:-1;;;;;16883:13:0;;;:9;:13;;;;;;;;;;;;:46;;;;16951:34;3069:25:1;;;16883:13:0;;16951:34;;;;-1:-1:-1;;;;;;;;;;;16951:34:0;3042:18:1;16951:34:0;;;;;;;17002:22;14879:134;16495:541;16256:787;;;:::o;22731:263::-;-1:-1:-1;;;;;22806:21:0;;22798:30;;;;;;22871:5;22856:12;;:20;;;;:::i;:::-;22841:12;:35;-1:-1:-1;;;;;22908:18:0;;:9;:18;;;;;;;;;;;:26;;22929:5;;22908:26;:::i;:::-;-1:-1:-1;;;;;22887:18:0;;:9;:18;;;;;;;;;;;:47;;;;22950:36;;3069:25:1;;;22887:9:0;;-1:-1:-1;;;;;;;;;;;22950:36:0;3042:18:1;22950:36:0;;;;;;;22731:263;;:::o;23860:171::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;23928:19:::1;:17;:19::i;:::-;23971:15;23958:10;:28:::0;24011:12:::1;23997:11;:26:::0;23860:171::o;41275:165::-;41398:34;41416:4;41422:2;41426:5;41398:17;:34::i;41063:204::-;41191:7;41218:41;41243:4;41249:2;41253:5;41218:24;:41::i;:::-;41211:48;41063:204;-1:-1:-1;;;;41063:204:0:o;14079:82::-;8326:5;;;;;-1:-1:-1;;;;;8326:5:0;8312:10;:19;8304:72;;;;-1:-1:-1;;;8304:72:0;;;;;;;:::i;:::-;14138:8:::1;:15:::0;;-1:-1:-1;;;;14138:15:0::1;-1:-1:-1::0;;;14138:15:0::1;::::0;;14079:82::o;18430:565::-;18547:8;;-1:-1:-1;;;18547:8:0;;;;:37;;;;-1:-1:-1;18573:11:0;;;;18547:37;:68;;;;-1:-1:-1;;;;;;18602:13:0;;;;;;:9;:13;;;;;;;;18547:68;:123;;;;;18655:15;18633:13;;18649:2;18633:18;;;;:::i;:::-;:37;;18547:123;:199;;;;-1:-1:-1;18723:23:0;;18705:12;;-1:-1:-1;;;;;18705:12:0;18687:9;:32;;;;;;;;;;;:59;;18547:199;:238;;;;-1:-1:-1;;;;;;18764:21:0;;;;;;:15;:21;;;;;;;;18763:22;18547:238;:285;;;;;18802:12;;;;;;;;;-1:-1:-1;;;;;18802:12:0;-1:-1:-1;;;;;18802:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:30;18547:285;18529:414;;;18875:15;18859:13;:31;18905:12;;:26;;;-1:-1:-1;;;18905:26:0;;;;-1:-1:-1;;;;;18905:12:0;;;;:24;;:26;;;;;:12;;:26;;;;;;;;:12;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18529:414;18953:34;18971:4;18977:2;18981:5;18953:17;:34::i;17524:896::-;-1:-1:-1;;;;;17705:21:0;;17628:7;17705:21;;;:15;:21;;;;;;17683:5;;17705:21;;:30;;;:62;;-1:-1:-1;;;;;;17739:19:0;;;;;;:15;:19;;;;;;;;:28;17705:62;:74;;;;-1:-1:-1;17771:8:0;;-1:-1:-1;;;17771:8:0;;;;17705:74;17701:386;;;-1:-1:-1;;;;;17800:15:0;;;;;;:9;:15;;;;;;;;17796:280;;;17887:12;;:30;;-1:-1:-1;;;17887:30:0;;;;;3069:25:1;;;-1:-1:-1;;;;;17887:12:0;;;;:23;;3042:18:1;;17887:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;17870:47;;17796:280;;;-1:-1:-1;;;;;17943:13:0;;;;;;:9;:13;;;;;;;;17939:137;;;18029:12;;:31;;-1:-1:-1;;;18029:31:0;;;;;3069:25:1;;;-1:-1:-1;;;;;18029:12:0;;;;:24;;3042:18:1;;18029:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;18012:48;;17939:137;18099:17;18119:22;18127:14;18119:5;:22;:::i;:::-;18099:42;-1:-1:-1;18156:13:0;;18152:193;;18239:12;;-1:-1:-1;;;;;18239:12:0;18221:9;:32;;;;;;;;;;;:44;;18256:9;;18221:44;:::i;:::-;18204:12;;;-1:-1:-1;;;;;18204:12:0;;;18186:9;:32;;;;;;;;;;;;:79;;;;18308:12;;18285:48;;3069:25:1;;;18308:12:0;;;;18285:48;;;;-1:-1:-1;;;;;;;;;;;18285:48:0;3042:18:1;18285:48:0;;;;;;;18152:193;18362:50;18387:4;18393:2;18397:14;18362:24;:50::i;:::-;18355:57;17524:896;-1:-1:-1;;;;;;17524:896:0:o;24043:1682::-;24150:20;;-1:-1:-1;;;24150:20:0;;;;:29;;:62;;-1:-1:-1;24192:10:0;24183:20;;;;:8;:20;;;;;;;;:29;24150:62;24142:90;;;;-1:-1:-1;;;24142:90:0;;11733:2:1;24142:90:0;;;11715:21:1;11772:2;11752:18;;;11745:30;-1:-1:-1;;;11791:18:1;;;11784:45;11846:18;;24142:90:0;11531:339:1;24142:90:0;24257:8;;-1:-1:-1;;;24257:8:0;;;;:25;;;;-1:-1:-1;24277:5:0;;-1:-1:-1;;;;;24269:13:0;;;24277:5;;;;;24269:13;;24257:25;:57;;;;-1:-1:-1;;;;;;24286:19:0;;;;;;:13;:19;;;;;;;;:28;24257:57;:87;;;;-1:-1:-1;;;;;;24318:17:0;;;;;;:13;:17;;;;;;;;:26;24257:87;24253:1410;;;24379:11;;:15;24375:122;;24435:11;;24422:9;:24;;24414:67;;;;-1:-1:-1;;;24414:67:0;;12077:2:1;24414:67:0;;;12059:21:1;12116:2;12096:18;;;12089:30;12155:32;12135:18;;;12128:60;12205:18;;24414:67:0;11875:354:1;24414:67:0;24544:1;24529:12;;:16;:42;;;;-1:-1:-1;;;;;;24549:13:0;;;;;;:9;:13;;;;;;;;:22;24529:42;24525:164;;;24626:10;:8;:10::i;:::-;-1:-1:-1;;;;;24601:13:0;;:9;:13;;;;;;;;;;;:21;;24617:5;;24601:21;:::i;:::-;:35;;24592:81;;;;-1:-1:-1;;;24592:81:0;;12436:2:1;24592:81:0;;;12418:21:1;;;12455:18;;;12448:30;12514:34;12494:18;;;12487:62;12566:18;;24592:81:0;12234:356:1;24592:81:0;24736:1;24721:12;;:16;:33;;;;-1:-1:-1;;;;;;24741:13:0;;;;;;:9;:13;;;;;;;;24721:33;24717:139;;;24793:10;:8;:10::i;:::-;24784:5;:19;;24775:65;;;;-1:-1:-1;;;24775:65:0;;12797:2:1;24775:65:0;;;12779:21:1;;;12816:18;;;12809:30;12875:34;12855:18;;;12848:62;12927:18;;24775:65:0;12595:356:1;24775:65:0;24887:24;;-1:-1:-1;;;24887:24:0;;;;24884:635;;;-1:-1:-1;;;;;24936:23:0;;;;;;:19;:23;;;;;;24963:12;24936:39;;24932:146;;-1:-1:-1;;;;;25000:12:0;;;;;;:8;:12;;;;;:19;;-1:-1:-1;;25000:19:0;25015:4;25000:19;;;25042:13;:16;;;;;;:::i;:::-;;;;;;24932:146;-1:-1:-1;;;;;25100:25:0;;;;;;:19;:25;;;;;;25129:12;25100:41;;25096:150;;-1:-1:-1;;;;;25166:14:0;;;;;;:8;:14;;;;;:21;;-1:-1:-1;;25166:21:0;25183:4;25166:21;;;25210:13;:16;;;;;;:::i;:::-;;;;;;25096:150;-1:-1:-1;;;;;25268:13:0;;;;;;:9;:13;;;;;;;;:22;;;;25264:109;;-1:-1:-1;;;;;25315:23:0;;;;;;:19;:23;;;;;25341:12;25315:38;;25264:109;-1:-1:-1;;;;;25395:15:0;;;;;;:9;:15;;;;;;;;:24;;;;25391:113;;-1:-1:-1;;;;;25444:25:0;;;;;;:19;:25;;;;;25472:12;25444:40;;25391:113;25551:17;;-1:-1:-1;;;25551:17:0;;;;25547:105;;;25589:11;;:47;;-1:-1:-1;;;25589:47:0;;-1:-1:-1;;;;;13354:15:1;;;25589:47:0;;;13336:34:1;13406:15;;;13386:18;;;13379:43;13438:18;;;13431:34;;;25589:11:0;;;;:30;;13271:18:1;;25589:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16256:787;;;:::o;25737:552::-;25906:8;;25841:7;;25886:5;;-1:-1:-1;;;25906:8:0;;;;:34;;;;-1:-1:-1;25918:22:0;;-1:-1:-1;;;25918:22:0;;;;25906:34;25902:312;;;25969:5;;-1:-1:-1;;;;;25961:13:0;;;25969:5;;;;;25961:13;;;;:32;;;25992:1;25978:11;:9;:11::i;:::-;:15;25961:32;:64;;;;-1:-1:-1;;;;;;25997:19:0;;;;;;:13;:19;;;;;;;;:28;25961:64;:94;;;;-1:-1:-1;;;;;;26029:17:0;;;;;;:13;:17;;;;;;;;:26;25961:94;25957:246;;;26076:17;26120:5;26105:11;:9;:11::i;:::-;26097:19;;:5;:19;:::i;:::-;26096:29;;;;:::i;:::-;26076:49;-1:-1:-1;26161:26:0;26076:49;26161:14;:26;:::i;:::-;26144:43;;26057:146;25957:246;26231:50;26256:4;26262:2;26266:14;26231:24;:50::i;:::-;26224:57;25737:552;-1:-1:-1;;;;;25737:552:0:o;14263:200::-;14358:7;14394:2;-1:-1:-1;;;;;14386:10:0;:4;-1:-1:-1;;;;;14386:10:0;;14378:54;;;;-1:-1:-1;;;14378:54:0;;13678:2:1;14378:54:0;;;13660:21:1;13717:2;13697:18;;;13690:30;13756:33;13736:18;;;13729:61;13807:18;;14378:54:0;13476:355:1;14378:54:0;-1:-1:-1;14450:5:0;14263:200;-1:-1:-1;;14263:200:0:o;206:423:1:-;248:3;286:5;280:12;313:6;308:3;301:19;338:1;348:162;362:6;359:1;356:13;348:162;;;424:4;480:13;;;476:22;;470:29;452:11;;;448:20;;441:59;377:12;348:162;;;352:3;555:1;548:4;539:6;534:3;530:16;526:27;519:38;618:4;611:2;607:7;602:2;594:6;590:15;586:29;581:3;577:39;573:50;566:57;;;206:423;;;;:::o;634:220::-;783:2;772:9;765:21;746:4;803:45;844:2;833:9;829:18;821:6;803:45;:::i;:::-;795:53;634:220;-1:-1:-1;;;634:220:1:o;859:127::-;920:10;915:3;911:20;908:1;901:31;951:4;948:1;941:15;975:4;972:1;965:15;991:719;1034:5;1087:3;1080:4;1072:6;1068:17;1064:27;1054:55;;1105:1;1102;1095:12;1054:55;1141:6;1128:20;1167:18;1204:2;1200;1197:10;1194:36;;;1210:18;;:::i;:::-;1285:2;1279:9;1253:2;1339:13;;-1:-1:-1;;1335:22:1;;;1359:2;1331:31;1327:40;1315:53;;;1383:18;;;1403:22;;;1380:46;1377:72;;;1429:18;;:::i;:::-;1469:10;1465:2;1458:22;1504:2;1496:6;1489:18;1550:3;1543:4;1538:2;1530:6;1526:15;1522:26;1519:35;1516:55;;;1567:1;1564;1557:12;1516:55;1631:2;1624:4;1616:6;1612:17;1605:4;1597:6;1593:17;1580:54;1678:1;1671:4;1666:2;1658:6;1654:15;1650:26;1643:37;1698:6;1689:15;;;;;;991:719;;;;:::o;1715:390::-;1793:6;1801;1854:2;1842:9;1833:7;1829:23;1825:32;1822:52;;;1870:1;1867;1860:12;1822:52;1910:9;1897:23;1943:18;1935:6;1932:30;1929:50;;;1975:1;1972;1965:12;1929:50;1998;2040:7;2031:6;2020:9;2016:22;1998:50;:::i;:::-;1988:60;2095:2;2080:18;;;;2067:32;;-1:-1:-1;;;;1715:390:1:o;2110:173::-;2178:20;;-1:-1:-1;;;;;2227:31:1;;2217:42;;2207:70;;2273:1;2270;2263:12;2207:70;2110:173;;;:::o;2288:254::-;2356:6;2364;2417:2;2405:9;2396:7;2392:23;2388:32;2385:52;;;2433:1;2430;2423:12;2385:52;2456:29;2475:9;2456:29;:::i;:::-;2446:39;2532:2;2517:18;;;;2504:32;;-1:-1:-1;;;2288:254:1:o;2547:186::-;2606:6;2659:2;2647:9;2638:7;2634:23;2630:32;2627:52;;;2675:1;2672;2665:12;2627:52;2698:29;2717:9;2698:29;:::i;2738:180::-;2797:6;2850:2;2838:9;2829:7;2825:23;2821:32;2818:52;;;2866:1;2863;2856:12;2818:52;-1:-1:-1;2889:23:1;;2738:180;-1:-1:-1;2738:180:1:o;3105:118::-;3191:5;3184:13;3177:21;3170:5;3167:32;3157:60;;3213:1;3210;3203:12;3228:315;3293:6;3301;3354:2;3342:9;3333:7;3329:23;3325:32;3322:52;;;3370:1;3367;3360:12;3322:52;3393:29;3412:9;3393:29;:::i;:::-;3383:39;;3472:2;3461:9;3457:18;3444:32;3485:28;3507:5;3485:28;:::i;:::-;3532:5;3522:15;;;3228:315;;;;;:::o;3548:328::-;3625:6;3633;3641;3694:2;3682:9;3673:7;3669:23;3665:32;3662:52;;;3710:1;3707;3700:12;3662:52;3733:29;3752:9;3733:29;:::i;:::-;3723:39;;3781:38;3815:2;3804:9;3800:18;3781:38;:::i;:::-;3771:48;;3866:2;3855:9;3851:18;3838:32;3828:42;;3548:328;;;;;:::o;4070:241::-;4126:6;4179:2;4167:9;4158:7;4154:23;4150:32;4147:52;;;4195:1;4192;4185:12;4147:52;4234:9;4221:23;4253:28;4275:5;4253:28;:::i;4755:260::-;4823:6;4831;4884:2;4872:9;4863:7;4859:23;4855:32;4852:52;;;4900:1;4897;4890:12;4852:52;4923:29;4942:9;4923:29;:::i;:::-;4913:39;;4971:38;5005:2;4994:9;4990:18;4971:38;:::i;:::-;4961:48;;4755:260;;;;;:::o;5020:396::-;5098:6;5106;5159:2;5147:9;5138:7;5134:23;5130:32;5127:52;;;5175:1;5172;5165:12;5127:52;5215:9;5202:23;5248:18;5240:6;5237:30;5234:50;;;5280:1;5277;5270:12;5234:50;5303;5345:7;5336:6;5325:9;5321:22;5303:50;:::i;:::-;5293:60;;;5372:38;5406:2;5395:9;5391:18;5372:38;:::i;5421:248::-;5489:6;5497;5550:2;5538:9;5529:7;5525:23;5521:32;5518:52;;;5566:1;5563;5556:12;5518:52;-1:-1:-1;;5589:23:1;;;5659:2;5644:18;;;5631:32;;-1:-1:-1;5421:248:1:o;5674:380::-;5753:1;5749:12;;;;5796;;;5817:61;;5871:4;5863:6;5859:17;5849:27;;5817:61;5924:2;5916:6;5913:14;5893:18;5890:38;5887:161;;5970:10;5965:3;5961:20;5958:1;5951:31;6005:4;6002:1;5995:15;6033:4;6030:1;6023:15;5887:161;;5674:380;;;:::o;6059:404::-;6261:2;6243:21;;;6300:2;6280:18;;;6273:30;6339:34;6334:2;6319:18;;6312:62;-1:-1:-1;;;6405:2:1;6390:18;;6383:38;6453:3;6438:19;;6059:404::o;6468:291::-;6645:2;6634:9;6627:21;6608:4;6665:45;6706:2;6695:9;6691:18;6683:6;6665:45;:::i;:::-;6657:53;;6746:6;6741:2;6730:9;6726:18;6719:34;6468:291;;;;;:::o;6764:343::-;6966:2;6948:21;;;7005:2;6985:18;;;6978:30;-1:-1:-1;;;7039:2:1;7024:18;;7017:49;7098:2;7083:18;;6764:343::o;7112:352::-;7314:2;7296:21;;;7353:2;7333:18;;;7326:30;7392;7387:2;7372:18;;7365:58;7455:2;7440:18;;7112:352::o;7879:127::-;7940:10;7935:3;7931:20;7928:1;7921:31;7971:4;7968:1;7961:15;7995:4;7992:1;7985:15;8011:128;8078:9;;;8099:11;;;8096:37;;;8113:18;;:::i;8144:125::-;8209:9;;;8230:10;;;8227:36;;;8243:18;;:::i;8622:184::-;8692:6;8745:2;8733:9;8724:7;8720:23;8716:32;8713:52;;;8761:1;8758;8751:12;8713:52;-1:-1:-1;8784:16:1;;8622:184;-1:-1:-1;8622:184:1:o;8811:168::-;8884:9;;;8915;;8932:15;;;8926:22;;8912:37;8902:71;;8953:18;;:::i;8984:217::-;9024:1;9050;9040:132;;9094:10;9089:3;9085:20;9082:1;9075:31;9129:4;9126:1;9119:15;9157:4;9154:1;9147:15;9040:132;-1:-1:-1;9186:9:1;;8984:217::o;9485:245::-;9552:6;9605:2;9593:9;9584:7;9580:23;9576:32;9573:52;;;9621:1;9618;9611:12;9573:52;9653:9;9647:16;9672:28;9694:5;9672:28;:::i;10446:317::-;10623:2;10612:9;10605:21;10586:4;10643:45;10684:2;10673:9;10669:18;10661:6;10643:45;:::i;:::-;10635:53;;10753:1;10749;10744:3;10740:11;10736:19;10728:6;10724:32;10719:2;10708:9;10704:18;10697:60;10446:317;;;;;:::o;12956:135::-;12995:3;13016:17;;;13013:43;;13036:18;;:::i;:::-;-1:-1:-1;13083:1:1;13072:13;;12956:135::o

Swarm Source

ipfs://b494fb4c7756629bfc0f6eb41b532c01f9eb94acd4ec125aa15643cf92361d40
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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