ETH Price: $2,526.64 (+0.61%)

Contract

0x6D18679775ca9E03430948aF29379FF89079FD45
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Manual Send193387572024-03-01 7:13:11182 days ago1709277191IN
0x6D186797...89079FD45
0 ETH0.0013079440.17906224
Approve171195522023-04-24 23:55:59494 days ago1682380559IN
0x6D186797...89079FD45
0 ETH0.001664535.80187018
Approve169038842023-03-25 10:28:11524 days ago1679740091IN
0x6D186797...89079FD45
0 ETH0.0006465813.90741878
Approve169003442023-03-24 22:32:35525 days ago1679697155IN
0x6D186797...89079FD45
0 ETH0.0011848325.48471438
Approve168999012023-03-24 21:01:59525 days ago1679691719IN
0x6D186797...89079FD45
0 ETH0.0014598931.40090478
Approve168941052023-03-24 1:30:47526 days ago1679621447IN
0x6D186797...89079FD45
0 ETH0.0007567916.27786097
Approve168931552023-03-23 22:17:59526 days ago1679609879IN
0x6D186797...89079FD45
0 ETH0.000978621.18002935
Approve168902712023-03-23 12:34:47526 days ago1679574887IN
0x6D186797...89079FD45
0 ETH0.0012904427.88575361
Approve168902542023-03-23 12:31:23526 days ago1679574683IN
0x6D186797...89079FD45
0 ETH0.0013224628.57782885
Approve168899992023-03-23 11:39:35526 days ago1679571575IN
0x6D186797...89079FD45
0 ETH0.0007494916.10010159
Approve168878712023-03-23 4:27:47527 days ago1679545667IN
0x6D186797...89079FD45
0 ETH0.0005120111.01289856
Approve168878602023-03-23 4:25:35527 days ago1679545535IN
0x6D186797...89079FD45
0 ETH0.0007913817
Transfer Ownersh...168878302023-03-23 4:19:35527 days ago1679545175IN
0x6D186797...89079FD45
0 ETH0.0006443912.8775004
Set Max Wallet P...168878092023-03-23 4:15:23527 days ago1679544923IN
0x6D186797...89079FD45
0 ETH0.0004030812.88211771
Set Sell Tx Limi...168878072023-03-23 4:14:59527 days ago1679544899IN
0x6D186797...89079FD45
0 ETH0.0003968912.63725898
Set Buy Tx Limit...168877992023-03-23 4:13:23527 days ago1679544803IN
0x6D186797...89079FD45
0 ETH0.0004383113.98484581
Approve168877942023-03-23 4:12:11527 days ago1679544731IN
0x6D186797...89079FD45
0 ETH0.0007041815.12691489
Approve168877942023-03-23 4:12:11527 days ago1679544731IN
0x6D186797...89079FD45
0 ETH0.0007041815.12691489
Set Sell Fees168877882023-03-23 4:10:59527 days ago1679544659IN
0x6D186797...89079FD45
0 ETH0.0005526911.97318068
Approve168877772023-03-23 4:08:47527 days ago1679544527IN
0x6D186797...89079FD45
0 ETH0.0006330913.59964564
Set Sell Fees168877732023-03-23 4:07:59527 days ago1679544479IN
0x6D186797...89079FD45
0 ETH0.0005455211.81797479
Approve168877612023-03-23 4:05:35527 days ago1679544335IN
0x6D186797...89079FD45
0 ETH0.0005549511.92127732
Approve168877562023-03-23 4:04:35527 days ago1679544275IN
0x6D186797...89079FD45
0 ETH0.0007592116.30892307
Approve168877542023-03-23 4:04:11527 days ago1679544251IN
0x6D186797...89079FD45
0 ETH0.0005820112.59663039
Approve168877472023-03-23 4:02:47527 days ago1679544167IN
0x6D186797...89079FD45
0 ETH0.0005725712.31557924
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
193387572024-03-01 7:13:11182 days ago1709277191
0x6D186797...89079FD45
0.05255171 ETH
168940202023-03-24 1:13:47526 days ago1679620427
0x6D186797...89079FD45
0.00111469 ETH
168940202023-03-24 1:13:47526 days ago1679620427
0x6D186797...89079FD45
0.00668819 ETH
168940202023-03-24 1:13:47526 days ago1679620427
0x6D186797...89079FD45
0.00222939 ETH
168940202023-03-24 1:13:47526 days ago1679620427
0x6D186797...89079FD45
0.01114698 ETH
168931572023-03-23 22:18:23526 days ago1679609903
0x6D186797...89079FD45
0.00144396 ETH
168931572023-03-23 22:18:23526 days ago1679609903
0x6D186797...89079FD45
0.00866378 ETH
168931572023-03-23 22:18:23526 days ago1679609903
0x6D186797...89079FD45
0.00288792 ETH
168931572023-03-23 22:18:23526 days ago1679609903
0x6D186797...89079FD45
0.01443964 ETH
168882172023-03-23 5:37:35526 days ago1679549855
0x6D186797...89079FD45
0.00202926 ETH
168882172023-03-23 5:37:35526 days ago1679549855
0x6D186797...89079FD45
0.01217557 ETH
168882172023-03-23 5:37:35526 days ago1679549855
0x6D186797...89079FD45
0.00405852 ETH
168882172023-03-23 5:37:35526 days ago1679549855
0x6D186797...89079FD45
0.02029262 ETH
168881482023-03-23 5:23:47527 days ago1679549027
0x6D186797...89079FD45
0.00227704 ETH
168881482023-03-23 5:23:47527 days ago1679549027
0x6D186797...89079FD45
0.01366225 ETH
168881482023-03-23 5:23:47527 days ago1679549027
0x6D186797...89079FD45
0.00455408 ETH
168881482023-03-23 5:23:47527 days ago1679549027
0x6D186797...89079FD45
0.02277043 ETH
168881482023-03-23 5:23:47527 days ago1679549027
0x6D186797...89079FD45
0.00312745 ETH
168881482023-03-23 5:23:47527 days ago1679549027
0x6D186797...89079FD45
0.01876475 ETH
168881482023-03-23 5:23:47527 days ago1679549027
0x6D186797...89079FD45
0.00625491 ETH
168881482023-03-23 5:23:47527 days ago1679549027
0x6D186797...89079FD45
0.03127458 ETH
168880502023-03-23 5:03:59527 days ago1679547839
0x6D186797...89079FD45
0.00316925 ETH
168880502023-03-23 5:03:59527 days ago1679547839
0x6D186797...89079FD45
0.0190155 ETH
168880502023-03-23 5:03:59527 days ago1679547839
0x6D186797...89079FD45
0.0063385 ETH
168880502023-03-23 5:03:59527 days ago1679547839
0x6D186797...89079FD45
0.03169251 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
babyoptimus

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**

Baby Optimus (BOPTIMUS)

🤖 Baby Optimus Project: Pioneering AI-powered blockchain, 
honoring Elon's Optimus bot! 🔐Secure liquidity, 🎉meme magic, 
🌐Web3 expansion, 💰Optimus Rewards. 100% community-driven, 
transparent & innovative. Join the future!

Socials 

TG: https://t.me/babyoptimuseth
Twitter: https://twitter.com/babyoptimuseth
Website: https://babyoptimuseth.com
Medium: https://medium.com/@boptimuserc

/**
 *
*/

//SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

/**
 * Standard SafeMath, stripped down to just add/sub/mul/div
 */
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }
}

/**
 * ERC20 standard interface.
 */
interface IERC20 {
    function totalSupply() external view returns (uint256);
    function decimals() external view returns (uint8);
    function symbol() external view returns (string memory);
    function name() external view returns (string memory);
    function getOwner() external view returns (address);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address recipient, uint256 amount) external returns (bool);
    function allowance(address _owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 amount) external returns (bool);
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

/**
 * Allows for contract ownership for multiple adressess
 */
abstract contract Auth {
    address internal owner;
    mapping (address => bool) internal authorizations;

    constructor(address _owner) {
        owner = _owner;
        authorizations[_owner] = true;
    }

    /**
     * Function modifier to require caller to be contract owner
     */
    modifier onlyOwner() {
        require(isOwner(msg.sender), "!OWNER"); _;
    }

    /**
     * Function modifier to require caller to be authorized
     */
    modifier authorized() {
        require(isAuthorized(msg.sender), "!AUTHORIZED"); _;
    }

    /**
     * Authorize address. Owner only
     */
    function authorize(address account) public onlyOwner {
        authorizations[account] = true;
    }

    /**
     * Remove address authorization. Owner only
     */
    function unauthorize(address account) public onlyOwner {
        authorizations[account] = false;
    }

    /**
     * Check if address is owner
     */
    function isOwner(address account) public view returns (bool) {
        return account == owner;
    }

    /**
     * Return address authorization status
     */
    function isAuthorized(address account) public view returns (bool) {
        return authorizations[account];
    }

    /**
     * Transfer ownership to new address. Caller must be owner. Leaves old owner authorized
     */
    function transferOwnership(address payable account) public onlyOwner {
        owner = account;
        authorizations[account] = true;
        emit OwnershipTransferred(account);
    }

    event OwnershipTransferred(address owner);
}

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

/* Standard IDEXRouter */
interface IDEXRouter {
    function factory() external pure returns (address);
    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external returns (uint amountA, uint amountB, uint liquidity);

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

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

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

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

/* Interface for the DividendDistributor */
interface IDividendDistributor {
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external;
    function setShare(address shareholder, uint256 amount) external;
    function deposit() external payable;
    function process(uint256 gas) external;
}

/* Our DividendDistributor contract responsible for distributing the earn token */
contract DividendDistributor is IDividendDistributor {
    using SafeMath for uint256;

    address _token;

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
    }

    // EARN
    IERC20  OPTIMUS = IERC20(0x562E362876c8Aee4744FC2c6aaC8394C312d215d);
    address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    IDEXRouter router;

    address[] shareholders;
    mapping (address => uint256) shareholderIndexes;
    mapping (address => uint256) shareholderClaims;

    mapping (address => Share) public shares;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public dividendsPerShareAccuracyFactor = 10 ** 36;

    uint256 public minPeriod = 30 * 60;
    uint256 public minDistribution = 1 * (10 ** 12);

    uint256 currentIndex;

    bool initialized;
    modifier initialization() {
        require(!initialized);
        _;
        initialized = true;
    }

    modifier onlyToken() {
        require(msg.sender == _token); _;
    }

    constructor (address _router) {
        router = _router != address(0)
            ? IDEXRouter(_router)
            : IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        _token = msg.sender;
    }

    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external override onlyToken {
        minPeriod = _minPeriod;
        minDistribution = _minDistribution;
    }

    function setShare(address shareholder, uint256 amount) external override onlyToken {
        if(shares[shareholder].amount > 0){
            distributeDividend(shareholder);
        }

        if(amount > 0 && shares[shareholder].amount == 0){
            addShareholder(shareholder);
        }else if(amount == 0 && shares[shareholder].amount > 0){
            removeShareholder(shareholder);
        }

        totalShares = totalShares.sub(shares[shareholder].amount).add(amount);
        shares[shareholder].amount = amount;
        shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
    }

    function deposit() external payable override onlyToken {
        uint256 balanceBefore = OPTIMUS.balanceOf(address(this));

        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(OPTIMUS);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: msg.value}(
            0,
            path,
            address(this),
            block.timestamp
        );

        uint256 amount = OPTIMUS.balanceOf(address(this)).sub(balanceBefore);

        totalDividends = totalDividends.add(amount);
        dividendsPerShare = dividendsPerShare.add(dividendsPerShareAccuracyFactor.mul(amount).div(totalShares));
    }

    function process(uint256 gas) external override onlyToken {
        uint256 shareholderCount = shareholders.length;

        if(shareholderCount == 0) { return; }

        uint256 gasUsed = 0;
        uint256 gasLeft = gasleft();

        uint256 iterations = 0;

        while(gasUsed < gas && iterations < shareholderCount) {
            if(currentIndex >= shareholderCount){
                currentIndex = 0;
            }

            if(shouldDistribute(shareholders[currentIndex])){
                distributeDividend(shareholders[currentIndex]);
            }

            gasUsed = gasUsed.add(gasLeft.sub(gasleft()));
            gasLeft = gasleft();
            currentIndex++;
            iterations++;
        }
    }
    
    function shouldDistribute(address shareholder) internal view returns (bool) {
        return shareholderClaims[shareholder] + minPeriod < block.timestamp
                && getUnpaidEarnings(shareholder) > minDistribution;
    }

    function distributeDividend(address shareholder) internal {
        if(shares[shareholder].amount == 0){ return; }

        uint256 amount = getUnpaidEarnings(shareholder);
        if(amount > 0){
            totalDistributed = totalDistributed.add(amount);
            OPTIMUS.transfer(shareholder, amount);
            shareholderClaims[shareholder] = block.timestamp;
            shares[shareholder].totalRealised = shares[shareholder].totalRealised.add(amount);
            shares[shareholder].totalExcluded = getCumulativeDividends(shares[shareholder].amount);
        }
    }
    
    function claimDividend(address shareholder) external onlyToken{
        distributeDividend(shareholder);
    }

    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        if(shares[shareholder].amount == 0){ return 0; }

        uint256 shareholderTotalDividends = getCumulativeDividends(shares[shareholder].amount);
        uint256 shareholderTotalExcluded = shares[shareholder].totalExcluded;

        if(shareholderTotalDividends <= shareholderTotalExcluded){ return 0; }

        return shareholderTotalDividends.sub(shareholderTotalExcluded);
    }

    function getCumulativeDividends(uint256 share) internal view returns (uint256) {
        return share.mul(dividendsPerShare).div(dividendsPerShareAccuracyFactor);
    }

    function addShareholder(address shareholder) internal {
        shareholderIndexes[shareholder] = shareholders.length;
        shareholders.push(shareholder);
    }

    function removeShareholder(address shareholder) internal {
        shareholders[shareholderIndexes[shareholder]] = shareholders[shareholders.length-1];
        shareholderIndexes[shareholders[shareholders.length-1]] = shareholderIndexes[shareholder];
        shareholders.pop();
    }
}

