ETH Price: $3,474.94 (+6.10%)
Gas: 8 Gwei

Token

Rebase AI (RAI)
 

Overview

Max Total Supply

1,613,664.197510527868212003 RAI

Holders

103

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
4,162.558959198520995793 RAI

Value
$0.00
0xebfdc68363057beebfc331b0da871e696d2d0b62
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RAI

Compiler Version
v0.8.23+commit.f704f362

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 3 : testrebase-v2-43.sol
// SPDX-License-Identifier: MIT
/**

######   #######  ######        ##   #####   #######       ##    ####   
#######  #######  #######      ###  #######  #######      ###    ####   
      #                 #        #                          #           
######   ####     ######      ####  ######   ####        ####     ##    
## ##    ##       #    ##    #####       ##  ##         #####     ##    
##  ##   #######  #######   ##  ##  #######  #######   ##  ##    ####   
##   ##  #######  ######   ##   ##   #####   #######  ##   ##    ####   

Welcome to RAI - Rebase AI - The first AI controlled Rebase Token

Not just a rebase token, the first step in the native integration of
AI and blockchain technology!

RAI is building an AI native and secured Layer 1 blockchain.

Meet RAI at :

website: https://iamrai.xyz
telegram: https://t.me/iamraixyz
Twitter/X: https://twitter.com/IamRAI_xyz

This is a V2 contract deployed to replace the original contract:
0x93e07dabda565f1a8513351038c1be23ba922b45
 */
pragma solidity ^0.8.12;

import "./testrebase-v2-30-library.sol";

contract RAI is ERC20, Ownable {
    using SafeMath for uint256;
    using EnumerableSet for EnumerableSet.AddressSet;


    //set manager and tax wallet address
    address public manager = 0xA7699dc9A4338e79ec60A2EF7cEBFe7785B2d567;
    address public taxWallet = 0xFF56db1A646f2EB995DD4bD78Aff05fE06dFBAdA;

    uint256 public rebasePercentage = 1;
    uint256 public transferTaxPercentage = 1;

    // Keep track of all holders
    EnumerableSet.AddressSet private allHolders;

    // Blacklist mapping
    mapping(address => bool) private blacklist;   

    IUniswapV2Router02 public immutable uniswapV2Router;
    address public immutable uniswapV2Pair;
    address public constant deadAddress = address(0xdead);
    address public WETH9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;

    bool private swapping;

    uint256 public swapTokensAtAmount;

    // Enable or disable trading
    bool public tradingActive = false;
    bool public swapEnabled = true;
    bool public contractPaused = true;

    uint256 public buyTotalFees;
    uint256 public buyDevFee;
    uint256 public buyLiquidityFee;

    uint256 public sellTotalFees;
    uint256 public sellDevFee;
    uint256 public sellLiquidityFee;

    /******************/

    // exlcude from fees and max transaction amount
    mapping(address => bool) private _isExcludedFromFees;
    mapping(address => bool) public _isExcludedMaxTransactionAmount;

    event ExcludeFromFees(address indexed account, bool isExcluded);
    event AddedToBlacklist(address indexed account);
    event RemovedFromBlacklist(address indexed account);
    event ContractPaused(address indexed account, bool _paused);
    event TransferOnContractPaused(
        address indexed from,
        address indexed to,
        uint256 amount
    );

    event taxWalletUpdated(
        address indexed newWallet,
        address indexed oldWallet
    );

    constructor() ERC20("Rebase AI", "RAI") {
        IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
            0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
        );

        excludeFromMaxTransaction(address(_uniswapV2Router), true);
        uniswapV2Router = _uniswapV2Router;

        uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
            .createPair(address(this), WETH9);
        excludeFromMaxTransaction(address(uniswapV2Pair), true);

        uint256 _buyDevFee = 1;
        uint256 _buyLiquidityFee = 0;

        uint256 _sellTaxFee = 1;
        uint256 _sellLiquidityFee = 0;

        uint256 totalSupply = 224150 * 10**18;

        swapTokensAtAmount = (totalSupply * 10) / 10000; // 0.05% swap wallet

        buyDevFee = _buyDevFee;
        buyLiquidityFee = _buyLiquidityFee;
        buyTotalFees = buyDevFee + buyLiquidityFee;

        sellDevFee = _sellTaxFee;
        sellLiquidityFee = _sellLiquidityFee;
        sellTotalFees = sellDevFee + sellLiquidityFee;

        // exclude from paying fees or having max transaction amount
        excludeFromFees(owner(), true);
        excludeFromFees(manager, true);
        excludeFromFees(address(this), true);
        excludeFromFees(address(0xdead), true);
        excludeFromFees(address(0), true);

        excludeFromMaxTransaction(manager, true);
        excludeFromMaxTransaction(owner(), true);
        excludeFromMaxTransaction(address(this), true);
        excludeFromMaxTransaction(address(0xdead), true);
        excludeFromMaxTransaction(address(0), true);

        /*
            _mint is an internal function in ERC20.sol that is only called here,
            and CANNOT be called ever again
        */
        _mint(msg.sender, totalSupply);
        allHolders.add(msg.sender); // Add the initial owner to the set
    }

    receive() external payable {}

    // Modifier that allows only the owner or manager to call a function
    modifier onlyOwnerOrManager() {
        require(
            msg.sender == owner() || msg.sender == manager,
            "Not owner or manager"
        );
        _;
    }

    // Modifier to check if the address is not blacklisted
    modifier notBlacklisted(address _address) {
        require(!blacklist[_address], "Address is blacklisted");
        _;
    }

    // once enabled, can never be turned off
    function enableTrading() external onlyOwnerOrManager {
        tradingActive = true;
        swapEnabled = true;
    }

    // only use to disable contract sales if absolutely necessary (emergency use only)
    function updateSwapEnabled(bool enabled) external onlyOwnerOrManager {
        swapEnabled = enabled;
    }

    // only use to disable contract buys/sales if absolutely necessary (emergency use only)
    function updateContractPaused(bool _paused) external onlyOwnerOrManager {
        contractPaused = _paused;
        emit ContractPaused(msg.sender, _paused);
    }

    // Set or change the manager (onlyOwnerOrManager)
    function setManager(address _manager) external onlyOwnerOrManager {
        //remove old manager and add new manager to excludeFromFees

        excludeFromFees(_manager, true);
        excludeFromMaxTransaction(_manager, true);

        if (manager != owner()) {
            excludeFromFees(manager, false);
            excludeFromMaxTransaction(manager, false);
        }

        manager = _manager;
    }

    // Function to add an address to the blacklist and remove from allHolders (onlyOwnerOrManager)
    function addToBlacklist(address _address) external onlyOwnerOrManager {
        blacklist[_address] = true;

        // Check if the address is in allHolders and remove it
        allHolders.remove(_address);
        emit AddedToBlacklist(_address);
    }

    // Function to remove an address from the blacklist (onlyOwnerOrManager)
    function removeFromBlacklist(address _address) external onlyOwnerOrManager {
        blacklist[_address] = false;

        //add back to allholders if there is a balance of tokens
        if (balanceOf(_address) > 0) {
            allHolders.add(_address);
        }
        emit RemovedFromBlacklist(_address);
    }

    // Function to manually add an address to the allHolders array (onlyOwnerOrManager)
    function addToAllHolders(address _address) external onlyOwnerOrManager {
        require(!allHolders.contains(_address), "Address already a holder");
        require(!blacklist[_address], "Address is blacklisted");

        allHolders.add(_address);
    }

    // Update allHolders set when transfers occur
    function updateAllHolders(
        address from,
        address to,
        uint256 amount
    ) private {
        allHolders.add(to);
        if (from != address(this) && balanceOf(from).sub(amount) == 0) {
            allHolders.remove(from);
        }
    }

    // Function to update the transfer tax percentage (onlyOwnerOrManager)
    function setTransferTaxPercentage(uint256 _transferTaxPercentage)
        external
        onlyOwnerOrManager
    {
        transferTaxPercentage = _transferTaxPercentage;
    }

    // Function to update the rebase percentage (onlyOwnerOrManager)
    function setRebasePercentage(uint256 _rebasePercentage)
        external
        onlyOwnerOrManager
    {
        rebasePercentage = _rebasePercentage;
    }

    // change the minimum amount of tokens to sell from fees
    function updateSwapTokensAtAmount(uint256 newAmount)
        external
        onlyOwnerOrManager
        returns (bool)
    {
        require(
            newAmount >= (totalSupply() * 1) / 100000,
            "Swap amount cannot be lower than 0.001% total supply."
        );
        require(
            newAmount <= (totalSupply() * 5) / 1000,
            "Swap amount cannot be higher than 0.5% total supply."
        );
        swapTokensAtAmount = newAmount;
        return true;
    }

    function excludeFromMaxTransaction(address updAds, bool isEx)
        public
        onlyOwnerOrManager
    {
        _isExcludedMaxTransactionAmount[updAds] = isEx;
    }

    function updateBuyFees(uint256 _devFee, uint256 _liquidityFee)
        external
        onlyOwnerOrManager
    {
        buyDevFee = _devFee;
        buyLiquidityFee = _liquidityFee;
        buyTotalFees = buyDevFee + buyLiquidityFee;
        require(buyTotalFees <= 10, "Must keep fees at 10% or less");
    }

    function updateSellFees(uint256 _devFee, uint256 _liquidityFee)
        external
        onlyOwnerOrManager
    {
        sellDevFee = _devFee;
        sellLiquidityFee = _liquidityFee;
        sellTotalFees = sellDevFee + sellLiquidityFee;
        require(sellTotalFees <= 15, "Must keep fees at 15% or less");
    }

    function excludeFromFees(address account, bool excluded)
        public
        onlyOwnerOrManager
    {
        _isExcludedFromFees[account] = excluded;
    }

    function updateTaxWallet(address newTaxWallet) external onlyOwnerOrManager {
        emit taxWalletUpdated(newTaxWallet, taxWallet);
        taxWallet = newTaxWallet;
    }

    function isExcludedFromFees(address account) public view returns (bool) {
        return _isExcludedFromFees[account];
    }

    function isBlacklisted(address account) public view returns (bool) {
        return blacklist[account];
    }

    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal override notBlacklisted(from) notBlacklisted(to) {
        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;
        }

        //do not allow transfers exepct from owner/manager/contract if contract is paused
        if (contractPaused) {
            emit TransferOnContractPaused(from, to, amount);
            require(
                _isExcludedFromFees[from] || _isExcludedFromFees[to],
                "Contract is Paused."
            );
            // Update allHolders set when transfers occur
            updateAllHolders(from, to, amount);
            super._transfer(from, to, amount);

            return;
        }

        if (!tradingActive && !_isExcludedFromFees[from]) {
            require(
                to != uniswapV2Pair || from != uniswapV2Pair,
                "Trading is not active."
            );
        }

        uint256 contractTokenBalance = balanceOf(address(this));

        bool canSwap = contractTokenBalance >= swapTokensAtAmount;

        if (
            canSwap &&
            swapEnabled &&
            !swapping &&
            to == uniswapV2Pair &&
            !_isExcludedFromFees[from] &&
            !_isExcludedFromFees[to]
        ) {
            swapping = true;

            swapBack();

            swapping = false;
        }

        bool takeFee = !swapping;

        // if any account belongs to _isExcludedFromFee account then remove the fee
        if (_isExcludedFromFees[from] || _isExcludedFromFees[to]) {
            takeFee = false;
        }

        uint256 fees = 0;
        uint256 tokensForLiquidity = 0;
        uint256 tokensForDev = 0;
        // only take fees on buys/sells, do not take on wallet transfers
        if (takeFee) {
            // on sell
            if (to == uniswapV2Pair && sellTotalFees > 0) {
                fees = amount.mul(sellTotalFees).div(100);
                tokensForLiquidity = (fees * sellLiquidityFee) / sellTotalFees;
                tokensForDev = (fees * sellDevFee) / sellTotalFees;
            }
            // on buy
            else if (from == uniswapV2Pair && buyTotalFees > 0) {
                fees = amount.mul(buyTotalFees).div(100);
                tokensForLiquidity = (fees * buyLiquidityFee) / buyTotalFees;
                tokensForDev = (fees * buyDevFee) / buyTotalFees;
            }

            if (fees > 0) {
                super._transfer(from, address(this), fees);
            }
            if (tokensForLiquidity > 0) {
                super._transfer(
                    address(this),
                    uniswapV2Pair,
                    tokensForLiquidity
                );
            }

            amount -= fees;
        }

        // Update allHolders set when transfers occur
        updateAllHolders(from, to, amount);

        super._transfer(from, to, amount);
    }

    function swapTokensForETH(uint256 tokenAmount) private {
        // generate the uniswap pair path of token -> weth
        address[] memory path = new address[](2);
        path[0] = address(this);
        path[1] = WETH9;

        _approve(address(this), address(uniswapV2Router), tokenAmount);

        // make the swap
        uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens(
            tokenAmount,
            0, // accept any amount of ETH
            path,
            taxWallet,
            block.timestamp
        );
    }

    function swapBack() private {
        uint256 contractBalance = balanceOf(address(this));
        if (contractBalance == 0) {
            return;
        }

        if (contractBalance > swapTokensAtAmount * 20) {
            contractBalance = swapTokensAtAmount * 20;
        }

        swapTokensForETH(contractBalance);
    }

    function _transferWithoutHolderUpdate(
        address sender,
        address recipient,
        uint256 amount
    ) internal {
        super._transfer(sender, recipient, amount);
    }

    // Function to trigger the rebase
    function rebase() external onlyOwnerOrManager {
        uint256 totalSupplyBefore = totalSupply();
        uint256 rebaseAmount = (totalSupplyBefore * rebasePercentage) / 100;

        // Increase total supply
        _mint(address(this), rebaseAmount);

        // Distribute the newly minted tokens to all existing holders, including the liquidity pool uniswapV2Pair
        for (uint256 i = 0; i < allHolders.length(); i++) {
            address account = allHolders.at(i);

            uint256 previousBalance = balanceOf(account);
            uint256 holderRebaseAmount = (previousBalance * rebasePercentage) /
                100;

            // Use _transferWithoutHolderUpdate to update the balance
            _transferWithoutHolderUpdate(
                address(this),
                account,
                holderRebaseAmount
            );
        }
    }
}

