ETH Price: $2,973.16 (+2.50%)
Gas: 1 Gwei

Token

Brewlabs (BREWLABS)
 

Overview

Max Total Supply

134,426,746.883258294 BREWLABS

Holders

145 (0.00%)

Total Transfers

-

Market

Price

$0.00 @ 0.000001 ETH (+16.54%)

Onchain Market Cap

$295,529.48

Circulating Supply Market Cap

$0.00

Other Info

Token Contract (WITH 9 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Brewlabs offers individuals the opportunity to bring their cryptocurrency ideas to life through smart contract engineering, auditing, development and launch.

Market

Volume (24H):$12,283.66
Market Capitalization:$0.00
Circulating Supply:0.00 BREWLABS
Market Data Source: Coinmarketcap

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Brewlabs

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

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

    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 IFactory {
    function createPair(address tokenA, address tokenB) external returns (address pair);

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

interface IRouter {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

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

    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;
}

interface IERC20Metadata is IERC20 {
    function name() external view returns (string memory);

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

    function decimals() external view returns (uint8);
}

interface DividendPayingTokenInterface {
    function dividendOf(address _owner) external view returns (uint256);

    function distributeDividends() external payable;

    function withdrawDividend() external;

    event DividendsDistributed(address indexed from, uint256 weiAmount);
    event DividendWithdrawn(address indexed to, uint256 weiAmount);
}

interface DividendPayingTokenOptionalInterface {
    function withdrawableDividendOf(address _owner) external view returns (uint256);

    function withdrawnDividendOf(address _owner) external view returns (uint256);

    function accumulativeDividendOf(address _owner) external view returns (uint256);
}

library SafeMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

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

        return c;
    }

    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

library SafeMathInt {
    int256 private constant MIN_INT256 = int256(1) << 255;
    int256 private constant MAX_INT256 = ~(int256(1) << 255);

    function mul(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a * b;

        // Detect overflow when multiplying MIN_INT256 with -1
        require(c != MIN_INT256 || (a & MIN_INT256) != (b & MIN_INT256));
        require((b == 0) || (c / b == a));
        return c;
    }

    function div(int256 a, int256 b) internal pure returns (int256) {
        // Prevent overflow when dividing MIN_INT256 by -1
        require(b != -1 || a != MIN_INT256);

        // Solidity already throws when dividing by 0.
        return a / b;
    }

    function sub(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a - b;
        require((b >= 0 && c <= a) || (b < 0 && c > a));
        return c;
    }

    function add(int256 a, int256 b) internal pure returns (int256) {
        int256 c = a + b;
        require((b >= 0 && c >= a) || (b < 0 && c < a));
        return c;
    }

    function abs(int256 a) internal pure returns (int256) {
        require(a != MIN_INT256);
        return a < 0 ? -a : a;
    }

    function toUint256Safe(int256 a) internal pure returns (uint256) {
        require(a >= 0);
        return uint256(a);
    }
}

library SafeMathUint {
    function toInt256Safe(uint256 a) internal pure returns (int256) {
        int256 b = int256(a);
        require(b >= 0);
        return b;
    }
}

library Address {
	function isContract(address account) internal view returns (bool) {
		uint256 size;
		assembly {
			size := extcodesize(account)
		}
		return size > 0;
	}

	function sendValue(address payable recipient, uint256 amount) internal {
		require(
			address(this).balance >= amount,
			"Address: insufficient balance"
		);

		(bool success, ) = recipient.call{value: amount}("");
		require(
			success,
			"Address: unable to send value, recipient may have reverted"
		);
	}

	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) {
		require(
			address(this).balance >= value,
			"Address: insufficient balance for call"
		);
		require(isContract(target), "Address: call to non-contract");

		(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) {
		require(isContract(target), "Address: static call to non-contract");

		(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) {
		require(isContract(target), "Address: delegate call to non-contract");

		(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 IterableMapping {
    struct Map {
        address[] keys;
        mapping(address => uint256) values;
        mapping(address => uint256) indexOf;
        mapping(address => bool) inserted;
    }

    function get(Map storage map, address key) public view returns (uint256) {
        return map.values[key];
    }

    function getIndexOfKey(Map storage map, address key) public view returns (int256) {
        if (!map.inserted[key]) {
            return -1;
        }
        return int256(map.indexOf[key]);
    }

    function getKeyAtIndex(Map storage map, uint256 index) public view returns (address) {
        return map.keys[index];
    }

    function size(Map storage map) public view returns (uint256) {
        return map.keys.length;
    }

    function set(
        Map storage map,
        address key,
        uint256 val
    ) public {
        if (map.inserted[key]) {
            map.values[key] = val;
        } else {
            map.inserted[key] = true;
            map.values[key] = val;
            map.indexOf[key] = map.keys.length;
            map.keys.push(key);
        }
    }

    function remove(Map storage map, address key) public {
        if (!map.inserted[key]) {
            return;
        }

        delete map.inserted[key];
        delete map.values[key];

        uint256 index = map.indexOf[key];
        uint256 lastIndex = map.keys.length - 1;
        address lastKey = map.keys[lastIndex];

        map.indexOf[lastKey] = index;
        delete map.indexOf[key];

        map.keys[index] = lastKey;
        map.keys.pop();
    }
}

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

contract Ownable is Context {
    address private _owner;

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

    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

contract ERC20 is Context, IERC20, IERC20Metadata {
    using SafeMath for uint256;

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

    uint256 private _totalSupply;
    string private _name;
    string private _symbol;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

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

    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    function allowance(address owner, address spender)
        public
        view
        virtual
        override
        returns (uint256)
    {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(
            sender,
            _msgSender(),
            _allowances[sender][_msgSender()].sub(
                amount,
                "ERC20: transfer amount exceeds allowance"
            )
        );
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue)
        public
        virtual
        returns (bool)
    {
        _approve(
            _msgSender(),
            spender,
            _allowances[_msgSender()][spender].sub(
                subtractedValue,
                "ERC20: decreased allowance below zero"
            )
        );
        return true;
    }

    function _transfer(
        address sender,
        address recipient,
        uint256 amount
    ) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");
        _beforeTokenTransfer(sender, recipient, amount);
        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
        _beforeTokenTransfer(address(0), account, amount);
        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
        _beforeTokenTransfer(account, address(0), amount);
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

contract DividendPayingToken is
    ERC20,
    Ownable,
    DividendPayingTokenInterface,
    DividendPayingTokenOptionalInterface
{
    using SafeMath for uint256;
    using SafeMathUint for uint256;
    using SafeMathInt for int256;

    uint256 internal constant magnitude = 2**128;
    uint256 internal magnifiedDividendPerShare;
    uint256 public totalDividendsDistributed;
    address public rewardToken;
    IRouter public uniswapV2Router;

    mapping(address => int256) internal magnifiedDividendCorrections;
    mapping(address => uint256) internal withdrawnDividends;

    constructor(string memory _name, string memory _symbol) ERC20(_name, _symbol) {}

    receive() external payable {
        distributeDividends();
    }

    function distributeDividends() public payable override onlyOwner {
        require(totalSupply() > 0);
        if (msg.value > 0) {
            magnifiedDividendPerShare = magnifiedDividendPerShare.add(
                (msg.value).mul(magnitude) / totalSupply()
            );
            emit DividendsDistributed(msg.sender, msg.value);
            totalDividendsDistributed = totalDividendsDistributed.add(msg.value);
        }
    }

    function withdrawDividend() public virtual override onlyOwner {
        _withdrawDividendOfUser(payable(msg.sender));
    }

    function _withdrawDividendOfUser(address payable user) internal returns (uint256) {
        uint256 _withdrawableDividend = withdrawableDividendOf(user);
        if (_withdrawableDividend > 0) {
            withdrawnDividends[user] = withdrawnDividends[user].add(_withdrawableDividend);
            emit DividendWithdrawn(user, _withdrawableDividend);
            return swapETHForTokensAndWithdrawDividend(user, _withdrawableDividend);
        }
        return 0;
    }

    function swapETHForTokensAndWithdrawDividend(address holder, uint256 ethAmount)
        private
        returns (uint256)
    {
        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = address(rewardToken);

        try
            uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{ value: ethAmount }(
                0, // accept any amount of tokens
                path,
                address(holder),
                block.timestamp
            )
        {
            return ethAmount;
        } catch {
            withdrawnDividends[holder] = withdrawnDividends[holder].sub(ethAmount);
            return 0;
        }
    }

    function dividendOf(address _owner) public view override returns (uint256) {
        return withdrawableDividendOf(_owner);
    }

    function withdrawableDividendOf(address _owner) public view override returns (uint256) {
        return accumulativeDividendOf(_owner).sub(withdrawnDividends[_owner]);
    }

    function withdrawnDividendOf(address _owner) public view override returns (uint256) {
        return withdrawnDividends[_owner];
    }

    function accumulativeDividendOf(address _owner) public view override returns (uint256) {
        return
            magnifiedDividendPerShare
                .mul(balanceOf(_owner))
                .toInt256Safe()
                .add(magnifiedDividendCorrections[_owner])
                .toUint256Safe() / magnitude;
    }

    function _transfer(
        address from,
        address to,
        uint256 value
    ) internal virtual override {
        require(false);
        int256 _magCorrection = magnifiedDividendPerShare.mul(value).toInt256Safe();
        magnifiedDividendCorrections[from] = magnifiedDividendCorrections[from].add(_magCorrection);
        magnifiedDividendCorrections[to] = magnifiedDividendCorrections[to].sub(_magCorrection);
    }

    function _mint(address account, uint256 value) internal override {
        super._mint(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account].sub(
            (magnifiedDividendPerShare.mul(value)).toInt256Safe()
        );
    }

    function _burn(address account, uint256 value) internal override {
        super._burn(account, value);
        magnifiedDividendCorrections[account] = magnifiedDividendCorrections[account].add(
            (magnifiedDividendPerShare.mul(value)).toInt256Safe()
        );
    }

    function _setBalance(address account, uint256 newBalance) internal {
        uint256 currentBalance = balanceOf(account);
        if (newBalance > currentBalance) {
            uint256 mintAmount = newBalance.sub(currentBalance);
            _mint(account, mintAmount);
        } else if (newBalance < currentBalance) {
            uint256 burnAmount = currentBalance.sub(newBalance);
            _burn(account, burnAmount);
        }
    }

    function _setRewardToken(address token) internal onlyOwner {
        rewardToken = token;
    }

    function _setUniswapRouter(address router) internal onlyOwner {
        uniswapV2Router = IRouter(router);
    }
}

contract Brewlabs is Ownable, ERC20 {
    using Address for address;

    IRouter public uniswapV2Router;
    address public immutable uniswapV2Pair;

    string private constant _name = "Brewlabs";
    string private constant _symbol = "BREWLABS";
    uint8 private constant _decimals = 9;

    BrewlabsDividendTracker public dividendTracker;

    bool public isTradingEnabled;

    // max wallet is 1.5% of Brewlabs(BEP20)'s initialSupply
    uint256 public maxWalletAmount = (1000000000 * (10**9) * 150) / 10000;

    // max buy and sell tx is 0.2% of Brewlabs(BEP20)'s initialSupply
    uint256 public maxTxAmount = (1000000000 * (10**9) * 20) / 10000;

    bool private _swapping;
    uint256 public minimumTokensBeforeSwap = 250000000 * (10**9);

    address public dividendToken = 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48; //USDC

    address public liquidityWallet;
    address public devWallet;
    address public buyBackWallet;
    address public bridge;
    address public stakingAddress;

    struct CustomTaxPeriod {
        bytes23 periodName;
        uint8 blocksInPeriod;
        uint256 timeInPeriod;
        uint8 liquidityFeeOnBuy;
        uint8 liquidityFeeOnSell;
        uint8 devFeeOnBuy;
        uint8 devFeeOnSell;
        uint8 buyBackFeeOnBuy;
        uint8 buyBackFeeOnSell;
        uint8 stakingFeeOnBuy;
        uint8 stakingFeeOnSell;
        uint8 holdersFeeOnBuy;
        uint8 holdersFeeOnSell;
    }

    // Base taxes
    CustomTaxPeriod private _base = CustomTaxPeriod("base", 0, 0, 1, 1, 1, 1, 8, 8, 1, 1, 4, 4);

    mapping(address => bool) private _isAllowedToTradeWhenDisabled;
    mapping(address => bool) private _feeOnSelectedWalletTransfers;
    mapping(address => bool) private _isExcludedFromFee;
    mapping(address => bool) private _isExcludedFromMaxTransactionLimit;
    mapping(address => bool) private _isExcludedFromMaxWalletLimit;
    mapping(address => bool) public automatedMarketMakerPairs;

    uint8 private _liquidityFee;
    uint8 private _devFee;
    uint8 private _buyBackFee;
    uint8 private _stakingFee;
    uint8 private _holdersFee;
    uint8 private _totalFee;

    event AutomatedMarketMakerPairChange(address indexed pair, bool indexed value);
    event UniswapV2RouterChange(address indexed newAddress, address indexed oldAddress);
    event WalletChange(
        string indexed indentifier,
        address indexed newWallet,
        address indexed oldWallet
    );
    event FeeChange(
        string indexed identifier,
        uint8 liquidityFee,
        uint8 devFee,
        uint8 buyBackFee,
        uint8 stakingFee,
        uint8 holdersFee
    );
    event CustomTaxPeriodChange(
        uint256 indexed newValue,
        uint256 indexed oldValue,
        string indexed taxType,
        bytes23 period
    );
    event MaxTransactionAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event MaxWalletAmountChange(uint256 indexed newValue, uint256 indexed oldValue);
    event ExcludeFromFeesChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxTransferChange(address indexed account, bool isExcluded);
    event ExcludeFromMaxWalletChange(address indexed account, bool isExcluded);
    event ExcludeFromDividendsChange(address indexed account, bool isExcluded);
    event AllowedWhenTradingDisabledChange(address indexed account, bool isExcluded);
    event MinTokenAmountBeforeSwapChange(uint256 indexed newValue, uint256 indexed oldValue);
    event MinTokenAmountForDividendsChange(uint256 indexed newValue, uint256 indexed oldValue);
    event DividendsSent(uint256 tokensSwapped);
    event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity);
    event FeeOnSelectedWalletTransfersChange(address indexed account, bool newValue);
    event ClaimETHOverflow(uint256 amount);
    event FeesApplied(
        uint8 liquidityFee,
        uint8 devFee,
        uint8 buyBackFee,
        uint8 stakingFee,
        uint8 holdersFee,
        uint8 totalFee
    );
    event SetBridgeContract(address indexed bridgeContract);
    event SetStakingAddress(address indexed stakingAddress);

    modifier hasMintPermission() {
        require(msg.sender == bridge, "Only bridge contract can mint");
        _;
    }

    constructor() ERC20(_name, _symbol) {
        dividendTracker = new BrewlabsDividendTracker();
        dividendTracker.setUniswapRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        dividendTracker.setRewardToken(dividendToken);

        liquidityWallet = owner();
        devWallet = owner();
        buyBackWallet = owner();

        IRouter _uniswapV2Router = IRouter(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D);
        address _uniswapV2Pair = IFactory(_uniswapV2Router.factory()).createPair(
            address(this),
            _uniswapV2Router.WETH()
        );
        uniswapV2Router = _uniswapV2Router;
        uniswapV2Pair = _uniswapV2Pair;
        _setAutomatedMarketMakerPair(_uniswapV2Pair, true);

        _isExcludedFromFee[owner()] = true;
        _isExcludedFromFee[address(this)] = true;
        _isExcludedFromFee[address(dividendTracker)] = true;

        dividendTracker.excludeFromDividends(address(dividendTracker));
        dividendTracker.excludeFromDividends(address(this));
        dividendTracker.excludeFromDividends(address(0x000000000000000000000000000000000000dEaD));
        dividendTracker.excludeFromDividends(owner());
        dividendTracker.excludeFromDividends(address(_uniswapV2Router));

        _isAllowedToTradeWhenDisabled[owner()] = true;
        _isAllowedToTradeWhenDisabled[address(this)] = true;

        _isExcludedFromMaxTransactionLimit[address(dividendTracker)] = true;
        _isExcludedFromMaxTransactionLimit[address(this)] = true;

        _isExcludedFromMaxWalletLimit[_uniswapV2Pair] = true;
        _isExcludedFromMaxWalletLimit[address(dividendTracker)] = true;
        _isExcludedFromMaxWalletLimit[address(uniswapV2Router)] = true;
        _isExcludedFromMaxWalletLimit[address(this)] = true;
        _isExcludedFromMaxWalletLimit[owner()] = true;
    }

    receive() external payable {}

    // Setters
    function decimals() public view virtual override returns (uint8) {
        return _decimals;
    }

    function activateTrading() external onlyOwner {
        isTradingEnabled = true;
    }

    function deactivateTrading() external onlyOwner {
        isTradingEnabled = false;
    }

    function _setAutomatedMarketMakerPair(address pair, bool value) private {
        require(
            automatedMarketMakerPairs[pair] != value,
            "Brewlabs: Automated market maker pair is already set to that value"
        );
        automatedMarketMakerPairs[pair] = value;
        if (value) {
            dividendTracker.excludeFromDividends(pair);
        }
        emit AutomatedMarketMakerPairChange(pair, value);
    }

    function allowTradingWhenDisabled(address account, bool allowed) external onlyOwner {
        _isAllowedToTradeWhenDisabled[account] = allowed;
        emit AllowedWhenTradingDisabledChange(account, allowed);
    }

    function setFeeOnSelectedWalletTransfers(address account, bool value) external onlyOwner {
        require(
            _feeOnSelectedWalletTransfers[account] != value,
            "Brewlabs: The selected wallet is already set to the value "
        );
        _feeOnSelectedWalletTransfers[account] = value;
        emit FeeOnSelectedWalletTransfersChange(account, value);
    }

    function excludeFromFees(address account, bool excluded) external onlyOwner {
        require(
            _isExcludedFromFee[account] != excluded,
            "Brewlabs: Account is already the value of 'excluded'"
        );
        _isExcludedFromFee[account] = excluded;
        emit ExcludeFromFeesChange(account, excluded);
    }

    function excludeFromDividends(address account) external onlyOwner {
        dividendTracker.excludeFromDividends(account);
    }

    function excludeFromMaxTransactionLimit(address account, bool excluded) external onlyOwner {
        require(
            _isExcludedFromMaxTransactionLimit[account] != excluded,
            "Brewlabs: Account is already the value of 'excluded'"
        );
        _isExcludedFromMaxTransactionLimit[account] = excluded;
        emit ExcludeFromMaxTransferChange(account, excluded);
    }

    function excludeFromMaxWalletLimit(address account, bool excluded) external onlyOwner {
        require(
            _isExcludedFromMaxWalletLimit[account] != excluded,
            "Brewlabs: Account is already the value of 'excluded'"
        );
        _isExcludedFromMaxWalletLimit[account] = excluded;
        emit ExcludeFromMaxWalletChange(account, excluded);
    }

    function setStakingAddress(
        address newStakingAddress
    ) external onlyOwner {
        require(newStakingAddress != address(0), "Brewlabs: The stakingAddress cannot be 0");
        require(newStakingAddress != stakingAddress, "Brewlabs: The stakingAddress is already the value of newStakingAddress");
        stakingAddress = newStakingAddress;
        emit SetStakingAddress(stakingAddress);
    }

    function setWallets(
        address newLiquidityWallet,
        address newDevWallet,
        address newBuyBackWallet
    ) external onlyOwner {
        if (liquidityWallet != newLiquidityWallet) {
            require(newLiquidityWallet != address(0), "Brewlabs: The liquidityWallet cannot be 0");
            emit WalletChange("liquidityWallet", newLiquidityWallet, liquidityWallet);
            liquidityWallet = newLiquidityWallet;
        }
        if (devWallet != newDevWallet) {
            require(newDevWallet != address(0), "Brewlabs: The devWallet cannot be 0");
            emit WalletChange("devWallet", newDevWallet, devWallet);
            devWallet = newDevWallet;
        }
        if (buyBackWallet != newBuyBackWallet) {
            require(newBuyBackWallet != address(0), "Brewlabs: The buyBackWallet cannot be 0");
            emit WalletChange("buyBackWallet", newBuyBackWallet, buyBackWallet);
            buyBackWallet = newBuyBackWallet;
        }
    }

    // Base fees
    function setBaseFeesOnBuy(
        uint8 _liquidityFeeOnBuy,
        uint8 _devFeeOnBuy,
        uint8 _buyBackFeeOnBuy,
        uint8 _stakingFeeOnBuy,
        uint8 _holdersFeeOnBuy
    ) external onlyOwner {
        _setCustomBuyTaxPeriod(
            _base,
            _liquidityFeeOnBuy,
            _devFeeOnBuy,
            _buyBackFeeOnBuy,
            _stakingFeeOnBuy,
            _holdersFeeOnBuy
        );
        emit FeeChange(
            "baseFees-Buy",
            _liquidityFeeOnBuy,
            _devFeeOnBuy,
            _buyBackFeeOnBuy,
            _stakingFeeOnBuy,
            _holdersFeeOnBuy
        );
    }

    function setBaseFeesOnSell(
        uint8 _liquidityFeeOnSell,
        uint8 _devFeeOnSell,
        uint8 _buyBackFeeOnSell,
        uint8 _stakingFeeOnSell,
        uint8 _holdersFeeOnSell
    ) external onlyOwner {
        _setCustomSellTaxPeriod(
            _base,
            _liquidityFeeOnSell,
            _devFeeOnSell,
            _buyBackFeeOnSell,
            _stakingFeeOnSell,
            _holdersFeeOnSell
        );
        emit FeeChange(
            "baseFees-Sell",
            _liquidityFeeOnSell,
            _devFeeOnSell,
            _buyBackFeeOnSell,
            _stakingFeeOnSell,
            _holdersFeeOnSell
        );
    }

    function setUniswapRouter(address newAddress) external onlyOwner {
        require(
            newAddress != address(uniswapV2Router),
            "Brewlabs: The router already has that address"
        );
        emit UniswapV2RouterChange(newAddress, address(uniswapV2Router));
        uniswapV2Router = IRouter(newAddress);
        dividendTracker.setUniswapRouter(newAddress);
    }

    function setMaxTransactionAmount(uint256 newValue) external onlyOwner {
        require(newValue != maxTxAmount, "Brewlabs: Cannot update maxTxAmount to same value");
        emit MaxTransactionAmountChange(newValue, maxTxAmount);
        maxTxAmount = newValue;
    }

    function setMaxWalletAmount(uint256 newValue) external onlyOwner {
        require(
            newValue != maxWalletAmount,
            "Brewlabs: Cannot update maxWalletAmount to same value"
        );
        emit MaxWalletAmountChange(newValue, maxWalletAmount);
        maxWalletAmount = newValue;
    }

    function setMinimumTokensBeforeSwap(uint256 newValue) external onlyOwner {
        require(
            newValue != minimumTokensBeforeSwap,
            "Brewlabs: Cannot update minimumTokensBeforeSwap to same value"
        );
        emit MinTokenAmountBeforeSwapChange(newValue, minimumTokensBeforeSwap);
        minimumTokensBeforeSwap = newValue;
    }

    function setMinimumTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        dividendTracker.setTokenBalanceForDividends(newValue);
    }

    function claim() external {
        dividendTracker.processAccount(payable(msg.sender), false);
    }

    function claimETHOverflow(uint256 amount) external onlyOwner {
        require(amount < address(this).balance, "Brewlabs: Cannot send more than contract balance");
        (bool success, ) = address(owner()).call{ value: amount }("");
        if (success) {
            emit ClaimETHOverflow(amount);
        }
    }

    function mint(address account, uint256 value) external hasMintPermission returns (bool) {
        _mint(account, value);
        try dividendTracker.setBalance(payable(account), balanceOf(account)) {} catch {}
        return true;
    }

    function burn(uint256 value) external {
        _burn(msg.sender, value);
        try dividendTracker.setBalance(payable(msg.sender), balanceOf(msg.sender)) {} catch {}
    }

    function setBridgeContract(address _bridgeContract) external onlyOwner {
        require(_bridgeContract != address(0x0) && _bridgeContract != bridge, "Brewlabs: Invalid bridge");
        bridge = _bridgeContract;
        emit SetBridgeContract(_bridgeContract);
    }

    // Getters
    function getTotalDividendsDistributed() external view returns (uint256) {
        return dividendTracker.totalDividendsDistributed();
    }

    function withdrawableDividendOf(address account) external view returns (uint256) {
        return dividendTracker.withdrawableDividendOf(account);
    }

    function dividendTokenBalanceOf(address account) external view returns (uint256) {
        return dividendTracker.balanceOf(account);
    }

    function getNumberOfDividendTokenHolders() external view returns (uint256) {
        return dividendTracker.getNumberOfTokenHolders();
    }

    function getBaseBuyFees()
        external
        view
        returns (
            uint8,
            uint8,
            uint8,
            uint8,
            uint8
        )
    {
        return (
            _base.liquidityFeeOnBuy,
            _base.devFeeOnBuy,
            _base.buyBackFeeOnBuy,
            _base.stakingFeeOnBuy,
            _base.holdersFeeOnBuy
        );
    }

    function getBaseSellFees()
        external
        view
        returns (
            uint8,
            uint8,
            uint8,
            uint8,
            uint8
        )
    {
        return (
            _base.liquidityFeeOnSell,
            _base.devFeeOnSell,
            _base.buyBackFeeOnSell,
            _base.stakingFeeOnSell,
            _base.holdersFeeOnSell
        );
    }

    // Main
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");

        if (amount == 0) {
            super._transfer(from, to, 0);
            return;
        }

        if (!_isAllowedToTradeWhenDisabled[from] && !_isAllowedToTradeWhenDisabled[to]) {
            require(isTradingEnabled, "Brewlabs: Trading is currently disabled.");
            if (!_isExcludedFromMaxTransactionLimit[to] && !_isExcludedFromMaxTransactionLimit[from]) {
                require(amount <= maxTxAmount, "Brewlabs: Buy amount exceeds the maxTxBuyAmount.");
            }
            if (!_isExcludedFromMaxWalletLimit[to]) {
                require((balanceOf(to) + amount) <= maxWalletAmount, "Brewlabs: Expected wallet amount exceeds the maxWalletAmount.");
            }
        }

        _adjustTaxes(automatedMarketMakerPairs[from], automatedMarketMakerPairs[to], from, to);
        bool canSwap = balanceOf(address(this)) >= minimumTokensBeforeSwap;

        if (
            isTradingEnabled &&
            canSwap &&
            !_swapping &&
            _totalFee > 0 &&
            automatedMarketMakerPairs[to]
        ) {
            _swapping = true;
            _swapAndLiquify();
            _swapping = false;
        }

        bool takeFee = !_swapping && isTradingEnabled;

        if (_isExcludedFromFee[from] || _isExcludedFromFee[to]) {
            takeFee = false;
        }
        if (takeFee && _totalFee > 0) {
            uint256 fee = (amount * _totalFee) / 100;
            amount = amount - fee;
            super._transfer(from, address(this), fee);
        }
        super._transfer(from, to, amount);

        try dividendTracker.setBalance(payable(from), balanceOf(from)) {} catch {}
        try dividendTracker.setBalance(payable(to), balanceOf(to)) {} catch {}
    }

    function _adjustTaxes(
        bool isBuyFromLp,
        bool isSelltoLp,
        address from,
        address to
    ) private {
        _liquidityFee = 0;
        _devFee = 0;
        _buyBackFee = 0;
        _stakingFee = 0;
        _holdersFee = 0;

        if (isBuyFromLp) {
            _liquidityFee = _base.liquidityFeeOnBuy;
            _devFee = _base.devFeeOnBuy;
            _buyBackFee = _base.buyBackFeeOnBuy;
            _stakingFee = _base.stakingFeeOnBuy;
            _holdersFee = _base.holdersFeeOnBuy;
        }
        if (isSelltoLp) {
            _liquidityFee = _base.liquidityFeeOnSell;
            _devFee = _base.devFeeOnSell;
            _buyBackFee = _base.buyBackFeeOnSell;
            _stakingFee = _base.stakingFeeOnSell;
            _holdersFee = _base.holdersFeeOnSell;
        }
        if (
            !isSelltoLp &&
            !isBuyFromLp &&
            (_feeOnSelectedWalletTransfers[from] || _feeOnSelectedWalletTransfers[to])
        ) {
            _liquidityFee = _base.liquidityFeeOnBuy;
            _devFee = _base.devFeeOnBuy;
            _buyBackFee = _base.buyBackFeeOnBuy;
            _stakingFee = _base.stakingFeeOnBuy;
            _holdersFee = _base.holdersFeeOnBuy;
        }
        _totalFee = _liquidityFee + _devFee + _buyBackFee + _stakingFee + _holdersFee;
        emit FeesApplied(_liquidityFee, _devFee, _buyBackFee, _stakingFee, _holdersFee, _totalFee);
    }

    function _setCustomSellTaxPeriod(
        CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnSell,
        uint8 _devFeeOnSell,
        uint8 _buyBackFeeOnSell,
        uint8 _stakingFeeOnSell,
        uint8 _holdersFeeOnSell
    ) private {
        if (map.liquidityFeeOnSell != _liquidityFeeOnSell) {
            emit CustomTaxPeriodChange(
                _liquidityFeeOnSell,
                map.liquidityFeeOnSell,
                "liquidityFeeOnSell",
                map.periodName
            );
            map.liquidityFeeOnSell = _liquidityFeeOnSell;
        }
        if (map.devFeeOnSell != _devFeeOnSell) {
            emit CustomTaxPeriodChange(
                _devFeeOnSell,
                map.devFeeOnSell,
                "devFeeOnSell",
                map.periodName
            );
            map.devFeeOnSell = _devFeeOnSell;
        }
        if (map.buyBackFeeOnSell != _buyBackFeeOnSell) {
            emit CustomTaxPeriodChange(
                _buyBackFeeOnSell,
                map.buyBackFeeOnSell,
                "buyBackFeeOnSell",
                map.periodName
            );
            map.buyBackFeeOnSell = _buyBackFeeOnSell;
        }
        if (map.stakingFeeOnSell != _stakingFeeOnSell) {
            emit CustomTaxPeriodChange(
                _stakingFeeOnSell,
                map.stakingFeeOnSell,
                "stakingFeeOnSell",
                map.periodName
            );
            map.stakingFeeOnSell = _stakingFeeOnSell;
        }
        if (map.holdersFeeOnSell != _holdersFeeOnSell) {
            emit CustomTaxPeriodChange(
                _holdersFeeOnSell,
                map.holdersFeeOnSell,
                "holdersFeeOnSell",
                map.periodName
            );
            map.holdersFeeOnSell = _holdersFeeOnSell;
        }
    }

    function _setCustomBuyTaxPeriod(
        CustomTaxPeriod storage map,
        uint8 _liquidityFeeOnBuy,
        uint8 _devFeeOnBuy,
        uint8 _buyBackFeeOnBuy,
        uint8 _stakingFeeOnBuy,
        uint8 _holdersFeeOnBuy
    ) private {
        if (map.liquidityFeeOnBuy != _liquidityFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _liquidityFeeOnBuy,
                map.liquidityFeeOnBuy,
                "liquidityFeeOnBuy",
                map.periodName
            );
            map.liquidityFeeOnBuy = _liquidityFeeOnBuy;
        }
        if (map.devFeeOnBuy != _devFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _devFeeOnBuy,
                map.devFeeOnBuy,
                "devFeeOnBuy",
                map.periodName
            );
            map.devFeeOnBuy = _devFeeOnBuy;
        }
        if (map.buyBackFeeOnBuy != _buyBackFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _buyBackFeeOnBuy,
                map.buyBackFeeOnBuy,
                "buyBackFeeOnBuy",
                map.periodName
            );
            map.buyBackFeeOnBuy = _buyBackFeeOnBuy;
        }
        if (map.stakingFeeOnBuy != _stakingFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _stakingFeeOnBuy,
                map.stakingFeeOnBuy,
                "stakingFeeOnBuy",
                map.periodName
            );
            map.stakingFeeOnBuy = _stakingFeeOnBuy;
        }
        if (map.holdersFeeOnBuy != _holdersFeeOnBuy) {
            emit CustomTaxPeriodChange(
                _holdersFeeOnBuy,
                map.holdersFeeOnBuy,
                "holdersFeeOnBuy",
                map.periodName
            );
            map.holdersFeeOnBuy = _holdersFeeOnBuy;
        }
    }

    function _swapAndLiquify() private {
        uint256 contractBalance = balanceOf(address(this));
        uint256 initialETHBalance = address(this).balance;

        uint256 amountToLiquify = (contractBalance * _liquidityFee) / _totalFee / 2;
        uint256 amountForStaking = (contractBalance * _stakingFee) / _totalFee;
        uint256 amountToSwap = contractBalance - (amountToLiquify + amountForStaking);

        _swapTokensForETH(amountToSwap);

        uint256 ETHBalanceAfterSwap = address(this).balance - initialETHBalance;
        uint256 totalETHFee = _totalFee - (_liquidityFee / 2) - _stakingFee;
        uint256 amountETHLiquidity = (ETHBalanceAfterSwap * _liquidityFee) / totalETHFee / 2;
        uint256 amountETHBuyBack = (ETHBalanceAfterSwap * _buyBackFee) / totalETHFee;
        uint256 amountETHDev = (ETHBalanceAfterSwap * _devFee) / totalETHFee;
        uint256 amountETHHolders = ETHBalanceAfterSwap - (amountETHLiquidity + amountETHBuyBack + amountETHDev);

        Address.sendValue(payable(buyBackWallet),amountETHBuyBack);
        Address.sendValue(payable(devWallet),amountETHDev);

        if (amountToLiquify > 0) {
            _addLiquidity(amountToLiquify, amountETHLiquidity);
            emit SwapAndLiquify(amountToSwap, amountETHLiquidity, amountToLiquify);
        }

        bool success = IERC20(address(this)).transfer(address(stakingAddress), amountForStaking);

        (success, ) = address(dividendTracker).call{ value: amountETHHolders }("");
        if (success) {
            emit DividendsSent(amountETHHolders);
        }
    }

    function _swapTokensForETH(uint256 tokenAmount) private {
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = uniswapV2Router.WETH();
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            1, // accept any amount of ETH
            path,
            address(this),
            block.timestamp
        );
    }

    function _addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
        _approve(address(this), address(uniswapV2Router), tokenAmount);
        uniswapV2Router.addLiquidityETH{ value: ethAmount }(
            address(this),
            tokenAmount,
            1, // slippage is unavoidable
            1, // slippage is unavoidable
            liquidityWallet,
            block.timestamp
        );
    }
}