/* Token contract */
contract babyoptimus is IERC20, Auth {
    using SafeMath for uint256;

    // Addresses
    address OPTIMUS = 0x562E362876c8Aee4744FC2c6aaC8394C312d215d; 
    address WETH = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
    address DEAD = 0x000000000000000000000000000000000000dEaD;
    address ZERO = 0x0000000000000000000000000000000000000000;
    address DEV = 0x910A23d839Aa69F11cA535A206c689eb7509b9AC;

    // These are owner by default
    address private autoLiquidityReceiver;
    address private marketingFeeReceiver;

    // Name and symbol
    string constant _name = "Baby Optimus";
    string constant _symbol = "BOPTIMUS";
    uint8 constant _decimals = 18;

    // Total supply
    uint256 _totalSupply = 100_000_000 * (10 ** _decimals); // 100m 

    // Max wallet and TX
    uint256 public _maxBuyTxAmount = _totalSupply * 200 / 10000; // 2% 
    uint256 public _maxSellTxAmount = _totalSupply * 200 / 10000; // 2% 
    uint256 public _maxWalletToken = ( _totalSupply * 200 ) / 10000; // 2% 

    // Mappings
    mapping (address => uint256) _balances;
    mapping (address => mapping (address => uint256)) _allowances;
    mapping (address => bool) isFeeExempt;
    mapping (address => bool) isTxLimitExempt;
    mapping (address => bool) isTimelockExempt;
    mapping (address => bool) isDividendExempt;
    mapping (address => bool) public isBlacklisted;
    
    // Buy Fees
    uint256 public liquidityFeeBuy = 1; 
    uint256 public buybackFeeBuy = 0;
    uint256 public reflectionFeeBuy = 1;
    uint256 public marketingFeeBuy = 3;
    uint256 public devFeeBuy = 0;
    uint256 public totalFeeBuy = 5;

    // Sell fees
    uint256 public liquidityFeeSell = 1;
    uint256 public buybackFeeSell = 0;
    uint256 public reflectionFeeSell = 1;
    uint256 public marketingFeeSell = 3;
    uint256 public devFeeSell = 0;
    uint256 public totalFeeSell = 5;

    // Fee variables
    uint256 liquidityFee;
    uint256 buybackFee;
    uint256 reflectionFee;
    uint256 marketingFee;
    uint256 devFee;
    uint256 totalFee;
    uint256 feeDenominator = 100;

    // GREED
    uint256 GREEDTriggeredAt;
    uint256 GREEDDuration = 3600;
    
    // Dead blocks
    uint256 deadBlocks = 0;

    // Sell amount of tokens when a sell takes place
    uint256 public swapThreshold = _totalSupply * 50 / 10000; // 0.5% of supply

    // Liquidity
    uint256 targetLiquidity = 200;
    uint256 targetLiquidityDenominator = 100;

    // Buyback settings
    uint256 buybackMultiplierNumerator = 200;
    uint256 buybackMultiplierDenominator = 100;
    uint256 buybackMultiplierTriggeredAt;
    uint256 buybackMultiplierLength = 30 minutes;

    bool public autoBuybackEnabled = false;
    bool public autoBuybackMultiplier = false;
    uint256 autoBuybackCap;
    uint256 autoBuybackAccumulator;
    uint256 autoBuybackAmount;
    uint256 autoBuybackBlockPeriod;
    uint256 autoBuybackBlockLast;

    DividendDistributor distributor;
    uint256 distributorGas = 500000;

    // Cooldown & timer functionality
    bool public buyCooldownEnabled = false;
    uint8 public cooldownTimerInterval = 30;
    mapping (address => uint) private cooldownTimer;

    // Other variables
    IDEXRouter public router;
    address public pair;
    uint256 public launchedAt;
    bool public tradingOpen = true;
    bool public swapEnabled = true;
    bool inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    /* Token constructor */
    constructor () Auth(msg.sender) {

        router = IDEXRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        pair = IDEXFactory(router.factory()).createPair(WETH, address(this));
        _allowances[address(this)][address(router)] = type(uint256).max;

        distributor = new DividendDistributor(address(router));
        
        // Should be the owner wallet/token distributor
        address _presaler = msg.sender;
        isFeeExempt[_presaler] = true;
        isTxLimitExempt[_presaler] = true;
        
        // No timelock for these people
        isTimelockExempt[msg.sender] = true;
        isTimelockExempt[DEAD] = true;
        isTimelockExempt[address(this)] = true;
        isTimelockExempt[DEV] = true;
        
        // Exempt from dividend
        isDividendExempt[pair] = true;
        isDividendExempt[address(this)] = true;
        isDividendExempt[DEAD] = true;

        // Set the marketing and liq receiver to the owner as default
        autoLiquidityReceiver = msg.sender;
        marketingFeeReceiver = msg.sender;

        _balances[_presaler] = _totalSupply;
        emit Transfer(address(0), _presaler, _totalSupply);
    }

    receive() external payable { }

    function totalSupply() external view override returns (uint256) { return _totalSupply; }
    function decimals() external pure override returns (uint8) { return _decimals; }
    function symbol() external pure override returns (string memory) { return _symbol; }
    function name() external pure override returns (string memory) { return _name; }
    function getOwner() external view override returns (address) { return owner; }
    function balanceOf(address account) public view override returns (uint256) { return _balances[account]; }
    function allowance(address holder, address spender) external view override returns (uint256) { return _allowances[holder][spender]; }

    function approve(address spender, uint256 amount) public override returns (bool) {
        _allowances[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    function approveMax(address spender) external returns (bool) {
        return approve(spender, type(uint256).max);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        return _transferFrom(msg.sender, recipient, amount);
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        if(_allowances[sender][msg.sender] != type(uint256).max){
            _allowances[sender][msg.sender] = _allowances[sender][msg.sender].sub(amount, "Insufficient Allowance");
        }
        return _transferFrom(sender, recipient, amount);
    }

    // settting the max wallet in percentages
    // NOTE: 1% = 100
     function setMaxWalletPercent(uint256 maxWallPercent) external onlyOwner() {
        _maxWalletToken = _totalSupply.mul(maxWallPercent).div(10000);

    }

    // Main transfer function
    function _transferFrom(address sender, address recipient, uint256 amount) internal returns (bool) {
        if(inSwap){ return _basicTransfer(sender, recipient, amount); }

        // Check if trading is enabled
        if(!authorizations[sender] && !authorizations[recipient]){
            require(tradingOpen,"Trading not enabled yet");
        }

        // Check if address is blacklisted
        require(!isBlacklisted[recipient] && !isBlacklisted[sender], 'Address is blacklisted');

        // Check if buying or selling
        bool isSell = recipient == pair; 

        // Set buy or sell fees
        setCorrectFees(isSell);

        // Check max wallet
        checkMaxWallet(sender, recipient, amount);
   
        // Buycooldown 
        checkBuyCooldown(sender, recipient);

        // Checks maxTx
        checkTxLimit(sender, amount, recipient, isSell);

        // Check if we are in GREEDTime
        bool GREEDMode = inGREEDTime();

        // Check if we should do the swapback
        if(shouldSwapBack()){ swapBack(); }

        //Exchange tokens
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");

        uint256 amountReceived = shouldTakeFee(sender) ? takeFee(sender, amount, isSell, GREEDMode) : amount;
        _balances[recipient] = _balances[recipient].add(amountReceived);

        // Dividend tracker
        if(!isDividendExempt[sender]) {
            try distributor.setShare(sender, _balances[sender]) {} catch {}
        }

        if(!isDividendExempt[recipient]) {
            try distributor.setShare(recipient, _balances[recipient]) {} catch {} 
        }

        try distributor.process(distributorGas) {} catch {}

        emit Transfer(sender, recipient, amountReceived);
        return true;
    }

    // Do a normal transfer
    function _basicTransfer(address sender, address recipient, uint256 amount) internal returns (bool) {
        _balances[sender] = _balances[sender].sub(amount, "Insufficient Balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
        return true;
    }

    // Set the correct fees for buying or selling
    function setCorrectFees(bool isSell) internal {
        if(isSell){
            liquidityFee = liquidityFeeSell;
            buybackFee = buybackFeeSell;
            reflectionFee = reflectionFeeSell;
            marketingFee = marketingFeeSell;
            devFee = devFeeSell;
            totalFee = totalFeeSell;
        } else {
            liquidityFee = liquidityFeeBuy;
            buybackFee = buybackFeeBuy;
            reflectionFee = reflectionFeeBuy;
            marketingFee = marketingFeeBuy;
            devFee = devFeeBuy;
            totalFee = totalFeeBuy;
        }
    }

    // Check if we are in GREED time
    function inGREEDTime() public view returns (bool){
        if(GREEDTriggeredAt.add(GREEDDuration) > block.timestamp){
            return true;
        } else {
            return false;
        }
    }


    // Check for maxTX
    function checkTxLimit(address sender, uint256 amount, address recipient, bool isSell) internal view {
        if (recipient != owner){
            if(isSell){
                require(amount <= _maxSellTxAmount || isTxLimitExempt[sender] || isTxLimitExempt[recipient], "TX Limit Exceeded");
            } else {
                require(amount <= _maxBuyTxAmount || isTxLimitExempt[sender] || isTxLimitExempt[recipient], "TX Limit Exceeded");
            }
        }
    }

    // Check buy cooldown
    function checkBuyCooldown(address sender, address recipient) internal {
        if (sender == pair &&
            buyCooldownEnabled &&
            !isTimelockExempt[recipient]) {
            require(cooldownTimer[recipient] < block.timestamp,"Please wait between two buys");
            cooldownTimer[recipient] = block.timestamp + cooldownTimerInterval;
        }
    }

    // Check maxWallet
    function checkMaxWallet(address sender, address recipient, uint256 amount) internal view {
        if (!authorizations[sender] && recipient != owner && recipient != address(this)  && recipient != address(DEAD) && recipient != pair && recipient != marketingFeeReceiver && recipient != autoLiquidityReceiver && recipient != DEV){
            uint256 heldTokens = balanceOf(recipient);
            require((heldTokens + amount) <= _maxWalletToken,"Total Holding is currently limited, you can not buy that much.");
        }
    }

    // Check if sender is not feeExempt
    function shouldTakeFee(address sender) internal view returns (bool) {
        return !isFeeExempt[sender];
    }

    // Get total fee's or multiplication of fees
    function getTotalFee(bool selling) public view returns (uint256) {
        if(launchedAt + deadBlocks >= block.number){ return feeDenominator.sub(1); }
        if(selling && buybackMultiplierTriggeredAt.add(buybackMultiplierLength) > block.timestamp){ return getMultipliedFee(); }
        return totalFee;
    }

    // Get a multiplied fee when buybackMultiplier is active
    function getMultipliedFee() public view returns (uint256) {
        uint256 remainingTime = buybackMultiplierTriggeredAt.add(buybackMultiplierLength).sub(block.timestamp);
        uint256 feeIncrease = totalFee.mul(buybackMultiplierNumerator).div(buybackMultiplierDenominator).sub(totalFee);
        return totalFee.add(feeIncrease.mul(remainingTime).div(buybackMultiplierLength));
    }

    // Take the normal total Fee or the GREED Fee
    function takeFee(address sender, uint256 amount, bool isSell, bool GREEDMode) internal returns (uint256) {
        uint256 feeAmount;
        
        // Check if we are GREEDd
        if (GREEDMode){
            if(isSell){
                // We are selling so up the selling tax to 1.5x
                feeAmount = amount.mul(totalFee).mul(3).div(2).div(feeDenominator);
            } else {
                // We are buying so cut our taxes in half
                feeAmount = amount.mul(totalFee).div(2).div(feeDenominator);
            }
        } else {
            feeAmount = amount.mul(totalFee).div(feeDenominator);
        }

        _balances[address(this)] = _balances[address(this)].add(feeAmount);
        emit Transfer(sender, address(this), feeAmount);

        return amount.sub(feeAmount);
    }

    // Check if we should sell tokens
    function shouldSwapBack() internal view returns (bool) {
        return msg.sender != pair
        && !inSwap
        && swapEnabled
        && _balances[address(this)] >= swapThreshold;
    }

    // switch Trading
    function tradingStatus(bool _status) public onlyOwner {
        tradingOpen = _status;
        launch();
    }

    // Enable GREED
    function enableGREED(uint256 _seconds) public authorized {
        GREEDTriggeredAt = block.timestamp;
        GREEDDuration = _seconds;
    }

    // Disable the GREED mode
    function disableGREED() external authorized {
        GREEDTriggeredAt = 0;
    }

    // Enable/disable cooldown between trades
    function cooldownEnabled(bool _status, uint8 _interval) public authorized {
        buyCooldownEnabled = _status;
        cooldownTimerInterval = _interval;
    }

    // Blacklist/unblacklist an address
    function blacklistAddress(address _address, bool _value) public authorized{
        isBlacklisted[_address] = _value;
    }

    // Main swapback to sell tokens for WETH
    function swapBack() internal swapping {
        uint256 dynamicLiquidityFee = isOverLiquified(targetLiquidity, targetLiquidityDenominator) ? 0 : liquidityFee;
        uint256 amountToLiquify = swapThreshold.mul(dynamicLiquidityFee).div(totalFee).div(2);
        uint256 amountToSwap = swapThreshold.sub(amountToLiquify);

        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH;

        uint256 balanceBefore = address(this).balance;

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amountToSwap,
            0,
            path,
            address(this),
            block.timestamp
        );
        uint256 amountETH = address(this).balance.sub(balanceBefore);
        uint256 totalETHFee = totalFee.sub(dynamicLiquidityFee.div(2));
        uint256 amountETHLiquidity = amountETH.mul(dynamicLiquidityFee).div(totalETHFee).div(2);
        uint256 amountETHReflection = amountETH.mul(reflectionFee).div(totalETHFee);
        uint256 amountETHMarketing = amountETH.mul(marketingFee).div(totalETHFee);
        uint256 amountETHDev = amountETH.mul(devFee).div(totalETHFee); 


        try distributor.deposit{value: amountETHReflection}() {} catch {}
        (bool successMarketing, /* bytes memory data */) = payable(marketingFeeReceiver).call{value: amountETHMarketing, gas: 30000}("");
        (bool successDev, /* bytes memory data */) = payable(DEV).call{value: amountETHDev, gas: 30000}(""); 
        require(successMarketing, "marketing receiver rejected ETH transfer");
        require(successDev, "dev receiver rejected ETH transfer");

        if(amountToLiquify > 0){
            router.addLiquidityETH{value: amountETHLiquidity}(
                address(this),
                amountToLiquify,
                0,
                0,
                autoLiquidityReceiver,
                block.timestamp
            );
            emit AutoLiquify(amountETHLiquidity, amountToLiquify);
        }
    }

    // Check if autoBuyback is enabled
    function shouldAutoBuyback() internal view returns (bool) {
        return msg.sender != pair
            && !inSwap
            && autoBuybackEnabled
            && autoBuybackBlockLast + autoBuybackBlockPeriod <= block.number
            && address(this).balance >= autoBuybackAmount;
    }

    // Trigger a manual buyback
    function triggerManualBuyback(uint256 amount, bool triggerBuybackMultiplier) external {
        uint256 amountWithDecimals = amount * (10 ** 18);
        uint256 amountToBuy = amountWithDecimals.div(100);
        buyTokens(amountToBuy, DEAD);
        if(triggerBuybackMultiplier){
            buybackMultiplierTriggeredAt = block.timestamp;
            emit BuybackMultiplierActive(buybackMultiplierLength);
        }
    }
    
    // Stop the buyback Multiplier
    function clearBuybackMultiplier() external authorized {
        buybackMultiplierTriggeredAt = 0;
    }

    // Trigger an autobuyback
    function triggerAutoBuyback() internal {
        buyTokens(autoBuybackAmount, DEAD);
        if(autoBuybackMultiplier){
            buybackMultiplierTriggeredAt = block.timestamp;
            emit BuybackMultiplierActive(buybackMultiplierLength);
        }
        autoBuybackBlockLast = block.number;
        autoBuybackAccumulator = autoBuybackAccumulator.add(autoBuybackAmount);
        if(autoBuybackAccumulator > autoBuybackCap){ autoBuybackEnabled = false; }
    }

    // Buy amount of tokens with ETH from the contract
    function buyTokens(uint256 amount, address to) internal swapping {
        address[] memory path = new address[](2);
        path[0] = WETH;
        path[1] = address(this);

        router.swapExactETHForTokensSupportingFeeOnTransferTokens{value: amount}(
            0,
            path,
            to,
            block.timestamp
        );
    }

    // Set autobuyback settings
    function setAutoBuybackSettings(bool _enabled, uint256 _cap, uint256 _amount, uint256 _period, bool _autoBuybackMultiplier) external authorized {
        autoBuybackEnabled = _enabled;
        autoBuybackCap = _cap;
        autoBuybackAccumulator = 0;
        autoBuybackAmount = _amount;
        autoBuybackBlockPeriod = _period;
        autoBuybackBlockLast = block.number;
        autoBuybackMultiplier = _autoBuybackMultiplier;
    }

    // Set buybackmultiplier settings
    function setBuybackMultiplierSettings(uint256 numerator, uint256 denominator, uint256 length) external authorized {
        require(numerator / denominator <= 2 && numerator > denominator);
        buybackMultiplierNumerator = numerator;
        buybackMultiplierDenominator = denominator;
        buybackMultiplierLength = length;
    }

    // Check when the token is launched
    function launched() internal view returns (bool) {
        return launchedAt != 0;
    }

    // Set the launchedAt to token launch
    function launch() internal {
        launchedAt = block.number;
    }

    // Set max buy TX 
    function setBuyTxLimitInPercent(uint256 maxBuyTxPercent) external authorized {
        _maxBuyTxAmount = _totalSupply.mul(maxBuyTxPercent).div(10000);
    }

    // Set max sell TX 
    function setSellTxLimitInPercent(uint256 maxSellTxPercent) external authorized {
        _maxSellTxAmount = _totalSupply.mul(maxSellTxPercent).div(10000);
    }

    // Exempt from dividend
    function setIsDividendExempt(address holder, bool exempt) external authorized {
        require(holder != address(this) && holder != pair);
        isDividendExempt[holder] = exempt;
        if(exempt){
            distributor.setShare(holder, 0);
        }else{
            distributor.setShare(holder, _balances[holder]);
        }
    }

    // Exempt from fee
    function setIsFeeExempt(address holder, bool exempt) external authorized {
        isFeeExempt[holder] = exempt;
    }

    // Exempt from max TX
    function setIsTxLimitExempt(address holder, bool exempt) external authorized {
        isTxLimitExempt[holder] = exempt;
    }

    // Exempt from buy CD
    function setIsTimelockExempt(address holder, bool exempt) external authorized {
        isTimelockExempt[holder] = exempt;
    }

    // Set our buy fees
    function setBuyFees(uint256 _liquidityFeeBuy, uint256 _buybackFeeBuy, uint256 _reflectionFeeBuy, uint256 _marketingFeeBuy, uint256 _devFeeBuy, uint256 _feeDenominator) external authorized {
        liquidityFeeBuy = _liquidityFeeBuy;
        buybackFeeBuy = _buybackFeeBuy;
        reflectionFeeBuy = _reflectionFeeBuy;
        marketingFeeBuy = _marketingFeeBuy;
        devFeeBuy = _devFeeBuy;
        totalFeeBuy = _liquidityFeeBuy.add(_buybackFeeBuy).add(_reflectionFeeBuy).add(_marketingFeeBuy).add(_devFeeBuy);
        feeDenominator = _feeDenominator;
    }

    // Set our sell fees
    function setSellFees(uint256 _liquidityFeeSell, uint256 _buybackFeeSell, uint256 _reflectionFeeSell, uint256 _marketingFeeSell, uint256 _devFeeSell, uint256 _feeDenominator) external authorized {
        liquidityFeeSell = _liquidityFeeSell;
        buybackFeeSell = _buybackFeeSell;
        reflectionFeeSell = _reflectionFeeSell;
        marketingFeeSell = _marketingFeeSell;
        devFeeSell = _devFeeSell;
        totalFeeSell = _liquidityFeeSell.add(_buybackFeeSell).add(_reflectionFeeSell).add(_marketingFeeSell).add(_devFeeSell);
        feeDenominator = _feeDenominator;
    }

    // Set the marketing and liquidity receivers
    function setFeeReceivers(address _autoLiquidityReceiver, address _marketingFeeReceiver) external authorized {
        autoLiquidityReceiver = _autoLiquidityReceiver;
        marketingFeeReceiver = _marketingFeeReceiver;
    }

    // Set swapBack settings
    function setSwapBackSettings(bool _enabled, uint256 _amount) external authorized {
        swapEnabled = _enabled;
        swapThreshold = _totalSupply * _amount / 10000; 
    }

    // Set target liquidity
    function setTargetLiquidity(uint256 _target, uint256 _denominator) external authorized {
        targetLiquidity = _target;
        targetLiquidityDenominator = _denominator;
    }

    // Send ETH to marketingwallet
    function manualSend() external authorized {
        uint256 contractETHBalance = address(this).balance;
        payable(marketingFeeReceiver).transfer(contractETHBalance);
    }
    
    // Set criteria for auto distribution
    function setDistributionCriteria(uint256 _minPeriod, uint256 _minDistribution) external authorized {
        distributor.setDistributionCriteria(_minPeriod, _minDistribution);
    }
    
    // Let people claim there dividend
    function claimDividend() external {
        distributor.claimDividend(msg.sender);
    }
    
    // Check how much earnings are unpaid
    function getUnpaidEarnings(address shareholder) public view returns (uint256) {
        return distributor.getUnpaidEarnings(shareholder);
    } 

    // Set gas for distributor
    function setDistributorSettings(uint256 gas) external authorized {
        require(gas < 750000);
        distributorGas = gas;
    }
    
    // Get the circulatingSupply
    function getCirculatingSupply() public view returns (uint256) {
        return _totalSupply.sub(balanceOf(DEAD)).sub(balanceOf(ZERO));
    }

    // Get the liquidity backing
    function getLiquidityBacking(uint256 accuracy) public view returns (uint256) {
        return accuracy.mul(balanceOf(pair).mul(2)).div(getCirculatingSupply());
    }

    // Get if we are over liquified or not
    function isOverLiquified(uint256 target, uint256 accuracy) public view returns (bool) {
        return getLiquidityBacking(accuracy) > target;
    }
    
    event AutoLiquify(uint256 amountETH, uint256 amountBOG);
    event BuybackMultiplierActive(uint256 duration);
}

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":false,"internalType":"uint256","name":"amountETH","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountBOG","type":"uint256"}],"name":"AutoLiquify","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"duration","type":"uint256"}],"name":"BuybackMultiplierActive","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","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":[],"name":"_maxBuyTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxSellTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_maxWalletToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"approveMax","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"authorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"autoBuybackEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuybackMultiplier","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"bool","name":"_value","type":"bool"}],"name":"blacklistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyCooldownEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buybackFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimDividend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"clearBuybackMultiplier","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"},{"internalType":"uint8","name":"_interval","type":"uint8"}],"name":"cooldownEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cooldownTimerInterval","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"devFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"devFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableGREED","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_seconds","type":"uint256"}],"name":"enableGREED","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCirculatingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"getLiquidityBacking","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMultipliedFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"selling","type":"bool"}],"name":"getTotalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"shareholder","type":"address"}],"name":"getUnpaidEarnings","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inGREEDTime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"target","type":"uint256"},{"internalType":"uint256","name":"accuracy","type":"uint256"}],"name":"isOverLiquified","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launchedAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"marketingFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketingFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reflectionFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IDEXRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_cap","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_period","type":"uint256"},{"internalType":"bool","name":"_autoBuybackMultiplier","type":"bool"}],"name":"setAutoBuybackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_buybackFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_reflectionFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_devFeeBuy","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxBuyTxPercent","type":"uint256"}],"name":"setBuyTxLimitInPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numerator","type":"uint256"},{"internalType":"uint256","name":"denominator","type":"uint256"},{"internalType":"uint256","name":"length","type":"uint256"}],"name":"setBuybackMultiplierSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minPeriod","type":"uint256"},{"internalType":"uint256","name":"_minDistribution","type":"uint256"}],"name":"setDistributionCriteria","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"gas","type":"uint256"}],"name":"setDistributorSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_autoLiquidityReceiver","type":"address"},{"internalType":"address","name":"_marketingFeeReceiver","type":"address"}],"name":"setFeeReceivers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsDividendExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsFeeExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTimelockExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setIsTxLimitExempt","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxWallPercent","type":"uint256"}],"name":"setMaxWalletPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_liquidityFeeSell","type":"uint256"},{"internalType":"uint256","name":"_buybackFeeSell","type":"uint256"},{"internalType":"uint256","name":"_reflectionFeeSell","type":"uint256"},{"internalType":"uint256","name":"_marketingFeeSell","type":"uint256"},{"internalType":"uint256","name":"_devFeeSell","type":"uint256"},{"internalType":"uint256","name":"_feeDenominator","type":"uint256"}],"name":"setSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSellTxPercent","type":"uint256"}],"name":"setSellTxLimitInPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setSwapBackSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_target","type":"uint256"},{"internalType":"uint256","name":"_denominator","type":"uint256"}],"name":"setTargetLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalFeeBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalFeeSell","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"tradingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"triggerBuybackMultiplier","type":"bool"}],"name":"triggerManualBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unauthorize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052600280546001600160a01b031990811673562e362876c8aee4744fc2c6aac8394c312d215d1790915560038054821673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc217905560048054821661dead17905560058054821690556006805490911673910a23d839aa69f11ca535a206c689eb7509b9ac1790556200008c6012600a62000569565b6200009c906305f5e1006200062a565b60095561271060095460c8620000b391906200062a565b620000bf9190620004fd565b600a5561271060095460c8620000d691906200062a565b620000e29190620004fd565b600b5561271060095460c8620000f991906200062a565b620001059190620004fd565b600c556001601455600060155560016016556003601755600060185560056019556001601a556000601b556001601c556003601d556000601e556005601f556064602655610e10602855600060295561271060095460326200016891906200062a565b620001749190620004fd565b602a5560c8602b8190556064602c819055602d91909155602e556107086030556031805461ffff199081169091556207a120603855603980548216611e00179055603e8054909116610101179055348015620001cf57600080fd5b5060008054336001600160a01b031991821681178355825260016020818152604093849020805460ff1916909217909155603b8054737a250d5630b4cf539739df2c5dacb4c659f2488d931683179055825163c45a015560e01b81529251919263c45a01559260048083019392829003018186803b1580156200025157600080fd5b505afa15801562000266573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200028c9190620004cb565b6003546040516364e329cb60e11b81526001600160a01b03918216600482015230602482015291169063c9c6539690604401602060405180830381600087803b158015620002d957600080fd5b505af1158015620002ee573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003149190620004cb565b603c80546001600160a01b0319166001600160a01b03928316179055306000908152600e60209081526040808320603b80548616855292529182902060001990555490519116906200036690620004bd565b6001600160a01b039091168152602001604051809103906000f08015801562000393573d6000803e3d6000fd5b50603780546001600160a01b03199081166001600160a01b0393841617909155336000818152600f60209081526040808320805460ff199081166001908117909255601084528285208054821683179055601184528285208054821683179055600480548916865283862080548316841790553080875284872080548416851790556006548a1687528487208054841685179055603c548a1687526012865284872080548416851790558652838620805483168417905554909716845281842080549097161790955560078054851684179055600880549094168317909355600954828252600d84528482208190559351938452909283927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35062000662565b611068806200381883390190565b600060208284031215620004de57600080fd5b81516001600160a01b0381168114620004f657600080fd5b9392505050565b6000826200051b57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b80851115620005615781600019048211156200054557620005456200064c565b808516156200055357918102915b93841c939080029062000525565b509250929050565b6000620004f660ff841683600082620005855750600162000624565b81620005945750600062000624565b8160018114620005ad5760028114620005b857620005d8565b600191505062000624565b60ff841115620005cc57620005cc6200064c565b50506001821b62000624565b5060208310610133831016604e8410600b8410161715620005fd575081810a62000624565b62000609838362000520565b80600019048211156200062057620006206200064c565b0290505b92915050565b60008160001904831182151516156200064757620006476200064c565b500290565b634e487b7160e01b600052601160045260246000fd5b6131a680620006726000396000f3fe6080604052600436106104355760003560e01c80637affa29b11610229578063d806d12f1161012e578063f2fde38b116100b6578063f887ea401161007a578063f887ea4014610c8d578063fb5f27fb14610cad578063fe575a8714610cc3578063fe9fbb8014610cf3578063ffb54a9914610d1357600080fd5b8063f2fde38b14610bf8578063f429389014610c18578063f708a64f14610c2d578063f74c9f4714610c4d578063f84ba65d14610c6d57600080fd5b8063e1dcc71f116100fd578063e1dcc71f14610b64578063e3aa51bc14610b83578063f0b37c0414610ba3578063f0fc6bca14610bc3578063f1f3bca314610bd857600080fd5b8063d806d12f14610ac9578063dd62ed3e14610ade578063df20fd4914610b24578063df4a76c514610b4457600080fd5b8063a9059cbb116101b1578063ba876bb911610180578063ba876bb914610a47578063bf56b37114610a67578063cdba31fd14610a7d578063cf4be39414610a93578063d51ed1c814610aa957600080fd5b8063a9059cbb146109dc578063ac45ed1c146109fc578063b210b06d14610a12578063b6a5d7de14610a2757600080fd5b8063893d20e8116101f8578063893d20e81461091957806395d89b411461094b5780639d1944f51461097c578063a4b45c001461099c578063a8aa1b31146109bc57600080fd5b80637affa29b146108a357806382334b94146108c357806382bf293c146108e357806382d201161461090357600080fd5b80632f54bf6e1161033a5780634f7b4d49116102c2578063658d4b7f11610286578063658d4b7f146107f95780636ddd17131461081957806370a0823114610838578063722b62ad1461086e57806378109e541461088d57600080fd5b80634f7b4d491461077457806350db71fb1461078957806353148416146107a9578063571ac8b0146107bf578063617fe0ed146107df57600080fd5b806337bc957e1161030957806337bc957e146106f95780633bb8a8d41461070f578063409d056614610729578063455a43961461073f5780634dfc855a1461075f57600080fd5b80632f54bf6e146106725780632f5620d1146106a1578063313ce567146106c157806333477327146106e357600080fd5b806318160ddd116103bd57806328fd31981161038c57806328fd3198146105e75780632b112e49146106075780632d48e8961461061c5780632d5945671461063c5780632e4a9bd71461065c57600080fd5b806318160ddd14610572578063201e7991146105875780632375ce40146105a757806323b872dd146105c757600080fd5b806310075a691161040457806310075a69146104fa5780631107b3a5146105105780631161ae391461052657806312835c5e1461054657806313374e7a1461055c57600080fd5b80630445b6671461044157806306fdde031461046a578063095ea7b3146104a85780630d295980146104d857600080fd5b3661043c57005b600080fd5b34801561044d57600080fd5b50610457602a5481565b6040519081526020015b60405180910390f35b34801561047657600080fd5b5060408051808201909152600c81526b42616279204f7074696d757360a01b60208201525b6040516104619190612fe9565b3480156104b457600080fd5b506104c86104c3366004612d77565b610d2d565b6040519015158152602001610461565b3480156104e457600080fd5b506104f86104f3366004612da3565b610d9a565b005b34801561050657600080fd5b5061045760175481565b34801561051c57600080fd5b50610457601a5481565b34801561053257600080fd5b506104c8610541366004612eb1565b610de5565b34801561055257600080fd5b50610457601e5481565b34801561056857600080fd5b50610457601d5481565b34801561057e57600080fd5b50600954610457565b34801561059357600080fd5b506104f86105a2366004612eb1565b610df9565b3480156105b357600080fd5b506104f86105c2366004612ed3565b610e29565b3480156105d357600080fd5b506104c86105e2366004612d01565b610e7e565b3480156105f357600080fd5b50610457610602366004612cab565b610f40565b34801561061357600080fd5b50610457610fbe565b34801561062857600080fd5b506104f8610637366004612eb1565b611010565b34801561064857600080fd5b506104f8610657366004612e2a565b61109f565b34801561066857600080fd5b5061045760155481565b34801561067e57600080fd5b506104c861068d366004612cab565b6000546001600160a01b0391821691161490565b3480156106ad57600080fd5b506104f86106bc366004612dda565b6110eb565b3480156106cd57600080fd5b5060125b60405160ff9091168152602001610461565b3480156106ef57600080fd5b50610457600a5481565b34801561070557600080fd5b50610457601b5481565b34801561071b57600080fd5b506031546104c89060ff1681565b34801561073557600080fd5b5061045760165481565b34801561074b57600080fd5b506104f861075a366004612d42565b611151565b34801561076b57600080fd5b506104c86111a1565b34801561078057600080fd5b506104f86111cd565b34801561079557600080fd5b506104f86107a4366004612d42565b6111f9565b3480156107b557600080fd5b50610457601f5481565b3480156107cb57600080fd5b506104c86107da366004612cab565b611249565b3480156107eb57600080fd5b506039546104c89060ff1681565b34801561080557600080fd5b506104f8610814366004612d42565b611257565b34801561082557600080fd5b50603e546104c890610100900460ff1681565b34801561084457600080fd5b50610457610853366004612cab565b6001600160a01b03166000908152600d602052604090205490565b34801561087a57600080fd5b506039546106d190610100900460ff1681565b34801561089957600080fd5b50610457600c5481565b3480156108af57600080fd5b506104f86108be366004612e5c565b6112a7565b3480156108cf57600080fd5b506104f86108de366004612e8e565b6112f3565b3480156108ef57600080fd5b506104f86108fe366004612e5c565b611377565b34801561090f57600080fd5b5061045760145481565b34801561092557600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610461565b34801561095757600080fd5b50604080518082019091526008815267424f5054494d555360c01b602082015261049b565b34801561098857600080fd5b506104f8610997366004612e5c565b6113c2565b3480156109a857600080fd5b506104f86109b7366004612cc8565b6113fb565b3480156109c857600080fd5b50603c54610933906001600160a01b031681565b3480156109e857600080fd5b506104c86109f7366004612d77565b61144e565b348015610a0857600080fd5b50610457601c5481565b348015610a1e57600080fd5b506104f861145b565b348015610a3357600080fd5b506104f8610a42366004612cab565b611487565b348015610a5357600080fd5b506104f8610a62366004612f2d565b6114d8565b348015610a7357600080fd5b50610457603d5481565b348015610a8957600080fd5b5061045760185481565b348015610a9f57600080fd5b50610457600b5481565b348015610ab557600080fd5b50610457610ac4366004612e5c565b61153b565b348015610ad557600080fd5b5061045761157c565b348015610aea57600080fd5b50610457610af9366004612cc8565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b348015610b3057600080fd5b506104f8610b3f366004612dbe565b6115ef565b348015610b5057600080fd5b506104f8610b5f366004612e5c565b61164a565b348015610b7057600080fd5b506031546104c890610100900460ff1681565b348015610b8f57600080fd5b506104f8610b9e366004612e5c565b611690565b348015610baf57600080fd5b506104f8610bbe366004612cab565b6116be565b348015610bcf57600080fd5b506104f8611709565b348015610be457600080fd5b50610457610bf3366004612da3565b611762565b348015610c0457600080fd5b506104f8610c13366004612cab565b6117bf565b348015610c2457600080fd5b506104f8611855565b348015610c3957600080fd5b506104f8610c48366004612d42565b6118b8565b348015610c5957600080fd5b506104f8610c68366004612f2d565b6119bc565b348015610c7957600080fd5b506104f8610c88366004612d42565b611a19565b348015610c9957600080fd5b50603b54610933906001600160a01b031681565b348015610cb957600080fd5b5061045760195481565b348015610ccf57600080fd5b506104c8610cde366004612cab565b60136020526000908152604090205460ff1681565b348015610cff57600080fd5b506104c8610d0e366004612cab565b611a69565b348015610d1f57600080fd5b50603e546104c89060ff1681565b336000818152600e602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d889086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b03163314610dcd5760405162461bcd60e51b8152600401610dc49061303e565b60405180910390fd5b603e805460ff191682151517905543603d5550565b50565b600082610df18361153b565b119392505050565b610e0233611a69565b610e1e5760405162461bcd60e51b8152600401610dc49061305e565b602b91909155602c55565b610e3233611a69565b610e4e5760405162461bcd60e51b8152600401610dc49061305e565b6002610e5a83856130d7565b11158015610e6757508183115b610e7057600080fd5b602d92909255602e55603055565b6001600160a01b0383166000908152600e6020908152604080832033845290915281205460001914610f2b576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600e82528381203382529091529190912054610f06918490611a87565b6001600160a01b0385166000908152600e602090815260408083203384529091529020555b610f36848484611ac1565b90505b9392505050565b60375460405163051fa63360e31b81526001600160a01b03838116600483015260009216906328fd31989060240160206040518083038186803b158015610f8657600080fd5b505afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190612e75565b6005546001600160a01b03166000908152600d602052604081205461100b906004546001600160a01b03166000908152600d60205260409020546110059060095490611f0f565b90611f0f565b905090565b61101933611a69565b6110355760405162461bcd60e51b8152600401610dc49061305e565b6037546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b15801561108357600080fd5b505af1158015611097573d6000803e3d6000fd5b505050505050565b6110a833611a69565b6110c45760405162461bcd60e51b8152600401610dc49061305e565b6039805461ffff191692151561ff0019169290921761010060ff9290921691909102179055565b6110f433611a69565b6111105760405162461bcd60e51b8152600401610dc49061305e565b6031805460329590955560006033556034939093556035919091554360365561ffff1990921692151561ff0019169290921761010091151591909102179055565b61115a33611a69565b6111765760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000426111bb602854602754611f5190919063ffffffff16565b11156111c75750600190565b50600090565b6111d633611a69565b6111f25760405162461bcd60e51b8152600401610dc49061305e565b6000602755565b61120233611a69565b61121e5760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000610d9482600019610d2d565b61126033611a69565b61127c5760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6112b033611a69565b6112cc5760405162461bcd60e51b8152600401610dc49061305e565b6112ed6127106112e783600954611fb090919063ffffffff16565b9061202f565b600a5550565b600061130783670de0b6b3a76400006130f9565b9050600061131682606461202f565b6004549091506113309082906001600160a01b0316612071565b82156113715742602f556030546040519081527f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a9060200160405180910390a15b50505050565b6000546001600160a01b031633146113a15760405162461bcd60e51b8152600401610dc49061303e565b6113bc6127106112e783600954611fb090919063ffffffff16565b600c5550565b6113cb33611a69565b6113e75760405162461bcd60e51b8152600401610dc49061305e565b620b71b081106113f657600080fd5b603855565b61140433611a69565b6114205760405162461bcd60e51b8152600401610dc49061305e565b600780546001600160a01b039384166001600160a01b03199182161790915560088054929093169116179055565b6000610f39338484611ac1565b61146433611a69565b6114805760405162461bcd60e51b8152600401610dc49061305e565b6000602f55565b6000546001600160a01b031633146114b15760405162461bcd60e51b8152600401610dc49061303e565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b6114e133611a69565b6114fd5760405162461bcd60e51b8152600401610dc49061305e565b601a869055601b859055601c849055601d839055601e82905561152e82611528858188818c8c611f51565b90611f51565b601f556026555050505050565b6000610d94611548610fbe565b603c546001600160a01b03166000908152600d60205260409020546112e790611575906002905b90611fb0565b8590611fb0565b60008061159a42611005603054602f54611f5190919063ffffffff16565b905060006115c1602554611005602e546112e7602d54602554611fb090919063ffffffff16565b90506115e86115df6030546112e78585611fb090919063ffffffff16565b60255490611f51565b9250505090565b6115f833611a69565b6116145760405162461bcd60e51b8152600401610dc49061305e565b603e805461ff00191661010084151502179055600954612710906116399083906130f9565b61164391906130d7565b602a555050565b61165333611a69565b61166f5760405162461bcd60e51b8152600401610dc49061305e565b61168a6127106112e783600954611fb090919063ffffffff16565b600b5550565b61169933611a69565b6116b55760405162461bcd60e51b8152600401610dc49061305e565b42602755602855565b6000546001600160a01b031633146116e85760405162461bcd60e51b8152600401610dc49061303e565b6001600160a01b03166000908152600160205260409020805460ff19169055565b603754604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b15801561174e57600080fd5b505af1158015611371573d6000803e3d6000fd5b600043602954603d5461177591906130bf565b1061178857602654610d94906001611f0f565b8180156117aa5750426117a8603054602f54611f5190919063ffffffff16565b115b156117b757610d9461157c565b505060255490565b6000546001600160a01b031633146117e95760405162461bcd60e51b8152600401610dc49061303e565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b61185e33611a69565b61187a5760405162461bcd60e51b8152600401610dc49061305e565b60085460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156118b4573d6000803e3d6000fd5b5050565b6118c133611a69565b6118dd5760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03821630148015906119045750603c546001600160a01b03838116911614155b61190d57600080fd5b6001600160a01b0382166000908152601260205260409020805460ff1916821580159190911790915561197357603754604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401611069565b6037546001600160a01b038381166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401611069565b6119c533611a69565b6119e15760405162461bcd60e51b8152600401610dc49061305e565b60148690556015859055601684905560178390556018829055611a0c82611528858188818c8c611f51565b6019556026555050505050565b611a2233611a69565b611a3e5760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526001602052604090205460ff1690565b60008184841115611aab5760405162461bcd60e51b8152600401610dc49190612fe9565b506000611ab88486613118565b95945050505050565b603e5460009062010000900460ff1615611ae757611ae0848484612180565b9050610f39565b6001600160a01b03841660009081526001602052604090205460ff16158015611b2957506001600160a01b03831660009081526001602052604090205460ff16155b15611b8057603e5460ff16611b805760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610dc4565b6001600160a01b03831660009081526013602052604090205460ff16158015611bc257506001600160a01b03841660009081526013602052604090205460ff16155b611c075760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610dc4565b603c546001600160a01b03848116911614611c2181612266565b611c2c8585856122ba565b611c36858561242c565b611c428584868461250e565b6000611c4c6111a1565b9050611c56612646565b15611c6357611c636126a0565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0389166000908152600d9091529190912054611cb5918690611a87565b6001600160a01b0387166000908152600d6020908152604080832093909355600f90529081205460ff1615611cea5784611cf6565b611cf687868585612b68565b6001600160a01b0387166000908152600d6020526040902054909150611d1c9082611f51565b6001600160a01b038088166000908152600d6020908152604080832094909455918a1681526012909152205460ff16611dc0576037546001600160a01b038881166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015611dad57600080fd5b505af1925050508015611dbe575060015b505b6001600160a01b03861660009081526012602052604090205460ff16611e51576037546001600160a01b038781166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015611e3e57600080fd5b505af1925050508015611e4f575060015b505b6037546038546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611e899160040190815260200190565b600060405180830381600087803b158015611ea357600080fd5b505af1925050508015611eb4575060015b50856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611efa91815260200190565b60405180910390a35060019695505050505050565b6000610f3983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a87565b600080611f5e83856130bf565b905083811015610f395760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610dc4565b600082611fbf57506000610d94565b6000611fcb83856130f9565b905082611fd885836130d7565b14610f395760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610dc4565b6000610f3983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612c68565b603e805462ff0000191662010000179055604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b0316918391506000906120c3576120c3613145565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106120f7576120f7613145565b6001600160a01b039283166020918202929092010152603b5460405163b6f9de9560e01b815291169063b6f9de9590859061213d90600090869088904290600401612fb4565b6000604051808303818588803b15801561215657600080fd5b505af115801561216a573d6000803e3d6000fd5b5050603e805462ff000019169055505050505050565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600d909152918220546121d1918490611a87565b6001600160a01b038086166000908152600d602052604080822093909355908516815220546122009083611f51565b6001600160a01b038085166000818152600d602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122549086815260200190565b60405180910390a35060019392505050565b801561229357601a54602055601b54602155601c54602255601d54602355601e54602455601f5460255550565b60145460205560155460215560165460225560175460235560185460245560195460255550565b6001600160a01b03831660009081526001602052604090205460ff161580156122f157506000546001600160a01b03838116911614155b801561230657506001600160a01b0382163014155b801561232057506004546001600160a01b03838116911614155b801561233a5750603c546001600160a01b03838116911614155b801561235457506008546001600160a01b03838116911614155b801561236e57506007546001600160a01b03838116911614155b801561238857506006546001600160a01b03838116911614155b15612427576001600160a01b0382166000908152600d6020526040902054600c546123b383836130bf565b11156113715760405162461bcd60e51b815260206004820152603e60248201527f546f74616c20486f6c64696e672069732063757272656e746c79206c696d697460448201527f65642c20796f752063616e206e6f74206275792074686174206d7563682e00006064820152608401610dc4565b505050565b603c546001600160a01b03838116911614801561244b575060395460ff165b801561247057506001600160a01b03811660009081526011602052604090205460ff16155b156118b4576001600160a01b0381166000908152603a602052604090205442116124dc5760405162461bcd60e51b815260206004820152601c60248201527f506c656173652077616974206265747765656e2074776f2062757973000000006044820152606401610dc4565b6039546124f190610100900460ff16426130bf565b6001600160a01b0382166000908152603a60205260409020555050565b6000546001600160a01b038381169116146113715780156125ba57600b548311158061255257506001600160a01b03841660009081526010602052604090205460ff165b8061257557506001600160a01b03821660009081526010602052604090205460ff165b6125b55760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610dc4565b611371565b600a54831115806125e357506001600160a01b03841660009081526010602052604090205460ff165b8061260657506001600160a01b03821660009081526010602052604090205460ff165b6113715760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610dc4565b603c546000906001600160a01b0316331480159061266d5750603e5462010000900460ff16155b80156126805750603e54610100900460ff165b801561100b575050602a54306000908152600d6020526040902054101590565b603e805462ff0000191662010000179055602b54602c546000916126c391610de5565b6126cf576020546126d2565b60005b905060006126f660026112e76025546112e786602a54611fb090919063ffffffff16565b9050600061270f82602a54611f0f90919063ffffffff16565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061274957612749613145565b6001600160a01b03928316602091820292909201015260035482519116908290600190811061277a5761277a613145565b6001600160a01b039283166020918202929092010152603b5460405163791ac94760e01b81524792919091169063791ac947906127c4908690600090879030904290600401613083565b600060405180830381600087803b1580156127de57600080fd5b505af11580156127f2573d6000803e3d6000fd5b50505050600061280b8247611f0f90919063ffffffff16565b9050600061282661281d88600261202f565b60255490611f0f565b9050600061283b60026112e78481878d611fb0565b90506000612858836112e760225487611fb090919063ffffffff16565b90506000612875846112e760235488611fb090919063ffffffff16565b90506000612892856112e760245489611fb090919063ffffffff16565b9050603760009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156128e457600080fd5b505af1935050505080156128f6575060015b506008546040516000916001600160a01b03169061753090859084818181858888f193505050503d8060008114612949576040519150601f19603f3d011682016040523d82523d6000602084013e61294e565b606091505b50506006546040519192506000916001600160a01b039091169061753090859084818181858888f193505050503d80600081146129a7576040519150601f19603f3d011682016040523d82523d6000602084013e6129ac565b606091505b5050905081612a0e5760405162461bcd60e51b815260206004820152602860248201527f6d61726b6574696e672072656365697665722072656a656374656420455448206044820152673a3930b739b332b960c11b6064820152608401610dc4565b80612a665760405162461bcd60e51b815260206004820152602260248201527f6465762072656365697665722072656a656374656420455448207472616e736660448201526132b960f11b6064820152608401610dc4565b8b15612b4d57603b5460075460405163f305d71960e01b8152306004820152602481018f905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990889060c4016060604051808303818588803b158015612ad757600080fd5b505af1158015612aeb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b109190612eff565b505060408051888152602081018f90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050603e805462ff0000191690555050505050505050505050565b6000808215612bc3578315612ba357612b9c6026546112e760026112e7600361156f6025548c611fb090919063ffffffff16565b9050612be1565b612b9c6026546112e760026112e76025548a611fb090919063ffffffff16565b612bde6026546112e760255488611fb090919063ffffffff16565b90505b306000908152600d6020526040902054612bfb9082611f51565b306000818152600d6020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c4c9085815260200190565b60405180910390a3612c5e8582611f0f565b9695505050505050565b60008183612c895760405162461bcd60e51b8152600401610dc49190612fe9565b506000611ab884866130d7565b80358015158114612ca657600080fd5b919050565b600060208284031215612cbd57600080fd5b8135610f398161315b565b60008060408385031215612cdb57600080fd5b8235612ce68161315b565b91506020830135612cf68161315b565b809150509250929050565b600080600060608486031215612d1657600080fd5b8335612d218161315b565b92506020840135612d318161315b565b929592945050506040919091013590565b60008060408385031215612d5557600080fd5b8235612d608161315b565b9150612d6e60208401612c96565b90509250929050565b60008060408385031215612d8a57600080fd5b8235612d958161315b565b946020939093013593505050565b600060208284031215612db557600080fd5b610f3982612c96565b60008060408385031215612dd157600080fd5b612d9583612c96565b600080600080600060a08688031215612df257600080fd5b612dfb86612c96565b9450602086013593506040860135925060608601359150612e1e60808701612c96565b90509295509295909350565b60008060408385031215612e3d57600080fd5b612e4683612c96565b9150602083013560ff81168114612cf657600080fd5b600060208284031215612e6e57600080fd5b5035919050565b600060208284031215612e8757600080fd5b5051919050565b60008060408385031215612ea157600080fd5b82359150612d6e60208401612c96565b60008060408385031215612ec457600080fd5b50508035926020909101359150565b600080600060608486031215612ee857600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612f1457600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215612f4657600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600081518084526020808501945080840160005b83811015612fa95781516001600160a01b031687529582019590820190600101612f84565b509495945050505050565b848152608060208201526000612fcd6080830186612f70565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b8181101561301657858101830151858201604001528201612ffa565b81811115613028576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b85815284602082015260a0604082015260006130a260a0830186612f70565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156130d2576130d261312f565b500190565b6000826130f457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156131135761311361312f565b500290565b60008282101561312a5761312a61312f565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610de257600080fdfea264697066735822122035cc5cd6aefacdb2cc90743d5b63c9e1951975ac9e6022ed14cb956cb7a60e4064736f6c634300080700336080604052600180546001600160a01b031990811673562e362876c8aee4744fc2c6aac8394c312d215d179091556002805490911673c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21790556ec097ce7bc90715b34b9f1000000000600c55610708600d5564e8d4a51000600e5534801561007a57600080fd5b50604051611068380380611068833981016040819052610099916100f3565b6001600160a01b0381166100c157737a250d5630b4cf539739df2c5dacb4c659f2488d6100c3565b805b600380546001600160a01b03929092166001600160a01b0319928316179055600080549091163317905550610123565b60006020828403121561010557600080fd5b81516001600160a01b038116811461011c57600080fd5b9392505050565b610f36806101326000396000f3fe6080604052600436106100dd5760003560e01c8063997664d71161007f578063e2d2e21911610059578063e2d2e2191461022e578063efca2eed14610244578063ffb2c4791461025a578063ffd49c841461027a57600080fd5b8063997664d7146101b9578063ce7c2ac2146101cf578063d0e30db01461022657600080fd5b806328fd3198116100bb57806328fd31981461014d5780632d48e8961461016d5780633a98ef391461018d5780634fab0ae8146101a357600080fd5b806311ce023d146100e257806314b6ca961461010b57806315f7e05e1461012d575b600080fd5b3480156100ee57600080fd5b506100f8600c5481565b6040519081526020015b60405180910390f35b34801561011757600080fd5b5061012b610126366004610cd4565b610290565b005b34801561013957600080fd5b5061012b610148366004610cb9565b610408565b34801561015957600080fd5b506100f8610168366004610cb9565b61042b565b34801561017957600080fd5b5061012b610188366004610d52565b6104b4565b34801561019957600080fd5b506100f860085481565b3480156101af57600080fd5b506100f8600e5481565b3480156101c557600080fd5b506100f860095481565b3480156101db57600080fd5b5061020b6101ea366004610cb9565b60076020526000908152604090208054600182015460029092015490919083565b60408051938452602084019290925290820152606001610102565b61012b6104d6565b34801561023a57600080fd5b506100f8600b5481565b34801561025057600080fd5b506100f8600a5481565b34801561026657600080fd5b5061012b610275366004610d20565b610723565b34801561028657600080fd5b506100f8600d5481565b6000546001600160a01b031633146102a757600080fd5b6001600160a01b038216600090815260076020526040902054156102ce576102ce82610823565b6000811180156102f457506001600160a01b038216600090815260076020526040902054155b1561035a57600480546001600160a01b0384166000818152600560205260408120839055600183018455929092527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180546001600160a01b031916909117905561038d565b8015801561037f57506001600160a01b03821660009081526007602052604090205415155b1561038d5761038d8261094e565b6001600160a01b0382166000908152600760205260409020546008546103be9183916103b891610a63565b90610aae565b6008556001600160a01b03821660009081526007602052604090208190556103e581610b12565b6001600160a01b0390921660009081526007602052604090206001019190915550565b6000546001600160a01b0316331461041f57600080fd5b61042881610823565b50565b6001600160a01b03811660009081526007602052604081205461045057506000919050565b6001600160a01b03821660009081526007602052604081205461047290610b12565b6001600160a01b0384166000908152600760205260409020600101549091508082116104a2575060009392505050565b6104ac8282610a63565b949350505050565b6000546001600160a01b031633146104cb57600080fd5b600d91909155600e55565b6000546001600160a01b031633146104ed57600080fd5b6001546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561053157600080fd5b505afa158015610545573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105699190610d39565b6040805160028082526060820183529293506000929091602083019080368337505060025482519293506001600160a01b0316918391506000906105af576105af610eea565b6001600160a01b03928316602091820292909201015260018054835192169183919081106105df576105df610eea565b6001600160a01b03928316602091820292909201015260035460405163b6f9de9560e01b815291169063b6f9de9590349061062590600090869030904290600401610d74565b6000604051808303818588803b15801561063e57600080fd5b505af1158015610652573d6000803e3d6000fd5b50506001546040516370a0823160e01b8152306004820152600094506106e193508692506001600160a01b03909116906370a082319060240160206040518083038186803b1580156106a357600080fd5b505afa1580156106b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106db9190610d39565b90610a63565b6009549091506106f19082610aae565b600955600854600c5461071b916107129161070c9085610b2f565b90610bae565b600b5490610aae565b600b55505050565b6000546001600160a01b0316331461073a57600080fd5b60045480610746575050565b6000805a905060005b848310801561075d57508381105b1561081c5783600f5410610771576000600f555b6107a36004600f548154811061078957610789610eea565b6000918252602090912001546001600160a01b0316610bf0565b156107da576107da6004600f54815481106107c0576107c0610eea565b6000918252602090912001546001600160a01b0316610823565b6107ef6107e85a8490610a63565b8490610aae565b92505a600f8054919350600061080483610ea3565b9190505550808061081490610ea3565b91505061074f565b5050505050565b6001600160a01b0381166000908152600760205260409020546108435750565b600061084e8261042b565b9050801561094a57600a546108639082610aae565b600a5560015460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490529091169063a9059cbb90604401602060405180830381600087803b1580156108b457600080fd5b505af11580156108c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ec9190610cfe565b506001600160a01b038216600090815260066020908152604080832042905560079091529020600201546109209082610aae565b6001600160a01b03831660009081526007602052604090206002810191909155546103e590610b12565b5050565b6004805461095e90600190610e8c565b8154811061096e5761096e610eea565b60009182526020808320909101546001600160a01b03848116845260059092526040909220546004805492909316929181106109ac576109ac610eea565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600591829052604081205460048054919392916109f890600190610e8c565b81548110610a0857610a08610eea565b60009182526020808320909101546001600160a01b031683528201929092526040019020556004805480610a3e57610a3e610ed4565b600082815260209020810160001990810180546001600160a01b031916905501905550565b6000610aa583836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610c35565b90505b92915050565b600080610abb8385610e33565b905083811015610aa55760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064015b60405180910390fd5b6000610aa8600c5461070c600b5485610b2f90919063ffffffff16565b600082610b3e57506000610aa8565b6000610b4a8385610e6d565b905082610b578583610e4b565b14610aa55760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610b09565b6000610aa583836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250610c6f565b600d546001600160a01b03821660009081526006602052604081205490914291610c1a9190610e33565b108015610aa85750600e54610c2e8361042b565b1192915050565b60008184841115610c595760405162461bcd60e51b8152600401610b099190610dde565b506000610c668486610e8c565b95945050505050565b60008183610c905760405162461bcd60e51b8152600401610b099190610dde565b506000610c668486610e4b565b80356001600160a01b0381168114610cb457600080fd5b919050565b600060208284031215610ccb57600080fd5b610aa582610c9d565b60008060408385031215610ce757600080fd5b610cf083610c9d565b946020939093013593505050565b600060208284031215610d1057600080fd5b81518015158114610aa557600080fd5b600060208284031215610d3257600080fd5b5035919050565b600060208284031215610d4b57600080fd5b5051919050565b60008060408385031215610d6557600080fd5b50508035926020909101359150565b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015610dbe5784516001600160a01b031683529383019391830191600101610d99565b50506001600160a01b039690961660408501525050506060015292915050565b600060208083528351808285015260005b81811015610e0b57858101830151858201604001528201610def565b81811115610e1d576000604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610e4657610e46610ebe565b500190565b600082610e6857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615610e8757610e87610ebe565b500290565b600082821015610e9e57610e9e610ebe565b500390565b6000600019821415610eb757610eb7610ebe565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fdfea2646970667358221220ee9758b529db9416879e3b674955e4ce3d167227966d0dc42e50008a882503cb64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106104355760003560e01c80637affa29b11610229578063d806d12f1161012e578063f2fde38b116100b6578063f887ea401161007a578063f887ea4014610c8d578063fb5f27fb14610cad578063fe575a8714610cc3578063fe9fbb8014610cf3578063ffb54a9914610d1357600080fd5b8063f2fde38b14610bf8578063f429389014610c18578063f708a64f14610c2d578063f74c9f4714610c4d578063f84ba65d14610c6d57600080fd5b8063e1dcc71f116100fd578063e1dcc71f14610b64578063e3aa51bc14610b83578063f0b37c0414610ba3578063f0fc6bca14610bc3578063f1f3bca314610bd857600080fd5b8063d806d12f14610ac9578063dd62ed3e14610ade578063df20fd4914610b24578063df4a76c514610b4457600080fd5b8063a9059cbb116101b1578063ba876bb911610180578063ba876bb914610a47578063bf56b37114610a67578063cdba31fd14610a7d578063cf4be39414610a93578063d51ed1c814610aa957600080fd5b8063a9059cbb146109dc578063ac45ed1c146109fc578063b210b06d14610a12578063b6a5d7de14610a2757600080fd5b8063893d20e8116101f8578063893d20e81461091957806395d89b411461094b5780639d1944f51461097c578063a4b45c001461099c578063a8aa1b31146109bc57600080fd5b80637affa29b146108a357806382334b94146108c357806382bf293c146108e357806382d201161461090357600080fd5b80632f54bf6e1161033a5780634f7b4d49116102c2578063658d4b7f11610286578063658d4b7f146107f95780636ddd17131461081957806370a0823114610838578063722b62ad1461086e57806378109e541461088d57600080fd5b80634f7b4d491461077457806350db71fb1461078957806353148416146107a9578063571ac8b0146107bf578063617fe0ed146107df57600080fd5b806337bc957e1161030957806337bc957e146106f95780633bb8a8d41461070f578063409d056614610729578063455a43961461073f5780634dfc855a1461075f57600080fd5b80632f54bf6e146106725780632f5620d1146106a1578063313ce567146106c157806333477327146106e357600080fd5b806318160ddd116103bd57806328fd31981161038c57806328fd3198146105e75780632b112e49146106075780632d48e8961461061c5780632d5945671461063c5780632e4a9bd71461065c57600080fd5b806318160ddd14610572578063201e7991146105875780632375ce40146105a757806323b872dd146105c757600080fd5b806310075a691161040457806310075a69146104fa5780631107b3a5146105105780631161ae391461052657806312835c5e1461054657806313374e7a1461055c57600080fd5b80630445b6671461044157806306fdde031461046a578063095ea7b3146104a85780630d295980146104d857600080fd5b3661043c57005b600080fd5b34801561044d57600080fd5b50610457602a5481565b6040519081526020015b60405180910390f35b34801561047657600080fd5b5060408051808201909152600c81526b42616279204f7074696d757360a01b60208201525b6040516104619190612fe9565b3480156104b457600080fd5b506104c86104c3366004612d77565b610d2d565b6040519015158152602001610461565b3480156104e457600080fd5b506104f86104f3366004612da3565b610d9a565b005b34801561050657600080fd5b5061045760175481565b34801561051c57600080fd5b50610457601a5481565b34801561053257600080fd5b506104c8610541366004612eb1565b610de5565b34801561055257600080fd5b50610457601e5481565b34801561056857600080fd5b50610457601d5481565b34801561057e57600080fd5b50600954610457565b34801561059357600080fd5b506104f86105a2366004612eb1565b610df9565b3480156105b357600080fd5b506104f86105c2366004612ed3565b610e29565b3480156105d357600080fd5b506104c86105e2366004612d01565b610e7e565b3480156105f357600080fd5b50610457610602366004612cab565b610f40565b34801561061357600080fd5b50610457610fbe565b34801561062857600080fd5b506104f8610637366004612eb1565b611010565b34801561064857600080fd5b506104f8610657366004612e2a565b61109f565b34801561066857600080fd5b5061045760155481565b34801561067e57600080fd5b506104c861068d366004612cab565b6000546001600160a01b0391821691161490565b3480156106ad57600080fd5b506104f86106bc366004612dda565b6110eb565b3480156106cd57600080fd5b5060125b60405160ff9091168152602001610461565b3480156106ef57600080fd5b50610457600a5481565b34801561070557600080fd5b50610457601b5481565b34801561071b57600080fd5b506031546104c89060ff1681565b34801561073557600080fd5b5061045760165481565b34801561074b57600080fd5b506104f861075a366004612d42565b611151565b34801561076b57600080fd5b506104c86111a1565b34801561078057600080fd5b506104f86111cd565b34801561079557600080fd5b506104f86107a4366004612d42565b6111f9565b3480156107b557600080fd5b50610457601f5481565b3480156107cb57600080fd5b506104c86107da366004612cab565b611249565b3480156107eb57600080fd5b506039546104c89060ff1681565b34801561080557600080fd5b506104f8610814366004612d42565b611257565b34801561082557600080fd5b50603e546104c890610100900460ff1681565b34801561084457600080fd5b50610457610853366004612cab565b6001600160a01b03166000908152600d602052604090205490565b34801561087a57600080fd5b506039546106d190610100900460ff1681565b34801561089957600080fd5b50610457600c5481565b3480156108af57600080fd5b506104f86108be366004612e5c565b6112a7565b3480156108cf57600080fd5b506104f86108de366004612e8e565b6112f3565b3480156108ef57600080fd5b506104f86108fe366004612e5c565b611377565b34801561090f57600080fd5b5061045760145481565b34801561092557600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610461565b34801561095757600080fd5b50604080518082019091526008815267424f5054494d555360c01b602082015261049b565b34801561098857600080fd5b506104f8610997366004612e5c565b6113c2565b3480156109a857600080fd5b506104f86109b7366004612cc8565b6113fb565b3480156109c857600080fd5b50603c54610933906001600160a01b031681565b3480156109e857600080fd5b506104c86109f7366004612d77565b61144e565b348015610a0857600080fd5b50610457601c5481565b348015610a1e57600080fd5b506104f861145b565b348015610a3357600080fd5b506104f8610a42366004612cab565b611487565b348015610a5357600080fd5b506104f8610a62366004612f2d565b6114d8565b348015610a7357600080fd5b50610457603d5481565b348015610a8957600080fd5b5061045760185481565b348015610a9f57600080fd5b50610457600b5481565b348015610ab557600080fd5b50610457610ac4366004612e5c565b61153b565b348015610ad557600080fd5b5061045761157c565b348015610aea57600080fd5b50610457610af9366004612cc8565b6001600160a01b039182166000908152600e6020908152604080832093909416825291909152205490565b348015610b3057600080fd5b506104f8610b3f366004612dbe565b6115ef565b348015610b5057600080fd5b506104f8610b5f366004612e5c565b61164a565b348015610b7057600080fd5b506031546104c890610100900460ff1681565b348015610b8f57600080fd5b506104f8610b9e366004612e5c565b611690565b348015610baf57600080fd5b506104f8610bbe366004612cab565b6116be565b348015610bcf57600080fd5b506104f8611709565b348015610be457600080fd5b50610457610bf3366004612da3565b611762565b348015610c0457600080fd5b506104f8610c13366004612cab565b6117bf565b348015610c2457600080fd5b506104f8611855565b348015610c3957600080fd5b506104f8610c48366004612d42565b6118b8565b348015610c5957600080fd5b506104f8610c68366004612f2d565b6119bc565b348015610c7957600080fd5b506104f8610c88366004612d42565b611a19565b348015610c9957600080fd5b50603b54610933906001600160a01b031681565b348015610cb957600080fd5b5061045760195481565b348015610ccf57600080fd5b506104c8610cde366004612cab565b60136020526000908152604090205460ff1681565b348015610cff57600080fd5b506104c8610d0e366004612cab565b611a69565b348015610d1f57600080fd5b50603e546104c89060ff1681565b336000818152600e602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610d889086815260200190565b60405180910390a35060015b92915050565b6000546001600160a01b03163314610dcd5760405162461bcd60e51b8152600401610dc49061303e565b60405180910390fd5b603e805460ff191682151517905543603d5550565b50565b600082610df18361153b565b119392505050565b610e0233611a69565b610e1e5760405162461bcd60e51b8152600401610dc49061305e565b602b91909155602c55565b610e3233611a69565b610e4e5760405162461bcd60e51b8152600401610dc49061305e565b6002610e5a83856130d7565b11158015610e6757508183115b610e7057600080fd5b602d92909255602e55603055565b6001600160a01b0383166000908152600e6020908152604080832033845290915281205460001914610f2b576040805180820182526016815275496e73756666696369656e7420416c6c6f77616e636560501b6020808301919091526001600160a01b0387166000908152600e82528381203382529091529190912054610f06918490611a87565b6001600160a01b0385166000908152600e602090815260408083203384529091529020555b610f36848484611ac1565b90505b9392505050565b60375460405163051fa63360e31b81526001600160a01b03838116600483015260009216906328fd31989060240160206040518083038186803b158015610f8657600080fd5b505afa158015610f9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d949190612e75565b6005546001600160a01b03166000908152600d602052604081205461100b906004546001600160a01b03166000908152600d60205260409020546110059060095490611f0f565b90611f0f565b905090565b61101933611a69565b6110355760405162461bcd60e51b8152600401610dc49061305e565b6037546040516316a4744b60e11b815260048101849052602481018390526001600160a01b0390911690632d48e896906044015b600060405180830381600087803b15801561108357600080fd5b505af1158015611097573d6000803e3d6000fd5b505050505050565b6110a833611a69565b6110c45760405162461bcd60e51b8152600401610dc49061305e565b6039805461ffff191692151561ff0019169290921761010060ff9290921691909102179055565b6110f433611a69565b6111105760405162461bcd60e51b8152600401610dc49061305e565b6031805460329590955560006033556034939093556035919091554360365561ffff1990921692151561ff0019169290921761010091151591909102179055565b61115a33611a69565b6111765760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03919091166000908152601360205260409020805460ff1916911515919091179055565b6000426111bb602854602754611f5190919063ffffffff16565b11156111c75750600190565b50600090565b6111d633611a69565b6111f25760405162461bcd60e51b8152600401610dc49061305e565b6000602755565b61120233611a69565b61121e5760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03919091166000908152601160205260409020805460ff1916911515919091179055565b6000610d9482600019610d2d565b61126033611a69565b61127c5760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03919091166000908152600f60205260409020805460ff1916911515919091179055565b6112b033611a69565b6112cc5760405162461bcd60e51b8152600401610dc49061305e565b6112ed6127106112e783600954611fb090919063ffffffff16565b9061202f565b600a5550565b600061130783670de0b6b3a76400006130f9565b9050600061131682606461202f565b6004549091506113309082906001600160a01b0316612071565b82156113715742602f556030546040519081527f39d2389ec5c1fa77b2c0d374bc61b6d7bd97ccba280fcdeb4e9c7644898d7c3a9060200160405180910390a15b50505050565b6000546001600160a01b031633146113a15760405162461bcd60e51b8152600401610dc49061303e565b6113bc6127106112e783600954611fb090919063ffffffff16565b600c5550565b6113cb33611a69565b6113e75760405162461bcd60e51b8152600401610dc49061305e565b620b71b081106113f657600080fd5b603855565b61140433611a69565b6114205760405162461bcd60e51b8152600401610dc49061305e565b600780546001600160a01b039384166001600160a01b03199182161790915560088054929093169116179055565b6000610f39338484611ac1565b61146433611a69565b6114805760405162461bcd60e51b8152600401610dc49061305e565b6000602f55565b6000546001600160a01b031633146114b15760405162461bcd60e51b8152600401610dc49061303e565b6001600160a01b03166000908152600160208190526040909120805460ff19169091179055565b6114e133611a69565b6114fd5760405162461bcd60e51b8152600401610dc49061305e565b601a869055601b859055601c849055601d839055601e82905561152e82611528858188818c8c611f51565b90611f51565b601f556026555050505050565b6000610d94611548610fbe565b603c546001600160a01b03166000908152600d60205260409020546112e790611575906002905b90611fb0565b8590611fb0565b60008061159a42611005603054602f54611f5190919063ffffffff16565b905060006115c1602554611005602e546112e7602d54602554611fb090919063ffffffff16565b90506115e86115df6030546112e78585611fb090919063ffffffff16565b60255490611f51565b9250505090565b6115f833611a69565b6116145760405162461bcd60e51b8152600401610dc49061305e565b603e805461ff00191661010084151502179055600954612710906116399083906130f9565b61164391906130d7565b602a555050565b61165333611a69565b61166f5760405162461bcd60e51b8152600401610dc49061305e565b61168a6127106112e783600954611fb090919063ffffffff16565b600b5550565b61169933611a69565b6116b55760405162461bcd60e51b8152600401610dc49061305e565b42602755602855565b6000546001600160a01b031633146116e85760405162461bcd60e51b8152600401610dc49061303e565b6001600160a01b03166000908152600160205260409020805460ff19169055565b603754604051630afbf02f60e11b81523360048201526001600160a01b03909116906315f7e05e90602401600060405180830381600087803b15801561174e57600080fd5b505af1158015611371573d6000803e3d6000fd5b600043602954603d5461177591906130bf565b1061178857602654610d94906001611f0f565b8180156117aa5750426117a8603054602f54611f5190919063ffffffff16565b115b156117b757610d9461157c565b505060255490565b6000546001600160a01b031633146117e95760405162461bcd60e51b8152600401610dc49061303e565b600080546001600160a01b0319166001600160a01b038316908117825580825260016020818152604093849020805460ff191690921790915591519081527f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc686163910160405180910390a150565b61185e33611a69565b61187a5760405162461bcd60e51b8152600401610dc49061305e565b60085460405147916001600160a01b03169082156108fc029083906000818181858888f193505050501580156118b4573d6000803e3d6000fd5b5050565b6118c133611a69565b6118dd5760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03821630148015906119045750603c546001600160a01b03838116911614155b61190d57600080fd5b6001600160a01b0382166000908152601260205260409020805460ff1916821580159190911790915561197357603754604051630a5b654b60e11b81526001600160a01b03848116600483015260006024830152909116906314b6ca9690604401611069565b6037546001600160a01b038381166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401611069565b6119c533611a69565b6119e15760405162461bcd60e51b8152600401610dc49061305e565b60148690556015859055601684905560178390556018829055611a0c82611528858188818c8c611f51565b6019556026555050505050565b611a2233611a69565b611a3e5760405162461bcd60e51b8152600401610dc49061305e565b6001600160a01b03919091166000908152601060205260409020805460ff1916911515919091179055565b6001600160a01b031660009081526001602052604090205460ff1690565b60008184841115611aab5760405162461bcd60e51b8152600401610dc49190612fe9565b506000611ab88486613118565b95945050505050565b603e5460009062010000900460ff1615611ae757611ae0848484612180565b9050610f39565b6001600160a01b03841660009081526001602052604090205460ff16158015611b2957506001600160a01b03831660009081526001602052604090205460ff16155b15611b8057603e5460ff16611b805760405162461bcd60e51b815260206004820152601760248201527f54726164696e67206e6f7420656e61626c6564207965740000000000000000006044820152606401610dc4565b6001600160a01b03831660009081526013602052604090205460ff16158015611bc257506001600160a01b03841660009081526013602052604090205460ff16155b611c075760405162461bcd60e51b81526020600482015260166024820152751059191c995cdcc81a5cc8189b1858dadb1a5cdd195960521b6044820152606401610dc4565b603c546001600160a01b03848116911614611c2181612266565b611c2c8585856122ba565b611c36858561242c565b611c428584868461250e565b6000611c4c6111a1565b9050611c56612646565b15611c6357611c636126a0565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0389166000908152600d9091529190912054611cb5918690611a87565b6001600160a01b0387166000908152600d6020908152604080832093909355600f90529081205460ff1615611cea5784611cf6565b611cf687868585612b68565b6001600160a01b0387166000908152600d6020526040902054909150611d1c9082611f51565b6001600160a01b038088166000908152600d6020908152604080832094909455918a1681526012909152205460ff16611dc0576037546001600160a01b038881166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015611dad57600080fd5b505af1925050508015611dbe575060015b505b6001600160a01b03861660009081526012602052604090205460ff16611e51576037546001600160a01b038781166000818152600d602052604090819020549051630a5b654b60e11b8152600481019290925260248201529116906314b6ca9690604401600060405180830381600087803b158015611e3e57600080fd5b505af1925050508015611e4f575060015b505b6037546038546040516001624d3b8760e01b031981526001600160a01b039092169163ffb2c47991611e899160040190815260200190565b600060405180830381600087803b158015611ea357600080fd5b505af1925050508015611eb4575060015b50856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611efa91815260200190565b60405180910390a35060019695505050505050565b6000610f3983836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611a87565b600080611f5e83856130bf565b905083811015610f395760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610dc4565b600082611fbf57506000610d94565b6000611fcb83856130f9565b905082611fd885836130d7565b14610f395760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b6064820152608401610dc4565b6000610f3983836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612c68565b603e805462ff0000191662010000179055604080516002808252606082018352600092602083019080368337505060035482519293506001600160a01b0316918391506000906120c3576120c3613145565b60200260200101906001600160a01b031690816001600160a01b03168152505030816001815181106120f7576120f7613145565b6001600160a01b039283166020918202929092010152603b5460405163b6f9de9560e01b815291169063b6f9de9590859061213d90600090869088904290600401612fb4565b6000604051808303818588803b15801561215657600080fd5b505af115801561216a573d6000803e3d6000fd5b5050603e805462ff000019169055505050505050565b6040805180820182526014815273496e73756666696369656e742042616c616e636560601b6020808301919091526001600160a01b0386166000908152600d909152918220546121d1918490611a87565b6001600160a01b038086166000908152600d602052604080822093909355908516815220546122009083611f51565b6001600160a01b038085166000818152600d602052604090819020939093559151908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122549086815260200190565b60405180910390a35060019392505050565b801561229357601a54602055601b54602155601c54602255601d54602355601e54602455601f5460255550565b60145460205560155460215560165460225560175460235560185460245560195460255550565b6001600160a01b03831660009081526001602052604090205460ff161580156122f157506000546001600160a01b03838116911614155b801561230657506001600160a01b0382163014155b801561232057506004546001600160a01b03838116911614155b801561233a5750603c546001600160a01b03838116911614155b801561235457506008546001600160a01b03838116911614155b801561236e57506007546001600160a01b03838116911614155b801561238857506006546001600160a01b03838116911614155b15612427576001600160a01b0382166000908152600d6020526040902054600c546123b383836130bf565b11156113715760405162461bcd60e51b815260206004820152603e60248201527f546f74616c20486f6c64696e672069732063757272656e746c79206c696d697460448201527f65642c20796f752063616e206e6f74206275792074686174206d7563682e00006064820152608401610dc4565b505050565b603c546001600160a01b03838116911614801561244b575060395460ff165b801561247057506001600160a01b03811660009081526011602052604090205460ff16155b156118b4576001600160a01b0381166000908152603a602052604090205442116124dc5760405162461bcd60e51b815260206004820152601c60248201527f506c656173652077616974206265747765656e2074776f2062757973000000006044820152606401610dc4565b6039546124f190610100900460ff16426130bf565b6001600160a01b0382166000908152603a60205260409020555050565b6000546001600160a01b038381169116146113715780156125ba57600b548311158061255257506001600160a01b03841660009081526010602052604090205460ff165b8061257557506001600160a01b03821660009081526010602052604090205460ff165b6125b55760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610dc4565b611371565b600a54831115806125e357506001600160a01b03841660009081526010602052604090205460ff165b8061260657506001600160a01b03821660009081526010602052604090205460ff165b6113715760405162461bcd60e51b8152602060048201526011602482015270151608131a5b5a5d08115e18d959591959607a1b6044820152606401610dc4565b603c546000906001600160a01b0316331480159061266d5750603e5462010000900460ff16155b80156126805750603e54610100900460ff165b801561100b575050602a54306000908152600d6020526040902054101590565b603e805462ff0000191662010000179055602b54602c546000916126c391610de5565b6126cf576020546126d2565b60005b905060006126f660026112e76025546112e786602a54611fb090919063ffffffff16565b9050600061270f82602a54611f0f90919063ffffffff16565b6040805160028082526060820183529293506000929091602083019080368337019050509050308160008151811061274957612749613145565b6001600160a01b03928316602091820292909201015260035482519116908290600190811061277a5761277a613145565b6001600160a01b039283166020918202929092010152603b5460405163791ac94760e01b81524792919091169063791ac947906127c4908690600090879030904290600401613083565b600060405180830381600087803b1580156127de57600080fd5b505af11580156127f2573d6000803e3d6000fd5b50505050600061280b8247611f0f90919063ffffffff16565b9050600061282661281d88600261202f565b60255490611f0f565b9050600061283b60026112e78481878d611fb0565b90506000612858836112e760225487611fb090919063ffffffff16565b90506000612875846112e760235488611fb090919063ffffffff16565b90506000612892856112e760245489611fb090919063ffffffff16565b9050603760009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0846040518263ffffffff1660e01b81526004016000604051808303818588803b1580156128e457600080fd5b505af1935050505080156128f6575060015b506008546040516000916001600160a01b03169061753090859084818181858888f193505050503d8060008114612949576040519150601f19603f3d011682016040523d82523d6000602084013e61294e565b606091505b50506006546040519192506000916001600160a01b039091169061753090859084818181858888f193505050503d80600081146129a7576040519150601f19603f3d011682016040523d82523d6000602084013e6129ac565b606091505b5050905081612a0e5760405162461bcd60e51b815260206004820152602860248201527f6d61726b6574696e672072656365697665722072656a656374656420455448206044820152673a3930b739b332b960c11b6064820152608401610dc4565b80612a665760405162461bcd60e51b815260206004820152602260248201527f6465762072656365697665722072656a656374656420455448207472616e736660448201526132b960f11b6064820152608401610dc4565b8b15612b4d57603b5460075460405163f305d71960e01b8152306004820152602481018f905260006044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990889060c4016060604051808303818588803b158015612ad757600080fd5b505af1158015612aeb573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190612b109190612eff565b505060408051888152602081018f90527f424db2872186fa7e7afa7a5e902ed3b49a2ef19c2f5431e672462495dd6b450692500160405180910390a15b5050603e805462ff0000191690555050505050505050505050565b6000808215612bc3578315612ba357612b9c6026546112e760026112e7600361156f6025548c611fb090919063ffffffff16565b9050612be1565b612b9c6026546112e760026112e76025548a611fb090919063ffffffff16565b612bde6026546112e760255488611fb090919063ffffffff16565b90505b306000908152600d6020526040902054612bfb9082611f51565b306000818152600d6020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90612c4c9085815260200190565b60405180910390a3612c5e8582611f0f565b9695505050505050565b60008183612c895760405162461bcd60e51b8152600401610dc49190612fe9565b506000611ab884866130d7565b80358015158114612ca657600080fd5b919050565b600060208284031215612cbd57600080fd5b8135610f398161315b565b60008060408385031215612cdb57600080fd5b8235612ce68161315b565b91506020830135612cf68161315b565b809150509250929050565b600080600060608486031215612d1657600080fd5b8335612d218161315b565b92506020840135612d318161315b565b929592945050506040919091013590565b60008060408385031215612d5557600080fd5b8235612d608161315b565b9150612d6e60208401612c96565b90509250929050565b60008060408385031215612d8a57600080fd5b8235612d958161315b565b946020939093013593505050565b600060208284031215612db557600080fd5b610f3982612c96565b60008060408385031215612dd157600080fd5b612d9583612c96565b600080600080600060a08688031215612df257600080fd5b612dfb86612c96565b9450602086013593506040860135925060608601359150612e1e60808701612c96565b90509295509295909350565b60008060408385031215612e3d57600080fd5b612e4683612c96565b9150602083013560ff81168114612cf657600080fd5b600060208284031215612e6e57600080fd5b5035919050565b600060208284031215612e8757600080fd5b5051919050565b60008060408385031215612ea157600080fd5b82359150612d6e60208401612c96565b60008060408385031215612ec457600080fd5b50508035926020909101359150565b600080600060608486031215612ee857600080fd5b505081359360208301359350604090920135919050565b600080600060608486031215612f1457600080fd5b8351925060208401519150604084015190509250925092565b60008060008060008060c08789031215612f4657600080fd5b505084359660208601359650604086013595606081013595506080810135945060a0013592509050565b600081518084526020808501945080840160005b83811015612fa95781516001600160a01b031687529582019590820190600101612f84565b509495945050505050565b848152608060208201526000612fcd6080830186612f70565b6001600160a01b03949094166040830152506060015292915050565b600060208083528351808285015260005b8181101561301657858101830151858201604001528201612ffa565b81811115613028576000604083870101525b50601f01601f1916929092016040019392505050565b60208082526006908201526510a7aba722a960d11b604082015260600190565b6020808252600b908201526a085055551213d49256915160aa1b604082015260600190565b85815284602082015260a0604082015260006130a260a0830186612f70565b6001600160a01b0394909416606083015250608001529392505050565b600082198211156130d2576130d261312f565b500190565b6000826130f457634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156131135761311361312f565b500290565b60008282101561312a5761312a61312f565b500390565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0381168114610de257600080fdfea264697066735822122035cc5cd6aefacdb2cc90743d5b63c9e1951975ac9e6022ed14cb956cb7a60e4064736f6c63430008070033

