ETH Price: $3,387.96 (+0.92%)

Token

Baby $DIE (BDIE)
 

Overview

Max Total Supply

885,000,000 BDIE

Holders

144

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
759,323.499158708635875935 BDIE

Value
$0.00
0xbd0dfe5f9441029c6ba3b0dfa75dcb811ba158bf
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Baby$DIE

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 830 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-10-21
*/

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

error Unauthorized();
error InsufficientBalance();
error NonContractCall();
error NeedLiquidity();
error MaxTaxExceeded(uint8 _MAX_TAX);
error BlacklistTimerExceeded();
error AlreadyBlacklisted();
error AlreadyUnblacklisted();
error AlreadyMaxTier();
error AlreadyBaseTier();
error MaxBuyExceeded(uint256 _maxBuy);
error MaxSellExceeded(uint256 _maxSell);
error MaxBalanceExceeded(uint256 _maxBalance);
error UserBlacklisted();
error LiquidityLocked(uint256 unlockInSeconds);
error InvalidInput();

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function decimals() external view returns (uint8);

    function symbol() external view returns (string memory);

    function name() external view returns (string memory);

    function getOwner() external view returns (address);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount)
        external
        returns (bool);

    function allowance(address _owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

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

interface IUniSwapERC20 {
    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender)
        external
        view
        returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

interface IUniSwapFactory {
    event PairCreated(
        address indexed token0,
        address indexed token1,
        address pair,
        uint256
    );

    function feeTo() external view returns (address);

    function feeToSetter() external view returns (address);

    function getPair(address tokenA, address tokenB)
        external
        view
        returns (address pair);

    function allPairs(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB)
        external
        returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

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

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

    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETH(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountToken, uint256 amountETH);

    function removeLiquidityWithPermit(
        address tokenA,
        address tokenB,
        uint256 liquidity,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountA, uint256 amountB);

    function removeLiquidityETHWithPermit(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountToken, uint256 amountETH);

    function swapExactTokensForTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapTokensForExactTokens(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactETHForTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function swapTokensForExactETH(
        uint256 amountOut,
        uint256 amountInMax,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapExactTokensForETH(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external returns (uint256[] memory amounts);

    function swapETHForExactTokens(
        uint256 amountOut,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable returns (uint256[] memory amounts);

    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function quote(
        uint256 amountA,
        uint256 reserveA,
        uint256 reserveB
    ) external pure returns (uint256 amountB);

    function getamountOut(
        uint256 amountIn,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountOut);

    function getamountIn(
        uint256 amountOut,
        uint256 reserveIn,
        uint256 reserveOut
    ) external pure returns (uint256 amountIn);

    function getamountsOut(uint256 amountIn, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);

    function getamountsIn(uint256 amountOut, address[] calldata path)
        external
        view
        returns (uint256[] memory amounts);
}

interface IUniSwapRouter02 is IUniSwapRouter01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline,
        bool approveMax,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (uint256 amountETH);

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

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

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

abstract contract Ownable {
    address private _owner;

    event OwnershipTransferred(
        address indexed previousOwner,
        address indexed newOwner
    );

    constructor() {
        address msgSender = msg.sender;
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    function owner() public view returns (address) {
        return _owner;
    }

    function _onlyOwner() private view {
        if (owner() != msg.sender) revert Unauthorized();
    }

    modifier onlyOwner() {
        _onlyOwner();
        _;
    }

    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    function transferOwnership(address newOwner) public onlyOwner {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }
    
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) revert InsufficientBalance();
        (bool success, ) = recipient.call{value: amount}("");
        require(success);
    }

    function functionCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return
            functionCallWithValue(
                target,
                data,
                value,
                "Address: low-level call with value failed"
            );
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        if (address(this).balance < value) revert InsufficientBalance();
        if (!isContract(target)) revert NonContractCall();
        (bool success, bytes memory returndata) = target.call{value: value}(
            data
        );
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionStaticCall(address target, bytes memory data)
        internal
        view
        returns (bytes memory)
    {
        return
            functionStaticCall(
                target,
                data,
                "Address: low-level static call failed"
            );
    }

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (!isContract(target)) revert NonContractCall();
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function functionDelegateCall(address target, bytes memory data)
        internal
        returns (bytes memory)
    {
        return
            functionDelegateCall(
                target,
                data,
                "Address: low-level delegate call failed"
            );
    }

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        if (!isContract(target)) revert NonContractCall();
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

library EnumerableSet {
    struct Set {
        bytes32[] _values;
        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {
        uint256 valueIndex = set._indexes[value];
        if (valueIndex != 0) {
            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;
            bytes32 lastvalue = set._values[lastIndex];
            set._values[toDeleteIndex] = lastvalue;
            set._indexes[lastvalue] = valueIndex;
            set._values.pop();
            delete set._indexes[value];
            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value)
        private
        view
        returns (bool)
    {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index)
        private
        view
        returns (bytes32)
    {
        require(
            set._values.length > index,
            "EnumerableSet: index out of bounds"
        );
        return set._values[index];
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index)
        internal
        view
        returns (bytes32)
    {
        return _at(set._inner, index);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index)
        internal
        view
        returns (address)
    {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value)
        internal
        returns (bool)
    {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value)
        internal
        view
        returns (bool)
    {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index)
        internal
        view
        returns (uint256)
    {
        return uint256(_at(set._inner, index));
    }
}

contract Baby$DIE is IERC20, Ownable {
    using Address for address;
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(address => uint256) private _balances;
    mapping(address => mapping(address => uint256)) private _allowances;
    mapping(address => bool) public isBlacklisted;
    mapping(address => bool) public isWhitelisted;
    mapping(address => bool) public taxExempt;
    mapping(address => bool) public limitExempt;
    mapping(address => bool) public tier2;
    mapping(address => bool) public tier3;

    // add mapping store all holder information
    uint256 public totalTokenHolderHistory = 0;  
    mapping (uint256=> address ) public tokenHolderHistory;
    mapping (address=> bool ) public addedToTokenHolderHistory; 

    EnumerableSet.AddressSet private _excluded;
    EnumerableSet.AddressSet private _excludedFromStaking;

    string private _name = "Baby $DIE";
    string private _symbol = "BDIE";
    uint256 private constant INITIAL_SUPPLY = 1_000_000_000 * 10**TOKEN_DECIMALS;
    uint256 private _circulatingSupply;
    uint8 private constant TOKEN_DECIMALS = 18;
    uint8 public constant MAX_TAX = 10; //Team can never set tax higher than this value
    address private constant BURN_ADDRESS =
        0x000000000000000000000000000000000000dEaD;

    struct TaxRatios {
        uint8 burn;
        uint8 buyback;
        uint8 Team;
        uint8 liquidity;
        uint8 Events;
        uint8 Marketing;
        uint8 rewards;
    }

    struct TaxWallets {
        address Team;
        address Events;
        address Marketing;
    }

    struct MaxLimits {
        uint256 maxWallet;
        uint256 maxSell;
        uint256 maxBuy;
    }

    struct LimitRatios {
        uint16 wallet;
        uint16 sell;
        uint16 buy;
        uint16 divisor;
    }

    struct TierTaxes {
        uint8 first;
        uint8 second;
        uint8 third;
    }

    TierTaxes public _buyTaxes = TierTaxes({first: 5, second: 5, third: 5});

    TierTaxes public _sellTaxes = TierTaxes({first: 5, second: 5, third: 5});


    TaxRatios public _taxRatios =
        TaxRatios({
            burn: 0,
            buyback: 0,
            Team: 0,
            liquidity: 40,
            Events: 0,
            Marketing: 60,
            rewards: 0
            //@Team. These are ratios and the divisor will  be set automatically
        });

    TaxWallets public _taxWallet =
        TaxWallets({
            Team: 0x0d7D4e9Bbe63c1FE7888EF65A1Bd4F34163857A8,
            Events: 0x0d7D4e9Bbe63c1FE7888EF65A1Bd4F34163857A8,
            Marketing: 0x0d7D4e9Bbe63c1FE7888EF65A1Bd4F34163857A8
        });

    MaxLimits public _limits;

    LimitRatios public _limitRatios =
        LimitRatios({wallet: 4, sell: 4, buy: 4, divisor: 200});

    uint8 private totalTaxRatio;
    uint8 private totalSwapRatio;
    uint8 private distributeRatio;

    //launchTransferTax -- used to stop transfer of whitelisted tokens
    uint256 launchTransferTax = 99;

    //these values must add up to 100
    uint8 private mainRewardSplit = 100;
    uint8 private miscRewardSplit = 0;

    uint256 private _liquidityUnlockTime;

    //Antibot variables
    bool public isLaunched;
    uint256 private launchBlock;
    uint256 private launchTime;
    uint256 private blacklistWindow = 24 hours;
    uint8 private constant BLACKLIST_BLOCKS = 0; //number of blocks that will be included in auto blacklist
    uint8 private snipersRekt; //variable to track number of snipers auto blacklisted
    bool private blacklistEnabled = true; //blacklist can be enabled/disabled in case something goes wrong
    bool private revertSameBlock = true; //block same block buys

    bool private dynamicBurn = false;
    //dynamicBurn = true will burn all extra sell tax from dynamicSells
    //dynamicBurn = false will divert all extra sell tax to swaps

    bool private dynamicSellsEnabled = false;
    //dynamic sells will increase tax based on price impact
    //any sells over 1% price impact will incur extra sell tax
    //max extra sell tax is 10% when price impact >= 10%

    bool private dynamicLimits = false;
    //dynamicLimits = true will change MaxLimits based on circulating supply rather than total supply

    bool private dynamicLiqEnabled = false;
    //dynamicLiqEnabled = true will stop autoLP if targetLiquidityRatio is met
    //tax meant for liquidity will be redirected to other swap taxes in this case

    uint16 private targetLiquidityRatio = 20; //target liquidity out of 100

    uint16 public swapThreshold = 25; //threshold that contract will swap. out of 1000
    bool public manualSwap;

    //change this address to desired reward token. miscReward is custom chosen by holder
    address public mainReward = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    address public _uniswapPairAddress;
    IUniSwapRouter02 private _uniswapRouter;
    address public UniSwapRouter;

    /////////////////////////////   Events  /////////////////////////////////////////
    event AdjustedDynamicSettings(
        bool burn,
        bool limits,
        bool liquidity,
        bool sells
    );
    event AccountExcluded(address account);
    event ChangeMainReward(address newMainReward);
    event ClaimToken(uint256 amount, address token, address recipient);
    event ClaimETH(address from, address to, uint256 amount);
    event EnableBlacklist(bool enabled);
    event EnableManualSwap(bool enabled);
    event ExcludedAccountFromFees(address account, bool exclude);
    event ExcludeFromStaking(address account, bool excluded);
    event ExtendLiquidityLock(uint256 extendedLockTime);
    event UpdateTaxes(uint8 buyTax, uint8 sellTax, uint8 transferTax);
    event RatiosChanged(
        uint8 newBurn,
        uint8 newBuyback,
        uint8 newTeam,
        uint8 newLiquidity,
        uint8 newEvents,
        uint8 newMarketing,
        uint8 newRewards
    );
    event UpdateTeamWallet(address newTeamWallet);
    event UpdateEventsWallet(address newEventsWallet);
    event UpdateMarketingWallet(address newMarketingWallet);
    event UpdateRewardSplit(uint8 newMainSplit, uint8 newMiscSplit);
    event UpdateSwapThreshold(uint16 newThreshold);
    event UpdateTargetLiquidity(uint16 target);

    /////////////////////////////   MODIFIERS  /////////////////////////////////////////

    modifier authorized() {
        _isAuthorized();
        _;
    }

    modifier lockTheSwap() {
        _isSwappingContractModifier = true;
        _;
        _isSwappingContractModifier = false;
    }

    /////////////////////////////   CONSTRUCTOR  /////////////////////////////////////////

    constructor() {
        if (block.chainid == 1) {
            UniSwapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else if (block.chainid == 5) {
            UniSwapRouter = 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D;
        } else revert();
        _uniswapRouter = IUniSwapRouter02(UniSwapRouter);
        _uniswapPairAddress = IUniSwapFactory(_uniswapRouter.factory())
            .createPair(address(this), _uniswapRouter.WETH());
        _addToken(msg.sender, INITIAL_SUPPLY);
        emit Transfer(address(0), msg.sender, INITIAL_SUPPLY);
        _allowances[address(this)][address(_uniswapRouter)] = type(uint256).max;

        //setup ratio divisors based on Team's chosen ratios
        totalTaxRatio =
            _taxRatios.burn +
            _taxRatios.buyback +
            _taxRatios.Team +
            _taxRatios.liquidity +
            _taxRatios.Events +
            _taxRatios.Marketing +
            _taxRatios.rewards;

        totalSwapRatio = totalTaxRatio - _taxRatios.burn;
        distributeRatio = totalSwapRatio - _taxRatios.liquidity;

        //circulating supply begins as initial supply
        _circulatingSupply = INITIAL_SUPPLY;

        //setup _limits
        _limits = MaxLimits({
            maxWallet: (INITIAL_SUPPLY * _limitRatios.wallet) /
                _limitRatios.divisor,
            maxSell: (INITIAL_SUPPLY * _limitRatios.sell) /
                _limitRatios.divisor,
            maxBuy: (INITIAL_SUPPLY * _limitRatios.buy) / _limitRatios.divisor
        });

        _excluded.add(msg.sender);
        _excluded.add(_taxWallet.Marketing);
        _excluded.add(_taxWallet.Team);
        _excluded.add(_taxWallet.Events);
        _excluded.add(address(this));
        _excluded.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(this));
        _excludedFromStaking.add(BURN_ADDRESS);
        _excludedFromStaking.add(address(_uniswapRouter));
        _excludedFromStaking.add(_uniswapPairAddress);

        _approve(address(this), address(_uniswapRouter), type(uint256).max);
    }

    receive() external payable {}

    //allows Team to change token name and symbol.
    function updateTokenDetails(string memory newName, string memory newSymbol)
        external
        authorized
    {
        _name = newName;
        _symbol = newSymbol;
    }

    function decimals() external pure override returns (uint8) {
        return TOKEN_DECIMALS;
    }

    function getOwner() external view override returns (address) {
        return owner();
    }

    function name() external view override returns (string memory) {
        return _name;
    }

    function symbol() external view override returns (string memory) {
        return _symbol;
    }

    function totalSupply() external view override returns (uint256) {
        return _circulatingSupply;
    }

    function _isAuthorized() private view {
        if (!_authorized(msg.sender)) revert Unauthorized();
    }

    function _authorized(address addr) private view returns (bool) {
        return
            addr == owner() ||
            addr == _taxWallet.Marketing ||
            addr == _taxWallet.Team ||
            addr == _taxWallet.Events;
    }

    function allowance(address _owner, address spender)
        external
        view
        override
        returns (uint256)
    {
        return _allowances[_owner][spender];
    }

    function approve(address spender, uint256 amount)
        external
        override
        returns (bool)
    {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) private {
        require(owner != address(0), "Approve from zero");
        require(spender != address(0), "Approve to zero");

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function balanceOf(address account)
        external
        view
        override
        returns (uint256)
    {
        return _balances[account];
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        external
        returns (bool)
    {
        uint256 currentAllowance = _allowances[msg.sender][spender];
        require(currentAllowance >= subtractedValue, "<0 allowance");

        _approve(msg.sender, spender, currentAllowance - subtractedValue);
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue)
        external
        returns (bool)
    {
        _approve(
            msg.sender,
            spender,
            _allowances[msg.sender][spender] + addedValue
        );
        return true;
    }
    
    // Method to log holders to looping of distribution
    function addAddressToHolderHistoryList(address _account) private {      
        
        if(!addedToTokenHolderHistory[_account]){
            tokenHolderHistory[totalTokenHolderHistory] = _account;
            addedToTokenHolderHistory[_account] = true;
            totalTokenHolderHistory++;
        }
    }

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

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][msg.sender];
        require(currentAllowance >= amount, "Transfer > allowance");

        _approve(sender, msg.sender, currentAllowance - amount);
        return true;
    }

    ///// FUNCTIONS CALLABLE BY ANYONE /////

    //Claims reward set by Team
    function ClaimMainReward() external {
        if (mainReward == _uniswapRouter.WETH()) {
            claimETHTo(
                msg.sender,
                msg.sender,
                getStakeBalance(msg.sender, true),
                true
            );
        } else claimToken(msg.sender, mainReward, 0, true);
    }

    //Claims reward chosen by holder. Differentiates between ETH and other ERC20 tokens
    function ClaimMiscReward(address tokenAddress) external {
        if (tokenAddress == _uniswapRouter.WETH()) {
            claimETHTo(
                msg.sender,
                msg.sender,
                getStakeBalance(msg.sender, false),
                false
            );
        } else claimToken(msg.sender, tokenAddress, 0, false);
    }

    //Allows holders to include themselves back into staking if excluded
    //ExcludeFromStaking function should be used for contracts(CEX, pair, address(this), etc.)
    function IncludeMeToStaking() external {
        includeToStaking(msg.sender);
        emit ExcludeFromStaking(msg.sender, false);
    }

    ///// AUTHORIZED FUNCTIONS /////

    //Allows Team to change reward
    function changeMainReward(address newReward) external onlyOwner {
        mainReward = newReward;
        emit ChangeMainReward(newReward);
    }

    //Manually perform a contract swap
    function createLPandETH(uint16 permilleOfUniSwap, bool ignoreLimits)
        external
        onlyOwner
    {
        _swapContractToken(permilleOfUniSwap, ignoreLimits);
    }

    //Toggle blacklist on and off
    function enableBlacklist(bool enabled) external onlyOwner {
        blacklistEnabled = enabled;
        emit EnableBlacklist(enabled);
    }

    //Toggle dynamic features on and off
    function dynamicSettings(
        bool burn,
        bool limits,
        bool liquidity,
        bool sells
    ) external onlyOwner {
        dynamicBurn = burn;
        dynamicLimits = limits;
        dynamicLiqEnabled = liquidity;
        dynamicSellsEnabled = sells;
        emit AdjustedDynamicSettings(burn, limits, liquidity, sells);
    }

    //Mainly used for addresses such as CEX, presale, etc
    function excludeAccountFromFees(address account, bool exclude)
        external
        onlyOwner
    {
        if (exclude == true) _excluded.add(account);
        else _excluded.remove(account);
        emit ExcludedAccountFromFees(account, exclude);
    }

    //Mainly used for addresses such as CEX, presale, etc
    function setStakingExclusionStatus(address addr, bool exclude)
        external
        onlyOwner
    {
        if (exclude) excludeFromStaking(addr);
        else includeToStaking(addr);
        emit ExcludeFromStaking(addr, exclude);
    }

    //Toggle manual swap on and off
    function enableManualSwap(bool enabled) external onlyOwner {
        manualSwap = enabled;
        emit EnableManualSwap(enabled);
    }

    function launch() external onlyOwner {
        if (IERC20(_uniswapPairAddress).totalSupply() == 0)
            revert NeedLiquidity();
        isLaunched = true;
        launchBlock = block.number;
        launchTime = block.timestamp;
    }

    //Toggle whether multiple buys in a block from a single address can be performed
    function sameBlockRevert(bool enabled) external onlyOwner {
        revertSameBlock = enabled;
    }

    function addBlacklist(address addr) external authorized {
        if (block.timestamp > (launchTime + blacklistWindow))
            revert BlacklistTimerExceeded();
        if (isBlacklisted[addr]) revert AlreadyBlacklisted();
        isBlacklisted[addr] = true;
    }

    function removeBlacklist(address addr) external authorized {
        if (!isBlacklisted[addr]) revert AlreadyUnblacklisted();
        isBlacklisted[addr] = false;
    }

    function setTier1(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; ++i) {
            tier2[addresses[i]] = false;
            tier3[addresses[i]] = false;
        }
    }

    function setTier2(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; ++i) {
            tier2[addresses[i]] = true;
            tier3[addresses[i]] = false;
        }
    }

    function setTier3(address[] calldata addresses) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; ++i) {
            tier2[addresses[i]] = false;
            tier3[addresses[i]] = true;
        }
    }

    //indepedently set whether wallet is exempt from taxes
    function setTaxExemptionStatus(address account, bool exempt)
        external
        onlyOwner
    {
        taxExempt[account] = exempt;
    }

    //independtly set whether wallet is exempt from limits
    function setLimitExemptionStatus(address account, bool exempt)
        external
        onlyOwner
    {
        limitExempt[account] = exempt;
    }

    function setWhitelistStatus(address[] calldata addresses, bool status)
        external
        onlyOwner
    {
        for (uint256 i = 0; i < addresses.length; ++i) {
            isWhitelisted[addresses[i]] = status;
        }
    }

    //Performs a buyback and automatically burns tokens
    function triggerBuyback(uint256 amount) external authorized {
        buybackToken(amount, address(this));
    }

    //Update limit ratios. ofCurrentSupply = true will set max wallet based on current supply. False will use initial supply
    function updateLimits(
        uint16 newMaxWalletRatio,
        uint16 newMaxSellRatio,
        uint16 newMaxBuyRatio,
        uint16 newDivisor,
        bool ofCurrentSupply
    ) external onlyOwner {
        uint256 supply = INITIAL_SUPPLY;
        if (ofCurrentSupply) supply = _circulatingSupply;
        uint256 minLimit = supply / 1000;
        uint256 newMaxWallet = (supply * newMaxWalletRatio) / newDivisor;
        uint256 newMaxSell = (supply * newMaxSellRatio) / newDivisor;
        uint256 newMaxBuy = (supply * newMaxBuyRatio) / newDivisor;

        //Team can never set sells below 0.1% of circulating/initial supply
        if (newMaxWallet < minLimit || newMaxSell < minLimit)
            revert InvalidInput();

        _limits = MaxLimits(newMaxWallet, newMaxSell, newMaxBuy);

        _limitRatios = LimitRatios(
            newMaxWalletRatio,
            newMaxSellRatio,
            newMaxBuyRatio,
            newDivisor
        );
    }

    //update launch tax ratios
    function updateLaunchTransferTax(
        uint8 newLaunchTransferTax
    ) external onlyOwner {
        require(launchTransferTax > 0, "Launch Transfer Tax has been removed and cannot be re-enabled");
        launchTransferTax = newLaunchTransferTax;
    }

    //update tax ratios
    function updateRatios(
        uint8 newBurn,
        uint8 newBuyback,
        uint8 newTeam,
        uint8 newLiquidity,
        uint8 newEvents,
        uint8 newMarketing,
        uint8 newRewards
    ) external onlyOwner {
        _taxRatios = TaxRatios(
            newBurn,
            newBuyback,
            newTeam,
            newLiquidity,
            newEvents,
            newMarketing,
            newRewards
        );

        totalTaxRatio =
            newBurn +
            newBuyback +
            newTeam +
            newLiquidity +
            newEvents +
            newMarketing +
            newRewards;
        totalSwapRatio = totalTaxRatio - newBurn;
        distributeRatio = totalSwapRatio - newLiquidity;

        emit RatiosChanged(
            newBurn,
            newBuyback,
            newTeam,
            newLiquidity,
            newEvents,
            newMarketing,
            newRewards
        );
    }

    //update allocation of mainReward and miscReward
    function updateRewardSplit(uint8 mainSplit, uint8 miscSplit)
        external
        onlyOwner
    {
        uint8 totalSplit = mainSplit + miscSplit;
        if (totalSplit != 100) revert InvalidInput();
        mainRewardSplit = mainSplit;
        miscRewardSplit = miscSplit;
        emit UpdateRewardSplit(mainSplit, miscSplit);
    }

    //update threshold that triggers contract swaps
    function updateSwapThreshold(uint16 threshold) external onlyOwner {
        if (threshold < 0 || threshold > 50) revert InvalidInput();
        swapThreshold = threshold;
        emit UpdateSwapThreshold(threshold);
    }

    //targetLiquidity is out of 100
    function updateTargetLiquidity(uint16 target) external onlyOwner {
        if (target > 100) revert InvalidInput();
        targetLiquidityRatio = target;
        emit UpdateTargetLiquidity(target);
    }

    function updateBuyTaxes(
        uint8 first,
        uint8 second,
        uint8 third
    ) external onlyOwner {
        if (first > MAX_TAX || second > MAX_TAX || third > MAX_TAX)
            revert MaxTaxExceeded(MAX_TAX);
        _buyTaxes = TierTaxes(first, second, third);
    }

    function updateSellTaxes(
        uint8 first,
        uint8 second,
        uint8 third
    ) external onlyOwner {
        if (first > MAX_TAX || second > MAX_TAX || third > MAX_TAX)
            revert MaxTaxExceeded(MAX_TAX);
        _sellTaxes = TierTaxes(first, second, third);
    }

    function withdrawTeam() external authorized {
        uint256 remaining = address(this).balance -
            TeamBalance -
            EventsBalance -
            MarketingBalance -
            buybackBalance -
            getTotalUnclaimed();
        bool lostBalance = remaining > 0;
        uint256 amount = lostBalance ? TeamBalance + remaining : TeamBalance;
        TeamBalance = 0;
        _sendETH(_taxWallet.Team, amount);
    }

    function withdrawEvents() external authorized {
        uint256 amount = EventsBalance;
        EventsBalance = 0;
        _sendETH(_taxWallet.Events, amount);
    }

    function withdrawMarketing() external authorized {
        uint256 amount = MarketingBalance;
        MarketingBalance = 0;
        _sendETH(_taxWallet.Marketing, amount);
    }

    //liquidity can only be extended
    function lockLiquidityTokens(uint256 lockTimeInSeconds)
        external
        authorized
    {
        setUnlockTime(lockTimeInSeconds + block.timestamp);
        emit ExtendLiquidityLock(lockTimeInSeconds);
    }

    //recovers stuck ETH to make sure it isnt burnt/lost
    //only callablewhen liquidity is unlocked
    function recoverETH() external authorized {
        if (block.timestamp < _liquidityUnlockTime)
            revert LiquidityLocked(_liquidityUnlockTime - block.timestamp);
        _liquidityUnlockTime = block.timestamp;
        _sendETH(msg.sender, address(this).balance);
    }

    //Can only be used to recover miscellaneous tokens accidentally sent to contract
    //Can't pull liquidity or native token using this function
    function recoverMiscToken(address tokenAddress) external authorized {
        if (
            tokenAddress == _uniswapPairAddress || tokenAddress == address(this)
        ) revert InvalidInput();
        IERC20 token = IERC20(tokenAddress);
        token.transfer(msg.sender, token.balanceOf(address(this)));
    }

    //Impossible to release LP unless LP lock time is zero
    function releaseLP() external authorized {
        if (block.timestamp < _liquidityUnlockTime)
            revert LiquidityLocked(_liquidityUnlockTime - block.timestamp);
        IUniSwapERC20 liquidityToken = IUniSwapERC20(_uniswapPairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.transfer(msg.sender, amount);
    }

    //Impossible to remove LP unless lock time is zero
    function removeLP() external authorized {
        if (block.timestamp < _liquidityUnlockTime)
            revert LiquidityLocked(_liquidityUnlockTime - block.timestamp);
        _liquidityUnlockTime = block.timestamp;
        IUniSwapERC20 liquidityToken = IUniSwapERC20(_uniswapPairAddress);
        uint256 amount = liquidityToken.balanceOf(address(this));
        liquidityToken.approve(address(_uniswapRouter), amount);
        _uniswapRouter.removeLiquidityETHSupportingFeeOnTransferTokens(
            address(this),
            amount,
            0,
            0,
            address(this),
            block.timestamp
        );
        _sendETH(msg.sender, address(this).balance);
    }

    function setTeamWallet(address payable addr) external authorized {
        address prevTeam = _taxWallet.Team;
        _excluded.remove(prevTeam);
        _taxWallet.Team = addr;
        _excluded.add(_taxWallet.Team);
        emit UpdateTeamWallet(addr);
    }

    function setEventsWallet(address payable addr) external authorized {
        address prevEvents = _taxWallet.Events;
        _excluded.remove(prevEvents);
        _taxWallet.Events = addr;
        _excluded.add(_taxWallet.Events);
        emit UpdateEventsWallet(addr);
    }

    function setMarketingWallet(address payable addr) external authorized {
        address prevMarketing = _taxWallet.Marketing;
        _excluded.remove(prevMarketing);
        _taxWallet.Marketing = addr;
        _excluded.add(_taxWallet.Marketing);
        emit UpdateMarketingWallet(addr);
    }

    ////// VIEW FUNCTIONS /////

    function getBlacklistInfo()
        external
        view
        returns (
            uint256 _launchBlock,
            uint8 _blacklistBlocks,
            uint8 _snipersRekt,
            bool _blacklistEnabled,
            bool _revertSameBlock
        )
    {
        return (
            launchBlock,
            BLACKLIST_BLOCKS,
            snipersRekt,
            blacklistEnabled,
            revertSameBlock
        );
    }

    function getDynamicInfo()
        external
        view
        returns (
            bool _dynamicBurn,
            bool _dynamicLimits,
            bool _dynamicLiquidity,
            bool _dynamicSells,
            uint16 _targetLiquidity
        )
    {
        return (
            dynamicBurn,
            dynamicLimits,
            dynamicLiqEnabled,
            dynamicSellsEnabled,
            targetLiquidityRatio
        );
    }

    function getLiquidityRatio() public view returns (uint256) {
        uint256 ratio = (100 * _balances[_uniswapPairAddress]) /
            _circulatingSupply;
        return ratio;
    }

    function getLiquidityUnlockInSeconds() external view returns (uint256) {
        if (block.timestamp < _liquidityUnlockTime) {
            return _liquidityUnlockTime - block.timestamp;
        }
        return 0;
    }

    function getMainBalance(address addr) external view returns (uint256) {
        uint256 amount = getStakeBalance(addr, true);
        return amount;
    }

    function getMiscBalance(address addr) external view returns (uint256) {
        uint256 amount = getStakeBalance(addr, false);
        return amount;
    }

    function getSupplyInfo()
        external
        view
        returns (
            uint256 initialSupply,
            uint256 circulatingSupply,
            uint256 burntTokens
        )
    {
        uint256 tokensBurnt = INITIAL_SUPPLY - _circulatingSupply;
        return (INITIAL_SUPPLY, _circulatingSupply, tokensBurnt);
    }

    function getTotalUnclaimed() public view returns (uint256) {
        uint256 amount = totalRewards - totalPayouts;
        return amount;
    }

    function getWithdrawBalances()
        external
        view
        returns (
            uint256 buyback,
            uint256 Team,
            uint256 Events,
            uint256 Marketing
        )
    {
        return (buybackBalance, TeamBalance, EventsBalance, MarketingBalance);
    }

    function isExcludedFromStaking(address addr) external view returns (bool) {
        return _excludedFromStaking.contains(addr);
    }

    /////////////////////////////   PRIVATE FUNCTIONS  /////////////////////////////////////////

    mapping(address => uint256) private alreadyPaidMain;
    mapping(address => uint256) private toERCaidMain;
    mapping(address => uint256) private alreadyPaidMisc;
    mapping(address => uint256) private toERCaidMisc;
    mapping(address => uint256) private tradeBlock;
    mapping(address => uint256) public accountTotalClaimed;
    uint256 private constant DISTRIBUTION_MULTI = 2**64;
    uint256 private _totalShares = INITIAL_SUPPLY;
    uint256 private buybackBalance;
    uint256 private TeamBalance;
    uint256 private EventsBalance;
    uint256 private MarketingBalance;
    uint256 private mainRewardShare;
    uint256 private miscRewardShare;
    uint256 public totalPayouts;
    uint256 public totalRewards;
    bool private _isSwappingContractModifier;
    bool private _isWithdrawing;
    bool private _isBurning;

    function _addLiquidity(uint256 tokenamount, uint256 ETHAmount) private {
        _approve(address(this), address(_uniswapRouter), tokenamount);
        _uniswapRouter.addLiquidityETH{value: ETHAmount}(
            address(this),
            tokenamount,
            0,
            0,
            address(this),
            block.timestamp
        );
    }

    function _addToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] + amount;

        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares += amount;
        uint256 mainPayment = newStakeOf(addr, true);
        uint256 miscPayment = newStakeOf(addr, false);
        _balances[addr] = newAmount;
        alreadyPaidMain[addr] = mainRewardShare * newAmount;
        toERCaidMain[addr] += mainPayment;
        alreadyPaidMisc[addr] = miscRewardShare * newAmount;
        toERCaidMisc[addr] += miscPayment;
        _balances[addr] = newAmount;

        // add history to holder list
        addAddressToHolderHistoryList(addr);
    }

    function _calculateTierTax(address addr, bool isBuy)
        private
        view
        returns (uint8)
    {
        if (!tier2[addr] && !tier3[addr]) {
            return isBuy ? _buyTaxes.first : _sellTaxes.first;
        } else if (tier3[addr]) {
            return isBuy ? _buyTaxes.third : _sellTaxes.third;
        } else {
            return isBuy ? _buyTaxes.second : _sellTaxes.second;
        }
    }

    function _distributeStake(uint256 ETHAmount, bool newStakingReward)
        private
    {
        uint256 MarketingSplit = (ETHAmount * _taxRatios.Marketing) /
            distributeRatio;
        uint256 TeamSplit = (ETHAmount * _taxRatios.Team) / distributeRatio;
        uint256 buybackSplit = (ETHAmount * _taxRatios.buyback) /
            distributeRatio;
        uint256 stakingSplit = (ETHAmount * _taxRatios.rewards) /
            distributeRatio;
        uint256 EventsSplit = (ETHAmount * _taxRatios.Events) / distributeRatio;
        uint256 mainAmount = (stakingSplit * mainRewardSplit) / 100;
        uint256 miscAmount = (stakingSplit * miscRewardSplit) / 100;
        MarketingBalance += MarketingSplit;
        TeamBalance += TeamSplit;
        buybackBalance += buybackSplit;
        EventsBalance += EventsSplit;
        if (stakingSplit > 0) {
            if (newStakingReward) totalRewards += stakingSplit;
            uint256 totalShares = getTotalShares();
            if (totalShares == 0) MarketingBalance += stakingSplit;
            else {
                mainRewardShare += ((mainAmount * DISTRIBUTION_MULTI) /
                    totalShares);
                miscRewardShare += ((miscAmount * DISTRIBUTION_MULTI) /
                    totalShares);
            }
        }
    }

    function _feelessTransfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        if (_balances[sender] < amount) revert InsufficientBalance();
        _removeToken(sender, amount);
        _addToken(recipient, amount);
        emit Transfer(sender, recipient, amount);
    }

    function _removeToken(address addr, uint256 amount) private {
        uint256 newAmount = _balances[addr] - amount;

        if (_excludedFromStaking.contains(addr)) {
            _balances[addr] = newAmount;
            return;
        }
        _totalShares -= amount;
        uint256 mainPayment = newStakeOf(addr, true);
        uint256 miscPayment = newStakeOf(addr, false);
        _balances[addr] = newAmount;
        alreadyPaidMain[addr] = mainRewardShare * newAmount;
        toERCaidMain[addr] += mainPayment;
        alreadyPaidMisc[addr] = miscRewardShare * newAmount;
        toERCaidMisc[addr] += miscPayment;
    }

    function _sendETH(address account, uint256 amount) private {
        (bool sent, ) = account.call{value: (amount)}("");
        require(sent, "withdraw failed");
    }

    function _swapContractToken(uint16 permilleOfUniSwap, bool ignoreLimits)
        private
        lockTheSwap
    {
        require(permilleOfUniSwap <= 500);
        if (totalSwapRatio == 0) return;
        uint256 contractBalance = _balances[address(this)];

        uint256 tokenToSwap = (_balances[_uniswapPairAddress] *
            permilleOfUniSwap) / 1000;
        if (tokenToSwap > _limits.maxSell && !ignoreLimits)
            tokenToSwap = _limits.maxSell;

        bool notEnoughToken = contractBalance < tokenToSwap;
        if (notEnoughToken) {
            if (ignoreLimits) tokenToSwap = contractBalance;
            else return;
        }
        if (_allowances[address(this)][address(_uniswapRouter)] < tokenToSwap)
            _approve(address(this), address(_uniswapRouter), type(uint256).max);

        uint256 dynamicLiqRatio;
        if (dynamicLiqEnabled && getLiquidityRatio() >= targetLiquidityRatio)
            dynamicLiqRatio = 0;
        else dynamicLiqRatio = _taxRatios.liquidity;

        uint256 tokenForLiquidity = (tokenToSwap * dynamicLiqRatio) /
            totalSwapRatio;
        uint256 remainingToken = tokenToSwap - tokenForLiquidity;
        uint256 liqToken = tokenForLiquidity / 2;
        uint256 liqETHToken = tokenForLiquidity - liqToken;
        uint256 swapToken = liqETHToken + remainingToken;
        uint256 initialETHBalance = address(this).balance;
        _swapTokenForETH(swapToken);
        uint256 newETH = (address(this).balance - initialETHBalance);
        uint256 liqETH = (newETH * liqETHToken) / swapToken;
        if (liqToken > 0) _addLiquidity(liqToken, liqETH);
        uint256 distributeETH = (address(this).balance -
            initialETHBalance -liqETH
            );
        _distributeStake(distributeETH, true);
    }

    function _swapTokenForETH(uint256 amount) private {
        _approve(address(this), address(_uniswapRouter), amount);
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = _uniswapRouter.WETH();
        _uniswapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens(
            amount,
            0,
            path,
            address(this),
            block.timestamp
        );
    }

    function _taxedTransfer(
        address sender,
        address recipient,
        uint256 amount,
        bool isBuy,
        bool isSell
    ) private {
        if (_balances[sender] < amount) revert InsufficientBalance();

        uint8 tax;
        bool extraSellTax = false;        
        uint256 launchTransferTaxAmount;

        if (isSell) {
            if (blacklistEnabled) {
                if (isBlacklisted[sender]) revert UserBlacklisted();
            }

            if (amount > _limits.maxSell && !limitExempt[sender])
                revert MaxSellExceeded(_limits.maxSell);

            tax = _calculateTierTax(sender, false);
            if (dynamicSellsEnabled) extraSellTax = true;
        } else if (isBuy) {
            if (!isLaunched && !isWhitelisted[recipient]) {
                isBlacklisted[recipient] = true;
            }

            if (launchBlock > 0) {
                if (block.number - launchBlock < BLACKLIST_BLOCKS) {
                    isBlacklisted[recipient] = true;
                    ++snipersRekt;
                }
            }

            if (revertSameBlock) {
                require(tradeBlock[recipient] != block.number);
                tradeBlock[recipient] = block.number;
            }

            if (
                (_balances[recipient] + amount) > _limits.maxWallet &&
                !limitExempt[recipient]
            ) revert MaxBalanceExceeded(_limits.maxWallet);
            if (amount > _limits.maxBuy && !limitExempt[recipient])
                revert MaxBuyExceeded(_limits.maxBuy);
            tax = _calculateTierTax(recipient, true);
        } else {

            if (blacklistEnabled) {
                if (isBlacklisted[sender]) revert UserBlacklisted();
            }

            if (amount <= 10**(TOKEN_DECIMALS)) {
                //transfer less than 1 token to ClaimETH
                if (mainReward == _uniswapRouter.WETH())
                    claimETHTo(
                        msg.sender,
                        msg.sender,
                        getStakeBalance(msg.sender, true),
                        true
                    );
                else claimToken(msg.sender, mainReward, 0, true);
                return;
            }

            if (
                (_balances[recipient] + amount) > _limits.maxWallet &&
                !limitExempt[recipient]
            ) revert MaxBalanceExceeded(_limits.maxWallet);

            // on transfer during launch apply tax
            if (launchTransferTax > 0) {
                launchTransferTaxAmount = (amount * launchTransferTax) / 100;
            }
            
        }

        if (
            (sender != _uniswapPairAddress) &&
            (!manualSwap) &&
            (!_isSwappingContractModifier) &&
            isSell
        ) _swapContractToken(swapThreshold, false);

        if (taxExempt[sender] || taxExempt[recipient]) {
            tax = 0;
            extraSellTax = false;
        }

        uint256 taxedAmount;
        uint256 tokensToBeBurnt;
        uint256 contractToken;

        if (tax > 0) {
            taxedAmount = (amount * tax) / 100;
            tokensToBeBurnt = (taxedAmount * _taxRatios.burn) / totalTaxRatio;
            contractToken = taxedAmount - tokensToBeBurnt;
        }

        if (extraSellTax) {
            uint256 extraTax = dynamicSellTax(amount);
            taxedAmount += extraTax;
            if (dynamicBurn) tokensToBeBurnt += extraTax;
            else contractToken += extraTax;
        }

        // check for launch tax amount
        if(launchTransferTaxAmount > 0){
            taxedAmount += launchTransferTaxAmount;
        }

        uint256 receiveAmount = amount - taxedAmount;
        _removeToken(sender, amount);
        _addToken(address(this), contractToken);
        _circulatingSupply -= tokensToBeBurnt;
        _addToken(recipient, receiveAmount);
        emit Transfer(sender, recipient, receiveAmount);
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) private {
        require(sender != address(0), "Transfer from zero");
        require(recipient != address(0), "Transfer to zero");

        if (recipient == BURN_ADDRESS) {
            burnTransfer(sender, amount);
            return;
        }

        if (dynamicLimits) getNewLimits();

        bool isExcluded = (_excluded.contains(sender) ||
            _excluded.contains(recipient));

        bool isContractTransfer = (sender == address(this) ||
            recipient == address(this));
        address uniswapRouter = address(_uniswapRouter);
        bool isLiquidityTransfer = ((sender == _uniswapPairAddress &&
            recipient == uniswapRouter) ||
            (recipient == _uniswapPairAddress && sender == uniswapRouter));

        bool isSell = recipient == _uniswapPairAddress ||
            recipient == uniswapRouter;
        bool isBuy = sender == _uniswapPairAddress || sender == uniswapRouter;

        if (isContractTransfer || isLiquidityTransfer || isExcluded) {
            _feelessTransfer(sender, recipient, amount);
        } else {
            _taxedTransfer(sender, recipient, amount, isBuy, isSell);
        }
    }

    function burnTransfer(address account, uint256 amount) private {
        require(amount <= _balances[account]);
        require(!_isBurning);
        _isBurning = true;
        _removeToken(account, amount);
        _circulatingSupply -= amount;
        emit Transfer(account, BURN_ADDRESS, amount);
        _isBurning = false;
    }

    function buybackToken(uint256 amount, address token) private {
        if (amount > buybackBalance) revert InsufficientBalance();
        buybackBalance -= amount;

        address[] memory path = new address[](2);
        path[0] = _uniswapRouter.WETH();
        path[1] = token;

        _uniswapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        }(0, path, BURN_ADDRESS, block.timestamp);
    }

    function claimToken(
        address addr,
        address token,
        uint256 payableAmount,
        bool main
    ) private {
        require(!_isWithdrawing);
        _isWithdrawing = true;
        uint256 amount;
        if (_excludedFromStaking.contains(addr)) {
            if (main) {
                amount = toERCaidMain[addr];
                toERCaidMain[addr] = 0;
            } else {
                amount = toERCaidMisc[addr];
                toERCaidMisc[addr] = 0;
            }
        } else {
            uint256 newAmount = newStakeOf(addr, main);
            if (main) {
                alreadyPaidMain[addr] = mainRewardShare * _balances[addr];
                amount = toERCaidMain[addr] + newAmount;
                toERCaidMain[addr] = 0;
            } else {
                alreadyPaidMisc[addr] = miscRewardShare * _balances[addr];
                amount = toERCaidMisc[addr] + newAmount;
                toERCaidMisc[addr] = 0;
            }
        }

        if (amount == 0 && payableAmount == 0) {
            _isWithdrawing = false;
            return;
        }

        totalPayouts += amount;
        accountTotalClaimed[addr] += amount;
        amount += payableAmount;
        address[] memory path = new address[](2);
        path[0] = _uniswapRouter.WETH();
        path[1] = token;

        _uniswapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: amount
        }(0, path, addr, block.timestamp);

        emit ClaimToken(amount, token, addr);
        _isWithdrawing = false;
    }

    function claimETHTo(
        address from,
        address to,
        uint256 amountWei,
        bool main
    ) private {
        require(!_isWithdrawing);
        {
            require(amountWei != 0);
            _isWithdrawing = true;
            subtractStake(from, amountWei, main);
            totalPayouts += amountWei;
            accountTotalClaimed[to] += amountWei;
            _sendETH(to, amountWei);
        }
        _isWithdrawing = false;
        emit ClaimETH(from, to, amountWei);
    }

    function dynamicSellTax(uint256 amount) private view returns (uint256) {
        uint256 value = _balances[_uniswapPairAddress];
        uint256 vMin = value / 100;
        uint256 vMax = value / 10;
        if (amount <= vMin) return amount = 0;

        if (amount > vMax) return (amount * 10) / 100;

        return (((amount - vMin) * 10 * amount) / (vMax - vMin)) / 100;
    }

    function excludeFromStaking(address addr) private {
        require(!_excludedFromStaking.contains(addr));
        _totalShares -= _balances[addr];
        uint256 newStakeMain = newStakeOf(addr, true);
        uint256 newStakeMisc = newStakeOf(addr, false);
        alreadyPaidMain[addr] = _balances[addr] * mainRewardShare;
        alreadyPaidMisc[addr] = _balances[addr] * miscRewardShare;
        toERCaidMain[addr] += newStakeMain;
        toERCaidMisc[addr] += newStakeMisc;
        _excludedFromStaking.add(addr);
    }

    function includeToStaking(address addr) private {
        require(_excludedFromStaking.contains(addr));
        _totalShares += _balances[addr];
        _excludedFromStaking.remove(addr);
        alreadyPaidMain[addr] = _balances[addr] * mainRewardShare;
        alreadyPaidMisc[addr] = _balances[addr] * miscRewardShare;
    }

    function getNewLimits() private {
        _limits.maxBuy =
            (_circulatingSupply * _limitRatios.buy) /
            _limitRatios.divisor;
        _limits.maxSell =
            (_circulatingSupply * _limitRatios.sell) /
            _limitRatios.divisor;
        _limits.maxWallet =
            (_circulatingSupply * _limitRatios.wallet) /
            _limitRatios.divisor;
    }

    function subtractStake(
        address addr,
        uint256 amount,
        bool main
    ) private {
        if (amount == 0) return;
        if (amount > getStakeBalance(addr, main)) revert InsufficientBalance();

        if (_excludedFromStaking.contains(addr)) {
            if (main) toERCaidMain[addr] -= amount;
            else toERCaidMisc[addr] -= amount;
        } else {
            uint256 newAmount = newStakeOf(addr, main);
            if (main) {
                alreadyPaidMain[addr] = mainRewardShare * _balances[addr];
                toERCaidMain[addr] += newAmount;
                toERCaidMain[addr] -= amount;
            } else {
                alreadyPaidMisc[addr] = miscRewardShare * _balances[addr];
                toERCaidMisc[addr] += newAmount;
                toERCaidMisc[addr] -= amount;
            }
        }
    }

    function getStakeBalance(address addr, bool main)
        private
        view
        returns (uint256)
    {
        if (main) {
            if (_excludedFromStaking.contains(addr)) return toERCaidMain[addr];
            return newStakeOf(addr, true) + toERCaidMain[addr];
        } else {
            if (_excludedFromStaking.contains(addr)) return toERCaidMisc[addr];
            return newStakeOf(addr, false) + toERCaidMisc[addr];
        }
    }

    function getTotalShares() private view returns (uint256) {
        return _totalShares - INITIAL_SUPPLY;
    }

    function setUnlockTime(uint256 newUnlockTime) private {
        // require new unlock time to be longer than old one
        require(newUnlockTime > _liquidityUnlockTime);
        _liquidityUnlockTime = newUnlockTime;
    }

    function newStakeOf(address staker, bool main)
        private
        view
        returns (uint256)
    {
        if (main) {
            uint256 fullPayout = mainRewardShare * _balances[staker];
            if (fullPayout < alreadyPaidMain[staker]) return 0;
            return (fullPayout - alreadyPaidMain[staker]) / DISTRIBUTION_MULTI;
        } else {
            uint256 fullPayout = miscRewardShare * _balances[staker];
            if (fullPayout < alreadyPaidMisc[staker]) return 0;
            return (fullPayout - alreadyPaidMisc[staker]) / DISTRIBUTION_MULTI;
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyBlacklisted","type":"error"},{"inputs":[],"name":"AlreadyUnblacklisted","type":"error"},{"inputs":[],"name":"BlacklistTimerExceeded","type":"error"},{"inputs":[],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidInput","type":"error"},{"inputs":[{"internalType":"uint256","name":"unlockInSeconds","type":"uint256"}],"name":"LiquidityLocked","type":"error"},{"inputs":[{"internalType":"uint256","name":"_maxBalance","type":"uint256"}],"name":"MaxBalanceExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"_maxBuy","type":"uint256"}],"name":"MaxBuyExceeded","type":"error"},{"inputs":[{"internalType":"uint256","name":"_maxSell","type":"uint256"}],"name":"MaxSellExceeded","type":"error"},{"inputs":[{"internalType":"uint8","name":"_MAX_TAX","type":"uint8"}],"name":"MaxTaxExceeded","type":"error"},{"inputs":[],"name":"NeedLiquidity","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UserBlacklisted","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AccountExcluded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"burn","type":"bool"},{"indexed":false,"internalType":"bool","name":"limits","type":"bool"},{"indexed":false,"internalType":"bool","name":"liquidity","type":"bool"},{"indexed":false,"internalType":"bool","name":"sells","type":"bool"}],"name":"AdjustedDynamicSettings","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMainReward","type":"address"}],"name":"ChangeMainReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"ClaimToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableBlacklist","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"enabled","type":"bool"}],"name":"EnableManualSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"excluded","type":"bool"}],"name":"ExcludeFromStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"exclude","type":"bool"}],"name":"ExcludedAccountFromFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"extendedLockTime","type":"uint256"}],"name":"ExtendLiquidityLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"newBurn","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newBuyback","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newTeam","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newEvents","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newMarketing","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"RatiosChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newEventsWallet","type":"address"}],"name":"UpdateEventsWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newMarketingWallet","type":"address"}],"name":"UpdateMarketingWallet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"newMainSplit","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"newMiscSplit","type":"uint8"}],"name":"UpdateRewardSplit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"newThreshold","type":"uint16"}],"name":"UpdateSwapThreshold","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint16","name":"target","type":"uint16"}],"name":"UpdateTargetLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"buyTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"sellTax","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"transferTax","type":"uint8"}],"name":"UpdateTaxes","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newTeamWallet","type":"address"}],"name":"UpdateTeamWallet","type":"event"},{"inputs":[],"name":"ClaimMainReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"ClaimMiscReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"IncludeMeToStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_TAX","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UniSwapRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_buyTaxes","outputs":[{"internalType":"uint8","name":"first","type":"uint8"},{"internalType":"uint8","name":"second","type":"uint8"},{"internalType":"uint8","name":"third","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limitRatios","outputs":[{"internalType":"uint16","name":"wallet","type":"uint16"},{"internalType":"uint16","name":"sell","type":"uint16"},{"internalType":"uint16","name":"buy","type":"uint16"},{"internalType":"uint16","name":"divisor","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_limits","outputs":[{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxSell","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_sellTaxes","outputs":[{"internalType":"uint8","name":"first","type":"uint8"},{"internalType":"uint8","name":"second","type":"uint8"},{"internalType":"uint8","name":"third","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxRatios","outputs":[{"internalType":"uint8","name":"burn","type":"uint8"},{"internalType":"uint8","name":"buyback","type":"uint8"},{"internalType":"uint8","name":"Team","type":"uint8"},{"internalType":"uint8","name":"liquidity","type":"uint8"},{"internalType":"uint8","name":"Events","type":"uint8"},{"internalType":"uint8","name":"Marketing","type":"uint8"},{"internalType":"uint8","name":"rewards","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_taxWallet","outputs":[{"internalType":"address","name":"Team","type":"address"},{"internalType":"address","name":"Events","type":"address"},{"internalType":"address","name":"Marketing","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_uniswapPairAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accountTotalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addedToTokenHolderHistory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newReward","type":"address"}],"name":"changeMainReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"permilleOfUniSwap","type":"uint16"},{"internalType":"bool","name":"ignoreLimits","type":"bool"}],"name":"createLPandETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"burn","type":"bool"},{"internalType":"bool","name":"limits","type":"bool"},{"internalType":"bool","name":"liquidity","type":"bool"},{"internalType":"bool","name":"sells","type":"bool"}],"name":"dynamicSettings","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"enableManualSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"excludeAccountFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBlacklistInfo","outputs":[{"internalType":"uint256","name":"_launchBlock","type":"uint256"},{"internalType":"uint8","name":"_blacklistBlocks","type":"uint8"},{"internalType":"uint8","name":"_snipersRekt","type":"uint8"},{"internalType":"bool","name":"_blacklistEnabled","type":"bool"},{"internalType":"bool","name":"_revertSameBlock","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDynamicInfo","outputs":[{"internalType":"bool","name":"_dynamicBurn","type":"bool"},{"internalType":"bool","name":"_dynamicLimits","type":"bool"},{"internalType":"bool","name":"_dynamicLiquidity","type":"bool"},{"internalType":"bool","name":"_dynamicSells","type":"bool"},{"internalType":"uint16","name":"_targetLiquidity","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityRatio","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLiquidityUnlockInSeconds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getMainBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getMiscBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupplyInfo","outputs":[{"internalType":"uint256","name":"initialSupply","type":"uint256"},{"internalType":"uint256","name":"circulatingSupply","type":"uint256"},{"internalType":"uint256","name":"burntTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalUnclaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawBalances","outputs":[{"internalType":"uint256","name":"buyback","type":"uint256"},{"internalType":"uint256","name":"Team","type":"uint256"},{"internalType":"uint256","name":"Events","type":"uint256"},{"internalType":"uint256","name":"Marketing","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isExcludedFromStaking","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLaunched","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"launch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"limitExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockTimeInSeconds","type":"uint256"}],"name":"lockLiquidityTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mainReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manualSwap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"name":"recoverMiscToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"removeLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"sameBlockRevert","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setEventsWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setLimitExemptionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setMarketingWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"exclude","type":"bool"}],"name":"setStakingExclusionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"exempt","type":"bool"}],"name":"setTaxExemptionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"addr","type":"address"}],"name":"setTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setTier1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setTier2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"setTier3","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"bool","name":"status","type":"bool"}],"name":"setWhitelistStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapThreshold","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"taxExempt","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tier2","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tier3","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenHolderHistory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPayouts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalTokenHolderHistory","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"triggerBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"first","type":"uint8"},{"internalType":"uint8","name":"second","type":"uint8"},{"internalType":"uint8","name":"third","type":"uint8"}],"name":"updateBuyTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newLaunchTransferTax","type":"uint8"}],"name":"updateLaunchTransferTax","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMaxWalletRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxSellRatio","type":"uint16"},{"internalType":"uint16","name":"newMaxBuyRatio","type":"uint16"},{"internalType":"uint16","name":"newDivisor","type":"uint16"},{"internalType":"bool","name":"ofCurrentSupply","type":"bool"}],"name":"updateLimits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newBurn","type":"uint8"},{"internalType":"uint8","name":"newBuyback","type":"uint8"},{"internalType":"uint8","name":"newTeam","type":"uint8"},{"internalType":"uint8","name":"newLiquidity","type":"uint8"},{"internalType":"uint8","name":"newEvents","type":"uint8"},{"internalType":"uint8","name":"newMarketing","type":"uint8"},{"internalType":"uint8","name":"newRewards","type":"uint8"}],"name":"updateRatios","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"mainSplit","type":"uint8"},{"internalType":"uint8","name":"miscSplit","type":"uint8"}],"name":"updateRewardSplit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"first","type":"uint8"},{"internalType":"uint8","name":"second","type":"uint8"},{"internalType":"uint8","name":"third","type":"uint8"}],"name":"updateSellTaxes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"threshold","type":"uint16"}],"name":"updateSwapThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"target","type":"uint16"}],"name":"updateTargetLiquidity","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newName","type":"string"},{"internalType":"string","name":"newSymbol","type":"string"}],"name":"updateTokenDetails","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawEvents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTeam","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6000600990815560c060405260809081526842616279202444494560b81b60a0526010906200002f908262000e26565b506040805180820190915260048152634244494560e01b60208201526011906200005a908262000e26565b50604080516060808201835260058083526020808401829052928401819052601380546205050562ffffff1991821681179092558551808501875283815280860184905286019290925260148054909216179055825160e08101845260008082528184018190528185018190526028828401526080808301829052603c60a084015260c0909201526015805466ffffffffffffff1916653c002800000017905583518083018552730d7d4e9bbe63c1fe7888ef65a1bd4f34163857a8808252818501819052908501819052601680546001600160a01b03199081168317909155601780548216831790556018805490911690911790558351908101845260048082529281018390529283019190915260c8910152601c805466c80004000400046001600160401b03199091161790556063601e55601f805461ffff1916606417905562015180602455602580547fc02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000190014000000000101006bff00000000000000000000ff909116179055620001e96012600a62001005565b620001f990633b9aca0062001016565b602f553480156200020957600080fd5b50600080546001600160a01b031916339081178255604051909182917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350466001036200028057602880546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055620002ba565b46600503620002b557602880546001600160a01b031916737a250d5630b4cf539739df2c5dacb4c659f2488d179055620002ba565b600080fd5b602854602780546001600160a01b0319166001600160a01b0390921691821790556040805163c45a015560e01b8152905163c45a0155916004808201926020929091908290030181865afa15801562000317573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200033d919062001030565b6001600160a01b031663c9c6539630602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003a0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003c6919062001030565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af115801562000414573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200043a919062001030565b602680546001600160a01b0319166001600160a01b039290921691909117905562000483336200046d6012600a62001005565b6200047d90633b9aca0062001016565b620008c0565b3360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef620004b56012600a62001005565b620004c590633b9aca0062001016565b60405190815260200160405180910390a33060009081526002602090815260408083206027546001600160a01b031684529091529020600019905560155460ff66010000000000008204811691650100000000008104821691640100000000820481169163010000008104821691620100008204811691620005509161010082048116911662001062565b6200055c919062001062565b62000568919062001062565b62000574919062001062565b62000580919062001062565b6200058c919062001062565b601d805460ff191660ff928316908117909155601554620005af9216906200107e565b601d805461ff00191661010060ff93841681029190911791829055601554620005e893630100000090910481169291909104166200107e565b601d805460ff92909216620100000262ff000019909216919091179055620006136012600a62001005565b6200062390633b9aca0062001016565b60129081556040805160608101909152601c549091829161ffff660100000000000082048116929116906200065a90600a62001005565b6200066a90633b9aca0062001016565b62000676919062001016565b6200068291906200109a565b8152601c5460209091019061ffff6601000000000000820481169162010000900416620006b26012600a62001005565b620006c290633b9aca0062001016565b620006ce919062001016565b620006da91906200109a565b8152601c5460209091019061ffff660100000000000082048116916401000000009004166200070c6012600a62001005565b6200071c90633b9aca0062001016565b62000728919062001016565b6200073491906200109a565b90528051601955602080820151601a55604090910151601b556200076690600c90339062002efb62000a47821b17901c565b506018546200078d90600c906001600160a01b031662000a47602090811b62002efb17901c565b50601654620007b490600c906001600160a01b031662000a47602090811b62002efb17901c565b50601754620007db90600c906001600160a01b031662000a47602090811b62002efb17901c565b50620007f730600c62000a4760201b62002efb1790919060201c565b506200081561dead600c62000a4760201b62002efb1790919060201c565b506200083130600e62000a4760201b62002efb1790919060201c565b506200084f61dead600e62000a4760201b62002efb1790919060201c565b506027546200087690600e906001600160a01b031662000a47602090811b62002efb17901c565b506026546200089d90600e906001600160a01b031662000a47602090811b62002efb17901c565b50602754620008ba9030906001600160a01b031660001962000a67565b62001105565b6001600160a01b038216600090815260016020526040812054620008e6908390620010bd565b90506200090383600e62000b6260201b62002f101790919060201c565b1562000929576001600160a01b0390921660009081526001602052604090209190915550565b81602f60008282546200093d9190620010bd565b90915550600090506200095284600162000b85565b9050600062000962858262000b85565b6001600160a01b03861660009081526001602052604090208490556034549091506200099090849062001016565b6001600160a01b038616600090815260296020908152604080832093909355602a90529081208054849290620009c8908490620010bd565b9091555050603554620009dd90849062001016565b6001600160a01b0386166000908152602b6020908152604080832093909355602c9052908120805483929062000a15908490620010bd565b90915550506001600160a01b038516600090815260016020526040902083905562000a408562000cb1565b5050505050565b600062000a5e836001600160a01b03841662000d2f565b90505b92915050565b6001600160a01b03831662000ab75760405162461bcd60e51b8152602060048201526011602482015270417070726f76652066726f6d207a65726f60781b60448201526064015b60405180910390fd5b6001600160a01b03821662000b015760405162461bcd60e51b815260206004820152600f60248201526e417070726f766520746f207a65726f60881b604482015260640162000aae565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b0381166000908152600183016020526040812054151562000a5e565b6000811562000c2a576001600160a01b03831660009081526001602052604081205460345462000bb6919062001016565b6001600160a01b03851660009081526029602052604090205490915081101562000be557600091505062000a61565b6001600160a01b038416600090815260296020526040902054680100000000000000009062000c159083620010d3565b62000c2191906200109a565b91505062000a61565b6001600160a01b03831660009081526001602052604081205460355462000c52919062001016565b6001600160a01b0385166000908152602b602052604090205490915081101562000c8157600091505062000a61565b6001600160a01b0384166000908152602b6020526040902054680100000000000000009062000c159083620010d3565b6001600160a01b0381166000908152600b602052604090205460ff1662000d2c57600980546000908152600a6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600b9091528120805460ff191660011790558154919062000d2683620010e9565b91905055505b50565b600081815260018301602052604081205462000d785750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915562000a61565b50600062000a61565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000dac57607f821691505b60208210810362000dcd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000e2157600081815260208120601f850160051c8101602086101562000dfc5750805b601f850160051c820191505b8181101562000e1d5782815560010162000e08565b5050505b505050565b81516001600160401b0381111562000e425762000e4262000d81565b62000e5a8162000e53845462000d97565b8462000dd3565b602080601f83116001811462000e92576000841562000e795750858301515b600019600386901b1c1916600185901b17855562000e1d565b600085815260208120601f198616915b8281101562000ec35788860151825594840194600190910190840162000ea2565b508582101562000ee25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000f4957816000190482111562000f2d5762000f2d62000ef2565b8085161562000f3b57918102915b93841c939080029062000f0d565b509250929050565b60008262000f625750600162000a61565b8162000f715750600062000a61565b816001811462000f8a576002811462000f955762000fb5565b600191505062000a61565b60ff84111562000fa95762000fa962000ef2565b50506001821b62000a61565b5060208310610133831016604e8410600b841016171562000fda575081810a62000a61565b62000fe6838362000f08565b806000190482111562000ffd5762000ffd62000ef2565b029392505050565b600062000a5e60ff84168362000f51565b808202811582820484141762000a615762000a6162000ef2565b6000602082840312156200104357600080fd5b81516001600160a01b03811681146200105b57600080fd5b9392505050565b60ff818116838216019081111562000a615762000a6162000ef2565b60ff828116828216039081111562000a615762000a6162000ef2565b600082620010b857634e487b7160e01b600052601260045260246000fd5b500490565b8082018082111562000a615762000a6162000ef2565b8181038181111562000a615762000a6162000ef2565b600060018201620010fe57620010fe62000ef2565b5060010190565b615f8f80620011156000396000f3fe6080604052600436106105f05760003560e01c80636c3fb9321161030c578063aa761b1e1161019a578063d83062b4116100ec578063edb4903711610095578063fab91b681161006f578063fab91b68146112b0578063fbcdba7614611318578063fe575a871461136a57600080fd5b8063edb4903714611250578063f0858b3814611270578063f2fde38b1461129057600080fd5b8063e475591e116100c6578063e475591e146111fa578063eb91e65114611210578063ecd577b11461123057600080fd5b8063d83062b41461116d578063dd62ed3e14611194578063e08e860c146111da57600080fd5b8063c6831cd81161014e578063d1ecfc6811610128578063d1ecfc6814611108578063d4229e8914611138578063d53728b11461114d57600080fd5b8063c6831cd81461109b578063ceda4e2c146110c8578063d0291d66146110e857600080fd5b8063b32785141161017f578063b327851414610fcb578063bb51f32d14611066578063c0fb814c1461107b57600080fd5b8063aa761b1e14610f96578063b1d12d5714610fab57600080fd5b80638739f8ea1161025e5780639cfe42da11610207578063a9059cbb116101e1578063a9059cbb14610f26578063a9516a2b14610f46578063a96a66d214610f6657600080fd5b80639cfe42da14610ec6578063a1c47e7014610ee6578063a457c2d714610f0657600080fd5b806394e268111161023857806394e2681114610e5b57806395d89b4114610e7b578063977e4d2c14610e9057600080fd5b80638739f8ea14610e1d578063893d20e814610e3d5780638da5cb5b14610e3d57600080fd5b8063715018a6116102c057806379ebe4bd1161029a57806379ebe4bd14610d975780637b45d43114610db757806386a35f2514610e0857600080fd5b8063715018a614610d4d5780637335307b14610d625780637888071014610d8257600080fd5b80636f268a99116102f15780636f268a9914610ca057806370a0823114610cf7578063710502a314610d2d57600080fd5b80636c3fb93214610c545780636d330c1014610c7357600080fd5b8063307aebc91161048957806351bc3c85116103db5780635a476abb116103845780635d098b381161035e5780635d098b3814610bff578063612e614c14610c1f5780636bb1702d14610c3f57600080fd5b80635a476abb14610baa5780635bc65bf514610bca5780635cf4f86514610bea57600080fd5b806355079aa5116103b557806355079aa514610b4a57806355700f5914610b6a578063562f194b14610b8a57600080fd5b806351bc3c8514610aec57806351e287c614610b15578063533b3bfc14610b3557600080fd5b80634089b1701161043d5780634846c14c116104175780634846c14c14610aa2578063491e91ee14610ac25780634d70ac1914610ad757600080fd5b80634089b17014610a335780634347584f14610a4957806347aaa47514610a8257600080fd5b8063395093511161046e57806339509351146109c35780633af32abf146109e35780633efd929a14610a1357600080fd5b8063307aebc914610987578063313ce567146109a157600080fd5b80631525ff7d1161054257806320a8d3fb116104f657806324240516116104d0578063242405161461093257806328771ca2146109525780632aea52ab1461096757600080fd5b806320a8d3fb146108b257806320edeaf3146108e257806323b872dd1461091257600080fd5b806318f5e0751161052757806318f5e075146108425780631a0e718c146108725780631d1a66df1461089257600080fd5b80631525ff7d1461080d57806318160ddd1461082d57600080fd5b806306fdde03116105a45780630abef6e01161057e5780630abef6e0146107425780630e15561a14610762578063107530dd1461078657600080fd5b806306fdde03146106c85780630940a9a7146106ea578063095ea7b31461072257600080fd5b8063059668e6116105d5578063059668e6146106535780630614117a1461067357806306f639fe1461068857600080fd5b806301339c21146105fc5780630445b6671461061357600080fd5b366105f757005b600080fd5b34801561060857600080fd5b5061061161139a565b005b34801561061f57600080fd5b5060255461063b906901000000000000000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561065f57600080fd5b5061061161066e36600461554b565b611450565b34801561067f57600080fd5b506106116115c8565b34801561069457600080fd5b506106b86106a33660046155c9565b60086020526000908152604090205460ff1681565b604051901515815260200161064a565b3480156106d457600080fd5b506106dd61161d565b60405161064a91906155e6565b3480156106f657600080fd5b5060265461070a906001600160a01b031681565b6040516001600160a01b03909116815260200161064a565b34801561072e57600080fd5b506106b861073d366004615634565b6116af565b34801561074e57600080fd5b5061061161075d3660046156ac565b6116c6565b34801561076e57600080fd5b5061077860375481565b60405190815260200161064a565b34801561079257600080fd5b506107d96025546301000000810460ff90811692650100000000008304821692600160301b81048316926401000000008204169167010000000000000090910461ffff1690565b604080519515158652931515602086015291151592840192909252901515606083015261ffff16608082015260a00161064a565b34801561081957600080fd5b506106116108283660046155c9565b611798565b34801561083957600080fd5b50601254610778565b34801561084e57600080fd5b506106b861085d3660046155c9565b600b6020526000908152604090205460ff1681565b34801561087e57600080fd5b5061061161088d3660046156ee565b611824565b34801561089e57600080fd5b506106116108ad36600461571a565b6118b5565b3480156108be57600080fd5b506106b86108cd3660046155c9565b60066020526000908152604090205460ff1681565b3480156108ee57600080fd5b506108f761194e565b6040805193845260208401929092529082015260600161064a565b34801561091e57600080fd5b506106b861092d36600461575d565b6119a8565b34801561093e57600080fd5b5061061161094d3660046156ac565b611a48565b34801561095e57600080fd5b50610778611b15565b34801561097357600080fd5b5061061161098236600461579e565b611b3a565b34801561099357600080fd5b506021546106b89060ff1681565b3480156109ad57600080fd5b5060125b60405160ff909116815260200161064a565b3480156109cf57600080fd5b506106b86109de366004615634565b611b8b565b3480156109ef57600080fd5b506106b86109fe3660046155c9565b60046020526000908152604090205460ff1681565b348015610a1f57600080fd5b50610611610a2e36600461579e565b611bc2565b348015610a3f57600080fd5b5061077860365481565b348015610a5557600080fd5b5060305460315460325460335460408051948552602085019390935291830152606082015260800161064a565b348015610a8e57600080fd5b50610611610a9d3660046157bb565b611c27565b348015610aae57600080fd5b50610611610abd3660046155c9565b611ce8565b348015610ace57600080fd5b50610611611e2e565b348015610ae357600080fd5b50610778611fdc565b348015610af857600080fd5b506025546106b8906b010000000000000000000000900460ff1681565b348015610b2157600080fd5b50610611610b30366004615817565b612013565b348015610b4157600080fd5b5061077861205d565b348015610b5657600080fd5b50610611610b65366004615830565b612070565b348015610b7657600080fd5b50610611610b8536600461584b565b6120f8565b348015610b9657600080fd5b50610611610ba53660046158a2565b612175565b348015610bb657600080fd5b50610611610bc53660046158db565b6121da565b348015610bd657600080fd5b50610611610be53660046158f7565b6121ec565b348015610bf657600080fd5b50610611612284565b348015610c0b57600080fd5b50610611610c1a3660046155c9565b6122ae565b348015610c2b57600080fd5b50610611610c3a366004615817565b612332565b348015610c4b57600080fd5b50610611612344565b348015610c6057600080fd5b50601954601a54601b546108f792919083565b348015610c7f57600080fd5b50610778610c8e3660046155c9565b602e6020526000908152604090205481565b348015610cac57600080fd5b50601654601754601854610ccd926001600160a01b03908116928116911683565b604080516001600160a01b039485168152928416602084015292169181019190915260600161064a565b348015610d0357600080fd5b50610778610d123660046155c9565b6001600160a01b031660009081526001602052604090205490565b348015610d3957600080fd5b50610611610d483660046156ac565b61240b565b348015610d5957600080fd5b506106116124e7565b348015610d6e57600080fd5b506106b8610d7d3660046155c9565b612539565b348015610d8e57600080fd5b50610611612546565b348015610da357600080fd5b5060285461070a906001600160a01b031681565b348015610dc357600080fd5b50601354610de49060ff808216916101008104821691620100009091041683565b6040805160ff9485168152928416602084015292169181019190915260600161064a565b348015610e1457600080fd5b506109b1600a81565b348015610e2957600080fd5b50610611610e383660046158a2565b61256d565b348015610e4957600080fd5b506000546001600160a01b031661070a565b348015610e6757600080fd5b50610778610e763660046155c9565b6125dd565b348015610e8757600080fd5b506106dd6125f2565b348015610e9c57600080fd5b5061070a610eab366004615817565b600a602052600090815260409020546001600160a01b031681565b348015610ed257600080fd5b50610611610ee13660046155c9565b612601565b348015610ef257600080fd5b50610778610f013660046155c9565b612697565b348015610f1257600080fd5b506106b8610f21366004615634565b6126a5565b348015610f3257600080fd5b506106b8610f41366004615634565b612732565b348015610f5257600080fd5b50610611610f613660046156ee565b61273f565b348015610f7257600080fd5b506106b8610f813660046155c9565b60076020526000908152604090205460ff1681565b348015610fa257600080fd5b506106116127c5565b348015610fb757600080fd5b50610611610fc63660046158a2565b612809565b348015610fd757600080fd5b506015546110239060ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691600160301b9091041687565b6040805160ff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e00161064a565b34801561107257600080fd5b5061061161283c565b34801561108757600080fd5b5061061161109636600461571a565b6128cc565b3480156110a757600080fd5b50601454610de49060ff808216916101008104821691620100009091041683565b3480156110d457600080fd5b506106116110e33660046155c9565b612965565b3480156110f457600080fd5b506106116111033660046159cd565b6129c8565b34801561111457600080fd5b506106b86111233660046155c9565b60056020526000908152604090205460ff1681565b34801561114457600080fd5b506106116129e9565b34801561115957600080fd5b50610611611168366004615a31565b612ab7565b34801561117957600080fd5b5060255461070a90600160601b90046001600160a01b031681565b3480156111a057600080fd5b506107786111af366004615ab7565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156111e657600080fd5b506106116111f53660046155c9565b612c95565b34801561120657600080fd5b5061077860095481565b34801561121c57600080fd5b5061061161122b3660046155c9565b612d19565b34801561123c57600080fd5b5061061161124b3660046158a2565b612d7b565b34801561125c57600080fd5b5061061161126b36600461579e565b612dae565b34801561127c57600080fd5b5061061161128b3660046155c9565b612dd2565b34801561129c57600080fd5b506106116112ab3660046155c9565b612e85565b3480156112bc57600080fd5b50601c546112ea9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff9586168152938516602085015291841691830191909152909116606082015260800161064a565b34801561132457600080fd5b50602254602554604080519283526000602084015260ff80831691840191909152610100820481161515606084015262010000909104161515608082015260a00161064a565b34801561137657600080fd5b506106b86113853660046155c9565b60036020526000908152604090205460ff1681565b6113a2612f32565b602660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114199190615ae5565b6000036114395760405163031ff06760e31b815260040160405180910390fd5b6021805460ff191660011790554360225542602355565b611458612f32565b60006114666012600a615bf8565b61147490633b9aca00615c07565b9050811561148157506012545b600061148f6103e883615c1e565b905060008461ffff168861ffff16846114a89190615c07565b6114b29190615c1e565b905060008561ffff168861ffff16856114cb9190615c07565b6114d59190615c1e565b905060008661ffff168861ffff16866114ee9190615c07565b6114f89190615c1e565b90508383108061150757508382105b156115255760405163b4fa3fb360e01b815260040160405180910390fd5b60408051606080820183528582526020808301869052918301849052601995909555601a93909355601b91909155805160808101825261ffff9a8b16808252998b16928101839052978a169088018190529590981695018590525050601c805463ffffffff1916909417620100009095029490941767ffffffff00000000191664010000000090910267ffff000000000000191617600160301b90910217905550565b6115d0612f6b565b60205442101561160d57426020546115e89190615c40565b604051630b177c6d60e01b815260040161160491815260200190565b60405180910390fd5b4260205561161b3347612f90565b565b60606010805461162c90615c53565b80601f016020809104026020016040519081016040528092919081815260200182805461165890615c53565b80156116a55780601f1061167a576101008083540402835291602001916116a5565b820191906000526020600020905b81548152906001019060200180831161168857829003601f168201915b5050505050905090565b60006116bc338484613033565b5060015b92915050565b6116ce612f32565b60005b81811015611793576001600760008585858181106116f1576116f1615c8d565b905060200201602081019061170691906155c9565b6001600160a01b0316815260208101919091526040016000908120805460ff19169215159290921790915560088185858581811061174657611746615c8d565b905060200201602081019061175b91906155c9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561178c81615ca3565b90506116d1565b505050565b6117a0612f6b565b6016546001600160a01b03166117b7600c82613141565b50601680546001600160a01b0319166001600160a01b0384169081179091556117e290600c90612efb565b506040516001600160a01b03831681527f88b8edda57af64d7425b090e9e8d925c96d2cc1360afdc15f0da29752103e705906020015b60405180910390a15050565b61182c612f32565b60328161ffff1611156118525760405163b4fa3fb360e01b815260040160405180910390fd5b602580546affff0000000000000000001916690100000000000000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b6118bd612f32565b600a60ff841611806118d25750600a60ff8316115b806118e05750600a60ff8216115b15611901576040516336d9935160e11b8152600a6004820152602401611604565b6040805160608101825260ff948516808252938516602082018190529290941693018390526013805461ffff19169092176101009091021762ff0000191662010000909202919091179055565b6000806000806012546012600a6119659190615bf8565b61197390633b9aca00615c07565b61197d9190615c40565b905061198b6012600a615bf8565b61199990633b9aca00615c07565b60125490959094509092509050565b60006119b5848484613156565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015611a295760405162461bcd60e51b815260206004820152601460248201527f5472616e73666572203e20616c6c6f77616e63650000000000000000000000006044820152606401611604565b611a3d8533611a388685615c40565b613033565b506001949350505050565b611a50612f32565b60005b8181101561179357600060076000858585818110611a7357611a73615c8d565b9050602002016020810190611a8891906155c9565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155600881858585818110611ac857611ac8615c8d565b9050602002016020810190611add91906155c9565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611b0e81615ca3565b9050611a53565b6000602054421015611b345742602054611b2f9190615c40565b905090565b50600090565b611b42612f32565b602580548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e7906118aa90831515815260200190565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916116bc918590611a38908690615cbc565b611bca612f32565b602580548215156b010000000000000000000000026bff0000000000000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f5906118aa90831515815260200190565b611c2f612f32565b6025805465ff00ff0000001916630100000086151590810265ff0000000000191691909117650100000000008615159081029190911766ff00ff000000001916600160301b86151590810264ff00000000191691909117640100000000861515908102919091179094556040805193845260208401929092529082015260608101919091527fdaf0e941de3de3b93008d9be1a9790a2efbb6515c61e99ba547a7adefdbc2b58906080015b60405180910390a150505050565b611cf0612f6b565b6026546001600160a01b0382811691161480611d1457506001600160a01b03811630145b15611d325760405163b4fa3fb360e01b815260040160405180910390fd5b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da69190615ae5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117939190615ccf565b611e36612f6b565b602054421015611e4e57426020546115e89190615c40565b426020556026546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190615ae5565b60275460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3c9190615ccf565b5060275460405163af2979eb60e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a48201526001600160a01b039091169063af2979eb9060c4016020604051808303816000875af1158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd9190615ae5565b50611fd83347612f90565b5050565b6012546026546001600160a01b031660009081526001602052604081205490918291612009906064615c07565b6116c09190615c1e565b61201b612f6b565b61202d6120284283615cbc565b613391565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c906020016118aa565b6000806036546037546116c09190615c40565b612078612f32565b6000601e54116120f05760405162461bcd60e51b815260206004820152603d60248201527f4c61756e6368205472616e736665722054617820686173206265656e2072656d60448201527f6f76656420616e642063616e6e6f742062652072652d656e61626c65640000006064820152608401611604565b60ff16601e55565b612100612f32565b60005b8281101561216f57816004600086868581811061212257612122615c8d565b905060200201602081019061213791906155c9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561216881615ca3565b9050612103565b50505050565b61217d612f32565b80156121915761218c826133a4565b61219a565b61219a826134d8565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101611818565b6121e2612f32565b611fd882826135a1565b6121f4612f32565b60006122008284615cec565b90508060ff166064146122265760405163b4fa3fb360e01b815260040160405180910390fd5b601f805460ff85811661ffff199092168217610100918616918202179092556040805191825260208201929092527f6e548f9f5ce86d7611440679c01b8993f57c41013146bcca5dbc8fc15bad2908910160405180910390a1505050565b61228c612f6b565b6033805460009091556018546122ab906001600160a01b031682612f90565b50565b6122b6612f6b565b6018546001600160a01b03166122cd600c82613141565b50601880546001600160a01b0319166001600160a01b0384169081179091556122f890600c90612efb565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001611818565b61233a612f6b565b6122ab81306137c4565b61234c612f6b565b60205442101561236457426020546115e89190615c40565b6026546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156123b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d59190615ae5565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401611deb565b612413612f32565b60005b818110156117935760006007600085858581811061243657612436615c8d565b905060200201602081019061244b91906155c9565b6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060016008600085858581811061249a5761249a615c8d565b90506020020160208101906124af91906155c9565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556124e081615ca3565b9050612416565b6124ef612f32565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006116c0600e83612f10565b61254e612f6b565b6032805460009091556017546122ab906001600160a01b031682612f90565b612575612f32565b8015156001036125905761258a600c83612efb565b5061259d565b61259b600c83613141565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101611818565b6000806125eb836000613952565b9392505050565b60606011805461162c90615c53565b612609612f6b565b6024546023546126199190615cbc565b42111561263957604051632ed6130560e01b815260040160405180910390fd5b6001600160a01b03811660009081526003602052604090205460ff16156126735760405163f53de75f60e01b815260040160405180910390fd5b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000806125eb836001613952565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156127195760405162461bcd60e51b815260206004820152600c60248201527f3c3020616c6c6f77616e636500000000000000000000000000000000000000006044820152606401611604565b6127283385611a388685615c40565b5060019392505050565b60006116bc338484613156565b612747612f32565b60648161ffff16111561276d5760405163b4fa3fb360e01b815260040160405180910390fd5b6025805468ffff00000000000000191667010000000000000061ffff8416908102919091179091556040519081527f0719bea218bb20d56176f7e21c07a2db9c2e335f55eab3547b09add23d5cd950906020016118aa565b6127ce336134d8565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b612811612f32565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b612844612f6b565b600061284e61205d565b6030546033546032546031546128649047615c40565b61286e9190615c40565b6128789190615c40565b6128829190615c40565b61288c9190615c40565b90508015156000816128a0576031546128ae565b826031546128ae9190615cbc565b6000603155601654909150611793906001600160a01b031682612f90565b6128d4612f32565b600a60ff841611806128e95750600a60ff8316115b806128f75750600a60ff8216115b15612918576040516336d9935160e11b8152600a6004820152602401611604565b6040805160608101825260ff948516808252938516602082018190529290941693018390526014805461ffff19169092176101009091021762ff0000191662010000909202919091179055565b61296d612f32565b602580546bffffffffffffffffffffffff16600160601b6001600160a01b038416908102919091179091556040519081527f7e94313b20e9daf0774b25eef7a87193a184bb0ee343dd2198d25867be788857906020016118aa565b6129d0612f6b565b60106129dc8382615d4b565b5060116117938282615d4b565b602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a609190615e0b565b6025546001600160a01b03918216600160601b90910490911603612a955761161b3333612a8e336001613952565b6001613a12565b60255461161b903390600160601b90046001600160a01b031660006001613af0565b612abf612f32565b6040805160e08101825260ff89811680835289821660208401819052898316948401859052888316606085018190528884166080860181905288851660a0870181905294881660c09096018690526015805461ffff19169094176101009093029290921763ffff000019166201000090960263ff00000019169590951763010000009095029490941765ffff00000000191664010000000090940265ff0000000000191693909317650100000000009091021766ff0000000000001916600160301b9091021790558082848688612b968b8d615cec565b612ba09190615cec565b612baa9190615cec565b612bb49190615cec565b612bbe9190615cec565b612bc89190615cec565b601d805460ff191660ff929092169182179055612be6908890615e28565b601d805461ff00191661010060ff93841681029190911791829055612c119287929190910416615e28565b601d805462ff000019166201000060ff938416021790556040805189831681528883166020820152878316818301528683166060820152858316608082015284831660a082015291831660c0830152517fe70859a9c26f4af0b10019f37bd3b5831526e38f6f014e71e0b09473318a75eb9160e0908290030190a150505050505050565b612c9d612f6b565b6017546001600160a01b0316612cb4600c82613141565b50601780546001600160a01b0319166001600160a01b038416908117909155612cdf90600c90612efb565b506040516001600160a01b03831681527f501cb1a9ca070bd0ad5fe884a0a449b43c7dc226d9e7a808159a37bdb49cddc790602001611818565b612d21612f6b565b6001600160a01b03811660009081526003602052604090205460ff16612d5a5760405163711004dd60e01b815260040160405180910390fd5b6001600160a01b03166000908152600360205260409020805460ff19169055565b612d83612f32565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b612db6612f32565b60258054911515620100000262ff000019909216919091179055565b602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e499190615e0b565b6001600160a01b0316816001600160a01b031603612e78576122ab3333612e71336000613952565b6000613a12565b6122ab3382600080613af0565b612e8d612f32565b6001600160a01b038116612ea057600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006125eb836001600160a01b038416613e9b565b6001600160a01b038116600090815260018301602052604081205415156125eb565b33612f456000546001600160a01b031690565b6001600160a01b03161461161b576040516282b42960e81b815260040160405180910390fd5b612f7433613eea565b61161b576040516282b42960e81b815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612fdd576040519150601f19603f3d011682016040523d82523d6000602084013e612fe2565b606091505b50509050806117935760405162461bcd60e51b815260206004820152600f60248201527f7769746864726177206661696c656400000000000000000000000000000000006044820152606401611604565b6001600160a01b0383166130895760405162461bcd60e51b815260206004820152601160248201527f417070726f76652066726f6d207a65726f0000000000000000000000000000006044820152606401611604565b6001600160a01b0382166130df5760405162461bcd60e51b815260206004820152600f60248201527f417070726f766520746f207a65726f00000000000000000000000000000000006044820152606401611604565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006125eb836001600160a01b038416613f47565b6001600160a01b0383166131ac5760405162461bcd60e51b815260206004820152601260248201527f5472616e736665722066726f6d207a65726f00000000000000000000000000006044820152606401611604565b6001600160a01b0382166132025760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657220746f207a65726f000000000000000000000000000000006044820152606401611604565b61deac196001600160a01b0383160161321f576117938382614034565b60255465010000000000900460ff161561323b5761323b6140f3565b6000613248600c85612f10565b806132595750613259600c84612f10565b905060006001600160a01b03851630148061327c57506001600160a01b03841630145b6027546026549192506001600160a01b039081169160009188811691161480156132b75750816001600160a01b0316866001600160a01b0316145b806132eb57506026546001600160a01b0387811691161480156132eb5750816001600160a01b0316876001600160a01b0316145b6026549091506000906001600160a01b038881169116148061331e5750826001600160a01b0316876001600160a01b0316145b6026549091506000906001600160a01b038a8116911614806133515750836001600160a01b0316896001600160a01b0316145b9050848061335c5750825b806133645750855b156133795761337489898961418b565b613386565b613386898989848661421d565b505050505050505050565b602054811161339f57600080fd5b602055565b6133af600e82612f10565b156133b957600080fd5b6001600160a01b038116600090815260016020526040812054602f8054919290916133e5908490615c40565b90915550600090506133f88260016148ef565b905060006134078360006148ef565b6034546001600160a01b03851660009081526001602052604090205491925061342f91615c07565b6001600160a01b0384166000908152602960209081526040808320939093556035546001909152919020546134649190615c07565b6001600160a01b0384166000908152602b6020908152604080832093909355602a9052908120805484929061349a908490615cbc565b90915550506001600160a01b0383166000908152602c6020526040812080548392906134c7908490615cbc565b9091555061216f9050600e84612efb565b6134e3600e82612f10565b6134ec57600080fd5b6001600160a01b038116600090815260016020526040812054602f805491929091613518908490615cbc565b909155506135299050600e82613141565b506034546001600160a01b0382166000908152600160205260409020546135509190615c07565b6001600160a01b0382166000908152602960209081526040808320939093556035546001909152919020546135859190615c07565b6001600160a01b039091166000908152602b6020526040902055565b6038805460ff191660011790556101f461ffff831611156135c157600080fd5b601d54610100900460ff16156137b65730600090815260016020526040808220546026546001600160a01b03168352908220549091906103e89061360a9061ffff871690615c07565b6136149190615c1e565b601a5490915081118015613626575082155b156136305750601a545b808210801561364f5783156136475782915061364f565b5050506137b6565b3060009081526002602090815260408083206027546001600160a01b03168452909152902054821115613696576027546136969030906001600160a01b0316600019613033565b602554600090600160301b900460ff1680156136ca5750602554670100000000000000900461ffff166136c7611fdc565b10155b156136d7575060006136e6565b506015546301000000900460ff165b601d54600090610100900460ff166136fe8386615c07565b6137089190615c1e565b905060006137168286615c40565b90506000613725600284615c1e565b905060006137338285615c40565b905060006137418483615cbc565b90504761374d82614a0b565b60006137598247615c40565b90506000836137688684615c07565b6137729190615c1e565b90508515613784576137848682614b64565b6000816137918547615c40565b61379b9190615c40565b90506137a8816001614c0e565b505050505050505050505050505b50506038805460ff19169055565b6030548211156137e757604051631e9acf1760e31b815260040160405180910390fd5b81603060008282546137f99190615c40565b90915550506040805160028082526060820183526000926020830190803683375050602754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388c9190615e0b565b8160008151811061389f5761389f615c8d565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106138d3576138d3615c8d565b6001600160a01b03928316602091820292909201015260275460405163b6f9de9560e01b815291169063b6f9de9590859061391b90600090869061dead904290600401615e85565b6000604051808303818588803b15801561393457600080fd5b505af1158015613948573d6000803e3d6000fd5b5050505050505050565b600081156139be57613965600e84612f10565b1561398957506001600160a01b0382166000908152602a60205260409020546116c0565b6001600160a01b0383166000908152602a60205260409020546139ad8460016148ef565b6139b79190615cbc565b90506116c0565b6139c9600e84612f10565b156139ed57506001600160a01b0382166000908152602c60205260409020546116c0565b6001600160a01b0383166000908152602c6020526040812054906139ad9085906148ef565b603854610100900460ff1615613a2757600080fd5b81600003613a3457600080fd5b6038805461ff001916610100179055613a4e848383614e86565b8160366000828254613a609190615cbc565b90915550506001600160a01b0383166000908152602e602052604081208054849290613a8d908490615cbc565b90915550613a9d90508383612f90565b6038805461ff0019169055604080516001600160a01b038087168252851660208201529081018390527fe16a172e3edbd821d678f146e4890ab8f451a8d37dc0994c4a9b14799186299a90606001611cda565b603854610100900460ff1615613b0557600080fd5b6038805461ff0019166101001790556000613b21600e86612f10565b15613b72578115613b4f57506001600160a01b0384166000908152602a602052604081208054919055613c70565b506001600160a01b0384166000908152602c602052604081208054919055613c70565b6000613b7e86846148ef565b90508215613bfc576001600160a01b038616600090815260016020526040902054603454613bac9190615c07565b6001600160a01b038716600090815260296020908152604080832093909355602a90522054613bdc908290615cbc565b6001600160a01b0387166000908152602a60205260408120559150613c6e565b6001600160a01b038616600090815260016020526040902054603554613c229190615c07565b6001600160a01b0387166000908152602b6020908152604080832093909355602c90522054613c52908290615cbc565b6001600160a01b0387166000908152602c602052604081205591505b505b80158015613c7c575082155b15613c9257506038805461ff001916905561216f565b8060366000828254613ca49190615cbc565b90915550506001600160a01b0385166000908152602e602052604081208054839290613cd1908490615cbc565b90915550613ce190508382615cbc565b60408051600280825260608201835292935060009290916020830190803683375050602754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d749190615e0b565b81600081518110613d8757613d87615c8d565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600181518110613dbb57613dbb615c8d565b6001600160a01b03928316602091820292909201015260275460405163b6f9de9560e01b815291169063b6f9de95908490613e019060009086908c904290600401615e85565b6000604051808303818588803b158015613e1a57600080fd5b505af1158015613e2e573d6000803e3d6000fd5b50505050507f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d26698911828688604051613e80939291909283526001600160a01b03918216602084015216604082015260600190565b60405180910390a150506038805461ff001916905550505050565b6000818152600183016020526040812054613ee2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556116c0565b5060006116c0565b600080546001600160a01b0383811691161480613f1457506018546001600160a01b038381169116145b80613f2c57506016546001600160a01b038381169116145b806116c05750506017546001600160a01b0390811691161490565b6000818152600183016020526040812054801561402a576000613f6b600183615c40565b8554909150600090613f7f90600190615c40565b90506000866000018281548110613f9857613f98615c8d565b9060005260206000200154905080876000018481548110613fbb57613fbb615c8d565b600091825260208083209091019290925582815260018901909152604090208490558654879080613fee57613fee615eba565b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506116c0565b60009150506116c0565b6001600160a01b03821660009081526001602052604090205481111561405957600080fd5b60385462010000900460ff161561406f57600080fd5b6038805462ff000019166201000017905561408a828261506a565b806012600082825461409c9190615c40565b909155505060405181815261dead906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350506038805462ff000019169055565b601c5460125461ffff600160301b830481169261411c9264010000000090910490911690615c07565b6141269190615c1e565b601b55601c5460125461ffff600160301b8304811692614150926201000090910490911690615c07565b61415a9190615c1e565b601a55601c5460125461ffff600160301b830481169261417c92911690615c07565b6141869190615c1e565b601955565b6001600160a01b0383166000908152600160205260409020548111156141c457604051631e9acf1760e31b815260040160405180910390fd5b6141ce838261506a565b6141d882826151ab565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161313491815260200190565b6001600160a01b03851660009081526001602052604090205483111561425657604051631e9acf1760e31b815260040160405180910390fd5b60008080831561432457602554610100900460ff16156142aa576001600160a01b03881660009081526003602052604090205460ff16156142aa5760405163473250af60e01b815260040160405180910390fd5b601a54861180156142d457506001600160a01b03881660009081526006602052604090205460ff16155b156142f957601a54604051633dc2e93d60e21b81526004810191909152602401611604565b614304886000615309565b602554909350640100000000900460ff161561431f57600191505b6146d8565b84156145115760215460ff1615801561435657506001600160a01b03871660009081526004602052604090205460ff16155b1561437f576001600160a01b0387166000908152600360205260409020805460ff191660011790555b602254156143ec576022546000906143979043615c40565b10156143ec576001600160a01b0387166000908152600360205260408120805460ff19166001179055602580549091906143d39060ff16615ed0565b91906101000a81548160ff021916908360ff1602179055505b60255462010000900460ff161561443e576001600160a01b0387166000908152602d602052604090205443900361442257600080fd5b6001600160a01b0387166000908152602d602052604090204390555b6019546001600160a01b038816600090815260016020526040902054614465908890615cbc565b11801561448b57506001600160a01b03871660009081526006602052604090205460ff16155b156144b057601954604051633392fb9160e21b81526004810191909152602401611604565b601b54861180156144da57506001600160a01b03871660009081526006602052604090205460ff16155b156144ff57601b54604051632224c5d160e11b81526004810191909152602401611604565b61450a876001615309565b92506146d8565b602554610100900460ff161561455b576001600160a01b03881660009081526003602052604090205460ff161561455b5760405163473250af60e01b815260040160405180910390fd5b6145676012600a615bf8565b861161464157602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145e49190615e0b565b6025546001600160a01b03918216600160601b90910490911603614617576146123333612a8e336001613952565b614639565b602554614639903390600160601b90046001600160a01b031660006001613af0565b5050506148e8565b6019546001600160a01b038816600090815260016020526040902054614668908890615cbc565b11801561468e57506001600160a01b03871660009081526006602052604090205460ff16155b156146b357601954604051633392fb9160e21b81526004810191909152602401611604565b601e54156146d8576064601e54876146cb9190615c07565b6146d59190615c1e565b90505b6026546001600160a01b0389811691161480159061470857506025546b010000000000000000000000900460ff16155b8015614717575060385460ff16155b80156147205750835b1561474457602554614744906901000000000000000000900461ffff1660006135a1565b6001600160a01b03881660009081526005602052604090205460ff168061478357506001600160a01b03871660009081526005602052604090205460ff165b156147915760009250600091505b6000808060ff8616156147ea5760646147ad60ff88168b615c07565b6147b79190615c1e565b601d5460155491945060ff908116916147d1911685615c07565b6147db9190615c1e565b91506147e78284615c40565b90505b841561483c5760006147fb8a6153db565b90506148078185615cbc565b6025549094506301000000900460ff161561482d576148268184615cbc565b925061483a565b6148378183615cbc565b91505b505b831561484f5761484c8484615cbc565b92505b600061485b848b615c40565b90506148678c8b61506a565b61487130836151ab565b82601260008282546148839190615c40565b9091555061489390508b826151ab565b8a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516148d891815260200190565b60405180910390a3505050505050505b5050505050565b6000811561498a576001600160a01b03831660009081526001602052604081205460345461491d9190615c07565b6001600160a01b03851660009081526029602052604090205490915081101561494a5760009150506116c0565b6001600160a01b03841660009081526029602052604090205468010000000000000000906149789083615c40565b6149829190615c1e565b9150506116c0565b6001600160a01b0383166000908152600160205260408120546035546149b09190615c07565b6001600160a01b0385166000908152602b60205260409020549091508110156149dd5760009150506116c0565b6001600160a01b0384166000908152602b602052604090205468010000000000000000906149789083615c40565b602754614a239030906001600160a01b031683613033565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614a5857614a58615c8d565b6001600160a01b03928316602091820292909201810191909152602754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ad59190615e0b565b81600181518110614ae857614ae8615c8d565b6001600160a01b03928316602091820292909201015260275460405163791ac94760e01b815291169063791ac94790614b2e908590600090869030904290600401615eef565b600060405180830381600087803b158015614b4857600080fd5b505af1158015614b5c573d6000803e3d6000fd5b505050505050565b602754614b7c9030906001600160a01b031684613033565b60275460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614be9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906148e89190615f2b565b601d5460155460009160ff62010000909104811691614c3891650100000000009091041685615c07565b614c429190615c1e565b601d5460155491925060009160ff6201000092839004811692614c6792041686615c07565b614c719190615c1e565b601d5460155491925060009160ff62010000909204821691614c999161010090041687615c07565b614ca39190615c1e565b601d5460155491925060009160ff62010000909204821691614ccd91600160301b90041688615c07565b614cd79190615c1e565b601d5460155491925060009160ff62010000909204821691614d029164010000000090041689615c07565b614d0c9190615c1e565b601f54909150600090606490614d259060ff1685615c07565b614d2f9190615c1e565b601f54909150600090606490614d4d90610100900460ff1686615c07565b614d579190615c1e565b90508660336000828254614d6b9190615cbc565b925050819055508560316000828254614d849190615cbc565b925050819055508460306000828254614d9d9190615cbc565b925050819055508260326000828254614db69190615cbc565b90915550508315613386578715614ddf578360376000828254614dd99190615cbc565b90915550505b6000614de9615483565b905080600003614e10578460336000828254614e059190615cbc565b90915550614e7a9050565b80614e246801000000000000000085615c07565b614e2e9190615c1e565b60346000828254614e3f9190615cbc565b90915550819050614e596801000000000000000084615c07565b614e639190615c1e565b60356000828254614e749190615cbc565b90915550505b50505050505050505050565b81600003614e9357505050565b614e9d8382613952565b821115614ebd57604051631e9acf1760e31b815260040160405180910390fd5b614ec8600e84612f10565b15614f2e578015614f06576001600160a01b0383166000908152602a602052604081208054849290614efb908490615c40565b909155506117939050565b6001600160a01b0383166000908152602c602052604081208054849290614efb908490615c40565b6000614f3a84836148ef565b90508115614fd6576001600160a01b038416600090815260016020526040902054603454614f689190615c07565b6001600160a01b038516600090815260296020908152604080832093909355602a90529081208054839290614f9e908490615cbc565b90915550506001600160a01b0384166000908152602a602052604081208054859290614fcb908490615c40565b9091555061216f9050565b6001600160a01b038416600090815260016020526040902054603554614ffc9190615c07565b6001600160a01b0385166000908152602b6020908152604080832093909355602c90529081208054839290615032908490615cbc565b90915550506001600160a01b0384166000908152602c60205260408120805485929061505f908490615c40565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461508e908390615c40565b905061509b600e84612f10565b156150c0576001600160a01b0390921660009081526001602052604090209190915550565b81602f60008282546150d29190615c40565b90915550600090506150e58460016148ef565b905060006150f48560006148ef565b6001600160a01b0386166000908152600160205260409020849055603454909150615120908490615c07565b6001600160a01b038616600090815260296020908152604080832093909355602a90529081208054849290615156908490615cbc565b9091555050603554615169908490615c07565b6001600160a01b0386166000908152602b6020908152604080832093909355602c9052908120805483929061519f908490615cbc565b90915550505050505050565b6001600160a01b0382166000908152600160205260408120546151cf908390615cbc565b90506151dc600e84612f10565b15615201576001600160a01b0390921660009081526001602052604090209190915550565b81602f60008282546152139190615cbc565b90915550600090506152268460016148ef565b905060006152358560006148ef565b6001600160a01b0386166000908152600160205260409020849055603454909150615261908490615c07565b6001600160a01b038616600090815260296020908152604080832093909355602a90529081208054849290615297908490615cbc565b90915550506035546152aa908490615c07565b6001600160a01b0386166000908152602b6020908152604080832093909355602c905290812080548392906152e0908490615cbc565b90915550506001600160a01b03851660009081526001602052604090208390556148e8856154ac565b6001600160a01b03821660009081526007602052604081205460ff1615801561534b57506001600160a01b03831660009081526008602052604090205460ff16155b1561536c57816153605760145460ff166139b7565b5060135460ff166116c0565b6001600160a01b03831660009081526008602052604090205460ff16156153b557816153a35760145462010000900460ff166139b7565b5060135462010000900460ff166116c0565b816153ca57601454610100900460ff166139b7565b50601354610100900460ff166116c0565b6026546001600160a01b031660009081526001602052604081205481615402606483615c1e565b90506000615411600a84615c1e565b905081851161542557506000949350505050565b8085111561544d57606461543a86600a615c07565b6154449190615c1e565b95945050505050565b60646154598383615c40565b866154648582615c40565b61546f90600a615c07565b6154799190615c07565b61543a9190615c1e565b60006154916012600a615bf8565b61549f90633b9aca00615c07565b602f54611b2f9190615c40565b6001600160a01b0381166000908152600b602052604090205460ff166122ab57600980546000908152600a6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600b9091528120805460ff191660011790558154919061551e83615ca3565b919050555050565b803561ffff8116811461553857600080fd5b919050565b80151581146122ab57600080fd5b600080600080600060a0868803121561556357600080fd5b61556c86615526565b945061557a60208701615526565b935061558860408701615526565b925061559660608701615526565b915060808601356155a68161553d565b809150509295509295909350565b6001600160a01b03811681146122ab57600080fd5b6000602082840312156155db57600080fd5b81356125eb816155b4565b600060208083528351808285015260005b81811015615613578581018301518582016040015282016155f7565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561564757600080fd5b8235615652816155b4565b946020939093013593505050565b60008083601f84011261567257600080fd5b50813567ffffffffffffffff81111561568a57600080fd5b6020830191508360208260051b85010111156156a557600080fd5b9250929050565b600080602083850312156156bf57600080fd5b823567ffffffffffffffff8111156156d657600080fd5b6156e285828601615660565b90969095509350505050565b60006020828403121561570057600080fd5b6125eb82615526565b803560ff8116811461553857600080fd5b60008060006060848603121561572f57600080fd5b61573884615709565b925061574660208501615709565b915061575460408501615709565b90509250925092565b60008060006060848603121561577257600080fd5b833561577d816155b4565b9250602084013561578d816155b4565b929592945050506040919091013590565b6000602082840312156157b057600080fd5b81356125eb8161553d565b600080600080608085870312156157d157600080fd5b84356157dc8161553d565b935060208501356157ec8161553d565b925060408501356157fc8161553d565b9150606085013561580c8161553d565b939692955090935050565b60006020828403121561582957600080fd5b5035919050565b60006020828403121561584257600080fd5b6125eb82615709565b60008060006040848603121561586057600080fd5b833567ffffffffffffffff81111561587757600080fd5b61588386828701615660565b90945092505060208401356158978161553d565b809150509250925092565b600080604083850312156158b557600080fd5b82356158c0816155b4565b915060208301356158d08161553d565b809150509250929050565b600080604083850312156158ee57600080fd5b6158c083615526565b6000806040838503121561590a57600080fd5b61591383615709565b915061592160208401615709565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261595157600080fd5b813567ffffffffffffffff8082111561596c5761596c61592a565b604051601f8301601f19908116603f011681019082821181831017156159945761599461592a565b816040528381528660208588010111156159ad57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156159e057600080fd5b823567ffffffffffffffff808211156159f857600080fd5b615a0486838701615940565b93506020850135915080821115615a1a57600080fd5b50615a2785828601615940565b9150509250929050565b600080600080600080600060e0888a031215615a4c57600080fd5b615a5588615709565b9650615a6360208901615709565b9550615a7160408901615709565b9450615a7f60608901615709565b9350615a8d60808901615709565b9250615a9b60a08901615709565b9150615aa960c08901615709565b905092959891949750929550565b60008060408385031215615aca57600080fd5b8235615ad5816155b4565b915060208301356158d0816155b4565b600060208284031215615af757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115615b4f578160001904821115615b3557615b35615afe565b80851615615b4257918102915b93841c9390800290615b19565b509250929050565b600082615b66575060016116c0565b81615b73575060006116c0565b8160018114615b895760028114615b9357615baf565b60019150506116c0565b60ff841115615ba457615ba4615afe565b50506001821b6116c0565b5060208310610133831016604e8410600b8410161715615bd2575081810a6116c0565b615bdc8383615b14565b8060001904821115615bf057615bf0615afe565b029392505050565b60006125eb60ff841683615b57565b80820281158282048414176116c0576116c0615afe565b600082615c3b57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156116c0576116c0615afe565b600181811c90821680615c6757607f821691505b602082108103615c8757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201615cb557615cb5615afe565b5060010190565b808201808211156116c0576116c0615afe565b600060208284031215615ce157600080fd5b81516125eb8161553d565b60ff81811683821601908111156116c0576116c0615afe565b601f82111561179357600081815260208120601f850160051c81016020861015615d2c5750805b601f850160051c820191505b81811015614b5c57828155600101615d38565b815167ffffffffffffffff811115615d6557615d6561592a565b615d7981615d738454615c53565b84615d05565b602080601f831160018114615dae5760008415615d965750858301515b600019600386901b1c1916600185901b178555614b5c565b600085815260208120601f198616915b82811015615ddd57888601518255948401946001909101908401615dbe565b5085821015615dfb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215615e1d57600080fd5b81516125eb816155b4565b60ff82811682821603908111156116c0576116c0615afe565b600081518084526020808501945080840160005b83811015615e7a5781516001600160a01b031687529582019590820190600101615e55565b509495945050505050565b848152608060208201526000615e9e6080830186615e41565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103615ee657615ee6615afe565b60010192915050565b85815284602082015260a060408201526000615f0e60a0830186615e41565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215615f4057600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212201a86457c96ba3c2569629974eb63e1b80637d90a77b01bcaf4ed65abb5740b3164736f6c63430008110033

