ETH Price: $2,584.99 (-2.23%)

Contract

0x8d0FcB0251081873ee725e184d6e0618107db196
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Approve166608132023-02-19 6:19:11549 days ago1676787551IN
0x8d0FcB02...8107db196
0 ETH0.0005854224.00452852
Approve159899492022-11-17 13:10:11642 days ago1668690611IN
0x8d0FcB02...8107db196
0 ETH0.0006756214.47612001
Remove LP158949662022-11-04 6:49:59656 days ago1667544599IN
0x8d0FcB02...8107db196
0 ETH0.0033356515.69098141
Withdraw Team158224792022-10-25 3:42:23666 days ago1666669343IN
0x8d0FcB02...8107db196
0 ETH0.0006857614.1036787
Withdraw Marketi...158224792022-10-25 3:42:23666 days ago1666669343IN
0x8d0FcB02...8107db196
0 ETH0.0004994614.1036787
Withdraw Events158224792022-10-25 3:42:23666 days ago1666669343IN
0x8d0FcB02...8107db196
0 ETH0.0004331914.1036787
Approve158195932022-10-24 17:59:23666 days ago1666634363IN
0x8d0FcB02...8107db196
0 ETH0.0029718963.67611521
Approve158155742022-10-24 4:27:11667 days ago1666585631IN
0x8d0FcB02...8107db196
0 ETH0.000284411.6616247
Approve158072622022-10-23 0:35:35668 days ago1666485335IN
0x8d0FcB02...8107db196
0 ETH0.0009007219.29906161
Approve158059942022-10-22 20:19:59668 days ago1666469999IN
0x8d0FcB02...8107db196
0 ETH0.000461117.22348737
Approve158059942022-10-22 20:19:59668 days ago1666469999IN
0x8d0FcB02...8107db196
0 ETH0.0008038517.22348737
Approve158031032022-10-22 10:38:59669 days ago1666435139IN
0x8d0FcB02...8107db196
0 ETH0.0007601616.28737167
Approve158020062022-10-22 6:59:23669 days ago1666421963IN
0x8d0FcB02...8107db196
0 ETH0.0006819114.61080601
Approve158019052022-10-22 6:39:11669 days ago1666420751IN
0x8d0FcB02...8107db196
0 ETH0.0008518718.25237993
Approve158018642022-10-22 6:30:59669 days ago1666420259IN
0x8d0FcB02...8107db196
0 ETH0.0007219415.46854749
Approve157985392022-10-21 19:22:11669 days ago1666380131IN
0x8d0FcB02...8107db196
0 ETH0.0021532846.13662311
Approve157980272022-10-21 17:39:35669 days ago1666373975IN
0x8d0FcB02...8107db196
0 ETH0.00508268108.90227753
Approve157973952022-10-21 15:32:35669 days ago1666366355IN
0x8d0FcB02...8107db196
0 ETH0.001466331.41725781
Approve157971692022-10-21 14:46:59669 days ago1666363619IN
0x8d0FcB02...8107db196
0 ETH0.0012869827.5751641
Approve157970242022-10-21 14:17:47669 days ago1666361867IN
0x8d0FcB02...8107db196
0 ETH0.0016293334.91042788
Approve157969872022-10-21 14:10:23669 days ago1666361423IN
0x8d0FcB02...8107db196
0 ETH0.0020144643.16221947
Approve157969802022-10-21 14:08:59669 days ago1666361339IN
0x8d0FcB02...8107db196
0 ETH0.0019703942.21794867
Approve157969622022-10-21 14:05:11669 days ago1666361111IN
0x8d0FcB02...8107db196
0 ETH0.0019891342.61950425
Approve157969022022-10-21 13:52:59669 days ago1666360379IN
0x8d0FcB02...8107db196
0 ETH0.0014428530.91471553
Approve157968282022-10-21 13:37:59669 days ago1666359479IN
0x8d0FcB02...8107db196
0 ETH0.0015386432.96726559
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
158949662022-11-04 6:49:59656 days ago1667544599
0x8d0FcB02...8107db196
0.26956997 ETH
158949662022-11-04 6:49:59656 days ago1667544599
0x8d0FcB02...8107db196
0.26956997 ETH
158224792022-10-25 3:42:23666 days ago1666669343
0x8d0FcB02...8107db196
0.23461155 ETH
158224792022-10-25 3:42:23666 days ago1666669343
0x8d0FcB02...8107db196
0.47313122 ETH
157980282022-10-21 17:39:47669 days ago1666373987
0x8d0FcB02...8107db196
0.00022175 ETH
157980282022-10-21 17:39:47669 days ago1666373987
0x8d0FcB02...8107db196
0.01331221 ETH
157980282022-10-21 17:39:47669 days ago1666373987
0x8d0FcB02...8107db196
0.05324886 ETH
157968402022-10-21 13:40:23669 days ago1666359623
0x8d0FcB02...8107db196
0.00032479 ETH
157968402022-10-21 13:40:23669 days ago1666359623
0x8d0FcB02...8107db196
0.01949803 ETH
157968402022-10-21 13:40:23669 days ago1666359623
0x8d0FcB02...8107db196
0.07799212 ETH
157965952022-10-21 12:50:47669 days ago1666356647
0x8d0FcB02...8107db196
0.00048388 ETH
157965952022-10-21 12:50:47669 days ago1666356647
0x8d0FcB02...8107db196
0.0290487 ETH
157965952022-10-21 12:50:47669 days ago1666356647
0x8d0FcB02...8107db196
0.11619482 ETH
157963932022-10-21 12:10:23669 days ago1666354223
0x8d0FcB02...8107db196
0.00047733 ETH
157963932022-10-21 12:10:23669 days ago1666354223
0x8d0FcB02...8107db196
0.02865544 ETH
157963932022-10-21 12:10:23669 days ago1666354223
0x8d0FcB02...8107db196
0.11462176 ETH
157963462022-10-21 12:00:47669 days ago1666353647
0x8d0FcB02...8107db196
0.00045215 ETH
157963462022-10-21 12:00:47669 days ago1666353647
0x8d0FcB02...8107db196
0.02714395 ETH
157963462022-10-21 12:00:47669 days ago1666353647
0x8d0FcB02...8107db196
0.10857581 ETH
157961922022-10-21 11:29:47669 days ago1666351787
0x8d0FcB02...8107db196
0.00034002 ETH
157961922022-10-21 11:29:47669 days ago1666351787
0x8d0FcB02...8107db196
0.02041235 ETH
157961922022-10-21 11:29:47669 days ago1666351787
0x8d0FcB02...8107db196
0.0816494 ETH
157960562022-10-21 11:02:35670 days ago1666350155
0x8d0FcB02...8107db196
0.00039028 ETH
157960562022-10-21 11:02:35670 days ago1666350155
0x8d0FcB02...8107db196
0.02342933 ETH
157960562022-10-21 11:02:35670 days ago1666350155
0x8d0FcB02...8107db196
0.09371735 ETH
View All Internal Transactions
Loading...
Loading

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

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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

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