contract Adminable is Context{

    address private _admin;



    event AdminshipTransferred(address indexed previousAdmin, address indexed newAdmin);



    /**

     * @dev Initializes the contract setting the deployer as the initial admin.

     */

    constructor() {

        _transferAdminship(_msgSender());

    }



    /**

     * @dev Returns the address of the current admin.

     */

    function admin() public view virtual returns (address) {

        return _admin;

    }



    /**

     * @dev Throws if called by any account other than the admin.

     */

    modifier onlyAdmin() {

        require(admin() == _msgSender(), "Caller is not the admin");

        _;

    }



    /**

     * @dev Leaves the contract without admin. It will not be possible to call

     * `onlyAdmin` functions anymore. Can only be called by the current admin.

     *

     * NOTE: Renouncing adminship will leave the contract without an admin,

     * thereby removing any functionality that is only available to the admin.

     */

    function renounceAdminship() public virtual onlyAdmin {

        _transferAdminship(address(0));

    }



    /**

     * @dev Transfers adminship of the contract to a new account (`newAdmin`).

     * Can only be called by the current admin.

     */

    function transferAdminship(address newAdmin) public virtual onlyAdmin {

        require(newAdmin != address(0), "New admin is the zero address");

        _transferAdminship(newAdmin);

    }



    /**

     * @dev Transfers adminship of the contract to a new account (`newAdmin`).

     * Internal function without access restriction.

     */

    function _transferAdminship(address newAdmin) internal virtual {

        address oldAdmin = _admin;

        _admin = newAdmin;

        emit AdminshipTransferred(oldAdmin, newAdmin);

    }

}
function admin() public view virtual returns (address) {

    return _admin;

}

/**
 
 * @dev Returns the address of the current admin.
 
 */