Deployed Bytecode

0x6080604052600436106105f05760003560e01c80636c3fb9321161030c578063aa761b1e1161019a578063d83062b4116100ec578063edb4903711610095578063fab91b681161006f578063fab91b68146112b0578063fbcdba7614611318578063fe575a871461136a57600080fd5b8063edb4903714611250578063f0858b3814611270578063f2fde38b1461129057600080fd5b8063e475591e116100c6578063e475591e146111fa578063eb91e65114611210578063ecd577b11461123057600080fd5b8063d83062b41461116d578063dd62ed3e14611194578063e08e860c146111da57600080fd5b8063c6831cd81161014e578063d1ecfc6811610128578063d1ecfc6814611108578063d4229e8914611138578063d53728b11461114d57600080fd5b8063c6831cd81461109b578063ceda4e2c146110c8578063d0291d66146110e857600080fd5b8063b32785141161017f578063b327851414610fcb578063bb51f32d14611066578063c0fb814c1461107b57600080fd5b8063aa761b1e14610f96578063b1d12d5714610fab57600080fd5b80638739f8ea1161025e5780639cfe42da11610207578063a9059cbb116101e1578063a9059cbb14610f26578063a9516a2b14610f46578063a96a66d214610f6657600080fd5b80639cfe42da14610ec6578063a1c47e7014610ee6578063a457c2d714610f0657600080fd5b806394e268111161023857806394e2681114610e5b57806395d89b4114610e7b578063977e4d2c14610e9057600080fd5b80638739f8ea14610e1d578063893d20e814610e3d5780638da5cb5b14610e3d57600080fd5b8063715018a6116102c057806379ebe4bd1161029a57806379ebe4bd14610d975780637b45d43114610db757806386a35f2514610e0857600080fd5b8063715018a614610d4d5780637335307b14610d625780637888071014610d8257600080fd5b80636f268a99116102f15780636f268a9914610ca057806370a0823114610cf7578063710502a314610d2d57600080fd5b80636c3fb93214610c545780636d330c1014610c7357600080fd5b8063307aebc91161048957806351bc3c85116103db5780635a476abb116103845780635d098b381161035e5780635d098b3814610bff578063612e614c14610c1f5780636bb1702d14610c3f57600080fd5b80635a476abb14610baa5780635bc65bf514610bca5780635cf4f86514610bea57600080fd5b806355079aa5116103b557806355079aa514610b4a57806355700f5914610b6a578063562f194b14610b8a57600080fd5b806351bc3c8514610aec57806351e287c614610b15578063533b3bfc14610b3557600080fd5b80634089b1701161043d5780634846c14c116104175780634846c14c14610aa2578063491e91ee14610ac25780634d70ac1914610ad757600080fd5b80634089b17014610a335780634347584f14610a4957806347aaa47514610a8257600080fd5b8063395093511161046e57806339509351146109c35780633af32abf146109e35780633efd929a14610a1357600080fd5b8063307aebc914610987578063313ce567146109a157600080fd5b80631525ff7d1161054257806320a8d3fb116104f657806324240516116104d0578063242405161461093257806328771ca2146109525780632aea52ab1461096757600080fd5b806320a8d3fb146108b257806320edeaf3146108e257806323b872dd1461091257600080fd5b806318f5e0751161052757806318f5e075146108425780631a0e718c146108725780631d1a66df1461089257600080fd5b80631525ff7d1461080d57806318160ddd1461082d57600080fd5b806306fdde03116105a45780630abef6e01161057e5780630abef6e0146107425780630e15561a14610762578063107530dd1461078657600080fd5b806306fdde03146106c85780630940a9a7146106ea578063095ea7b31461072257600080fd5b8063059668e6116105d5578063059668e6146106535780630614117a1461067357806306f639fe1461068857600080fd5b806301339c21146105fc5780630445b6671461061357600080fd5b366105f757005b600080fd5b34801561060857600080fd5b5061061161139a565b005b34801561061f57600080fd5b5060255461063b906901000000000000000000900461ffff1681565b60405161ffff90911681526020015b60405180910390f35b34801561065f57600080fd5b5061061161066e36600461554b565b611450565b34801561067f57600080fd5b506106116115c8565b34801561069457600080fd5b506106b86106a33660046155c9565b60086020526000908152604090205460ff1681565b604051901515815260200161064a565b3480156106d457600080fd5b506106dd61161d565b60405161064a91906155e6565b3480156106f657600080fd5b5060265461070a906001600160a01b031681565b6040516001600160a01b03909116815260200161064a565b34801561072e57600080fd5b506106b861073d366004615634565b6116af565b34801561074e57600080fd5b5061061161075d3660046156ac565b6116c6565b34801561076e57600080fd5b5061077860375481565b60405190815260200161064a565b34801561079257600080fd5b506107d96025546301000000810460ff90811692650100000000008304821692600160301b81048316926401000000008204169167010000000000000090910461ffff1690565b604080519515158652931515602086015291151592840192909252901515606083015261ffff16608082015260a00161064a565b34801561081957600080fd5b506106116108283660046155c9565b611798565b34801561083957600080fd5b50601254610778565b34801561084e57600080fd5b506106b861085d3660046155c9565b600b6020526000908152604090205460ff1681565b34801561087e57600080fd5b5061061161088d3660046156ee565b611824565b34801561089e57600080fd5b506106116108ad36600461571a565b6118b5565b3480156108be57600080fd5b506106b86108cd3660046155c9565b60066020526000908152604090205460ff1681565b3480156108ee57600080fd5b506108f761194e565b6040805193845260208401929092529082015260600161064a565b34801561091e57600080fd5b506106b861092d36600461575d565b6119a8565b34801561093e57600080fd5b5061061161094d3660046156ac565b611a48565b34801561095e57600080fd5b50610778611b15565b34801561097357600080fd5b5061061161098236600461579e565b611b3a565b34801561099357600080fd5b506021546106b89060ff1681565b3480156109ad57600080fd5b5060125b60405160ff909116815260200161064a565b3480156109cf57600080fd5b506106b86109de366004615634565b611b8b565b3480156109ef57600080fd5b506106b86109fe3660046155c9565b60046020526000908152604090205460ff1681565b348015610a1f57600080fd5b50610611610a2e36600461579e565b611bc2565b348015610a3f57600080fd5b5061077860365481565b348015610a5557600080fd5b5060305460315460325460335460408051948552602085019390935291830152606082015260800161064a565b348015610a8e57600080fd5b50610611610a9d3660046157bb565b611c27565b348015610aae57600080fd5b50610611610abd3660046155c9565b611ce8565b348015610ace57600080fd5b50610611611e2e565b348015610ae357600080fd5b50610778611fdc565b348015610af857600080fd5b506025546106b8906b010000000000000000000000900460ff1681565b348015610b2157600080fd5b50610611610b30366004615817565b612013565b348015610b4157600080fd5b5061077861205d565b348015610b5657600080fd5b50610611610b65366004615830565b612070565b348015610b7657600080fd5b50610611610b8536600461584b565b6120f8565b348015610b9657600080fd5b50610611610ba53660046158a2565b612175565b348015610bb657600080fd5b50610611610bc53660046158db565b6121da565b348015610bd657600080fd5b50610611610be53660046158f7565b6121ec565b348015610bf657600080fd5b50610611612284565b348015610c0b57600080fd5b50610611610c1a3660046155c9565b6122ae565b348015610c2b57600080fd5b50610611610c3a366004615817565b612332565b348015610c4b57600080fd5b50610611612344565b348015610c6057600080fd5b50601954601a54601b546108f792919083565b348015610c7f57600080fd5b50610778610c8e3660046155c9565b602e6020526000908152604090205481565b348015610cac57600080fd5b50601654601754601854610ccd926001600160a01b03908116928116911683565b604080516001600160a01b039485168152928416602084015292169181019190915260600161064a565b348015610d0357600080fd5b50610778610d123660046155c9565b6001600160a01b031660009081526001602052604090205490565b348015610d3957600080fd5b50610611610d483660046156ac565b61240b565b348015610d5957600080fd5b506106116124e7565b348015610d6e57600080fd5b506106b8610d7d3660046155c9565b612539565b348015610d8e57600080fd5b50610611612546565b348015610da357600080fd5b5060285461070a906001600160a01b031681565b348015610dc357600080fd5b50601354610de49060ff808216916101008104821691620100009091041683565b6040805160ff9485168152928416602084015292169181019190915260600161064a565b348015610e1457600080fd5b506109b1600a81565b348015610e2957600080fd5b50610611610e383660046158a2565b61256d565b348015610e4957600080fd5b506000546001600160a01b031661070a565b348015610e6757600080fd5b50610778610e763660046155c9565b6125dd565b348015610e8757600080fd5b506106dd6125f2565b348015610e9c57600080fd5b5061070a610eab366004615817565b600a602052600090815260409020546001600160a01b031681565b348015610ed257600080fd5b50610611610ee13660046155c9565b612601565b348015610ef257600080fd5b50610778610f013660046155c9565b612697565b348015610f1257600080fd5b506106b8610f21366004615634565b6126a5565b348015610f3257600080fd5b506106b8610f41366004615634565b612732565b348015610f5257600080fd5b50610611610f613660046156ee565b61273f565b348015610f7257600080fd5b506106b8610f813660046155c9565b60076020526000908152604090205460ff1681565b348015610fa257600080fd5b506106116127c5565b348015610fb757600080fd5b50610611610fc63660046158a2565b612809565b348015610fd757600080fd5b506015546110239060ff808216916101008104821691620100008204811691630100000081048216916401000000008204811691650100000000008104821691600160301b9091041687565b6040805160ff9889168152968816602088015294871694860194909452918516606085015284166080840152831660a083015290911660c082015260e00161064a565b34801561107257600080fd5b5061061161283c565b34801561108757600080fd5b5061061161109636600461571a565b6128cc565b3480156110a757600080fd5b50601454610de49060ff808216916101008104821691620100009091041683565b3480156110d457600080fd5b506106116110e33660046155c9565b612965565b3480156110f457600080fd5b506106116111033660046159cd565b6129c8565b34801561111457600080fd5b506106b86111233660046155c9565b60056020526000908152604090205460ff1681565b34801561114457600080fd5b506106116129e9565b34801561115957600080fd5b50610611611168366004615a31565b612ab7565b34801561117957600080fd5b5060255461070a90600160601b90046001600160a01b031681565b3480156111a057600080fd5b506107786111af366004615ab7565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b3480156111e657600080fd5b506106116111f53660046155c9565b612c95565b34801561120657600080fd5b5061077860095481565b34801561121c57600080fd5b5061061161122b3660046155c9565b612d19565b34801561123c57600080fd5b5061061161124b3660046158a2565b612d7b565b34801561125c57600080fd5b5061061161126b36600461579e565b612dae565b34801561127c57600080fd5b5061061161128b3660046155c9565b612dd2565b34801561129c57600080fd5b506106116112ab3660046155c9565b612e85565b3480156112bc57600080fd5b50601c546112ea9061ffff808216916201000081048216916401000000008204811691600160301b90041684565b6040805161ffff9586168152938516602085015291841691830191909152909116606082015260800161064a565b34801561132457600080fd5b50602254602554604080519283526000602084015260ff80831691840191909152610100820481161515606084015262010000909104161515608082015260a00161064a565b34801561137657600080fd5b506106b86113853660046155c9565b60036020526000908152604090205460ff1681565b6113a2612f32565b602660009054906101000a90046001600160a01b03166001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114199190615ae5565b6000036114395760405163031ff06760e31b815260040160405180910390fd5b6021805460ff191660011790554360225542602355565b611458612f32565b60006114666012600a615bf8565b61147490633b9aca00615c07565b9050811561148157506012545b600061148f6103e883615c1e565b905060008461ffff168861ffff16846114a89190615c07565b6114b29190615c1e565b905060008561ffff168861ffff16856114cb9190615c07565b6114d59190615c1e565b905060008661ffff168861ffff16866114ee9190615c07565b6114f89190615c1e565b90508383108061150757508382105b156115255760405163b4fa3fb360e01b815260040160405180910390fd5b60408051606080820183528582526020808301869052918301849052601995909555601a93909355601b91909155805160808101825261ffff9a8b16808252998b16928101839052978a169088018190529590981695018590525050601c805463ffffffff1916909417620100009095029490941767ffffffff00000000191664010000000090910267ffff000000000000191617600160301b90910217905550565b6115d0612f6b565b60205442101561160d57426020546115e89190615c40565b604051630b177c6d60e01b815260040161160491815260200190565b60405180910390fd5b4260205561161b3347612f90565b565b60606010805461162c90615c53565b80601f016020809104026020016040519081016040528092919081815260200182805461165890615c53565b80156116a55780601f1061167a576101008083540402835291602001916116a5565b820191906000526020600020905b81548152906001019060200180831161168857829003601f168201915b5050505050905090565b60006116bc338484613033565b5060015b92915050565b6116ce612f32565b60005b81811015611793576001600760008585858181106116f1576116f1615c8d565b905060200201602081019061170691906155c9565b6001600160a01b0316815260208101919091526040016000908120805460ff19169215159290921790915560088185858581811061174657611746615c8d565b905060200201602081019061175b91906155c9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561178c81615ca3565b90506116d1565b505050565b6117a0612f6b565b6016546001600160a01b03166117b7600c82613141565b50601680546001600160a01b0319166001600160a01b0384169081179091556117e290600c90612efb565b506040516001600160a01b03831681527f88b8edda57af64d7425b090e9e8d925c96d2cc1360afdc15f0da29752103e705906020015b60405180910390a15050565b61182c612f32565b60328161ffff1611156118525760405163b4fa3fb360e01b815260040160405180910390fd5b602580546affff0000000000000000001916690100000000000000000061ffff8416908102919091179091556040519081527f0e407583f00cf3f05f633dbc7f402b1f6b49d442997864ca3fce151eeaf6c513906020015b60405180910390a150565b6118bd612f32565b600a60ff841611806118d25750600a60ff8316115b806118e05750600a60ff8216115b15611901576040516336d9935160e11b8152600a6004820152602401611604565b6040805160608101825260ff948516808252938516602082018190529290941693018390526013805461ffff19169092176101009091021762ff0000191662010000909202919091179055565b6000806000806012546012600a6119659190615bf8565b61197390633b9aca00615c07565b61197d9190615c40565b905061198b6012600a615bf8565b61199990633b9aca00615c07565b60125490959094509092509050565b60006119b5848484613156565b6001600160a01b038416600090815260026020908152604080832033845290915290205482811015611a295760405162461bcd60e51b815260206004820152601460248201527f5472616e73666572203e20616c6c6f77616e63650000000000000000000000006044820152606401611604565b611a3d8533611a388685615c40565b613033565b506001949350505050565b611a50612f32565b60005b8181101561179357600060076000858585818110611a7357611a73615c8d565b9050602002016020810190611a8891906155c9565b6001600160a01b0316815260208101919091526040016000908120805460ff191692151592909217909155600881858585818110611ac857611ac8615c8d565b9050602002016020810190611add91906155c9565b6001600160a01b031681526020810191909152604001600020805460ff1916911515919091179055611b0e81615ca3565b9050611a53565b6000602054421015611b345742602054611b2f9190615c40565b905090565b50600090565b611b42612f32565b602580548215156101000261ff00199091161790556040517f6348668a830a74027e9848759e660a45c2afe456096e26d17cc84eb20509c9e7906118aa90831515815260200190565b3360008181526002602090815260408083206001600160a01b038716845290915281205490916116bc918590611a38908690615cbc565b611bca612f32565b602580548215156b010000000000000000000000026bff0000000000000000000000199091161790556040517fee75e2c13b472e77bfdb449a3881f41e4d27aad4ded3bc80c4572376c3c429f5906118aa90831515815260200190565b611c2f612f32565b6025805465ff00ff0000001916630100000086151590810265ff0000000000191691909117650100000000008615159081029190911766ff00ff000000001916600160301b86151590810264ff00000000191691909117640100000000861515908102919091179094556040805193845260208401929092529082015260608101919091527fdaf0e941de3de3b93008d9be1a9790a2efbb6515c61e99ba547a7adefdbc2b58906080015b60405180910390a150505050565b611cf0612f6b565b6026546001600160a01b0382811691161480611d1457506001600160a01b03811630145b15611d325760405163b4fa3fb360e01b815260040160405180910390fd5b6040516370a0823160e01b815230600482015281906001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa158015611d82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611da69190615ae5565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044015b6020604051808303816000875af1158015611e0a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117939190615ccf565b611e36612f6b565b602054421015611e4e57426020546115e89190615c40565b426020556026546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec39190615ae5565b60275460405163095ea7b360e01b81526001600160a01b0391821660048201526024810183905291925083169063095ea7b3906044016020604051808303816000875af1158015611f18573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f3c9190615ccf565b5060275460405163af2979eb60e01b8152306004820181905260248201849052600060448301819052606483015260848201524260a48201526001600160a01b039091169063af2979eb9060c4016020604051808303816000875af1158015611fa9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611fcd9190615ae5565b50611fd83347612f90565b5050565b6012546026546001600160a01b031660009081526001602052604081205490918291612009906064615c07565b6116c09190615c1e565b61201b612f6b565b61202d6120284283615cbc565b613391565b6040518181527fe9da15d4cb5bea133d9613a866c909df5594489b91a3f780d43720d560b3c94c906020016118aa565b6000806036546037546116c09190615c40565b612078612f32565b6000601e54116120f05760405162461bcd60e51b815260206004820152603d60248201527f4c61756e6368205472616e736665722054617820686173206265656e2072656d60448201527f6f76656420616e642063616e6e6f742062652072652d656e61626c65640000006064820152608401611604565b60ff16601e55565b612100612f32565b60005b8281101561216f57816004600086868581811061212257612122615c8d565b905060200201602081019061213791906155c9565b6001600160a01b031681526020810191909152604001600020805460ff191691151591909117905561216881615ca3565b9050612103565b50505050565b61217d612f32565b80156121915761218c826133a4565b61219a565b61219a826134d8565b604080516001600160a01b038416815282151560208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c9101611818565b6121e2612f32565b611fd882826135a1565b6121f4612f32565b60006122008284615cec565b90508060ff166064146122265760405163b4fa3fb360e01b815260040160405180910390fd5b601f805460ff85811661ffff199092168217610100918616918202179092556040805191825260208201929092527f6e548f9f5ce86d7611440679c01b8993f57c41013146bcca5dbc8fc15bad2908910160405180910390a1505050565b61228c612f6b565b6033805460009091556018546122ab906001600160a01b031682612f90565b50565b6122b6612f6b565b6018546001600160a01b03166122cd600c82613141565b50601880546001600160a01b0319166001600160a01b0384169081179091556122f890600c90612efb565b506040516001600160a01b03831681527f335aad0eda24dacfa324b3d651daa091864338cf7d4af9d5087ba1c5ee1174f090602001611818565b61233a612f6b565b6122ab81306137c4565b61234c612f6b565b60205442101561236457426020546115e89190615c40565b6026546040516370a0823160e01b81523060048201526001600160a01b039091169060009082906370a0823190602401602060405180830381865afa1580156123b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d59190615ae5565b60405163a9059cbb60e01b8152336004820152602481018290529091506001600160a01b0383169063a9059cbb90604401611deb565b612413612f32565b60005b818110156117935760006007600085858581811061243657612436615c8d565b905060200201602081019061244b91906155c9565b6001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff02191690831515021790555060016008600085858581811061249a5761249a615c8d565b90506020020160208101906124af91906155c9565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790556124e081615ca3565b9050612416565b6124ef612f32565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60006116c0600e83612f10565b61254e612f6b565b6032805460009091556017546122ab906001600160a01b031682612f90565b612575612f32565b8015156001036125905761258a600c83612efb565b5061259d565b61259b600c83613141565b505b604080516001600160a01b038416815282151560208201527f2bcde65fff46a041c6c775b21e9efc6b83f4c6dd101ce8799f73d1c47eab3dd89101611818565b6000806125eb836000613952565b9392505050565b60606011805461162c90615c53565b612609612f6b565b6024546023546126199190615cbc565b42111561263957604051632ed6130560e01b815260040160405180910390fd5b6001600160a01b03811660009081526003602052604090205460ff16156126735760405163f53de75f60e01b815260040160405180910390fd5b6001600160a01b03166000908152600360205260409020805460ff19166001179055565b6000806125eb836001613952565b3360009081526002602090815260408083206001600160a01b0386168452909152812054828110156127195760405162461bcd60e51b815260206004820152600c60248201527f3c3020616c6c6f77616e636500000000000000000000000000000000000000006044820152606401611604565b6127283385611a388685615c40565b5060019392505050565b60006116bc338484613156565b612747612f32565b60648161ffff16111561276d5760405163b4fa3fb360e01b815260040160405180910390fd5b6025805468ffff00000000000000191667010000000000000061ffff8416908102919091179091556040519081527f0719bea218bb20d56176f7e21c07a2db9c2e335f55eab3547b09add23d5cd950906020016118aa565b6127ce336134d8565b60408051338152600060208201527ffd3e4ffa06ecc4abeadeb943a6f143cd99eb577499da4bb260c9abab1e89ca6c910160405180910390a1565b612811612f32565b6001600160a01b03919091166000908152600660205260409020805460ff1916911515919091179055565b612844612f6b565b600061284e61205d565b6030546033546032546031546128649047615c40565b61286e9190615c40565b6128789190615c40565b6128829190615c40565b61288c9190615c40565b90508015156000816128a0576031546128ae565b826031546128ae9190615cbc565b6000603155601654909150611793906001600160a01b031682612f90565b6128d4612f32565b600a60ff841611806128e95750600a60ff8316115b806128f75750600a60ff8216115b15612918576040516336d9935160e11b8152600a6004820152602401611604565b6040805160608101825260ff948516808252938516602082018190529290941693018390526014805461ffff19169092176101009091021762ff0000191662010000909202919091179055565b61296d612f32565b602580546bffffffffffffffffffffffff16600160601b6001600160a01b038416908102919091179091556040519081527f7e94313b20e9daf0774b25eef7a87193a184bb0ee343dd2198d25867be788857906020016118aa565b6129d0612f6b565b60106129dc8382615d4b565b5060116117938282615d4b565b602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612a3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612a609190615e0b565b6025546001600160a01b03918216600160601b90910490911603612a955761161b3333612a8e336001613952565b6001613a12565b60255461161b903390600160601b90046001600160a01b031660006001613af0565b612abf612f32565b6040805160e08101825260ff89811680835289821660208401819052898316948401859052888316606085018190528884166080860181905288851660a0870181905294881660c09096018690526015805461ffff19169094176101009093029290921763ffff000019166201000090960263ff00000019169590951763010000009095029490941765ffff00000000191664010000000090940265ff0000000000191693909317650100000000009091021766ff0000000000001916600160301b9091021790558082848688612b968b8d615cec565b612ba09190615cec565b612baa9190615cec565b612bb49190615cec565b612bbe9190615cec565b612bc89190615cec565b601d805460ff191660ff929092169182179055612be6908890615e28565b601d805461ff00191661010060ff93841681029190911791829055612c119287929190910416615e28565b601d805462ff000019166201000060ff938416021790556040805189831681528883166020820152878316818301528683166060820152858316608082015284831660a082015291831660c0830152517fe70859a9c26f4af0b10019f37bd3b5831526e38f6f014e71e0b09473318a75eb9160e0908290030190a150505050505050565b612c9d612f6b565b6017546001600160a01b0316612cb4600c82613141565b50601780546001600160a01b0319166001600160a01b038416908117909155612cdf90600c90612efb565b506040516001600160a01b03831681527f501cb1a9ca070bd0ad5fe884a0a449b43c7dc226d9e7a808159a37bdb49cddc790602001611818565b612d21612f6b565b6001600160a01b03811660009081526003602052604090205460ff16612d5a5760405163711004dd60e01b815260040160405180910390fd5b6001600160a01b03166000908152600360205260409020805460ff19169055565b612d83612f32565b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b612db6612f32565b60258054911515620100000262ff000019909216919091179055565b602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e25573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e499190615e0b565b6001600160a01b0316816001600160a01b031603612e78576122ab3333612e71336000613952565b6000613a12565b6122ab3382600080613af0565b612e8d612f32565b6001600160a01b038116612ea057600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006125eb836001600160a01b038416613e9b565b6001600160a01b038116600090815260018301602052604081205415156125eb565b33612f456000546001600160a01b031690565b6001600160a01b03161461161b576040516282b42960e81b815260040160405180910390fd5b612f7433613eea565b61161b576040516282b42960e81b815260040160405180910390fd5b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612fdd576040519150601f19603f3d011682016040523d82523d6000602084013e612fe2565b606091505b50509050806117935760405162461bcd60e51b815260206004820152600f60248201527f7769746864726177206661696c656400000000000000000000000000000000006044820152606401611604565b6001600160a01b0383166130895760405162461bcd60e51b815260206004820152601160248201527f417070726f76652066726f6d207a65726f0000000000000000000000000000006044820152606401611604565b6001600160a01b0382166130df5760405162461bcd60e51b815260206004820152600f60248201527f417070726f766520746f207a65726f00000000000000000000000000000000006044820152606401611604565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60006125eb836001600160a01b038416613f47565b6001600160a01b0383166131ac5760405162461bcd60e51b815260206004820152601260248201527f5472616e736665722066726f6d207a65726f00000000000000000000000000006044820152606401611604565b6001600160a01b0382166132025760405162461bcd60e51b815260206004820152601060248201527f5472616e7366657220746f207a65726f000000000000000000000000000000006044820152606401611604565b61deac196001600160a01b0383160161321f576117938382614034565b60255465010000000000900460ff161561323b5761323b6140f3565b6000613248600c85612f10565b806132595750613259600c84612f10565b905060006001600160a01b03851630148061327c57506001600160a01b03841630145b6027546026549192506001600160a01b039081169160009188811691161480156132b75750816001600160a01b0316866001600160a01b0316145b806132eb57506026546001600160a01b0387811691161480156132eb5750816001600160a01b0316876001600160a01b0316145b6026549091506000906001600160a01b038881169116148061331e5750826001600160a01b0316876001600160a01b0316145b6026549091506000906001600160a01b038a8116911614806133515750836001600160a01b0316896001600160a01b0316145b9050848061335c5750825b806133645750855b156133795761337489898961418b565b613386565b613386898989848661421d565b505050505050505050565b602054811161339f57600080fd5b602055565b6133af600e82612f10565b156133b957600080fd5b6001600160a01b038116600090815260016020526040812054602f8054919290916133e5908490615c40565b90915550600090506133f88260016148ef565b905060006134078360006148ef565b6034546001600160a01b03851660009081526001602052604090205491925061342f91615c07565b6001600160a01b0384166000908152602960209081526040808320939093556035546001909152919020546134649190615c07565b6001600160a01b0384166000908152602b6020908152604080832093909355602a9052908120805484929061349a908490615cbc565b90915550506001600160a01b0383166000908152602c6020526040812080548392906134c7908490615cbc565b9091555061216f9050600e84612efb565b6134e3600e82612f10565b6134ec57600080fd5b6001600160a01b038116600090815260016020526040812054602f805491929091613518908490615cbc565b909155506135299050600e82613141565b506034546001600160a01b0382166000908152600160205260409020546135509190615c07565b6001600160a01b0382166000908152602960209081526040808320939093556035546001909152919020546135859190615c07565b6001600160a01b039091166000908152602b6020526040902055565b6038805460ff191660011790556101f461ffff831611156135c157600080fd5b601d54610100900460ff16156137b65730600090815260016020526040808220546026546001600160a01b03168352908220549091906103e89061360a9061ffff871690615c07565b6136149190615c1e565b601a5490915081118015613626575082155b156136305750601a545b808210801561364f5783156136475782915061364f565b5050506137b6565b3060009081526002602090815260408083206027546001600160a01b03168452909152902054821115613696576027546136969030906001600160a01b0316600019613033565b602554600090600160301b900460ff1680156136ca5750602554670100000000000000900461ffff166136c7611fdc565b10155b156136d7575060006136e6565b506015546301000000900460ff165b601d54600090610100900460ff166136fe8386615c07565b6137089190615c1e565b905060006137168286615c40565b90506000613725600284615c1e565b905060006137338285615c40565b905060006137418483615cbc565b90504761374d82614a0b565b60006137598247615c40565b90506000836137688684615c07565b6137729190615c1e565b90508515613784576137848682614b64565b6000816137918547615c40565b61379b9190615c40565b90506137a8816001614c0e565b505050505050505050505050505b50506038805460ff19169055565b6030548211156137e757604051631e9acf1760e31b815260040160405180910390fd5b81603060008282546137f99190615c40565b90915550506040805160028082526060820183526000926020830190803683375050602754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613868573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061388c9190615e0b565b8160008151811061389f5761389f615c8d565b60200260200101906001600160a01b031690816001600160a01b03168152505081816001815181106138d3576138d3615c8d565b6001600160a01b03928316602091820292909201015260275460405163b6f9de9560e01b815291169063b6f9de9590859061391b90600090869061dead904290600401615e85565b6000604051808303818588803b15801561393457600080fd5b505af1158015613948573d6000803e3d6000fd5b5050505050505050565b600081156139be57613965600e84612f10565b1561398957506001600160a01b0382166000908152602a60205260409020546116c0565b6001600160a01b0383166000908152602a60205260409020546139ad8460016148ef565b6139b79190615cbc565b90506116c0565b6139c9600e84612f10565b156139ed57506001600160a01b0382166000908152602c60205260409020546116c0565b6001600160a01b0383166000908152602c6020526040812054906139ad9085906148ef565b603854610100900460ff1615613a2757600080fd5b81600003613a3457600080fd5b6038805461ff001916610100179055613a4e848383614e86565b8160366000828254613a609190615cbc565b90915550506001600160a01b0383166000908152602e602052604081208054849290613a8d908490615cbc565b90915550613a9d90508383612f90565b6038805461ff0019169055604080516001600160a01b038087168252851660208201529081018390527fe16a172e3edbd821d678f146e4890ab8f451a8d37dc0994c4a9b14799186299a90606001611cda565b603854610100900460ff1615613b0557600080fd5b6038805461ff0019166101001790556000613b21600e86612f10565b15613b72578115613b4f57506001600160a01b0384166000908152602a602052604081208054919055613c70565b506001600160a01b0384166000908152602c602052604081208054919055613c70565b6000613b7e86846148ef565b90508215613bfc576001600160a01b038616600090815260016020526040902054603454613bac9190615c07565b6001600160a01b038716600090815260296020908152604080832093909355602a90522054613bdc908290615cbc565b6001600160a01b0387166000908152602a60205260408120559150613c6e565b6001600160a01b038616600090815260016020526040902054603554613c229190615c07565b6001600160a01b0387166000908152602b6020908152604080832093909355602c90522054613c52908290615cbc565b6001600160a01b0387166000908152602c602052604081205591505b505b80158015613c7c575082155b15613c9257506038805461ff001916905561216f565b8060366000828254613ca49190615cbc565b90915550506001600160a01b0385166000908152602e602052604081208054839290613cd1908490615cbc565b90915550613ce190508382615cbc565b60408051600280825260608201835292935060009290916020830190803683375050602754604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015613d50573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d749190615e0b565b81600081518110613d8757613d87615c8d565b60200260200101906001600160a01b031690816001600160a01b0316815250508481600181518110613dbb57613dbb615c8d565b6001600160a01b03928316602091820292909201015260275460405163b6f9de9560e01b815291169063b6f9de95908490613e019060009086908c904290600401615e85565b6000604051808303818588803b158015613e1a57600080fd5b505af1158015613e2e573d6000803e3d6000fd5b50505050507f829452f20436b0a113b937144e92dc208805d7c30097914dca977f4d26698911828688604051613e80939291909283526001600160a01b03918216602084015216604082015260600190565b60405180910390a150506038805461ff001916905550505050565b6000818152600183016020526040812054613ee2575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556116c0565b5060006116c0565b600080546001600160a01b0383811691161480613f1457506018546001600160a01b038381169116145b80613f2c57506016546001600160a01b038381169116145b806116c05750506017546001600160a01b0390811691161490565b6000818152600183016020526040812054801561402a576000613f6b600183615c40565b8554909150600090613f7f90600190615c40565b90506000866000018281548110613f9857613f98615c8d565b9060005260206000200154905080876000018481548110613fbb57613fbb615c8d565b600091825260208083209091019290925582815260018901909152604090208490558654879080613fee57613fee615eba565b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506116c0565b60009150506116c0565b6001600160a01b03821660009081526001602052604090205481111561405957600080fd5b60385462010000900460ff161561406f57600080fd5b6038805462ff000019166201000017905561408a828261506a565b806012600082825461409c9190615c40565b909155505060405181815261dead906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a350506038805462ff000019169055565b601c5460125461ffff600160301b830481169261411c9264010000000090910490911690615c07565b6141269190615c1e565b601b55601c5460125461ffff600160301b8304811692614150926201000090910490911690615c07565b61415a9190615c1e565b601a55601c5460125461ffff600160301b830481169261417c92911690615c07565b6141869190615c1e565b601955565b6001600160a01b0383166000908152600160205260409020548111156141c457604051631e9acf1760e31b815260040160405180910390fd5b6141ce838261506a565b6141d882826151ab565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161313491815260200190565b6001600160a01b03851660009081526001602052604090205483111561425657604051631e9acf1760e31b815260040160405180910390fd5b60008080831561432457602554610100900460ff16156142aa576001600160a01b03881660009081526003602052604090205460ff16156142aa5760405163473250af60e01b815260040160405180910390fd5b601a54861180156142d457506001600160a01b03881660009081526006602052604090205460ff16155b156142f957601a54604051633dc2e93d60e21b81526004810191909152602401611604565b614304886000615309565b602554909350640100000000900460ff161561431f57600191505b6146d8565b84156145115760215460ff1615801561435657506001600160a01b03871660009081526004602052604090205460ff16155b1561437f576001600160a01b0387166000908152600360205260409020805460ff191660011790555b602254156143ec576022546000906143979043615c40565b10156143ec576001600160a01b0387166000908152600360205260408120805460ff19166001179055602580549091906143d39060ff16615ed0565b91906101000a81548160ff021916908360ff1602179055505b60255462010000900460ff161561443e576001600160a01b0387166000908152602d602052604090205443900361442257600080fd5b6001600160a01b0387166000908152602d602052604090204390555b6019546001600160a01b038816600090815260016020526040902054614465908890615cbc565b11801561448b57506001600160a01b03871660009081526006602052604090205460ff16155b156144b057601954604051633392fb9160e21b81526004810191909152602401611604565b601b54861180156144da57506001600160a01b03871660009081526006602052604090205460ff16155b156144ff57601b54604051632224c5d160e11b81526004810191909152602401611604565b61450a876001615309565b92506146d8565b602554610100900460ff161561455b576001600160a01b03881660009081526003602052604090205460ff161561455b5760405163473250af60e01b815260040160405180910390fd5b6145676012600a615bf8565b861161464157602760009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa1580156145c0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906145e49190615e0b565b6025546001600160a01b03918216600160601b90910490911603614617576146123333612a8e336001613952565b614639565b602554614639903390600160601b90046001600160a01b031660006001613af0565b5050506148e8565b6019546001600160a01b038816600090815260016020526040902054614668908890615cbc565b11801561468e57506001600160a01b03871660009081526006602052604090205460ff16155b156146b357601954604051633392fb9160e21b81526004810191909152602401611604565b601e54156146d8576064601e54876146cb9190615c07565b6146d59190615c1e565b90505b6026546001600160a01b0389811691161480159061470857506025546b010000000000000000000000900460ff16155b8015614717575060385460ff16155b80156147205750835b1561474457602554614744906901000000000000000000900461ffff1660006135a1565b6001600160a01b03881660009081526005602052604090205460ff168061478357506001600160a01b03871660009081526005602052604090205460ff165b156147915760009250600091505b6000808060ff8616156147ea5760646147ad60ff88168b615c07565b6147b79190615c1e565b601d5460155491945060ff908116916147d1911685615c07565b6147db9190615c1e565b91506147e78284615c40565b90505b841561483c5760006147fb8a6153db565b90506148078185615cbc565b6025549094506301000000900460ff161561482d576148268184615cbc565b925061483a565b6148378183615cbc565b91505b505b831561484f5761484c8484615cbc565b92505b600061485b848b615c40565b90506148678c8b61506a565b61487130836151ab565b82601260008282546148839190615c40565b9091555061489390508b826151ab565b8a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516148d891815260200190565b60405180910390a3505050505050505b5050505050565b6000811561498a576001600160a01b03831660009081526001602052604081205460345461491d9190615c07565b6001600160a01b03851660009081526029602052604090205490915081101561494a5760009150506116c0565b6001600160a01b03841660009081526029602052604090205468010000000000000000906149789083615c40565b6149829190615c1e565b9150506116c0565b6001600160a01b0383166000908152600160205260408120546035546149b09190615c07565b6001600160a01b0385166000908152602b60205260409020549091508110156149dd5760009150506116c0565b6001600160a01b0384166000908152602b602052604090205468010000000000000000906149789083615c40565b602754614a239030906001600160a01b031683613033565b6040805160028082526060820183526000926020830190803683370190505090503081600081518110614a5857614a58615c8d565b6001600160a01b03928316602091820292909201810191909152602754604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015614ab1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614ad59190615e0b565b81600181518110614ae857614ae8615c8d565b6001600160a01b03928316602091820292909201015260275460405163791ac94760e01b815291169063791ac94790614b2e908590600090869030904290600401615eef565b600060405180830381600087803b158015614b4857600080fd5b505af1158015614b5c573d6000803e3d6000fd5b505050505050565b602754614b7c9030906001600160a01b031684613033565b60275460405163f305d71960e01b8152306004820181905260248201859052600060448301819052606483015260848201524260a48201526001600160a01b039091169063f305d71990839060c40160606040518083038185885af1158015614be9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906148e89190615f2b565b601d5460155460009160ff62010000909104811691614c3891650100000000009091041685615c07565b614c429190615c1e565b601d5460155491925060009160ff6201000092839004811692614c6792041686615c07565b614c719190615c1e565b601d5460155491925060009160ff62010000909204821691614c999161010090041687615c07565b614ca39190615c1e565b601d5460155491925060009160ff62010000909204821691614ccd91600160301b90041688615c07565b614cd79190615c1e565b601d5460155491925060009160ff62010000909204821691614d029164010000000090041689615c07565b614d0c9190615c1e565b601f54909150600090606490614d259060ff1685615c07565b614d2f9190615c1e565b601f54909150600090606490614d4d90610100900460ff1686615c07565b614d579190615c1e565b90508660336000828254614d6b9190615cbc565b925050819055508560316000828254614d849190615cbc565b925050819055508460306000828254614d9d9190615cbc565b925050819055508260326000828254614db69190615cbc565b90915550508315613386578715614ddf578360376000828254614dd99190615cbc565b90915550505b6000614de9615483565b905080600003614e10578460336000828254614e059190615cbc565b90915550614e7a9050565b80614e246801000000000000000085615c07565b614e2e9190615c1e565b60346000828254614e3f9190615cbc565b90915550819050614e596801000000000000000084615c07565b614e639190615c1e565b60356000828254614e749190615cbc565b90915550505b50505050505050505050565b81600003614e9357505050565b614e9d8382613952565b821115614ebd57604051631e9acf1760e31b815260040160405180910390fd5b614ec8600e84612f10565b15614f2e578015614f06576001600160a01b0383166000908152602a602052604081208054849290614efb908490615c40565b909155506117939050565b6001600160a01b0383166000908152602c602052604081208054849290614efb908490615c40565b6000614f3a84836148ef565b90508115614fd6576001600160a01b038416600090815260016020526040902054603454614f689190615c07565b6001600160a01b038516600090815260296020908152604080832093909355602a90529081208054839290614f9e908490615cbc565b90915550506001600160a01b0384166000908152602a602052604081208054859290614fcb908490615c40565b9091555061216f9050565b6001600160a01b038416600090815260016020526040902054603554614ffc9190615c07565b6001600160a01b0385166000908152602b6020908152604080832093909355602c90529081208054839290615032908490615cbc565b90915550506001600160a01b0384166000908152602c60205260408120805485929061505f908490615c40565b909155505050505050565b6001600160a01b03821660009081526001602052604081205461508e908390615c40565b905061509b600e84612f10565b156150c0576001600160a01b0390921660009081526001602052604090209190915550565b81602f60008282546150d29190615c40565b90915550600090506150e58460016148ef565b905060006150f48560006148ef565b6001600160a01b0386166000908152600160205260409020849055603454909150615120908490615c07565b6001600160a01b038616600090815260296020908152604080832093909355602a90529081208054849290615156908490615cbc565b9091555050603554615169908490615c07565b6001600160a01b0386166000908152602b6020908152604080832093909355602c9052908120805483929061519f908490615cbc565b90915550505050505050565b6001600160a01b0382166000908152600160205260408120546151cf908390615cbc565b90506151dc600e84612f10565b15615201576001600160a01b0390921660009081526001602052604090209190915550565b81602f60008282546152139190615cbc565b90915550600090506152268460016148ef565b905060006152358560006148ef565b6001600160a01b0386166000908152600160205260409020849055603454909150615261908490615c07565b6001600160a01b038616600090815260296020908152604080832093909355602a90529081208054849290615297908490615cbc565b90915550506035546152aa908490615c07565b6001600160a01b0386166000908152602b6020908152604080832093909355602c905290812080548392906152e0908490615cbc565b90915550506001600160a01b03851660009081526001602052604090208390556148e8856154ac565b6001600160a01b03821660009081526007602052604081205460ff1615801561534b57506001600160a01b03831660009081526008602052604090205460ff16155b1561536c57816153605760145460ff166139b7565b5060135460ff166116c0565b6001600160a01b03831660009081526008602052604090205460ff16156153b557816153a35760145462010000900460ff166139b7565b5060135462010000900460ff166116c0565b816153ca57601454610100900460ff166139b7565b50601354610100900460ff166116c0565b6026546001600160a01b031660009081526001602052604081205481615402606483615c1e565b90506000615411600a84615c1e565b905081851161542557506000949350505050565b8085111561544d57606461543a86600a615c07565b6154449190615c1e565b95945050505050565b60646154598383615c40565b866154648582615c40565b61546f90600a615c07565b6154799190615c07565b61543a9190615c1e565b60006154916012600a615bf8565b61549f90633b9aca00615c07565b602f54611b2f9190615c40565b6001600160a01b0381166000908152600b602052604090205460ff166122ab57600980546000908152600a6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558352600b9091528120805460ff191660011790558154919061551e83615ca3565b919050555050565b803561ffff8116811461553857600080fd5b919050565b80151581146122ab57600080fd5b600080600080600060a0868803121561556357600080fd5b61556c86615526565b945061557a60208701615526565b935061558860408701615526565b925061559660608701615526565b915060808601356155a68161553d565b809150509295509295909350565b6001600160a01b03811681146122ab57600080fd5b6000602082840312156155db57600080fd5b81356125eb816155b4565b600060208083528351808285015260005b81811015615613578581018301518582016040015282016155f7565b506000604082860101526040601f19601f8301168501019250505092915050565b6000806040838503121561564757600080fd5b8235615652816155b4565b946020939093013593505050565b60008083601f84011261567257600080fd5b50813567ffffffffffffffff81111561568a57600080fd5b6020830191508360208260051b85010111156156a557600080fd5b9250929050565b600080602083850312156156bf57600080fd5b823567ffffffffffffffff8111156156d657600080fd5b6156e285828601615660565b90969095509350505050565b60006020828403121561570057600080fd5b6125eb82615526565b803560ff8116811461553857600080fd5b60008060006060848603121561572f57600080fd5b61573884615709565b925061574660208501615709565b915061575460408501615709565b90509250925092565b60008060006060848603121561577257600080fd5b833561577d816155b4565b9250602084013561578d816155b4565b929592945050506040919091013590565b6000602082840312156157b057600080fd5b81356125eb8161553d565b600080600080608085870312156157d157600080fd5b84356157dc8161553d565b935060208501356157ec8161553d565b925060408501356157fc8161553d565b9150606085013561580c8161553d565b939692955090935050565b60006020828403121561582957600080fd5b5035919050565b60006020828403121561584257600080fd5b6125eb82615709565b60008060006040848603121561586057600080fd5b833567ffffffffffffffff81111561587757600080fd5b61588386828701615660565b90945092505060208401356158978161553d565b809150509250925092565b600080604083850312156158b557600080fd5b82356158c0816155b4565b915060208301356158d08161553d565b809150509250929050565b600080604083850312156158ee57600080fd5b6158c083615526565b6000806040838503121561590a57600080fd5b61591383615709565b915061592160208401615709565b90509250929050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261595157600080fd5b813567ffffffffffffffff8082111561596c5761596c61592a565b604051601f8301601f19908116603f011681019082821181831017156159945761599461592a565b816040528381528660208588010111156159ad57600080fd5b836020870160208301376000602085830101528094505050505092915050565b600080604083850312156159e057600080fd5b823567ffffffffffffffff808211156159f857600080fd5b615a0486838701615940565b93506020850135915080821115615a1a57600080fd5b50615a2785828601615940565b9150509250929050565b600080600080600080600060e0888a031215615a4c57600080fd5b615a5588615709565b9650615a6360208901615709565b9550615a7160408901615709565b9450615a7f60608901615709565b9350615a8d60808901615709565b9250615a9b60a08901615709565b9150615aa960c08901615709565b905092959891949750929550565b60008060408385031215615aca57600080fd5b8235615ad5816155b4565b915060208301356158d0816155b4565b600060208284031215615af757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600181815b80851115615b4f578160001904821115615b3557615b35615afe565b80851615615b4257918102915b93841c9390800290615b19565b509250929050565b600082615b66575060016116c0565b81615b73575060006116c0565b8160018114615b895760028114615b9357615baf565b60019150506116c0565b60ff841115615ba457615ba4615afe565b50506001821b6116c0565b5060208310610133831016604e8410600b8410161715615bd2575081810a6116c0565b615bdc8383615b14565b8060001904821115615bf057615bf0615afe565b029392505050565b60006125eb60ff841683615b57565b80820281158282048414176116c0576116c0615afe565b600082615c3b57634e487b7160e01b600052601260045260246000fd5b500490565b818103818111156116c0576116c0615afe565b600181811c90821680615c6757607f821691505b602082108103615c8757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600060018201615cb557615cb5615afe565b5060010190565b808201808211156116c0576116c0615afe565b600060208284031215615ce157600080fd5b81516125eb8161553d565b60ff81811683821601908111156116c0576116c0615afe565b601f82111561179357600081815260208120601f850160051c81016020861015615d2c5750805b601f850160051c820191505b81811015614b5c57828155600101615d38565b815167ffffffffffffffff811115615d6557615d6561592a565b615d7981615d738454615c53565b84615d05565b602080601f831160018114615dae5760008415615d965750858301515b600019600386901b1c1916600185901b178555614b5c565b600085815260208120601f198616915b82811015615ddd57888601518255948401946001909101908401615dbe565b5085821015615dfb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b600060208284031215615e1d57600080fd5b81516125eb816155b4565b60ff82811682821603908111156116c0576116c0615afe565b600081518084526020808501945080840160005b83811015615e7a5781516001600160a01b031687529582019590820190600101615e55565b509495945050505050565b848152608060208201526000615e9e6080830186615e41565b6001600160a01b03949094166040830152506060015292915050565b634e487b7160e01b600052603160045260246000fd5b600060ff821660ff8103615ee657615ee6615afe565b60010192915050565b85815284602082015260a060408201526000615f0e60a0830186615e41565b6001600160a01b0394909416606083015250608001529392505050565b600080600060608486031215615f4057600080fd5b835192506020840151915060408401519050925092509256fea26469706673582212201a86457c96ba3c2569629974eb63e1b80637d90a77b01bcaf4ed65abb5740b3164736f6c63430008110033