File 2 of 3 : testrebase-v2-30-library.sol
// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.12;

import { EnumerableSet } from "./EnumerableSet.sol";


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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

/* pragma solidity ^0.8.0; */

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/extensions/IERC20Metadata.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/extensions/IERC20Metadata.sol)

/* pragma solidity ^0.8.0; */

/* import "../IERC20.sol"; */

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the symbol of the token.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

////// lib/openzeppelin-contracts/contracts/token/ERC20/ERC20.sol
// OpenZeppelin Contracts v4.4.0 (token/ERC20/ERC20.sol)

/* pragma solidity ^0.8.0; */

/* import "./IERC20.sol"; */
/* import "./extensions/IERC20Metadata.sol"; */
/* import "../../utils/Context.sol"; */

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5.05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless this function is
     * overridden;
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * Requirements:
     *
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        unchecked {
            _approve(sender, _msgSender(), currentAllowance - amount);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    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);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(sender, recipient, amount);
    }

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }


    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.
     *
     * This internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    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);
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

////// lib/openzeppelin-contracts/contracts/utils/math/SafeMath.sol
// OpenZeppelin Contracts v4.4.0 (utils/math/SafeMath.sol)

/* pragma solidity ^0.8.0; */

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // 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 (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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

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

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

File 3 of 3 : EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.20;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```solidity
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position is the index of the value in the `values` array plus 1.
        // Position 0 is used to mean a value is not in the set.
        mapping(bytes32 value => uint256) _positions;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._positions[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We cache the value's position to prevent multiple reads from the same storage slot
        uint256 position = set._positions[value];

        if (position != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 valueIndex = position - 1;
            uint256 lastIndex = set._values.length - 1;

            if (valueIndex != lastIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the lastValue to the index where the value to delete is
                set._values[valueIndex] = lastValue;
                // Update the tracked position of the lastValue (that was just moved)
                set._positions[lastValue] = position;
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the tracked position for the deleted slot
            delete set._positions[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._positions[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"AddedToBlacklist","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":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"_paused","type":"bool"}],"name":"ContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"bool","name":"isExcluded","type":"bool"}],"name":"ExcludeFromFees","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":"account","type":"address"}],"name":"RemovedFromBlacklist","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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferOnContractPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newWallet","type":"address"},{"indexed":true,"internalType":"address","name":"oldWallet","type":"address"}],"name":"taxWalletUpdated","type":"event"},{"inputs":[],"name":"WETH9","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_isExcludedMaxTransactionAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToAllHolders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"addToBlacklist","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"deadAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enableTrading","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":"updAds","type":"address"},{"internalType":"bool","name":"isEx","type":"bool"}],"name":"excludeFromMaxTransaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isExcludedFromFees","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rebase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rebasePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeFromBlacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sellDevFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellLiquidityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sellTotalFees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_manager","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rebasePercentage","type":"uint256"}],"name":"setRebasePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_transferTaxPercentage","type":"uint256"}],"name":"setTransferTaxPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"swapEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapTokensAtAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"taxWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"transferTaxPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateBuyFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"updateContractPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_devFee","type":"uint256"},{"internalType":"uint256","name":"_liquidityFee","type":"uint256"}],"name":"updateSellFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"enabled","type":"bool"}],"name":"updateSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAmount","type":"uint256"}],"name":"updateSwapTokensAtAmount","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newTaxWallet","type":"address"}],"name":"updateTaxWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405273a7699dc9a4338e79ec60a2ef7cebfe7785b2d56760065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073ff56db1a646f2eb995dd4bd78aff05fe06dfbada60075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600855600160095573c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600d5f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f600f5f6101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff0219169083151502179055506001600f60026101000a81548160ff02191690831515021790555034801562000165575f80fd5b506040518060400160405280600981526020017f52656261736520414900000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f52414900000000000000000000000000000000000000000000000000000000008152508160039081620001e3919062000da6565b508060049081620001f5919062000da6565b505050620002186200020c620005b060201b60201c565b620005b760201b60201c565b5f737a250d5630b4cf539739df2c5dacb4c659f2488d9050620002438160016200067a60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620002c1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190620002e7919062000eef565b73ffffffffffffffffffffffffffffffffffffffff1663c9c6539630600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040518363ffffffff1660e01b81526004016200034492919062000f30565b6020604051808303815f875af115801562000361573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019062000387919062000eef565b73ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1681525050620003cf60a05160016200067a60201b60201c565b5f600190505f80600190505f80692f7732231a66e09800009050612710600a82620003fb919062000f88565b62000407919062000fff565b600e8190555084601181905550836012819055506012546011546200042d919062001036565b601081905550826014819055508160158190555060155460145462000453919062001036565b6013819055506200047b6200046d620007aa60201b60201c565b6001620007d260201b60201c565b620004af60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166001620007d260201b60201c565b620004c2306001620007d260201b60201c565b620004d761dead6001620007d260201b60201c565b620004ea5f6001620007d260201b60201c565b6200051e60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660016200067a60201b60201c565b6200054062000532620007aa60201b60201c565b60016200067a60201b60201c565b620005533060016200067a60201b60201c565b6200056861dead60016200067a60201b60201c565b6200057b5f60016200067a60201b60201c565b6200058d33826200090260201b60201c565b620005a333600a62000a7260201b90919060201c565b5050505050505062001188565b5f33905090565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200068a620007aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148062000710575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b62000752576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200074990620010ce565b60405180910390fd5b8060175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b620007e2620007aa60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148062000868575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b620008aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008a190620010ce565b60405180910390fd5b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000973576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200096a906200113c565b60405180910390fd5b620009865f838362000aa760201b60201c565b8060025f82825462000999919062001036565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254620009ed919062001036565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405162000a5391906200116d565b60405180910390a362000a6e5f838362000aac60201b60201c565b5050565b5f62000a9f835f018373ffffffffffffffffffffffffffffffffffffffff165f1b62000ab160201b60201c565b905092915050565b505050565b505050565b5f62000ac4838362000b2260201b60201c565b62000b1857825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f20819055506001905062000b1c565b5f90505b92915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168062000bbe57607f821691505b60208210810362000bd45762000bd362000b79565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f6008830262000c387fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000bfb565b62000c44868362000bfb565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f62000c8e62000c8862000c828462000c5c565b62000c65565b62000c5c565b9050919050565b5f819050919050565b62000ca98362000c6e565b62000cc162000cb88262000c95565b84845462000c07565b825550505050565b5f90565b62000cd762000cc9565b62000ce481848462000c9e565b505050565b5b8181101562000d0b5762000cff5f8262000ccd565b60018101905062000cea565b5050565b601f82111562000d5a5762000d248162000bda565b62000d2f8462000bec565b8101602085101562000d3f578190505b62000d5762000d4e8562000bec565b83018262000ce9565b50505b505050565b5f82821c905092915050565b5f62000d7c5f198460080262000d5f565b1980831691505092915050565b5f62000d96838362000d6b565b9150826002028217905092915050565b62000db18262000b42565b67ffffffffffffffff81111562000dcd5762000dcc62000b4c565b5b62000dd9825462000ba6565b62000de682828562000d0f565b5f60209050601f83116001811462000e1c575f841562000e07578287015190505b62000e13858262000d89565b86555062000e82565b601f19841662000e2c8662000bda565b5f5b8281101562000e555784890151825560018201915060208501945060208101905062000e2e565b8683101562000e75578489015162000e71601f89168262000d6b565b8355505b6001600288020188555050505b505050505050565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f62000eb98262000e8e565b9050919050565b62000ecb8162000ead565b811462000ed6575f80fd5b50565b5f8151905062000ee98162000ec0565b92915050565b5f6020828403121562000f075762000f0662000e8a565b5b5f62000f168482850162000ed9565b91505092915050565b62000f2a8162000ead565b82525050565b5f60408201905062000f455f83018562000f1f565b62000f54602083018462000f1f565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f62000f948262000c5c565b915062000fa18362000c5c565b925082820262000fb18162000c5c565b9150828204841483151762000fcb5762000fca62000f5b565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f6200100b8262000c5c565b9150620010188362000c5c565b9250826200102b576200102a62000fd2565b5b828204905092915050565b5f620010428262000c5c565b91506200104f8362000c5c565b92508282019050808211156200106a576200106962000f5b565b5b92915050565b5f82825260208201905092915050565b7f4e6f74206f776e6572206f72206d616e616765720000000000000000000000005f82015250565b5f620010b660148362001070565b9150620010c38262001080565b602082019050919050565b5f6020820190508181035f830152620010e781620010a8565b9050919050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f62001124601f8362001070565b91506200113182620010ee565b602082019050919050565b5f6020820190508181035f830152620011558162001116565b9050919050565b620011678162000c5c565b82525050565b5f602082019050620011825f8301846200115c565b92915050565b60805160a051614c1a620011e25f395f81816111d101528181612c3c01528181612c9201528181612d7101528181612f6b01528181613035015261311c01525f8181610d1c01528181613ab00152613ad70152614c1a5ff3fe6080604052600436106102b1575f3560e01c80637571336a11610174578063ba15984c116100db578063d85ba06311610094578063f11a24d31161006e578063f11a24d314610a58578063f2fde38b14610a82578063f637434214610aaa578063fe575a8714610ad4576102b8565b8063d85ba063146109c8578063dd62ed3e146109f2578063e2f4560514610a2e576102b8565b8063ba15984c146108c0578063bbc0c742146108ea578063bc917e6114610914578063c02466681461093c578063d0ebdbe714610964578063d257b34f1461098c576102b8565b806396bb3d9c1161012d57806396bb3d9c146107ca5780639c3b4fdc146107f2578063a0d82dc51461081c578063a8c7ea4714610846578063a9059cbb1461086e578063af14052c146108aa576102b8565b80637571336a146106e65780638a67456a1461070e5780638a8c523c146107385780638da5cb5b1461074e578063924de9b71461077857806395d89b41146107a0576102b8565b806344337ea11161021857806366ca9b83116101d157806366ca9b83146105f05780636a486a8e146106185780636ddd17131461064257806370a082311461066c578063715018a6146106a857806374c9f603146106be576102b8565b806344337ea1146104e6578063481c6a751461050e57806349bd5a5e146105385780634aa4a4fc146105625780634fbee1931461058c578063537df3b6146105c8576102b8565b806318160ddd1161026a57806318160ddd146103da57806323b872dd1461040457806327c8f835146104405780632dc0562d1461046a5780632fcbbf8114610494578063313ce567146104bc576102b8565b806302dbd8f8146102bc57806306fdde03146102e4578063095ea7b31461030e5780630b8682771461034a57806310d5de53146103745780631694505e146103b0576102b8565b366102b857005b5f80fd5b3480156102c7575f80fd5b506102e260048036038101906102dd9190613bbf565b610b10565b005b3480156102ef575f80fd5b506102f8610c4a565b6040516103059190613c87565b60405180910390f35b348015610319575f80fd5b50610334600480360381019061032f9190613d01565b610cda565b6040516103419190613d59565b60405180910390f35b348015610355575f80fd5b5061035e610cf7565b60405161036b9190613d81565b60405180910390f35b34801561037f575f80fd5b5061039a60048036038101906103959190613d9a565b610cfd565b6040516103a79190613d59565b60405180910390f35b3480156103bb575f80fd5b506103c4610d1a565b6040516103d19190613e20565b60405180910390f35b3480156103e5575f80fd5b506103ee610d3e565b6040516103fb9190613d81565b60405180910390f35b34801561040f575f80fd5b5061042a60048036038101906104259190613e39565b610d47565b6040516104379190613d59565b60405180910390f35b34801561044b575f80fd5b50610454610e39565b6040516104619190613e98565b60405180910390f35b348015610475575f80fd5b5061047e610e3f565b60405161048b9190613e98565b60405180910390f35b34801561049f575f80fd5b506104ba60048036038101906104b59190613d9a565b610e64565b005b3480156104c7575f80fd5b506104d0611026565b6040516104dd9190613ecc565b60405180910390f35b3480156104f1575f80fd5b5061050c60048036038101906105079190613d9a565b61102e565b005b348015610519575f80fd5b506105226111aa565b60405161052f9190613e98565b60405180910390f35b348015610543575f80fd5b5061054c6111cf565b6040516105599190613e98565b60405180910390f35b34801561056d575f80fd5b506105766111f3565b6040516105839190613e98565b60405180910390f35b348015610597575f80fd5b506105b260048036038101906105ad9190613d9a565b611218565b6040516105bf9190613d59565b60405180910390f35b3480156105d3575f80fd5b506105ee60048036038101906105e99190613d9a565b61126a565b005b3480156105fb575f80fd5b5061061660048036038101906106119190613bbf565b6113f6565b005b348015610623575f80fd5b5061062c611530565b6040516106399190613d81565b60405180910390f35b34801561064d575f80fd5b50610656611536565b6040516106639190613d59565b60405180910390f35b348015610677575f80fd5b50610692600480360381019061068d9190613d9a565b611549565b60405161069f9190613d81565b60405180910390f35b3480156106b3575f80fd5b506106bc61158e565b005b3480156106c9575f80fd5b506106e460048036038101906106df9190613d9a565b611615565b005b3480156106f1575f80fd5b5061070c60048036038101906107079190613f0f565b61179f565b005b348015610719575f80fd5b506107226118c3565b60405161072f9190613d59565b60405180910390f35b348015610743575f80fd5b5061074c6118d6565b005b348015610759575f80fd5b506107626119d9565b60405161076f9190613e98565b60405180910390f35b348015610783575f80fd5b5061079e60048036038101906107999190613f4d565b611a01565b005b3480156107ab575f80fd5b506107b4611aea565b6040516107c19190613c87565b60405180910390f35b3480156107d5575f80fd5b506107f060048036038101906107eb9190613f78565b611b7a565b005b3480156107fd575f80fd5b50610806611c50565b6040516108139190613d81565b60405180910390f35b348015610827575f80fd5b50610830611c56565b60405161083d9190613d81565b60405180910390f35b348015610851575f80fd5b5061086c60048036038101906108679190613f78565b611c5c565b005b348015610879575f80fd5b50610894600480360381019061088f9190613d01565b611d32565b6040516108a19190613d59565b60405180910390f35b3480156108b5575f80fd5b506108be611d4f565b005b3480156108cb575f80fd5b506108d4611ec0565b6040516108e19190613d81565b60405180910390f35b3480156108f5575f80fd5b506108fe611ec6565b60405161090b9190613d59565b60405180910390f35b34801561091f575f80fd5b5061093a60048036038101906109359190613f4d565b611ed8565b005b348015610947575f80fd5b50610962600480360381019061095d9190613f0f565b61200f565b005b34801561096f575f80fd5b5061098a60048036038101906109859190613d9a565b612133565b005b348015610997575f80fd5b506109b260048036038101906109ad9190613f78565b61230a565b6040516109bf9190613d59565b60405180910390f35b3480156109d3575f80fd5b506109dc6124ae565b6040516109e99190613d81565b60405180910390f35b3480156109fd575f80fd5b50610a186004803603810190610a139190613fa3565b6124b4565b604051610a259190613d81565b60405180910390f35b348015610a39575f80fd5b50610a42612536565b604051610a4f9190613d81565b60405180910390f35b348015610a63575f80fd5b50610a6c61253c565b604051610a799190613d81565b60405180910390f35b348015610a8d575f80fd5b50610aa86004803603810190610aa39190613d9a565b612542565b005b348015610ab5575f80fd5b50610abe612638565b604051610acb9190613d81565b60405180910390f35b348015610adf575f80fd5b50610afa6004803603810190610af59190613d9a565b61263e565b604051610b079190613d59565b60405180910390f35b610b186119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b9d575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd39061402b565b60405180910390fd5b8160148190555080601581905550601554601454610bfa9190614076565b601381905550600f6013541115610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d906140f3565b60405180910390fd5b5050565b606060038054610c599061413e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c859061413e565b8015610cd05780601f10610ca757610100808354040283529160200191610cd0565b820191905f5260205f20905b815481529060010190602001808311610cb357829003601f168201915b5050505050905090565b5f610ced610ce6612690565b8484612697565b6001905092915050565b60085481565b6017602052805f5260405f205f915054906101000a900460ff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f600254905090565b5f610d5384848461285a565b5f60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610d9a612690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e10906141de565b60405180910390fd5b610e2d85610e25612690565b858403612697565b60019150509392505050565b61dead81565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e6c6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ef1575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f279061402b565b60405180910390fd5b610f4481600a61317590919063ffffffff16565b15610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614246565b60405180910390fd5b600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561100e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611005906142ae565b60405180910390fd5b61102281600a6131a290919063ffffffff16565b5050565b5f6012905090565b6110366119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110bb575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f19061402b565b60405180910390fd5b6001600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061116381600a6131cf90919063ffffffff16565b508073ffffffffffffffffffffffffffffffffffffffff167ff9b68063b051b82957fa193585681240904fed808db8b30fc5a2d2202c6ed62760405160405180910390a250565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000000000000000000000000000000000000000000081565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6112726119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112f7575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d9061402b565b60405180910390fd5b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f61139482611549565b11156113b0576113ae81600a6131a290919063ffffffff16565b505b8073ffffffffffffffffffffffffffffffffffffffff167f2b6bf71b58b3583add364b3d9060ebf8019650f65f5be35f5464b9cb3e4ba2d460405160405180910390a250565b6113fe6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611483575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99061402b565b60405180910390fd5b81601181905550806012819055506012546011546114e09190614076565b601081905550600a601054111561152c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152390614316565b60405180910390fd5b5050565b60135481565b600f60019054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611596612690565b73ffffffffffffffffffffffffffffffffffffffff166115b46119d9565b73ffffffffffffffffffffffffffffffffffffffff161461160a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116019061437e565b60405180910390fd5b6116135f6131fc565b565b61161d6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116a2575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d89061402b565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb3dd4b0ccf73b51db7cb2a59fb88d1082b0fa9389d4ce0e85100fe3b26af78c460405160405180910390a38060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117a76119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061182c575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61186b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118629061402b565b60405180910390fd5b8060175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b600f60029054906101000a900460ff1681565b6118de6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611963575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6119a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119999061402b565b60405180910390fd5b6001600f5f6101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a096119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611a8e575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac49061402b565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b606060048054611af99061413e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b259061413e565b8015611b705780601f10611b4757610100808354040283529160200191611b70565b820191905f5260205f20905b815481529060010190602001808311611b5357829003601f168201915b5050505050905090565b611b826119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611c07575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3d9061402b565b60405180910390fd5b8060088190555050565b60115481565b60145481565b611c646119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ce9575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f9061402b565b60405180910390fd5b8060098190555050565b5f611d45611d3e612690565b848461285a565b6001905092915050565b611d576119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ddc575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e129061402b565b60405180910390fd5b5f611e24610d3e565b90505f606460085483611e37919061439c565b611e41919061440a565b9050611e4d30826132bf565b5f5b611e59600a613416565b811015611ebb575f611e7582600a61342990919063ffffffff16565b90505f611e8182611549565b90505f606460085483611e94919061439c565b611e9e919061440a565b9050611eab308483613440565b5050508080600101915050611e4f565b505050565b60095481565b600f5f9054906101000a900460ff1681565b611ee06119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f65575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b9061402b565b60405180910390fd5b80600f60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5b95a9a9738e51b43e0a6881e6f4154ca008e130514bc426ec928eed830e456d826040516120049190613d59565b60405180910390a250565b6120176119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061209c575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d29061402b565b60405180910390fd5b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61213b6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121c0575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f69061402b565b60405180910390fd5b61220a81600161200f565b61221581600161179f565b61221d6119d9565b73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122c75761229b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f61200f565b6122c660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f61179f565b5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f6123136119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612398575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce9061402b565b60405180910390fd5b620186a060016123e5610d3e565b6123ef919061439c565b6123f9919061440a565b82101561243b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612432906144aa565b60405180910390fd5b6103e86005612448610d3e565b612452919061439c565b61245c919061440a565b82111561249e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249590614538565b60405180910390fd5b81600e8190555060019050919050565b60105481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600e5481565b60125481565b61254a612690565b73ffffffffffffffffffffffffffffffffffffffff166125686119d9565b73ffffffffffffffffffffffffffffffffffffffff16146125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b59061437e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361262c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612623906145c6565b60405180910390fd5b612635816131fc565b50565b60155481565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90614654565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276a906146e2565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161284d9190613d81565b60405180910390a3505050565b82600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156128e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128dc906142ae565b60405180910390fd5b82600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612970576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612967906142ae565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d590614770565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a43906147fe565b60405180910390fd5b5f8303612a6357612a5e85855f613450565b61316e565b600f60029054906101000a900460ff1615612bd2578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f083c707ba0896adc77618b279259b257400a617b2ed7404527f347d65c220e5785604051612ad59190613d81565b60405180910390a360165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612b78575060165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614866565b60405180910390fd5b612bc28585856136c5565b612bcd858585613450565b61316e565b600f5f9054906101000a900460ff16158015612c35575060165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612d21577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580612ce157507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d17906148ce565b60405180910390fd5b5b5f612d2b30611549565b90505f600e548210159050808015612d4f5750600f60019054906101000a900460ff165b8015612d685750600d60149054906101000a900460ff16155b8015612dbf57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b8015612e12575060165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612e65575060165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612ea8576001600d60146101000a81548160ff021916908315150217905550612e8d61374f565b5f600d60146101000a81548160ff0219169083151502179055505b5f600d60149054906101000a900460ff1615905060165f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612f57575060165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612f60575f90505b5f805f8315613151577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16148015612fc557505f601354115b1561303357612ff26064612fe46013548c61379d90919063ffffffff16565b6137b290919063ffffffff16565b925060135460155484613005919061439c565b61300f919061440a565b915060135460145484613022919061439c565b61302c919061440a565b90506130fa565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614801561308f57505f601054115b156130f9576130bc60646130ae6010548c61379d90919063ffffffff16565b6137b290919063ffffffff16565b9250601054601254846130cf919061439c565b6130d9919061440a565b9150601054601154846130ec919061439c565b6130f6919061440a565b90505b5b5f83111561310e5761310d8b3085613450565b5b5f82111561314257613141307f000000000000000000000000000000000000000000000000000000000000000084613450565b5b828961314e91906148ec565b98505b61315c8b8b8b6136c5565b6131678b8b8b613450565b5050505050505b5050505050565b5f61319a835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6137c7565b905092915050565b5f6131c7835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6137e7565b905092915050565b5f6131f4835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61384e565b905092915050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361332d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332490614969565b60405180910390fd5b6133385f838361394a565b8060025f8282546133499190614076565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461339b9190614076565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133ff9190613d81565b60405180910390a36134125f838361394f565b5050565b5f613422825f01613954565b9050919050565b5f613436835f0183613963565b5f1c905092915050565b61344b838383613450565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b590614770565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361352c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613523906147fe565b60405180910390fd5b61353783838361394a565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156135ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b1906149f7565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546136489190614076565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516136ac9190613d81565b60405180910390a36136bf84848461394f565b50505050565b6136d982600a6131a290919063ffffffff16565b503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561372f57505f61372d8261371f86611549565b61398a90919063ffffffff16565b145b1561374a5761374883600a6131cf90919063ffffffff16565b505b505050565b5f61375930611549565b90505f8103613768575061379b565b6014600e54613777919061439c565b811115613790576014600e5461378d919061439c565b90505b6137998161399f565b505b565b5f81836137aa919061439c565b905092915050565b5f81836137bf919061440a565b905092915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f6137f283836137c7565b61384457825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050613848565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f811461393f575f60018261387b91906148ec565b90505f6001865f018054905061389191906148ec565b90508082146138f7575f865f0182815481106138b0576138af614a15565b5b905f5260205f200154905080875f0184815481106138d1576138d0614a15565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f0180548061390a57613909614a42565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050613944565b5f9150505b92915050565b505050565b505050565b5f815f01805490509050919050565b5f825f01828154811061397957613978614a15565b5b905f5260205f200154905092915050565b5f818361399791906148ec565b905092915050565b5f600267ffffffffffffffff8111156139bb576139ba614a6f565b5b6040519080825280602002602001820160405280156139e95781602001602082028036833780820191505090505b50905030815f81518110613a00576139ff614a15565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613a7057613a6f614a15565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613ad5307f000000000000000000000000000000000000000000000000000000000000000084612697565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8460075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401613b57959493929190614b8c565b5f604051808303815f87803b158015613b6e575f80fd5b505af1158015613b80573d5f803e3d5ffd5b505050505050565b5f80fd5b5f819050919050565b613b9e81613b8c565b8114613ba8575f80fd5b50565b5f81359050613bb981613b95565b92915050565b5f8060408385031215613bd557613bd4613b88565b5b5f613be285828601613bab565b9250506020613bf385828601613bab565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613c34578082015181840152602081019050613c19565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613c5982613bfd565b613c638185613c07565b9350613c73818560208601613c17565b613c7c81613c3f565b840191505092915050565b5f6020820190508181035f830152613c9f8184613c4f565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613cd082613ca7565b9050919050565b613ce081613cc6565b8114613cea575f80fd5b50565b5f81359050613cfb81613cd7565b92915050565b5f8060408385031215613d1757613d16613b88565b5b5f613d2485828601613ced565b9250506020613d3585828601613bab565b9150509250929050565b5f8115159050919050565b613d5381613d3f565b82525050565b5f602082019050613d6c5f830184613d4a565b92915050565b613d7b81613b8c565b82525050565b5f602082019050613d945f830184613d72565b92915050565b5f60208284031215613daf57613dae613b88565b5b5f613dbc84828501613ced565b91505092915050565b5f819050919050565b5f613de8613de3613dde84613ca7565b613dc5565b613ca7565b9050919050565b5f613df982613dce565b9050919050565b5f613e0a82613def565b9050919050565b613e1a81613e00565b82525050565b5f602082019050613e335f830184613e11565b92915050565b5f805f60608486031215613e5057613e4f613b88565b5b5f613e5d86828701613ced565b9350506020613e6e86828701613ced565b9250506040613e7f86828701613bab565b9150509250925092565b613e9281613cc6565b82525050565b5f602082019050613eab5f830184613e89565b92915050565b5f60ff82169050919050565b613ec681613eb1565b82525050565b5f602082019050613edf5f830184613ebd565b92915050565b613eee81613d3f565b8114613ef8575f80fd5b50565b5f81359050613f0981613ee5565b92915050565b5f8060408385031215613f2557613f24613b88565b5b5f613f3285828601613ced565b9250506020613f4385828601613efb565b9150509250929050565b5f60208284031215613f6257613f61613b88565b5b5f613f6f84828501613efb565b91505092915050565b5f60208284031215613f8d57613f8c613b88565b5b5f613f9a84828501613bab565b91505092915050565b5f8060408385031215613fb957613fb8613b88565b5b5f613fc685828601613ced565b9250506020613fd785828601613ced565b9150509250929050565b7f4e6f74206f776e6572206f72206d616e616765720000000000000000000000005f82015250565b5f614015601483613c07565b915061402082613fe1565b602082019050919050565b5f6020820190508181035f83015261404281614009565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61408082613b8c565b915061408b83613b8c565b92508282019050808211156140a3576140a2614049565b5b92915050565b7f4d757374206b656570206665657320617420313525206f72206c6573730000005f82015250565b5f6140dd601d83613c07565b91506140e8826140a9565b602082019050919050565b5f6020820190508181035f83015261410a816140d1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061415557607f821691505b60208210810361416857614167614111565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f6141c8602883613c07565b91506141d38261416e565b604082019050919050565b5f6020820190508181035f8301526141f5816141bc565b9050919050565b7f4164647265737320616c7265616479206120686f6c64657200000000000000005f82015250565b5f614230601883613c07565b915061423b826141fc565b602082019050919050565b5f6020820190508181035f83015261425d81614224565b9050919050565b7f4164647265737320697320626c61636b6c6973746564000000000000000000005f82015250565b5f614298601683613c07565b91506142a382614264565b602082019050919050565b5f6020820190508181035f8301526142c58161428c565b9050919050565b7f4d757374206b656570206665657320617420313025206f72206c6573730000005f82015250565b5f614300601d83613c07565b915061430b826142cc565b602082019050919050565b5f6020820190508181035f83015261432d816142f4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f614368602083613c07565b915061437382614334565b602082019050919050565b5f6020820190508181035f8301526143958161435c565b9050919050565b5f6143a682613b8c565b91506143b183613b8c565b92508282026143bf81613b8c565b915082820484148315176143d6576143d5614049565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61441482613b8c565b915061441f83613b8c565b92508261442f5761442e6143dd565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e5f8201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b5f614494603583613c07565b915061449f8261443a565b604082019050919050565b5f6020820190508181035f8301526144c181614488565b9050919050565b7f5377617020616d6f756e742063616e6e6f7420626520686967686572207468615f8201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b5f614522603483613c07565b915061452d826144c8565b604082019050919050565b5f6020820190508181035f83015261454f81614516565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6145b0602683613c07565b91506145bb82614556565b604082019050919050565b5f6020820190508181035f8301526145dd816145a4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61463e602483613c07565b9150614649826145e4565b604082019050919050565b5f6020820190508181035f83015261466b81614632565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6146cc602283613c07565b91506146d782614672565b604082019050919050565b5f6020820190508181035f8301526146f9816146c0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61475a602583613c07565b915061476582614700565b604082019050919050565b5f6020820190508181035f8301526147878161474e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6147e8602383613c07565b91506147f38261478e565b604082019050919050565b5f6020820190508181035f830152614815816147dc565b9050919050565b7f436f6e7472616374206973205061757365642e000000000000000000000000005f82015250565b5f614850601383613c07565b915061485b8261481c565b602082019050919050565b5f6020820190508181035f83015261487d81614844565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f6148b8601683613c07565b91506148c382614884565b602082019050919050565b5f6020820190508181035f8301526148e5816148ac565b9050919050565b5f6148f682613b8c565b915061490183613b8c565b925082820390508181111561491957614918614049565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f614953601f83613c07565b915061495e8261491f565b602082019050919050565b5f6020820190508181035f83015261498081614947565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6149e1602683613c07565b91506149ec82614987565b604082019050919050565b5f6020820190508181035f830152614a0e816149d5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f819050919050565b5f614abf614aba614ab584614a9c565b613dc5565b613b8c565b9050919050565b614acf81614aa5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614b0781613cc6565b82525050565b5f614b188383614afe565b60208301905092915050565b5f602082019050919050565b5f614b3a82614ad5565b614b448185614adf565b9350614b4f83614aef565b805f5b83811015614b7f578151614b668882614b0d565b9750614b7183614b24565b925050600181019050614b52565b5085935050505092915050565b5f60a082019050614b9f5f830188613d72565b614bac6020830187614ac6565b8181036040830152614bbe8186614b30565b9050614bcd6060830185613e89565b614bda6080830184613d72565b969550505050505056fea2646970667358221220f3295b12927ed789b866286fcd9c66a2a8c0018ddf9d7d6c88c48363c46edec164736f6c63430008170033

Deployed Bytecode

0x6080604052600436106102b1575f3560e01c80637571336a11610174578063ba15984c116100db578063d85ba06311610094578063f11a24d31161006e578063f11a24d314610a58578063f2fde38b14610a82578063f637434214610aaa578063fe575a8714610ad4576102b8565b8063d85ba063146109c8578063dd62ed3e146109f2578063e2f4560514610a2e576102b8565b8063ba15984c146108c0578063bbc0c742146108ea578063bc917e6114610914578063c02466681461093c578063d0ebdbe714610964578063d257b34f1461098c576102b8565b806396bb3d9c1161012d57806396bb3d9c146107ca5780639c3b4fdc146107f2578063a0d82dc51461081c578063a8c7ea4714610846578063a9059cbb1461086e578063af14052c146108aa576102b8565b80637571336a146106e65780638a67456a1461070e5780638a8c523c146107385780638da5cb5b1461074e578063924de9b71461077857806395d89b41146107a0576102b8565b806344337ea11161021857806366ca9b83116101d157806366ca9b83146105f05780636a486a8e146106185780636ddd17131461064257806370a082311461066c578063715018a6146106a857806374c9f603146106be576102b8565b806344337ea1146104e6578063481c6a751461050e57806349bd5a5e146105385780634aa4a4fc146105625780634fbee1931461058c578063537df3b6146105c8576102b8565b806318160ddd1161026a57806318160ddd146103da57806323b872dd1461040457806327c8f835146104405780632dc0562d1461046a5780632fcbbf8114610494578063313ce567146104bc576102b8565b806302dbd8f8146102bc57806306fdde03146102e4578063095ea7b31461030e5780630b8682771461034a57806310d5de53146103745780631694505e146103b0576102b8565b366102b857005b5f80fd5b3480156102c7575f80fd5b506102e260048036038101906102dd9190613bbf565b610b10565b005b3480156102ef575f80fd5b506102f8610c4a565b6040516103059190613c87565b60405180910390f35b348015610319575f80fd5b50610334600480360381019061032f9190613d01565b610cda565b6040516103419190613d59565b60405180910390f35b348015610355575f80fd5b5061035e610cf7565b60405161036b9190613d81565b60405180910390f35b34801561037f575f80fd5b5061039a60048036038101906103959190613d9a565b610cfd565b6040516103a79190613d59565b60405180910390f35b3480156103bb575f80fd5b506103c4610d1a565b6040516103d19190613e20565b60405180910390f35b3480156103e5575f80fd5b506103ee610d3e565b6040516103fb9190613d81565b60405180910390f35b34801561040f575f80fd5b5061042a60048036038101906104259190613e39565b610d47565b6040516104379190613d59565b60405180910390f35b34801561044b575f80fd5b50610454610e39565b6040516104619190613e98565b60405180910390f35b348015610475575f80fd5b5061047e610e3f565b60405161048b9190613e98565b60405180910390f35b34801561049f575f80fd5b506104ba60048036038101906104b59190613d9a565b610e64565b005b3480156104c7575f80fd5b506104d0611026565b6040516104dd9190613ecc565b60405180910390f35b3480156104f1575f80fd5b5061050c60048036038101906105079190613d9a565b61102e565b005b348015610519575f80fd5b506105226111aa565b60405161052f9190613e98565b60405180910390f35b348015610543575f80fd5b5061054c6111cf565b6040516105599190613e98565b60405180910390f35b34801561056d575f80fd5b506105766111f3565b6040516105839190613e98565b60405180910390f35b348015610597575f80fd5b506105b260048036038101906105ad9190613d9a565b611218565b6040516105bf9190613d59565b60405180910390f35b3480156105d3575f80fd5b506105ee60048036038101906105e99190613d9a565b61126a565b005b3480156105fb575f80fd5b5061061660048036038101906106119190613bbf565b6113f6565b005b348015610623575f80fd5b5061062c611530565b6040516106399190613d81565b60405180910390f35b34801561064d575f80fd5b50610656611536565b6040516106639190613d59565b60405180910390f35b348015610677575f80fd5b50610692600480360381019061068d9190613d9a565b611549565b60405161069f9190613d81565b60405180910390f35b3480156106b3575f80fd5b506106bc61158e565b005b3480156106c9575f80fd5b506106e460048036038101906106df9190613d9a565b611615565b005b3480156106f1575f80fd5b5061070c60048036038101906107079190613f0f565b61179f565b005b348015610719575f80fd5b506107226118c3565b60405161072f9190613d59565b60405180910390f35b348015610743575f80fd5b5061074c6118d6565b005b348015610759575f80fd5b506107626119d9565b60405161076f9190613e98565b60405180910390f35b348015610783575f80fd5b5061079e60048036038101906107999190613f4d565b611a01565b005b3480156107ab575f80fd5b506107b4611aea565b6040516107c19190613c87565b60405180910390f35b3480156107d5575f80fd5b506107f060048036038101906107eb9190613f78565b611b7a565b005b3480156107fd575f80fd5b50610806611c50565b6040516108139190613d81565b60405180910390f35b348015610827575f80fd5b50610830611c56565b60405161083d9190613d81565b60405180910390f35b348015610851575f80fd5b5061086c60048036038101906108679190613f78565b611c5c565b005b348015610879575f80fd5b50610894600480360381019061088f9190613d01565b611d32565b6040516108a19190613d59565b60405180910390f35b3480156108b5575f80fd5b506108be611d4f565b005b3480156108cb575f80fd5b506108d4611ec0565b6040516108e19190613d81565b60405180910390f35b3480156108f5575f80fd5b506108fe611ec6565b60405161090b9190613d59565b60405180910390f35b34801561091f575f80fd5b5061093a60048036038101906109359190613f4d565b611ed8565b005b348015610947575f80fd5b50610962600480360381019061095d9190613f0f565b61200f565b005b34801561096f575f80fd5b5061098a60048036038101906109859190613d9a565b612133565b005b348015610997575f80fd5b506109b260048036038101906109ad9190613f78565b61230a565b6040516109bf9190613d59565b60405180910390f35b3480156109d3575f80fd5b506109dc6124ae565b6040516109e99190613d81565b60405180910390f35b3480156109fd575f80fd5b50610a186004803603810190610a139190613fa3565b6124b4565b604051610a259190613d81565b60405180910390f35b348015610a39575f80fd5b50610a42612536565b604051610a4f9190613d81565b60405180910390f35b348015610a63575f80fd5b50610a6c61253c565b604051610a799190613d81565b60405180910390f35b348015610a8d575f80fd5b50610aa86004803603810190610aa39190613d9a565b612542565b005b348015610ab5575f80fd5b50610abe612638565b604051610acb9190613d81565b60405180910390f35b348015610adf575f80fd5b50610afa6004803603810190610af59190613d9a565b61263e565b604051610b079190613d59565b60405180910390f35b610b186119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610b9d575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610bdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd39061402b565b60405180910390fd5b8160148190555080601581905550601554601454610bfa9190614076565b601381905550600f6013541115610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d906140f3565b60405180910390fd5b5050565b606060038054610c599061413e565b80601f0160208091040260200160405190810160405280929190818152602001828054610c859061413e565b8015610cd05780601f10610ca757610100808354040283529160200191610cd0565b820191905f5260205f20905b815481529060010190602001808311610cb357829003601f168201915b5050505050905090565b5f610ced610ce6612690565b8484612697565b6001905092915050565b60085481565b6017602052805f5260405f205f915054906101000a900460ff1681565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b5f600254905090565b5f610d5384848461285a565b5f60015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f610d9a612690565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905082811015610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e10906141de565b60405180910390fd5b610e2d85610e25612690565b858403612697565b60019150509392505050565b61dead81565b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610e6c6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610ef1575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b610f30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f279061402b565b60405180910390fd5b610f4481600a61317590919063ffffffff16565b15610f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7b90614246565b60405180910390fd5b600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff161561100e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611005906142ae565b60405180910390fd5b61102281600a6131a290919063ffffffff16565b5050565b5f6012905090565b6110366119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806110bb575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6110fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110f19061402b565b60405180910390fd5b6001600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff02191690831515021790555061116381600a6131cf90919063ffffffff16565b508073ffffffffffffffffffffffffffffffffffffffff167ff9b68063b051b82957fa193585681240904fed808db8b30fc5a2d2202c6ed62760405160405180910390a250565b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b7f000000000000000000000000b95e70868f7b9c2bc6ba5fbf026c1d872382e5f681565b600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f60165f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b6112726119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806112f7575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611336576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132d9061402b565b60405180910390fd5b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505f61139482611549565b11156113b0576113ae81600a6131a290919063ffffffff16565b505b8073ffffffffffffffffffffffffffffffffffffffff167f2b6bf71b58b3583add364b3d9060ebf8019650f65f5be35f5464b9cb3e4ba2d460405160405180910390a250565b6113fe6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611483575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6114c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b99061402b565b60405180910390fd5b81601181905550806012819055506012546011546114e09190614076565b601081905550600a601054111561152c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152390614316565b60405180910390fd5b5050565b60135481565b600f60019054906101000a900460ff1681565b5f805f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b611596612690565b73ffffffffffffffffffffffffffffffffffffffff166115b46119d9565b73ffffffffffffffffffffffffffffffffffffffff161461160a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116019061437e565b60405180910390fd5b6116135f6131fc565b565b61161d6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806116a2575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6116e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d89061402b565b60405180910390fd5b60075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fb3dd4b0ccf73b51db7cb2a59fb88d1082b0fa9389d4ce0e85100fe3b26af78c460405160405180910390a38060075f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6117a76119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061182c575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b61186b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118629061402b565b60405180910390fd5b8060175f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b600f60029054906101000a900460ff1681565b6118de6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611963575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6119a2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119999061402b565b60405180910390fd5b6001600f5f6101000a81548160ff0219169083151502179055506001600f60016101000a81548160ff021916908315150217905550565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611a096119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611a8e575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac49061402b565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b606060048054611af99061413e565b80601f0160208091040260200160405190810160405280929190818152602001828054611b259061413e565b8015611b705780601f10611b4757610100808354040283529160200191611b70565b820191905f5260205f20905b815481529060010190602001808311611b5357829003601f168201915b5050505050905090565b611b826119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611c07575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c3d9061402b565b60405180910390fd5b8060088190555050565b60115481565b60145481565b611c646119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ce9575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611d28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1f9061402b565b60405180910390fd5b8060098190555050565b5f611d45611d3e612690565b848461285a565b6001905092915050565b611d576119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611ddc575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611e1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e129061402b565b60405180910390fd5b5f611e24610d3e565b90505f606460085483611e37919061439c565b611e41919061440a565b9050611e4d30826132bf565b5f5b611e59600a613416565b811015611ebb575f611e7582600a61342990919063ffffffff16565b90505f611e8182611549565b90505f606460085483611e94919061439c565b611e9e919061440a565b9050611eab308483613440565b5050508080600101915050611e4f565b505050565b60095481565b600f5f9054906101000a900460ff1681565b611ee06119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480611f65575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b611fa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9b9061402b565b60405180910390fd5b80600f60026101000a81548160ff0219169083151502179055503373ffffffffffffffffffffffffffffffffffffffff167f5b95a9a9738e51b43e0a6881e6f4154ca008e130514bc426ec928eed830e456d826040516120049190613d59565b60405180910390a250565b6120176119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061209c575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6120db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d29061402b565b60405180910390fd5b8060165f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505050565b61213b6119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806121c0575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6121ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121f69061402b565b60405180910390fd5b61220a81600161200f565b61221581600161179f565b61221d6119d9565b73ffffffffffffffffffffffffffffffffffffffff1660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146122c75761229b60065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f61200f565b6122c660065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff165f61179f565b5b8060065f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b5f6123136119d9565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480612398575060065f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b6123d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ce9061402b565b60405180910390fd5b620186a060016123e5610d3e565b6123ef919061439c565b6123f9919061440a565b82101561243b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612432906144aa565b60405180910390fd5b6103e86005612448610d3e565b612452919061439c565b61245c919061440a565b82111561249e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249590614538565b60405180910390fd5b81600e8190555060019050919050565b60105481565b5f60015f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905092915050565b600e5481565b60125481565b61254a612690565b73ffffffffffffffffffffffffffffffffffffffff166125686119d9565b73ffffffffffffffffffffffffffffffffffffffff16146125be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b59061437e565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361262c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612623906145c6565b60405180910390fd5b612635816131fc565b50565b60155481565b5f600c5f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff169050919050565b5f33905090565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612705576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126fc90614654565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276a906146e2565b60405180910390fd5b8060015f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258360405161284d9190613d81565b60405180910390a3505050565b82600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16156128e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128dc906142ae565b60405180910390fd5b82600c5f8273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1615612970576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612967906142ae565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036129de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129d590614770565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612a4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a43906147fe565b60405180910390fd5b5f8303612a6357612a5e85855f613450565b61316e565b600f60029054906101000a900460ff1615612bd2578373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f083c707ba0896adc77618b279259b257400a617b2ed7404527f347d65c220e5785604051612ad59190613d81565b60405180910390a360165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612b78575060165f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b612bb7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bae90614866565b60405180910390fd5b612bc28585856136c5565b612bcd858585613450565b61316e565b600f5f9054906101000a900460ff16158015612c35575060165f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612d21577f000000000000000000000000b95e70868f7b9c2bc6ba5fbf026c1d872382e5f673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141580612ce157507f000000000000000000000000b95e70868f7b9c2bc6ba5fbf026c1d872382e5f673ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614155b612d20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d17906148ce565b60405180910390fd5b5b5f612d2b30611549565b90505f600e548210159050808015612d4f5750600f60019054906101000a900460ff165b8015612d685750600d60149054906101000a900460ff16155b8015612dbf57507f000000000000000000000000b95e70868f7b9c2bc6ba5fbf026c1d872382e5f673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff16145b8015612e12575060165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b8015612e65575060165f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16155b15612ea8576001600d60146101000a81548160ff021916908315150217905550612e8d61374f565b5f600d60146101000a81548160ff0219169083151502179055505b5f600d60149054906101000a900460ff1615905060165f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1680612f57575060165f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff165b15612f60575f90505b5f805f8315613151577f000000000000000000000000b95e70868f7b9c2bc6ba5fbf026c1d872382e5f673ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff16148015612fc557505f601354115b1561303357612ff26064612fe46013548c61379d90919063ffffffff16565b6137b290919063ffffffff16565b925060135460155484613005919061439c565b61300f919061440a565b915060135460145484613022919061439c565b61302c919061440a565b90506130fa565b7f000000000000000000000000b95e70868f7b9c2bc6ba5fbf026c1d872382e5f673ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff1614801561308f57505f601054115b156130f9576130bc60646130ae6010548c61379d90919063ffffffff16565b6137b290919063ffffffff16565b9250601054601254846130cf919061439c565b6130d9919061440a565b9150601054601154846130ec919061439c565b6130f6919061440a565b90505b5b5f83111561310e5761310d8b3085613450565b5b5f82111561314257613141307f000000000000000000000000b95e70868f7b9c2bc6ba5fbf026c1d872382e5f684613450565b5b828961314e91906148ec565b98505b61315c8b8b8b6136c5565b6131678b8b8b613450565b5050505050505b5050505050565b5f61319a835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6137c7565b905092915050565b5f6131c7835f018373ffffffffffffffffffffffffffffffffffffffff165f1b6137e7565b905092915050565b5f6131f4835f018373ffffffffffffffffffffffffffffffffffffffff165f1b61384e565b905092915050565b5f60055f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508160055f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361332d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161332490614969565b60405180910390fd5b6133385f838361394a565b8060025f8282546133499190614076565b92505081905550805f808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461339b9190614076565b925050819055508173ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516133ff9190613d81565b60405180910390a36134125f838361394f565b5050565b5f613422825f01613954565b9050919050565b5f613436835f0183613963565b5f1c905092915050565b61344b838383613450565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036134be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b590614770565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361352c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613523906147fe565b60405180910390fd5b61353783838361394a565b5f805f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050818110156135ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135b1906149f7565b60405180910390fd5b8181035f808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550815f808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546136489190614076565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040516136ac9190613d81565b60405180910390a36136bf84848461394f565b50505050565b6136d982600a6131a290919063ffffffff16565b503073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415801561372f57505f61372d8261371f86611549565b61398a90919063ffffffff16565b145b1561374a5761374883600a6131cf90919063ffffffff16565b505b505050565b5f61375930611549565b90505f8103613768575061379b565b6014600e54613777919061439c565b811115613790576014600e5461378d919061439c565b90505b6137998161399f565b505b565b5f81836137aa919061439c565b905092915050565b5f81836137bf919061440a565b905092915050565b5f80836001015f8481526020019081526020015f20541415905092915050565b5f6137f283836137c7565b61384457825f0182908060018154018082558091505060019003905f5260205f20015f9091909190915055825f0180549050836001015f8481526020019081526020015f208190555060019050613848565b5f90505b92915050565b5f80836001015f8481526020019081526020015f205490505f811461393f575f60018261387b91906148ec565b90505f6001865f018054905061389191906148ec565b90508082146138f7575f865f0182815481106138b0576138af614a15565b5b905f5260205f200154905080875f0184815481106138d1576138d0614a15565b5b905f5260205f20018190555083876001015f8381526020019081526020015f2081905550505b855f0180548061390a57613909614a42565b5b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050613944565b5f9150505b92915050565b505050565b505050565b5f815f01805490509050919050565b5f825f01828154811061397957613978614a15565b5b905f5260205f200154905092915050565b5f818361399791906148ec565b905092915050565b5f600267ffffffffffffffff8111156139bb576139ba614a6f565b5b6040519080825280602002602001820160405280156139e95781602001602082028036833780820191505090505b50905030815f81518110613a00576139ff614a15565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681600181518110613a7057613a6f614a15565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613ad5307f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d84612697565b7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d73ffffffffffffffffffffffffffffffffffffffff1663791ac947835f8460075f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16426040518663ffffffff1660e01b8152600401613b57959493929190614b8c565b5f604051808303815f87803b158015613b6e575f80fd5b505af1158015613b80573d5f803e3d5ffd5b505050505050565b5f80fd5b5f819050919050565b613b9e81613b8c565b8114613ba8575f80fd5b50565b5f81359050613bb981613b95565b92915050565b5f8060408385031215613bd557613bd4613b88565b5b5f613be285828601613bab565b9250506020613bf385828601613bab565b9150509250929050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015613c34578082015181840152602081019050613c19565b5f8484015250505050565b5f601f19601f8301169050919050565b5f613c5982613bfd565b613c638185613c07565b9350613c73818560208601613c17565b613c7c81613c3f565b840191505092915050565b5f6020820190508181035f830152613c9f8184613c4f565b905092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f613cd082613ca7565b9050919050565b613ce081613cc6565b8114613cea575f80fd5b50565b5f81359050613cfb81613cd7565b92915050565b5f8060408385031215613d1757613d16613b88565b5b5f613d2485828601613ced565b9250506020613d3585828601613bab565b9150509250929050565b5f8115159050919050565b613d5381613d3f565b82525050565b5f602082019050613d6c5f830184613d4a565b92915050565b613d7b81613b8c565b82525050565b5f602082019050613d945f830184613d72565b92915050565b5f60208284031215613daf57613dae613b88565b5b5f613dbc84828501613ced565b91505092915050565b5f819050919050565b5f613de8613de3613dde84613ca7565b613dc5565b613ca7565b9050919050565b5f613df982613dce565b9050919050565b5f613e0a82613def565b9050919050565b613e1a81613e00565b82525050565b5f602082019050613e335f830184613e11565b92915050565b5f805f60608486031215613e5057613e4f613b88565b5b5f613e5d86828701613ced565b9350506020613e6e86828701613ced565b9250506040613e7f86828701613bab565b9150509250925092565b613e9281613cc6565b82525050565b5f602082019050613eab5f830184613e89565b92915050565b5f60ff82169050919050565b613ec681613eb1565b82525050565b5f602082019050613edf5f830184613ebd565b92915050565b613eee81613d3f565b8114613ef8575f80fd5b50565b5f81359050613f0981613ee5565b92915050565b5f8060408385031215613f2557613f24613b88565b5b5f613f3285828601613ced565b9250506020613f4385828601613efb565b9150509250929050565b5f60208284031215613f6257613f61613b88565b5b5f613f6f84828501613efb565b91505092915050565b5f60208284031215613f8d57613f8c613b88565b5b5f613f9a84828501613bab565b91505092915050565b5f8060408385031215613fb957613fb8613b88565b5b5f613fc685828601613ced565b9250506020613fd785828601613ced565b9150509250929050565b7f4e6f74206f776e6572206f72206d616e616765720000000000000000000000005f82015250565b5f614015601483613c07565b915061402082613fe1565b602082019050919050565b5f6020820190508181035f83015261404281614009565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f61408082613b8c565b915061408b83613b8c565b92508282019050808211156140a3576140a2614049565b5b92915050565b7f4d757374206b656570206665657320617420313525206f72206c6573730000005f82015250565b5f6140dd601d83613c07565b91506140e8826140a9565b602082019050919050565b5f6020820190508181035f83015261410a816140d1565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061415557607f821691505b60208210810361416857614167614111565b5b50919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320615f8201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b5f6141c8602883613c07565b91506141d38261416e565b604082019050919050565b5f6020820190508181035f8301526141f5816141bc565b9050919050565b7f4164647265737320616c7265616479206120686f6c64657200000000000000005f82015250565b5f614230601883613c07565b915061423b826141fc565b602082019050919050565b5f6020820190508181035f83015261425d81614224565b9050919050565b7f4164647265737320697320626c61636b6c6973746564000000000000000000005f82015250565b5f614298601683613c07565b91506142a382614264565b602082019050919050565b5f6020820190508181035f8301526142c58161428c565b9050919050565b7f4d757374206b656570206665657320617420313025206f72206c6573730000005f82015250565b5f614300601d83613c07565b915061430b826142cc565b602082019050919050565b5f6020820190508181035f83015261432d816142f4565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f614368602083613c07565b915061437382614334565b602082019050919050565b5f6020820190508181035f8301526143958161435c565b9050919050565b5f6143a682613b8c565b91506143b183613b8c565b92508282026143bf81613b8c565b915082820484148315176143d6576143d5614049565b5b5092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61441482613b8c565b915061441f83613b8c565b92508261442f5761442e6143dd565b5b828204905092915050565b7f5377617020616d6f756e742063616e6e6f74206265206c6f776572207468616e5f8201527f20302e3030312520746f74616c20737570706c792e0000000000000000000000602082015250565b5f614494603583613c07565b915061449f8261443a565b604082019050919050565b5f6020820190508181035f8301526144c181614488565b9050919050565b7f5377617020616d6f756e742063616e6e6f7420626520686967686572207468615f8201527f6e20302e352520746f74616c20737570706c792e000000000000000000000000602082015250565b5f614522603483613c07565b915061452d826144c8565b604082019050919050565b5f6020820190508181035f83015261454f81614516565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6145b0602683613c07565b91506145bb82614556565b604082019050919050565b5f6020820190508181035f8301526145dd816145a4565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61463e602483613c07565b9150614649826145e4565b604082019050919050565b5f6020820190508181035f83015261466b81614632565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f2061646472655f8201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b5f6146cc602283613c07565b91506146d782614672565b604082019050919050565b5f6020820190508181035f8301526146f9816146c0565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f2061645f8201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b5f61475a602583613c07565b915061476582614700565b604082019050919050565b5f6020820190508181035f8301526147878161474e565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f20616464725f8201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b5f6147e8602383613c07565b91506147f38261478e565b604082019050919050565b5f6020820190508181035f830152614815816147dc565b9050919050565b7f436f6e7472616374206973205061757365642e000000000000000000000000005f82015250565b5f614850601383613c07565b915061485b8261481c565b602082019050919050565b5f6020820190508181035f83015261487d81614844565b9050919050565b7f54726164696e67206973206e6f74206163746976652e000000000000000000005f82015250565b5f6148b8601683613c07565b91506148c382614884565b602082019050919050565b5f6020820190508181035f8301526148e5816148ac565b9050919050565b5f6148f682613b8c565b915061490183613b8c565b925082820390508181111561491957614918614049565b5b92915050565b7f45524332303a206d696e7420746f20746865207a65726f2061646472657373005f82015250565b5f614953601f83613c07565b915061495e8261491f565b602082019050919050565b5f6020820190508181035f83015261498081614947565b9050919050565b7f45524332303a207472616e7366657220616d6f756e74206578636565647320625f8201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b5f6149e1602683613c07565b91506149ec82614987565b604082019050919050565b5f6020820190508181035f830152614a0e816149d5565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f819050919050565b5f614abf614aba614ab584614a9c565b613dc5565b613b8c565b9050919050565b614acf81614aa5565b82525050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b614b0781613cc6565b82525050565b5f614b188383614afe565b60208301905092915050565b5f602082019050919050565b5f614b3a82614ad5565b614b448185614adf565b9350614b4f83614aef565b805f5b83811015614b7f578151614b668882614b0d565b9750614b7183614b24565b925050600181019050614b52565b5085935050505092915050565b5f60a082019050614b9f5f830188613d72565b614bac6020830187614ac6565b8181036040830152614bbe8186614b30565b9050614bcd6060830185613e89565b614bda6080830184613d72565b969550505050505056fea2646970667358221220f3295b12927ed789b866286fcd9c66a2a8c0018ddf9d7d6c88c48363c46edec164736f6c63430008170033

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.