false
true
0

Contract Address Details

0x037645963Aece8C5Beb947dA5621362c9f7dB5a6

Token
Mintables (🌨️)
Creator
0xf44b45–d5acca at 0x1611e3–552ef2
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
51 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26309721
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been verified via Sourcify. View contract in Sourcify repository
Contract name:
BRR




Optimization enabled
true
Compiler version
v0.8.22+commit.4fc1097e




Optimization runs
200
EVM Version
shanghai




Verified at
2026-02-14T21:15:40.514395Z

contracts/pls.sol

// SPDX-License-Identifier: MIT
pragma solidity 0.8.22;

/*──────────────────────── SafeMath ───────────────────────*/
library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "add ovf");
        return c;
    }
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "sub ovf");
    }
    function sub(uint256 a, uint256 b, string memory e) internal pure returns (uint256) {
        require(b <= a, e);
        return a - b;
    }
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        if (a == 0) return 0;
        uint256 c = a * b;
        require(c / a == b, "mul ovf");
        return c;
    }
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0, "div 0");
        return a / b;
    }
}

/*──────────────────────── IERC20 ─────────────────────────*/
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) external view returns (uint256);
    function transfer(address, uint256) external returns (bool);
    function allowance(address, address) external view returns (uint256);
    function approve(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns (bool);

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

/*────────────────────────  Auth  ─────────────────────────*/
abstract contract Auth {
    address internal owner;
    mapping(address => bool) internal authorizations;

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

    modifier onlyOwner()     { require(msg.sender == owner, "!OWNER"); _; }
    modifier authorized()    { require(authorizations[msg.sender], "!AUTHORIZED"); _; }

    function transferOwnership(address newO) external onlyOwner {
        owner = newO;
        authorizations[newO] = true;
        emit OwnershipTransferred(newO);
    }
    event OwnershipTransferred(address newOwner);
}

/*────────────────────── Reentrancy ───────────────────────*/
abstract contract ReentrancyGuard {
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED     = 2;
    uint256 private _status;

    constructor() { _status = _NOT_ENTERED; }

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

/*──────────────── Factory / Router ───────────────────────*/
interface IDEXFactory { function createPair(address, address) external returns (address); }

interface IDEXRouter {
    function factory() external pure returns (address);
    function WPLS()   external pure returns (address);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        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 addLiquidityETH(
        address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin,
        address to, uint deadline
    ) external payable returns (uint amountToken, uint amountETH, uint liquidity);
}

/*──────────── Interfaces: distributors & burn ────────────*/
interface IDividendDistributor {
    function setDistributionCriteria(uint256, uint256) external;
    function setShare(address, uint256) external;
    function deposit() external payable;
    function process(uint256) external;
}
interface IMarketingDistributor { function setBuyThreshold(uint256) external; }
interface IMarketingDistributorEx is IMarketingDistributor { function getBuyThreshold() external view returns (uint256); }
interface IMarketingDistributorRouter is IMarketingDistributor { function setRouter(address) external; }
interface IBRR { function burn(uint256) external; }

/*───────────── MarketingDistributor (buy&burn) ───────────*/
contract MarketingDistributor is IDividendDistributor, Auth, ReentrancyGuard {
    using SafeMath for uint256;

    IDEXRouter public router;
    address    public WPLS;
    address    public tokenToBuy;

    uint256 public buyThreshold;

    event RouterUpdated(address indexed oldRouter, address indexed newRouter, address newWPLS);
    event TokenToBuyUpdated(address indexed oldToken, address indexed newToken);
    event BuyThresholdUpdated(uint256 oldThreshold, uint256 newThreshold);

    constructor(
        address _owner,
        address _router,
        address _wpls,
        uint256 _threshold
    ) Auth(_owner) {
        router       = IDEXRouter(_router);
        WPLS         = _wpls;
        buyThreshold = _threshold;
        tokenToBuy   = address(0);
    }

    function setRouter(address _router) external authorized {
        require(_router != address(0), "zero router");
        address oldR = address(router);
        router = IDEXRouter(_router);
        WPLS   = router.WPLS();
        emit RouterUpdated(oldR, _router, WPLS);
    }

    function setBuyThreshold(uint256 _newThreshold) external authorized {
        emit BuyThresholdUpdated(buyThreshold, _newThreshold);
        buyThreshold = _newThreshold;
    }

    function setTokenToBuy(address _newToken) external authorized {
        require(_newToken != address(0), "zero address");
        emit TokenToBuyUpdated(tokenToBuy, _newToken);
        tokenToBuy = _newToken;
    }

    function setDistributionCriteria(uint256, uint256) external pure override {}
    function setShare(address, uint256)                 external pure override {}
    function process(uint256)                           external pure override {}

    function deposit() external payable override nonReentrant {
        uint256 bal = address(this).balance;
        if (bal >= buyThreshold && buyThreshold > 0 && tokenToBuy != address(0)) {
            _buyAndBurn(bal);
        }
    }

    function _buyAndBurn(uint256 amt) internal {
        if (amt == 0) return;

        address[] memory path = new address[](2);
        path[0] = WPLS;
        path[1] = tokenToBuy;

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

        uint256 bought = IERC20(tokenToBuy).balanceOf(address(this));
        if (bought > 0) {
            IBRR(tokenToBuy).burn(bought);
        }
    }

    receive() external payable {}
}

/*──────────── DividendDistributor (rewards) ─────────────*/
contract DividendDistributor is IDividendDistributor, ReentrancyGuard {
    using SafeMath for uint256;

    address        _token;
    IDEXRouter     public router;
    IERC20         public RWRD;
    address        public WPLS;

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

    mapping(address => Share) shares;
    address[] shareholders;
    mapping(address => uint) shareholderIndexes;
    mapping(address => uint) shareholderClaims;

    uint256 public totalShares;
    uint256 public totalDividends;
    uint256 public totalDistributed;
    uint256 public dividendsPerShare;
    uint256 public constant accFactor = 1e36;

    uint256 public minPeriod = 60;
    uint256 public minDistribution = 1e5;
    uint256 public currentIndex;

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

    constructor(address _r, address _wpls, address _rwrd) {
        _token = msg.sender;
        router = IDEXRouter(_r);
        WPLS   = _wpls;
        RWRD   = IERC20(_rwrd);
    }

    function setDistributionCriteria(uint256 p, uint256 d) external override onlyToken {
        minPeriod = p; minDistribution = d;
    }

    function setShare(address sh, uint256 amt) external override onlyToken {
        if (shares[sh].amount > 0) _distribute(sh);
        if (amt > 0 && shares[sh].amount == 0)      _addHolder(sh);
        else if (amt == 0 && shares[sh].amount > 0) _removeHolder(sh);

        totalShares = totalShares.sub(shares[sh].amount).add(amt);
        shares[sh].amount = amt;
        shares[sh].totalExcluded = _cumulative(amt);
    }

    function deposit() external payable override onlyToken nonReentrant {
        if (address(RWRD) != WPLS) {
            uint256 before = RWRD.balanceOf(address(this));
            address[] memory path = new address[](2);
            path[0] = WPLS;
            path[1] = address(RWRD);
            router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: msg.value }(
                0, path, address(this), block.timestamp
            );
            _record(RWRD.balanceOf(address(this)).sub(before));
        } else {
            _record(msg.value);
        }
    }

    function _record(uint256 amt) internal {
        totalDividends = totalDividends.add(amt);
        if (totalShares > 0) {
            dividendsPerShare = dividendsPerShare.add(accFactor.mul(amt).div(totalShares));
        }
    }

    function process(uint256 gas) external override onlyToken {
        uint256 len = shareholders.length;
        if (len == 0) return;

        uint256 gasUsed;
        uint256 gasLeft = gasleft();

        while (gasUsed < gas && currentIndex < len) {
            address sh = shareholders[currentIndex];
            if (_shouldDistribute(sh)) _distribute(sh);

            uint256 newGasLeft = gasleft();
            gasUsed = gasUsed.add(gasLeft.sub(newGasLeft));
            gasLeft = newGasLeft;

            currentIndex++;
            if (currentIndex >= len) currentIndex = 0;
        }
    }

    function _shouldDistribute(address sh) internal view returns (bool) {
        return shareholderClaims[sh] + minPeriod < block.timestamp && _unpaid(sh) > minDistribution;
    }

    function _distribute(address sh) internal {
        uint256 amt = _unpaid(sh);
        if (amt == 0) return;

        totalDistributed = totalDistributed.add(amt);
        shareholderClaims[sh] = block.timestamp;

        if (address(RWRD) != WPLS) {
            RWRD.transfer(sh, amt);
        } else {
            (bool ok, ) = payable(sh).call{ value: amt }("");
            if (!ok) return;
        }

        shares[sh].totalRealised = shares[sh].totalRealised.add(amt);
        shares[sh].totalExcluded = _cumulative(shares[sh].amount);
    }

    function _unpaid(address sh) internal view returns (uint256) {
        uint256 cum = _cumulative(shares[sh].amount);
        if (cum <= shares[sh].totalExcluded) return 0;
        return cum.sub(shares[sh].totalExcluded);
    }

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

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

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

/*──────── FlexibleRewardDistributor (burn leftovers) ─────*/
contract FlexibleRewardDistributor is DividendDistributor {
    using SafeMath for uint256;

    address public manager;
    address private constant DEAD = 0x000000000000000000000000000000000000dEaD;

    event RewardTokenChanged(address indexed oldToken, address indexed newToken, uint256 burned);

    constructor(address manager_, address router_, address wpls_, address initReward_)
        DividendDistributor(router_, wpls_, initReward_)
    { manager = manager_; }

    function changeRewardToken(address newReward) external nonReentrant {
        require(msg.sender == manager, "FRD: not manager");
        address old = address(RWRD);
        require(newReward != old, "FRD: same token");

        uint256 leftover = 0;
        if (old != address(0)) {
            leftover = IERC20(old).balanceOf(address(this));
            if (leftover > 0) { IERC20(old).transfer(DEAD, leftover); }
        }
        emit RewardTokenChanged(old, newReward, leftover);
        RWRD = IERC20(newReward);
    }
}

/*────────────────────────    BRR    ──────────────────────*/
contract BRR is IERC20, Auth {
    using SafeMath for uint256;

    /* fee configuration (parts per feeDenominator) */
    uint256 public marketingFee;
    uint256 public extraRewardFee;
    uint256 public reflectionFee;
    uint256 public liquidityFee;
    uint256 public directBurnFee;
    uint256 public totalFee;
    uint256 public feeDenominator;

    /* Instant PLS (separate from totalFee; bypasses cap) */
    uint256 public instantPLSFee;
    address public instantPLSRecipient;
    event InstantPLSSettingsUpdated(uint256 fee, address recipient);

    /* token data */
    address public constant ZERO = address(0);
    address public constant DEAD = 0x000000000000000000000000000000000000dEaD;

    string  private _name;
    string  private _symbol;
    uint8   private constant _decimals = 18;
    uint256 private _totalSupply;
    uint256 public  _maxTxAmount;

    mapping(address => uint256)                     private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;

    mapping(address => bool) public isFeeExempt;
    mapping(address => bool) public isTxLimitExempt;
    mapping(address => bool) public isDividendExempt;
    mapping(address => bool) public isSellAmountExempt;

    /* AMM pairs */
    mapping(address => bool) public isAMMPair;
    event AMMPairUpdated(address pair, bool value);

    /* routers & swapping */
    IDEXRouter public router;
    address    public pair;   // default WPLS/BRR pair
    address    public WPLS;
    uint256    public swapThreshold;
    uint256    public sellTokenToSwap;
    bool       public swapEnabled = true;
    uint256    public distributorGas = 500_000;

    bool private inSwap;
    modifier swapping() { inSwap = true; _; inSwap = false; }

    /* hop tokens for swapBack and instant‑PLS avoidance */
    address public hop1Token = 0xA1077a294dDE1B09bB078844df40758a5D0f9a27;
    address public hop2Token = 0xefD766cCb38EaF1dfd701853BFCe31359239F305;
    address public hop3Token = 0x2fa878Ab3F87CC1C9737Fc071108F904c0B0C95d;
    event HopTokensUpdated(address h1, address h2, address h3);

    /* distributors */
    MarketingDistributor       public marketingDistributor;
    DividendDistributor        public reflectionDistributor;
    FlexibleRewardDistributor  public extraRewardDistributor;

    /* ---------- constructor ---------- */
    constructor(
        address rwrdToken,
        address routerAddr,
        string  memory n,
        string  memory s,
        address ownerAddr,
        uint256 reflectionF,
        uint256 liquidityF,
        uint256 marketingF,
        uint256 extraRewardF,
        uint256 directBurnF,
        uint256 instantPLSF,
        address instantPLSRecipient_
    )
        Auth(ownerAddr)
    {
        _name   = n;
        _symbol = s;

        reflectionFee   = reflectionF;
        liquidityFee    = liquidityF;
        marketingFee    = marketingF;
        extraRewardFee  = extraRewardF;
        directBurnFee   = directBurnF;

        feeDenominator = 100_000;
        totalFee = reflectionF + liquidityF + marketingF + extraRewardF + directBurnF;
        require(totalFee <= feeDenominator * 30 / 100, "fee > 30%");

        instantPLSFee = instantPLSF;
        require(instantPLSRecipient_ != address(0), "instant recipient zero");
        instantPLSRecipient = instantPLSRecipient_;

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

        /* distributors */
        marketingDistributor   = new MarketingDistributor(ownerAddr, routerAddr, WPLS, 1 ether);
        reflectionDistributor  = new DividendDistributor(routerAddr, WPLS, rwrdToken);
        extraRewardDistributor = new FlexibleRewardDistributor(ownerAddr, routerAddr, WPLS, rwrdToken);

        /* mint initial supply */
        uint256 mint = 1000000 * 10 ** _decimals;
        _totalSupply = mint;
        _maxTxAmount = mint;
        _balances[ownerAddr] = mint;
        emit Transfer(address(0), ownerAddr, mint);

        /* exemptions */
        isFeeExempt[ownerAddr]     = true;
        isTxLimitExempt[ownerAddr] = true;

        isDividendExempt[address(this)]                   = true;
        isDividendExempt[pair]                            = true;
        isDividendExempt[DEAD]                            = true;
        isDividendExempt[address(marketingDistributor)]   = true;
        isDividendExempt[address(extraRewardDistributor)] = true;

        /* AMM pair registry */
        isAMMPair[pair] = true;
        emit AMMPairUpdated(pair, true);

        swapThreshold   = 1 * 10 ** (_decimals - 5);
        sellTokenToSwap = 1 * 10 ** (_decimals - 16);
    }

    receive() external payable {}

    /* ---------- ERC20 views ---------- */
    function name()      external view override returns (string memory) { return _name; }
    function symbol()    external view override returns (string memory) { return _symbol; }
    function decimals()  external pure override returns (uint8)         { return _decimals; }
    function totalSupply() external view override returns (uint256)     { return _totalSupply; }
    function getOwner()   external view override returns (address)      { return owner; }
    function balanceOf(address a) public view override returns (uint256){ return _balances[a]; }
    function allowance(address o, address s) external view override returns (uint256) {
        return _allowances[o][s];
    }
    function dividendExempt(address a) external view returns (bool) { return isDividendExempt[a]; }

    /* ---------- ERC20 actions ---------- */
    function approve(address s, uint256 a) public override returns (bool) {
        _allowances[msg.sender][s] = a;
        emit Approval(msg.sender, s, a);
        return true;
    }
    function approveMax(address s) external returns (bool) {
        return approve(s, type(uint256).max);
    }
    function transfer(address r, uint256 a) external override returns (bool) {
        return _transferFrom(msg.sender, r, a);
    }
    function transferFrom(address se, address re, uint256 a) external override returns (bool) {
        if (_allowances[se][msg.sender] != type(uint256).max) {
            _allowances[se][msg.sender] = _allowances[se][msg.sender].sub(a, "allow");
        }
        return _transferFrom(se, re, a);
    }

    /* ---------- core transfer ---------- */
    function _transferFrom(address se, address re, uint256 amt) internal returns (bool) {
        if (inSwap) return _basicTransfer(se, re, amt);

        _checkTxLimit(se, amt);

        bool sellToAnyPair = (isAMMPair[re] && se != address(this) && !isAMMPair[se] && se != address(router));
        bool thresholdMet  = (amt >= sellTokenToSwap) || isSellAmountExempt[se];

        if ( sellToAnyPair && swapEnabled && _balances[address(this)] >= swapThreshold && thresholdMet ) {
            _swapBack();
        }

        _balances[se] = _balances[se].sub(amt, "bal");
        uint256 received = _shouldTakeFee(se) ? _takeFee(se, amt) : amt;
        _balances[re] = _balances[re].add(received);

        _syncDistributor(se);
        _syncDistributor(re);

        _processDistributors();
        emit Transfer(se, re, received);
        return true;
    }

    function _basicTransfer(address se, address re, uint256 amt) internal returns (bool) {
        _balances[se] = _balances[se].sub(amt, "bal");
        _balances[re] = _balances[re].add(amt);
        emit Transfer(se, re, amt);
        return true;
    }

    function _checkTxLimit(address se, uint256 amt) internal view {
        require(amt <= _maxTxAmount || isTxLimitExempt[se], "TX limit");
    }
    function _shouldTakeFee(address se) internal view returns (bool) { return !isFeeExempt[se]; }

    /**
     * Takes:
     *  - totalFee portion into the contract (used by swapBack + burn)
     *  - instantPLSFee portion: swaps BRR→WPLS immediately and sends WPLS to the recipient.
     *    On buys from the WPLS/BRR pair, route via hops to avoid the locked pair.
     */
    function _takeFee(address se, uint256 amt) internal returns (uint256) {
        uint256 feeAmt     = amt.mul(totalFee).div(feeDenominator);
        uint256 instantAmt = amt.mul(instantPLSFee).div(feeDenominator);
        uint256 totalTaken = feeAmt.add(instantAmt);

        if (totalTaken == 0) return amt;
        require(totalTaken < amt, "fees too high");

        if (feeAmt > 0) {
            _balances[address(this)] = _balances[address(this)].add(feeAmt);
            emit Transfer(se, address(this), feeAmt);
        }
        if (instantAmt > 0) {
            _balances[address(this)] = _balances[address(this)].add(instantAmt);
            emit Transfer(se, address(this), instantAmt);
            _sellTokensForPLS(instantAmt, instantPLSRecipient, isAMMPair[se], se);
        }

        uint256 burnAmt = amt.mul(directBurnFee).div(feeDenominator);
        if (burnAmt > 0) _burn(address(this), burnAmt);

        return amt.sub(totalTaken);
    }

    /* ---------- swap‑back ---------- */
    function _swapBack() internal swapping {
        // original behavior: auto‑mint first
        _autoMint(swapThreshold);
        uint256 tokensToSwap = swapThreshold;

        uint256 dynLPFee      = liquidityFee;
        uint256 tokensForLP   = tokensToSwap.mul(dynLPFee).div(totalFee).div(2);
        uint256 tokensForSwap = tokensToSwap.sub(tokensForLP);

        uint256 beforePLS = address(this).balance;

        /* path with optional hops (swapBack only) */
        address[] memory path;
        {
            uint8 len = 2;
            if (hop1Token != address(0)) len++;
            if (hop2Token != address(0)) len++;
            if (hop3Token != address(0)) len++;
            path = new address[](len);

            uint8 p;
            path[p++] = address(this);
            if (hop1Token != address(0)) path[p++] = hop1Token;
            if (hop2Token != address(0)) path[p++] = hop2Token;
            if (hop3Token != address(0)) path[p++] = hop3Token;
            path[p] = WPLS;
        }

        router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokensForSwap, 0, path, address(this), block.timestamp
        );

        uint256 gained = address(this).balance.sub(beforePLS);

        uint256 swapFee = reflectionFee + marketingFee + extraRewardFee + dynLPFee - dynLPFee / 2;
        uint256 plsLP   = gained.mul(dynLPFee).div(swapFee).div(2);
        uint256 plsRefl = gained.mul(reflectionFee).div(swapFee);
        uint256 plsMkt  = gained.mul(marketingFee).div(swapFee);
        uint256 plsXtra = gained.mul(extraRewardFee).div(swapFee);
        uint256 plsLeft = gained.sub(plsLP).sub(plsRefl).sub(plsMkt).sub(plsXtra);

        if (plsRefl > 0) try reflectionDistributor.deposit{ value: plsRefl }() {} catch {}
        if (plsMkt + plsLeft > 0) try marketingDistributor.deposit{ value: plsMkt + plsLeft }() {} catch {}
        if (plsXtra > 0) try extraRewardDistributor.deposit{ value: plsXtra }() {} catch {}

        if (tokensForLP > 0 && plsLP > 0) {
            router.addLiquidityETH{ value: plsLP }(
                address(this), tokensForLP, 0, 0, owner, block.timestamp
            );
        }
    }

    /* Build an instant‑PLS swap path that avoids the locked pair on buys from WPLS/BRR. */
    function _buildInstantPath(bool isBuyCtx, address se) internal view returns (address[] memory path) {
        bool avoidDirect = isBuyCtx && se == pair; // buy coming from WPLS/BRR pair → avoid [BRR→WPLS]
        if (avoidDirect) {
            uint8 len = 2;
            if (hop1Token != address(0)) len++;
            if (hop2Token != address(0)) len++;
            if (hop3Token != address(0)) len++;
            path = new address[](len);

            uint8 p;
            path[p++] = address(this);
            if (hop1Token != address(0)) path[p++] = hop1Token;
            if (hop2Token != address(0)) path[p++] = hop2Token;
            if (hop3Token != address(0)) path[p++] = hop3Token;
            path[p] = WPLS;
        } else {
            path = new address[](2);
            path[0] = address(this);
            path[1] = WPLS;
        }
        // implicit return of `path`
    }

    /* Sells `amount` BRR for WPLS and sends to `to`, using a path that avoids the locked pair on buys. */
    function _sellTokensForPLS(uint256 amount, address to, bool isBuyCtx, address se) internal swapping {
        if (amount == 0 || to == address(0)) return;
        address[] memory path = _buildInstantPath(isBuyCtx, se);
        // Best effort: never revert user transfer if routing is unavailable
        try router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount, 0, path, to, block.timestamp
        ) { } catch { /* swallow failure; tokens remain in contract */ }
    }

    function _autoMint(uint256 amt) internal {
        _totalSupply = _totalSupply.add(amt);
        _balances[address(this)] = _balances[address(this)].add(amt);
        emit Transfer(address(0), address(this), amt);
    }

    /* ---------- distributors ---------- */
    function _syncDistributor(address h) internal {
        uint256 bal = isDividendExempt[h] ? 0 : _balances[h];
        try marketingDistributor.setShare(h, bal) {} catch {}
        try reflectionDistributor.setShare(h, bal) {} catch {}
        try extraRewardDistributor.setShare(h, bal) {} catch {}
    }

    function _processDistributors() internal {
        try marketingDistributor.process(distributorGas) {} catch {}
        try reflectionDistributor.process(distributorGas) {} catch {}
        try extraRewardDistributor.process(distributorGas) {} catch {}
    }

    /* ---------- burns ---------- */
    function burn(uint256 amt) external { _burn(msg.sender, amt); }
    function burnFrom(address acc, uint256 amt) external {
        uint256 cur = _allowances[acc][msg.sender];
        require(cur >= amt, "allow");
        _allowances[acc][msg.sender] = cur.sub(amt);
        _burn(acc, amt);
    }
    function _burn(address a, uint256 amt) internal {
        _balances[a] = _balances[a].sub(amt, "burn");
        _totalSupply = _totalSupply.sub(amt);
        emit Transfer(a, ZERO, amt);
    }

    /* ---------- admin setters ---------- */
    function setSwapHops(address h1, address h2, address h3) external authorized {
        hop1Token = h1; hop2Token = h2; hop3Token = h3;
        emit HopTokensUpdated(h1, h2, h3);
    }

    function setAMMPair(address p, bool v) external authorized {
        require(p != address(0), "zero");
        isAMMPair[p] = v;
        if (v) { isDividendExempt[p] = true; }
        emit AMMPairUpdated(p, v);
    }

    function setIsSellAmountExempt(address a, bool e) external authorized { isSellAmountExempt[a] = e; }

    function setIsDividendExempt(address a, bool e) external authorized {
        require(a != address(this) && !isAMMPair[a], "NA");
        isDividendExempt[a] = e;
        _syncDistributor(a);
    }

    function setIsFeeExempt(address a, bool e) external authorized { isFeeExempt[a] = e; }
    function setIsTxLimitExempt(address a, bool e) external authorized { isTxLimitExempt[a] = e; }

    function setFees(uint256 rf, uint256 lf, uint256 mf, uint256 xf, uint256 bf) external authorized {
        reflectionFee  = rf;
        liquidityFee   = lf;
        marketingFee   = mf;
        extraRewardFee = xf;
        directBurnFee  = bf;
        totalFee = rf + lf + mf + xf + bf;
        require(totalFee <= feeDenominator * 30 / 100, "fee > 30%");
    }

    function setFeeDenominator(uint256 newD) external authorized {
        require(newD >= 10_000 && newD <= 1_000_000, "range");
        feeDenominator = newD;
        require(totalFee <= feeDenominator * 30 / 100, "fee > 30%");
    }

    function setDistributorSettings(uint256 g) external authorized {
        require(g < 30_000_000, "gas");
        distributorGas = g;
    }
    function setSwapBackSettings(bool en, uint256 thr) external authorized {
        swapEnabled = en;
        swapThreshold = thr;
    }
    function setSellTokenToSwapAmount(uint256 thr) external authorized { sellTokenToSwap = thr; }
    function setTxLimit(uint256 amt) external authorized { _maxTxAmount = amt; }

    /* Instant‑PLS fee controls */
    function setInstantPLSRecipient(address r) external authorized {
        require(r != address(0), "zero");
        instantPLSRecipient = r;
        emit InstantPLSSettingsUpdated(instantPLSFee, r);
    }
    function setInstantPLSFee(uint256 f) external authorized {
        instantPLSFee = f; // intentionally uncapped; separate from totalFee
        emit InstantPLSSettingsUpdated(f, instantPLSRecipient);
    }

    function ManualMint(address to, uint256 amount) external authorized {
    require(to != address(0), "mint: zero address");
    require(amount > 0, "mint: zero amount");

    _totalSupply = _totalSupply.add(amount);
    _balances[to] = _balances[to].add(amount);

    emit Transfer(address(0), to, amount);
}

    /* recover ETH inadvertently stuck in contract */
    function recoverETH() external authorized { payable(owner).transfer(address(this).balance); }

    /* change extra reward token (leftovers burned to DEAD) */
    function setExtraRewardToken(address newToken) external authorized {
        extraRewardDistributor.changeRewardToken(newToken);
    }
}
        