Deployed Bytecode Sourcemap

12303:24281:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14640:56;;;;;;;;;;;;;;;;;;;13504:25:1;;;13492:2;13477:18;14640:56:0;;;;;;;;17383:80;;;;;;;;;;-1:-1:-1;17455:5:0;;;;;;;;;;;;-1:-1:-1;;;17455:5:0;;;;17383:80;;;;;;;:::i;17805:216::-;;;;;;;;;;-1:-1:-1;17805:216:0;;;;;:::i;:::-;;:::i;:::-;;;7907:14:1;;7900:22;7882:41;;7870:2;7855:18;17805:216:0;7742:187:1;25728:113:0;;;;;;;;;;-1:-1:-1;25728:113:0;;;;;:::i;:::-;;:::i;:::-;;13863:34;;;;;;;;;;;;;;;;13996:35;;;;;;;;;;;;;;;;36309:150;;;;;;;;;;-1:-1:-1;36309:150:0;;;;;:::i;:::-;;:::i;14163:29::-;;;;;;;;;;;;;;;;14121:35;;;;;;;;;;;;;;;;17113:88;;;;;;;;;;-1:-1:-1;17186:12:0;;17113:88;;34695:183;;;;;;;;;;-1:-1:-1;34695:183:0;;;;;:::i;:::-;;:::i;31069:342::-;;;;;;;;;;-1:-1:-1;31069:342:0;;;;;:::i;:::-;;:::i;18323:368::-;;;;;;;;;;-1:-1:-1;18323:368:0;;;;;:::i;:::-;;:::i;35537:146::-;;;;;;;;;;-1:-1:-1;35537:146:0;;;;;:::i;:::-;;:::i;35906:142::-;;;;;;;;;;;;;:::i;35157:183::-;;;;;;;;;;-1:-1:-1;35157:183:0;;;;;:::i;:::-;;:::i;26192:165::-;;;;;;;;;;-1:-1:-1;26192:165:0;;;;;:::i;:::-;;:::i;13782:32::-;;;;;;;;;;;;;;;;3888:103;;;;;;;;;;-1:-1:-1;3888:103:0;;;;;:::i;:::-;3943:4;3978:5;-1:-1:-1;;;;;3967:16:0;;;3978:5;;3967:16;;3888:103;30577:445;;;;;;;;;;-1:-1:-1;30577:445:0;;;;;:::i;:::-;;:::i;17207:80::-;;;;;;;;;;-1:-1:-1;12988:2:0;17207:80;;;14552:4:1;14540:17;;;14522:36;;14510:2;14495:18;17207:80:0;14380:184:1;13118:59:0;;;;;;;;;;;;;;;;14038:33;;;;;;;;;;;;;;;;15043:38;;;;;;;;;;-1:-1:-1;15043:38:0;;;;;;;;13821:35;;;;;;;;;;;;;;;;26406:125;;;;;;;;;;-1:-1:-1;26406:125:0;;;;;:::i;:::-;;:::i;21868:207::-;;;;;;;;;;;;;:::i;26054:83::-;;;;;;;;;;;;;:::i;32791:130::-;;;;;;;;;;-1:-1:-1;32791:130:0;;;;;:::i;:::-;;:::i;14199:31::-;;;;;;;;;;;;;;;;18029:122;;;;;;;;;;-1:-1:-1;18029:122:0;;;;;:::i;:::-;;:::i;15425:38::-;;;;;;;;;;-1:-1:-1;15425:38:0;;;;;;;;32473:120;;;;;;;;;;-1:-1:-1;32473:120:0;;;;;:::i;:::-;;:::i;15722:30::-;;;;;;;;;;-1:-1:-1;15722:30:0;;;;;;;;;;;17553:105;;;;;;;;;;-1:-1:-1;17553:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;17637:18:0;17619:7;17637:18;;;:9;:18;;;;;;;17553:105;15470:39;;;;;;;;;;-1:-1:-1;15470:39:0;;;;;;;;;;;13265:63;;;;;;;;;;;;;;;;31704:158;;;;;;;;;;-1:-1:-1;31704:158:0;;;;;:::i;:::-;;:::i;29009:431::-;;;;;;;;;;-1:-1:-1;29009:431:0;;;;;:::i;:::-;;:::i;18770:156::-;;;;;;;;;;-1:-1:-1;18770:156:0;;;;;:::i;:::-;;:::i;13740:34::-;;;;;;;;;;;;;;;;17469:78;;;;;;;;;;-1:-1:-1;17521:7:0;17539:5;-1:-1:-1;;;;;17539:5:0;17469:78;;;-1:-1:-1;;;;;6304:32:1;;;6286:51;;6274:2;6259:18;17469:78:0;6140:203:1;17293:84:0;;;;;;;;;;-1:-1:-1;17367:7:0;;;;;;;;;;;;-1:-1:-1;;;17367:7:0;;;;17293:84;;35724:136;;;;;;;;;;-1:-1:-1;35724:136:0;;;;;:::i;:::-;;:::i;34212:228::-;;;;;;;;;;-1:-1:-1;34212:228:0;;;;;:::i;:::-;;:::i;15627:19::-;;;;;;;;;;-1:-1:-1;15627:19:0;;;;-1:-1:-1;;;;;15627:19:0;;;18159:156;;;;;;;;;;-1:-1:-1;18159:156:0;;;;;:::i;:::-;;:::i;14078:36::-;;;;;;;;;;;;;;;;29488:105;;;;;;;;;;;;;:::i;3546:102::-;;;;;;;;;;-1:-1:-1;3546:102:0;;;;;:::i;:::-;;:::i;33560:594::-;;;;;;;;;;-1:-1:-1;33560:594:0;;;;;:::i;:::-;;:::i;15653:25::-;;;;;;;;;;;;;;;;13904:28;;;;;;;;;;;;;;;;13191:60;;;;;;;;;;;;;;;;36090:167;;;;;;;;;;-1:-1:-1;36090:167:0;;;;;:::i;:::-;;:::i;24169:391::-;;;;;;;;;;;;;:::i;17664:133::-;;;;;;;;;;-1:-1:-1;17664:133:0;;;;;:::i;:::-;-1:-1:-1;;;;;17766:19:0;;;17748:7;17766:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;17664:133;34478:180;;;;;;;;;;-1:-1:-1;34478:180:0;;;;;:::i;:::-;;:::i;31895:162::-;;;;;;;;;;-1:-1:-1;31895:162:0;;;;;:::i;:::-;;:::i;15088:41::-;;;;;;;;;;-1:-1:-1;15088:41:0;;;;;;;;;;;25870:145;;;;;;;;;;-1:-1:-1;25870:145:0;;;;;:::i;:::-;;:::i;3723:105::-;;;;;;;;;;-1:-1:-1;3723:105:0;;;;;:::i;:::-;;:::i;35392:90::-;;;;;;;;;;;;;:::i;23784:315::-;;;;;;;;;;-1:-1:-1;23784:315:0;;;;;:::i;:::-;;:::i;4295:189::-;;;;;;;;;;-1:-1:-1;4295:189:0;;;;;:::i;:::-;;:::i;34922:180::-;;;;;;;;;;;;;:::i;32094:347::-;;;;;;;;;;-1:-1:-1;32094:347:0;;;;;:::i;:::-;;:::i;32954:572::-;;;;;;;;;;-1:-1:-1;32954:572:0;;;;;:::i;:::-;;:::i;32628:128::-;;;;;;;;;;-1:-1:-1;32628:128:0;;;;;:::i;:::-;;:::i;15596:24::-;;;;;;;;;;-1:-1:-1;15596:24:0;;;;-1:-1:-1;;;;;15596:24:0;;;13939:30;;;;;;;;;;;;;;;;13664:46;;;;;;;;;;-1:-1:-1;13664:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;4061:115;;;;;;;;;;-1:-1:-1;4061:115:0;;;;;:::i;:::-;;:::i;15685:30::-;;;;;;;;;;-1:-1:-1;15685:30:0;;;;;;;;17805:216;17909:10;17880:4;17897:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;17897:32:0;;;;;;;;;;:41;;;17954:37;17880:4;;17897:32;;17954:37;;;;17932:6;13504:25:1;;13492:2;13477:18;;13358:177;17954:37:0;;;;;;;;-1:-1:-1;18009:4:0;17805:216;;;;;:::o;25728:113::-;3943:4;3978:5;-1:-1:-1;;;;;3978:5:0;3270:10;3967:16;3254:38;;;;-1:-1:-1;;;3254:38:0;;;;;;;:::i;:::-;;;;;;;;;25793:11:::1;:21:::0;;-1:-1:-1;;25793:21:0::1;::::0;::::1;;;::::0;;31652:12;31639:10;:25;25728:113;:::o;25825:8::-:1;25728:113:::0;:::o;36309:150::-;36389:4;36445:6;36413:29;36433:8;36413:19;:29::i;:::-;:38;;36309:150;-1:-1:-1;;;36309:150:0:o;34695:183::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;34793:15:::1;:25:::0;;;;34829:26:::1;:41:::0;34695:183::o;31069:342::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;31229:1:::1;31202:23;31214:11:::0;31202:9;:23:::1;:::i;:::-;:28;;:55;;;;;31246:11;31234:9;:23;31202:55;31194:64;;;::::0;::::1;;31269:26;:38:::0;;;;31318:28:::1;:42:::0;31371:23:::1;:32:::0;31069:342::o;18323:368::-;-1:-1:-1;;;;;18443:19:0;;18423:4;18443:19;;;:11;:19;;;;;;;;18463:10;18443:31;;;;;;;;-1:-1:-1;;18443:52:0;18440:186;;18545:69;;;;;;;;;;;-1:-1:-1;;;18545:69:0;;;;;;;;-1:-1:-1;;;;;18545:19:0;;-1:-1:-1;18545:19:0;;;:11;:19;;;;;18565:10;18545:31;;;;;;;;;;:69;;18581:6;;18545:35;:69::i;:::-;-1:-1:-1;;;;;18511:19:0;;;;;;:11;:19;;;;;;;;18531:10;18511:31;;;;;;;:103;18440:186;18643:40;18657:6;18665:9;18676:6;18643:13;:40::i;:::-;18636:47;;18323:368;;;;;;:::o;35537:146::-;35633:11;;:42;;-1:-1:-1;;;35633:42:0;;-1:-1:-1;;;;;6304:32:1;;;35633:42:0;;;6286:51:1;35606:7:0;;35633:11;;:29;;6259:18:1;;35633:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35906:142::-;36034:4;;-1:-1:-1;;;;;36034:4:0;35959:7;17637:18;;;:9;:18;;;;;;35986:54;;36013:4;;-1:-1:-1;;;;;36013:4:0;17619:7;17637:18;;;:9;:18;;;;;;35986:33;;:12;;;:16;:33::i;:::-;:37;;:54::i;:::-;35979:61;;35906:142;:::o;35157:183::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;35267:11:::1;::::0;:65:::1;::::0;-1:-1:-1;;;35267:65:0;;::::1;::::0;::::1;14301:25:1::0;;;14342:18;;;14335:34;;;-1:-1:-1;;;;;35267:11:0;;::::1;::::0;:35:::1;::::0;14274:18:1;;35267:65:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;35157:183:::0;;:::o;26192:165::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;26277:18:::1;:28:::0;;-1:-1:-1;;26316:33:0;26277:28;::::1;;-1:-1:-1::0;;26316:33:0;;;;;26277:28:::1;;26316:33:::0;;;::::1;::::0;;;::::1;;::::0;;26192:165::o;30577:445::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;30732:18:::1;:29:::0;;30772:14:::1;:21:::0;;;;-1:-1:-1;30804:22:0::1;:26:::0;30841:17:::1;:27:::0;;;;30879:22:::1;:32:::0;;;;30945:12:::1;30922:20;:35:::0;-1:-1:-1;;30968:46:0;;;30732:29;::::1;;-1:-1:-1::0;;30968:46:0;;;;;30732:29:::1;30968:46:::0;::::1;;::::0;;;::::1;;::::0;;30577:445::o;26406:125::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;26491:23:0;;;::::1;;::::0;;;:13:::1;:23;::::0;;;;:32;;-1:-1:-1;;26491:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;26406:125::o;21868:207::-;21912:4;21969:15;21931:35;21952:13;;21931:16;;:20;;:35;;;;:::i;:::-;:53;21928:140;;;-1:-1:-1;22007:4:0;;21868:207::o;21928:140::-;-1:-1:-1;22051:5:0;;21868:207::o;26054:83::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;26128:1:::1;26109:16;:20:::0;26054:83::o;32791:130::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32880:24:0;;;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;32880:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32791:130::o;18029:122::-;18084:4;18108:35;18116:7;-1:-1:-1;;18108:7:0;:35::i;32473:120::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32557:19:0;;;::::1;;::::0;;;:11:::1;:19;::::0;;;;:28;;-1:-1:-1;;32557:28:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32473:120::o;31704:158::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;31810:44:::1;31848:5;31810:33;31827:15;31810:12;;:16;;:33;;;;:::i;:::-;:37:::0;::::1;:44::i;:::-;31792:15;:62:::0;-1:-1:-1;31704:158:0:o;29009:431::-;29106:26;29135:19;:6;29145:8;29135:19;:::i;:::-;29106:48;-1:-1:-1;29165:19:0;29187:27;29106:48;29210:3;29187:22;:27::i;:::-;29248:4;;29165:49;;-1:-1:-1;29225:28:0;;29165:49;;-1:-1:-1;;;;;29248:4:0;29225:9;:28::i;:::-;29267:24;29264:169;;;29338:15;29307:28;:46;29397:23;;29373:48;;13504:25:1;;;29373:48:0;;13492:2:1;13477:18;29373:48:0;;;;;;;29264:169;29095:345;;29009:431;;:::o;18770:156::-;3943:4;3978:5;-1:-1:-1;;;;;3978:5:0;3270:10;3967:16;3254:38;;;;-1:-1:-1;;;3254:38:0;;;;;;;:::i;:::-;18873:43:::1;18910:5;18873:32;18890:14;18873:12;;:16;;:32;;;;:::i;:43::-;18855:15;:61:::0;-1:-1:-1;18770:156:0:o;35724:136::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;35814:6:::1;35808:3;:12;35800:21;;;::::0;::::1;;35832:14;:20:::0;35724:136::o;34212:228::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;34331:21:::1;:46:::0;;-1:-1:-1;;;;;34331:46:0;;::::1;-1:-1:-1::0;;;;;;34331:46:0;;::::1;;::::0;;;34388:20:::1;:44:::0;;;;;::::1;::::0;::::1;;::::0;;34212:228::o;18159:156::-;18239:4;18263:44;18277:10;18289:9;18300:6;18263:13;:44::i;29488:105::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;29584:1:::1;29553:28;:32:::0;29488:105::o;3546:102::-;3943:4;3978:5;-1:-1:-1;;;;;3978:5:0;3270:10;3967:16;3254:38;;;;-1:-1:-1;;;3254:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3610:23:0::1;;::::0;;;3636:4:::1;3610:23;::::0;;;;;;;:30;;-1:-1:-1;;3610:30:0::1;::::0;;::::1;::::0;;3546:102::o;33560:594::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;33765:16:::1;:36:::0;;;33812:14:::1;:32:::0;;;33855:17:::1;:38:::0;;;33904:16:::1;:36:::0;;;33951:10:::1;:24:::0;;;34001:102:::1;33964:11:::0;34001:85:::1;33923:17:::0;34001:85;33875:18;34001:85;33784:17;33829:15;34001:21:::1;:38::i;:::-;:42:::0;::::1;:62::i;:102::-;33986:12;:117:::0;34114:14:::1;:32:::0;-1:-1:-1;;;;;33560:594:0:o;36090:167::-;36158:7;36185:64;36226:22;:20;:22::i;:::-;36208:4;;-1:-1:-1;;;;;36208:4:0;17619:7;17637:18;;;:9;:18;;;;;;36185:36;;36198:22;;36218:1;;36198:15;:19;;:22::i;:::-;36185:8;;:12;:36::i;24169:391::-;24218:7;24238:21;24262:78;24324:15;24262:57;24295:23;;24262:28;;:32;;:57;;;;:::i;:78::-;24238:102;;24351:19;24373:88;24452:8;;24373:74;24418:28;;24373:40;24386:26;;24373:8;;:12;;:40;;;;:::i;:88::-;24351:110;;24479:73;24492:59;24527:23;;24492:30;24508:13;24492:11;:15;;:30;;;;:::i;:59::-;24479:8;;;:12;:73::i;:::-;24472:80;;;;24169:391;:::o;34478:180::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;34570:11:::1;:22:::0;;-1:-1:-1;;34570:22:0::1;;::::0;::::1;;;;::::0;;34619:12:::1;::::0;34644:5:::1;::::0;34619:22:::1;::::0;34634:7;;34619:22:::1;:::i;:::-;:30;;;;:::i;:::-;34603:13;:46:::0;-1:-1:-1;;34478:180:0:o;31895:162::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;32004:45:::1;32043:5;32004:34;32021:16;32004:12;;:16;;:34;;;;:::i;:45::-;31985:16;:64:::0;-1:-1:-1;31895:162:0:o;25870:145::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;25957:15:::1;25938:16;:34:::0;25983:13:::1;:24:::0;25870:145::o;3723:105::-;3943:4;3978:5;-1:-1:-1;;;;;3978:5:0;3270:10;3967:16;3254:38;;;;-1:-1:-1;;;3254:38:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3789:23:0::1;3815:5;3789:23:::0;;;:14:::1;:23;::::0;;;;:31;;-1:-1:-1;;3789:31:0::1;::::0;;3723:105::o;35392:90::-;35437:11;;:37;;-1:-1:-1;;;35437:37:0;;35463:10;35437:37;;;6286:51:1;-1:-1:-1;;;;;35437:11:0;;;;:25;;6259:18:1;;35437:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23784:315;23840:7;23890:12;23876:10;;23863;;:23;;;;:::i;:::-;:39;23860:76;;23912:14;;:21;;23931:1;23912:18;:21::i;23860:76::-;23949:7;:86;;;;;24020:15;23960:57;23993:23;;23960:28;;:32;;:57;;;;:::i;:::-;:75;23949:86;23946:120;;;24045:18;:16;:18::i;23946:120::-;-1:-1:-1;;24083:8:0;;;23784:315::o;4295:189::-;3943:4;3978:5;-1:-1:-1;;;;;3978:5:0;3270:10;3967:16;3254:38;;;;-1:-1:-1;;;3254:38:0;;;;;;;:::i;:::-;4375:5:::1;:15:::0;;-1:-1:-1;;;;;;4375:15:0::1;-1:-1:-1::0;;;;;4375:15:0;::::1;::::0;;::::1;::::0;;4401:23;;;-1:-1:-1;4401:23:0::1;::::0;;;;;;;;:30;;-1:-1:-1;;4401:30:0::1;::::0;;::::1;::::0;;;4447:29;;6286:51:1;;;4447:29:0::1;::::0;6259:18:1;4447:29:0::1;;;;;;;4295:189:::0;:::o;34922:180::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;35044:20:::1;::::0;35036:58:::1;::::0;35004:21:::1;::::0;-1:-1:-1;;;;;35044:20:0::1;::::0;35036:58;::::1;;;::::0;35004:21;;34975:26:::1;35036:58:::0;34975:26;35036:58;35004:21;35044:20;35036:58;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;34964:138;34922:180::o:0;32094:347::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32191:23:0;::::1;32209:4;32191:23;::::0;::::1;::::0;:41:::1;;-1:-1:-1::0;32228:4:0::1;::::0;-1:-1:-1;;;;;32218:14:0;;::::1;32228:4:::0;::::1;32218:14;;32191:41;32183:50;;;::::0;::::1;;-1:-1:-1::0;;;;;32244:24:0;::::1;;::::0;;;:16:::1;:24;::::0;;;;:33;;-1:-1:-1;;32244:33:0::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;;;32288:146:::1;;32313:11;::::0;:31:::1;::::0;-1:-1:-1;;;32313:31:0;;-1:-1:-1;;;;;6764:32:1;;;32313:31:0::1;::::0;::::1;6746:51:1::0;32313:11:0::1;6813:18:1::0;;;6806:34;32313:11:0;;::::1;::::0;:20:::1;::::0;6719:18:1;;32313:31:0::1;6564:282:1::0;32288:146:0::1;32375:11;::::0;-1:-1:-1;;;;;32404:17:0;;::::1;32375:11;32404:17:::0;;;:9:::1;:17;::::0;;;;;;;32375:47;;-1:-1:-1;;;32375:47:0;;::::1;::::0;::::1;6746:51:1::0;;;;6813:18;;;6806:34;32375:11:0;::::1;::::0;:20:::1;::::0;6719:18:1;;32375:47:0::1;6564:282:1::0;32954:572:0;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;33153:15:::1;:34:::0;;;33198:13:::1;:30:::0;;;33239:16:::1;:36:::0;;;33286:15:::1;:34:::0;;;33331:9:::1;:22:::0;;;33378:97:::1;33343:10:::0;33378:81:::1;33304:16:::0;33378:81;33258:17;33378:81;33171:16;33214:14;33378:20:::1;:36::i;:97::-;33364:11;:111:::0;33486:14:::1;:32:::0;-1:-1:-1;;;;;32954:572:0:o;32628:128::-;3431:24;3444:10;3431:12;:24::i;:::-;3423:48;;;;-1:-1:-1;;;3423:48:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;32716:23:0;;;::::1;;::::0;;;:15:::1;:23;::::0;;;;:32;;-1:-1:-1;;32716:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;32628:128::o;4061:115::-;-1:-1:-1;;;;;4145:23:0;4121:4;4145:23;;;:14;:23;;;;;;;;;4061:115::o;948:192::-;1034:7;1070:12;1062:6;;;;1054:29;;;;-1:-1:-1;;;1054:29:0;;;;;;;;:::i;:::-;-1:-1:-1;1094:9:0;1106:5;1110:1;1106;:5;:::i;:::-;1094:17;948:192;-1:-1:-1;;;;;948:192:0:o;18965:1825::-;19077:6;;19057:4;;19077:6;;;;;19074:63;;;19093:41;19108:6;19116:9;19127:6;19093:14;:41::i;:::-;19086:48;;;;19074:63;-1:-1:-1;;;;;19193:22:0;;;;;;:14;:22;;;;;;;;19192:23;:53;;;;-1:-1:-1;;;;;;19220:25:0;;;;;;:14;:25;;;;;;;;19219:26;19192:53;19189:130;;;19269:11;;;;19261:46;;;;-1:-1:-1;;;19261:46:0;;12517:2:1;19261:46:0;;;12499:21:1;12556:2;12536:18;;;12529:30;12595:25;12575:18;;;12568:53;12638:18;;19261:46:0;12315:347:1;19261:46:0;-1:-1:-1;;;;;19384:24:0;;;;;;:13;:24;;;;;;;;19383:25;:51;;;;-1:-1:-1;;;;;;19413:21:0;;;;;;:13;:21;;;;;;;;19412:22;19383:51;19375:86;;;;-1:-1:-1;;;19375:86:0;;12869:2:1;19375:86:0;;;12851:21:1;12908:2;12888:18;;;12881:30;-1:-1:-1;;;12927:18:1;;;12920:52;12989:18;;19375:86:0;12667:346:1;19375:86:0;19540:4;;-1:-1:-1;;;;;19527:17:0;;;19540:4;;19527:17;19591:22;19527:17;19591:14;:22::i;:::-;19655:41;19670:6;19678:9;19689:6;19655:14;:41::i;:::-;19737:35;19754:6;19762:9;19737:16;:35::i;:::-;19810:47;19823:6;19831;19839:9;19850:6;19810:12;:47::i;:::-;19911:14;19928:13;:11;:13::i;:::-;19911:30;;20004:16;:14;:16::i;:::-;20001:35;;;20023:10;:8;:10::i;:::-;20095:53;;;;;;;;;;;-1:-1:-1;;;20095:53:0;;;;;;;;-1:-1:-1;;;;;20095:17:0;;-1:-1:-1;20095:17:0;;;:9;:17;;;;;;;;:53;;20117:6;;20095:21;:53::i;:::-;-1:-1:-1;;;;;20075:17:0;;;;;;:9;:17;;;;;;;;:73;;;;23699:11;:19;;;;;;;;23698:20;20186:75;;20255:6;20186:75;;;20210:42;20218:6;20226;20234;20242:9;20210:7;:42::i;:::-;-1:-1:-1;;;;;20295:20:0;;;;;;:9;:20;;;;;;20161:100;;-1:-1:-1;20295:40:0;;20161:100;20295:24;:40::i;:::-;-1:-1:-1;;;;;20272:20:0;;;;;;;:9;:20;;;;;;;;:63;;;;20381:24;;;;;:16;:24;;;;;;;20377:119;;20426:11;;-1:-1:-1;;;;;20455:17:0;;;20426:11;20455:17;;;:9;:17;;;;;;;;20426:47;;-1:-1:-1;;;20426:47:0;;;;;6746:51:1;;;;6813:18;;;6806:34;20426:11:0;;;:20;;6719:18:1;;20426:47:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20422:63;;-1:-1:-1;;;;;20512:27:0;;;;;;:16;:27;;;;;;;;20508:129;;20560:11;;-1:-1:-1;;;;;20592:20:0;;;20560:11;20592:20;;;:9;:20;;;;;;;;20560:53;;-1:-1:-1;;;20560:53:0;;;;;6746:51:1;;;;6813:18;;;6806:34;20560:11:0;;;:20;;6719:18:1;;20560:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20556:69;;20653:11;;20673:14;;20653:35;;-1:-1:-1;;;;;;20653:35:0;;-1:-1:-1;;;;;20653:11:0;;;;:19;;:35;;;;13504:25:1;;;13492:2;13477:18;;13358:177;20653:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20649:51;20734:9;-1:-1:-1;;;;;20717:43:0;20726:6;-1:-1:-1;;;;;20717:43:0;;20745:14;20717:43;;;;13504:25:1;;13492:2;13477:18;;13358:177;20717:43:0;;;;;;;;-1:-1:-1;20778:4:0;;18965:1825;-1:-1:-1;;;;;;18965:1825:0:o;806:136::-;864:7;891:43;895:1;898;891:43;;;;;;;;;;;;;;;;;:3;:43::i;619:181::-;677:7;;709:5;713:1;709;:5;:::i;:::-;697:17;;738:1;733;:6;;725:46;;;;-1:-1:-1;;;725:46:0;;9825:2:1;725:46:0;;;9807:21:1;9864:2;9844:18;;;9837:30;9903:29;9883:18;;;9876:57;9950:18;;725:46:0;9623:351:1;1146:250:0;1204:7;1228:6;1224:47;;-1:-1:-1;1258:1:0;1251:8;;1224:47;1283:9;1295:5;1299:1;1295;:5;:::i;:::-;1283:17;-1:-1:-1;1328:1:0;1319:5;1323:1;1283:17;1319:5;:::i;:::-;:10;1311:56;;;;-1:-1:-1;;;1311:56:0;;10947:2:1;1311:56:0;;;10929:21:1;10986:2;10966:18;;;10959:30;11025:34;11005:18;;;10998:62;-1:-1:-1;;;11076:18:1;;;11069:31;11117:19;;1311:56:0;10745:397:1;1402:132:0;1460:7;1487:39;1491:1;1494;1487:39;;;;;;;;;;;;;;;;;:3;:39::i;30175:361::-;15799:6;:13;;-1:-1:-1;;15799:13:0;;;;;30275:16:::1;::::0;;15799:6;30275:16;;;;;::::1;::::0;;-1:-1:-1;;30275:16:0::1;::::0;::::1;::::0;;::::1;::::0;::::1;-1:-1:-1::0;;30312:4:0::1;::::0;30302:7;;;;-1:-1:-1;;;;;;30312:4:0::1;::::0;30302:7;;-1:-1:-1;30312:4:0::1;::::0;30302:7:::1;;;;:::i;:::-;;;;;;:14;-1:-1:-1::0;;;;;30302:14:0::1;;;-1:-1:-1::0;;;;;30302:14:0::1;;;::::0;::::1;30345:4;30327;30332:1;30327:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30327:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;30363:6:::1;::::0;:165:::1;::::0;-1:-1:-1;;;30363:165:0;;:6;::::1;::::0;:57:::1;::::0;30428:6;;30363:165:::1;::::0;:6:::1;::::0;30466:4;;30485:2;;30502:15:::1;::::0;30363:165:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;15817:6:0;:14;;-1:-1:-1;;15817:14:0;;;-1:-1:-1;;;;;;30175:361:0:o;20827:330::-;20957:53;;;;;;;;;;;-1:-1:-1;;;20957:53:0;;;;;;;;-1:-1:-1;;;;;20957:17:0;;20920:4;20957:17;;;:9;:17;;;;;;;:53;;20979:6;;20957:21;:53::i;:::-;-1:-1:-1;;;;;20937:17:0;;;;;;;:9;:17;;;;;;:73;;;;21044:20;;;;;;;:32;;21069:6;21044:24;:32::i;:::-;-1:-1:-1;;;;;21021:20:0;;;;;;;:9;:20;;;;;;;:55;;;;21092:35;;;;;;;;;;21120:6;13504:25:1;;13492:2;13477:18;;13358:177;21092:35:0;;;;;;;;-1:-1:-1;21145:4:0;20827:330;;;;;:::o;21216:606::-;21276:6;21273:542;;;21313:16;;21298:12;:31;21357:14;;21344:10;:27;21402:17;;21386:13;:33;21449:16;;21434:12;:31;21489:10;;21480:6;:19;21525:12;;21514:8;:23;25728:113;:::o;21273:542::-;21585:15;;21570:12;:30;21628:13;;21615:10;:26;21672:16;;21656:13;:32;21718:15;;21703:12;:30;21757:9;;21748:6;:18;21792:11;;21781:8;:22;21216:606;:::o;23032:531::-;-1:-1:-1;;;;;23137:22:0;;;;;;:14;:22;;;;;;;;23136:23;:45;;;;-1:-1:-1;23176:5:0;;-1:-1:-1;;;;;23163:18:0;;;23176:5;;23163:18;;23136:45;:75;;;;-1:-1:-1;;;;;;23185:26:0;;23206:4;23185:26;;23136:75;:106;;;;-1:-1:-1;23237:4:0;;-1:-1:-1;;;;;23216:26:0;;;23237:4;;23216:26;;23136:106;:127;;;;-1:-1:-1;23259:4:0;;-1:-1:-1;;;;;23246:17:0;;;23259:4;;23246:17;;23136:127;:164;;;;-1:-1:-1;23280:20:0;;-1:-1:-1;;;;;23267:33:0;;;23280:20;;23267:33;;23136:164;:202;;;;-1:-1:-1;23317:21:0;;-1:-1:-1;;;;;23304:34:0;;;23317:21;;23304:34;;23136:202;:222;;;;-1:-1:-1;23355:3:0;;-1:-1:-1;;;;;23342:16:0;;;23355:3;;23342:16;;23136:222;23132:424;;;-1:-1:-1;;;;;17637:18:0;;23374;17637;;;:9;:18;;;;;;23463:15;;23439:19;23452:6;17637:18;23439:19;:::i;:::-;23438:40;;23430:114;;;;-1:-1:-1;;;23430:114:0;;11752:2:1;23430:114:0;;;11734:21:1;11791:2;11771:18;;;11764:30;11830:34;11810:18;;;11803:62;11901:32;11881:18;;;11874:60;11951:19;;23430:114:0;11550:426:1;23132:424:0;23032:531;;;:::o;22622:378::-;22717:4;;-1:-1:-1;;;;;22707:14:0;;;22717:4;;22707:14;:49;;;;-1:-1:-1;22738:18:0;;;;22707:49;:94;;;;-1:-1:-1;;;;;;22774:27:0;;;;;;:16;:27;;;;;;;;22773:28;22707:94;22703:290;;;-1:-1:-1;;;;;22826:24:0;;;;;;:13;:24;;;;;;22853:15;-1:-1:-1;22818:82:0;;;;-1:-1:-1;;;22818:82:0;;10590:2:1;22818:82:0;;;10572:21:1;10629:2;10609:18;;;10602:30;10668;10648:18;;;10641:58;10716:18;;22818:82:0;10388:352:1;22818:82:0;22960:21;;22942:39;;22960:21;;;;;22942:15;:39;:::i;:::-;-1:-1:-1;;;;;22915:24:0;;;;;;:13;:24;;;;;:66;22622:378;;:::o;22109:478::-;22237:5;;-1:-1:-1;;;;;22224:18:0;;;22237:5;;22224:18;22220:360;;22261:6;22258:311;;;22305:16;;22295:6;:26;;:53;;;-1:-1:-1;;;;;;22325:23:0;;;;;;:15;:23;;;;;;;;22295:53;:83;;;-1:-1:-1;;;;;;22352:26:0;;;;;;:15;:26;;;;;;;;22295:83;22287:113;;;;-1:-1:-1;;;22287:113:0;;9479:2:1;22287:113:0;;;9461:21:1;9518:2;9498:18;;;9491:30;-1:-1:-1;;;9537:18:1;;;9530:47;9594:18;;22287:113:0;9277:341:1;22287:113:0;22258:311;;;22459:15;;22449:6;:25;;:52;;;-1:-1:-1;;;;;;22478:23:0;;;;;;:15;:23;;;;;;;;22449:52;:82;;;-1:-1:-1;;;;;;22505:26:0;;;;;;:15;:26;;;;;;;;22449:82;22441:112;;;;-1:-1:-1;;;22441:112:0;;9479:2:1;22441:112:0;;;9461:21:1;9518:2;9498:18;;;9491:30;-1:-1:-1;;;9537:18:1;;;9530:47;9594:18;;22441:112:0;9277:341:1;25500:197:0;25587:4;;25549;;-1:-1:-1;;;;;25587:4:0;25573:10;:18;;;;:38;;-1:-1:-1;25605:6:0;;;;;;;25604:7;25573:38;:62;;;;-1:-1:-1;25624:11:0;;;;;;;25573:62;:116;;;;-1:-1:-1;;25676:13:0;;25666:4;25648:24;;;;:9;:24;;;;;;:41;;;25500:197::o;26585:2037::-;15799:6;:13;;-1:-1:-1;;15799:13:0;;;;;26680:15:::1;::::0;26697:26:::1;::::0;15799:13;;26664:60:::1;::::0;:15:::1;:60::i;:::-;:79;;26731:12;;26664:79;;;26727:1;26664:79;26634:109;;26754:23;26780:59;26837:1;26780:52;26823:8;;26780:38;26798:19;26780:13;;:17;;:38;;;;:::i;:59::-;26754:85;;26850:20;26873:34;26891:15;26873:13;;:17;;:34;;;;:::i;:::-;26944:16;::::0;;26958:1:::1;26944:16:::0;;;;;::::1;::::0;;26850:57;;-1:-1:-1;26920:21:0::1;::::0;26944:16;;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;;::::0;-1:-1:-1;26944:16:0::1;26920:40;;26989:4;26971;26976:1;26971:7;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;26971:23:0;;::::1;:7;::::0;;::::1;::::0;;;;;:23;27015:4:::1;::::0;27005:7;;27015:4;::::1;::::0;27005;;27015;;27005:7;::::1;;;;;:::i;:::-;-1:-1:-1::0;;;;;27005:14:0;;::::1;:7;::::0;;::::1;::::0;;;;;:14;27090:6:::1;::::0;:188:::1;::::0;-1:-1:-1;;;27090:188:0;;27056:21:::1;::::0;27090:6;;;::::1;::::0;:57:::1;::::0;:188:::1;::::0;27162:12;;27032:21:::1;::::0;27205:4;;27232::::1;::::0;27252:15:::1;::::0;27090:188:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;27289:17;27309:40;27335:13;27309:21;:25;;:40;;;;:::i;:::-;27289:60:::0;-1:-1:-1;27360:19:0::1;27382:40;27395:26;:19:::0;27419:1:::1;27395:23;:26::i;:::-;27382:8;::::0;;:12:::1;:40::i;:::-;27360:62:::0;-1:-1:-1;27433:26:0::1;27462:58;27518:1;27462:51;27360:62:::0;27462:51;:9;27476:19;27462:13:::1;:34::i;:58::-;27433:87;;27531:27;27561:45;27594:11;27561:28;27575:13;;27561:9;:13;;:28;;;;:::i;:45::-;27531:75;;27617:26;27646:44;27678:11;27646:27;27660:12;;27646:9;:13;;:27;;;;:::i;:44::-;27617:73;;27701:20;27724:38;27750:11;27724:21;27738:6;;27724:9;:13;;:21;;;;:::i;:38::-;27701:61;;27782:11;;;;;;;;;-1:-1:-1::0;;;;;27782:11:0::1;-1:-1:-1::0;;;;;27782:19:0::1;;27809;27782:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;-1:-1:-1::0;27912:20:0::1;::::0;27904:77:::1;::::0;27854:21:::1;::::0;-1:-1:-1;;;;;27912:20:0::1;::::0;27971:5:::1;::::0;27946:18;;27854:21;27904:77;27854:21;27904:77;27946:18;27912:20;27971:5;27904:77:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;28045:3:0::1;::::0;28037:54:::1;::::0;27853:128;;-1:-1:-1;27993:15:0::1;::::0;-1:-1:-1;;;;;28045:3:0;;::::1;::::0;28081:5:::1;::::0;28062:12;;27993:15;28037:54;27993:15;28037:54;28062:12;28045:3;28081:5;28037:54:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27992:99;;;28111:16;28103:69;;;::::0;-1:-1:-1;;;28103:69:0;;10181:2:1;28103:69:0::1;::::0;::::1;10163:21:1::0;10220:2;10200:18;;;10193:30;10259:34;10239:18;;;10232:62;-1:-1:-1;;;10310:18:1;;;10303:38;10358:19;;28103:69:0::1;9979:404:1::0;28103:69:0::1;28191:10;28183:57;;;::::0;-1:-1:-1;;;28183:57:0;;11349:2:1;28183:57:0::1;::::0;::::1;11331:21:1::0;11388:2;11368:18;;;11361:30;11427:34;11407:18;;;11400:62;-1:-1:-1;;;11478:18:1;;;11471:32;11520:19;;28183:57:0::1;11147:398:1::0;28183:57:0::1;28256:19:::0;;28253:362:::1;;28291:6;::::0;28465:21:::1;::::0;28291:244:::1;::::0;-1:-1:-1;;;28291:244:0;;28367:4:::1;28291:244;::::0;::::1;7471:34:1::0;7521:18;;;7514:34;;;28291:6:0::1;7564:18:1::0;;;7557:34;;;7607:18;;;7600:34;-1:-1:-1;;;;;28465:21:0;;::::1;7650:19:1::0;;;7643:44;28505:15:0::1;7703:19:1::0;;;7696:35;28291:6:0;::::1;::::0;:22:::1;::::0;28321:18;;7405:19:1;;28291:244:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;28555:48:0::1;::::0;;14301:25:1;;;14357:2;14342:18;;14335:34;;;28555:48:0::1;::::0;-1:-1:-1;14274:18:1;28555:48:0::1;;;;;;;28253:362;-1:-1:-1::0;;15817:6:0;:14;;-1:-1:-1;;15817:14:0;;;-1:-1:-1;;;;;;;;;;;26585:2037:0:o;24619:834::-;24715:7;24735:17;24812:9;24808:460;;;24840:6;24837:335;;;24943:54;24982:14;;24943:34;24975:1;24943:27;24968:1;24943:20;24954:8;;24943:6;:10;;:20;;;;:::i;:54::-;24931:66;;24808:460;;24837:335;25109:47;25141:14;;25109:27;25134:1;25109:20;25120:8;;25109:6;:10;;:20;;;;:::i;24808:460::-;25216:40;25241:14;;25216:20;25227:8;;25216:6;:10;;:20;;;;:::i;:40::-;25204:52;;24808:460;25325:4;25307:24;;;;:9;:24;;;;;;:39;;25336:9;25307:28;:39::i;:::-;25298:4;25280:24;;;;:9;:24;;;;;;;:66;;;;25362:42;;-1:-1:-1;;;;;25362:42:0;;;;;;;25394:9;13504:25:1;;13492:2;13477:18;;13358:177;25362:42:0;;;;;;;;25424:21;:6;25435:9;25424:10;:21::i;:::-;25417:28;24619:834;-1:-1:-1;;;;;;24619:834:0:o;1540:345::-;1626:7;1728:12;1721:5;1713:28;;;;-1:-1:-1;;;1713:28:0;;;;;;;;:::i;:::-;-1:-1:-1;1752:9:0;1764:5;1768:1;1764;:5;:::i;14:160:1:-;79:20;;135:13;;128:21;118:32;;108:60;;164:1;161;154:12;108:60;14:160;;;:::o;179:247::-;238:6;291:2;279:9;270:7;266:23;262:32;259:52;;;307:1;304;297:12;259:52;346:9;333:23;365:31;390:5;365:31;:::i;691:388::-;759:6;767;820:2;808:9;799:7;795:23;791:32;788:52;;;836:1;833;826:12;788:52;875:9;862:23;894:31;919:5;894:31;:::i;:::-;944:5;-1:-1:-1;1001:2:1;986:18;;973:32;1014:33;973:32;1014:33;:::i;:::-;1066:7;1056:17;;;691:388;;;;;:::o;1084:456::-;1161:6;1169;1177;1230:2;1218:9;1209:7;1205:23;1201:32;1198:52;;;1246:1;1243;1236:12;1198:52;1285:9;1272:23;1304:31;1329:5;1304:31;:::i;:::-;1354:5;-1:-1:-1;1411:2:1;1396:18;;1383:32;1424:33;1383:32;1424:33;:::i;:::-;1084:456;;1476:7;;-1:-1:-1;;;1530:2:1;1515:18;;;;1502:32;;1084:456::o;1545:315::-;1610:6;1618;1671:2;1659:9;1650:7;1646:23;1642:32;1639:52;;;1687:1;1684;1677:12;1639:52;1726:9;1713:23;1745:31;1770:5;1745:31;:::i;:::-;1795:5;-1:-1:-1;1819:35:1;1850:2;1835:18;;1819:35;:::i;:::-;1809:45;;1545:315;;;;;:::o;1865:::-;1933:6;1941;1994:2;1982:9;1973:7;1969:23;1965:32;1962:52;;;2010:1;2007;2000:12;1962:52;2049:9;2036:23;2068:31;2093:5;2068:31;:::i;:::-;2118:5;2170:2;2155:18;;;;2142:32;;-1:-1:-1;;;1865:315:1:o;2185:180::-;2241:6;2294:2;2282:9;2273:7;2269:23;2265:32;2262:52;;;2310:1;2307;2300:12;2262:52;2333:26;2349:9;2333:26;:::i;2370:248::-;2435:6;2443;2496:2;2484:9;2475:7;2471:23;2467:32;2464:52;;;2512:1;2509;2502:12;2464:52;2535:26;2551:9;2535:26;:::i;2623:454::-;2712:6;2720;2728;2736;2744;2797:3;2785:9;2776:7;2772:23;2768:33;2765:53;;;2814:1;2811;2804:12;2765:53;2837:26;2853:9;2837:26;:::i;:::-;2827:36;;2910:2;2899:9;2895:18;2882:32;2872:42;;2961:2;2950:9;2946:18;2933:32;2923:42;;3012:2;3001:9;2997:18;2984:32;2974:42;;3035:36;3066:3;3055:9;3051:19;3035:36;:::i;:::-;3025:46;;2623:454;;;;;;;;:::o;3082:337::-;3145:6;3153;3206:2;3194:9;3185:7;3181:23;3177:32;3174:52;;;3222:1;3219;3212:12;3174:52;3245:26;3261:9;3245:26;:::i;:::-;3235:36;;3321:2;3310:9;3306:18;3293:32;3365:4;3358:5;3354:16;3347:5;3344:27;3334:55;;3385:1;3382;3375:12;3424:180;3483:6;3536:2;3524:9;3515:7;3511:23;3507:32;3504:52;;;3552:1;3549;3542:12;3504:52;-1:-1:-1;3575:23:1;;3424:180;-1:-1:-1;3424:180:1:o;3609:184::-;3679:6;3732:2;3720:9;3711:7;3707:23;3703:32;3700:52;;;3748:1;3745;3738:12;3700:52;-1:-1:-1;3771:16:1;;3609:184;-1:-1:-1;3609:184:1:o;3798:248::-;3863:6;3871;3924:2;3912:9;3903:7;3899:23;3895:32;3892:52;;;3940:1;3937;3930:12;3892:52;3976:9;3963:23;3953:33;;4005:35;4036:2;4025:9;4021:18;4005:35;:::i;4051:248::-;4119:6;4127;4180:2;4168:9;4159:7;4155:23;4151:32;4148:52;;;4196:1;4193;4186:12;4148:52;-1:-1:-1;;4219:23:1;;;4289:2;4274:18;;;4261:32;;-1:-1:-1;4051:248:1:o;4304:316::-;4381:6;4389;4397;4450:2;4438:9;4429:7;4425:23;4421:32;4418:52;;;4466:1;4463;4456:12;4418:52;-1:-1:-1;;4489:23:1;;;4559:2;4544:18;;4531:32;;-1:-1:-1;4610:2:1;4595:18;;;4582:32;;4304:316;-1:-1:-1;4304:316:1:o;4625:306::-;4713:6;4721;4729;4782:2;4770:9;4761:7;4757:23;4753:32;4750:52;;;4798:1;4795;4788:12;4750:52;4827:9;4821:16;4811:26;;4877:2;4866:9;4862:18;4856:25;4846:35;;4921:2;4910:9;4906:18;4900:25;4890:35;;4625:306;;;;;:::o;4936:523::-;5040:6;5048;5056;5064;5072;5080;5133:3;5121:9;5112:7;5108:23;5104:33;5101:53;;;5150:1;5147;5140:12;5101:53;-1:-1:-1;;5173:23:1;;;5243:2;5228:18;;5215:32;;-1:-1:-1;5294:2:1;5279:18;;5266:32;;5345:2;5330:18;;5317:32;;-1:-1:-1;5396:3:1;5381:19;;5368:33;;-1:-1:-1;5448:3:1;5433:19;5420:33;;-1:-1:-1;4936:523:1;-1:-1:-1;4936:523:1:o;5464:461::-;5517:3;5555:5;5549:12;5582:6;5577:3;5570:19;5608:4;5637:2;5632:3;5628:12;5621:19;;5674:2;5667:5;5663:14;5695:1;5705:195;5719:6;5716:1;5713:13;5705:195;;;5784:13;;-1:-1:-1;;;;;5780:39:1;5768:52;;5840:12;;;;5875:15;;;;5816:1;5734:9;5705:195;;;-1:-1:-1;5916:3:1;;5464:461;-1:-1:-1;;;;;5464:461:1:o;8160:510::-;8431:6;8420:9;8413:25;8474:3;8469:2;8458:9;8454:18;8447:31;8394:4;8495:57;8547:3;8536:9;8532:19;8524:6;8495:57;:::i;:::-;-1:-1:-1;;;;;8588:32:1;;;;8583:2;8568:18;;8561:60;-1:-1:-1;8652:2:1;8637:18;8630:34;8487:65;8160:510;-1:-1:-1;;8160:510:1:o;8675:597::-;8787:4;8816:2;8845;8834:9;8827:21;8877:6;8871:13;8920:6;8915:2;8904:9;8900:18;8893:34;8945:1;8955:140;8969:6;8966:1;8963:13;8955:140;;;9064:14;;;9060:23;;9054:30;9030:17;;;9049:2;9026:26;9019:66;8984:10;;8955:140;;;9113:6;9110:1;9107:13;9104:91;;;9183:1;9178:2;9169:6;9158:9;9154:22;9150:31;9143:42;9104:91;-1:-1:-1;9256:2:1;9235:15;-1:-1:-1;;9231:29:1;9216:45;;;;9263:2;9212:54;;8675:597;-1:-1:-1;;;8675:597:1:o;11981:329::-;12183:2;12165:21;;;12222:1;12202:18;;;12195:29;-1:-1:-1;;;12255:2:1;12240:18;;12233:36;12301:2;12286:18;;11981:329::o;13018:335::-;13220:2;13202:21;;;13259:2;13239:18;;;13232:30;-1:-1:-1;;;13293:2:1;13278:18;;13271:41;13344:2;13329:18;;13018:335::o;13540:582::-;13839:6;13828:9;13821:25;13882:6;13877:2;13866:9;13862:18;13855:34;13925:3;13920:2;13909:9;13905:18;13898:31;13802:4;13946:57;13998:3;13987:9;13983:19;13975:6;13946:57;:::i;:::-;-1:-1:-1;;;;;14039:32:1;;;;14034:2;14019:18;;14012:60;-1:-1:-1;14103:3:1;14088:19;14081:35;13938:65;13540:582;-1:-1:-1;;;13540:582:1:o;14569:128::-;14609:3;14640:1;14636:6;14633:1;14630:13;14627:39;;;14646:18;;:::i;:::-;-1:-1:-1;14682:9:1;;14569:128::o;14702:217::-;14742:1;14768;14758:132;;14812:10;14807:3;14803:20;14800:1;14793:31;14847:4;14844:1;14837:15;14875:4;14872:1;14865:15;14758:132;-1:-1:-1;14904:9:1;;14702:217::o;14924:168::-;14964:7;15030:1;15026;15022:6;15018:14;15015:1;15012:21;15007:1;15000:9;14993:17;14989:45;14986:71;;;15037:18;;:::i;:::-;-1:-1:-1;15077:9:1;;14924:168::o;15097:125::-;15137:4;15165:1;15162;15159:8;15156:34;;;15170:18;;:::i;:::-;-1:-1:-1;15207:9:1;;15097:125::o;15227:127::-;15288:10;15283:3;15279:20;15276:1;15269:31;15319:4;15316:1;15309:15;15343:4;15340:1;15333:15;15359:127;15420:10;15415:3;15411:20;15408:1;15401:31;15451:4;15448:1;15441:15;15475:4;15472:1;15465:15;15623:131;-1:-1:-1;;;;;15698:31:1;;15688:42;;15678:70;;15744:1;15741;15734:12

Swarm Source

ipfs://ee9758b529db9416879e3b674955e4ce3d167227966d0dc42e50008a882503cb

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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