contract BrewlabsDividendTracker is DividendPayingToken {
    using SafeMath for uint256;
    using SafeMathInt for int256;
    using IterableMapping for IterableMapping.Map;

    IterableMapping.Map private tokenHoldersMap;

    mapping(address => bool) public excludedFromDividends;
    mapping(address => uint256) public lastClaimTimes;
    uint256 public claimWait;
    uint256 public minimumTokenBalanceForDividends;

    event ExcludeFromDividends(address indexed account);
    event ClaimWaitUpdated(uint256 indexed newValue, uint256 indexed oldValue);
    event Claim(address indexed account, uint256 amount, bool indexed automatic);

    constructor() DividendPayingToken("Brewlabs_Dividend_Tracker", "Brewlabs_Dividend_Tracker") {
        claimWait = 3600;
        minimumTokenBalanceForDividends = 0 * (10**18);
    }

    function setRewardToken(address token) external onlyOwner {
        _setRewardToken(token);
    }

    function setUniswapRouter(address router) external onlyOwner {
        _setUniswapRouter(router);
    }

    function _transfer(
        address,
        address,
        uint256
    ) internal pure override {
        require(false, "Brewlabs_Dividend_Tracker: No transfers allowed");
    }

    function excludeFromDividends(address account) external onlyOwner {
        require(!excludedFromDividends[account]);
        excludedFromDividends[account] = true;
        _setBalance(account, 0);
        tokenHoldersMap.remove(account);
        emit ExcludeFromDividends(account);
    }

    function setTokenBalanceForDividends(uint256 newValue) external onlyOwner {
        require(
            minimumTokenBalanceForDividends != newValue,
            "Brewlabs_Dividend_Tracker: minimumTokenBalanceForDividends already the value of 'newValue'."
        );
        minimumTokenBalanceForDividends = newValue;
    }

    function getNumberOfTokenHolders() external view returns (uint256) {
        return tokenHoldersMap.keys.length;
    }

    function setBalance(address payable account, uint256 newBalance) external onlyOwner {
        if (excludedFromDividends[account]) {
            return;
        }
        if (newBalance >= minimumTokenBalanceForDividends) {
            _setBalance(account, newBalance);
            tokenHoldersMap.set(account, newBalance);
        } else {
            _setBalance(account, 0);
            tokenHoldersMap.remove(account);
        }
        processAccount(account, true);
    }

    function processAccount(address payable account, bool automatic)
        public
        onlyOwner
        returns (bool)
    {
        uint256 amount = _withdrawDividendOfUser(account);
        if (amount > 0) {
            lastClaimTimes[account] = block.timestamp;
            emit Claim(account, amount, automatic);
            return true;
        }
        return false;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"AllowedWhenTradingDisabledChange","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":true,"internalType":"address","name":"pair","type":"address"},{"indexed":true,"internalType":"bool","name":"value","type":"bool"}],"name":"AutomatedMarketMakerPairChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimETHOverflow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"},{"indexed":true,"internalType":"string","name":"taxType","type":"string"},{"indexed":false,"internalType":"bytes23","name":"period","type":"bytes23"}],"name":"CustomTaxPeriodChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"}],"name":"DividendsSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromDividendsChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFeesChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxTransferChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromMaxWalletChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"identifier","type":"string"},{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"devFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"stakingFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"newValue","type":"bool"}],"name":"FeeOnSelectedWalletTransfersChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"liquidityFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"devFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"buyBackFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"stakingFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"holdersFee","type":"uint8"},{"indexed":false,"internalType":"uint8","name":"totalFee","type":"uint8"}],"name":"FeesApplied","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxTransactionAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MaxWalletAmountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountBeforeSwapChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"newValue","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"oldValue","type":"uint256"}],"name":"MinTokenAmountForDividendsChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"bridgeContract","type":"address"}],"name":"SetBridgeContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"stakingAddress","type":"address"}],"name":"SetStakingAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokensSwapped","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethReceived","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokensIntoLiqudity","type":"uint256"}],"name":"SwapAndLiquify","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":true,"internalType":"address","name":"newAddress","type":"address"},{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"}],"name":"UniswapV2RouterChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"indentifier","type":"string"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"WalletChange","type":"event"},{"inputs":[],"name":"activateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"allowed","type":"bool"}],"name":"allowTradingWhenDisabled","outputs":[],"stateMutability":"nonpayable","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":"","type":"address"}],"name":"automatedMarketMakerPairs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buyBackWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"claimETHOverflow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"deactivateTrading","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"dividendTokenBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dividendTracker","outputs":[{"internalType":"contract BrewlabsDividendTracker","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"excludeFromDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxTransactionLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"excluded","type":"bool"}],"name":"excludeFromMaxWalletLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getBaseBuyFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseSellFees","outputs":[{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"},{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNumberOfDividendTokenHolders","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalDividendsDistributed","outputs":[{"internalType":"uint256","name":"","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":[],"name":"isTradingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"liquidityWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTxAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxWalletAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumTokensBeforeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_devFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_stakingFeeOnBuy","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnBuy","type":"uint8"}],"name":"setBaseFeesOnBuy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_liquidityFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_devFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_buyBackFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_stakingFeeOnSell","type":"uint8"},{"internalType":"uint8","name":"_holdersFeeOnSell","type":"uint8"}],"name":"setBaseFeesOnSell","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bridgeContract","type":"address"}],"name":"setBridgeContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setFeeOnSelectedWalletTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxTransactionAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxWalletAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokenBalanceForDividends","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinimumTokensBeforeSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newStakingAddress","type":"address"}],"name":"setStakingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAddress","type":"address"}],"name":"setUniswapRouter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newLiquidityWallet","type":"address"},{"internalType":"address","name":"newDevWallet","type":"address"},{"internalType":"address","name":"newBuyBackWallet","type":"address"}],"name":"setWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"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":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"withdrawableDividendOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

66354a6ba7a18000600890815566071afd498d00006009556703782dace9d90000600b55600c80546001600160a01b03191673a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48179055610240604052636261736560e01b60a052600060c081905260e081905260016101008190526101208190526101408190526101608190526101808390526101a0929092526101c08290526101e091909152600461020081905261022052601280546001600160c01b031916636261736560981b1790556013556014805469040401010808010101016001600160501b0319909116179055348015620000ed57600080fd5b5060405180604001604052806008815260200167427265776c61627360c01b81525060405180604001604052806008815260200167425245574c41425360c01b8152506000620001426200081a60201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060046200019a838262000a52565b506005620001a9828262000a52565b505050604051620001ba906200099f565b604051809103906000f080158015620001d7573d6000803e3d6000fd5b50600780546001600160a01b0319166001600160a01b03929092169182179055604051635f54c24f60e11b8152737a250d5630b4cf539739df2c5dacb4c659f2488d600482015263bea9849e90602401600060405180830381600087803b1580156200024257600080fd5b505af115801562000257573d6000803e3d6000fd5b5050600754600c54604051638aee812760e01b81526001600160a01b03918216600482015291169250638aee81279150602401600060405180830381600087803b158015620002a557600080fd5b505af1158015620002ba573d6000803e3d6000fd5b50505050620002ce6200081e60201b60201c565b600d80546001600160a01b039283166001600160a01b03199182161790915560008054600e8054841691909416908117909355600f805490921690921790556040805163c45a015560e01b81529051737a250d5630b4cf539739df2c5dacb4c659f2488d9291839163c45a0155916004808201926020929091908290030181865afa15801562000362573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000388919062000b1e565b6001600160a01b031663c9c6539630846001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015620003d6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620003fc919062000b1e565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af11580156200044a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000470919062000b1e565b600680546001600160a01b0319166001600160a01b038581169190911790915581166080529050620004a48160016200082d565b600160176000620004bd6000546001600160a01b031690565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff1996871617905530815260179093528183208054851660019081179091556007805483168552938390208054909516179093559054905163031e79db60e41b8152911660048201819052906331e79db090602401600060405180830381600087803b1580156200055357600080fd5b505af115801562000568573d6000803e3d6000fd5b505060075460405163031e79db60e41b81523060048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b158015620005b257600080fd5b505af1158015620005c7573d6000803e3d6000fd5b505060075460405163031e79db60e41b815261dead60048201526001600160a01b0390911692506331e79db09150602401600060405180830381600087803b1580156200061357600080fd5b505af115801562000628573d6000803e3d6000fd5b50506007546001600160a01b031691506331e79db09050620006526000546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b1580156200069457600080fd5b505af1158015620006a9573d6000803e3d6000fd5b505060075460405163031e79db60e41b81526001600160a01b03868116600483015290911692506331e79db09150602401600060405180830381600087803b158015620006f557600080fd5b505af11580156200070a573d6000803e3d6000fd5b50505050600160156000620007246200081e60201b60201c565b6001600160a01b03908116825260208083019390935260409182016000908120805495151560ff19968716179055308082526015855283822080548716600190811790915560078054851684526018875285842080548916831790558284528584208054891683179055888516845260199687905285842080548916831790555484168352848320805488168217905560065490931682528382208054871684179055815291822080549094168117909355620007e96000546001600160a01b031690565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555062000b509050565b3390565b6000546001600160a01b031690565b6001600160a01b0382166000908152601a602052604090205481151560ff909116151503620008d35760405162461bcd60e51b815260206004820152604260248201527f427265776c6162733a204175746f6d61746564206d61726b6574206d616b657260448201527f207061697220697320616c72656164792073657420746f20746861742076616c606482015261756560f01b608482015260a40160405180910390fd5b6001600160a01b0382166000908152601a60205260409020805460ff19168215801591909117909155620009635760075460405163031e79db60e41b81526001600160a01b038481166004830152909116906331e79db090602401600060405180830381600087803b1580156200094957600080fd5b505af11580156200095e573d6000803e3d6000fd5b505050505b604051811515906001600160a01b038416907fa666b9b2dc2c8f2d86fda7ba3a115be30d3a958fd84d359cbc6bc919df97990a90600090a35050565b611f598062004c7283390190565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620009d857607f821691505b602082108103620009f957634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000a4d57600081815260208120601f850160051c8101602086101562000a285750805b601f850160051c820191505b8181101562000a495782815560010162000a34565b5050505b505050565b81516001600160401b0381111562000a6e5762000a6e620009ad565b62000a868162000a7f8454620009c3565b84620009ff565b602080601f83116001811462000abe576000841562000aa55750858301515b600019600386901b1c1916600185901b17855562000a49565b600085815260208120601f198616915b8281101562000aef5788860151825594840194600190910190840162000ace565b508582101562000b0e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006020828403121562000b3157600080fd5b81516001600160a01b038116811462000b4957600080fd5b9392505050565b60805161410662000b6c600039600061065901526141066000f3fe60806040526004361061036f5760003560e01c8063715018a6116101c6578063b1ba39ea116100f7578063d469801611610095578063e78cea921161006f578063e78cea9214610a56578063f2fde38b14610a76578063f4e0d9ac14610a96578063fe01753514610ab657600080fd5b8063d4698016146109d0578063d7b4be24146109f0578063dd62ed3e14610a1057600080fd5b8063c0246668116100d1578063c024666814610909578063cd43e22814610929578063d2d7ad831461099a578063d3221576146109b057600080fd5b8063b1ba39ea14610899578063b62496f5146108b9578063bea9849e146108e957600080fd5b806395d89b4111610164578063a8b9d2401161013e578063a8b9d24014610823578063a9059cbb14610843578063aa4bde2814610863578063aee50b1e1461087957600080fd5b806395d89b41146107ce5780639fad9683146107e3578063a457c2d71461080357600080fd5b8063880bcbc1116101a0578063880bcbc11461075a5780638c0b5e221461077a5780638da5cb5b146107905780638ea5220f146107ae57600080fd5b8063715018a61461070557806375cb1bd11461071a578063781edb3c1461073a57600080fd5b806330bb4cff116102a057806345a423291161023e5780635ebf4db9116102185780635ebf4db91461069057806364b0f653146106b05780636843cd84146106c557806370a08231146106e557600080fd5b806345a423291461062757806349bd5a5e146106475780634e71d92d1461067b57600080fd5b806334cf1fea1161027a57806334cf1fea146105b257806339509351146105c757806340c10f19146105e757806342966c681461060757600080fd5b806330bb4cff14610561578063313ce5671461057657806331e79db01461059257600080fd5b80631694505e1161030d5780631e293c10116102e75780631e293c10146104e157806323b872dd1461050157806327a14fc2146105215780632c1f52161461054157600080fd5b80631694505e1461048257806318160ddd146104a25780631cd348c0146104c157600080fd5b8063098df58511610349578063098df585146103f35780630b26cf66146104155780630bd05b69146104355780631582358e1461044a57600080fd5b8063064a59d01461037b57806306fdde03146103b1578063095ea7b3146103d357600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5060075461039c90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156103bd57600080fd5b506103c6610afc565b6040516103a89190613a9f565b3480156103df57600080fd5b5061039c6103ee366004613b02565b610b8e565b3480156103ff57600080fd5b5061041361040e366004613b2e565b610ba5565b005b34801561042157600080fd5b50610413610430366004613b47565b610cd4565b34801561044157600080fd5b50610413610dba565b34801561045657600080fd5b50600c5461046a906001600160a01b031681565b6040516001600160a01b0390911681526020016103a8565b34801561048e57600080fd5b5060065461046a906001600160a01b031681565b3480156104ae57600080fd5b506003545b6040519081526020016103a8565b3480156104cd57600080fd5b50600f5461046a906001600160a01b031681565b3480156104ed57600080fd5b506104136104fc366004613b2e565b610df9565b34801561050d57600080fd5b5061039c61051c366004613b64565b610ec1565b34801561052d57600080fd5b5061041361053c366004613b2e565b610f2a565b34801561054d57600080fd5b5060075461046a906001600160a01b031681565b34801561056d57600080fd5b506104b3610ff6565b34801561058257600080fd5b50604051600981526020016103a8565b34801561059e57600080fd5b506104136105ad366004613b47565b611069565b3480156105be57600080fd5b506104136110f6565b3480156105d357600080fd5b5061039c6105e2366004613b02565b61112f565b3480156105f357600080fd5b5061039c610602366004613b02565b611165565b34801561061357600080fd5b50610413610622366004613b2e565b61124c565b34801561063357600080fd5b50610413610642366004613bb3565b6112c9565b34801561065357600080fd5b5061046a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561068757600080fd5b506104136113e9565b34801561069c57600080fd5b506104136106ab366004613b2e565b61145e565b3480156106bc57600080fd5b506104b36114b9565b3480156106d157600080fd5b506104b36106e0366004613b47565b611503565b3480156106f157600080fd5b506104b3610700366004613b47565b611573565b34801561071157600080fd5b5061041361158e565b34801561072657600080fd5b50610413610735366004613bec565b611602565b34801561074657600080fd5b50610413610755366004613bb3565b611903565b34801561076657600080fd5b50610413610775366004613bb3565b6119c5565b34801561078657600080fd5b506104b360095481565b34801561079c57600080fd5b506000546001600160a01b031661046a565b3480156107ba57600080fd5b50600e5461046a906001600160a01b031681565b3480156107da57600080fd5b506103c6611a87565b3480156107ef57600080fd5b506104136107fe366004613c4d565b611a96565b34801561080f57600080fd5b5061039c61081e366004613b02565b611b4d565b34801561082f57600080fd5b506104b361083e366004613b47565b611b9c565b34801561084f57600080fd5b5061039c61085e366004613b02565b611bcf565b34801561086f57600080fd5b506104b360085481565b34801561088557600080fd5b50610413610894366004613b2e565b611bdc565b3480156108a557600080fd5b506104136108b4366004613c4d565b611cb0565b3480156108c557600080fd5b5061039c6108d4366004613b47565b601a6020526000908152604090205460ff1681565b3480156108f557600080fd5b50610413610904366004613b47565b611d07565b34801561091557600080fd5b50610413610924366004613bb3565b611e29565b34801561093557600080fd5b5060145460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016103a8565b3480156109a657600080fd5b506104b3600b5481565b3480156109bc57600080fd5b506104136109cb366004613bb3565b611eeb565b3480156109dc57600080fd5b50600d5461046a906001600160a01b031681565b3480156109fc57600080fd5b5060115461046a906001600160a01b031681565b348015610a1c57600080fd5b506104b3610a2b366004613cb2565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a6257600080fd5b5060105461046a906001600160a01b031681565b348015610a8257600080fd5b50610413610a91366004613b47565b611f6d565b348015610aa257600080fd5b50610413610ab1366004613b47565b612057565b348015610ac257600080fd5b5060145460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b90910416610966565b606060048054610b0b90613ce0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790613ce0565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b5050505050905090565b6000610b9b3384846121c5565b5060015b92915050565b6000546001600160a01b03163314610bd85760405162461bcd60e51b8152600401610bcf90613d1a565b60405180910390fd5b478110610c405760405162461bcd60e51b815260206004820152603060248201527f427265776c6162733a2043616e6e6f742073656e64206d6f7265207468616e2060448201526f636f6e74726163742062616c616e636560801b6064820152608401610bcf565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610c8d576040519150601f19603f3d011682016040523d82523d6000602084013e610c92565b606091505b505090508015610cd0576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6000546001600160a01b03163314610cfe5760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03811615801590610d2457506010546001600160a01b03828116911614155b610d705760405162461bcd60e51b815260206004820152601860248201527f427265776c6162733a20496e76616c69642062726964676500000000000000006044820152606401610bcf565b601080546001600160a01b0319166001600160a01b0383169081179091556040517f449973c418c4a6a21741606c661bbe051913a2a2fb91a2ce79021a334475cfe590600090a250565b6000546001600160a01b03163314610de45760405162461bcd60e51b8152600401610bcf90613d1a565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610e235760405162461bcd60e51b8152600401610bcf90613d1a565b6009548103610e8e5760405162461bcd60e51b815260206004820152603160248201527f427265776c6162733a2043616e6e6f7420757064617465206d61785478416d6f604482015270756e7420746f2073616d652076616c756560781b6064820152608401610bcf565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610ece8484846122ea565b610f208433610f1b85604051806060016040528060288152602001614064602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906127ea565b6121c5565b5060019392505050565b6000546001600160a01b03163314610f545760405162461bcd60e51b8152600401610bcf90613d1a565b6008548103610fc35760405162461bcd60e51b815260206004820152603560248201527f427265776c6162733a2043616e6e6f7420757064617465206d617857616c6c6560448201527474416d6f756e7420746f2073616d652076616c756560581b6064820152608401610bcf565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611040573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110649190613d4f565b905090565b6000546001600160a01b031633146110935760405162461bcd60e51b8152600401610bcf90613d1a565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156110db57600080fd5b505af11580156110ef573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146111205760405162461bcd60e51b8152600401610bcf90613d1a565b6007805460ff60a01b19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b9b918590610f1b9086612824565b6010546000906001600160a01b031633146111c25760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792062726964676520636f6e74726163742063616e206d696e740000006044820152606401610bcf565b6111cc838361288a565b6007546001600160a01b031663e30443bc846111e781611573565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561122d57600080fd5b505af192505050801561123e575060015b15610b9b5750600192915050565b6112563382612970565b6007546001600160a01b031663e30443bc3361127181611573565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156112b757600080fd5b505af1925050508015610cd057505b50565b6000546001600160a01b031633146112f35760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036113895760405162461bcd60e51b815260206004820152603a60248201527f427265776c6162733a205468652073656c65637465642077616c6c657420697360448201527f20616c72656164792073657420746f207468652076616c7565200000000000006064820152608401610bcf565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561143a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c69190613d68565b6000546001600160a01b031633146114885760405162461bcd60e51b8152600401610bcf90613d1a565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef906024016110c1565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611040573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561154f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d4f565b6001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633146115b85760405162461bcd60e51b8152600401610bcf90613d1a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461162c5760405162461bcd60e51b8152600401610bcf90613d1a565b600d546001600160a01b03848116911614611722576001600160a01b0383166116a95760405162461bcd60e51b815260206004820152602960248201527f427265776c6162733a20546865206c697175696469747957616c6c657420636160448201526806e6e6f7420626520360bc1b6064820152608401610bcf565b600d546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691851690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0319166001600160a01b0385161790555b600e546001600160a01b0383811691161461180c576001600160a01b0382166117995760405162461bcd60e51b815260206004820152602360248201527f427265776c6162733a205468652064657657616c6c65742063616e6e6f74206260448201526206520360ec1b6064820152608401610bcf565b600e546040516819195d95d85b1b195d60ba1b81526001600160a01b0391821691841690600901604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600e80546001600160a01b0319166001600160a01b0384161790555b600f546001600160a01b038281169116146118fe576001600160a01b0381166118875760405162461bcd60e51b815260206004820152602760248201527f427265776c6162733a20546865206275794261636b57616c6c65742063616e6e60448201526606f7420626520360cc1b6064820152608401610bcf565b600f546040516c189d5e509858dad5d85b1b195d609a1b81526001600160a01b0391821691831690600d01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600f80546001600160a01b0319166001600160a01b0383161790555b505050565b6000546001600160a01b0316331461192d5760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03821660009081526019602052604090205481151560ff90911615150361196d5760405162461bcd60e51b8152600401610bcf90613d85565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91016113dd565b6000546001600160a01b031633146119ef5760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03821660009081526018602052604090205481151560ff909116151503611a2f5760405162461bcd60e51b8152600401610bcf90613d85565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a4091016113dd565b606060058054610b0b90613ce0565b6000546001600160a01b03163314611ac05760405162461bcd60e51b8152600401610bcf90613d1a565b611acf60128686868686612a74565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b6000610b9b3384610f1b856040518060600160405280602581526020016140ac602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906127ea565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611532565b6000610b9b3384846122ea565b6000546001600160a01b03163314611c065760405162461bcd60e51b8152600401610bcf90613d1a565b600b548103611c7d5760405162461bcd60e51b815260206004820152603d60248201527f427265776c6162733a2043616e6e6f7420757064617465206d696e696d756d5460448201527f6f6b656e734265666f72655377617020746f2073616d652076616c75650000006064820152608401610bcf565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b03163314611cda5760405162461bcd60e51b8152600401610bcf90613d1a565b611ce960128686868686612d56565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d01611ae8565b6000546001600160a01b03163314611d315760405162461bcd60e51b8152600401610bcf90613d1a565b6006546001600160a01b0390811690821603611da55760405162461bcd60e51b815260206004820152602d60248201527f427265776c6162733a2054686520726f7574657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610bcf565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e906024016110c1565b6000546001600160a01b03163314611e535760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03821660009081526017602052604090205481151560ff909116151503611e935760405162461bcd60e51b8152600401610bcf90613d85565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b91016113dd565b6000546001600160a01b03163314611f155760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d35091016113dd565b6000546001600160a01b03163314611f975760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b038116611ffc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcf565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120815760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b0381166120e85760405162461bcd60e51b815260206004820152602860248201527f427265776c6162733a20546865207374616b696e67416464726573732063616e60448201526706e6f7420626520360c41b6064820152608401610bcf565b6011546001600160a01b039081169082160361217b5760405162461bcd60e51b815260206004820152604660248201527f427265776c6162733a20546865207374616b696e67416464726573732069732060448201527f616c7265616479207468652076616c7565206f66206e65775374616b696e674160648201526564647265737360d01b608482015260a401610bcf565b601180546001600160a01b0319166001600160a01b0383169081179091556040517fd6912e103d1553f15e77ffc98e99da32c9ce0d21d8be27cbb38437b1afe3092890600090a250565b6001600160a01b0383166122275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcf565b6001600160a01b0382166122885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcf565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166123105760405162461bcd60e51b8152600401610bcf90613dd9565b6001600160a01b0382166123365760405162461bcd60e51b8152600401610bcf90613e1e565b8060000361234a576118fe83836000613054565b6001600160a01b03831660009081526015602052604090205460ff1615801561238c57506001600160a01b03821660009081526015602052604090205460ff16155b1561255857600754600160a01b900460ff166123fb5760405162461bcd60e51b815260206004820152602860248201527f427265776c6162733a2054726164696e672069732063757272656e746c79206460448201526734b9b0b13632b21760c11b6064820152608401610bcf565b6001600160a01b03821660009081526018602052604090205460ff1615801561243d57506001600160a01b03831660009081526018602052604090205460ff16155b156124ad576009548111156124ad5760405162461bcd60e51b815260206004820152603060248201527f427265776c6162733a2042757920616d6f756e7420657863656564732074686560448201526f1036b0bc2a3c213abca0b6b7bab73a1760811b6064820152608401610bcf565b6001600160a01b03821660009081526019602052604090205460ff1661255857600854816124da84611573565b6124e49190613e77565b11156125585760405162461bcd60e51b815260206004820152603d60248201527f427265776c6162733a2045787065637465642077616c6c657420616d6f756e7460448201527f206578636565647320746865206d617857616c6c6574416d6f756e742e0000006064820152608401610bcf565b6001600160a01b038084166000908152601a602052604080822054928516825290205461258d9160ff90811691168585613160565b6000600b5461259b30611573565b6007549111159150600160a01b900460ff1680156125b65750805b80156125c55750600a5460ff16155b80156125dc5750601b54600160281b900460ff1615155b801561260057506001600160a01b0383166000908152601a602052604090205460ff165b1561262557600a805460ff1916600117905561261a613421565b600a805460ff191690555b600a5460009060ff161580156126445750600754600160a01b900460ff165b6001600160a01b03861660009081526017602052604090205490915060ff168061268657506001600160a01b03841660009081526017602052604090205460ff165b1561268f575060005b8080156126a75750601b54600160281b900460ff1615155b156126ee57601b546000906064906126c990600160281b900460ff1686613e8a565b6126d39190613eb7565b90506126df8185613ecb565b93506126ec863083613054565b505b6126f9858585613054565b6007546001600160a01b031663e30443bc8661271481611573565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561275a57600080fd5b505af192505050801561276b575060015b506007546001600160a01b031663e30443bc8561278781611573565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127cd57600080fd5b505af19250505080156127de575060015b156110ef575050505050565b6000818484111561280e5760405162461bcd60e51b8152600401610bcf9190613a9f565b50600061281b8486613ecb565b95945050505050565b6000806128318385613e77565b9050838110156128835760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcf565b9392505050565b6001600160a01b0382166128e05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcf565b6003546128ed9082612824565b6003556001600160a01b0382166000908152600160205260409020546129139082612824565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906129649085815260200190565b60405180910390a35050565b6001600160a01b0382166129d05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcf565b612a0d8160405180606001604052806022815260200161401c602291396001600160a01b03851660009081526001602052604090205491906127ea565b6001600160a01b038316600090815260016020526040902055600354612a339082613745565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612964565b600286015460ff868116911614612af557604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff918216929189169160008051602061408c83398151915291612adb9160481b90613ede565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff858116620100009092041614612b83576040516a6465764665654f6e42757960a81b8152600b0160405190819003812060028801548854919260ff620100009092048216929188169160008051602061408c83398151915291612b629160481b90613ede565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff848116600160201b9092041614612c1a576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160201b9092048216929187169160008051602061408c83398151915291612bf69160481b90613ede565b60405180910390a460028601805464ff000000001916600160201b60ff8616021790555b600286015460ff838116600160301b9092041614612cb3576040516e7374616b696e674665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160301b9092048216929186169160008051602061408c83398151915291612c8d9160481b90613ede565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b9092041614612d4e576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b9092048216929185169160008051602061408c83398151915291612d269160481b90613ede565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600286015460ff8681166101009092041614612de757604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff6101009092048216929189169160008051602061408c83398151915291612dc89160481b90613ede565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff85811663010000009092041614612e7a576040516b19195d91995953db94d95b1b60a21b8152600c0160405190819003812060028801548854919260ff63010000009092048216929188169160008051602061408c83398151915291612e579160481b90613ede565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614612f13576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b9092048216929187169160008051602061408c83398151915291612eee9160481b90613ede565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b9092041614612fae576040516f1cdd185ada5b99d1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160381b9092048216929186169160008051602061408c83398151915291612f879160481b90613ede565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b9092041614612d4e576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b9092048216929185169160008051602061408c833981519152916130229160481b90613ede565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b03831661307a5760405162461bcd60e51b8152600401610bcf90613dd9565b6001600160a01b0382166130a05760405162461bcd60e51b8152600401610bcf90613e1e565b6130dd8160405180606001604052806026815260200161403e602691396001600160a01b03861660009081526001602052604090205491906127ea565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461310c9082612824565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122dd9085815260200190565b601b805464ffffffffff1916905583156131e857601454601b805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b821561326357601454601b805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b8215801561326f575083155b80156132b557506001600160a01b03821660009081526016602052604090205460ff16806132b557506001600160a01b03811660009081526016602052604090205460ff165b1561332e57601454601b805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b601b5460ff600160201b82048116916301000000810482169162010000820481169161336291610100820481169116613ef5565b61336c9190613ef5565b6133769190613ef5565b6133809190613ef5565b601b805460ff928316600160281b90810265ff0000000000198316811793849055604080519186169386169390931781526101008404851660208201526201000084048516818401526301000000840485166060820152600160201b840485166080820152920490921660a082015290517f6c6977cb51242ec6e05aba0e2a29a5292ed1a8a5cffa3b87ff66395b7997d6d29181900360c00190a150505050565b600061342c30611573565b601b54909150479060009060029060ff600160281b8204811691613451911686613e8a565b61345b9190613eb7565b6134659190613eb7565b601b5490915060009060ff600160281b820481169161348d9163010000009091041686613e8a565b6134979190613eb7565b905060006134a58284613e77565b6134af9086613ecb565b90506134ba81613787565b60006134c68547613ecb565b601b5490915060009060ff630100000082048116916134e89160029116613f0e565b601b546134ff9190600160281b900460ff16613f30565b6135099190613f30565b601b5460ff91821692506000916002918491613526911686613e8a565b6135309190613eb7565b61353a9190613eb7565b601b5490915060009083906135589062010000900460ff1686613e8a565b6135629190613eb7565b601b54909150600090849061357f90610100900460ff1687613e8a565b6135899190613eb7565b90506000816135988486613e77565b6135a29190613e77565b6135ac9087613ecb565b600f549091506135c5906001600160a01b0316846138d9565b600e546135db906001600160a01b0316836138d9565b881561362d576135eb89856139f2565b60408051888152602081018690529081018a90527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60115460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101899052600090309063a9059cbb906044016020604051808303816000875af1158015613681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a59190613d68565b6007546040519192506001600160a01b0316908390600081818185875af1925050503d80600081146136f3576040519150601f19603f3d011682016040523d82523d6000602084013e6136f8565b606091505b50909150508015613737576040518281527fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9699060200160405180910390a15b505050505050505050505050565b600061288383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127ea565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106137bc576137bc613f49565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138399190613f5f565b8160018151811061384c5761384c613f49565b6001600160a01b03928316602091820292909201015260065461387291309116846121c5565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906138ab908590600190869030904290600401613f7c565b600060405180830381600087803b1580156138c557600080fd5b505af1158015612d4e573d6000803e3d6000fd5b804710156139295760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bcf565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613976576040519150601f19603f3d011682016040523d82523d6000602084013e61397b565b606091505b50509050806118fe5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bcf565b600654613a0a9030906001600160a01b0316846121c5565b600654600d5460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613a7a573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110ef9190613fed565b600060208083528351808285015260005b81811015613acc57858101830151858201604001528201613ab0565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146112c657600080fd5b60008060408385031215613b1557600080fd5b8235613b2081613aed565b946020939093013593505050565b600060208284031215613b4057600080fd5b5035919050565b600060208284031215613b5957600080fd5b813561288381613aed565b600080600060608486031215613b7957600080fd5b8335613b8481613aed565b92506020840135613b9481613aed565b929592945050506040919091013590565b80151581146112c657600080fd5b60008060408385031215613bc657600080fd5b8235613bd181613aed565b91506020830135613be181613ba5565b809150509250929050565b600080600060608486031215613c0157600080fd5b8335613c0c81613aed565b92506020840135613c1c81613aed565b91506040840135613c2c81613aed565b809150509250925092565b803560ff81168114613c4857600080fd5b919050565b600080600080600060a08688031215613c6557600080fd5b613c6e86613c37565b9450613c7c60208701613c37565b9350613c8a60408701613c37565b9250613c9860608701613c37565b9150613ca660808701613c37565b90509295509295909350565b60008060408385031215613cc557600080fd5b8235613cd081613aed565b91506020830135613be181613aed565b600181811c90821680613cf457607f821691505b602082108103613d1457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613d6157600080fd5b5051919050565b600060208284031215613d7a57600080fd5b815161288381613ba5565b60208082526034908201527f427265776c6162733a204163636f756e7420697320616c7265616479207468656040820152732076616c7565206f6620276578636c756465642760601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b9f57610b9f613e61565b8082028115828204841417610b9f57610b9f613e61565b634e487b7160e01b600052601260045260246000fd5b600082613ec657613ec6613ea1565b500490565b81810381811115610b9f57610b9f613e61565b68ffffffffffffffffff1991909116815260200190565b60ff8181168382160190811115610b9f57610b9f613e61565b600060ff831680613f2157613f21613ea1565b8060ff84160491505092915050565b60ff8281168282160390811115610b9f57610b9f613e61565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613f7157600080fd5b815161288381613aed565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613fcc5784516001600160a01b031683529383019391830191600101613fa7565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561400257600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122002c0e5d5dcef6b1e2b66decf9153d9a1dbea61b6237fcf4b5dca82dbeb864d9864736f6c6343000811003360806040523480156200001157600080fd5b5060408051808201825260198082527f427265776c6162735f4469766964656e645f547261636b6572000000000000006020808401829052845180860190955291845290830152908181600362000069838262000197565b50600462000078828262000197565b50505060006200008d620000ee60201b60201c565b600580546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35050610e1060125550600060135562000263565b3390565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200011d57607f821691505b6020821081036200013e57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200019257600081815260208120601f850160051c810160208610156200016d5750805b601f850160051c820191505b818110156200018e5782815560010162000179565b5050505b505050565b81516001600160401b03811115620001b357620001b3620000f2565b620001cb81620001c4845462000108565b8462000144565b602080601f831160018114620002035760008415620001ea5750858301515b600019600386901b1c1916600185901b1785556200018e565b600085815260208120601f198616915b82811015620002345788860151825594840194600190910190840162000213565b5085821015620002535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b611ce680620002736000396000f3fe6080604052600436106101fd5760003560e01c8063715018a61161010d578063a9059cbb116100a0578063bea9849e1161006f578063bea9849e146105c4578063dd62ed3e146105e4578063e30443bc1461062a578063f2fde38b1461064a578063f7c618c11461066a57600080fd5b8063a9059cbb14610538578063aafd847a14610558578063bc4c4b371461058e578063be10b614146105ae57600080fd5b806391b89fba116100dc57806391b89fba146104c357806395d89b41146104e3578063a457c2d7146104f8578063a8b9d2401461051857600080fd5b8063715018a61461045a57806385a6b3ae1461046f5780638aee8127146104855780638da5cb5b146104a557600080fd5b806323b872dd11610190578063395093511161015f57806339509351146103a95780634e7b827f146103c95780636a474002146103f95780636f2789ec1461040e57806370a082311461042457600080fd5b806323b872dd1461032d57806327ce01471461034d578063313ce5671461036d57806331e79db01461038957600080fd5b8063163c7cef116101cc578063163c7cef146102935780631694505e146102b357806318160ddd146102eb578063226cfa3d1461030057600080fd5b806303c833021461021157806306fdde0314610219578063095ea7b31461024457806309bbedde1461027457600080fd5b3661020c5761020a61068a565b005b600080fd5b61020a61068a565b34801561022557600080fd5b5061022e610750565b60405161023b9190611906565b60405180910390f35b34801561025057600080fd5b5061026461025f366004611969565b6107e2565b604051901515815260200161023b565b34801561028057600080fd5b50600c545b60405190815260200161023b565b34801561029f57600080fd5b5061020a6102ae366004611995565b6107f9565b3480156102bf57600080fd5b506009546102d3906001600160a01b031681565b6040516001600160a01b03909116815260200161023b565b3480156102f757600080fd5b50600254610285565b34801561030c57600080fd5b5061028561031b3660046119ae565b60116020526000908152604090205481565b34801561033957600080fd5b506102646103483660046119cb565b6108c5565b34801561035957600080fd5b506102856103683660046119ae565b61092e565b34801561037957600080fd5b506040516012815260200161023b565b34801561039557600080fd5b5061020a6103a43660046119ae565b61098a565b3480156103b557600080fd5b506102646103c4366004611969565b610ab1565b3480156103d557600080fd5b506102646103e43660046119ae565b60106020526000908152604090205460ff1681565b34801561040557600080fd5b5061020a610ae7565b34801561041a57600080fd5b5061028560125481565b34801561043057600080fd5b5061028561043f3660046119ae565b6001600160a01b031660009081526020819052604090205490565b34801561046657600080fd5b5061020a610b1d565b34801561047b57600080fd5b5061028560075481565b34801561049157600080fd5b5061020a6104a03660046119ae565b610b91565b3480156104b157600080fd5b506005546001600160a01b03166102d3565b3480156104cf57600080fd5b506102856104de3660046119ae565b610bc4565b3480156104ef57600080fd5b5061022e610bcf565b34801561050457600080fd5b50610264610513366004611969565b610bde565b34801561052457600080fd5b506102856105333660046119ae565b610c2d565b34801561054457600080fd5b50610264610553366004611969565b610c59565b34801561056457600080fd5b506102856105733660046119ae565b6001600160a01b03166000908152600b602052604090205490565b34801561059a57600080fd5b506102646105a9366004611a0c565b610c66565b3480156105ba57600080fd5b5061028560135481565b3480156105d057600080fd5b5061020a6105df3660046119ae565b610d14565b3480156105f057600080fd5b506102856105ff366004611a4a565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b34801561063657600080fd5b5061020a610645366004611969565b610d47565b34801561065657600080fd5b5061020a6106653660046119ae565b610eb1565b34801561067657600080fd5b506008546102d3906001600160a01b031681565b6005546001600160a01b031633146106bd5760405162461bcd60e51b81526004016106b490611a78565b60405180910390fd5b60006106c860025490565b116106d257600080fd5b341561074e576107056106e460025490565b6106f234600160801b610f9c565b6106fc9190611ac3565b60065490611025565b60065560405134815233907fa493a9229478c3fcd73f66d2cdeb7f94fd0f341da924d1054236d784541165119060200160405180910390a260075461074a9034611025565b6007555b565b60606003805461075f90611ae5565b80601f016020809104026020016040519081016040528092919081815260200182805461078b90611ae5565b80156107d85780601f106107ad576101008083540402835291602001916107d8565b820191906000526020600020905b8154815290600101906020018083116107bb57829003601f168201915b5050505050905090565b60006107ef338484611084565b5060015b92915050565b6005546001600160a01b031633146108235760405162461bcd60e51b81526004016106b490611a78565b80601354036108c05760405162461bcd60e51b815260206004820152605b60248201527f427265776c6162735f4469766964656e645f547261636b65723a206d696e696d60448201527f756d546f6b656e42616c616e6365466f724469766964656e647320616c72656160648201527f6479207468652076616c7565206f6620276e657756616c7565272e0000000000608482015260a4016106b4565b601355565b60006108d28484846111a8565b610924843361091f85604051806060016040528060288152602001611c64602891396001600160a01b038a1660009081526001602090815260408083203384529091529020549190611208565b611084565b5060019392505050565b6001600160a01b0381166000908152600a602090815260408083205491839052822054600654600160801b926109809261097b92610975916109709190610f9c565b611242565b90611252565b611290565b6107f39190611ac3565b6005546001600160a01b031633146109b45760405162461bcd60e51b81526004016106b490611a78565b6001600160a01b03811660009081526010602052604090205460ff16156109da57600080fd5b6001600160a01b0381166000908152601060205260408120805460ff19166001179055610a089082906112a3565b60405163131836e760e21b8152600c60048201526001600160a01b0382166024820152733e4d3617dc6ef067fc82ad3dab35504140ab717e90634c60db9c9060440160006040518083038186803b158015610a6257600080fd5b505af4158015610a76573d6000803e3d6000fd5b50506040516001600160a01b03841692507fa878b31040b2e6d0a9a3d3361209db3908ba62014b0dca52adbaee451d128b259150600090a250565b3360008181526001602090815260408083206001600160a01b038716845290915281205490916107ef91859061091f9086611025565b6005546001600160a01b03163314610b115760405162461bcd60e51b81526004016106b490611a78565b610b1a33611308565b50565b6005546001600160a01b03163314610b475760405162461bcd60e51b81526004016106b490611a78565b6005546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600580546001600160a01b0319169055565b6005546001600160a01b03163314610bbb5760405162461bcd60e51b81526004016106b490611a78565b610b1a816113a9565b60006107f382610c2d565b60606004805461075f90611ae5565b60006107ef338461091f85604051806060016040528060258152602001611c8c602591393360009081526001602090815260408083206001600160a01b038d1684529091529020549190611208565b6001600160a01b0381166000908152600b60205260408120546107f390610c538461092e565b906113f5565b60006107ef3384846111a8565b6005546000906001600160a01b03163314610c935760405162461bcd60e51b81526004016106b490611a78565b6000610c9e84611308565b90508015610d0a576001600160a01b038416600081815260116020526040908190204290555184151591907fa2c38e2d2fb7e3e1912d937fd1ca11ed6d51864dee4cfa7a7bf02becd7acf09290610cf89085815260200190565b60405180910390a360019150506107f3565b5060009392505050565b6005546001600160a01b03163314610d3e5760405162461bcd60e51b81526004016106b490611a78565b610b1a81611437565b6005546001600160a01b03163314610d715760405162461bcd60e51b81526004016106b490611a78565b6001600160a01b03821660009081526010602052604090205460ff16610ead576013548110610e2257610da482826112a3565b604051632f0ad01760e21b8152600c60048201526001600160a01b038316602482015260448101829052733e4d3617dc6ef067fc82ad3dab35504140ab717e9063bc2b405c9060640160006040518083038186803b158015610e0557600080fd5b505af4158015610e19573d6000803e3d6000fd5b50505050610ea0565b610e2d8260006112a3565b60405163131836e760e21b8152600c60048201526001600160a01b0383166024820152733e4d3617dc6ef067fc82ad3dab35504140ab717e90634c60db9c9060440160006040518083038186803b158015610e8757600080fd5b505af4158015610e9b573d6000803e3d6000fd5b505050505b610eab826001610c66565b505b5050565b6005546001600160a01b03163314610edb5760405162461bcd60e51b81526004016106b490611a78565b6001600160a01b038116610f405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106b4565b6005546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600580546001600160a01b0319166001600160a01b0392909216919091179055565b600082600003610fae575060006107f3565b6000610fba8385611b1f565b905082610fc78583611ac3565b1461101e5760405162461bcd60e51b815260206004820152602160248201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6044820152607760f81b60648201526084016106b4565b9392505050565b6000806110328385611b36565b90508381101561101e5760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f77000000000060448201526064016106b4565b6001600160a01b0383166110e65760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016106b4565b6001600160a01b0382166111475760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016106b4565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60405162461bcd60e51b815260206004820152602f60248201527f427265776c6162735f4469766964656e645f547261636b65723a204e6f20747260448201526e185b9cd9995c9cc8185b1b1bddd959608a1b60648201526084016106b4565b6000818484111561122c5760405162461bcd60e51b81526004016106b49190611906565b5060006112398486611b49565b95945050505050565b600081818112156107f357600080fd5b60008061125f8385611b5c565b9050600083121580156112725750838112155b80611287575060008312801561128757508381125b61101e57600080fd5b60008082121561129f57600080fd5b5090565b6001600160a01b038216600090815260208190526040902054808211156112e25760006112d083836113f5565b90506112dc8482611483565b50610eab565b80821015610eab5760006112f682846113f5565b905061130284826114e7565b50505050565b60008061131483610c2d565b905080156113a0576001600160a01b0383166000908152600b602052604090205461133f9082611025565b6001600160a01b0384166000818152600b6020526040908190209290925590517fee503bee2bb6a87e57bc57db795f98137327401a0e7b7ce42e37926cc1a9ca4d9061138e9084815260200190565b60405180910390a261101e838261152b565b50600092915050565b6005546001600160a01b031633146113d35760405162461bcd60e51b81526004016106b490611a78565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b600061101e83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611208565b6005546001600160a01b031633146114615760405162461bcd60e51b81526004016106b490611a78565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b61148d82826116ce565b6114c76114a861097083600654610f9c90919063ffffffff16565b6001600160a01b0384166000908152600a6020526040902054906117b9565b6001600160a01b039092166000908152600a602052604090209190915550565b6114f182826117f6565b6114c761150c61097083600654610f9c90919063ffffffff16565b6001600160a01b0384166000908152600a602052604090205490611252565b604080516002808252606082018352600092839291906020830190803683375050600954604080516315ab88c960e31b815290519394506001600160a01b039091169263ad5c4648925060048083019260209291908290030181865afa158015611599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115bd9190611b84565b816000815181106115d0576115d0611ba1565b6001600160a01b03928316602091820292909201015260085482519116908290600190811061160157611601611ba1565b6001600160a01b03928316602091820292909201015260095460405163b6f9de9560e01b815291169063b6f9de959085906116479060009086908a904290600401611bb7565b6000604051808303818588803b15801561166057600080fd5b505af193505050508015611672575060015b6116be576001600160a01b0384166000908152600b602052604090205461169990846113f5565b6001600160a01b0385166000908152600b602052604081209190915591506107f39050565b829150506107f3565b5092915050565b6001600160a01b0382166117245760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016106b4565b61173060008383610eab565b60025461173d9082611025565b6002556001600160a01b0382166000908152602081905260409020546117639082611025565b6001600160a01b038316600081815260208181526040808320949094559251848152919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000806117c68385611c21565b9050600083121580156117d95750838113155b806112875750600083128015611287575083811361101e57600080fd5b6001600160a01b0382166118565760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016106b4565b61186282600083610eab565b61189f81604051806060016040528060228152602001611c42602291396001600160a01b0385166000908152602081905260409020549190611208565b6001600160a01b0383166000908152602081905260409020556002546118c590826113f5565b6002556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016117ad565b600060208083528351808285015260005b8181101561193357858101830151858201604001528201611917565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610b1a57600080fd5b6000806040838503121561197c57600080fd5b823561198781611954565b946020939093013593505050565b6000602082840312156119a757600080fd5b5035919050565b6000602082840312156119c057600080fd5b813561101e81611954565b6000806000606084860312156119e057600080fd5b83356119eb81611954565b925060208401356119fb81611954565b929592945050506040919091013590565b60008060408385031215611a1f57600080fd5b8235611a2a81611954565b915060208301358015158114611a3f57600080fd5b809150509250929050565b60008060408385031215611a5d57600080fd5b8235611a6881611954565b91506020830135611a3f81611954565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082611ae057634e487b7160e01b600052601260045260246000fd5b500490565b600181811c90821680611af957607f821691505b602082108103611b1957634e487b7160e01b600052602260045260246000fd5b50919050565b80820281158282048414176107f3576107f3611aad565b808201808211156107f3576107f3611aad565b818103818111156107f3576107f3611aad565b8082018281126000831280158216821582161715611b7c57611b7c611aad565b505092915050565b600060208284031215611b9657600080fd5b815161101e81611954565b634e487b7160e01b600052603260045260246000fd5b600060808201868352602060808185015281875180845260a086019150828901935060005b81811015611c015784516001600160a01b031683529383019391830191600101611bdc565b50506001600160a01b039690961660408501525050506060015292915050565b81810360008312801583831316838312821617156116c7576116c7611aad56fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220794ace93881b91e45ae3974c7478eb0e89875a605b20422aeb718d2199860ead64736f6c63430008110033

Deployed Bytecode

0x60806040526004361061036f5760003560e01c8063715018a6116101c6578063b1ba39ea116100f7578063d469801611610095578063e78cea921161006f578063e78cea9214610a56578063f2fde38b14610a76578063f4e0d9ac14610a96578063fe01753514610ab657600080fd5b8063d4698016146109d0578063d7b4be24146109f0578063dd62ed3e14610a1057600080fd5b8063c0246668116100d1578063c024666814610909578063cd43e22814610929578063d2d7ad831461099a578063d3221576146109b057600080fd5b8063b1ba39ea14610899578063b62496f5146108b9578063bea9849e146108e957600080fd5b806395d89b4111610164578063a8b9d2401161013e578063a8b9d24014610823578063a9059cbb14610843578063aa4bde2814610863578063aee50b1e1461087957600080fd5b806395d89b41146107ce5780639fad9683146107e3578063a457c2d71461080357600080fd5b8063880bcbc1116101a0578063880bcbc11461075a5780638c0b5e221461077a5780638da5cb5b146107905780638ea5220f146107ae57600080fd5b8063715018a61461070557806375cb1bd11461071a578063781edb3c1461073a57600080fd5b806330bb4cff116102a057806345a423291161023e5780635ebf4db9116102185780635ebf4db91461069057806364b0f653146106b05780636843cd84146106c557806370a08231146106e557600080fd5b806345a423291461062757806349bd5a5e146106475780634e71d92d1461067b57600080fd5b806334cf1fea1161027a57806334cf1fea146105b257806339509351146105c757806340c10f19146105e757806342966c681461060757600080fd5b806330bb4cff14610561578063313ce5671461057657806331e79db01461059257600080fd5b80631694505e1161030d5780631e293c10116102e75780631e293c10146104e157806323b872dd1461050157806327a14fc2146105215780632c1f52161461054157600080fd5b80631694505e1461048257806318160ddd146104a25780631cd348c0146104c157600080fd5b8063098df58511610349578063098df585146103f35780630b26cf66146104155780630bd05b69146104355780631582358e1461044a57600080fd5b8063064a59d01461037b57806306fdde03146103b1578063095ea7b3146103d357600080fd5b3661037657005b600080fd5b34801561038757600080fd5b5060075461039c90600160a01b900460ff1681565b60405190151581526020015b60405180910390f35b3480156103bd57600080fd5b506103c6610afc565b6040516103a89190613a9f565b3480156103df57600080fd5b5061039c6103ee366004613b02565b610b8e565b3480156103ff57600080fd5b5061041361040e366004613b2e565b610ba5565b005b34801561042157600080fd5b50610413610430366004613b47565b610cd4565b34801561044157600080fd5b50610413610dba565b34801561045657600080fd5b50600c5461046a906001600160a01b031681565b6040516001600160a01b0390911681526020016103a8565b34801561048e57600080fd5b5060065461046a906001600160a01b031681565b3480156104ae57600080fd5b506003545b6040519081526020016103a8565b3480156104cd57600080fd5b50600f5461046a906001600160a01b031681565b3480156104ed57600080fd5b506104136104fc366004613b2e565b610df9565b34801561050d57600080fd5b5061039c61051c366004613b64565b610ec1565b34801561052d57600080fd5b5061041361053c366004613b2e565b610f2a565b34801561054d57600080fd5b5060075461046a906001600160a01b031681565b34801561056d57600080fd5b506104b3610ff6565b34801561058257600080fd5b50604051600981526020016103a8565b34801561059e57600080fd5b506104136105ad366004613b47565b611069565b3480156105be57600080fd5b506104136110f6565b3480156105d357600080fd5b5061039c6105e2366004613b02565b61112f565b3480156105f357600080fd5b5061039c610602366004613b02565b611165565b34801561061357600080fd5b50610413610622366004613b2e565b61124c565b34801561063357600080fd5b50610413610642366004613bb3565b6112c9565b34801561065357600080fd5b5061046a7f000000000000000000000000d8a8442013f071bb118c3c3e03f6d07576d85a5381565b34801561068757600080fd5b506104136113e9565b34801561069c57600080fd5b506104136106ab366004613b2e565b61145e565b3480156106bc57600080fd5b506104b36114b9565b3480156106d157600080fd5b506104b36106e0366004613b47565b611503565b3480156106f157600080fd5b506104b3610700366004613b47565b611573565b34801561071157600080fd5b5061041361158e565b34801561072657600080fd5b50610413610735366004613bec565b611602565b34801561074657600080fd5b50610413610755366004613bb3565b611903565b34801561076657600080fd5b50610413610775366004613bb3565b6119c5565b34801561078657600080fd5b506104b360095481565b34801561079c57600080fd5b506000546001600160a01b031661046a565b3480156107ba57600080fd5b50600e5461046a906001600160a01b031681565b3480156107da57600080fd5b506103c6611a87565b3480156107ef57600080fd5b506104136107fe366004613c4d565b611a96565b34801561080f57600080fd5b5061039c61081e366004613b02565b611b4d565b34801561082f57600080fd5b506104b361083e366004613b47565b611b9c565b34801561084f57600080fd5b5061039c61085e366004613b02565b611bcf565b34801561086f57600080fd5b506104b360085481565b34801561088557600080fd5b50610413610894366004613b2e565b611bdc565b3480156108a557600080fd5b506104136108b4366004613c4d565b611cb0565b3480156108c557600080fd5b5061039c6108d4366004613b47565b601a6020526000908152604090205460ff1681565b3480156108f557600080fd5b50610413610904366004613b47565b611d07565b34801561091557600080fd5b50610413610924366004613bb3565b611e29565b34801561093557600080fd5b5060145460ff80821691620100008104821691600160201b8204811691600160301b8104821691600160401b909104165b6040805160ff968716815294861660208601529285169284019290925283166060830152909116608082015260a0016103a8565b3480156109a657600080fd5b506104b3600b5481565b3480156109bc57600080fd5b506104136109cb366004613bb3565b611eeb565b3480156109dc57600080fd5b50600d5461046a906001600160a01b031681565b3480156109fc57600080fd5b5060115461046a906001600160a01b031681565b348015610a1c57600080fd5b506104b3610a2b366004613cb2565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b348015610a6257600080fd5b5060105461046a906001600160a01b031681565b348015610a8257600080fd5b50610413610a91366004613b47565b611f6d565b348015610aa257600080fd5b50610413610ab1366004613b47565b612057565b348015610ac257600080fd5b5060145460ff610100820481169163010000008104821691600160281b8204811691600160381b8104821691600160481b90910416610966565b606060048054610b0b90613ce0565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3790613ce0565b8015610b845780601f10610b5957610100808354040283529160200191610b84565b820191906000526020600020905b815481529060010190602001808311610b6757829003601f168201915b5050505050905090565b6000610b9b3384846121c5565b5060015b92915050565b6000546001600160a01b03163314610bd85760405162461bcd60e51b8152600401610bcf90613d1a565b60405180910390fd5b478110610c405760405162461bcd60e51b815260206004820152603060248201527f427265776c6162733a2043616e6e6f742073656e64206d6f7265207468616e2060448201526f636f6e74726163742062616c616e636560801b6064820152608401610bcf565b600080546040516001600160a01b039091169083908381818185875af1925050503d8060008114610c8d576040519150601f19603f3d011682016040523d82523d6000602084013e610c92565b606091505b505090508015610cd0576040518281527f362ae087cf4ccfc970d45b9e8ce6520f03b4eda3f9d76a70b655dc22badcca489060200160405180910390a15b5050565b6000546001600160a01b03163314610cfe5760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03811615801590610d2457506010546001600160a01b03828116911614155b610d705760405162461bcd60e51b815260206004820152601860248201527f427265776c6162733a20496e76616c69642062726964676500000000000000006044820152606401610bcf565b601080546001600160a01b0319166001600160a01b0383169081179091556040517f449973c418c4a6a21741606c661bbe051913a2a2fb91a2ce79021a334475cfe590600090a250565b6000546001600160a01b03163314610de45760405162461bcd60e51b8152600401610bcf90613d1a565b6007805460ff60a01b1916600160a01b179055565b6000546001600160a01b03163314610e235760405162461bcd60e51b8152600401610bcf90613d1a565b6009548103610e8e5760405162461bcd60e51b815260206004820152603160248201527f427265776c6162733a2043616e6e6f7420757064617465206d61785478416d6f604482015270756e7420746f2073616d652076616c756560781b6064820152608401610bcf565b60095460405182907f75f1c17bf623f0f7a2bd91ba61e89dff216960370e3e9a46b250750d03e4215e90600090a3600955565b6000610ece8484846122ea565b610f208433610f1b85604051806060016040528060288152602001614064602891396001600160a01b038a16600090815260026020908152604080832033845290915290205491906127ea565b6121c5565b5060019392505050565b6000546001600160a01b03163314610f545760405162461bcd60e51b8152600401610bcf90613d1a565b6008548103610fc35760405162461bcd60e51b815260206004820152603560248201527f427265776c6162733a2043616e6e6f7420757064617465206d617857616c6c6560448201527474416d6f756e7420746f2073616d652076616c756560581b6064820152608401610bcf565b60085460405182907f6d3e257c59a11116c3e97bb144abf5ba1a6a9da6bd509192ecf0d48f7be1fc7690600090a3600855565b600754604080516342d359d760e11b815290516000926001600160a01b0316916385a6b3ae9160048083019260209291908290030181865afa158015611040573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110649190613d4f565b905090565b6000546001600160a01b031633146110935760405162461bcd60e51b8152600401610bcf90613d1a565b60075460405163031e79db60e41b81526001600160a01b038381166004830152909116906331e79db0906024015b600060405180830381600087803b1580156110db57600080fd5b505af11580156110ef573d6000803e3d6000fd5b5050505050565b6000546001600160a01b031633146111205760405162461bcd60e51b8152600401610bcf90613d1a565b6007805460ff60a01b19169055565b3360008181526002602090815260408083206001600160a01b03871684529091528120549091610b9b918590610f1b9086612824565b6010546000906001600160a01b031633146111c25760405162461bcd60e51b815260206004820152601d60248201527f4f6e6c792062726964676520636f6e74726163742063616e206d696e740000006044820152606401610bcf565b6111cc838361288a565b6007546001600160a01b031663e30443bc846111e781611573565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561122d57600080fd5b505af192505050801561123e575060015b15610b9b5750600192915050565b6112563382612970565b6007546001600160a01b031663e30443bc3361127181611573565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156112b757600080fd5b505af1925050508015610cd057505b50565b6000546001600160a01b031633146112f35760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03821660009081526016602052604090205481151560ff9091161515036113895760405162461bcd60e51b815260206004820152603a60248201527f427265776c6162733a205468652073656c65637465642077616c6c657420697360448201527f20616c72656164792073657420746f207468652076616c7565200000000000006064820152608401610bcf565b6001600160a01b038216600081815260166020908152604091829020805460ff191685151590811790915591519182527fe70512a569cf898db2e20aa3b4cc3f0dd13377b82a493840d326ab5a1966687791015b60405180910390a25050565b60075460405163bc4c4b3760e01b8152336004820152600060248201526001600160a01b039091169063bc4c4b37906044016020604051808303816000875af115801561143a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112c69190613d68565b6000546001600160a01b031633146114885760405162461bcd60e51b8152600401610bcf90613d1a565b60075460405163163c7cef60e01b8152600481018390526001600160a01b039091169063163c7cef906024016110c1565b600754604080516304ddf6ef60e11b815290516000926001600160a01b0316916309bbedde9160048083019260209291908290030181865afa158015611040573d6000803e3d6000fd5b6007546040516370a0823160e01b81526001600160a01b03838116600483015260009216906370a08231906024015b602060405180830381865afa15801561154f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b9f9190613d4f565b6001600160a01b031660009081526001602052604090205490565b6000546001600160a01b031633146115b85760405162461bcd60e51b8152600401610bcf90613d1a565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b0316331461162c5760405162461bcd60e51b8152600401610bcf90613d1a565b600d546001600160a01b03848116911614611722576001600160a01b0383166116a95760405162461bcd60e51b815260206004820152602960248201527f427265776c6162733a20546865206c697175696469747957616c6c657420636160448201526806e6e6f7420626520360bc1b6064820152608401610bcf565b600d546040516e1b1a5c5d5a591a5d1e55d85b1b195d608a1b81526001600160a01b0391821691851690600f01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600d80546001600160a01b0319166001600160a01b0385161790555b600e546001600160a01b0383811691161461180c576001600160a01b0382166117995760405162461bcd60e51b815260206004820152602360248201527f427265776c6162733a205468652064657657616c6c65742063616e6e6f74206260448201526206520360ec1b6064820152608401610bcf565b600e546040516819195d95d85b1b195d60ba1b81526001600160a01b0391821691841690600901604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600e80546001600160a01b0319166001600160a01b0384161790555b600f546001600160a01b038281169116146118fe576001600160a01b0381166118875760405162461bcd60e51b815260206004820152602760248201527f427265776c6162733a20546865206275794261636b57616c6c65742063616e6e60448201526606f7420626520360cc1b6064820152608401610bcf565b600f546040516c189d5e509858dad5d85b1b195d609a1b81526001600160a01b0391821691831690600d01604051908190038120907f4af24be54adc5e716fbcaa3fca0ad593e28dff90dffd49487c0a33b1547c6b5290600090a4600f80546001600160a01b0319166001600160a01b0383161790555b505050565b6000546001600160a01b0316331461192d5760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03821660009081526019602052604090205481151560ff90911615150361196d5760405162461bcd60e51b8152600401610bcf90613d85565b6001600160a01b038216600081815260196020908152604091829020805460ff191685151590811790915591519182527ff5133f371b17bf21ce0df4ae2c1b6e11ca7c2f27257eb55282edb1ccfd4ecb2e91016113dd565b6000546001600160a01b031633146119ef5760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03821660009081526018602052604090205481151560ff909116151503611a2f5760405162461bcd60e51b8152600401610bcf90613d85565b6001600160a01b038216600081815260186020908152604091829020805460ff191685151590811790915591519182527f30098fc83ab61b1a98835d32c4e611adedccfc260eeef586bd329d48e8a40a4091016113dd565b606060058054610b0b90613ce0565b6000546001600160a01b03163314611ac05760405162461bcd60e51b8152600401610bcf90613d1a565b611acf60128686868686612a74565b6040516b62617365466565732d42757960a01b8152600c015b6040805191829003822060ff8881168452878116602085015286811684840152858116606085015284166080840152905190917f9a3619059270a48acdf850268d8f96db29f0cfe103bc17b5b4040a05af4d4f67919081900360a00190a25050505050565b6000610b9b3384610f1b856040518060600160405280602581526020016140ac602591393360009081526002602090815260408083206001600160a01b038d16845290915290205491906127ea565b6007546040516302a2e74960e61b81526001600160a01b038381166004830152600092169063a8b9d24090602401611532565b6000610b9b3384846122ea565b6000546001600160a01b03163314611c065760405162461bcd60e51b8152600401610bcf90613d1a565b600b548103611c7d5760405162461bcd60e51b815260206004820152603d60248201527f427265776c6162733a2043616e6e6f7420757064617465206d696e696d756d5460448201527f6f6b656e734265666f72655377617020746f2073616d652076616c75650000006064820152608401610bcf565b600b5460405182907f5b0491f767c1463bea8972339f785795be1a38784cc6483cf649cdcbb28c46b090600090a3600b55565b6000546001600160a01b03163314611cda5760405162461bcd60e51b8152600401610bcf90613d1a565b611ce960128686868686612d56565b6040516c18985cd95199595ccb54d95b1b609a1b8152600d01611ae8565b6000546001600160a01b03163314611d315760405162461bcd60e51b8152600401610bcf90613d1a565b6006546001600160a01b0390811690821603611da55760405162461bcd60e51b815260206004820152602d60248201527f427265776c6162733a2054686520726f7574657220616c72656164792068617360448201526c2074686174206164647265737360981b6064820152608401610bcf565b6006546040516001600160a01b03918216918316907f2afbff3ed601a8723765c7072d8ea8445e08f6f1874afd34a2b747a272c3ebad90600090a3600680546001600160a01b0319166001600160a01b03838116918217909255600754604051635f54c24f60e11b815260048101929092529091169063bea9849e906024016110c1565b6000546001600160a01b03163314611e535760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b03821660009081526017602052604090205481151560ff909116151503611e935760405162461bcd60e51b8152600401610bcf90613d85565b6001600160a01b038216600081815260176020908152604091829020805460ff191685151590811790915591519182527fa856ba9fdc54a5434b2359874c95612f520a2d7f858864ae98d15c1b2099ca8b91016113dd565b6000546001600160a01b03163314611f155760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b038216600081815260156020908152604091829020805460ff191685151590811790915591519182527fcb9f97b7b4b41413e5c8d418a8cf9a88db1cf34dee66b213d070faf881d9d35091016113dd565b6000546001600160a01b03163314611f975760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b038116611ffc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610bcf565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146120815760405162461bcd60e51b8152600401610bcf90613d1a565b6001600160a01b0381166120e85760405162461bcd60e51b815260206004820152602860248201527f427265776c6162733a20546865207374616b696e67416464726573732063616e60448201526706e6f7420626520360c41b6064820152608401610bcf565b6011546001600160a01b039081169082160361217b5760405162461bcd60e51b815260206004820152604660248201527f427265776c6162733a20546865207374616b696e67416464726573732069732060448201527f616c7265616479207468652076616c7565206f66206e65775374616b696e674160648201526564647265737360d01b608482015260a401610bcf565b601180546001600160a01b0319166001600160a01b0383169081179091556040517fd6912e103d1553f15e77ffc98e99da32c9ce0d21d8be27cbb38437b1afe3092890600090a250565b6001600160a01b0383166122275760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610bcf565b6001600160a01b0382166122885760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610bcf565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0383166123105760405162461bcd60e51b8152600401610bcf90613dd9565b6001600160a01b0382166123365760405162461bcd60e51b8152600401610bcf90613e1e565b8060000361234a576118fe83836000613054565b6001600160a01b03831660009081526015602052604090205460ff1615801561238c57506001600160a01b03821660009081526015602052604090205460ff16155b1561255857600754600160a01b900460ff166123fb5760405162461bcd60e51b815260206004820152602860248201527f427265776c6162733a2054726164696e672069732063757272656e746c79206460448201526734b9b0b13632b21760c11b6064820152608401610bcf565b6001600160a01b03821660009081526018602052604090205460ff1615801561243d57506001600160a01b03831660009081526018602052604090205460ff16155b156124ad576009548111156124ad5760405162461bcd60e51b815260206004820152603060248201527f427265776c6162733a2042757920616d6f756e7420657863656564732074686560448201526f1036b0bc2a3c213abca0b6b7bab73a1760811b6064820152608401610bcf565b6001600160a01b03821660009081526019602052604090205460ff1661255857600854816124da84611573565b6124e49190613e77565b11156125585760405162461bcd60e51b815260206004820152603d60248201527f427265776c6162733a2045787065637465642077616c6c657420616d6f756e7460448201527f206578636565647320746865206d617857616c6c6574416d6f756e742e0000006064820152608401610bcf565b6001600160a01b038084166000908152601a602052604080822054928516825290205461258d9160ff90811691168585613160565b6000600b5461259b30611573565b6007549111159150600160a01b900460ff1680156125b65750805b80156125c55750600a5460ff16155b80156125dc5750601b54600160281b900460ff1615155b801561260057506001600160a01b0383166000908152601a602052604090205460ff165b1561262557600a805460ff1916600117905561261a613421565b600a805460ff191690555b600a5460009060ff161580156126445750600754600160a01b900460ff165b6001600160a01b03861660009081526017602052604090205490915060ff168061268657506001600160a01b03841660009081526017602052604090205460ff165b1561268f575060005b8080156126a75750601b54600160281b900460ff1615155b156126ee57601b546000906064906126c990600160281b900460ff1686613e8a565b6126d39190613eb7565b90506126df8185613ecb565b93506126ec863083613054565b505b6126f9858585613054565b6007546001600160a01b031663e30443bc8661271481611573565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b15801561275a57600080fd5b505af192505050801561276b575060015b506007546001600160a01b031663e30443bc8561278781611573565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b1580156127cd57600080fd5b505af19250505080156127de575060015b156110ef575050505050565b6000818484111561280e5760405162461bcd60e51b8152600401610bcf9190613a9f565b50600061281b8486613ecb565b95945050505050565b6000806128318385613e77565b9050838110156128835760405162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401610bcf565b9392505050565b6001600160a01b0382166128e05760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610bcf565b6003546128ed9082612824565b6003556001600160a01b0382166000908152600160205260409020546129139082612824565b6001600160a01b0383166000818152600160205260408082209390935591519091907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906129649085815260200190565b60405180910390a35050565b6001600160a01b0382166129d05760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610bcf565b612a0d8160405180606001604052806022815260200161401c602291396001600160a01b03851660009081526001602052604090205491906127ea565b6001600160a01b038316600090815260016020526040902055600354612a339082613745565b6003556040518181526000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001612964565b600286015460ff868116911614612af557604051706c69717569646974794665654f6e42757960781b815260110160405190819003812060028801548854919260ff918216929189169160008051602061408c83398151915291612adb9160481b90613ede565b60405180910390a460028601805460ff191660ff87161790555b600286015460ff858116620100009092041614612b83576040516a6465764665654f6e42757960a81b8152600b0160405190819003812060028801548854919260ff620100009092048216929188169160008051602061408c83398151915291612b629160481b90613ede565b60405180910390a460028601805462ff000019166201000060ff8716021790555b600286015460ff848116600160201b9092041614612c1a576040516e6275794261636b4665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160201b9092048216929187169160008051602061408c83398151915291612bf69160481b90613ede565b60405180910390a460028601805464ff000000001916600160201b60ff8616021790555b600286015460ff838116600160301b9092041614612cb3576040516e7374616b696e674665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160301b9092048216929186169160008051602061408c83398151915291612c8d9160481b90613ede565b60405180910390a460028601805466ff0000000000001916600160301b60ff8516021790555b600286015460ff828116600160401b9092041614612d4e576040516e686f6c646572734665654f6e42757960881b8152600f0160405190819003812060028801548854919260ff600160401b9092048216929185169160008051602061408c83398151915291612d269160481b90613ede565b60405180910390a460028601805468ff00000000000000001916600160401b60ff8416021790555b505050505050565b600286015460ff8681166101009092041614612de757604051711b1a5c5d5a591a5d1e51995953db94d95b1b60721b815260120160405190819003812060028801548854919260ff6101009092048216929189169160008051602061408c83398151915291612dc89160481b90613ede565b60405180910390a460028601805461ff00191661010060ff8816021790555b600286015460ff85811663010000009092041614612e7a576040516b19195d91995953db94d95b1b60a21b8152600c0160405190819003812060028801548854919260ff63010000009092048216929188169160008051602061408c83398151915291612e579160481b90613ede565b60405180910390a460028601805463ff0000001916630100000060ff8716021790555b600286015460ff848116600160281b9092041614612f13576040516f189d5e509858dad1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160281b9092048216929187169160008051602061408c83398151915291612eee9160481b90613ede565b60405180910390a460028601805465ff00000000001916600160281b60ff8616021790555b600286015460ff838116600160381b9092041614612fae576040516f1cdd185ada5b99d1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160381b9092048216929186169160008051602061408c83398151915291612f879160481b90613ede565b60405180910390a460028601805467ff000000000000001916600160381b60ff8516021790555b600286015460ff828116600160481b9092041614612d4e576040516f1a1bdb19195c9cd1995953db94d95b1b60821b815260100160405190819003812060028801548854919260ff600160481b9092048216929185169160008051602061408c833981519152916130229160481b90613ede565b60405180910390a460028601805460ff8316600160481b0269ff00000000000000000019909116179055505050505050565b6001600160a01b03831661307a5760405162461bcd60e51b8152600401610bcf90613dd9565b6001600160a01b0382166130a05760405162461bcd60e51b8152600401610bcf90613e1e565b6130dd8160405180606001604052806026815260200161403e602691396001600160a01b03861660009081526001602052604090205491906127ea565b6001600160a01b03808516600090815260016020526040808220939093559084168152205461310c9082612824565b6001600160a01b0380841660008181526001602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122dd9085815260200190565b601b805464ffffffffff1916905583156131e857601454601b805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b821561326357601454601b805461010080840460ff90811661ffff199093169290921763010000008086048416929092021763ffff00001916600160281b85048316620100000263ff000000191617600160381b85048316919091021764ff000000001916600160481b90930416600160201b029190911790555b8215801561326f575083155b80156132b557506001600160a01b03821660009081526016602052604090205460ff16806132b557506001600160a01b03811660009081526016602052604090205460ff165b1561332e57601454601b805460ff80841661ffff1990921691909117610100620100008086048416919091029190911763ffff00001916600160201b80860484169290920263ff000000191617600160301b850483166301000000021764ff000000001916600160401b90940491909116029190911790555b601b5460ff600160201b82048116916301000000810482169162010000820481169161336291610100820481169116613ef5565b61336c9190613ef5565b6133769190613ef5565b6133809190613ef5565b601b805460ff928316600160281b90810265ff0000000000198316811793849055604080519186169386169390931781526101008404851660208201526201000084048516818401526301000000840485166060820152600160201b840485166080820152920490921660a082015290517f6c6977cb51242ec6e05aba0e2a29a5292ed1a8a5cffa3b87ff66395b7997d6d29181900360c00190a150505050565b600061342c30611573565b601b54909150479060009060029060ff600160281b8204811691613451911686613e8a565b61345b9190613eb7565b6134659190613eb7565b601b5490915060009060ff600160281b820481169161348d9163010000009091041686613e8a565b6134979190613eb7565b905060006134a58284613e77565b6134af9086613ecb565b90506134ba81613787565b60006134c68547613ecb565b601b5490915060009060ff630100000082048116916134e89160029116613f0e565b601b546134ff9190600160281b900460ff16613f30565b6135099190613f30565b601b5460ff91821692506000916002918491613526911686613e8a565b6135309190613eb7565b61353a9190613eb7565b601b5490915060009083906135589062010000900460ff1686613e8a565b6135629190613eb7565b601b54909150600090849061357f90610100900460ff1687613e8a565b6135899190613eb7565b90506000816135988486613e77565b6135a29190613e77565b6135ac9087613ecb565b600f549091506135c5906001600160a01b0316846138d9565b600e546135db906001600160a01b0316836138d9565b881561362d576135eb89856139f2565b60408051888152602081018690529081018a90527f17bbfb9a6069321b6ded73bd96327c9e6b7212a5cd51ff219cd61370acafb5619060600160405180910390a15b60115460405163a9059cbb60e01b81526001600160a01b03909116600482015260248101899052600090309063a9059cbb906044016020604051808303816000875af1158015613681573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136a59190613d68565b6007546040519192506001600160a01b0316908390600081818185875af1925050503d80600081146136f3576040519150601f19603f3d011682016040523d82523d6000602084013e6136f8565b606091505b50909150508015613737576040518281527fa4049db804d87a845be4dd8b54ae7048131238fba985dd37234309ac8668d9699060200160405180910390a15b505050505050505050505050565b600061288383836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506127ea565b60408051600280825260608201835260009260208301908036833701905050905030816000815181106137bc576137bc613f49565b6001600160a01b03928316602091820292909201810191909152600654604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015613815573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138399190613f5f565b8160018151811061384c5761384c613f49565b6001600160a01b03928316602091820292909201015260065461387291309116846121c5565b60065460405163791ac94760e01b81526001600160a01b039091169063791ac947906138ab908590600190869030904290600401613f7c565b600060405180830381600087803b1580156138c557600080fd5b505af1158015612d4e573d6000803e3d6000fd5b804710156139295760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610bcf565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114613976576040519150601f19603f3d011682016040523d82523d6000602084013e61397b565b606091505b50509050806118fe5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610bcf565b600654613a0a9030906001600160a01b0316846121c5565b600654600d5460405163f305d71960e01b81523060048201526024810185905260016044820181905260648201526001600160a01b0391821660848201524260a482015291169063f305d71990839060c40160606040518083038185885af1158015613a7a573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906110ef9190613fed565b600060208083528351808285015260005b81811015613acc57858101830151858201604001528201613ab0565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b03811681146112c657600080fd5b60008060408385031215613b1557600080fd5b8235613b2081613aed565b946020939093013593505050565b600060208284031215613b4057600080fd5b5035919050565b600060208284031215613b5957600080fd5b813561288381613aed565b600080600060608486031215613b7957600080fd5b8335613b8481613aed565b92506020840135613b9481613aed565b929592945050506040919091013590565b80151581146112c657600080fd5b60008060408385031215613bc657600080fd5b8235613bd181613aed565b91506020830135613be181613ba5565b809150509250929050565b600080600060608486031215613c0157600080fd5b8335613c0c81613aed565b92506020840135613c1c81613aed565b91506040840135613c2c81613aed565b809150509250925092565b803560ff81168114613c4857600080fd5b919050565b600080600080600060a08688031215613c6557600080fd5b613c6e86613c37565b9450613c7c60208701613c37565b9350613c8a60408701613c37565b9250613c9860608701613c37565b9150613ca660808701613c37565b90509295509295909350565b60008060408385031215613cc557600080fd5b8235613cd081613aed565b91506020830135613be181613aed565b600181811c90821680613cf457607f821691505b602082108103613d1457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600060208284031215613d6157600080fd5b5051919050565b600060208284031215613d7a57600080fd5b815161288381613ba5565b60208082526034908201527f427265776c6162733a204163636f756e7420697320616c7265616479207468656040820152732076616c7565206f6620276578636c756465642760601b606082015260800190565b60208082526025908201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526023908201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260408201526265737360e81b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b80820180821115610b9f57610b9f613e61565b8082028115828204841417610b9f57610b9f613e61565b634e487b7160e01b600052601260045260246000fd5b600082613ec657613ec6613ea1565b500490565b81810381811115610b9f57610b9f613e61565b68ffffffffffffffffff1991909116815260200190565b60ff8181168382160190811115610b9f57610b9f613e61565b600060ff831680613f2157613f21613ea1565b8060ff84160491505092915050565b60ff8281168282160390811115610b9f57610b9f613e61565b634e487b7160e01b600052603260045260246000fd5b600060208284031215613f7157600080fd5b815161288381613aed565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b81811015613fcc5784516001600160a01b031683529383019391830191600101613fa7565b50506001600160a01b03969096166060850152505050608001529392505050565b60008060006060848603121561400257600080fd5b835192506020840151915060408401519050925092509256fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636500edc71549f0cbe47086c2237ce0cf874d6897fd1d7ce43ee6b65c0230d7606e45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa264697066735822122002c0e5d5dcef6b1e2b66decf9153d9a1dbea61b6237fcf4b5dca82dbeb864d9864736f6c63430008110033

Libraries Used


Deployed Bytecode Sourcemap

22113:25728:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22474:28;;;;;;;;;;-1:-1:-1;22474:28:0;;;;-1:-1:-1;;;22474:28:0;;;;;;;;;179:14:1;;172:22;154:41;;142:2;127:18;22474:28:0;;;;;;;;12891:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13855:169::-;;;;;;;;;;-1:-1:-1;13855:169:0;;;;;:::i;:::-;;:::i;35531:322::-;;;;;;;;;;-1:-1:-1;35531:322:0;;;;;:::i;:::-;;:::i;:::-;;36294:272;;;;;;;;;;-1:-1:-1;36294:272:0;;;;;:::i;:::-;;:::i;28538:88::-;;;;;;;;;;;;;:::i;22893:73::-;;;;;;;;;;-1:-1:-1;22893:73:0;;;;-1:-1:-1;;;;;22893:73:0;;;;;;-1:-1:-1;;;;;1816:32:1;;;1798:51;;1786:2;1771:18;22893:73:0;1652:203:1;22190:30:0;;;;;;;;;;-1:-1:-1;22190:30:0;;;;-1:-1:-1;;;;;22190:30:0;;;13212:108;;;;;;;;;;-1:-1:-1;13300:12:0;;13212:108;;;2229:25:1;;;2217:2;2202:18;13212:108:0;2083:177:1;23050:28:0;;;;;;;;;;-1:-1:-1;23050:28:0;;;;-1:-1:-1;;;;;23050:28:0;;;34284:272;;;;;;;;;;-1:-1:-1;34284:272:0;;;;;:::i;:::-;;:::i;14032:454::-;;;;;;;;;;-1:-1:-1;14032:454:0;;;;;:::i;:::-;;:::i;34564:315::-;;;;;;;;;;-1:-1:-1;34564:315:0;;;;;:::i;:::-;;:::i;22419:46::-;;;;;;;;;;-1:-1:-1;22419:46:0;;;;-1:-1:-1;;;;;22419:46:0;;;36590:141;;;;;;;;;;;;;:::i;28430:100::-;;;;;;;;;;-1:-1:-1;28430:100:0;;22409:1;3116:36:1;;3104:2;3089:18;28430:100:0;2974:184:1;30155:130:0;;;;;;;;;;-1:-1:-1;30155:130:0;;;;;:::i;:::-;;:::i;28634:91::-;;;;;;;;;;;;;:::i;14494:218::-;;;;;;;;;;-1:-1:-1;14494:218:0;;;;;:::i;:::-;;:::i;35861:240::-;;;;;;;;;;-1:-1:-1;35861:240:0;;;;;:::i;:::-;;:::i;36109:177::-;;;;;;;;;;-1:-1:-1;36109:177:0;;;;;:::i;:::-;;:::i;29412:386::-;;;;;;;;;;-1:-1:-1;29412:386:0;;;;;:::i;:::-;;:::i;22227:38::-;;;;;;;;;;;;;;;35420:103;;;;;;;;;;;;;:::i;35259:153::-;;;;;;;;;;-1:-1:-1;35259:153:0;;;;;:::i;:::-;;:::i;37050:142::-;;;;;;;;;;;;;:::i;36901:141::-;;;;;;;;;;-1:-1:-1;36901:141:0;;;;;:::i;:::-;;:::i;13328:127::-;;;;;;;;;;-1:-1:-1;13328:127:0;;;;;:::i;:::-;;:::i;12047:148::-;;;;;;;;;;;;;:::i;31505:1000::-;;;;;;;;;;-1:-1:-1;31505:1000:0;;;;;:::i;:::-;;:::i;30696:378::-;;;;;;;;;;-1:-1:-1;30696:378:0;;;;;:::i;:::-;;:::i;30293:395::-;;;;;;;;;;-1:-1:-1;30293:395:0;;;;;:::i;:::-;;:::i;22722:64::-;;;;;;;;;;;;;;;;11833:79;;;;;;;;;;-1:-1:-1;11871:7:0;11898:6;-1:-1:-1;;;;;11898:6:0;11833:79;;23019:24;;;;;;;;;;-1:-1:-1;23019:24:0;;;;-1:-1:-1;;;;;23019:24:0;;;12999:104;;;;;;;;;;;;;:::i;32531:658::-;;;;;;;;;;-1:-1:-1;32531:658:0;;;;;:::i;:::-;;:::i;14720:400::-;;;;;;;;;;-1:-1:-1;14720:400:0;;;;;:::i;:::-;;:::i;36739:154::-;;;;;;;;;;-1:-1:-1;36739:154:0;;;;;:::i;:::-;;:::i;13463:175::-;;;;;;;;;;-1:-1:-1;13463:175:0;;;;;:::i;:::-;;:::i;22573:69::-;;;;;;;;;;;;;;;;34887:364;;;;;;;;;;-1:-1:-1;34887:364:0;;;;;:::i;:::-;;:::i;33197:676::-;;;;;;;;;;-1:-1:-1;33197:676:0;;;;;:::i;:::-;;:::i;24060:57::-;;;;;;;;;;-1:-1:-1;24060:57:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;33881:395;;;;;;;;;;-1:-1:-1;33881:395:0;;;;;:::i;:::-;;:::i;29806:341::-;;;;;;;;;;-1:-1:-1;29806:341:0;;;;;:::i;:::-;;:::i;37200:407::-;;;;;;;;;;-1:-1:-1;37425:23:0;;;;;;;37463:17;;;;;;-1:-1:-1;;;37495:21:0;;;;;-1:-1:-1;;;37531:21:0;;;;;-1:-1:-1;;;37567:21:0;;;;37200:407;;;;5106:4:1;5094:17;;;5076:36;;5148:17;;;5143:2;5128:18;;5121:45;5202:17;;;5182:18;;;5175:45;;;;5256:17;;5251:2;5236:18;;5229:45;5311:17;;;5305:3;5290:19;;5283:46;5063:3;5048:19;37200:407:0;4837:498:1;22824:60:0;;;;;;;;;;;;;;;;29187:217;;;;;;;;;;-1:-1:-1;29187:217:0;;;;;:::i;:::-;;:::i;22982:30::-;;;;;;;;;;-1:-1:-1;22982:30:0;;;;-1:-1:-1;;;;;22982:30:0;;;23113:29;;;;;;;;;;-1:-1:-1;23113:29:0;;;;-1:-1:-1;;;;;23113:29:0;;;13646:201;;;;;;;;;;-1:-1:-1;13646:201:0;;;;;:::i;:::-;-1:-1:-1;;;;;13812:18:0;;;13780:7;13812:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;13646:201;23085:21;;;;;;;;;;-1:-1:-1;23085:21:0;;;;-1:-1:-1;;;;;23085:21:0;;;12203:244;;;;;;;;;;-1:-1:-1;12203:244:0;;;;;:::i;:::-;;:::i;31082:415::-;;;;;;;;;;-1:-1:-1;31082:415:0;;;;;:::i;:::-;;:::i;37615:413::-;;;;;;;;;;-1:-1:-1;37841:24:0;;;;;;;;;37880:18;;;;;;-1:-1:-1;;;37913:22:0;;;;;-1:-1:-1;;;37950:22:0;;;;;-1:-1:-1;;;37987:22:0;;;;37615:413;;12891:100;12945:13;12978:5;12971:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12891:100;:::o;13855:169::-;13938:4;13955:39;11246:10;13978:7;13987:6;13955:8;:39::i;:::-;-1:-1:-1;14012:4:0;13855:169;;;;;:::o;35531:322::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;;;;;;;;;35620:21:::1;35611:6;:30;35603:91;;;::::0;-1:-1:-1;;;35603:91:0;;6681:2:1;35603:91:0::1;::::0;::::1;6663:21:1::0;6720:2;6700:18;;;6693:30;6759:34;6739:18;;;6732:62;-1:-1:-1;;;6810:18:1;;;6803:46;6866:19;;35603:91:0::1;6479:412:1::0;35603:91:0::1;35706:12;11898:6:::0;;35724:42:::1;::::0;-1:-1:-1;;;;;11898:6:0;;;;35754;;35706:12;35724:42;35706:12;35724:42;35754:6;11898;35724:42:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35705:61;;;35781:7;35777:69;;;35810:24;::::0;2229:25:1;;;35810:24:0::1;::::0;2217:2:1;2202:18;35810:24:0::1;;;;;;;35777:69;35592:261;35531:322:::0;:::o;36294:272::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36384:31:0;::::1;::::0;;::::1;::::0;:60:::1;;-1:-1:-1::0;36438:6:0::1;::::0;-1:-1:-1;;;;;36419:25:0;;::::1;36438:6:::0;::::1;36419:25;;36384:60;36376:97;;;::::0;-1:-1:-1;;;36376:97:0;;7308:2:1;36376:97:0::1;::::0;::::1;7290:21:1::0;7347:2;7327:18;;;7320:30;7386:26;7366:18;;;7359:54;7430:18;;36376:97:0::1;7106:348:1::0;36376:97:0::1;36484:6;:24:::0;;-1:-1:-1;;;;;;36484:24:0::1;-1:-1:-1::0;;;;;36484:24:0;::::1;::::0;;::::1;::::0;;;36524:34:::1;::::0;::::1;::::0;-1:-1:-1;;36524:34:0::1;36294:272:::0;:::o;28538:88::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;28595:16:::1;:23:::0;;-1:-1:-1;;;;28595:23:0::1;-1:-1:-1::0;;;28595:23:0::1;::::0;;28538:88::o;34284:272::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;34385:11:::1;;34373:8;:23:::0;34365:85:::1;;;::::0;-1:-1:-1;;;34365:85:0;;7661:2:1;34365:85:0::1;::::0;::::1;7643:21:1::0;7700:2;7680:18;;;7673:30;7739:34;7719:18;;;7712:62;-1:-1:-1;;;7790:18:1;;;7783:47;7847:19;;34365:85:0::1;7459:413:1::0;34365:85:0::1;34503:11;::::0;34466:49:::1;::::0;34493:8;;34466:49:::1;::::0;;;::::1;34526:11;:22:::0;34284:272::o;14032:454::-;14172:4;14189:36;14199:6;14207:9;14218:6;14189:9;:36::i;:::-;14236:220;14259:6;11246:10;14307:138;14363:6;14307:138;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;14307:19:0;;;;;;:11;:19;;;;;;;;11246:10;14307:33;;;;;;;;;;:37;:138::i;:::-;14236:8;:220::i;:::-;-1:-1:-1;14474:4:0;14032:454;;;;;:::o;34564:315::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;34674:15:::1;;34662:8;:27:::0;34640:130:::1;;;::::0;-1:-1:-1;;;34640:130:0;;8079:2:1;34640:130:0::1;::::0;::::1;8061:21:1::0;8118:2;8098:18;;;8091:30;8157:34;8137:18;;;8130:62;-1:-1:-1;;;8208:18:1;;;8201:51;8269:19;;34640:130:0::1;7877:417:1::0;34640:130:0::1;34818:15;::::0;34786:48:::1;::::0;34808:8;;34786:48:::1;::::0;;;::::1;34845:15;:26:::0;34564:315::o;36590:141::-;36680:15;;:43;;;-1:-1:-1;;;36680:43:0;;;;36653:7;;-1:-1:-1;;;;;36680:15:0;;:41;;:43;;;;;;;;;;;;;;:15;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36673:50;;36590:141;:::o;30155:130::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;30232:15:::1;::::0;:45:::1;::::0;-1:-1:-1;;;30232:45:0;;-1:-1:-1;;;;;1816:32:1;;;30232:45:0::1;::::0;::::1;1798:51:1::0;30232:15:0;;::::1;::::0;:36:::1;::::0;1771:18:1;;30232:45:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;30155:130:::0;:::o;28634:91::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;28693:16:::1;:24:::0;;-1:-1:-1;;;;28693:24:0::1;::::0;;28634:91::o;14494:218::-;11246:10;14582:4;14631:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14631:34:0;;;;;;;;;;14582:4;;14599:83;;14622:7;;14631:50;;14670:10;14631:38;:50::i;35861:240::-;26433:6;;35943:4;;-1:-1:-1;;;;;26433:6:0;26419:10;:20;26411:62;;;;-1:-1:-1;;;26411:62:0;;8690:2:1;26411:62:0;;;8672:21:1;8729:2;8709:18;;;8702:30;8768:31;8748:18;;;8741:59;8817:18;;26411:62:0;8488:353:1;26411:62:0;35960:21:::1;35966:7;35975:5;35960;:21::i;:::-;35996:15;::::0;-1:-1:-1;;;;;35996:15:0::1;:26;36031:7:::0;36041:18:::1;36031:7:::0;36041:9:::1;:18::i;:::-;35996:64;::::0;-1:-1:-1;;;;;;35996:64:0::1;::::0;;;;;;-1:-1:-1;;;;;9054:32:1;;;35996:64:0::1;::::0;::::1;9036:51:1::0;9103:18;;;9096:34;9009:18;;35996:64:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;35992:80:::0;::::1;;-1:-1:-1::0;36089:4:0::1;35861:240:::0;;;;:::o;36109:177::-;36158:24;36164:10;36176:5;36158;:24::i;:::-;36197:15;;-1:-1:-1;;;;;36197:15:0;:26;36232:10;36245:21;36232:10;36245:9;:21::i;:::-;36197:70;;-1:-1:-1;;;;;;36197:70:0;;;;;;;-1:-1:-1;;;;;9054:32:1;;;36197:70:0;;;9036:51:1;9103:18;;;9096:34;9009:18;;36197:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36193:86;36109:177;:::o;29412:386::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29534:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:47;::::1;;:38;::::0;;::::1;:47;;::::0;29512:155:::1;;;::::0;-1:-1:-1;;;29512:155:0;;9343:2:1;29512:155:0::1;::::0;::::1;9325:21:1::0;9382:2;9362:18;;;9355:30;9421:34;9401:18;;;9394:62;9492:28;9472:18;;;9465:56;9538:19;;29512:155:0::1;9141:422:1::0;29512:155:0::1;-1:-1:-1::0;;;;;29678:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:46;;-1:-1:-1;;29678:46:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29740:50;;154:41:1;;;29740:50:0::1;::::0;127:18:1;29740:50:0::1;;;;;;;;29412:386:::0;;:::o;35420:103::-;35457:15;;:58;;-1:-1:-1;;;35457:58:0;;35496:10;35457:58;;;9752:51:1;35457:15:0;9819:18:1;;;9812:50;-1:-1:-1;;;;;35457:15:0;;;;:30;;9725:18:1;;35457:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;35259:153::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;35351:15:::1;::::0;:53:::1;::::0;-1:-1:-1;;;35351:53:0;;::::1;::::0;::::1;2229:25:1::0;;;-1:-1:-1;;;;;35351:15:0;;::::1;::::0;:43:::1;::::0;2202:18:1;;35351:53:0::1;2083:177:1::0;37050:142:0;37143:15;;:41;;;-1:-1:-1;;;37143:41:0;;;;37116:7;;-1:-1:-1;;;;;37143:15:0;;:39;;:41;;;;;;;;;;;;;;:15;:41;;;;;;;;;;;;;;36901:141;37000:15;;:34;;-1:-1:-1;;;37000:34:0;;-1:-1:-1;;;;;1816:32:1;;;37000:34:0;;;1798:51:1;36973:7:0;;37000:15;;:25;;1771:18:1;;37000:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;13328:127::-;-1:-1:-1;;;;;13429:18:0;13402:7;13429:18;;;:9;:18;;;;;;;13328:127::o;12047:148::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;12154:1:::1;12138:6:::0;;12117:40:::1;::::0;-1:-1:-1;;;;;12138:6:0;;::::1;::::0;12117:40:::1;::::0;12154:1;;12117:40:::1;12185:1;12168:19:::0;;-1:-1:-1;;;;;;12168:19:0::1;::::0;;12047:148::o;31505:1000::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;31669:15:::1;::::0;-1:-1:-1;;;;;31669:37:0;;::::1;:15:::0;::::1;:37;31665:295;;-1:-1:-1::0;;;;;31731:32:0;::::1;31723:86;;;::::0;-1:-1:-1;;;31723:86:0;;10325:2:1;31723:86:0::1;::::0;::::1;10307:21:1::0;10364:2;10344:18;;;10337:30;10403:34;10383:18;;;10376:62;-1:-1:-1;;;10454:18:1;;;10447:39;10503:19;;31723:86:0::1;10123:405:1::0;31723:86:0::1;31881:15;::::0;31829:68:::1;::::0;-1:-1:-1;;;10735:30:1;;-1:-1:-1;;;;;31881:15:0;;::::1;::::0;31829:68;::::1;::::0;10790:2:1;10781:12;31829:68:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;31912:15;:36:::0;;-1:-1:-1;;;;;;31912:36:0::1;-1:-1:-1::0;;;;;31912:36:0;::::1;;::::0;;31665:295:::1;31974:9;::::0;-1:-1:-1;;;;;31974:25:0;;::::1;:9:::0;::::1;:25;31970:241;;-1:-1:-1::0;;;;;32024:26:0;::::1;32016:74;;;::::0;-1:-1:-1;;;32016:74:0;;11006:2:1;32016:74:0::1;::::0;::::1;10988:21:1::0;11045:2;11025:18;;;11018:30;11084:34;11064:18;;;11057:62;-1:-1:-1;;;11135:18:1;;;11128:33;11178:19;;32016:74:0::1;10804:399:1::0;32016:74:0::1;32150:9;::::0;32110:50:::1;::::0;-1:-1:-1;;;11410:24:1;;-1:-1:-1;;;;;32150:9:0;;::::1;::::0;32110:50;::::1;::::0;11459:1:1;11450:11;32110:50:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;32175:9;:24:::0;;-1:-1:-1;;;;;;32175:24:0::1;-1:-1:-1::0;;;;;32175:24:0;::::1;;::::0;;31970:241:::1;32225:13;::::0;-1:-1:-1;;;;;32225:33:0;;::::1;:13:::0;::::1;:33;32221:277;;-1:-1:-1::0;;;;;32283:30:0;::::1;32275:82;;;::::0;-1:-1:-1;;;32275:82:0;;11674:2:1;32275:82:0::1;::::0;::::1;11656:21:1::0;11713:2;11693:18;;;11686:30;11752:34;11732:18;;;11725:62;-1:-1:-1;;;11803:18:1;;;11796:37;11850:19;;32275:82:0::1;11472:403:1::0;32275:82:0::1;32425:13;::::0;32377:62:::1;::::0;-1:-1:-1;;;12082:28:1;;-1:-1:-1;;;;;32425:13:0;;::::1;::::0;32377:62;::::1;::::0;12135:2:1;12126:12;32377:62:0::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;32454:13;:32:::0;;-1:-1:-1;;;;;;32454:32:0::1;-1:-1:-1::0;;;;;32454:32:0;::::1;;::::0;;32221:277:::1;31505:1000:::0;;;:::o;30696:378::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30815:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;:50;::::1;;:38;::::0;;::::1;:50;;::::0;30793:152:::1;;;;-1:-1:-1::0;;;30793:152:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30956:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:49;;-1:-1:-1;;30956:49:0::1;::::0;::::1;;::::0;;::::1;::::0;;;31021:45;;154:41:1;;;31021:45:0::1;::::0;127:18:1;31021:45:0::1;14:187:1::0;30293:395:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30417:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;:55;::::1;;:43;::::0;;::::1;:55;;::::0;30395:157:::1;;;;-1:-1:-1::0;;;30395:157:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30563:43:0;::::1;;::::0;;;:34:::1;:43;::::0;;;;;;;;:54;;-1:-1:-1;;30563:54:0::1;::::0;::::1;;::::0;;::::1;::::0;;;30633:47;;154:41:1;;;30633:47:0::1;::::0;127:18:1;30633:47:0::1;14:187:1::0;12999:104:0;13055:13;13088:7;13081:14;;;;;:::i;32531:658::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;32757:206:::1;32794:5;32814:18;32847:12;32874:16;32905;32936;32757:22;:206::i;:::-;32979:202;::::0;-1:-1:-1;;;12772:27:1;;12824:2;12815:12;32979:202:0::1;;::::0;;;;;::::1;::::0;;5106:4:1;5094:17;;;5076:36;;5148:17;;;5143:2;5128:18;;5121:45;5202:17;;;5182:18;;;5175:45;5256:17;;;5251:2;5236:18;;5229:45;5311:17;;5305:3;5290:19;;5283:46;32979:202:0;;;;::::1;::::0;;;;;5063:3:1;32979:202:0;;::::1;32531:658:::0;;;;;:::o;14720:400::-;14840:4;14862:228;11246:10;14912:7;14934:145;14991:15;14934:145;;;;;;;;;;;;;;;;;11246:10;14934:25;;;;:11;:25;;;;;;;;-1:-1:-1;;;;;14934:34:0;;;;;;;;;;;;:38;:145::i;36739:154::-;36838:15;;:47;;-1:-1:-1;;;36838:47:0;;-1:-1:-1;;;;;1816:32:1;;;36838:47:0;;;1798:51:1;36811:7:0;;36838:15;;:38;;1771:18:1;;36838:47:0;1652:203:1;13463:175:0;13549:4;13566:42;11246:10;13590:9;13601:6;13566:9;:42::i;34887:364::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;35005:23:::1;;34993:8;:35:::0;34971:146:::1;;;::::0;-1:-1:-1;;;34971:146:0;;13040:2:1;34971:146:0::1;::::0;::::1;13022:21:1::0;13079:2;13059:18;;;13052:30;13118:34;13098:18;;;13091:62;13189:31;13169:18;;;13162:59;13238:19;;34971:146:0::1;12838:425:1::0;34971:146:0::1;35174:23;::::0;35133:65:::1;::::0;35164:8;;35133:65:::1;::::0;;;::::1;35209:23;:34:::0;34887:364::o;33197:676::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;33429:212:::1;33467:5;33487:19;33521:13;33549:17;33581;33613;33429:23;:212::i;:::-;33657:208;::::0;-1:-1:-1;;;13470:28:1;;13523:2;13514:12;33657:208:0::1;13268:264:1::0;33881:395:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;34001:15:::1;::::0;-1:-1:-1;;;;;34001:15:0;;::::1;33979:38:::0;;::::1;::::0;33957:133:::1;;;::::0;-1:-1:-1;;;33957:133:0;;13739:2:1;33957:133:0::1;::::0;::::1;13721:21:1::0;13778:2;13758:18;;;13751:30;13817:34;13797:18;;;13790:62;-1:-1:-1;;;13868:18:1;;;13861:43;13921:19;;33957:133:0::1;13537:409:1::0;33957:133:0::1;34148:15;::::0;34106:59:::1;::::0;-1:-1:-1;;;;;34148:15:0;;::::1;::::0;34106:59;::::1;::::0;::::1;::::0;34148:15:::1;::::0;34106:59:::1;34176:15;:37:::0;;-1:-1:-1;;;;;;34176:37:0::1;-1:-1:-1::0;;;;;34176:37:0;;::::1;::::0;;::::1;::::0;;;34224:15:::1;::::0;:44:::1;::::0;-1:-1:-1;;;34224:44:0;;::::1;::::0;::::1;1798:51:1::0;;;;34224:15:0;;::::1;::::0;:32:::1;::::0;1771:18:1;;34224:44:0::1;1652:203:1::0;29806:341:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29915:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;:39;::::1;;:27;::::0;;::::1;:39;;::::0;29893:141:::1;;;;-1:-1:-1::0;;;29893:141:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;30045:27:0;::::1;;::::0;;;:18:::1;:27;::::0;;;;;;;;:38;;-1:-1:-1;;30045:38:0::1;::::0;::::1;;::::0;;::::1;::::0;;;30099:40;;154:41:1;;;30099:40:0::1;::::0;127:18:1;30099:40:0::1;14:187:1::0;29187:217:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;29282:38:0;::::1;;::::0;;;:29:::1;:38;::::0;;;;;;;;:48;;-1:-1:-1;;29282:48:0::1;::::0;::::1;;::::0;;::::1;::::0;;;29346:50;;154:41:1;;;29346:50:0::1;::::0;127:18:1;29346:50:0::1;14:187:1::0;12203:244:0;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;12292:22:0;::::1;12284:73;;;::::0;-1:-1:-1;;;12284:73:0;;14153:2:1;12284:73:0::1;::::0;::::1;14135:21:1::0;14192:2;14172:18;;;14165:30;14231:34;14211:18;;;14204:62;-1:-1:-1;;;14282:18:1;;;14275:36;14328:19;;12284:73:0::1;13951:402:1::0;12284:73:0::1;12394:6;::::0;;12373:38:::1;::::0;-1:-1:-1;;;;;12373:38:0;;::::1;::::0;12394:6;::::1;::::0;12373:38:::1;::::0;::::1;12422:6;:17:::0;;-1:-1:-1;;;;;;12422:17:0::1;-1:-1:-1::0;;;;;12422:17:0;;;::::1;::::0;;;::::1;::::0;;12203:244::o;31082:415::-;11960:6;;-1:-1:-1;;;;;11960:6:0;11246:10;11960:22;11952:67;;;;-1:-1:-1;;;11952:67:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;31190:31:0;::::1;31182:84;;;::::0;-1:-1:-1;;;31182:84:0;;14560:2:1;31182:84:0::1;::::0;::::1;14542:21:1::0;14599:2;14579:18;;;14572:30;14638:34;14618:18;;;14611:62;-1:-1:-1;;;14689:18:1;;;14682:38;14737:19;;31182:84:0::1;14358:404:1::0;31182:84:0::1;31306:14;::::0;-1:-1:-1;;;;;31306:14:0;;::::1;31285:35:::0;;::::1;::::0;31277:118:::1;;;::::0;-1:-1:-1;;;31277:118:0;;14969:2:1;31277:118:0::1;::::0;::::1;14951:21:1::0;15008:2;14988:18;;;14981:30;15047:34;15027:18;;;15020:62;15118:34;15098:18;;;15091:62;-1:-1:-1;;;15169:19:1;;;15162:37;15216:19;;31277:118:0::1;14767:474:1::0;31277:118:0::1;31406:14;:34:::0;;-1:-1:-1;;;;;;31406:34:0::1;-1:-1:-1::0;;;;;31406:34:0;::::1;::::0;;::::1;::::0;;;31456:33:::1;::::0;::::1;::::0;-1:-1:-1;;31456:33:0::1;31082:415:::0;:::o;16509:378::-;-1:-1:-1;;;;;16645:19:0;;16637:68;;;;-1:-1:-1;;;16637:68:0;;15448:2:1;16637:68:0;;;15430:21:1;15487:2;15467:18;;;15460:30;15526:34;15506:18;;;15499:62;-1:-1:-1;;;15577:18:1;;;15570:34;15621:19;;16637:68:0;15246:400:1;16637:68:0;-1:-1:-1;;;;;16724:21:0;;16716:68;;;;-1:-1:-1;;;16716:68:0;;15853:2:1;16716:68:0;;;15835:21:1;15892:2;15872:18;;;15865:30;15931:34;15911:18;;;15904:62;-1:-1:-1;;;15982:18:1;;;15975:32;16024:19;;16716:68:0;15651:398:1;16716:68:0;-1:-1:-1;;;;;16795:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16847:32;;2229:25:1;;;16847:32:0;;2202:18:1;16847:32:0;;;;;;;;16509:378;;;:::o;38049:2040::-;-1:-1:-1;;;;;38181:18:0;;38173:68;;;;-1:-1:-1;;;38173:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38260:16:0;;38252:64;;;;-1:-1:-1;;;38252:64:0;;;;;;;:::i;:::-;38333:6;38343:1;38333:11;38329:93;;38361:28;38377:4;38383:2;38387:1;38361:15;:28::i;38329:93::-;-1:-1:-1;;;;;38439:35:0;;;;;;:29;:35;;;;;;;;38438:36;:74;;;;-1:-1:-1;;;;;;38479:33:0;;;;;;:29;:33;;;;;;;;38478:34;38438:74;38434:603;;;38537:16;;-1:-1:-1;;;38537:16:0;;;;38529:69;;;;-1:-1:-1;;;38529:69:0;;17066:2:1;38529:69:0;;;17048:21:1;17105:2;17085:18;;;17078:30;17144:34;17124:18;;;17117:62;-1:-1:-1;;;17195:18:1;;;17188:38;17243:19;;38529:69:0;16864:404:1;38529:69:0;-1:-1:-1;;;;;38618:38:0;;;;;;:34;:38;;;;;;;;38617:39;:84;;;;-1:-1:-1;;;;;;38661:40:0;;;;;;:34;:40;;;;;;;;38660:41;38617:84;38613:207;;;38740:11;;38730:6;:21;;38722:82;;;;-1:-1:-1;;;38722:82:0;;17475:2:1;38722:82:0;;;17457:21:1;17514:2;17494:18;;;17487:30;17553:34;17533:18;;;17526:62;-1:-1:-1;;;17604:18:1;;;17597:46;17660:19;;38722:82:0;17273:412:1;38722:82:0;-1:-1:-1;;;;;38839:33:0;;;;;;:29;:33;;;;;;;;38834:192;;38929:15;;38918:6;38902:13;38912:2;38902:9;:13::i;:::-;:22;;;;:::i;:::-;38901:43;;38893:117;;;;-1:-1:-1;;;38893:117:0;;18154:2:1;38893:117:0;;;18136:21:1;18193:2;18173:18;;;18166:30;18232:34;18212:18;;;18205:62;18303:31;18283:18;;;18276:59;18352:19;;38893:117:0;17952:425:1;38893:117:0;-1:-1:-1;;;;;39062:31:0;;;;;;;:25;:31;;;;;;;39095:29;;;;;;;;39049:86;;39062:31;;;;;39095:29;39088:4;39121:2;39049:12;:86::i;:::-;39146:12;39189:23;;39161:24;39179:4;39161:9;:24::i;:::-;39243:16;;-1:-1:-1;;39161:51:0;;-1:-1:-1;;;;39243:16:0;;;;:40;;;;;39276:7;39243:40;:67;;;;-1:-1:-1;39301:9:0;;;;39300:10;39243:67;:97;;;;-1:-1:-1;39327:9:0;;-1:-1:-1;;;39327:9:0;;;;:13;;39243:97;:143;;;;-1:-1:-1;;;;;;39357:29:0;;;;;;:25;:29;;;;;;;;39243:143;39225:280;;;39413:9;:16;;-1:-1:-1;;39413:16:0;39425:4;39413:16;;;39444:17;:15;:17::i;:::-;39476:9;:17;;-1:-1:-1;;39476:17:0;;;39225:280;39533:9;;39517:12;;39533:9;;39532:10;:30;;;;-1:-1:-1;39546:16:0;;-1:-1:-1;;;39546:16:0;;;;39532:30;-1:-1:-1;;;;;39579:24:0;;;;;;:18;:24;;;;;;39517:45;;-1:-1:-1;39579:24:0;;;:50;;-1:-1:-1;;;;;;39607:22:0;;;;;;:18;:22;;;;;;;;39579:50;39575:98;;;-1:-1:-1;39656:5:0;39575:98;39687:7;:24;;;;-1:-1:-1;39698:9:0;;-1:-1:-1;;;39698:9:0;;;;:13;;39687:24;39683:189;;;39752:9;;39728:11;;39765:3;;39743:18;;-1:-1:-1;;;39752:9:0;;;;39743:6;:18;:::i;:::-;39742:26;;;;:::i;:::-;39728:40;-1:-1:-1;39792:12:0;39728:40;39792:6;:12;:::i;:::-;39783:21;;39819:41;39835:4;39849;39856:3;39819:15;:41::i;:::-;39713:159;39683:189;39882:33;39898:4;39904:2;39908:6;39882:15;:33::i;:::-;39932:15;;-1:-1:-1;;;;;39932:15:0;:26;39967:4;39974:15;39967:4;39974:9;:15::i;:::-;39932:58;;-1:-1:-1;;;;;;39932:58:0;;;;;;;-1:-1:-1;;;;;9054:32:1;;;39932:58:0;;;9036:51:1;9103:18;;;9096:34;9009:18;;39932:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39928:74;40016:15;;-1:-1:-1;;;;;40016:15:0;:26;40051:2;40056:13;40051:2;40056:9;:13::i;:::-;40016:54;;-1:-1:-1;;;;;;40016:54:0;;;;;;;-1:-1:-1;;;;;9054:32:1;;;40016:54:0;;;9036:51:1;9103:18;;;9096:34;9009:18;;40016:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40012:70;;;38162:1927;;38049:2040;;;:::o;3202:226::-;3322:7;3358:12;3350:6;;;;3342:29;;;;-1:-1:-1;;;3342:29:0;;;;;;;;:::i;:::-;-1:-1:-1;3382:9:0;3394:5;3398:1;3394;:5;:::i;:::-;3382:17;3202:226;-1:-1:-1;;;;;3202:226:0:o;2869:181::-;2927:7;;2959:5;2963:1;2959;:5;:::i;:::-;2947:17;;2988:1;2983;:6;;2975:46;;;;-1:-1:-1;;;2975:46:0;;19147:2:1;2975:46:0;;;19129:21:1;19186:2;19166:18;;;19159:30;19225:29;19205:18;;;19198:57;19272:18;;2975:46:0;18945:351:1;2975:46:0;3041:1;2869:181;-1:-1:-1;;;2869:181:0:o;15705:374::-;-1:-1:-1;;;;;15789:21:0;;15781:65;;;;-1:-1:-1;;;15781:65:0;;19503:2:1;15781:65:0;;;19485:21:1;19542:2;19522:18;;;19515:30;19581:33;19561:18;;;19554:61;19632:18;;15781:65:0;19301:355:1;15781:65:0;15932:12;;:24;;15949:6;15932:16;:24::i;:::-;15917:12;:39;-1:-1:-1;;;;;15988:18:0;;;;;;:9;:18;;;;;;:30;;16011:6;15988:22;:30::i;:::-;-1:-1:-1;;;;;15967:18:0;;;;;;:9;:18;;;;;;:51;;;;16034:37;;15967:18;;;16034:37;;;;16064:6;2229:25:1;;2217:2;2202:18;;2083:177;16034:37:0;;;;;;;;15705:374;;:::o;16087:414::-;-1:-1:-1;;;;;16171:21:0;;16163:67;;;;-1:-1:-1;;;16163:67:0;;19863:2:1;16163:67:0;;;19845:21:1;19902:2;19882:18;;;19875:30;19941:34;19921:18;;;19914:62;-1:-1:-1;;;19992:18:1;;;19985:31;20033:19;;16163:67:0;19661:397:1;16163:67:0;16322:68;16345:6;16322:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16322:18:0;;;;;;:9;:18;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;16301:18:0;;;;;;:9;:18;;;;;:89;16416:12;;:24;;16433:6;16416:16;:24::i;:::-;16401:12;:39;16456:37;;2229:25:1;;;16482:1:0;;-1:-1:-1;;;;;16456:37:0;;;;;2217:2:1;2202:18;16456:37:0;2083:177:1;43450:1832:0;43713:21;;;;:43;;;;:21;;:43;43709:322;;43778:184;;-1:-1:-1;;;20265:32:1;;20322:2;20313:12;43778:184:0;;;;;;;;43855:21;;;;43933:14;;43778:184;;43855:21;;;;;43778:184;;;;-1:-1:-1;;;;;;;;;;;43778:184:0;;;43933:14;;;43778:184;:::i;:::-;;;;;;;;43977:21;;;:42;;-1:-1:-1;;43977:42:0;;;;;;;43709:322;44045:15;;;;:31;;;;:15;;;;;:31;44041:280;;44098:166;;-1:-1:-1;;;20752:26:1;;20803:2;20794:12;44098:166:0;;;;;;;;44169:15;;;;44235:14;;44098:166;;44169:15;;;;;;;;44098:166;;;;-1:-1:-1;;;;;;;;;;;44098:166:0;;;44235:14;;;44098:166;:::i;:::-;;;;;;;;44279:15;;;:30;;-1:-1:-1;;44279:30:0;;;;;;;;;44041:280;44335:19;;;;:39;;;;-1:-1:-1;;;44335:19:0;;;;:39;44331:308;;44396:178;;-1:-1:-1;;;21019:30:1;;21074:2;21065:12;44396:178:0;;;;;;;;44471:19;;;;44545:14;;44396:178;;44471:19;-1:-1:-1;;;44471:19:0;;;;;;44396:178;;;;-1:-1:-1;;;;;;;;;;;44396:178:0;;;44545:14;;;44396:178;:::i;:::-;;;;;;;;44589:19;;;:38;;-1:-1:-1;;44589:38:0;-1:-1:-1;;;44589:38:0;;;;;;;44331:308;44653:19;;;;:39;;;;-1:-1:-1;;;44653:19:0;;;;:39;44649:308;;44714:178;;-1:-1:-1;;;21290:30:1;;21345:2;21336:12;44714:178:0;;;;;;;;44789:19;;;;44863:14;;44714:178;;44789:19;-1:-1:-1;;;44789:19:0;;;;;;44714:178;;;;-1:-1:-1;;;;;;;;;;;44714:178:0;;;44863:14;;;44714:178;:::i;:::-;;;;;;;;44907:19;;;:38;;-1:-1:-1;;44907:38:0;-1:-1:-1;;;44907:38:0;;;;;;;44649:308;44971:19;;;;:39;;;;-1:-1:-1;;;44971:19:0;;;;:39;44967:308;;45032:178;;-1:-1:-1;;;21561:30:1;;21616:2;21607:12;45032:178:0;;;;;;;;45107:19;;;;45181:14;;45032:178;;45107:19;-1:-1:-1;;;45107:19:0;;;;;;45032:178;;;;-1:-1:-1;;;;;;;;;;;45032:178:0;;;45181:14;;;45032:178;:::i;:::-;;;;;;;;45225:19;;;:38;;-1:-1:-1;;45225:38:0;-1:-1:-1;;;45225:38:0;;;;;;;44967:308;43450:1832;;;;;;:::o;41569:1873::-;41838:22;;;;:45;;;;:22;;;;;:45;41834:329;;41905:187;;-1:-1:-1;;;21832:33:1;;21890:2;21881:12;41905:187:0;;;;;;;;41983:22;;;;42063:14;;41905:187;;41983:22;;;;;;;;41905:187;;;;-1:-1:-1;;;;;;;;;;;41905:187:0;;;42063:14;;;41905:187;:::i;:::-;;;;;;;;42107:22;;;:44;;-1:-1:-1;;42107:44:0;;;;;;;;;41834:329;42177:16;;;;:33;;;;:16;;;;;:33;42173:287;;42232:169;;-1:-1:-1;;;22106:27:1;;22158:2;22149:12;42232:169:0;;;;;;;;42304:16;;;;42372:14;;42232:169;;42304:16;;;;;;;;42232:169;;;;-1:-1:-1;;;;;;;;;;;42232:169:0;;;42372:14;;;42232:169;:::i;:::-;;;;;;;;42416:16;;;:32;;-1:-1:-1;;42416:32:0;;;;;;;;;42173:287;42474:20;;;;:41;;;;-1:-1:-1;;;42474:20:0;;;;:41;42470:315;;42537:181;;-1:-1:-1;;;22374:31:1;;22430:2;22421:12;42537:181:0;;;;;;;;42613:20;;;;42689:14;;42537:181;;42613:20;-1:-1:-1;;;42613:20:0;;;;;;42537:181;;;;-1:-1:-1;;;;;;;;;;;42537:181:0;;;42689:14;;;42537:181;:::i;:::-;;;;;;;;42733:20;;;:40;;-1:-1:-1;;42733:40:0;-1:-1:-1;;;42733:40:0;;;;;;;42470:315;42799:20;;;;:41;;;;-1:-1:-1;;;42799:20:0;;;;:41;42795:315;;42862:181;;-1:-1:-1;;;22646:31:1;;22702:2;22693:12;42862:181:0;;;;;;;;42938:20;;;;43014:14;;42862:181;;42938:20;-1:-1:-1;;;42938:20:0;;;;;;42862:181;;;;-1:-1:-1;;;;;;;;;;;42862:181:0;;;43014:14;;;42862:181;:::i;:::-;;;;;;;;43058:20;;;:40;;-1:-1:-1;;43058:40:0;-1:-1:-1;;;43058:40:0;;;;;;;42795:315;43124:20;;;;:41;;;;-1:-1:-1;;;43124:20:0;;;;:41;43120:315;;43187:181;;-1:-1:-1;;;22918:31:1;;22974:2;22965:12;43187:181:0;;;;;;;;43263:20;;;;43339:14;;43187:181;;43263:20;-1:-1:-1;;;43263:20:0;;;;;;43187:181;;;;-1:-1:-1;;;;;;;;;;;43187:181:0;;;43339:14;;;43187:181;:::i;:::-;;;;;;;;43383:20;;;:40;;;;;-1:-1:-1;;;43383:40:0;-1:-1:-1;;43383:40:0;;;;;;41569:1873;;;;;;:::o;15128:569::-;-1:-1:-1;;;;;15268:20:0;;15260:70;;;;-1:-1:-1;;;15260:70:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;15349:23:0;;15341:71;;;;-1:-1:-1;;;15341:71:0;;;;;;;:::i;:::-;15501;15523:6;15501:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15501:17:0;;;;;;:9;:17;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;15481:17:0;;;;;;;:9;:17;;;;;;:91;;;;15606:20;;;;;;;:32;;15631:6;15606:24;:32::i;:::-;-1:-1:-1;;;;;15583:20:0;;;;;;;:9;:20;;;;;;;:55;;;;15654:35;;;;;;;;;;15682:6;2229:25:1;;2217:2;2202:18;;2083:177;40097:1464:0;40242:13;:17;;-1:-1:-1;;40344:15:0;;;40372:275;;;;40420:23;;40404:13;:39;;40420:23;;;;-1:-1:-1;;40458:27:0;;;;;;;40420:23;40468:17;;;;;;40458:27;;;;;;;;-1:-1:-1;;40550:35:0;-1:-1:-1;;;40514:21:0;;;;;40500:35;;;;-1:-1:-1;;40550:35:0;;-1:-1:-1;;;40564:21:0;;;;40550:35;;;-1:-1:-1;;40600:35:0;-1:-1:-1;;;40614:21:0;;;;;;;40600:35;;;;;;;40372:275;40661:10;40657:279;;;40704:24;;40688:13;:40;;40704:24;;;;;;;;-1:-1:-1;;40743:28:0;;;;;;;40753:18;;;;;;40743:28;;;;;-1:-1:-1;;40837:36:0;-1:-1:-1;;;40800:22:0;;;;40786:36;;-1:-1:-1;;40837:36:0;;-1:-1:-1;;;40851:22:0;;;;40837:36;;;;;-1:-1:-1;;40888:36:0;-1:-1:-1;;;40902:22:0;;;;-1:-1:-1;;;40888:36:0;;;;;;;40657:279;40965:10;40964:11;:40;;;;;40993:11;40992:12;40964:40;:131;;;;-1:-1:-1;;;;;;41022:35:0;;;;;;:29;:35;;;;;;;;;:72;;-1:-1:-1;;;;;;41061:33:0;;;;;;:29;:33;;;;;;;;41022:72;40946:419;;;41138:23;;41122:13;:39;;41138:23;;;;-1:-1:-1;;41176:27:0;;;;;;;41138:23;41186:17;;;;;;41176:27;;;;;;;;-1:-1:-1;;41268:35:0;-1:-1:-1;;;41232:21:0;;;;;41218:35;;;;-1:-1:-1;;41268:35:0;;-1:-1:-1;;;41282:21:0;;;;41268:35;;;-1:-1:-1;;41318:35:0;-1:-1:-1;;;41332:21:0;;;;;;;41318:35;;;;;;;40946:419;41441:11;;;-1:-1:-1;;;41441:11:0;;;;;41427;;;;;;41413;;;;;;41387:23;;41441:11;41403:7;;;;;41387:13;:23;:::i;:::-;:37;;;;:::i;:::-;:51;;;;:::i;:::-;:65;;;;:::i;:::-;41375:9;:77;;;;;;-1:-1:-1;;;41375:77:0;;;-1:-1:-1;;41375:77:0;;;;;;;;41468:85;;;41480:13;;;;;;;;;;23427:34:1;;41375:77:0;41495:7;;;;23492:2:1;23477:18;;23470:43;41504:11:0;;;;;23529:18:1;;;23522:43;41517:11:0;;;;;23596:2:1;23581:18;;23574:43;-1:-1:-1;;;41530:11:0;;;;23648:3:1;23633:19;;23626:44;41543:9:0;;;;;23701:3:1;23686:19;;23679:44;41468:85:0;;;;;;;23391:3:1;41468:85:0;;;40097:1464;;;;:::o;45290:1607::-;45336:23;45362:24;45380:4;45362:9;:24::i;:::-;45521:9;;45336:50;;-1:-1:-1;45425:21:0;;45397:25;;45533:1;;45521:9;-1:-1:-1;;;45521:9:0;;;;;45486:31;;45504:13;45336:50;45486:31;:::i;:::-;45485:45;;;;:::i;:::-;:49;;;;:::i;:::-;45606:9;;45459:75;;-1:-1:-1;45545:24:0;;45606:9;-1:-1:-1;;;45606:9:0;;;;;45573:29;;45591:11;;;;;45573:15;:29;:::i;:::-;45572:43;;;;:::i;:::-;45545:70;-1:-1:-1;45626:20:0;45668:34;45545:70;45668:15;:34;:::i;:::-;45649:54;;:15;:54;:::i;:::-;45626:77;;45716:31;45734:12;45716:17;:31::i;:::-;45760:27;45790:41;45814:17;45790:21;:41;:::i;:::-;45898:11;;45760:71;;-1:-1:-1;45842:19:0;;45898:11;;;;;;;45877:17;;45893:1;;45877:13;:17;:::i;:::-;45864:9;;:31;;;-1:-1:-1;;;45864:9:0;;;;:31;:::i;:::-;:45;;;;:::i;:::-;45972:13;;45842:67;;;;;-1:-1:-1;45920:26:0;;46003:1;;45842:67;;45950:35;;45972:13;45950:19;:35;:::i;:::-;45949:51;;;;:::i;:::-;:55;;;;:::i;:::-;46065:11;;45920:84;;-1:-1:-1;46015:24:0;;46080:11;;46043:33;;46065:11;;;;;46043:19;:33;:::i;:::-;46042:49;;;;:::i;:::-;46148:7;;46015:76;;-1:-1:-1;46102:20:0;;46159:11;;46126:29;;46148:7;;;;;46126:19;:29;:::i;:::-;46125:45;;;;:::i;:::-;46102:68;-1:-1:-1;46181:24:0;46102:68;46231:37;46252:16;46231:18;:37;:::i;:::-;:52;;;;:::i;:::-;46208:76;;:19;:76;:::i;:::-;46323:13;;46181:103;;-1:-1:-1;46297:58:0;;-1:-1:-1;;;;;46323:13:0;46338:16;46297:17;:58::i;:::-;46392:9;;46366:50;;-1:-1:-1;;;;;46392:9:0;46403:12;46366:17;:50::i;:::-;46433:19;;46429:187;;46469:50;46483:15;46500:18;46469:13;:50::i;:::-;46539:65;;;24262:25:1;;;24318:2;24303:18;;24296:34;;;24346:18;;;24339:34;;;46539:65:0;;24250:2:1;24235:18;46539:65:0;;;;;;;46429:187;46682:14;;46643:73;;-1:-1:-1;;;46643:73:0;;-1:-1:-1;;;;;46682:14:0;;;46643:73;;;9036:51:1;9103:18;;;9096:34;;;46628:12:0;;46658:4;;46643:30;;9009:18:1;;46643:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;46751:15;;46743:60;;46628:88;;-1:-1:-1;;;;;;46751:15:0;;46781:16;;46743:60;;;;46781:16;46751:15;46743:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46729:74:0;;-1:-1:-1;;46814:76:0;;;;46847:31;;2229:25:1;;;46847:31:0;;2217:2:1;2202:18;46847:31:0;;;;;;;46814:76;45325:1572;;;;;;;;;;;;45290:1607::o;3058:136::-;3116:7;3143:43;3147:1;3150;3143:43;;;;;;;;;;;;;;;;;:3;:43::i;46905:500::-;46996:16;;;47010:1;46996:16;;;;;;;;46972:21;;46996:16;;;;;;;;;;-1:-1:-1;46996:16:0;46972:40;;47041:4;47023;47028:1;47023:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47023:23:0;;;:7;;;;;;;;;;:23;;;;47067:15;;:22;;;-1:-1:-1;;;47067:22:0;;;;:15;;;;;:20;;:22;;;;;47023:7;;47067:22;;;;;:15;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47057:4;47062:1;47057:7;;;;;;;;:::i;:::-;-1:-1:-1;;;;;47057:32:0;;;:7;;;;;;;;;:32;47132:15;;47100:62;;47117:4;;47132:15;47150:11;47100:8;:62::i;:::-;47173:15;;:224;;-1:-1:-1;;;47173:224:0;;-1:-1:-1;;;;;47173:15:0;;;;:66;;:224;;47254:11;;47173:15;;47324:4;;47351;;47371:15;;47173:224;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6457:322;6571:6;6546:21;:31;;6533:86;;;;-1:-1:-1;;;6533:86:0;;26370:2:1;6533:86:0;;;26352:21:1;26409:2;26389:18;;;26382:30;26448:31;26428:18;;;26421:59;26497:18;;6533:86:0;26168:353:1;6533:86:0;6627:12;6645:9;-1:-1:-1;;;;;6645:14:0;6667:6;6645:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6626:52;;;6696:7;6683:91;;;;-1:-1:-1;;;6683:91:0;;26728:2:1;6683:91:0;;;26710:21:1;26767:2;26747:18;;;26740:30;26806:34;26786:18;;;26779:62;26877:28;26857:18;;;26850:56;26923:19;;6683:91:0;26526:422:1;47413:425:0;47527:15;;47495:62;;47512:4;;-1:-1:-1;;;;;47527:15:0;47545:11;47495:8;:62::i;:::-;47568:15;;47774;;47568:262;;-1:-1:-1;;;47568:262:0;;47642:4;47568:262;;;27294:34:1;27344:18;;;27337:34;;;47568:15:0;27387:18:1;;;27380:34;;;27430:18;;;27423:34;-1:-1:-1;;;;;47774:15:0;;;27473:19:1;;;27466:44;47804:15:0;27526:19:1;;;27519:35;47568:15:0;;;:31;;47608:9;;27228:19:1;;47568:262:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;206:548:1:-;318:4;347:2;376;365:9;358:21;408:6;402:13;451:6;446:2;435:9;431:18;424:34;476:1;486:140;500:6;497:1;494:13;486:140;;;595:14;;;591:23;;585:30;561:17;;;580:2;557:26;550:66;515:10;;486:140;;;490:3;675:1;670:2;661:6;650:9;646:22;642:31;635:42;745:2;738;734:7;729:2;721:6;717:15;713:29;702:9;698:45;694:54;686:62;;;;206:548;;;;:::o;759:131::-;-1:-1:-1;;;;;834:31:1;;824:42;;814:70;;880:1;877;870:12;895:315;963:6;971;1024:2;1012:9;1003:7;999:23;995:32;992:52;;;1040:1;1037;1030:12;992:52;1079:9;1066:23;1098:31;1123:5;1098:31;:::i;:::-;1148:5;1200:2;1185:18;;;;1172:32;;-1:-1:-1;;;895:315:1:o;1215:180::-;1274:6;1327:2;1315:9;1306:7;1302:23;1298:32;1295:52;;;1343:1;1340;1333:12;1295:52;-1:-1:-1;1366:23:1;;1215:180;-1:-1:-1;1215:180:1:o;1400:247::-;1459:6;1512:2;1500:9;1491:7;1487:23;1483:32;1480:52;;;1528:1;1525;1518:12;1480:52;1567:9;1554:23;1586:31;1611:5;1586:31;:::i;2265:456::-;2342:6;2350;2358;2411:2;2399:9;2390:7;2386:23;2382:32;2379:52;;;2427:1;2424;2417:12;2379:52;2466:9;2453:23;2485:31;2510:5;2485:31;:::i;:::-;2535:5;-1:-1:-1;2592:2:1;2577:18;;2564:32;2605:33;2564:32;2605:33;:::i;:::-;2265:456;;2657:7;;-1:-1:-1;;;2711:2:1;2696:18;;;;2683:32;;2265:456::o;3163:118::-;3249:5;3242:13;3235:21;3228:5;3225:32;3215:60;;3271:1;3268;3261:12;3286:382;3351:6;3359;3412:2;3400:9;3391:7;3387:23;3383:32;3380:52;;;3428:1;3425;3418:12;3380:52;3467:9;3454:23;3486:31;3511:5;3486:31;:::i;:::-;3536:5;-1:-1:-1;3593:2:1;3578:18;;3565:32;3606:30;3565:32;3606:30;:::i;:::-;3655:7;3645:17;;;3286:382;;;;;:::o;3673:529::-;3750:6;3758;3766;3819:2;3807:9;3798:7;3794:23;3790:32;3787:52;;;3835:1;3832;3825:12;3787:52;3874:9;3861:23;3893:31;3918:5;3893:31;:::i;:::-;3943:5;-1:-1:-1;4000:2:1;3985:18;;3972:32;4013:33;3972:32;4013:33;:::i;:::-;4065:7;-1:-1:-1;4124:2:1;4109:18;;4096:32;4137:33;4096:32;4137:33;:::i;:::-;4189:7;4179:17;;;3673:529;;;;;:::o;4207:156::-;4273:20;;4333:4;4322:16;;4312:27;;4302:55;;4353:1;4350;4343:12;4302:55;4207:156;;;:::o;4368:464::-;4453:6;4461;4469;4477;4485;4538:3;4526:9;4517:7;4513:23;4509:33;4506:53;;;4555:1;4552;4545:12;4506:53;4578:27;4595:9;4578:27;:::i;:::-;4568:37;;4624:36;4656:2;4645:9;4641:18;4624:36;:::i;:::-;4614:46;;4679:36;4711:2;4700:9;4696:18;4679:36;:::i;:::-;4669:46;;4734:36;4766:2;4755:9;4751:18;4734:36;:::i;:::-;4724:46;;4789:37;4821:3;4810:9;4806:19;4789:37;:::i;:::-;4779:47;;4368:464;;;;;;;;:::o;5340:388::-;5408:6;5416;5469:2;5457:9;5448:7;5444:23;5440:32;5437:52;;;5485:1;5482;5475:12;5437:52;5524:9;5511:23;5543:31;5568:5;5543:31;:::i;:::-;5593:5;-1:-1:-1;5650:2:1;5635:18;;5622:32;5663:33;5622:32;5663:33;:::i;5733:380::-;5812:1;5808:12;;;;5855;;;5876:61;;5930:4;5922:6;5918:17;5908:27;;5876:61;5983:2;5975:6;5972:14;5952:18;5949:38;5946:161;;6029:10;6024:3;6020:20;6017:1;6010:31;6064:4;6061:1;6054:15;6092:4;6089:1;6082:15;5946:161;;5733:380;;;:::o;6118:356::-;6320:2;6302:21;;;6339:18;;;6332:30;6398:34;6393:2;6378:18;;6371:62;6465:2;6450:18;;6118:356::o;8299:184::-;8369:6;8422:2;8410:9;8401:7;8397:23;8393:32;8390:52;;;8438:1;8435;8428:12;8390:52;-1:-1:-1;8461:16:1;;8299:184;-1:-1:-1;8299:184:1:o;9873:245::-;9940:6;9993:2;9981:9;9972:7;9968:23;9964:32;9961:52;;;10009:1;10006;9999:12;9961:52;10041:9;10035:16;10060:28;10082:5;10060:28;:::i;12149:416::-;12351:2;12333:21;;;12390:2;12370:18;;;12363:30;12429:34;12424:2;12409:18;;12402:62;-1:-1:-1;;;12495:2:1;12480:18;;12473:50;12555:3;12540:19;;12149:416::o;16054:401::-;16256:2;16238:21;;;16295:2;16275:18;;;16268:30;16334:34;16329:2;16314:18;;16307:62;-1:-1:-1;;;16400:2:1;16385:18;;16378:35;16445:3;16430:19;;16054:401::o;16460:399::-;16662:2;16644:21;;;16701:2;16681:18;;;16674:30;16740:34;16735:2;16720:18;;16713:62;-1:-1:-1;;;16806:2:1;16791:18;;16784:33;16849:3;16834:19;;16460:399::o;17690:127::-;17751:10;17746:3;17742:20;17739:1;17732:31;17782:4;17779:1;17772:15;17806:4;17803:1;17796:15;17822:125;17887:9;;;17908:10;;;17905:36;;;17921:18;;:::i;18382:168::-;18455:9;;;18486;;18503:15;;;18497:22;;18483:37;18473:71;;18524:18;;:::i;18555:127::-;18616:10;18611:3;18607:20;18604:1;18597:31;18647:4;18644:1;18637:15;18671:4;18668:1;18661:15;18687:120;18727:1;18753;18743:35;;18758:18;;:::i;:::-;-1:-1:-1;18792:9:1;;18687:120::o;18812:128::-;18879:9;;;18900:11;;;18897:37;;;18914:18;;:::i;20336:209::-;-1:-1:-1;;20500:38:1;;;;20482:57;;20470:2;20455:18;;20336:209::o;22988:148::-;23076:4;23055:12;;;23069;;;23051:31;;23094:13;;23091:39;;;23110:18;;:::i;23734:165::-;23772:1;23806:4;23803:1;23799:12;23830:3;23820:37;;23837:18;;:::i;:::-;23889:3;23882:4;23879:1;23875:12;23871:22;23866:27;;;23734:165;;;;:::o;23904:151::-;23994:4;23987:12;;;23973;;;23969:31;;24012:14;;24009:40;;;24029:18;;:::i;24795:127::-;24856:10;24851:3;24847:20;24844:1;24837:31;24887:4;24884:1;24877:15;24911:4;24908:1;24901:15;24927:251;24997:6;25050:2;25038:9;25029:7;25025:23;25021:32;25018:52;;;25066:1;25063;25056:12;25018:52;25098:9;25092:16;25117:31;25142:5;25117:31;:::i;25183:980::-;25445:4;25493:3;25482:9;25478:19;25524:6;25513:9;25506:25;25550:2;25588:6;25583:2;25572:9;25568:18;25561:34;25631:3;25626:2;25615:9;25611:18;25604:31;25655:6;25690;25684:13;25721:6;25713;25706:22;25759:3;25748:9;25744:19;25737:26;;25798:2;25790:6;25786:15;25772:29;;25819:1;25829:195;25843:6;25840:1;25837:13;25829:195;;;25908:13;;-1:-1:-1;;;;;25904:39:1;25892:52;;25999:15;;;;25964:12;;;;25940:1;25858:9;25829:195;;;-1:-1:-1;;;;;;;26080:32:1;;;;26075:2;26060:18;;26053:60;-1:-1:-1;;;26144:3:1;26129:19;26122:35;26041:3;25183:980;-1:-1:-1;;;25183:980:1:o;27565:306::-;27653:6;27661;27669;27722:2;27710:9;27701:7;27697:23;27693:32;27690:52;;;27738:1;27735;27728:12;27690:52;27767:9;27761:16;27751:26;;27817:2;27806:9;27802:18;27796:25;27786:35;;27861:2;27850:9;27846:18;27840:25;27830:35;;27565:306;;;;;:::o

Swarm Source

ipfs://794ace93881b91e45ae3974c7478eb0e89875a605b20422aeb718d2199860ead
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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