Deployed Bytecode Sourcemap

18601:48690:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34396:247;;;;;;;;;;;;;:::i;:::-;;23253:32;;;;;;;;;;-1:-1:-1;23253:32:0;;;;;;;;;;;;;;188:6:1;176:19;;;158:38;;146:2;131:18;23253:32:0;;;;;;;;37005:987;;;;;;;;;;-1:-1:-1;37005:987:0;;;;;:::i;:::-;;:::i;42069:283::-;;;;;;;;;;;;;:::i;19106:37::-;;;;;;;;;;-1:-1:-1;19106:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;1606:14:1;;1599:22;1581:41;;1569:2;1554:18;19106:37:0;1441:187:1;28034:94:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23541:34::-;;;;;;;;;;-1:-1:-1;23541:34:0;;;;-1:-1:-1;;;;;23541:34:0;;;;;;-1:-1:-1;;;;;2350:55:1;;;2332:74;;2320:2;2305:18;23541:34:0;2186:226:1;28922:193:0;;;;;;;;;;-1:-1:-1;28922:193:0;;;;;:::i;:::-;;:::i;35543:227::-;;;;;;;;;;-1:-1:-1;35543:227:0;;;;;:::i;:::-;;:::i;48422:27::-;;;;;;;;;;;;;;;;;;;3697:25:1;;;3685:2;3670:18;48422:27:0;3551:177:1;45430:458:0;;;;;;;;;;;;45729:11;;;;;;;;;;45755:13;;;;;;-1:-1:-1;;;45783:17:0;;;;;45815:19;;;;;45849:20;;;;;;;45430:458;;;;;3991:14:1;;3984:22;3966:41;;4050:14;;4043:22;4038:2;4023:18;;4016:50;4109:14;;4102:22;4082:18;;;4075:50;;;;4168:14;;4161:22;4156:2;4141:18;;4134:50;4233:6;4221:19;4215:3;4200:19;;4193:48;3953:3;3938:19;45430:458:0;3733:514:1;44060:267:0;;;;;;;;;;-1:-1:-1;44060:267:0;;;;;:::i;:::-;;:::i;28242:108::-;;;;;;;;;;-1:-1:-1;28324:18:0;;28242:108;;19313:58;;;;;;;;;;-1:-1:-1;19313:58:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;39783:225;;;;;;;;;;-1:-1:-1;39783:225:0;;;;;:::i;:::-;;:::i;40269:293::-;;;;;;;;;;-1:-1:-1;40269:293:0;;;;;:::i;:::-;;:::i;19012:43::-;;;;;;;;;;-1:-1:-1;19012:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;46656:344;;;;;;;;;;;;;:::i;:::-;;;;5391:25:1;;;5447:2;5432:18;;5425:34;;;;5475:18;;;5468:34;5379:2;5364:18;46656:344:0;5189:319:1;30886:426:0;;;;;;;;;;-1:-1:-1;30886:426:0;;;;;:::i;:::-;;:::i;35307:228::-;;;;;;;;;;-1:-1:-1;35307:228:0;;;;;:::i;:::-;;:::i;46093:224::-;;;;;;;;;;;;;:::i;33006:143::-;;;;;;;;;;-1:-1:-1;33006:143:0;;;;;:::i;:::-;;:::i;21888:22::-;;;;;;;;;;-1:-1:-1;21888:22:0;;;;;;;;27825:99;;;;;;;;;;-1:-1:-1;19735:2:0;27825:99;;;6392:4:1;6380:17;;;6362:36;;6350:2;6335:18;27825:99:0;6220:184:1;30007:278:0;;;;;;;;;;-1:-1:-1;30007:278:0;;;;;:::i;:::-;;:::i;18912:45::-;;;;;;;;;;-1:-1:-1;18912:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34249:139;;;;;;;;;;-1:-1:-1;34249:139:0;;;;;:::i;:::-;;:::i;48388:27::-;;;;;;;;;;;;;;;;47162:303;;;;;;;;;;-1:-1:-1;47396:14:0;;47412:11;;47425:13;;47440:16;;47162:303;;;6640:25:1;;;6696:2;6681:18;;6674:34;;;;6724:18;;;6717:34;6782:2;6767:18;;6760:34;6627:3;6612:19;47162:303:0;6409:391:1;33199:358:0;;;;;;;;;;-1:-1:-1;33199:358:0;;;;;:::i;:::-;;:::i;42510:321::-;;;;;;;;;;-1:-1:-1;42510:321:0;;;;;:::i;:::-;;:::i;43339:713::-;;;;;;;;;;;;;:::i;45896:189::-;;;;;;;;;;;;;:::i;23341:22::-;;;;;;;;;;-1:-1:-1;23341:22:0;;;;;;;;;;;41734:222;;;;;;;;;;-1:-1:-1;41734:222:0;;;;;:::i;:::-;;:::i;47008:146::-;;;;;;;;;;;;;:::i;38032:261::-;;;;;;;;;;-1:-1:-1;38032:261:0;;;;;:::i;:::-;;:::i;36451:241::-;;;;;;;;;;-1:-1:-1;36451:241:0;;;;;:::i;:::-;;:::i;33956:248::-;;;;;;;;;;-1:-1:-1;33956:248:0;;;;;:::i;:::-;;:::i;32782:181::-;;;;;;;;;;-1:-1:-1;32782:181:0;;;;;:::i;:::-;;:::i;39374:348::-;;;;;;;;;;-1:-1:-1;39374:348:0;;;;;:::i;:::-;;:::i;41507:181::-;;;;;;;;;;;;;:::i;44624:302::-;;;;;;;;;;-1:-1:-1;44624:302:0;;;;;:::i;:::-;;:::i;36757:114::-;;;;;;;;;;-1:-1:-1;36757:114:0;;;;;:::i;:::-;;:::i;42899:376::-;;;;;;;;;;;;;:::i;21337:24::-;;;;;;;;;;-1:-1:-1;21337:24:0;;;;;;;;;;;;47995:54;;;;;;;;;;-1:-1:-1;47995:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;21069:259;;;;;;;;;;-1:-1:-1;21069:259:0;;;;;;;;-1:-1:-1;;;;;21069:259:0;;;;;;;;;;;;;;-1:-1:-1;;;;;9643:15:1;;;9625:34;;9695:15;;;9690:2;9675:18;;9668:43;9747:15;;9727:18;;;9720:43;;;;9552:2;9537:18;21069:259:0;9362:407:1;29464:162:0;;;;;;;;;;-1:-1:-1;29464:162:0;;;;;:::i;:::-;-1:-1:-1;;;;;29600:18:0;29568:7;29600:18;;;:9;:18;;;;;;;29464:162;35778:227;;;;;;;;;;-1:-1:-1;35778:227:0;;;;;:::i;:::-;;:::i;10007:140::-;;;;;;;;;;;;;:::i;47473:135::-;;;;;;;;;;-1:-1:-1;47473:135:0;;;;;:::i;:::-;;:::i;41330:169::-;;;;;;;;;;;;;:::i;23628:28::-;;;;;;;;;;-1:-1:-1;23628:28:0;;;;-1:-1:-1;;;;;23628:28:0;;;20580:71;;;;;;;;;;-1:-1:-1;20580:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;9994:4:1;9982:17;;;9964:36;;10036:17;;;10031:2;10016:18;;10009:45;10090:17;;10070:18;;;10063:45;;;;9952:2;9937:18;20580:71:0;9774:340:1;19744:34:0;;;;;;;;;;;;19776:2;19744:34;;33624:265;;;;;;;;;;-1:-1:-1;33624:265:0;;;;;:::i;:::-;;:::i;27932:94::-;;;;;;;;;;-1:-1:-1;27984:7:0;9803:6;-1:-1:-1;;;;;9803:6:0;27932:94;46093:224;46490:158;;;;;;;;;;-1:-1:-1;46490:158:0;;;;;:::i;:::-;;:::i;28136:98::-;;;;;;;;;;;;;:::i;19252:54::-;;;;;;;;;;-1:-1:-1;19252:54:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;19252:54:0;;;34847:273;;;;;;;;;;-1:-1:-1;34847:273:0;;;;;:::i;:::-;;:::i;46325:157::-;;;;;;;;;;-1:-1:-1;46325:157:0;;;;;:::i;:::-;;:::i;29634:365::-;;;;;;;;;;-1:-1:-1;29634:365:0;;;;;:::i;:::-;;:::i;30679:199::-;;;;;;;;;;-1:-1:-1;30679:199:0;;;;;:::i;:::-;;:::i;40053:208::-;;;;;;;;;;-1:-1:-1;40053:208:0;;;;;:::i;:::-;;:::i;19062:37::-;;;;;;;;;;-1:-1:-1;19062:37:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;32363:139;;;;;;;;;;;;;:::i;36290:153::-;;;;;;;;;;-1:-1:-1;36290:153:0;;;;;:::i;:::-;;:::i;20743:317::-;;;;;;;;;;-1:-1:-1;20743:317:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;20743:317:0;;;;;;;;;;10416:4:1;10447:15;;;10429:34;;10499:15;;;10494:2;10479:18;;10472:43;10551:15;;;10531:18;;;10524:43;;;;10603:15;;;10598:2;10583:18;;10576:43;10656:15;;10650:3;10635:19;;10628:44;10709:15;;10703:3;10688:19;;10681:44;10762:15;;;10756:3;10741:19;;10734:44;10393:3;10378:19;20743:317:0;10119:665:1;40873:449:0;;;;;;;;;;;;;:::i;40570:295::-;;;;;;;;;;-1:-1:-1;40570:295:0;;;;;:::i;:::-;;:::i;20660:72::-;;;;;;;;;;-1:-1:-1;20660:72:0;;;;;;;;;;;;;;;;;;;;;;32586:148;;;;;;;;;;-1:-1:-1;32586:148:0;;;;;:::i;:::-;;:::i;27634:183::-;;;;;;;;;;-1:-1:-1;27634:183:0;;;;;:::i;:::-;;:::i;18964:41::-;;;;;;;;;;-1:-1:-1;18964:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;31401:330;;;;;;;;;;;;;:::i;38326:986::-;;;;;;;;;;-1:-1:-1;38326:986:0;;;;;:::i;:::-;;:::i;23462:70::-;;;;;;;;;;-1:-1:-1;23462:70:0;;;;-1:-1:-1;;;23462:70:0;;-1:-1:-1;;;;;23462:70:0;;;28726:188;;;;;;;;;;-1:-1:-1;28726:188:0;;;;;:::i;:::-;-1:-1:-1;;;;;28878:19:0;;;28846:7;28878:19;;;:11;:19;;;;;;;;:28;;;;;;;;;;;;;28726:188;44335:281;;;;;;;;;;-1:-1:-1;44335:281:0;;;;;:::i;:::-;;:::i;19201:42::-;;;;;;;;;;;;;;;;35128:171;;;;;;;;;;-1:-1:-1;35128:171:0;;;;;:::i;:::-;;:::i;36073:149::-;;;;;;;;;;-1:-1:-1;36073:149:0;;;;;:::i;:::-;;:::i;34737:102::-;;;;;;;;;;-1:-1:-1;34737:102:0;;;;;:::i;:::-;;:::i;31828:357::-;;;;;;;;;;-1:-1:-1;31828:357:0;;;;;:::i;:::-;;:::i;10155:194::-;;;;;;;;;;-1:-1:-1;10155:194:0;;;;;:::i;:::-;;:::i;21370:98::-;;;;;;;;;;-1:-1:-1;21370:98:0;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;21370:98:0;;;;;;;;;13430:6:1;13463:15;;;13445:34;;13515:15;;;13510:2;13495:18;;13488:43;13567:15;;;13547:18;;;13540:43;;;;13619:15;;;13614:2;13599:18;;13592:43;13407:3;13392:19;21370:98:0;13197:444:1;44969:453:0;;;;;;;;;;-1:-1:-1;45274:11:0;;45331;;44969:453;;;13885:25:1;;;45061:20:0;13941:2:1;13926:18;;13919:45;45331:11:0;;;;13980:18:1;;;13973:45;;;;45331:11:0;45357:16;;;;14061:14:1;14054:22;14049:2;14034:18;;14027:50;45388:15:0;;;;;14121:14:1;14114:22;14108:3;14093:19;;14086:51;13872:3;13857:19;44969:453:0;13646:497:1;18860:45:0;;;;;;;;;;-1:-1:-1;18860:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34396:247;9967:12;:10;:12::i;:::-;34455:19:::1;;;;;;;;;-1:-1:-1::0;;;;;34455:19:0::1;-1:-1:-1::0;;;;;34448:39:0::1;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34493:1;34448:46:::0;34444:87:::1;;34516:15;;-1:-1:-1::0;;;34516:15:0::1;;;;;;;;;;;34444:87;34542:10;:17:::0;;-1:-1:-1;;34542:17:0::1;34555:4;34542:17;::::0;;34584:12:::1;34570:11;:26:::0;34620:15:::1;34607:10;:28:::0;34396:247::o;37005:987::-;9967:12;:10;:12::i;:::-;37223:14:::1;19629:18;19735:2;19629;:18;:::i;:::-;19613:34;::::0;:13:::1;:34;:::i;:::-;37223:31;;37269:15;37265:48;;;-1:-1:-1::0;37295:18:0::1;::::0;37265:48:::1;37324:16;37343:13;37352:4;37343:6:::0;:13:::1;:::i;:::-;37324:32;;37367:20;37421:10;37390:41;;37400:17;37391:26;;:6;:26;;;;:::i;:::-;37390:41;;;;:::i;:::-;37367:64;;37442:18;37492:10;37463:39;;37473:15;37464:24;;:6;:24;;;;:::i;:::-;37463:39;;;;:::i;:::-;37442:60;;37513:17;37561:10;37533:38;;37543:14;37534:23;;:6;:23;;;;:::i;:::-;37533:38;;;;:::i;:::-;37513:58;;37680:8;37665:12;:23;:48;;;;37705:8;37692:10;:21;37665:48;37661:88;;;37735:14;;-1:-1:-1::0;;;37735:14:0::1;;;;;;;;;;;37661:88;37772:46;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;37762:7:::1;:56:::0;;;;;;;;;;;;;;37846:138;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;::::0;;;;;-1:-1:-1;;37831:12:0::1;:153:::0;;-1:-1:-1;;37831:153:0;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;37831:153:0;;;;::::1;-1:-1:-1::0;;37831:153:0;;-1:-1:-1;;;37831:153:0;;::::1;;::::0;;-1:-1:-1;37005:987:0:o;42069:283::-;25149:15;:13;:15::i;:::-;42144:20:::1;;42126:15;:38;42122:119;;;42225:15;42202:20;;:38;;;;:::i;:::-;42186:55;;-1:-1:-1::0;;;42186:55:0::1;;;;;;3697:25:1::0;;3685:2;3670:18;;3551:177;42186:55:0::1;;;;;;;;42122:119;42275:15;42252:20;:38:::0;42301:43:::1;42310:10;42322:21;42301:8;:43::i;:::-;42069:283::o:0;28034:94::-;28082:13;28115:5;28108:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28034:94;:::o;28922:193::-;29026:4;29048:37;29057:10;29069:7;29078:6;29048:8;:37::i;:::-;-1:-1:-1;29103:4:0;28922:193;;;;;:::o;35543:227::-;9967:12;:10;:12::i;:::-;35626:9:::1;35621:142;35641:20:::0;;::::1;35621:142;;;35705:4;35683:5;:19;35689:9;;35699:1;35689:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35683:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35683:19:0;;;:26;;-1:-1:-1;;35683:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;35724:5:::1;-1:-1:-1::0;35730:9:0;;35740:1;35730:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35724:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35724:19:0;:27;;-1:-1:-1;;35724:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35663:3:::1;::::0;::::1;:::i;:::-;;;35621:142;;;;35543:227:::0;;:::o;44060:267::-;25149:15;:13;:15::i;:::-;44155:10:::1;:15:::0;-1:-1:-1;;;;;44155:15:0::1;44181:26;:9;44155:15:::0;44181:16:::1;:26::i;:::-;-1:-1:-1::0;44218:10:0::1;:22:::0;;-1:-1:-1;;;;;;44218:22:0::1;-1:-1:-1::0;;;;;44218:22:0;::::1;::::0;;::::1;::::0;;;44251:30:::1;::::0;:9:::1;::::0;:13:::1;:30::i;:::-;-1:-1:-1::0;44297:22:0::1;::::0;-1:-1:-1;;;;;2350:55:1;;2332:74;;44297:22:0::1;::::0;2320:2:1;2305:18;44297:22:0::1;;;;;;;;44125:202;44060:267:::0;:::o;39783:225::-;9967:12;:10;:12::i;:::-;39893:2:::1;39881:9;:14;;;39860:58;;;39904:14;;-1:-1:-1::0;;;39904:14:0::1;;;;;;;;;;;39860:58;39929:13;:25:::0;;-1:-1:-1;;39929:25:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;39970:30:::1;::::0;158:38:1;;;39970:30:0::1;::::0;146:2:1;131:18;39970:30:0::1;;;;;;;;39783:225:::0;:::o;40269:293::-;9967:12;:10;:12::i;:::-;19776:2:::1;40401:15;::::0;::::1;;::::0;:35:::1;;-1:-1:-1::0;19776:2:0::1;40420:16;::::0;::::1;;40401:35;:54;;;-1:-1:-1::0;19776:2:0::1;40440:15;::::0;::::1;;40401:54;40397:103;;;40477:23;::::0;-1:-1:-1;;;40477:23:0;;19776:2:::1;40477:23;::::0;::::1;6362:36:1::0;6335:18;;40477:23:0::1;6220:184:1::0;40397:103:0::1;40523:31;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;40511:9:::1;:43:::0;;-1:-1:-1;;40511:43:0;;;;::::1;::::0;;::::1;;-1:-1:-1::0;;40511:43:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;40269:293::o;46656:344::-;46745:21;46781:25;46821:19;46868;46907:18;;19735:2;19629;:18;;;;:::i;:::-;19613:34;;:13;:34;:::i;:::-;46890:35;;;;:::i;:::-;46868:57;-1:-1:-1;19629:18:0;19735:2;19629;:18;:::i;:::-;19613:34;;:13;:34;:::i;:::-;46960:18;;46936:56;;46960:18;;-1:-1:-1;46980:11:0;;-1:-1:-1;46656:344:0;-1:-1:-1;46656:344:0:o;30886:426::-;31020:4;31037:36;31047:6;31055:9;31066:6;31037:9;:36::i;:::-;-1:-1:-1;;;;;31113:19:0;;31086:24;31113:19;;;:11;:19;;;;;;;;31133:10;31113:31;;;;;;;;31163:26;;;;31155:59;;;;-1:-1:-1;;;31155:59:0;;17478:2:1;31155:59:0;;;17460:21:1;17517:2;17497:18;;;17490:30;17556:22;17536:18;;;17529:50;17596:18;;31155:59:0;17276:344:1;31155:59:0;31227:55;31236:6;31244:10;31256:25;31275:6;31256:16;:25;:::i;:::-;31227:8;:55::i;:::-;-1:-1:-1;31300:4:0;;30886:426;-1:-1:-1;;;;30886:426:0:o;35307:228::-;9967:12;:10;:12::i;:::-;35390:9:::1;35385:143;35405:20:::0;;::::1;35385:143;;;35469:5;35447;:19;35453:9;;35463:1;35453:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35447:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35447:19:0;;;:27;;-1:-1:-1;;35447:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;;35489:5:::1;-1:-1:-1::0;35495:9:0;;35505:1;35495:12;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35489:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35489:19:0;:27;;-1:-1:-1;;35489:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35427:3:::1;::::0;::::1;:::i;:::-;;;35385:143;;46093:224:::0;46155:7;46197:20;;46179:15;:38;46175:116;;;46264:15;46241:20;;:38;;;;:::i;:::-;46234:45;;46093:224;:::o;46175:116::-;-1:-1:-1;46308:1:0;;46093:224::o;33006:143::-;9967:12;:10;:12::i;:::-;33075:16:::1;:26:::0;;;::::1;;;;-1:-1:-1::0;;33075:26:0;;::::1;;::::0;;33117:24:::1;::::0;::::1;::::0;::::1;::::0;33094:7;1606:14:1;1599:22;1581:41;;1569:2;1554:18;;1441:187;30007:278:0;30152:10;30107:4;30199:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;30199:32:0;;;;;;;;;;30107:4;;30129:126;;30177:7;;30199:45;;30234:10;;30199:45;:::i;34249:139::-;9967:12;:10;:12::i;:::-;34319:10:::1;:20:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;34319:20:0;;::::1;;::::0;;34355:25:::1;::::0;::::1;::::0;::::1;::::0;34332:7;1606:14:1;1599:22;1581:41;;1569:2;1554:18;;1441:187;33199:358:0;9967:12;:10;:12::i;:::-;33349:11:::1;:18:::0;;-1:-1:-1;;33378:22:0;33349:18;;::::1;;::::0;;::::1;-1:-1:-1::0;;33378:22:0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;33451:27:0;-1:-1:-1;;;33411:29:0;::::1;;::::0;;::::1;-1:-1:-1::0;;33451:27:0;;;;;;;::::1;;::::0;;::::1;::::0;;;::::1;::::0;;;33494:55:::1;::::0;;17962:41:1;;;18034:2;18019:18;;18012:50;;;;18078:18;;;18071:50;18152:2;18137:18;;18130:50;;;;33494:55:0::1;::::0;17949:3:1;17934:19;33494:55:0::1;;;;;;;;33199:358:::0;;;;:::o;42510:321::-;25149:15;:13;:15::i;:::-;42623:19:::1;::::0;-1:-1:-1;;;;;42607:35:0;;::::1;42623:19:::0;::::1;42607:35;::::0;:68:::1;;-1:-1:-1::0;;;;;;42646:29:0;::::1;42670:4;42646:29;42607:68;42589:119;;;42694:14;;-1:-1:-1::0;;;42694:14:0::1;;;;;;;;;;;42589:119;42792:30;::::0;-1:-1:-1;;;42792:30:0;;42816:4:::1;42792:30;::::0;::::1;2332:74:1::0;42741:12:0;;-1:-1:-1;;;;;42765:14:0;::::1;::::0;::::1;::::0;42780:10:::1;::::0;42765:14;;42792:15:::1;::::0;2305:18:1;;42792:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42765:58;::::0;;::::1;::::0;;;;;;-1:-1:-1;;;;;18383:55:1;;;42765:58:0::1;::::0;::::1;18365:74:1::0;18455:18;;;18448:34;18338:18;;42765:58:0::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;43339:713::-:0;25149:15;:13;:15::i;:::-;43412:20:::1;;43394:15;:38;43390:119;;;43493:15;43470:20;;:38;;;;:::i;43390:119::-;43543:15;43520:20;:38:::0;43614:19:::1;::::0;43662:39:::1;::::0;-1:-1:-1;;;43662:39:0;;43695:4:::1;43662:39;::::0;::::1;2332:74:1::0;-1:-1:-1;;;;;43614:19:0;;::::1;::::0;43569:28:::1;::::0;43614:19;;43662:24:::1;::::0;2305:18:1;;43662:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43743:14;::::0;43712:55:::1;::::0;-1:-1:-1;;;43712:55:0;;-1:-1:-1;;;;;43743:14:0;;::::1;43712:55;::::0;::::1;18365:74:1::0;18455:18;;;18448:34;;;43645:56:0;;-1:-1:-1;43712:22:0;::::1;::::0;::::1;::::0;18338:18:1;;43712:55:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;43778:14:0::1;::::0;:212:::1;::::0;-1:-1:-1;;;43778:212:0;;43863:4:::1;43778:212;::::0;::::1;19107:34:1::0;;;19157:18;;;19150:34;;;43778:14:0::1;19200:18:1::0;;;19193:34;;;19243:18;;;19236:34;19286:19;;;19279:44;43964:15:0::1;19339:19:1::0;;;19332:35;-1:-1:-1;;;;;43778:14:0;;::::1;::::0;:62:::1;::::0;19018:19:1;;43778:212:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;44001:43;44010:10;44022:21;44001:8;:43::i;:::-;43379:673;;43339:713::o:0;45896:189::-;46036:18;;45999:19;;-1:-1:-1;;;;;45999:19:0;45946:7;45989:30;;;:9;:30;;;;;;45946:7;;;;45983:36;;:3;:36;:::i;:::-;45982:72;;;;:::i;41734:222::-;25149:15;:13;:15::i;:::-;41844:50:::1;41858:35;41878:15;41858:17:::0;:35:::1;:::i;:::-;41844:13;:50::i;:::-;41910:38;::::0;3697:25:1;;;41910:38:0::1;::::0;3685:2:1;3670:18;41910:38:0::1;3551:177:1::0;47008:146:0;47058:7;47078:14;47110:12;;47095;;:27;;;;:::i;38032:261::-;9967:12;:10;:12::i;:::-;38167:1:::1;38147:17;;:21;38139:95;;;::::0;-1:-1:-1;;;38139:95:0;;19580:2:1;38139:95:0::1;::::0;::::1;19562:21:1::0;19619:2;19599:18;;;19592:30;19658:34;19638:18;;;19631:62;19729:31;19709:18;;;19702:59;19778:19;;38139:95:0::1;19378:425:1::0;38139:95:0::1;38245:40;;:17;:40:::0;38032:261::o;36451:241::-;9967:12;:10;:12::i;:::-;36580:9:::1;36575:110;36595:20:::0;;::::1;36575:110;;;36667:6;36637:13;:27;36651:9;;36661:1;36651:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;36637:27:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;36637:27:0;:36;;-1:-1:-1;;36637:36:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36617:3:::1;::::0;::::1;:::i;:::-;;;36575:110;;;;36451:241:::0;;;:::o;33956:248::-;9967:12;:10;:12::i;:::-;34076:7:::1;34072:75;;;34085:24;34104:4;34085:18;:24::i;:::-;34072:75;;;34125:22;34142:4;34125:16;:22::i;:::-;34163:33;::::0;;-1:-1:-1;;;;;19994:55:1;;19976:74;;20093:14;;20086:22;20081:2;20066:18;;20059:50;34163:33:0::1;::::0;19949:18:1;34163:33:0::1;19808:307:1::0;32782:181:0;9967:12;:10;:12::i;:::-;32904:51:::1;32923:17;32942:12;32904:18;:51::i;39374:348::-:0;9967:12;:10;:12::i;:::-;39488:16:::1;39507:21;39519:9:::0;39507;:21:::1;:::i;:::-;39488:40;;39543:10;:17;;39557:3;39543:17;39539:44;;39569:14;;-1:-1:-1::0;;;39569:14:0::1;;;;;;;;;;;39539:44;39594:15;:27:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;39632:27:0;;;;;39594::::1;39632::::0;;::::1;::::0;;::::1;;::::0;;;39675:39:::1;::::0;;20439:36:1;;;20506:2;20491:18;;20484:45;;;;39675:39:0::1;::::0;20412:18:1;39675:39:0::1;;;;;;;39477:245;39374:348:::0;;:::o;41507:181::-;25149:15;:13;:15::i;:::-;41584:16:::1;::::0;;41567:14:::1;41611:20:::0;;;41651;;41642:38:::1;::::0;-1:-1:-1;;;;;41651:20:0::1;41584:16:::0;41642:8:::1;:38::i;:::-;41556:132;41507:181::o:0;44624:302::-;25149:15;:13;:15::i;:::-;44729:20;;-1:-1:-1;;;;;44729:20:0::1;44760:31;:9;44729:20:::0;44760:16:::1;:31::i;:::-;-1:-1:-1::0;44802:20:0;:27;;-1:-1:-1;;;;;;44802:27:0::1;-1:-1:-1::0;;;;;44802:27:0;::::1;::::0;;::::1;::::0;;;44840:35:::1;::::0;:9:::1;::::0;:13:::1;:35::i;:::-;-1:-1:-1::0;44891:27:0::1;::::0;-1:-1:-1;;;;;2350:55:1;;2332:74;;44891:27:0::1;::::0;2320:2:1;2305:18;44891:27:0::1;2186:226:1::0;36757:114:0;25149:15;:13;:15::i;:::-;36828:35:::1;36841:6;36857:4;36828:12;:35::i;42899:376::-:0;25149:15;:13;:15::i;:::-;42973:20:::1;;42955:15;:38;42951:119;;;43054:15;43031:20;;:38;;;;:::i;42951:119::-;43126:19;::::0;43174:39:::1;::::0;-1:-1:-1;;;43174:39:0;;43207:4:::1;43174:39;::::0;::::1;2332:74:1::0;-1:-1:-1;;;;;43126:19:0;;::::1;::::0;43081:28:::1;::::0;43126:19;;43174:24:::1;::::0;2305:18:1;;43174:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43224:43;::::0;-1:-1:-1;;;43224:43:0;;43248:10:::1;43224:43;::::0;::::1;18365:74:1::0;18455:18;;;18448:34;;;43157:56:0;;-1:-1:-1;;;;;;43224:23:0;::::1;::::0;::::1;::::0;18338:18:1;;43224:43:0::1;18191:297:1::0;35778:227:0;9967:12;:10;:12::i;:::-;35861:9:::1;35856:142;35876:20:::0;;::::1;35856:142;;;35940:5;35918;:19;35924:9;;35934:1;35924:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35918:19:0::1;-1:-1:-1::0;;;;;35918:19:0::1;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;35982:4;35960:5;:19;35966:9;;35976:1;35966:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;35960:19:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;35960:19:0;:26;;-1:-1:-1;;35960:26:0::1;::::0;::::1;;::::0;;;::::1;::::0;;35898:3:::1;::::0;::::1;:::i;:::-;;;35856:142;;10007:140:::0;9967:12;:10;:12::i;:::-;10106:1:::1;10090:6:::0;;10069:40:::1;::::0;-1:-1:-1;;;;;10090:6:0;;::::1;::::0;10069:40:::1;::::0;10106:1;;10069:40:::1;10137:1;10120:19:::0;;-1:-1:-1;;;;;;10120:19:0::1;::::0;;10007:140::o;47473:135::-;47541:4;47565:35;:20;47595:4;47565:29;:35::i;41330:169::-;25149:15;:13;:15::i;:::-;41404:13:::1;::::0;;41387:14:::1;41428:17:::0;;;41465;;41456:35:::1;::::0;-1:-1:-1;;;;;41465:17:0::1;41404:13:::0;41456:8:::1;:35::i;33624:265::-:0;9967:12;:10;:12::i;:::-;33744:15;::::1;;33755:4;33744:15:::0;33740:84:::1;;33761:22;:9;33775:7:::0;33761:13:::1;:22::i;:::-;;33740:84;;;33799:25;:9;33816:7:::0;33799:16:::1;:25::i;:::-;;33740:84;33840:41;::::0;;-1:-1:-1;;;;;19994:55:1;;19976:74;;20093:14;;20086:22;20081:2;20066:18;;20059:50;33840:41:0::1;::::0;19949:18:1;33840:41:0::1;19808:307:1::0;46490:158:0;46551:7;46571:14;46588:28;46604:4;46610:5;46588:15;:28::i;:::-;46571:45;46490:158;-1:-1:-1;;;46490:158:0:o;28136:98::-;28186:13;28219:7;28212:14;;;;;:::i;34847:273::-;25149:15;:13;:15::i;:::-;34950::::1;;34937:10;;:28;;;;:::i;:::-;34918:15;:48;34914:98;;;34988:24;;-1:-1:-1::0;;;34988:24:0::1;;;;;;;;;;;34914:98;-1:-1:-1::0;;;;;35027:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;::::1;;35023:52;;;35055:20;;-1:-1:-1::0;;;35055:20:0::1;;;;;;;;;;;35023:52;-1:-1:-1::0;;;;;35086:19:0::1;;::::0;;;:13:::1;:19;::::0;;;;:26;;-1:-1:-1;;35086:26:0::1;35108:4;35086:26;::::0;;34847:273::o;46325:157::-;46386:7;46406:14;46423:27;46439:4;46445;46423:15;:27::i;29634:365::-;29800:10;29739:4;29788:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;29788:32:0;;;;;;;;;;29839:35;;;;29831:60;;;;-1:-1:-1;;;29831:60:0;;20742:2:1;29831:60:0;;;20724:21:1;20781:2;20761:18;;;20754:30;20820:14;20800:18;;;20793:42;20852:18;;29831:60:0;20540:336:1;29831:60:0;29904:65;29913:10;29925:7;29934:34;29953:15;29934:16;:34;:::i;29904:65::-;-1:-1:-1;29987:4:0;;29634:365;-1:-1:-1;;;29634:365:0:o;30679:199::-;30786:4;30808:40;30818:10;30830:9;30841:6;30808:9;:40::i;40053:208::-;9967:12;:10;:12::i;:::-;40142:3:::1;40133:6;:12;;;40129:39;;;40154:14;;-1:-1:-1::0;;;40154:14:0::1;;;;;;;;;;;40129:39;40179:20;:29:::0;;-1:-1:-1;;40179:29:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;40224::::1;::::0;158:38:1;;;40224:29:0::1;::::0;146:2:1;131:18;40224:29:0::1;14:188:1::0;32363:139:0;32413:28;32430:10;32413:16;:28::i;:::-;32457:37;;;32476:10;19976:74:1;;32488:5:0;20081:2:1;20066:18;;20059:50;32457:37:0;;19949:18:1;32457:37:0;;;;;;;32363:139::o;36290:153::-;9967:12;:10;:12::i;:::-;-1:-1:-1;;;;;36406:20:0;;;::::1;;::::0;;;:11:::1;:20;::::0;;;;:29;;-1:-1:-1;;36406:29:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36290:153::o;40873:449::-;25149:15;:13;:15::i;:::-;40928:17:::1;41103:19;:17;:19::i;:::-;41073:14;::::0;41041:16:::1;::::0;41012:13:::1;::::0;40985:11:::1;::::0;40948:48:::1;::::0;:21:::1;:48;:::i;:::-;:77;;;;:::i;:::-;:109;;;;:::i;:::-;:139;;;;:::i;:::-;:174;;;;:::i;:::-;40928:194:::0;-1:-1:-1;41152:13:0;;;41133:16:::1;41152:13:::0;41193:51:::1;;41233:11;;41193:51;;;41221:9;41207:11;;:23;;;;:::i;:::-;41269:1;41255:11;:15:::0;41290:10:::1;:15:::0;41176:68;;-1:-1:-1;41281:33:0::1;::::0;-1:-1:-1;;;;;41290:15:0::1;41176:68:::0;41281:8:::1;:33::i;40570:295::-:0;9967:12;:10;:12::i;:::-;19776:2:::1;40703:15;::::0;::::1;;::::0;:35:::1;;-1:-1:-1::0;19776:2:0::1;40722:16;::::0;::::1;;40703:35;:54;;;-1:-1:-1::0;19776:2:0::1;40742:15;::::0;::::1;;40703:54;40699:103;;;40779:23;::::0;-1:-1:-1;;;40779:23:0;;19776:2:::1;40779:23;::::0;::::1;6362:36:1::0;6335:18;;40779:23:0::1;6220:184:1::0;40699:103:0::1;40826:31;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;;::::1;::::0;;;;;40813:10:::1;:44:::0;;-1:-1:-1;;40813:44:0;;;;::::1;::::0;;::::1;;-1:-1:-1::0;;40813:44:0::1;::::0;;;::::1;::::0;;;::::1;::::0;;40570:295::o;32586:148::-;9967:12;:10;:12::i;:::-;32661:10:::1;:22:::0;;;::::1;-1:-1:-1::0;;;;;;;;32661:22:0;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;32699:27:::1;::::0;2332:74:1;;;32699:27:0::1;::::0;2320:2:1;2305:18;32699:27:0::1;2186:226:1::0;27634:183:0;25149:15;:13;:15::i;:::-;27764:5:::1;:15;27772:7:::0;27764:5;:15:::1;:::i;:::-;-1:-1:-1::0;27790:7:0::1;:19;27800:9:::0;27790:7;:19:::1;:::i;31401:330::-:0;31466:14;;;;;;;;;-1:-1:-1;;;;;31466:14:0;-1:-1:-1;;;;;31466:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31452:10;;-1:-1:-1;;;;;31452:35:0;;;-1:-1:-1;;;31452:10:0;;;;;;:35;31448:275;;31504:158;31533:10;31562;31591:33;31607:10;31619:4;31591:15;:33::i;:::-;31643:4;31504:10;:158::i;31448:275::-;31703:10;;31680:43;;31691:10;;-1:-1:-1;;;31703:10:0;;-1:-1:-1;;;;;31703:10:0;31715:1;31718:4;31680:10;:43::i;38326:986::-;9967:12;:10;:12::i;:::-;38584:192:::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;;::::1;::::0;;;;;;;38571:10:::1;:205:::0;;-1:-1:-1;;38571:205:0;;;;::::1;::::0;;::::1;::::0;;;::::1;-1:-1:-1::0;;38571:205:0;;;;::::1;-1:-1:-1::0;;38571:205:0;;;;;;;;::::1;::::0;;;::::1;-1:-1:-1::0;;38571:205:0;;;;::::1;-1:-1:-1::0;;38571:205:0;;;;;;;;::::1;;-1:-1:-1::0;;38571:205:0::1;-1:-1:-1::0;;;38571:205:0;;::::1;;::::0;;38584:192;;;;;38818:33:::1;38584:192:::0;;38818:33:::1;:::i;:::-;:56;;;;:::i;:::-;:84;;;;:::i;:::-;:109;;;;:::i;:::-;:137;;;;:::i;:::-;:163;;;;:::i;:::-;38789:13;:192:::0;;-1:-1:-1;;38789:192:0::1;;::::0;;;::::1;::::0;;::::1;::::0;;39009:23:::1;::::0;39025:7;;39009:23:::1;:::i;:::-;38992:14;:40:::0;;-1:-1:-1;;38992:40:0::1;;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;;;;39061:29:::1;::::0;39078:12;;39061:14;;;::::1;;:29;:::i;:::-;39043:15;:47:::0;;-1:-1:-1;;39043:47:0::1;::::0;::::1;::::0;;::::1;;;::::0;;39108:196:::1;::::0;;10447:15:1;;;10429:34;;10499:15;;;10494:2;10479:18;;10472:43;10551:15;;;10531:18;;;10524:43;10603:15;;;10598:2;10583:18;;10576:43;10656:15;;;10650:3;10635:19;;10628:44;10709:15;;;10703:3;10688:19;;10681:44;10762:15;;;10756:3;10741:19;;10734:44;39108:196:0;::::1;::::0;10393:3:1;39108:196:0;;;;;;::::1;38326:986:::0;;;;;;;:::o;44335:281::-;25149:15;:13;:15::i;:::-;44434:17;;-1:-1:-1;;;;;44434:17:0::1;44462:28;:9;44434:17:::0;44462:16:::1;:28::i;:::-;-1:-1:-1::0;44501:17:0;:24;;-1:-1:-1;;;;;;44501:24:0::1;-1:-1:-1::0;;;;;44501:24:0;::::1;::::0;;::::1;::::0;;;44536:32:::1;::::0;:9:::1;::::0;:13:::1;:32::i;:::-;-1:-1:-1::0;44584:24:0::1;::::0;-1:-1:-1;;;;;2350:55:1;;2332:74;;44584:24:0::1;::::0;2320:2:1;2305:18;44584:24:0::1;2186:226:1::0;35128:171:0;25149:15;:13;:15::i;:::-;-1:-1:-1;;;;;35203:19:0;::::1;;::::0;;;:13:::1;:19;::::0;;;;;::::1;;35198:55;;35231:22;;-1:-1:-1::0;;;35231:22:0::1;;;;;;;;;;;35198:55;-1:-1:-1::0;;;;;35264:19:0::1;35286:5;35264:19:::0;;;:13:::1;:19;::::0;;;;:27;;-1:-1:-1;;35264:27:0::1;::::0;;35128:171::o;36073:149::-;9967:12;:10;:12::i;:::-;-1:-1:-1;;;;;36187:18:0;;;::::1;;::::0;;;:9:::1;:18;::::0;;;;:27;;-1:-1:-1;;36187:27:0::1;::::0;::::1;;::::0;;;::::1;::::0;;36073:149::o;34737:102::-;9967:12;:10;:12::i;:::-;34806:15:::1;:25:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;34806:25:0;;::::1;::::0;;;::::1;::::0;;34737:102::o;31828:357::-;31915:14;;;;;;;;;-1:-1:-1;;;;;31915:14:0;-1:-1:-1;;;;;31915:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;31899:37:0;:12;-1:-1:-1;;;;;31899:37:0;;31895:282;;31953:160;31982:10;32011;32040:34;32056:10;32068:5;32040:15;:34::i;:::-;32093:5;31953:10;:160::i;31895:282::-;32131:46;32142:10;32154:12;32168:1;32171:5;32131:10;:46::i;10155:194::-;9967:12;:10;:12::i;:::-;-1:-1:-1;;;;;10236:22:0;::::1;10228:31;;;::::0;::::1;;10296:6;::::0;;10275:38:::1;::::0;-1:-1:-1;;;;;10275:38:0;;::::1;::::0;10296:6;::::1;::::0;10275:38:::1;::::0;::::1;10324:6;:17:::0;;-1:-1:-1;;;;;;10324:17:0::1;-1:-1:-1::0;;;;;10324:17:0;;;::::1;::::0;;;::::1;::::0;;10155:194::o;16856:175::-;16944:4;16973:50;16978:3;-1:-1:-1;;;;;16998:23:0;;16973:4;:50::i;17228:199::-;-1:-1:-1;;;;;17394:23:0;;17335:4;15514:19;;;:12;;;:19;;;;;;:24;;17364:55;15385:161;9825:102;9886:10;9875:7;9776;9803:6;-1:-1:-1;;;;;9803:6:0;;9738:79;9875:7;-1:-1:-1;;;;;9875:21:0;;9871:48;;9905:14;;-1:-1:-1;;;9905:14:0;;;;;;;;;;;28358:108;28412:23;28424:10;28412:11;:23::i;:::-;28407:51;;28444:14;;-1:-1:-1;;;28444:14:0;;;;;;;;;;;52481:170;52552:9;52567:7;-1:-1:-1;;;;;52567:12:0;52588:6;52567:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52551:49;;;52619:4;52611:32;;;;-1:-1:-1;;;52611:32:0;;23909:2:1;52611:32:0;;;23891:21:1;23948:2;23928:18;;;23921:30;23987:17;23967:18;;;23960:45;24022:18;;52611:32:0;23707:339:1;29123:333:0;-1:-1:-1;;;;;29250:19:0;;29242:49;;;;-1:-1:-1;;;29242:49:0;;24253:2:1;29242:49:0;;;24235:21:1;24292:2;24272:18;;;24265:30;24331:19;24311:18;;;24304:47;24368:18;;29242:49:0;24051:341:1;29242:49:0;-1:-1:-1;;;;;29310:21:0;;29302:49;;;;-1:-1:-1;;;29302:49:0;;24599:2:1;29302:49:0;;;24581:21:1;24638:2;24618:18;;;24611:30;24677:17;24657:18;;;24650:45;24712:18;;29302:49:0;24397:339:1;29302:49:0;-1:-1:-1;;;;;29364:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;29416:32;;3697:25:1;;;29416:32:0;;3670:18:1;29416:32:0;;;;;;;;29123:333;;;:::o;17039:181::-;17130:4;17159:53;17167:3;-1:-1:-1;;;;;17187:23:0;;17159:7;:53::i;59039:1286::-;-1:-1:-1;;;;;59170:20:0;;59162:51;;;;-1:-1:-1;;;59162:51:0;;24943:2:1;59162:51:0;;;24925:21:1;24982:2;24962:18;;;24955:30;25021:20;25001:18;;;24994:48;25059:18;;59162:51:0;24741:342:1;59162:51:0;-1:-1:-1;;;;;59232:23:0;;59224:52;;;;-1:-1:-1;;;59224:52:0;;25290:2:1;59224:52:0;;;25272:21:1;25329:2;25309:18;;;25302:30;25368:18;25348;;;25341:46;25404:18;;59224:52:0;25088:340:1;59224:52:0;-1:-1:-1;;;;;;;59293:25:0;;;59289:107;;59335:28;59348:6;59356;59335:12;:28::i;59289:107::-;59412:13;;;;;;;59408:33;;;59427:14;:12;:14::i;:::-;59454:15;59473:26;:9;59492:6;59473:18;:26::i;:::-;:72;;;-1:-1:-1;59516:29:0;:9;59535;59516:18;:29::i;:::-;59454:92;-1:-1:-1;59559:23:0;-1:-1:-1;;;;;59586:23:0;;59604:4;59586:23;;:66;;-1:-1:-1;;;;;;59626:26:0;;59647:4;59626:26;59586:66;59696:14;;59761:19;;59559:94;;-1:-1:-1;;;;;;59696:14:0;;;;59664:21;;59751:29;;;59761:19;;59751:29;:72;;;;;59810:13;-1:-1:-1;;;;;59797:26:0;:9;-1:-1:-1;;;;;59797:26:0;;59751:72;59750:152;;;-1:-1:-1;59855:19:0;;-1:-1:-1;;;;;59842:32:0;;;59855:19;;59842:32;:59;;;;;59888:13;-1:-1:-1;;;;;59878:23:0;:6;-1:-1:-1;;;;;59878:23:0;;59842:59;59943:19;;59722:181;;-1:-1:-1;59916:11:0;;-1:-1:-1;;;;;59930:32:0;;;59943:19;;59930:32;;:75;;;59992:13;-1:-1:-1;;;;;59979:26:0;:9;-1:-1:-1;;;;;59979:26:0;;59930:75;60039:19;;59916:89;;-1:-1:-1;60016:10:0;;-1:-1:-1;;;;;60029:29:0;;;60039:19;;60029:29;;:56;;;60072:13;-1:-1:-1;;;;;60062:23:0;:6;-1:-1:-1;;;;;60062:23:0;;60029:56;60016:69;;60102:18;:41;;;;60124:19;60102:41;:55;;;;60147:10;60102:55;60098:220;;;60174:43;60191:6;60199:9;60210:6;60174:16;:43::i;:::-;60098:220;;;60250:56;60265:6;60273:9;60284:6;60292:5;60299:6;60250:14;:56::i;:::-;59151:1174;;;;;;59039:1286;;;:::o;66451:227::-;66602:20;;66586:13;:36;66578:45;;;;;;66634:20;:36;66451:227::o;63684:536::-;63754:35;:20;63784:4;63754:29;:35::i;:::-;63753:36;63745:45;;;;;;-1:-1:-1;;;;;63817:15:0;;;;;;:9;:15;;;;;;63801:12;:31;;63817:15;;63801:12;;:31;;63817:15;;63801:31;:::i;:::-;;;;-1:-1:-1;63843:20:0;;-1:-1:-1;63866:22:0;63877:4;63883;63866:10;:22::i;:::-;63843:45;;63899:20;63922:23;63933:4;63939:5;63922:10;:23::i;:::-;63998:15;;-1:-1:-1;;;;;63980:15:0;;;;;;:9;:15;;;;;;63899:46;;-1:-1:-1;63980:33:0;;;:::i;:::-;-1:-1:-1;;;;;63956:21:0;;;;;;:15;:21;;;;;;;;:57;;;;64066:15;;64048:9;:15;;;;;;;:33;;64066:15;64048:33;:::i;:::-;-1:-1:-1;;;;;64024:21:0;;;;;;:15;:21;;;;;;;;:57;;;;64092:12;:18;;;;;:34;;64114:12;;64024:21;64092:34;;64114:12;;64092:34;:::i;:::-;;;;-1:-1:-1;;;;;;;64137:18:0;;;;;;:12;:18;;;;;:34;;64159:12;;64137:18;:34;;64159:12;;64137:34;:::i;:::-;;;;-1:-1:-1;64182:30:0;;-1:-1:-1;64182:20:0;64207:4;64182:24;:30::i;64228:333::-;64295:35;:20;64325:4;64295:29;:35::i;:::-;64287:44;;;;;;-1:-1:-1;;;;;64358:15:0;;;;;;:9;:15;;;;;;64342:12;:31;;64358:15;;64342:12;;:31;;64358:15;;64342:31;:::i;:::-;;;;-1:-1:-1;64384:33:0;;-1:-1:-1;64384:20:0;64412:4;64384:27;:33::i;:::-;-1:-1:-1;64470:15:0;;-1:-1:-1;;;;;64452:15:0;;;;;;:9;:15;;;;;;:33;;64470:15;64452:33;:::i;:::-;-1:-1:-1;;;;;64428:21:0;;;;;;:15;:21;;;;;;;;:57;;;;64538:15;;64520:9;:15;;;;;;;:33;;64538:15;64520:33;:::i;:::-;-1:-1:-1;;;;;64496:21:0;;;;;;;:15;:21;;;;;:57;64228:333::o;52659:1834::-;25226:27;:34;;-1:-1:-1;;25226:34:0;25256:4;25226:34;;;52815:3:::1;52794:24;::::0;::::1;;;52786:33;;;::::0;::::1;;52834:14;::::0;::::1;::::0;::::1;;;52830:32:::0;52855:7:::1;52830:32;52916:4;52872:23;52898:24:::0;;;:9:::1;:24;::::0;;;;;;52968:19:::1;::::0;-1:-1:-1;;;;;52968:19:0::1;52958:30:::0;;;;;;52898:24;;52872:23;53025:4:::1;::::0;52958:63:::1;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;52957:72;;;;:::i;:::-;53058:15:::0;;52935:94;;-1:-1:-1;53044:29:0;::::1;:46:::0;::::1;;;;53078:12;53077:13;53044:46;53040:94;;;-1:-1:-1::0;53119:15:0;;53040:94:::1;53169:29:::0;;::::1;53209:120:::0;::::1;;;53248:12;53244:74;;;53276:15;53262:29;;53244:74;;;53311:7;;;;;53244:74;53363:4;53343:26;::::0;;;:11:::1;:26;::::0;;;;;;;53378:14:::1;::::0;-1:-1:-1;;;;;53378:14:0::1;53343:51:::0;;;;;;;;:65;-1:-1:-1;53339:151:0::1;;;53455:14;::::0;53423:67:::1;::::0;53440:4:::1;::::0;-1:-1:-1;;;;;53455:14:0::1;-1:-1:-1::0;;53423:8:0::1;:67::i;:::-;53541:17;::::0;53503:23:::1;::::0;-1:-1:-1;;;53541:17:0;::::1;;;:64:::0;::::1;;;-1:-1:-1::0;53585:20:0::1;::::0;;;::::1;;;53562:19;:17;:19::i;:::-;:43;;53541:64;53537:156;;;-1:-1:-1::0;53638:1:0::1;53537:156;;;-1:-1:-1::0;53673:10:0::1;:20:::0;;;::::1;;;53537:156;53781:14;::::0;53706:25:::1;::::0;53781:14:::1;::::0;::::1;;;53735:29;53749:15:::0;53735:11;:29:::1;:::i;:::-;53734:61;;;;:::i;:::-;53706:89:::0;-1:-1:-1;53806:22:0::1;53831:31;53706:89:::0;53831:11;:31:::1;:::i;:::-;53806:56:::0;-1:-1:-1;53873:16:0::1;53892:21;53912:1;53892:17:::0;:21:::1;:::i;:::-;53873:40:::0;-1:-1:-1;53924:19:0::1;53946:28;53873:40:::0;53946:17;:28:::1;:::i;:::-;53924:50:::0;-1:-1:-1;53985:17:0::1;54005:28;54019:14:::0;53924:50;54005:28:::1;:::i;:::-;53985:48:::0;-1:-1:-1;54072:21:0::1;54104:27;53985:48:::0;54104:16:::1;:27::i;:::-;54142:14;54160:41;54184:17:::0;54160:21:::1;:41;:::i;:::-;54142:60:::0;-1:-1:-1;54213:14:0::1;54255:9:::0;54231:20:::1;54240:11:::0;54142:60;54231:20:::1;:::i;:::-;54230:34;;;;:::i;:::-;54213:51:::0;-1:-1:-1;54279:12:0;;54275:49:::1;;54293:31;54307:8;54317:6;54293:13;:31::i;:::-;54335:21;54416:6:::0;54360:54:::1;54397:17:::0;54360:21:::1;:54;:::i;:::-;:62;;;;:::i;:::-;54335:102;;54448:37;54465:13;54480:4;54448:16;:37::i;:::-;52775:1718;;;;;;;;;;;;;25271:1;-1:-1:-1::0;;25283:27:0;:35;;-1:-1:-1;;25283:35:0;;;52659:1834::o;60682:450::-;60767:14;;60758:6;:23;60754:57;;;60790:21;;-1:-1:-1;;;60790:21:0;;;;;;;;;;;60754:57;60840:6;60822:14;;:24;;;;;;;:::i;:::-;;;;-1:-1:-1;;60883:16:0;;;60897:1;60883:16;;;;;;;;60859:21;;60883:16;;;;;;;;-1:-1:-1;;60920:14:0;;:21;;;-1:-1:-1;;;60920:21:0;;;;60859:40;;-1:-1:-1;;;;;;60920:14:0;;;;:19;;-1:-1:-1;60920:21:0;;;;;;;;;;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;60910:4;60915:1;60910:7;;;;;;;;:::i;:::-;;;;;;:31;-1:-1:-1;;;;;60910:31:0;;;-1:-1:-1;;;;;60910:31:0;;;;;60962:5;60952:4;60957:1;60952:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;60952:15:0;;;:7;;;;;;;;;:15;60980:14;;:144;;-1:-1:-1;;;60980:144:0;;:14;;;:65;;61067:6;;60980:144;;:14;;61088:4;;19882:42;;61108:15;;60980:144;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60743:389;60682:450;;:::o;65859:464::-;65958:7;65987:4;65983:333;;;66012:35;:20;66042:4;66012:29;:35::i;:::-;66008:66;;;-1:-1:-1;;;;;;66056:18:0;;;;;;:12;:18;;;;;;66049:25;;66008:66;-1:-1:-1;;;;;66121:18:0;;;;;;:12;:18;;;;;;66096:22;66134:4;66113;66096:10;:22::i;:::-;:43;;;;:::i;:::-;66089:50;;;;65983:333;66176:35;:20;66206:4;66176:29;:35::i;:::-;66172:66;;;-1:-1:-1;;;;;;66220:18:0;;;;;;:12;:18;;;;;;66213:25;;66172:66;-1:-1:-1;;;;;66286:18:0;;;;;;:12;:18;;;;;;;66260:23;;66299:4;;66260:10;:23::i;62754:524::-;62901:14;;;;;;;62900:15;62892:24;;;;;;62950:9;62963:1;62950:14;62942:23;;;;;;62980:14;:21;;-1:-1:-1;;62980:21:0;;;;;63016:36;63030:4;63036:9;63047:4;63016:13;:36::i;:::-;63083:9;63067:12;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;63107:23:0;;;;;;:19;:23;;;;;:36;;63134:9;;63107:23;:36;;63134:9;;63107:36;:::i;:::-;;;;-1:-1:-1;63158:23:0;;-1:-1:-1;63167:2:0;63171:9;63158:8;:23::i;:::-;63203:14;:22;;-1:-1:-1;;63203:22:0;;;63241:29;;;-1:-1:-1;;;;;26741:15:1;;;26723:34;;26793:15;;26788:2;26773:18;;26766:43;26825:18;;;26818:34;;;63241:29:0;;26650:2:1;26635:18;63241:29:0;26460:398:1;61140:1606:0;61294:14;;;;;;;61293:15;61285:24;;;;;;61320:14;:21;;-1:-1:-1;;61320:21:0;;;;;;61381:35;:20;61411:4;61381:29;:35::i;:::-;61377:776;;;61437:4;61433:222;;;-1:-1:-1;;;;;;61471:18:0;;;;;;:12;:18;;;;;;;61508:22;;;61377:776;;61433:222;-1:-1:-1;;;;;;61580:18:0;;;;;;:12;:18;;;;;;;61617:22;;;61377:776;;;61687:17;61707:22;61718:4;61724;61707:10;:22::i;:::-;61687:42;;61748:4;61744:398;;;-1:-1:-1;;;;;61815:15:0;;;;;;:9;:15;;;;;;61797;;:33;;61815:15;61797:33;:::i;:::-;-1:-1:-1;;;;;61773:21:0;;;;;;:15;:21;;;;;;;;:57;;;;61858:12;:18;;;;:30;;61879:9;;61858:30;:::i;:::-;-1:-1:-1;;;;;61907:18:0;;61928:1;61907:18;;;:12;:18;;;;;:22;61849:39;-1:-1:-1;61744:398:0;;;-1:-1:-1;;;;;62012:15:0;;;;;;:9;:15;;;;;;61994;;:33;;62012:15;61994:33;:::i;:::-;-1:-1:-1;;;;;61970:21:0;;;;;;:15;:21;;;;;;;;:57;;;;62055:12;:18;;;;:30;;62076:9;;62055:30;:::i;:::-;-1:-1:-1;;;;;62104:18:0;;62125:1;62104:18;;;:12;:18;;;;;:22;62046:39;-1:-1:-1;61744:398:0;61672:481;61377:776;62169:11;;:33;;;;-1:-1:-1;62184:18:0;;62169:33;62165:109;;;-1:-1:-1;62219:14:0;:22;;-1:-1:-1;;62219:22:0;;;62256:7;;62165:109;62302:6;62286:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;62319:25:0;;;;;;:19;:25;;;;;:35;;62348:6;;62319:25;:35;;62348:6;;62319:35;:::i;:::-;;;;-1:-1:-1;62365:23:0;;-1:-1:-1;62375:13:0;62365:23;;:::i;:::-;62423:16;;;62437:1;62423:16;;;;;;;;62365:23;;-1:-1:-1;62399:21:0;;62423:16;;;;;;;;;;-1:-1:-1;;62460:14:0;;:21;;;-1:-1:-1;;;62460:21:0;;;;62399:40;;-1:-1:-1;;;;;;62460:14:0;;;;:19;;-1:-1:-1;62460:21:0;;;;;;;;;;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62450:4;62455:1;62450:7;;;;;;;;:::i;:::-;;;;;;:31;-1:-1:-1;;;;;62450:31:0;;;-1:-1:-1;;;;;62450:31:0;;;;;62502:5;62492:4;62497:1;62492:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;62492:15:0;;;:7;;;;;;;;;:15;62520:14;;:136;;-1:-1:-1;;;62520:136:0;;:14;;;:65;;62607:6;;62520:136;;:14;;62628:4;;62634;;62640:15;;62520:136;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62674:31;62685:6;62693:5;62700:4;62674:31;;;;;;;27065:25:1;;;-1:-1:-1;;;;;27187:15:1;;;27182:2;27167:18;;27160:43;27239:15;27234:2;27219:18;;27212:43;27053:2;27038:18;;26863:398;62674:31:0;;;;;;;;-1:-1:-1;;62716:14:0;:22;;-1:-1:-1;;62716:22:0;;;61140:1606;;;;:::o;14489:291::-;14552:4;15514:19;;;:12;;;:19;;;;;;14569:204;;-1:-1:-1;14612:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;14672:18;;14650:19;;;:12;;;:19;;;;;;:40;;;;14705:11;;14569:204;-1:-1:-1;14756:5:0;14749:12;;28474:244;28531:4;9803:6;;-1:-1:-1;;;;;28568:15:0;;;9803:6;;28568:15;;:60;;-1:-1:-1;28608:20:0;;-1:-1:-1;;;;;28600:28:0;;;28608:20;;28600:28;28568:60;:100;;;-1:-1:-1;28653:10:0;:15;-1:-1:-1;;;;;28645:23:0;;;28653:15;;28645:23;28568:100;:142;;;-1:-1:-1;;28693:17:0;;-1:-1:-1;;;;;28693:17:0;;;28685:25;;;;28474:244::o;14788:589::-;14854:4;14892:19;;;:12;;;:19;;;;;;14926:15;;14922:448;;14958:21;14982:14;14995:1;14982:10;:14;:::i;:::-;15031:18;;14958:38;;-1:-1:-1;15011:17:0;;15031:22;;15052:1;;15031:22;:::i;:::-;15011:42;;15068:17;15088:3;:11;;15100:9;15088:22;;;;;;;;:::i;:::-;;;;;;;;;15068:42;;15154:9;15125:3;:11;;15137:13;15125:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;15178:23;;;:12;;;:23;;;;;;:36;;;15229:17;;15178:3;;15229:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;15268:3;:12;;:19;15281:5;15268:19;;;;;;;;;;;15261:26;;;15309:4;15302:11;;;;;;;;14922:448;15353:5;15346:12;;;;;60333:341;-1:-1:-1;;;;;60425:18:0;;;;;;:9;:18;;;;;;60415:28;;;60407:37;;;;;;60464:10;;;;;;;60463:11;60455:20;;;;;;60486:10;:17;;-1:-1:-1;;60486:17:0;;;;;60514:29;60527:7;60536:6;60514:12;:29::i;:::-;60576:6;60554:18;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;60598:39:0;;3697:25:1;;;19882:42:0;;-1:-1:-1;;;;;60598:39:0;;;;;3685:2:1;3670:18;60598:39:0;;;;;;;-1:-1:-1;;60648:10:0;:18;;-1:-1:-1;;60648:18:0;;;60333:341::o;64569:396::-;64697:12;:20;64643:18;;64697:20;-1:-1:-1;;;64697:20:0;;;;;64643:37;;64664:16;;;;;;;;64643:37;:::i;:::-;64642:75;;;;:::i;:::-;64612:14;:105;64815:12;:20;64760:18;;64815:20;-1:-1:-1;;;64815:20:0;;;;;64760:38;;64781:17;;;;;;;;64760:38;:::i;:::-;64759:76;;;;:::i;:::-;64728:15;:107;64937:12;:20;64880:18;;64937:20;-1:-1:-1;;;64937:20:0;;;;;64880:40;;64901:19;;;64880:40;:::i;:::-;64879:78;;;;:::i;:::-;64846:7;:111;64569:396::o;51493:327::-;-1:-1:-1;;;;;51627:17:0;;;;;;:9;:17;;;;;;:26;-1:-1:-1;51623:60:0;;;51662:21;;-1:-1:-1;;;51662:21:0;;;;;;;;;;;51623:60;51694:28;51707:6;51715;51694:12;:28::i;:::-;51733;51743:9;51754:6;51733:9;:28::i;:::-;51794:9;-1:-1:-1;;;;;51777:35:0;51786:6;-1:-1:-1;;;;;51777:35:0;;51805:6;51777:35;;;;3697:25:1;;3685:2;3670:18;;3551:177;54962:4069:0;-1:-1:-1;;;;;55137:17:0;;;;;;:9;:17;;;;;;:26;-1:-1:-1;55133:60:0;;;55172:21;;-1:-1:-1;;;55172:21:0;;;;;;;;;;;55133:60;55206:9;;;55314:2358;;;;55345:16;;;;;;;55341:108;;;-1:-1:-1;;;;;55386:21:0;;;;;;:13;:21;;;;;;;;55382:51;;;55416:17;;-1:-1:-1;;;55416:17:0;;;;;;;;;;;55382:51;55478:15;;55469:24;;:48;;;;-1:-1:-1;;;;;;55498:19:0;;;;;;:11;:19;;;;;;;;55497:20;55469:48;55465:110;;;55559:15;;55543:32;;-1:-1:-1;;;55543:32:0;;;;;3697:25:1;;;;3670:18;;55543:32:0;3551:177:1;55465:110:0;55598:32;55616:6;55624:5;55598:17;:32::i;:::-;55649:19;;55592:38;;-1:-1:-1;55649:19:0;;;;;55645:44;;;55685:4;55670:19;;55645:44;55314:2358;;;55711:5;55707:1965;;;55738:10;;;;55737:11;:40;;;;-1:-1:-1;;;;;;55753:24:0;;;;;;:13;:24;;;;;;;;55752:25;55737:40;55733:112;;;-1:-1:-1;;;;;55798:24:0;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;55798:31:0;55825:4;55798:31;;;55733:112;55865:11;;:15;55861:216;;55920:11;;22075:1;;55905:26;;:12;:26;:::i;:::-;:45;55901:161;;;-1:-1:-1;;;;;55975:24:0;;;;;;:13;:24;;;;;:31;;-1:-1:-1;;55975:31:0;56002:4;55975:31;;;56031:11;56029:13;;56031:11;;55975:24;56029:13;;55975:31;56029:13;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;55901:161;56097:15;;;;;;;56093:157;;;-1:-1:-1;;;;;56141:21:0;;;;;;:10;:21;;;;;;56166:12;56141:37;;56133:46;;;;;;-1:-1:-1;;;;;56198:21:0;;;;;;:10;:21;;;;;56222:12;56198:36;;56093:157;56322:7;:17;-1:-1:-1;;;;;56289:20:0;;56322:17;56289:20;;;:9;:20;;;;;;:29;;56312:6;;56289:29;:::i;:::-;56288:51;:95;;;;-1:-1:-1;;;;;;56361:22:0;;;;;;:11;:22;;;;;;;;56360:23;56288:95;56266:177;;;56425:7;:17;56406:37;;-1:-1:-1;;;56406:37:0;;;;;3697:25:1;;;;3670:18;;56406:37:0;3551:177:1;56266::0;56471:14;;56462:23;;:50;;;;-1:-1:-1;;;;;;56490:22:0;;;;;;:11;:22;;;;;;;;56489:23;56462:50;56458:110;;;56553:14;;56538:30;;-1:-1:-1;;;56538:30:0;;;;;3697:25:1;;;;3670:18;;56538:30:0;3551:177:1;56458:110:0;56589:34;56607:9;56618:4;56589:17;:34::i;:::-;56583:40;;55707:1965;;;56662:16;;;;;;;56658:108;;;-1:-1:-1;;;;;56703:21:0;;;;;;:13;:21;;;;;;;;56699:51;;;56733:17;;-1:-1:-1;;;56733:17:0;;;;;;;;;;;56699:51;56796:20;19735:2;56796;:20;:::i;:::-;56786:6;:30;56782:481;;56913:14;;;;;;;;;-1:-1:-1;;;;;56913:14:0;-1:-1:-1;;;;;56913:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;56899:10;;-1:-1:-1;;;;;56899:35:0;;;-1:-1:-1;;;56899:10:0;;;;;;:35;56895:327;;56957:198;56994:10;57031;57068:33;57084:10;57096:4;57068:15;:33::i;56957:198::-;56895:327;;;57202:10;;57179:43;;57190:10;;-1:-1:-1;;;57202:10:0;;-1:-1:-1;;;;;57202:10:0;57214:1;57217:4;57179:10;:43::i;:::-;57241:7;;;;;56782:481;57335:7;:17;-1:-1:-1;;;;;57302:20:0;;57335:17;57302:20;;;:9;:20;;;;;;:29;;57325:6;;57302:29;:::i;:::-;57301:51;:95;;;;-1:-1:-1;;;;;;57374:22:0;;;;;;:11;:22;;;;;;;;57373:23;57301:95;57279:177;;;57438:7;:17;57419:37;;-1:-1:-1;;;57419:37:0;;;;;3697:25:1;;;;3670:18;;57419:37:0;3551:177:1;57279::0;57529:17;;:21;57525:122;;57628:3;57607:17;;57598:6;:26;;;;:::i;:::-;57597:34;;;;:::i;:::-;57571:60;;57525:122;57713:19;;-1:-1:-1;;;;;57703:29:0;;;57713:19;;57703:29;;;;57702:61;;-1:-1:-1;57752:10:0;;;;;;;57751:11;57702:61;:108;;;;-1:-1:-1;57782:27:0;;;;57781:28;57702:108;:131;;;;;57827:6;57702:131;57684:201;;;57864:13;;57845:40;;57864:13;;;;;57879:5;57845:18;:40::i;:::-;-1:-1:-1;;;;;57902:17:0;;;;;;:9;:17;;;;;;;;;:41;;-1:-1:-1;;;;;;57923:20:0;;;;;;:9;:20;;;;;;;;57902:41;57898:116;;;57966:1;57960:7;;57997:5;57982:20;;57898:116;58026:19;;;58128:7;;;;58124:214;;58183:3;58167:12;;;;:6;:12;:::i;:::-;58166:20;;;;:::i;:::-;58253:13;;58234:10;:15;58152:34;;-1:-1:-1;58253:13:0;;;;;58220:29;;58234:15;58152:34;58220:29;:::i;:::-;58219:47;;;;:::i;:::-;58201:65;-1:-1:-1;58297:29:0;58201:65;58297:11;:29;:::i;:::-;58281:45;;58124:214;58354:12;58350:228;;;58383:16;58402:22;58417:6;58402:14;:22::i;:::-;58383:41;-1:-1:-1;58439:23:0;58383:41;58439:23;;:::i;:::-;58481:11;;58439:23;;-1:-1:-1;58481:11:0;;;;;58477:89;;;58494:27;58513:8;58494:27;;:::i;:::-;;;58477:89;;;58541:25;58558:8;58541:25;;:::i;:::-;;;58477:89;58368:210;58350:228;58633:27;;58630:96;;58676:38;58691:23;58676:38;;:::i;:::-;;;58630:96;58738:21;58762:20;58771:11;58762:6;:20;:::i;:::-;58738:44;;58793:28;58806:6;58814;58793:12;:28::i;:::-;58832:39;58850:4;58857:13;58832:9;:39::i;:::-;58904:15;58882:18;;:37;;;;;;;:::i;:::-;;;;-1:-1:-1;58930:35:0;;-1:-1:-1;58940:9:0;58951:13;58930:9;:35::i;:::-;58998:9;-1:-1:-1;;;;;58981:42:0;58990:6;-1:-1:-1;;;;;58981:42:0;;59009:13;58981:42;;;;3697:25:1;;3685:2;3670:18;;3551:177;58981:42:0;;;;;;;;55122:3909;;;;;;;54962:4069;;;;;;:::o;66686:602::-;66782:7;66811:4;66807:474;;;-1:-1:-1;;;;;66871:17:0;;66832:18;66871:17;;;:9;:17;;;;;;66853:15;;:35;;66871:17;66853:35;:::i;:::-;-1:-1:-1;;;;;66920:23:0;;;;;;:15;:23;;;;;;66832:56;;-1:-1:-1;66907:36:0;;66903:50;;;66952:1;66945:8;;;;;66903:50;-1:-1:-1;;;;;66989:23:0;;;;;;:15;:23;;;;;;48102:5;;66976:36;;:10;:36;:::i;:::-;66975:59;;;;:::i;:::-;66968:66;;;;;66807:474;-1:-1:-1;;;;;67106:17:0;;67067:18;67106:17;;;:9;:17;;;;;;67088:15;;:35;;67106:17;67088:35;:::i;:::-;-1:-1:-1;;;;;67155:23:0;;;;;;:15;:23;;;;;;67067:56;;-1:-1:-1;67142:36:0;;67138:50;;;67187:1;67180:8;;;;;67138:50;-1:-1:-1;;;;;67224:23:0;;;;;;:15;:23;;;;;;48102:5;;67211:36;;:10;:36;:::i;54501:453::-;54594:14;;54562:56;;54579:4;;-1:-1:-1;;;;;54594:14:0;54611:6;54562:8;:56::i;:::-;54653:16;;;54667:1;54653:16;;;;;;;;54629:21;;54653:16;;;;;;;;;;-1:-1:-1;54653:16:0;54629:40;;54698:4;54680;54685:1;54680:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54680:23:0;;;:7;;;;;;;;;;:23;;;;54724:14;;:21;;;-1:-1:-1;;;54724:21:0;;;;:14;;;;;:19;;:21;;;;;54680:7;;54724:21;;;;;:14;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54714:4;54719:1;54714:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54714:31:0;;;:7;;;;;;;;;:31;54756:14;;:190;;-1:-1:-1;;;54756:190:0;;:14;;;:65;;:190;;54836:6;;54756:14;;54873:4;;54900;;54920:15;;54756:190;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54551:403;54501:453;:::o;48569:365::-;48683:14;;48651:61;;48668:4;;-1:-1:-1;;;;;48683:14:0;48700:11;48651:8;:61::i;:::-;48723:14;;:203;;-1:-1:-1;;;48723:203:0;;48794:4;48723:203;;;19107:34:1;;;19157:18;;;19150:34;;;48723:14:0;19200:18:1;;;19193:34;;;19243:18;;;19236:34;19286:19;;;19279:44;48900:15:0;19339:19:1;;;19332:35;-1:-1:-1;;;;;48723:14:0;;;;:30;;48761:9;;19018:19:1;;48723:203:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;50150:1335::-;50326:15;;50289:10;:20;50251:22;;50326:15;;;;;;;;50277:32;;50289:20;;;;;50277:9;:32;:::i;:::-;50276:65;;;;:::i;:::-;50404:15;;50385:10;:15;50251:90;;-1:-1:-1;50352:17:0;;50404:15;;;;;;;;;50373:27;;50385:15;;50373:9;:27;:::i;:::-;50372:47;;;;:::i;:::-;50501:15;;50466:10;:18;50352:67;;-1:-1:-1;50430:20:0;;50501:15;;;;;;;;50454:30;;50501:15;50466:18;;;50454:9;:30;:::i;:::-;50453:63;;;;:::i;:::-;50598:15;;50563:10;:18;50430:86;;-1:-1:-1;50527:20:0;;50598:15;;;;;;;;50551:30;;-1:-1:-1;;;50563:18:0;;;50551:9;:30;:::i;:::-;50550:63;;;;:::i;:::-;50680:15;;50659:10;:17;50527:86;;-1:-1:-1;50624:19:0;;50680:15;;;;;;;;50647:29;;50659:17;;;;50647:9;:29;:::i;:::-;50646:49;;;;:::i;:::-;50743:15;;50624:71;;-1:-1:-1;50706:18:0;;50762:3;;50728:30;;50743:15;;50728:12;:30;:::i;:::-;50727:38;;;;:::i;:::-;50813:15;;50706:59;;-1:-1:-1;50776:18:0;;50832:3;;50798:30;;50813:15;;;;;50798:12;:30;:::i;:::-;50797:38;;;;:::i;:::-;50776:59;;50866:14;50846:16;;:34;;;;;;;:::i;:::-;;;;;;;;50906:9;50891:11;;:24;;;;;;;:::i;:::-;;;;;;;;50944:12;50926:14;;:30;;;;;;;:::i;:::-;;;;;;;;50984:11;50967:13;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;51010:16:0;;51006:472;;51047:16;51043:50;;;51081:12;51065;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;51043:50:0;51108:19;51130:16;:14;:16::i;:::-;51108:38;;51165:11;51180:1;51165:16;51161:306;;51203:12;51183:16;;:32;;;;;;;:::i;:::-;;;;-1:-1:-1;51161:306:0;;-1:-1:-1;51161:306:0;;51331:11;51275:31;48102:5;51275:10;:31;:::i;:::-;51274:68;;;;:::i;:::-;51254:15;;:89;;;;;;;:::i;:::-;;;;-1:-1:-1;51439:11:0;;-1:-1:-1;51383:31:0;48102:5;51383:10;:31;:::i;:::-;51382:68;;;;:::i;:::-;51362:15;;:89;;;;;;;:::i;:::-;;;;-1:-1:-1;;51161:306:0;51028:450;50240:1245;;;;;;;50150:1335;;:::o;64973:878::-;65094:6;65104:1;65094:11;65090:24;;64973:878;;;:::o;65090:24::-;65137:27;65153:4;65159;65137:15;:27::i;:::-;65128:6;:36;65124:70;;;65173:21;;-1:-1:-1;;;65173:21:0;;;;;;;;;;;65124:70;65211:35;:20;65241:4;65211:29;:35::i;:::-;65207:637;;;65267:4;65263:86;;;-1:-1:-1;;;;;65273:18:0;;;;;;:12;:18;;;;;:28;;65295:6;;65273:18;:28;;65295:6;;65273:28;:::i;:::-;;;;-1:-1:-1;65207:637:0;;-1:-1:-1;65207:637:0;65263:86;-1:-1:-1;;;;;65321:18:0;;;;;;:12;:18;;;;;:28;;65343:6;;65321:18;:28;;65343:6;;65321:28;:::i;65207:637::-;65382:17;65402:22;65413:4;65419;65402:10;:22::i;:::-;65382:42;;65443:4;65439:394;;;-1:-1:-1;;;;;65510:15:0;;;;;;:9;:15;;;;;;65492;;:33;;65510:15;65492:33;:::i;:::-;-1:-1:-1;;;;;65468:21:0;;;;;;:15;:21;;;;;;;;:57;;;;65544:12;:18;;;;;:31;;65566:9;;65468:21;65544:31;;65566:9;;65544:31;:::i;:::-;;;;-1:-1:-1;;;;;;;65594:18:0;;;;;;:12;:18;;;;;:28;;65616:6;;65594:18;:28;;65616:6;;65594:28;:::i;:::-;;;;-1:-1:-1;65439:394:0;;-1:-1:-1;65439:394:0;;-1:-1:-1;;;;;65705:15:0;;;;;;:9;:15;;;;;;65687;;:33;;65705:15;65687:33;:::i;:::-;-1:-1:-1;;;;;65663:21:0;;;;;;:15;:21;;;;;;;;:57;;;;65739:12;:18;;;;;:31;;65761:9;;65663:21;65739:31;;65761:9;;65739:31;:::i;:::-;;;;-1:-1:-1;;;;;;;65789:18:0;;;;;;:12;:18;;;;;:28;;65811:6;;65789:18;:28;;65811:6;;65789:28;:::i;:::-;;;;-1:-1:-1;;65367:477:0;64973:878;;;:::o;51828:645::-;-1:-1:-1;;;;;51919:15:0;;51899:17;51919:15;;;:9;:15;;;;;;:24;;51937:6;;51919:24;:::i;:::-;51899:44;-1:-1:-1;51960:35:0;:20;51990:4;51960:29;:35::i;:::-;51956:116;;;-1:-1:-1;;;;;52012:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;51828:645:0:o;51956:116::-;52098:6;52082:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;52115:19:0;;-1:-1:-1;52137:22:0;52148:4;52154;52137:10;:22::i;:::-;52115:44;;52170:19;52192:23;52203:4;52209:5;52192:10;:23::i;:::-;-1:-1:-1;;;;;52226:15:0;;;;;;:9;:15;;;;;:27;;;52288:15;;52170:45;;-1:-1:-1;52288:27:0;;52244:9;;52288:27;:::i;:::-;-1:-1:-1;;;;;52264:21:0;;;;;;:15;:21;;;;;;;;:51;;;;52326:12;:18;;;;;:33;;52348:11;;52264:21;52326:33;;52348:11;;52326:33;:::i;:::-;;;;-1:-1:-1;;52394:15:0;;:27;;52412:9;;52394:27;:::i;:::-;-1:-1:-1;;;;;52370:21:0;;;;;;:15;:21;;;;;;;;:51;;;;52432:12;:18;;;;;:33;;52454:11;;52370:21;52432:33;;52454:11;;52432:33;:::i;:::-;;;;-1:-1:-1;;;;;;;51828:645:0:o;48942:767::-;-1:-1:-1;;;;;49030:15:0;;49010:17;49030:15;;;:9;:15;;;;;;:24;;49048:6;;49030:24;:::i;:::-;49010:44;-1:-1:-1;49071:35:0;:20;49101:4;49071:29;:35::i;:::-;49067:116;;;-1:-1:-1;;;;;49123:15:0;;;;;;;:9;:15;;;;;:27;;;;-1:-1:-1;48942:767:0:o;49067:116::-;49209:6;49193:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;49226:19:0;;-1:-1:-1;49248:22:0;49259:4;49265;49248:10;:22::i;:::-;49226:44;;49281:19;49303:23;49314:4;49320:5;49303:10;:23::i;:::-;-1:-1:-1;;;;;49337:15:0;;;;;;:9;:15;;;;;:27;;;49399:15;;49281:45;;-1:-1:-1;49399:27:0;;49355:9;;49399:27;:::i;:::-;-1:-1:-1;;;;;49375:21:0;;;;;;:15;:21;;;;;;;;:51;;;;49437:12;:18;;;;;:33;;49459:11;;49375:21;49437:33;;49459:11;;49437:33;:::i;:::-;;;;-1:-1:-1;;49505:15:0;;:27;;49523:9;;49505:27;:::i;:::-;-1:-1:-1;;;;;49481:21:0;;;;;;:15;:21;;;;;;;;:51;;;;49543:12;:18;;;;;:33;;49565:11;;49481:21;49543:33;;49565:11;;49543:33;:::i;:::-;;;;-1:-1:-1;;;;;;;49587:15:0;;;;;;:9;:15;;;;;:27;;;49666:35;49597:4;49666:29;:35::i;49717:425::-;-1:-1:-1;;;;;49847:11:0;;49819:5;49847:11;;;:5;:11;;;;;;;;49846:12;:28;;;;-1:-1:-1;;;;;;49863:11:0;;;;;;:5;:11;;;;;;;;49862:12;49846:28;49842:293;;;49898:5;:42;;49924:10;:16;;;49898:42;;;-1:-1:-1;49906:9:0;:15;;;49891:49;;49842:293;-1:-1:-1;;;;;49962:11:0;;;;;;:5;:11;;;;;;;;49958:177;;;49997:5;:42;;50023:10;:16;;;;;;49997:42;;;-1:-1:-1;50005:9:0;:15;;;;;;49990:49;;49958:177;50079:5;:44;;50106:10;:17;;;;;;50079:44;;;-1:-1:-1;50087:9:0;:16;;;;;;50072:51;;63286:390;63394:19;;-1:-1:-1;;;;;63394:19:0;63348:7;63384:30;;;:9;:30;;;;;;63348:7;63440:11;63448:3;63384:30;63440:11;:::i;:::-;63425:26;-1:-1:-1;63462:12:0;63477:10;63485:2;63477:5;:10;:::i;:::-;63462:25;;63512:4;63502:6;:14;63498:37;;-1:-1:-1;63534:1:0;;63286:390;-1:-1:-1;;;;63286:390:0:o;63498:37::-;63561:4;63552:6;:13;63548:45;;;63590:3;63575:11;:6;63584:2;63575:11;:::i;:::-;63574:19;;;;:::i;:::-;63567:26;63286:390;-1:-1:-1;;;;;63286:390:0:o;63548:45::-;63665:3;63649:11;63656:4;63649;:11;:::i;:::-;63638:6;63616:13;63625:4;63638:6;63616:13;:::i;:::-;63615:20;;63633:2;63615:20;:::i;:::-;:29;;;;:::i;:::-;63614:47;;;;:::i;66331:112::-;66379:7;19629:18;19735:2;19629;:18;:::i;:::-;19613:34;;:13;:34;:::i;:::-;66406:12;;:29;;;;:::i;30354:317::-;-1:-1:-1;;;;;30450:35:0;;;;;;:25;:35;;;;;;;;30446:218;;30520:23;;;30501:43;;;;:18;:43;;;;;;;;:54;;-1:-1:-1;;;;;;30501:54:0;-1:-1:-1;;;;;30501:54:0;;;;;;;;30570:35;;:25;:35;;;;;:42;;-1:-1:-1;;30570:42:0;-1:-1:-1;30570:42:0;;;30627:25;;;30520:23;30627:25;;;:::i;:::-;;;;;;30354:317;:::o;207:159:1:-;274:20;;334:6;323:18;;313:29;;303:57;;356:1;353;346:12;303:57;207:159;;;:::o;371:118::-;457:5;450:13;443:21;436:5;433:32;423:60;;479:1;476;469:12;494:531;582:6;590;598;606;614;667:3;655:9;646:7;642:23;638:33;635:53;;;684:1;681;674:12;635:53;707:28;725:9;707:28;:::i;:::-;697:38;;754:37;787:2;776:9;772:18;754:37;:::i;:::-;744:47;;810:37;843:2;832:9;828:18;810:37;:::i;:::-;800:47;;866:37;899:2;888:9;884:18;866:37;:::i;:::-;856:47;;953:3;942:9;938:19;925:33;967:28;989:5;967:28;:::i;:::-;1014:5;1004:15;;;494:531;;;;;;;;:::o;1030:154::-;-1:-1:-1;;;;;1109:5:1;1105:54;1098:5;1095:65;1085:93;;1174:1;1171;1164:12;1189:247;1248:6;1301:2;1289:9;1280:7;1276:23;1272:32;1269:52;;;1317:1;1314;1307:12;1269:52;1356:9;1343:23;1375:31;1400:5;1375:31;:::i;1633:548::-;1745:4;1774:2;1803;1792:9;1785:21;1835:6;1829:13;1878:6;1873:2;1862:9;1858:18;1851:34;1903:1;1913:140;1927:6;1924:1;1921:13;1913:140;;;2022:14;;;2018:23;;2012:30;1988:17;;;2007:2;1984:26;1977:66;1942:10;;1913:140;;;1917:3;2102:1;2097:2;2088:6;2077:9;2073:22;2069:31;2062:42;2172:2;2165;2161:7;2156:2;2148:6;2144:15;2140:29;2129:9;2125:45;2121:54;2113:62;;;;1633:548;;;;:::o;2417:315::-;2485:6;2493;2546:2;2534:9;2525:7;2521:23;2517:32;2514:52;;;2562:1;2559;2552:12;2514:52;2601:9;2588:23;2620:31;2645:5;2620:31;:::i;:::-;2670:5;2722:2;2707:18;;;;2694:32;;-1:-1:-1;;;2417:315:1:o;2737:367::-;2800:8;2810:6;2864:3;2857:4;2849:6;2845:17;2841:27;2831:55;;2882:1;2879;2872:12;2831:55;-1:-1:-1;2905:20:1;;2948:18;2937:30;;2934:50;;;2980:1;2977;2970:12;2934:50;3017:4;3009:6;3005:17;2993:29;;3077:3;3070:4;3060:6;3057:1;3053:14;3045:6;3041:27;3037:38;3034:47;3031:67;;;3094:1;3091;3084:12;3031:67;2737:367;;;;;:::o;3109:437::-;3195:6;3203;3256:2;3244:9;3235:7;3231:23;3227:32;3224:52;;;3272:1;3269;3262:12;3224:52;3312:9;3299:23;3345:18;3337:6;3334:30;3331:50;;;3377:1;3374;3367:12;3331:50;3416:70;3478:7;3469:6;3458:9;3454:22;3416:70;:::i;:::-;3505:8;;3390:96;;-1:-1:-1;3109:437:1;-1:-1:-1;;;;3109:437:1:o;4512:184::-;4570:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:52;;;4639:1;4636;4629:12;4591:52;4662:28;4680:9;4662:28;:::i;4701:156::-;4767:20;;4827:4;4816:16;;4806:27;;4796:55;;4847:1;4844;4837:12;4862:322;4933:6;4941;4949;5002:2;4990:9;4981:7;4977:23;4973:32;4970:52;;;5018:1;5015;5008:12;4970:52;5041:27;5058:9;5041:27;:::i;:::-;5031:37;;5087:36;5119:2;5108:9;5104:18;5087:36;:::i;:::-;5077:46;;5142:36;5174:2;5163:9;5159:18;5142:36;:::i;:::-;5132:46;;4862:322;;;;;:::o;5513:456::-;5590:6;5598;5606;5659:2;5647:9;5638:7;5634:23;5630:32;5627:52;;;5675:1;5672;5665:12;5627:52;5714:9;5701:23;5733:31;5758:5;5733:31;:::i;:::-;5783:5;-1:-1:-1;5840:2:1;5825:18;;5812:32;5853:33;5812:32;5853:33;:::i;:::-;5513:456;;5905:7;;-1:-1:-1;;;5959:2:1;5944:18;;;;5931:32;;5513:456::o;5974:241::-;6030:6;6083:2;6071:9;6062:7;6058:23;6054:32;6051:52;;;6099:1;6096;6089:12;6051:52;6138:9;6125:23;6157:28;6179:5;6157:28;:::i;6805:647::-;6879:6;6887;6895;6903;6956:3;6944:9;6935:7;6931:23;6927:33;6924:53;;;6973:1;6970;6963:12;6924:53;7012:9;6999:23;7031:28;7053:5;7031:28;:::i;:::-;7078:5;-1:-1:-1;7135:2:1;7120:18;;7107:32;7148:30;7107:32;7148:30;:::i;:::-;7197:7;-1:-1:-1;7256:2:1;7241:18;;7228:32;7269:30;7228:32;7269:30;:::i;:::-;7318:7;-1:-1:-1;7377:2:1;7362:18;;7349:32;7390:30;7349:32;7390:30;:::i;:::-;6805:647;;;;-1:-1:-1;6805:647:1;;-1:-1:-1;;6805:647:1:o;7457:180::-;7516:6;7569:2;7557:9;7548:7;7544:23;7540:32;7537:52;;;7585:1;7582;7575:12;7537:52;-1:-1:-1;7608:23:1;;7457:180;-1:-1:-1;7457:180:1:o;7642:182::-;7699:6;7752:2;7740:9;7731:7;7727:23;7723:32;7720:52;;;7768:1;7765;7758:12;7720:52;7791:27;7808:9;7791:27;:::i;7829:566::-;7921:6;7929;7937;7990:2;7978:9;7969:7;7965:23;7961:32;7958:52;;;8006:1;8003;7996:12;7958:52;8046:9;8033:23;8079:18;8071:6;8068:30;8065:50;;;8111:1;8108;8101:12;8065:50;8150:70;8212:7;8203:6;8192:9;8188:22;8150:70;:::i;:::-;8239:8;;-1:-1:-1;8124:96:1;-1:-1:-1;;8324:2:1;8309:18;;8296:32;8337:28;8296:32;8337:28;:::i;:::-;8384:5;8374:15;;;7829:566;;;;;:::o;8400:382::-;8465:6;8473;8526:2;8514:9;8505:7;8501:23;8497:32;8494:52;;;8542:1;8539;8532:12;8494:52;8581:9;8568:23;8600:31;8625:5;8600:31;:::i;:::-;8650:5;-1:-1:-1;8707:2:1;8692:18;;8679:32;8720:30;8679:32;8720:30;:::i;:::-;8769:7;8759:17;;;8400:382;;;;;:::o;8787:313::-;8851:6;8859;8912:2;8900:9;8891:7;8887:23;8883:32;8880:52;;;8928:1;8925;8918:12;8880:52;8951:28;8969:9;8951:28;:::i;9105:252::-;9169:6;9177;9230:2;9218:9;9209:7;9205:23;9201:32;9198:52;;;9246:1;9243;9236:12;9198:52;9269:27;9286:9;9269:27;:::i;:::-;9259:37;;9315:36;9347:2;9336:9;9332:18;9315:36;:::i;:::-;9305:46;;9105:252;;;;;:::o;10789:127::-;10850:10;10845:3;10841:20;10838:1;10831:31;10881:4;10878:1;10871:15;10905:4;10902:1;10895:15;10921:719;10964:5;11017:3;11010:4;11002:6;10998:17;10994:27;10984:55;;11035:1;11032;11025:12;10984:55;11071:6;11058:20;11097:18;11134:2;11130;11127:10;11124:36;;;11140:18;;:::i;:::-;11215:2;11209:9;11183:2;11269:13;;-1:-1:-1;;11265:22:1;;;11289:2;11261:31;11257:40;11245:53;;;11313:18;;;11333:22;;;11310:46;11307:72;;;11359:18;;:::i;:::-;11399:10;11395:2;11388:22;11434:2;11426:6;11419:18;11480:3;11473:4;11468:2;11460:6;11456:15;11452:26;11449:35;11446:55;;;11497:1;11494;11487:12;11446:55;11561:2;11554:4;11546:6;11542:17;11535:4;11527:6;11523:17;11510:54;11608:1;11601:4;11596:2;11588:6;11584:15;11580:26;11573:37;11628:6;11619:15;;;;;;10921:719;;;;:::o;11645:543::-;11733:6;11741;11794:2;11782:9;11773:7;11769:23;11765:32;11762:52;;;11810:1;11807;11800:12;11762:52;11850:9;11837:23;11879:18;11920:2;11912:6;11909:14;11906:34;;;11936:1;11933;11926:12;11906:34;11959:50;12001:7;11992:6;11981:9;11977:22;11959:50;:::i;:::-;11949:60;;12062:2;12051:9;12047:18;12034:32;12018:48;;12091:2;12081:8;12078:16;12075:36;;;12107:1;12104;12097:12;12075:36;;12130:52;12174:7;12163:8;12152:9;12148:24;12130:52;:::i;:::-;12120:62;;;11645:543;;;;;:::o;12193:606::-;12292:6;12300;12308;12316;12324;12332;12340;12393:3;12381:9;12372:7;12368:23;12364:33;12361:53;;;12410:1;12407;12400:12;12361:53;12433:27;12450:9;12433:27;:::i;:::-;12423:37;;12479:36;12511:2;12500:9;12496:18;12479:36;:::i;:::-;12469:46;;12534:36;12566:2;12555:9;12551:18;12534:36;:::i;:::-;12524:46;;12589:36;12621:2;12610:9;12606:18;12589:36;:::i;:::-;12579:46;;12644:37;12676:3;12665:9;12661:19;12644:37;:::i;:::-;12634:47;;12700:37;12732:3;12721:9;12717:19;12700:37;:::i;:::-;12690:47;;12756:37;12788:3;12777:9;12773:19;12756:37;:::i;:::-;12746:47;;12193:606;;;;;;;;;;:::o;12804:388::-;12872:6;12880;12933:2;12921:9;12912:7;12908:23;12904:32;12901:52;;;12949:1;12946;12939:12;12901:52;12988:9;12975:23;13007:31;13032:5;13007:31;:::i;:::-;13057:5;-1:-1:-1;13114:2:1;13099:18;;13086:32;13127:33;13086:32;13127:33;:::i;14148:184::-;14218:6;14271:2;14259:9;14250:7;14246:23;14242:32;14239:52;;;14287:1;14284;14277:12;14239:52;-1:-1:-1;14310:16:1;;14148:184;-1:-1:-1;14148:184:1:o;14337:127::-;14398:10;14393:3;14389:20;14386:1;14379:31;14429:4;14426:1;14419:15;14453:4;14450:1;14443:15;14469:422;14558:1;14601:5;14558:1;14615:270;14636:7;14626:8;14623:21;14615:270;;;14695:4;14691:1;14687:6;14683:17;14677:4;14674:27;14671:53;;;14704:18;;:::i;:::-;14754:7;14744:8;14740:22;14737:55;;;14774:16;;;;14737:55;14853:22;;;;14813:15;;;;14615:270;;;14619:3;14469:422;;;;;:::o;14896:806::-;14945:5;14975:8;14965:80;;-1:-1:-1;15016:1:1;15030:5;;14965:80;15064:4;15054:76;;-1:-1:-1;15101:1:1;15115:5;;15054:76;15146:4;15164:1;15159:59;;;;15232:1;15227:130;;;;15139:218;;15159:59;15189:1;15180:10;;15203:5;;;15227:130;15264:3;15254:8;15251:17;15248:43;;;15271:18;;:::i;:::-;-1:-1:-1;;15327:1:1;15313:16;;15342:5;;15139:218;;15441:2;15431:8;15428:16;15422:3;15416:4;15413:13;15409:36;15403:2;15393:8;15390:16;15385:2;15379:4;15376:12;15372:35;15369:77;15366:159;;;-1:-1:-1;15478:19:1;;;15510:5;;15366:159;15557:34;15582:8;15576:4;15557:34;:::i;:::-;15627:6;15623:1;15619:6;15615:19;15606:7;15603:32;15600:58;;;15638:18;;:::i;:::-;15676:20;;14896:806;-1:-1:-1;;;14896:806:1:o;15707:140::-;15765:5;15794:47;15835:4;15825:8;15821:19;15815:4;15794:47;:::i;15852:168::-;15925:9;;;15956;;15973:15;;;15967:22;;15953:37;15943:71;;15994:18;;:::i;16025:217::-;16065:1;16091;16081:132;;16135:10;16130:3;16126:20;16123:1;16116:31;16170:4;16167:1;16160:15;16198:4;16195:1;16188:15;16081:132;-1:-1:-1;16227:9:1;;16025:217::o;16247:128::-;16314:9;;;16335:11;;;16332:37;;;16349:18;;:::i;16380:380::-;16459:1;16455:12;;;;16502;;;16523:61;;16577:4;16569:6;16565:17;16555:27;;16523:61;16630:2;16622:6;16619:14;16599:18;16596:38;16593:161;;16676:10;16671:3;16667:20;16664:1;16657:31;16711:4;16708:1;16701:15;16739:4;16736:1;16729:15;16593:161;;16380:380;;;:::o;16765:127::-;16826:10;16821:3;16817:20;16814:1;16807:31;16857:4;16854:1;16847:15;16881:4;16878:1;16871:15;16897:135;16936:3;16957:17;;;16954:43;;16977:18;;:::i;:::-;-1:-1:-1;17024:1:1;17013:13;;16897:135::o;17625:125::-;17690:9;;;17711:10;;;17708:36;;;17724:18;;:::i;18493:245::-;18560:6;18613:2;18601:9;18592:7;18588:23;18584:32;18581:52;;;18629:1;18626;18619:12;18581:52;18661:9;18655:16;18680:28;18702:5;18680:28;:::i;20120:148::-;20208:4;20187:12;;;20201;;;20183:31;;20226:13;;20223:39;;;20242:18;;:::i;21007:545::-;21109:2;21104:3;21101:11;21098:448;;;21145:1;21170:5;21166:2;21159:17;21215:4;21211:2;21201:19;21285:2;21273:10;21269:19;21266:1;21262:27;21256:4;21252:38;21321:4;21309:10;21306:20;21303:47;;;-1:-1:-1;21344:4:1;21303:47;21399:2;21394:3;21390:12;21387:1;21383:20;21377:4;21373:31;21363:41;;21454:82;21472:2;21465:5;21462:13;21454:82;;;21517:17;;;21498:1;21487:13;21454:82;;21728:1352;21854:3;21848:10;21881:18;21873:6;21870:30;21867:56;;;21903:18;;:::i;:::-;21932:97;22022:6;21982:38;22014:4;22008:11;21982:38;:::i;:::-;21976:4;21932:97;:::i;:::-;22084:4;;22148:2;22137:14;;22165:1;22160:663;;;;22867:1;22884:6;22881:89;;;-1:-1:-1;22936:19:1;;;22930:26;22881:89;-1:-1:-1;;21685:1:1;21681:11;;;21677:24;21673:29;21663:40;21709:1;21705:11;;;21660:57;22983:81;;22130:944;;22160:663;20954:1;20947:14;;;20991:4;20978:18;;-1:-1:-1;;22196:20:1;;;22314:236;22328:7;22325:1;22322:14;22314:236;;;22417:19;;;22411:26;22396:42;;22509:27;;;;22477:1;22465:14;;;;22344:19;;22314:236;;;22318:3;22578:6;22569:7;22566:19;22563:201;;;22639:19;;;22633:26;-1:-1:-1;;22722:1:1;22718:14;;;22734:3;22714:24;22710:37;22706:42;22691:58;22676:74;;22563:201;-1:-1:-1;;;;;22810:1:1;22794:14;;;22790:22;22777:36;;-1:-1:-1;21728:1352:1:o;23085:251::-;23155:6;23208:2;23196:9;23187:7;23183:23;23179:32;23176:52;;;23224:1;23221;23214:12;23176:52;23256:9;23250:16;23275:31;23300:5;23275:31;:::i;23341:151::-;23431:4;23424:12;;;23410;;;23406:31;;23449:14;;23446:40;;;23466:18;;:::i;25433:484::-;25486:3;25524:5;25518:12;25551:6;25546:3;25539:19;25577:4;25606:2;25601:3;25597:12;25590:19;;25643:2;25636:5;25632:14;25664:1;25674:218;25688:6;25685:1;25682:13;25674:218;;;25753:13;;-1:-1:-1;;;;;25749:62:1;25737:75;;25832:12;;;;25867:15;;;;25710:1;25703:9;25674:218;;;-1:-1:-1;25908:3:1;;25433:484;-1:-1:-1;;;;;25433:484:1:o;25922:533::-;26193:6;26182:9;26175:25;26236:3;26231:2;26220:9;26216:18;26209:31;26156:4;26257:57;26309:3;26298:9;26294:19;26286:6;26257:57;:::i;:::-;-1:-1:-1;;;;;26350:55:1;;;;26345:2;26330:18;;26323:83;-1:-1:-1;26437:2:1;26422:18;26415:34;26249:65;25922:533;-1:-1:-1;;25922:533:1:o;27266:127::-;27327:10;27322:3;27318:20;27315:1;27308:31;27358:4;27355:1;27348:15;27382:4;27379:1;27372:15;27398:175;27435:3;27479:4;27472:5;27468:16;27508:4;27499:7;27496:17;27493:43;;27516:18;;:::i;:::-;27565:1;27552:15;;27398:175;-1:-1:-1;;27398:175:1:o;27578:605::-;27877:6;27866:9;27859:25;27920:6;27915:2;27904:9;27900:18;27893:34;27963:3;27958:2;27947:9;27943:18;27936:31;27840:4;27984:57;28036:3;28025:9;28021:19;28013:6;27984:57;:::i;:::-;-1:-1:-1;;;;;28077:55:1;;;;28072:2;28057:18;;28050:83;-1:-1:-1;28164:3:1;28149:19;28142:35;27976:65;27578:605;-1:-1:-1;;;27578:605:1:o;28188:306::-;28276:6;28284;28292;28345:2;28333:9;28324:7;28320:23;28316:32;28313:52;;;28361:1;28358;28351:12;28313:52;28390:9;28384:16;28374:26;;28440:2;28429:9;28425:18;28419:25;28409:35;;28484:2;28473:9;28469:18;28463:25;28453:35;;28188:306;;;;;:::o

Swarm Source

ipfs://1a86457c96ba3c2569629974eb63e1b80637d90a77b01bcaf4ed65abb5740b31
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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