Compiler Settings

{"viaIR":true,"remappings":[],"optimizer":{"runs":200,"enabled":true},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"shanghai","compilationTarget":{"contracts/pls.sol":"BRR"}}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"rwrdToken","internalType":"address"},{"type":"address","name":"routerAddr","internalType":"address"},{"type":"string","name":"n","internalType":"string"},{"type":"string","name":"s","internalType":"string"},{"type":"address","name":"ownerAddr","internalType":"address"},{"type":"uint256","name":"reflectionF","internalType":"uint256"},{"type":"uint256","name":"liquidityF","internalType":"uint256"},{"type":"uint256","name":"marketingF","internalType":"uint256"},{"type":"uint256","name":"extraRewardF","internalType":"uint256"},{"type":"uint256","name":"directBurnF","internalType":"uint256"},{"type":"uint256","name":"instantPLSF","internalType":"uint256"},{"type":"address","name":"instantPLSRecipient_","internalType":"address"}]},{"type":"event","name":"AMMPairUpdated","inputs":[{"type":"address","name":"pair","internalType":"address","indexed":false},{"type":"bool","name":"value","internalType":"bool","indexed":false}],"anonymous":false},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"HopTokensUpdated","inputs":[{"type":"address","name":"h1","internalType":"address","indexed":false},{"type":"address","name":"h2","internalType":"address","indexed":false},{"type":"address","name":"h3","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"InstantPLSSettingsUpdated","inputs":[{"type":"uint256","name":"fee","internalType":"uint256","indexed":false},{"type":"address","name":"recipient","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"OwnershipTransferred","inputs":[{"type":"address","name":"newOwner","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"DEAD","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"ManualMint","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"amount","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"WPLS","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"ZERO","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"_maxTxAmount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"o","internalType":"address"},{"type":"address","name":"s","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"s","internalType":"address"},{"type":"uint256","name":"a","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approveMax","inputs":[{"type":"address","name":"s","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"a","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"acc","internalType":"address"},{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"pure","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"directBurnFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"distributorGas","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"dividendExempt","inputs":[{"type":"address","name":"a","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract FlexibleRewardDistributor"}],"name":"extraRewardDistributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"extraRewardFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"feeDenominator","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"getOwner","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"hop1Token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"hop2Token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"hop3Token","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"instantPLSFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"instantPLSRecipient","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isAMMPair","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isDividendExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isFeeExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isSellAmountExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"isTxLimitExempt","inputs":[{"type":"address","name":"","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract MarketingDistributor"}],"name":"marketingDistributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"marketingFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"pair","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"recoverETH","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract DividendDistributor"}],"name":"reflectionDistributor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"reflectionFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract IDEXRouter"}],"name":"router","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"sellTokenToSwap","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setAMMPair","inputs":[{"type":"address","name":"p","internalType":"address"},{"type":"bool","name":"v","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setDistributorSettings","inputs":[{"type":"uint256","name":"g","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setExtraRewardToken","inputs":[{"type":"address","name":"newToken","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFeeDenominator","inputs":[{"type":"uint256","name":"newD","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setFees","inputs":[{"type":"uint256","name":"rf","internalType":"uint256"},{"type":"uint256","name":"lf","internalType":"uint256"},{"type":"uint256","name":"mf","internalType":"uint256"},{"type":"uint256","name":"xf","internalType":"uint256"},{"type":"uint256","name":"bf","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setInstantPLSFee","inputs":[{"type":"uint256","name":"f","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setInstantPLSRecipient","inputs":[{"type":"address","name":"r","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsDividendExempt","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"bool","name":"e","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsFeeExempt","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"bool","name":"e","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsSellAmountExempt","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"bool","name":"e","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setIsTxLimitExempt","inputs":[{"type":"address","name":"a","internalType":"address"},{"type":"bool","name":"e","internalType":"bool"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSellTokenToSwapAmount","inputs":[{"type":"uint256","name":"thr","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapBackSettings","inputs":[{"type":"bool","name":"en","internalType":"bool"},{"type":"uint256","name":"thr","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setSwapHops","inputs":[{"type":"address","name":"h1","internalType":"address"},{"type":"address","name":"h2","internalType":"address"},{"type":"address","name":"h3","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"setTxLimit","inputs":[{"type":"uint256","name":"amt","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"swapEnabled","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"swapThreshold","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalFee","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"r","internalType":"address"},{"type":"uint256","name":"a","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"se","internalType":"address"},{"type":"address","name":"re","internalType":"address"},{"type":"uint256","name":"a","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"transferOwnership","inputs":[{"type":"address","name":"newO","internalType":"address"}]},{"type":"receive","stateMutability":"payable"}]
              

Contract Creation Code

0x608080604052346200070b5762005c00803803809162000020828562000a50565b83398101610180828203126200070b576200003b8262000a74565b906200004a6020840162000a74565b60408401516001600160401b0381116200070b57826200006c91860162000a89565b606085015190926001600160401b0382116200070b576200008f91860162000a89565b916200009e6080860162000a74565b9460a08101519360c082015160e08301516101008401519161012085015193620000d2610160610140880151970162000a74565b5f80546001600160a01b03199081166001600160a01b038f1690811783558252600160208190526040909220805460ff199081168417909155601b80549091169092179091556207a120601c55601d8054610100600160a81b03191674a1077a294dde1b09bb078844df40758a5d0f9a2700179055601e8054821673efd766ccb38eaf1dfd701853bfce31359239f305179055601f8054909116732fa878ab3f87cc1c9737fc071108f904c0b0c95d179055875190976001600160401b0382116200092c57600b5490600182811c9216801562000a45575b60208310146200090d5781601f849311620009d5575b50602090601f83116001146200094c575f9262000940575b50508160011b915f199060031b1c191617600b555b8051906001600160401b0382116200092c57600c54600181811c9116801562000921575b60208210146200090d57601f8111620008a9575b50602090601f83116001146200082557936200029062000290948462000296989562000290956175309b995f9262000819575b50508160011b915f199060031b1c191617600c555b8c60049d8e5581600555836002558560035587600655620186a060085562000afd565b62000afd565b8060075511620007e9576009556001600160a01b03168015620007a557600a80546001600160a01b0319908116929092179055601680549091166001600160a01b0392909216918217905560405163ef8ef56f60e01b81529092906020818481875afa908115620006a1575f9162000763575b50601880546001600160a01b0319166001600160a01b0392909216918217905560405163c45a015560e01b81526020818581885afa908115620006a1575f9162000718575b506040516364e329cb60e11b815284810192909252306024830152602090829060449082905f906001600160a01b03165af1908115620006a1575f91620006d2575b50601780546001600160a01b0319166001600160a01b03928316179055305f908152601060209081526040808320878452909152908190205f1990556018549051916108cd80840192909116906001600160401b03831184841017620006bf57918391608093620033d784396001600160a01b0389168252602082018890526040820152670de0b6b3a764000060608201520301905ff08015620006a157602080546001600160a01b0319166001600160a01b03928316179055601854604051610e6a8082019491939192909116906001600160401b03851184861017620006bf5791839160609362003ca4843987865260208601526001600160a01b031660408501819052930301905ff08015620006a157602180546001600160a01b0319166001600160a01b03928316179055601854604051946110f280870195929093169290916001600160401b03861187871017620006ac5750918593916080959362004b0e86396001600160a01b03881684526020840152604083015260608201520301905ff08015620006a157602280546001600160a01b0319166001600160a01b0392831617905569d3c21bcecceda1000000600d819055600e8190559082165f818152600f6020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a36001600160a01b039081165f9081526011602090815260408083208054600160ff199182168117909255601284528285208054821683179055308552601384528285208054821683179055601780548716865283862080548316841790557f2264e2d7bacabe6058f5009f42467b9be28015e7760f87409562384c94ac271c8054831684179055845487168652838620805483168417905560225487168652838620805483168417905580548716865260158552948390208054909116821790559254815194168452908301919091527f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac91a16509184e72a0006019556064601a556040516128b7908162000b208239f35b6040513d5f823e3d90fd5b604190634e487b7160e01b5f525260245ffd5b604186634e487b7160e01b5f525260245ffd5b90506020813d6020116200070f575b81620006f06020938362000a50565b810103126200070b57620007049062000a74565b5f62000390565b5f80fd5b3d9150620006e1565b90506020813d6020116200075a575b81620007366020938362000a50565b810103126200070b575f9160446200075060209362000a74565b925050916200034e565b3d915062000727565b90506020813d6020116200079c575b81620007816020938362000a50565b810103126200070b57620007959062000a74565b5f62000309565b3d915062000772565b60405162461bcd60e51b8152602081850152601660248201527f696e7374616e7420726563697069656e74207a65726f000000000000000000006044820152606490fd5b60405162461bcd60e51b81526020818601526009602482015268666565203e2033302560b81b6044820152606490fd5b015190505f8062000258565b90600c5f5260205f20915f5b601f1985168110620008905750620002909460018562000290956175309b99956200029095620002969c99601f1981161062000877575b505050811b01600c556200026d565b01515f1960f88460031b161c191690555f808062000868565b9192602060018192868501518155019401920162000831565b600c5f527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7601f840160051c81016020851062000905575b601f830160051c82018110620008f957505062000225565b5f8155600101620008e1565b5080620008e1565b634e487b7160e01b5f52602260045260245ffd5b90607f169062000211565b634e487b7160e01b5f52604160045260245ffd5b015190505f80620001d8565b600b5f9081527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db99350601f198516905b818110620009bc5750908460019594939210620009a3575b505050811b01600b55620001ed565b01515f1960f88460031b161c191690555f808062000994565b929360206001819287860151815501950193016200097c565b600b5f529091507f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db9601f840160051c81016020851062000a3d575b90849392915b601f830160051c8201811062000a2e575050620001c0565b5f815585945060010162000a16565b508062000a10565b91607f1691620001aa565b601f909101601f19168101906001600160401b038211908210176200092c57604052565b51906001600160a01b03821682036200070b57565b919080601f840112156200070b5782516001600160401b0381116200092c576020906040519262000ac483601f19601f850116018562000a50565b8184528282870101116200070b575f5b81811062000ae95750825f9394955001015290565b858101830151848201840152820162000ad4565b9190820180921162000b0b57565b634e487b7160e01b5f52601160045260245ffdfe6080604081815260049182361015610021575b505050361561001f575f80fd5b005b5f925f3560e01c91826303fd2a451461163e575081630445b6671461162057816304a66b481461158057816305d57250146114f75781630614117a1461149957816306fdde03146113d8578163095ea7b31461136957816309dd7eac146113405781630dab537114611317578163180b0d7e146112f857816318160ddd146112d9578163191e2760146112ac5781631df4ccfc1461128d57816323b872dd146111e15781632d99d32e146111225781632e0d9936146110f9578163313ce567146110dd57816335e67e1d146110ab5781633e9fd9411461108c5781633f4218e01461104e57816342966c68146110305781634355855a14610df557816346d8ed0c14611011578163571ac8b014610fa257816358fa63ca14610f875781635a51312614610e845781635c85974f14610e5257816360e7196214610e3357816364acc50e14610df5578163658d4b7f14610d945781636b67c4df14610d755781636ddd171314610d5157816370a0823114610d19578163759c066d14610cf057816379cc679014610c3d5781637d1db4a514610c1e57816383ad799414610c00578163893d20e814610bd857816389c932a514610b9a5781638a30104a14610ae45781638b42507f14610aa65781639234a45414610a8757816393e8e0b4146109e757816395d89b41146108e257816398118cb4146108c35781639d1944f514610859578163a1433c681461078b578163a3a649a914610762578163a8aa1b3114610739578163a9059cbb14610706578163b0249cc6146106c8578163dc35c53b14610667578163dd62ed3e1461061a578163df20fd49146105ca578163ec19f44a14610553578163ed665e9114610534578163ef8ef56f1461050b578163f2fde38b1461044d578163f708a64f1461038f57508063f84ba65d1461032c578063f887ea40146103045763fe53b2f3146102da5780610012565b346103005781600319360112610300576020805491516001600160a01b03909216825290f35b5080fd5b503461030057816003193601126103005760165490516001600160a01b039091168152602090f35b503461030057806003193601126103005761038c90610349611658565b906103526116cb565b91338552600160205261036a60ff83872054166116da565b60018060a01b03168452601260205283209060ff801983541691151516179055565b80f35b839150346103005782600319360112610300576103aa611658565b906103b36116cb565b9033845260016020526103cb60ff86862054166116da565b6001600160a01b038316903082141580610437575b1561040f575090839461040a9261038c9552601360205285209060ff801983541691151516179055565b6121e5565b606490602087519162461bcd60e51b835282015260026024820152614e4160f01b6044820152fd5b50818552601560205260ff8686205416156103e0565b9190503461050757602036600319011261050757610469611658565b8354926001600160a01b03919082851633036104db5750917f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616393916020931680926bffffffffffffffffffffffff60a01b1617855581855260018352808520600160ff1982541617905551908152a180f35b606490602085519162461bcd60e51b8352820152600660248201526510a7aba722a960d11b6044820152fd5b8280fd5b50503461030057816003193601126103005760185490516001600160a01b039091168152602090f35b5050346103005781600319360112610300576020906003549051908152f35b91905034610507576020366003190112610507577f7abd714e3c67bc9d590b6661d081e86b8e6443c95741b0fa43b5bc8183a6b41a913533845260016020526105a160ff83862054166116da565b6009819055600a5491519081526001600160a01b03909116602082015280604081015b0390a180f35b90503461050757816003193601126105075735908115158092036106165760ff6105ff913385526001602052842054166116da565b60ff8019601b5416911617601b5560243560195580f35b5f80fd5b505034610300578060031936011261030057602091610637611658565b8261064061166e565b6001600160a01b03928316845260108652922091165f908152908352819020549051908152f35b50503461030057806003193601126103005761038c90610685611658565b9061068e6116cb565b9133855260016020526106a660ff83872054166116da565b60018060a01b03168452601460205283209060ff801983541691151516179055565b5050346103005760203660031901126103005760209160ff9082906001600160a01b036106f3611658565b1681526015855220541690519015158152f35b505034610300578060031936011261030057602090610730610726611658565b6024359033611866565b90519015158152f35b50503461030057816003193601126103005760175490516001600160a01b039091168152602090f35b505034610300578160031936011261030057601f5490516001600160a01b039091168152602090f35b505034610300576060366003190112610300576107a6611658565b6107ae61166e565b9060443560018060a01b039384821680920361061657847f5a64c5bc1b0d5f2ae21fa83404fc39f9481e787dc0167ff23a48c9395e4ab18e95606095338952600160205261080160ff858b2054166116da565b601d54610100600160a81b038760081b1690610100600160a81b03191617601d551690836bffffffffffffffffffffffff60a01b8381601e541617601e55601f541617601f558251941684526020840152820152a180f35b90503461050757602036600319011261050757803591338452600160205261088660ff82862054166116da565b6301c9c38083101561089a575050601c5580f35b906020606492519162461bcd60e51b8352820152600360248201526267617360e81b6044820152fd5b5050346103005781600319360112610300576020906005549051908152f35b9190503461050757826003193601126105075780519183600c54906001908260011c926001811680156109dd575b60209586861082146109ca57508488529081156109a8575060011461094f575b61094b8686610941828b03836117cf565b5191829182611684565b0390f35b929550600c83527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c75b828410610995575050508261094b9461094192820101945f610930565b8054868501880152928601928101610978565b60ff191687860152505050151560051b83010192506109418261094b5f610930565b634e487b7160e01b845260229052602483fd5b93607f1693610910565b505034610300576020366003190112610300577f7abd714e3c67bc9d590b6661d081e86b8e6443c95741b0fa43b5bc8183a6b41a90610a24611658565b903384526001602052610a3c60ff82862054166116da565b6001600160a01b038216610a518115156117f1565b600a80546001600160a01b03191691909117905560095490519081526001600160a01b03909116602082015280604081016105c4565b5050346103005781600319360112610300576020906009549051908152f35b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610ad1611658565b1681526012855220541690519015158152f35b83915034610300576020366003190112610300578035923383526001602052610b1260ff82852054166116da565b61271084101580610b8d575b15610b6257508260085560075490601e840293808504601e1490151715610b4f5750606461038c9293041015611753565b634e487b7160e01b835260119052602482fd5b906020606492519162461bcd60e51b8352820152600560248201526472616e676560d81b6044820152fd5b50620f4240841115610b1e565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610bc5611658565b1681526014855220541690519015158152f35b505034610300578160031936011261030057905490516001600160a01b039091168152602090f35b90503461050757826003193601126105075760209250549051908152f35b505034610300578160031936011261030057602090600e549051908152f35b838334610300578060031936011261030057610c57611658565b6024359160018060a01b03821690818552602060108152818620335f528152815f205496858810610cc75750610cb061038c969786845191610c98836117b3565b600783526639bab11037bb3360c91b85840152611830565b9287526010815281872090335f52525f205561210f565b915162461bcd60e51b8152918201526005602482015264616c6c6f7760d81b6044820152606490fd5b505034610300578160031936011261030057601e5490516001600160a01b039091168152602090f35b5050346103005760203660031901126103005760209181906001600160a01b03610d41611658565b168152600f845220549051908152f35b50503461030057816003193601126103005760209060ff601b541690519015158152f35b5050346103005781600319360112610300576020906002549051908152f35b50503461030057806003193601126103005761038c90610db2611658565b90610dbb6116cb565b913385526001602052610dd360ff83872054166116da565b60018060a01b03168452601160205283209060ff801983541691151516179055565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610e20611658565b1681526013855220541690519015158152f35b505034610300578160031936011261030057602090601c549051908152f35b919050346105075760203660031901126105075760ff610e7d913385526001602052842054166116da565b35600e5580f35b91905034610507578060031936011261050757610e9f611658565b906024359033855260209260018452610ebd60ff83882054166116da565b6001600160a01b0316938415610f51578215610f1c575091818593610ef25f8051602061286283398151915294600d546121a1565b600d55858552600f8352610f0982828720546121a1565b868652600f84528186205551908152a380f35b83606492519162461bcd60e51b835282015260116024820152701b5a5b9d0e881e995c9bc8185b5bdd5b9d607a1b6044820152fd5b83606492519162461bcd60e51b835282015260126024820152716d696e743a207a65726f206164647265737360701b6044820152fd5b50503461030057816003193601126103005751908152602090f35b50503461030057602036600319011261030057602090610fc0611658565b335f5260108352815f209060018060a01b031690815f5283525f1980835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b5050346103005781600319360112610300576020906006549051908152f35b8390346103005760203660031901126103005761038c90353361210f565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03611079611658565b1681526011855220541690519015158152f35b505034610300578160031936011261030057602090601a549051908152f35b919050346105075760203660031901126105075760ff6110d6913385526001602052842054166116da565b35601a5580f35b5050346103005781600319360112610300576020905160128152f35b50503461030057816003193601126103005760215490516001600160a01b039091168152602090f35b5050346103005780600319360112610300577f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac9061115e611658565b6111666116cb565b90338552600160205261117e60ff84872054166116da565b6001600160a01b0316906111938215156117f1565b8185526015602052806111b4818588209060ff801983541691151516179055565b6111c9575b825191825215156020820152a180f35b6013602052828520805460ff191660011790556111b9565b505034610300576060366003190112610300576107306111ff611658565b61120761166e565b6044359160018060a01b0381168087528560209760108952818120335f5289525f19825f20540361123b575b505050611866565b82815260108952818120335f528952611274825f20548784519161125e836117b3565b6005835264616c6c6f7760d81b8d840152611830565b9281526010895220335f528752855f20555f8581611233565b5050346103005781600319360112610300576020906007549051908152f35b505034610300578160031936011261030057601d54905160089190911c6001600160a01b03168152602090f35b505034610300578160031936011261030057602090600d549051908152f35b5050346103005781600319360112610300576020906008549051908152f35b50503461030057816003193601126103005760225490516001600160a01b039091168152602090f35b505034610300578160031936011261030057600a5490516001600160a01b039091168152602090f35b505034610300578060031936011261030057602090611386611658565b602435335f5260108452825f209160018060a01b031691825f52845280835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b9190503461050757826003193601126105075780519183600b54906001908260011c9260018116801561148f575b60209586861082146109ca57508488529081156109a857506001146114365761094b8686610941828b03836117cf565b929550600b83527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b82841061147c575050508261094b9461094192820101945f610930565b805486850188015292860192810161145f565b93607f1693611406565b50503461030057816003193601126103005733825260016020526114c260ff82842054166116da565b8180808060018060a01b0381541647908282156114ee575bf1156114e4575080f35b51903d90823e3d90fd5b506108fc6114da565b9190503461061657602036600319011261061657611513611658565b335f52600160205261152a60ff835f2054166116da565b6022546001600160a01b03908116803b15610616575f9283602492865197889586946304455c6760e11b865216908401525af1908115611577575061156d575080f35b61001f915061178b565b513d5f823e3d90fd5b82346106165760a0366003190112610616576115e3906115de83356115de6024356115de60443591606435946115c660ff60843599335f5260016020525f2054166116da565b808a5581600555836002558560035587600655611714565b611714565b8060075560085491601e830292808404601e149015171561160d5750606461001f92041015611753565b601190634e487b7160e01b5f525260245ffd5b8234610616575f366003190112610616576020906019549051908152f35b34610616575f366003190112610616578061dead60209252f35b600435906001600160a01b038216820361061657565b602435906001600160a01b038216820361061657565b602080825282518183018190529093925f5b8281106116b757505060409293505f838284010152601f8019910116010190565b818101860151848201604001528501611696565b60243590811515820361061657565b156116e157565b60405162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b6044820152606490fd5b9190820180921161172157565b634e487b7160e01b5f52601160045260245ffd5b811561173f570490565b634e487b7160e01b5f52601260045260245ffd5b1561175a57565b60405162461bcd60e51b8152602060048201526009602482015268666565203e2033302560b81b6044820152606490fd5b67ffffffffffffffff811161179f57604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff82111761179f57604052565b90601f8019910116810190811067ffffffffffffffff82111761179f57604052565b156117f857565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b9190820391821161172157565b92919280821161184857611845929350611823565b90565b60405162461bcd60e51b8152806118628660048301611684565b0390fd5b601d5460ff925f91841661208a57600e54851180159061206a575b1561203a576001600160a01b0381165f81815260156020526040902054909590851680612027575b8061200b575b80611ff3575b601a548210801590611fd3575b81611fc7575b81611fad575b81611fa5575b50611a7c575b9061040a6119729260018060a01b03861696878652600f60205261191f6040872054836040519161190a836117b3565b600383526218985b60ea1b6020840152611830565b888752600f60205260408720556011602052604086205416155f14611a76576119489086612429565b945b878552600f6020526119608660408720546121a1565b888652600f60205260408620556121e5565b60018060a01b0360205416601c54813b156105075782604051818160248163ffb2c47960e01b978882528760048301525afa611a62575b50506021546001600160a01b031690813b15611a4a5783809260248293604051948593849289845260048401525af1611a4e575b5050602254601c546001600160a01b0390911691823b15611a4a579060248492836040519586948593845260048401525af1611a33575b505060205f8051602061286283398151915291604051908152a3600190565b611a3d829161178b565b611a475780611a14565b80fd5b8380fd5b611a579061178b565b61030057815f6119dd565b611a6b9061178b565b61050757825f6119a9565b9461194a565b60ff19600181601d541617601d55601954611a9981600d546121a1565b600d55305f52600f602052611ab28160405f20546121a1565b305f52600f60205260405f20556040519081525f5f8051602061286283398151915260203093a3601954600554611ae981836125e6565b90611af8600792835490612641565b60011c91611b26604051611b0b816117b3565b828152846639bab11037bb3360c91b96876020840152611830565b601d5460029391479160081c6001600160a01b03168015158e81611f9c575b601e546001600160a01b03168015159889611f8e575b601f546001600160a01b03169182151591611b7e90859084611f80575b16612347565b9a60019530611b8c8e612379565b52611f66575b611bb8959650611f4a575b50611f2e575b506018546001600160a01b03169216876123aa565b526016546001600160a01b0316803b1561061657611bf65f9291839260405194858094819363791ac94760e01b83526004809d4292309286016123be565b03925af18015611f2357611f10575b506040514791611c14826117b3565b848252876020830152611c2692611830565b9183549560025491611c388389611714565b93806003549586611c4891611714565b90611c5291611714565b8160011c611c5f91611823565b8080611c6c81948a6125e6565b90611c7691612641565b60011c9a611c8490896125e6565b90611c8e91612641565b94611c9990886125e6565b90611ca391612641565b94611cae90876125e6565b90611cb891612641565b8095604051611cc6816117b3565b8381528a856020830152611cd992611830565b604051611ce5816117b3565b83815285856020830152611cf892611830565b604051611d04816117b3565b83815286856020830152611d1792611830565b9260405192611d25846117b3565b83526020830152611d3592611830565b9080611ec2575b50611d478183611714565b611e6a575b505080611e18575b5081151580611e0f575b611d75575b5050601d8054909216909155506118da565b9060c460609260018060a01b03601654169460018060a01b038a541695604051968795869463f305d71960e01b8652309086015260248501528b60448501528b606485015260848401524260a48401525af18015611e0457611dd9575b8080611d63565b606090813d8311611dfd575b611def81836117cf565b81010312611a4a575f611dd2565b503d611de5565b6040513d87823e3d90fd5b50821515611d5e565b6022546001600160a01b0316803b15611e6657908880928460405180948193630d0e30db60e41b83525af1611e4e575b50611d54565b611e579061178b565b611e6257865f611e48565b8680fd5b8880fd5b6020546001600160a01b031691611e819190611714565b90803b15611ebe57908980928560405180948193630d0e30db60e41b83525af115611d4c57611eaf9061178b565b611eba57875f611d4c565b8780fd5b8980fd5b6021546001600160a01b0316803b15611f0c57908b80928760405180948193630d0e30db60e41b83525af1611ef8575b50611d3c565b611f019061178b565b611ebe57895f611ef2565b8b80fd5b611f1b919a5061178b565b5f985f611c05565b6040513d5f823e3d90fd5b611f4382611f3b8661231e565b95168a6123aa565b525f611ba3565b611f5f84611f578861231e565b97168c6123aa565b525f611b9d565b611bb89550600296611f778d61239a565b52869550611b92565b611f899061231e565b611b78565b611f979061231e565b611b5b565b60039750611b45565b90505f6118d4565b9050305f52600f60205260405f20546019541115906118ce565b601b54871691506118c8565b506001600160a01b0385165f9081526014602052604090205486166118c2565b506016546001600160a01b03858116911614156118b5565b506001600160a01b0384165f90815260409020548516156118af565b506001600160a01b0384163014156118a9565b60405162461bcd60e51b81526020600482015260086024820152671516081b1a5b5a5d60c21b6044820152606490fd5b506001600160a01b0383165f908152601260205260409020548416611881565b935f805160206128628339815191529293506020915060018060a01b0380941693845f52600f83526040956120dd875f2054848951916120c9836117b3565b600383526218985b60ea1b88840152611830565b865f52600f8552875f20551694855f526120fa82825f20546121a1565b865f52600f8452815f205551908152a3600190565b905f8051602061286283398151915260205f9360018060a01b031692838552600f825261215d60408620548260405191612148836117b3565b6004835263313ab93760e11b86840152611830565b848652600f83526040862055612195600d54826040519161217d836117b3565b600783526639bab11037bb3360c91b86840152611830565b600d55604051908152a3565b906121ac9082611714565b9081106121b65790565b60405162461bcd60e51b815260206004820152600760248201526630b2321037bb3360c91b6044820152606490fd5b6001600160a01b038082165f908152601360205260408120549092919060ff161561230e575f915b816020541691823b1561061657604051630a5b654b60e11b8082526001600160a01b038416600483015260248201869052935f90829060449082905afa6122fb575b508060215416803b156122f7576040518481526001600160a01b038416600482015260248101869052869182908290604490829084905af16122e3575b50506022541691823b156122df576040519081526001600160a01b03919091166004820152602481019290925282908290604490829084905af16122ce575050565b6122d8829161178b565b611a475750565b8480fd5b6122ec9061178b565b6122df57845f61228c565b8580fd5b61230691955061178b565b5f935f61224f565b600f60205260405f20549161220d565b60ff1660ff81146117215760010190565b67ffffffffffffffff811161179f5760051b60200190565b906123518261232f565b61235e60405191826117cf565b828152809261236f601f199161232f565b0190602036910137565b8051156123865760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156123865760400190565b80518210156123865760209160051b010190565b91909493929460a083019083526020905f602085015260a060408501528251809152602060c085019301915f5b82811061240c5750505050906080919460018060a01b031660608201520152565b83516001600160a01b0316855293810193928101926001016123eb565b90612436600754826125e6565b916124596124476008548095612641565b93612454600954856125e6565b612641565b61246381856121a1565b9182156125de57838310156125a957846118459561255d575b50816124da575b505061249d612494600654846125e6565b60085490612641565b806124ca575b50604051916124b1836117b3565b600783526639bab11037bb3360c91b6020840152611830565b6124d4903061210f565b5f6124a3565b61254f90305f52600f6020526124f48360405f20546121a1565b305f52600f60205260405f205560018060a01b0380821690604051858152825f8051602061286283398151915260203093a3600a5416905f52601560205260ff60405f2054169060ff1994600186601d541617601d5561267e565b601d5416601d555f80612483565b305f52600f6020526125738160405f20546121a1565b305f52600f60205260405f205560405190815230905f80516020612862833981519152602060018060a01b03851692a35f61247c565b60405162461bcd60e51b815260206004820152600d60248201526c0cccacae640e8dede40d0d2ced609b1b6044820152606490fd5b505050905090565b90811561263b57808202918083048203611721576126049083611735565b0361260c5790565b60405162461bcd60e51b815260206004820152600760248201526636bab61037bb3360c91b6044820152606490fd5b50505f90565b9080156126515761184591611735565b60405162461bcd60e51b8152602060048201526005602482015264064697620360dc1b6044820152606490fd5b91909282158015612850575b61284a5781612831575b50156127df57601d5460081c6001600160a01b039081169190821515906002826127d7575b81601e54169081151591826127c7575b83601f5416926126e360ff8515159485611f805716612347565b97600196306126f18b612379565b526127a3575b509160ff939161271a9593612787575b5061276b575b50601854169216846123aa565b525b6016546001600160a01b0316803b1561061657612755935f80946040519687958694859363791ac94760e01b85524292600486016123be565b03925af16127605750565b6127699061178b565b565b612780836127788761231e565b9616886123aa565b525f61270d565b61279c856127948961231e565b98168a6123aa565b525f612707565b95509160ff939161271a95936002976127bb8b61239a565b529193955091936126f7565b906127d19061231e565b906126c9565b5060036126b9565b604051906060820182811067ffffffffffffffff82111761179f57604052600282526040366020840137813061281482612379565b526018546001600160a01b03169061282b9061239a565b5261271c565b6017546001600160a01b0391821691161490505f612694565b50505050565b506001600160a01b0384161561268a56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cebf121004318030e37b0ffd0c61146f6730a4861b3ba6d90dc7daf39893b54364736f6c634300081600336080346100cc57601f6108cd38819003918201601f19168301916001600160401b038311848410176100d0578084926080946040528339810103126100cc57610047816100e4565b90610054602082016100e4565b916060610063604084016100e4565b9201519160018060a01b03808093169460018060a01b03199580875f5416175f555f52600160205260405f20600160ff1982541617905560016002551684600354161760035516826004541617600455600655600554166005556040516107d490816100f98239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100cc5756fe60806040818152600480361015610020575b505050361561001e575f80fd5b005b5f3560e01c92836314b6ca96146104f257836319ca8d9d146104cf575082632d48e896146104bd578263512b466a1461045d578263c0d7865514610333578263c307736b14610281578263d0e30db0146101ec578263ef8ef56f146101c5578263f13cff41146101a7578263f2fde38b146100f257508163f887ea40146100cb575063ffb2c479146100b4575f8080610011565b346100c75760203660031901126100c757005b5f80fd5b346100c7575f3660031901126100c75760035490516001600160a01b039091168152602090f35b346100c75760203660031901126100c75761010b610506565b5f54916001600160a01b039190828416330361017b577f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc6861636020858786861680926bffffffffffffffffffffffff60a01b16175f55815f5260018352805f20600160ff1982541617905551908152a1005b606490602086519162461bcd60e51b8352820152600660248201526510a7aba722a960d11b6044820152fd5b50346100c7575f3660031901126100c7576020906006549051908152f35b90346100c7575f3660031901126100c757905490516001600160a01b039091168152602090f35b5f3660031901126100c7576002805414610253576002805547600654808210159081610249575b5080610235575b610226575b6001600255005b61022f906105a0565b8061021f565b506005546001600160a01b0316151561021a565b9050151582610213565b6020606492519162461bcd60e51b835282015260096024820152681c99595b9d1c985b9d60ba1b6044820152fd5b346100c75760203660031901126100c75761029a610506565b90335f5260016020526102b260ff845f20541661051c565b6001600160a01b03918216928315610301575050816005549182167fdaf07b4e69bde315edc84ec46436740284cd8cff5b4eb508783d3d87a01798ee5f80a36001600160a01b03191617600555005b906020606492519162461bcd60e51b8352820152600c60248201526b7a65726f206164647265737360a01b6044820152fd5b90346100c757602091826003193601126100c75761034f610506565b92335f526001815261036660ff845f20541661051c565b6001600160a01b0393841693841561042e576003546bffffffffffffffffffffffff60a01b948686831617600355805163ef8ef56f60e01b8152848187818b5afa908115610424575f916103ec575b5094837feb7c1e97c05570337fe795ab9d5755a8f731c9c52e756b720275940fa283327696168097825416179055519485521692a3005b90508481813d831161041d575b610403818361057e565b810103126100c757519483861686036100c75794836103b5565b503d6103f9565b82513d5f823e3d90fd5b50606492519162461bcd60e51b8352820152600b60248201526a3d32b937903937baba32b960a91b6044820152fd5b346100c75760203660031901126100c7577f267c16776db959cf326f4224ca1941791fd8c5bd7086575e4eb63d78052b5b4b903591335f5260016020526104a960ff825f20541661051c565b6006548151908152836020820152a1600655005b50346100c7573660031901126100c757005b346100c7575f3660031901126100c7576005546001600160a01b03168152602090f35b82346100c7573660031901126100c75761001e5b600435906001600160a01b03821682036100c757565b1561052357565b60405162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b6044820152606490fd5b67ffffffffffffffff811161056a57604052565b634e487b7160e01b5f52604160045260245ffd5b90601f8019910116810190811067ffffffffffffffff82111761056a57604052565b5f90801561079a57604080516060810181811067ffffffffffffffff82111761056a57825260028152602090818101908336833760018060a01b039160049583875416835115610787578252836005541691835192600193600110156107745787850152846003541692833b156100c7579190875194859363b6f9de9560e01b855260848501915f8c870152608060248701525180925260a4850192915f5b8a82821061075c5750505050505f939183809230604483015242606483015203925af180156107525761073f575b50600554169282516370a0823160e01b815230828201528281602481885afa928315610735578693610705575b5050816106a9575b5050505050565b833b156107015790602485928385519687948593630852cd8d60e31b85528401525af19081156106f857506106e1575b8080806106a2565b6106eb8291610556565b6106f557806106d9565b80fd5b513d84823e3d90fd5b8480fd5b9080929350813d831161072e575b61071d818361057e565b810103126107015751905f8061069a565b503d610713565b84513d88823e3d90fd5b61074a919550610556565b5f935f61066d565b84513d5f823e3d90fd5b84518b1686528997509485019490930192820161063f565b603289634e487b7160e01b5f525260245ffd5b603288634e487b7160e01b5f525260245ffd5b505056fea2646970667358221220ebcd36352b1fde60512676b5435fd65791bfd85a1c4a353cdf67ae87716c7c7664736f6c634300081600336080346100bb57601f610e6a38819003918201601f19168301916001600160401b038311848410176100bf578084926060946040528339810103126100bb57610047816100d3565b906100606040610059602084016100d3565b92016100d3565b60015f55603c600d55620186a0600e5560018060a01b0319923384600154161760015560018060a01b0392838092168560025416176002551683600454161760045516906003541617600355604051610d8290816100e88239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100bb5756fe60406080815260049081361015610014575f80fd5b5f915f3560e01c90816314b6ca961461054757816326987b60146105295781632d48e896146104f85781633a98ef39146104da5781634fab0ae8146104bc5781638d009fd81461049457816395cfbd791461046c578163997664d71461044e578163d0e30db0146101ae578163e2d2e2191461018f578163ef8ef56f14610163578163efca2eed14610144578163f887ea401461011b578163ffb2c479146100e6575063ffd49c84146100c5575f80fd5b346100e257816003193601126100e257602090600d549051908152f35b5080fd5b8390346100e25760203660031901126100e2576101189061011260018060a01b036001541633146107d1565b35610885565b80f35b5050346100e257816003193601126100e25760025490516001600160a01b039091168152602090f35b5050346100e257816003193601126100e257602090600b549051908152f35b90503461018b578260031936011261018b575490516001600160a01b03909116815260209150f35b8280fd5b5050346100e257816003193601126100e257602090600c549051908152f35b9190505f36600319011261034a5760018060a01b0360016101d4826001541633146107d1565b60025f541461041f5760025f55600354845483169083161461040d578160035416938351946370a0823160e01b93848752308388015260209360249285898581845afa988915610386575f996103de575b5087519167ffffffffffffffff9160608401838111858210176103cc578a5260028452878401908a368337858854168551156103ba5782528451600110156103a8578a850152846002541691823b1561034a57908a5194859263b6f9de9560e01b845260848401915f8b86015260808a8601525180925260a4840192915f5b8c8282106103905750505050509181805f94306044830152426064830152039134905af180156103865761035e575b505090839291600354169486519586938492835230908301525afa92831561035557508492610321575b50506103159061031a9261030f610af5565b91610c96565b610b7a565b6001815580f35b90809250813d831161034e575b6103388183610806565b8101031261034a5751816103156102fd565b5f80fd5b503d61032e565b513d86823e3d90fd5b9080929950116103735785525f9683886102d3565b50634e487b7160e01b5f90815260418352fd5b88513d5f823e3d90fd5b84518b168652899650948501949093019282016102a4565b86603289634e487b7160e01b5f52525ffd5b8760328a634e487b7160e01b5f52525ffd5b86604189634e487b7160e01b5f52525ffd5b9098508581813d8311610406575b6103f68183610806565b8101031261034a5751975f610225565b503d6103ec565b5050505061041a34610b7a565b61031a565b825162461bcd60e51b815260208186015260096024820152681c99595b9d1c985b9d60ba1b6044820152606490fd5b823461034a575f36600319011261034a57602090600a549051908152f35b823461034a575f36600319011261034a5760035490516001600160a01b039091168152602090f35b823461034a575f36600319011261034a57602090516a0c097ce7bc90715b34b9f160241b8152f35b823461034a575f36600319011261034a57602090600e549051908152f35b823461034a575f36600319011261034a576020906009549051908152f35b823461034a5736600319011261034a5761051d60018060a01b036001541633146107d1565b35600d55602435600e55005b823461034a575f36600319011261034a57602090600f549051908152f35b90503461034a578160031936011261034a578035916001600160a01b03808416929083850361034a5760243594610583826001541633146107d1565b845f52600592602092848452855f20546107c3575b87158015806107b2575b1561066a57505060065490865f526007845281865f2055680100000000000000008210156106575750600195966106126a0c097ce7bc90715b34b9f160241b936105f4848a61064a960160065561083c565b90919060018060a01b038084549260031b9316831b921b1916179055565b6106338161062e6009548b5f52888852895f205461030f610af5565b610b36565b600955875f5284845280865f2055600c5490610d26565b04945f52525f2001555f80f35b604190634e487b7160e01b5f525260245ffd5b909250806107a0575b610695575b50506a0c097ce7bc90715b34b9f160241b61064a60019596610612565b6006545f19919082810190811161078d576106b26106ec9161083c565b9054895f5260078752856106c88a5f205461083c565b92909360031b1c169060018060a01b038084549260031b9316831b921b1916179055565b865f5260078452855f205460065483810190811161077a5761070e859161083c565b90549060031b1c165f5260078552865f20556006549081156107675750966a0c097ce7bc90715b34b9f160241b9261064a9260019899019061074f8261083c565b909182549160031b1b19169055600655969550610678565b603190634e487b7160e01b5f525260245ffd5b601183634e487b7160e01b5f525260245ffd5b601182634e487b7160e01b5f525260245ffd5b50855f52838352845f20541515610673565b50875f52858552865f2054156105a2565b6107cc83610977565b610598565b156107d857565b60405162461bcd60e51b815260206004820152600660248201526510aa27a5a2a760d11b6044820152606490fd5b90601f8019910116810190811067ffffffffffffffff82111761082857604052565b634e487b7160e01b5f52604160045260245ffd5b6006548110156108715760065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01905f90565b634e487b7160e01b5f52603260045260245ffd5b60065490811561097357915f905a935b80831080610968575b15610961576108fe600f936108b3855461083c565b60018060a01b0391549060031b1c16805f52600860205260405f20546108dd4291600d5490610b29565b108061094e575b61093f575b506108f85a978861030f610af5565b90610b36565b949280545f19811461092b5760018691018083551015610922575b50939193610895565b5f90555f610919565b634e487b7160e01b5f52601160045260245ffd5b61094890610977565b5f6108e9565b5061095881610c33565b600e54106108e4565b5092505050565b5083600f541061089e565b5050565b61098081610c33565b80156109735761099281600b54610b36565b600b5560018060a01b0380921691825f526020916008835260409142835f2055838160035416826004541614155f14610a86575f9160035416604485518094819363a9059cbb60e01b83528a60048401528760248401525af18015610a7c57610a49575b506001926a0c097ce7bc90715b34b9f160241b610a3e610a256005945b885f528585526002875f200154610b36565b875f52848452855f2090600282015554600c5490610d26565b04945f52525f200155565b8381813d8311610a75575b610a5e8183610806565b8101031261034a57518015150361034a575f6109f6565b503d610a54565b83513d5f823e3d90fd5b50505f80808084885af13d15610af0573d67ffffffffffffffff811161082857835190610abc601f8201601f1916870183610806565b81525f853d92013e5b15610aea576001926a0c097ce7bc90715b34b9f160241b610a3e610a25600594610a13565b50505050565b610ac5565b604051906040820182811067ffffffffffffffff82111761082857604052600782526639bab11037bb3360c91b6020830152565b9190820180921161092b57565b90610b419082610b29565b908110610b4b5790565b60405162461bcd60e51b815260206004820152600760248201526630b2321037bb3360c91b6044820152606490fd5b610b8681600a54610b36565b600a55600954908115908115610b9b57505050565b600c54916a0c097ce7bc90715b34b9f160241b9180830292830480820361092b5703610c0457610bd757610bd2926108f891610d08565b600c55565b60405162461bcd60e51b8152602060048201526005602482015264064697620360dc1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600760248201526636bab61037bb3360c91b6044820152606490fd5b6001600160a01b03165f81815260056020526040902054600c546a0c097ce7bc90715b34b9f160241b91610c679190610d26565b04905f526005602052600160405f2001549081811115610c9057610c8d9161030f610af5565b90565b50505f90565b91828211610cab5750810390811161092b5790565b6040519062461bcd60e51b82528160208060048301528251908160248401525f935b828510610cef575050604492505f838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610ccd565b8115610d12570490565b634e487b7160e01b5f52601260045260245ffd5b908115610c905780820291808304820361092b57610d449083610d08565b03610c04579056fea26469706673582212207d6f51dde43e86cefc4136704b87dc3d94f8492a844512162607bf1577155a5864736f6c634300081600336080346100d457601f6110f238819003918201601f19168301916001600160401b038311848410176100d8578084926080946040528339810103126100d457610047816100ec565b90610054602082016100ec565b9161006d6060610066604085016100ec565b93016100ec565b9260015f55603c600d55620186a0600e5560018060a01b0319933385600154161760015560018060a01b03809481809416876002541617600255168560045416176004551683600354161760035516906010541617601055604051610ff190816101018239f35b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036100d45756fe60406080815260049081361015610014575f80fd5b5f915f3560e01c908163088ab8ce146107e157816314b6ca961461055b57816326987b601461053d5781632d48e8961461050c5781633a98ef39146104ee578163481c6a75146104c65781634fab0ae8146104a85781638d009fd81461048057816395cfbd7914610458578163997664d71461043a578163d0e30db0146101c4578163e2d2e219146101a5578163ef8ef56f14610179578163efca2eed1461015a578163f887ea4014610131578163ffb2c479146100fc575063ffd49c84146100db575f80fd5b346100f857816003193601126100f857602090600d549051908152f35b5080fd5b8390346100f85760203660031901126100f85761012e9061012860018060a01b03600154163314610a86565b35610b04565b80f35b5050346100f857816003193601126100f85760025490516001600160a01b039091168152602090f35b5050346100f857816003193601126100f857602090600b549051908152f35b9050346101a157826003193601126101a1575490516001600160a01b03909116815260209150f35b8280fd5b5050346100f857816003193601126100f857602090600c549051908152f35b9190505f3660031901126103655760018060a01b0360016101ea82600154163314610a86565b6101f860025f541415610a00565b60025f556003548454831690831614610428578160035416938351946370a0823160e01b93848752308388015260209360249285898581845afa9889156103a1575f996103f9575b5087519167ffffffffffffffff9160608401838111858210176103e7578a5260028452878401908a368337858854168551156103d55782528451600110156103c3578a850152846002541691823b1561036557908a5194859263b6f9de9560e01b845260848401915f8b86015260808a8601525180925260a4840192915f5b8c8282106103ab5750505050509181805f94306044830152426064830152039134905af180156103a157610379575b505090839291600354169486519586938492835230908301525afa9283156103705750849261033c575b5050610330906103359261032a610d64565b91610f05565b610de9565b6001815580f35b90809250813d8311610369575b6103538183610a38565b81010312610365575181610330610318565b5f80fd5b503d610349565b513d86823e3d90fd5b90809299501161038e5785525f9683886102ee565b50634e487b7160e01b5f90815260418352fd5b88513d5f823e3d90fd5b84518b168652899650948501949093019282016102bf565b86603289634e487b7160e01b5f52525ffd5b8760328a634e487b7160e01b5f52525ffd5b86604189634e487b7160e01b5f52525ffd5b9098508581813d8311610421575b6104118183610a38565b810103126103655751975f610240565b503d610407565b5050505061043534610de9565b610335565b8234610365575f36600319011261036557602090600a549051908152f35b8234610365575f3660031901126103655760035490516001600160a01b039091168152602090f35b8234610365575f36600319011261036557602090516a0c097ce7bc90715b34b9f160241b8152f35b8234610365575f36600319011261036557602090600e549051908152f35b8234610365575f3660031901126103655760105490516001600160a01b039091168152602090f35b8234610365575f366003190112610365576020906009549051908152f35b8234610365573660031901126103655761053160018060a01b03600154163314610a86565b35600d55602435600e55005b8234610365575f36600319011261036557602090600f549051908152f35b82346103655780600319360112610365576105746109ea565b906024359260018060a01b0361058f81600154163314610a86565b80841693845f52600592602092848452855f20546107d3575b87158015806107c2575b1561067a57505060065490865f526007845281865f2055680100000000000000008210156106675750600195966106226a0c097ce7bc90715b34b9f160241b93610604848a61065a9601600655610abb565b90919060018060a01b038084549260031b9316831b921b1916179055565b6106438161063e6009548b5f52888852895f205461032a610d64565b610da5565b600955875f5284845280865f2055600c5490610f95565b04945f52525f2001555f80f35b604190634e487b7160e01b5f525260245ffd5b909250806107b0575b6106a5575b50506a0c097ce7bc90715b34b9f160241b61065a60019596610622565b6006545f19919082810190811161079d576106c26106fc91610abb565b9054895f5260078752856106d88a5f2054610abb565b92909360031b1c169060018060a01b038084549260031b9316831b921b1916179055565b865f5260078452855f205460065483810190811161078a5761071e8591610abb565b90549060031b1c165f5260078552865f20556006549081156107775750966a0c097ce7bc90715b34b9f160241b9261065a9260019899019061075f82610abb565b909182549160031b1b19169055600655969550610688565b603190634e487b7160e01b5f525260245ffd5b601183634e487b7160e01b5f525260245ffd5b601182634e487b7160e01b5f525260245ffd5b50855f52838352845f20541515610683565b50875f52858552865f2054156105b2565b6107dc83610bf6565b6105a8565b90503461036557602080600319360112610365576107fd6109ea565b9061080c60025f541415610a00565b60025f556010546001600160a01b0390811633036109b4578060035416921692828414610981575f9083610886575b50907fe96b6db13aa975e21d9a8df8605edb226f40e15627a72d04e7921ddade6b544e91849551908152a36bffffffffffffffffffffffff60a01b600354161760035560015f555f80f35b85516370a0823160e01b8152308183015291508282602481875afa918215610948575f92610952575b5081806108bd575b5061083b565b61dead87519263a9059cbb60e01b8452830152602482015282816044815f885af1801561094857957fe96b6db13aa975e21d9a8df8605edb226f40e15627a72d04e7921ddade6b544e939291869761091b575b5095819293506108b7565b61093a90843d8611610941575b6109328183610a38565b810190610a6e565b5087610910565b503d610928565b86513d5f823e3d90fd5b9091508281813d831161097a575b61096a8183610a38565b81010312610365575190866108af565b503d610960565b60649185519162461bcd60e51b8352820152600f60248201526e2329221d1039b0b6b2903a37b5b2b760891b6044820152fd5b845162461bcd60e51b8152808501839052601060248201526f2329221d103737ba1036b0b730b3b2b960811b6044820152606490fd5b600435906001600160a01b038216820361036557565b15610a0757565b60405162461bcd60e51b81526020600482015260096024820152681c99595b9d1c985b9d60ba1b6044820152606490fd5b90601f8019910116810190811067ffffffffffffffff821117610a5a57604052565b634e487b7160e01b5f52604160045260245ffd5b90816020910312610365575180151581036103655790565b15610a8d57565b60405162461bcd60e51b815260206004820152600660248201526510aa27a5a2a760d11b6044820152606490fd5b600654811015610af05760065f527ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01905f90565b634e487b7160e01b5f52603260045260245ffd5b600654908115610bf257915f905a935b80831080610be7575b15610be057610b7d600f93610b328554610abb565b60018060a01b0391549060031b1c16805f52600860205260405f2054610b5c4291600d5490610d98565b1080610bcd575b610bbe575b50610b775a978861032a610d64565b90610da5565b949280545f198114610baa5760018691018083551015610ba1575b50939193610b14565b5f90555f610b98565b634e487b7160e01b5f52601160045260245ffd5b610bc790610bf6565b5f610b68565b50610bd781610ea2565b600e5410610b63565b5092505050565b5083600f5410610b1d565b5050565b610bff81610ea2565b908115610bf257610c1282600b54610da5565b600b5560018060a01b0380911691825f526020906008825260409242845f20558060035416816004541614155f14610cf357825f9160035416604486518094819363a9059cbb60e01b83528a60048401528760248401525af18015610ce957610cc1610ca860059460019796946a0c097ce7bc90715b34b9f160241b94610ccc575b505b885f528585526002875f200154610da5565b875f52848452855f2090600282015554600c5490610f95565b04945f52525f200155565b610ce290863d8811610941576109328183610a38565b505f610c94565b84513d5f823e3d90fd5b505f80808084889796975af13d15610d5f573d67ffffffffffffffff8111610a5a57835190610d2b601f8201601f1916870183610a38565b81525f853d92013e5b15610d59576001926a0c097ce7bc90715b34b9f160241b610cc1610ca8600594610c96565b50505050565b610d34565b604051906040820182811067ffffffffffffffff821117610a5a57604052600782526639bab11037bb3360c91b6020830152565b91908201809211610baa57565b90610db09082610d98565b908110610dba5790565b60405162461bcd60e51b815260206004820152600760248201526630b2321037bb3360c91b6044820152606490fd5b610df581600a54610da5565b600a55600954908115908115610e0a57505050565b600c54916a0c097ce7bc90715b34b9f160241b91808302928304808203610baa5703610e7357610e4657610e4192610b7791610f77565b600c55565b60405162461bcd60e51b8152602060048201526005602482015264064697620360dc1b6044820152606490fd5b60405162461bcd60e51b815260206004820152600760248201526636bab61037bb3360c91b6044820152606490fd5b6001600160a01b03165f81815260056020526040902054600c546a0c097ce7bc90715b34b9f160241b91610ed69190610f95565b04905f526005602052600160405f2001549081811115610eff57610efc9161032a610d64565b90565b50505f90565b91828211610f1a57508103908111610baa5790565b6040519062461bcd60e51b82528160208060048301528251908160248401525f935b828510610f5e575050604492505f838284010152601f80199101168101030190fd5b8481018201518686016044015293810193859350610f3c565b8115610f81570490565b634e487b7160e01b5f52601260045260245ffd5b908115610eff57808202918083048203610baa57610fb39083610f77565b03610e73579056fea2646970667358221220c876b5672b3a1ef080a791f3847009c62cd891e2f4e499251252d0c9a00baf8d64736f6c63430008160033000000000000000000000000efd766ccb38eaf1dfd701853bfce31359239f30500000000000000000000000098bf93ebf5c380c0e6ae8e192a7e2ae08edacc02000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000f44b4560d92ac2dbc633caac846782a894d5acca000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f44b4560d92ac2dbc633caac846782a894d5acca00000000000000000000000000000000000000000000000000000000000000094d696e7461626c657300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f09f8ca8efb88f00000000000000000000000000000000000000000000000000

Deployed ByteCode

0x6080604081815260049182361015610021575b505050361561001f575f80fd5b005b5f925f3560e01c91826303fd2a451461163e575081630445b6671461162057816304a66b481461158057816305d57250146114f75781630614117a1461149957816306fdde03146113d8578163095ea7b31461136957816309dd7eac146113405781630dab537114611317578163180b0d7e146112f857816318160ddd146112d9578163191e2760146112ac5781631df4ccfc1461128d57816323b872dd146111e15781632d99d32e146111225781632e0d9936146110f9578163313ce567146110dd57816335e67e1d146110ab5781633e9fd9411461108c5781633f4218e01461104e57816342966c68146110305781634355855a14610df557816346d8ed0c14611011578163571ac8b014610fa257816358fa63ca14610f875781635a51312614610e845781635c85974f14610e5257816360e7196214610e3357816364acc50e14610df5578163658d4b7f14610d945781636b67c4df14610d755781636ddd171314610d5157816370a0823114610d19578163759c066d14610cf057816379cc679014610c3d5781637d1db4a514610c1e57816383ad799414610c00578163893d20e814610bd857816389c932a514610b9a5781638a30104a14610ae45781638b42507f14610aa65781639234a45414610a8757816393e8e0b4146109e757816395d89b41146108e257816398118cb4146108c35781639d1944f514610859578163a1433c681461078b578163a3a649a914610762578163a8aa1b3114610739578163a9059cbb14610706578163b0249cc6146106c8578163dc35c53b14610667578163dd62ed3e1461061a578163df20fd49146105ca578163ec19f44a14610553578163ed665e9114610534578163ef8ef56f1461050b578163f2fde38b1461044d578163f708a64f1461038f57508063f84ba65d1461032c578063f887ea40146103045763fe53b2f3146102da5780610012565b346103005781600319360112610300576020805491516001600160a01b03909216825290f35b5080fd5b503461030057816003193601126103005760165490516001600160a01b039091168152602090f35b503461030057806003193601126103005761038c90610349611658565b906103526116cb565b91338552600160205261036a60ff83872054166116da565b60018060a01b03168452601260205283209060ff801983541691151516179055565b80f35b839150346103005782600319360112610300576103aa611658565b906103b36116cb565b9033845260016020526103cb60ff86862054166116da565b6001600160a01b038316903082141580610437575b1561040f575090839461040a9261038c9552601360205285209060ff801983541691151516179055565b6121e5565b606490602087519162461bcd60e51b835282015260026024820152614e4160f01b6044820152fd5b50818552601560205260ff8686205416156103e0565b9190503461050757602036600319011261050757610469611658565b8354926001600160a01b03919082851633036104db5750917f04dba622d284ed0014ee4b9a6a68386be1a4c08a4913ae272de89199cc68616393916020931680926bffffffffffffffffffffffff60a01b1617855581855260018352808520600160ff1982541617905551908152a180f35b606490602085519162461bcd60e51b8352820152600660248201526510a7aba722a960d11b6044820152fd5b8280fd5b50503461030057816003193601126103005760185490516001600160a01b039091168152602090f35b5050346103005781600319360112610300576020906003549051908152f35b91905034610507576020366003190112610507577f7abd714e3c67bc9d590b6661d081e86b8e6443c95741b0fa43b5bc8183a6b41a913533845260016020526105a160ff83862054166116da565b6009819055600a5491519081526001600160a01b03909116602082015280604081015b0390a180f35b90503461050757816003193601126105075735908115158092036106165760ff6105ff913385526001602052842054166116da565b60ff8019601b5416911617601b5560243560195580f35b5f80fd5b505034610300578060031936011261030057602091610637611658565b8261064061166e565b6001600160a01b03928316845260108652922091165f908152908352819020549051908152f35b50503461030057806003193601126103005761038c90610685611658565b9061068e6116cb565b9133855260016020526106a660ff83872054166116da565b60018060a01b03168452601460205283209060ff801983541691151516179055565b5050346103005760203660031901126103005760209160ff9082906001600160a01b036106f3611658565b1681526015855220541690519015158152f35b505034610300578060031936011261030057602090610730610726611658565b6024359033611866565b90519015158152f35b50503461030057816003193601126103005760175490516001600160a01b039091168152602090f35b505034610300578160031936011261030057601f5490516001600160a01b039091168152602090f35b505034610300576060366003190112610300576107a6611658565b6107ae61166e565b9060443560018060a01b039384821680920361061657847f5a64c5bc1b0d5f2ae21fa83404fc39f9481e787dc0167ff23a48c9395e4ab18e95606095338952600160205261080160ff858b2054166116da565b601d54610100600160a81b038760081b1690610100600160a81b03191617601d551690836bffffffffffffffffffffffff60a01b8381601e541617601e55601f541617601f558251941684526020840152820152a180f35b90503461050757602036600319011261050757803591338452600160205261088660ff82862054166116da565b6301c9c38083101561089a575050601c5580f35b906020606492519162461bcd60e51b8352820152600360248201526267617360e81b6044820152fd5b5050346103005781600319360112610300576020906005549051908152f35b9190503461050757826003193601126105075780519183600c54906001908260011c926001811680156109dd575b60209586861082146109ca57508488529081156109a8575060011461094f575b61094b8686610941828b03836117cf565b5191829182611684565b0390f35b929550600c83527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c75b828410610995575050508261094b9461094192820101945f610930565b8054868501880152928601928101610978565b60ff191687860152505050151560051b83010192506109418261094b5f610930565b634e487b7160e01b845260229052602483fd5b93607f1693610910565b505034610300576020366003190112610300577f7abd714e3c67bc9d590b6661d081e86b8e6443c95741b0fa43b5bc8183a6b41a90610a24611658565b903384526001602052610a3c60ff82862054166116da565b6001600160a01b038216610a518115156117f1565b600a80546001600160a01b03191691909117905560095490519081526001600160a01b03909116602082015280604081016105c4565b5050346103005781600319360112610300576020906009549051908152f35b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610ad1611658565b1681526012855220541690519015158152f35b83915034610300576020366003190112610300578035923383526001602052610b1260ff82852054166116da565b61271084101580610b8d575b15610b6257508260085560075490601e840293808504601e1490151715610b4f5750606461038c9293041015611753565b634e487b7160e01b835260119052602482fd5b906020606492519162461bcd60e51b8352820152600560248201526472616e676560d81b6044820152fd5b50620f4240841115610b1e565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610bc5611658565b1681526014855220541690519015158152f35b505034610300578160031936011261030057905490516001600160a01b039091168152602090f35b90503461050757826003193601126105075760209250549051908152f35b505034610300578160031936011261030057602090600e549051908152f35b838334610300578060031936011261030057610c57611658565b6024359160018060a01b03821690818552602060108152818620335f528152815f205496858810610cc75750610cb061038c969786845191610c98836117b3565b600783526639bab11037bb3360c91b85840152611830565b9287526010815281872090335f52525f205561210f565b915162461bcd60e51b8152918201526005602482015264616c6c6f7760d81b6044820152606490fd5b505034610300578160031936011261030057601e5490516001600160a01b039091168152602090f35b5050346103005760203660031901126103005760209181906001600160a01b03610d41611658565b168152600f845220549051908152f35b50503461030057816003193601126103005760209060ff601b541690519015158152f35b5050346103005781600319360112610300576020906002549051908152f35b50503461030057806003193601126103005761038c90610db2611658565b90610dbb6116cb565b913385526001602052610dd360ff83872054166116da565b60018060a01b03168452601160205283209060ff801983541691151516179055565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03610e20611658565b1681526013855220541690519015158152f35b505034610300578160031936011261030057602090601c549051908152f35b919050346105075760203660031901126105075760ff610e7d913385526001602052842054166116da565b35600e5580f35b91905034610507578060031936011261050757610e9f611658565b906024359033855260209260018452610ebd60ff83882054166116da565b6001600160a01b0316938415610f51578215610f1c575091818593610ef25f8051602061286283398151915294600d546121a1565b600d55858552600f8352610f0982828720546121a1565b868652600f84528186205551908152a380f35b83606492519162461bcd60e51b835282015260116024820152701b5a5b9d0e881e995c9bc8185b5bdd5b9d607a1b6044820152fd5b83606492519162461bcd60e51b835282015260126024820152716d696e743a207a65726f206164647265737360701b6044820152fd5b50503461030057816003193601126103005751908152602090f35b50503461030057602036600319011261030057602090610fc0611658565b335f5260108352815f209060018060a01b031690815f5283525f1980835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b5050346103005781600319360112610300576020906006549051908152f35b8390346103005760203660031901126103005761038c90353361210f565b5050346103005760203660031901126103005760209160ff9082906001600160a01b03611079611658565b1681526011855220541690519015158152f35b505034610300578160031936011261030057602090601a549051908152f35b919050346105075760203660031901126105075760ff6110d6913385526001602052842054166116da565b35601a5580f35b5050346103005781600319360112610300576020905160128152f35b50503461030057816003193601126103005760215490516001600160a01b039091168152602090f35b5050346103005780600319360112610300577f9a05f836a81b64d2d3ee62b752e87947ab26a9fdcd5b2572b1744ae8499b3aac9061115e611658565b6111666116cb565b90338552600160205261117e60ff84872054166116da565b6001600160a01b0316906111938215156117f1565b8185526015602052806111b4818588209060ff801983541691151516179055565b6111c9575b825191825215156020820152a180f35b6013602052828520805460ff191660011790556111b9565b505034610300576060366003190112610300576107306111ff611658565b61120761166e565b6044359160018060a01b0381168087528560209760108952818120335f5289525f19825f20540361123b575b505050611866565b82815260108952818120335f528952611274825f20548784519161125e836117b3565b6005835264616c6c6f7760d81b8d840152611830565b9281526010895220335f528752855f20555f8581611233565b5050346103005781600319360112610300576020906007549051908152f35b505034610300578160031936011261030057601d54905160089190911c6001600160a01b03168152602090f35b505034610300578160031936011261030057602090600d549051908152f35b5050346103005781600319360112610300576020906008549051908152f35b50503461030057816003193601126103005760225490516001600160a01b039091168152602090f35b505034610300578160031936011261030057600a5490516001600160a01b039091168152602090f35b505034610300578060031936011261030057602090611386611658565b602435335f5260108452825f209160018060a01b031691825f52845280835f205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b9190503461050757826003193601126105075780519183600b54906001908260011c9260018116801561148f575b60209586861082146109ca57508488529081156109a857506001146114365761094b8686610941828b03836117cf565b929550600b83527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db95b82841061147c575050508261094b9461094192820101945f610930565b805486850188015292860192810161145f565b93607f1693611406565b50503461030057816003193601126103005733825260016020526114c260ff82842054166116da565b8180808060018060a01b0381541647908282156114ee575bf1156114e4575080f35b51903d90823e3d90fd5b506108fc6114da565b9190503461061657602036600319011261061657611513611658565b335f52600160205261152a60ff835f2054166116da565b6022546001600160a01b03908116803b15610616575f9283602492865197889586946304455c6760e11b865216908401525af1908115611577575061156d575080f35b61001f915061178b565b513d5f823e3d90fd5b82346106165760a0366003190112610616576115e3906115de83356115de6024356115de60443591606435946115c660ff60843599335f5260016020525f2054166116da565b808a5581600555836002558560035587600655611714565b611714565b8060075560085491601e830292808404601e149015171561160d5750606461001f92041015611753565b601190634e487b7160e01b5f525260245ffd5b8234610616575f366003190112610616576020906019549051908152f35b34610616575f366003190112610616578061dead60209252f35b600435906001600160a01b038216820361061657565b602435906001600160a01b038216820361061657565b602080825282518183018190529093925f5b8281106116b757505060409293505f838284010152601f8019910116010190565b818101860151848201604001528501611696565b60243590811515820361061657565b156116e157565b60405162461bcd60e51b815260206004820152600b60248201526a085055551213d49256915160aa1b6044820152606490fd5b9190820180921161172157565b634e487b7160e01b5f52601160045260245ffd5b811561173f570490565b634e487b7160e01b5f52601260045260245ffd5b1561175a57565b60405162461bcd60e51b8152602060048201526009602482015268666565203e2033302560b81b6044820152606490fd5b67ffffffffffffffff811161179f57604052565b634e487b7160e01b5f52604160045260245ffd5b6040810190811067ffffffffffffffff82111761179f57604052565b90601f8019910116810190811067ffffffffffffffff82111761179f57604052565b156117f857565b606460405162461bcd60e51b81526020600482015260046024820152637a65726f60e01b6044820152fd5b9190820391821161172157565b92919280821161184857611845929350611823565b90565b60405162461bcd60e51b8152806118628660048301611684565b0390fd5b601d5460ff925f91841661208a57600e54851180159061206a575b1561203a576001600160a01b0381165f81815260156020526040902054909590851680612027575b8061200b575b80611ff3575b601a548210801590611fd3575b81611fc7575b81611fad575b81611fa5575b50611a7c575b9061040a6119729260018060a01b03861696878652600f60205261191f6040872054836040519161190a836117b3565b600383526218985b60ea1b6020840152611830565b888752600f60205260408720556011602052604086205416155f14611a76576119489086612429565b945b878552600f6020526119608660408720546121a1565b888652600f60205260408620556121e5565b60018060a01b0360205416601c54813b156105075782604051818160248163ffb2c47960e01b978882528760048301525afa611a62575b50506021546001600160a01b031690813b15611a4a5783809260248293604051948593849289845260048401525af1611a4e575b5050602254601c546001600160a01b0390911691823b15611a4a579060248492836040519586948593845260048401525af1611a33575b505060205f8051602061286283398151915291604051908152a3600190565b611a3d829161178b565b611a475780611a14565b80fd5b8380fd5b611a579061178b565b61030057815f6119dd565b611a6b9061178b565b61050757825f6119a9565b9461194a565b60ff19600181601d541617601d55601954611a9981600d546121a1565b600d55305f52600f602052611ab28160405f20546121a1565b305f52600f60205260405f20556040519081525f5f8051602061286283398151915260203093a3601954600554611ae981836125e6565b90611af8600792835490612641565b60011c91611b26604051611b0b816117b3565b828152846639bab11037bb3360c91b96876020840152611830565b601d5460029391479160081c6001600160a01b03168015158e81611f9c575b601e546001600160a01b03168015159889611f8e575b601f546001600160a01b03169182151591611b7e90859084611f80575b16612347565b9a60019530611b8c8e612379565b52611f66575b611bb8959650611f4a575b50611f2e575b506018546001600160a01b03169216876123aa565b526016546001600160a01b0316803b1561061657611bf65f9291839260405194858094819363791ac94760e01b83526004809d4292309286016123be565b03925af18015611f2357611f10575b506040514791611c14826117b3565b848252876020830152611c2692611830565b9183549560025491611c388389611714565b93806003549586611c4891611714565b90611c5291611714565b8160011c611c5f91611823565b8080611c6c81948a6125e6565b90611c7691612641565b60011c9a611c8490896125e6565b90611c8e91612641565b94611c9990886125e6565b90611ca391612641565b94611cae90876125e6565b90611cb891612641565b8095604051611cc6816117b3565b8381528a856020830152611cd992611830565b604051611ce5816117b3565b83815285856020830152611cf892611830565b604051611d04816117b3565b83815286856020830152611d1792611830565b9260405192611d25846117b3565b83526020830152611d3592611830565b9080611ec2575b50611d478183611714565b611e6a575b505080611e18575b5081151580611e0f575b611d75575b5050601d8054909216909155506118da565b9060c460609260018060a01b03601654169460018060a01b038a541695604051968795869463f305d71960e01b8652309086015260248501528b60448501528b606485015260848401524260a48401525af18015611e0457611dd9575b8080611d63565b606090813d8311611dfd575b611def81836117cf565b81010312611a4a575f611dd2565b503d611de5565b6040513d87823e3d90fd5b50821515611d5e565b6022546001600160a01b0316803b15611e6657908880928460405180948193630d0e30db60e41b83525af1611e4e575b50611d54565b611e579061178b565b611e6257865f611e48565b8680fd5b8880fd5b6020546001600160a01b031691611e819190611714565b90803b15611ebe57908980928560405180948193630d0e30db60e41b83525af115611d4c57611eaf9061178b565b611eba57875f611d4c565b8780fd5b8980fd5b6021546001600160a01b0316803b15611f0c57908b80928760405180948193630d0e30db60e41b83525af1611ef8575b50611d3c565b611f019061178b565b611ebe57895f611ef2565b8b80fd5b611f1b919a5061178b565b5f985f611c05565b6040513d5f823e3d90fd5b611f4382611f3b8661231e565b95168a6123aa565b525f611ba3565b611f5f84611f578861231e565b97168c6123aa565b525f611b9d565b611bb89550600296611f778d61239a565b52869550611b92565b611f899061231e565b611b78565b611f979061231e565b611b5b565b60039750611b45565b90505f6118d4565b9050305f52600f60205260405f20546019541115906118ce565b601b54871691506118c8565b506001600160a01b0385165f9081526014602052604090205486166118c2565b506016546001600160a01b03858116911614156118b5565b506001600160a01b0384165f90815260409020548516156118af565b506001600160a01b0384163014156118a9565b60405162461bcd60e51b81526020600482015260086024820152671516081b1a5b5a5d60c21b6044820152606490fd5b506001600160a01b0383165f908152601260205260409020548416611881565b935f805160206128628339815191529293506020915060018060a01b0380941693845f52600f83526040956120dd875f2054848951916120c9836117b3565b600383526218985b60ea1b88840152611830565b865f52600f8552875f20551694855f526120fa82825f20546121a1565b865f52600f8452815f205551908152a3600190565b905f8051602061286283398151915260205f9360018060a01b031692838552600f825261215d60408620548260405191612148836117b3565b6004835263313ab93760e11b86840152611830565b848652600f83526040862055612195600d54826040519161217d836117b3565b600783526639bab11037bb3360c91b86840152611830565b600d55604051908152a3565b906121ac9082611714565b9081106121b65790565b60405162461bcd60e51b815260206004820152600760248201526630b2321037bb3360c91b6044820152606490fd5b6001600160a01b038082165f908152601360205260408120549092919060ff161561230e575f915b816020541691823b1561061657604051630a5b654b60e11b8082526001600160a01b038416600483015260248201869052935f90829060449082905afa6122fb575b508060215416803b156122f7576040518481526001600160a01b038416600482015260248101869052869182908290604490829084905af16122e3575b50506022541691823b156122df576040519081526001600160a01b03919091166004820152602481019290925282908290604490829084905af16122ce575050565b6122d8829161178b565b611a475750565b8480fd5b6122ec9061178b565b6122df57845f61228c565b8580fd5b61230691955061178b565b5f935f61224f565b600f60205260405f20549161220d565b60ff1660ff81146117215760010190565b67ffffffffffffffff811161179f5760051b60200190565b906123518261232f565b61235e60405191826117cf565b828152809261236f601f199161232f565b0190602036910137565b8051156123865760200190565b634e487b7160e01b5f52603260045260245ffd5b8051600110156123865760400190565b80518210156123865760209160051b010190565b91909493929460a083019083526020905f602085015260a060408501528251809152602060c085019301915f5b82811061240c5750505050906080919460018060a01b031660608201520152565b83516001600160a01b0316855293810193928101926001016123eb565b90612436600754826125e6565b916124596124476008548095612641565b93612454600954856125e6565b612641565b61246381856121a1565b9182156125de57838310156125a957846118459561255d575b50816124da575b505061249d612494600654846125e6565b60085490612641565b806124ca575b50604051916124b1836117b3565b600783526639bab11037bb3360c91b6020840152611830565b6124d4903061210f565b5f6124a3565b61254f90305f52600f6020526124f48360405f20546121a1565b305f52600f60205260405f205560018060a01b0380821690604051858152825f8051602061286283398151915260203093a3600a5416905f52601560205260ff60405f2054169060ff1994600186601d541617601d5561267e565b601d5416601d555f80612483565b305f52600f6020526125738160405f20546121a1565b305f52600f60205260405f205560405190815230905f80516020612862833981519152602060018060a01b03851692a35f61247c565b60405162461bcd60e51b815260206004820152600d60248201526c0cccacae640e8dede40d0d2ced609b1b6044820152606490fd5b505050905090565b90811561263b57808202918083048203611721576126049083611735565b0361260c5790565b60405162461bcd60e51b815260206004820152600760248201526636bab61037bb3360c91b6044820152606490fd5b50505f90565b9080156126515761184591611735565b60405162461bcd60e51b8152602060048201526005602482015264064697620360dc1b6044820152606490fd5b91909282158015612850575b61284a5781612831575b50156127df57601d5460081c6001600160a01b039081169190821515906002826127d7575b81601e54169081151591826127c7575b83601f5416926126e360ff8515159485611f805716612347565b97600196306126f18b612379565b526127a3575b509160ff939161271a9593612787575b5061276b575b50601854169216846123aa565b525b6016546001600160a01b0316803b1561061657612755935f80946040519687958694859363791ac94760e01b85524292600486016123be565b03925af16127605750565b6127699061178b565b565b612780836127788761231e565b9616886123aa565b525f61270d565b61279c856127948961231e565b98168a6123aa565b525f612707565b95509160ff939161271a95936002976127bb8b61239a565b529193955091936126f7565b906127d19061231e565b906126c9565b5060036126b9565b604051906060820182811067ffffffffffffffff82111761179f57604052600282526040366020840137813061281482612379565b526018546001600160a01b03169061282b9061239a565b5261271c565b6017546001600160a01b0391821691161490505f612694565b50505050565b506001600160a01b0384161561268a56feddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220cebf121004318030e37b0ffd0c61146f6730a4861b3ba6d90dc7daf39893b54364736f6c63430008160033