contract Ownable {
  address private _owner;
  address private _admin;

  event OwnerTransferred(address indexed previousOwner, address indexed newOwner);
  event AdminTransferred(address indexed previousAdmin, address indexed newAdmin);

  /**
   * @dev The Ownable constructor sets the original owner and admin of the contract to the sender
   * account.
   */
  constructor() internal {
    _owner = msg.sender;
    _admin = msg.sender;
  }

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

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == _owner);
    _;
  }

  /**
   * @return the address of the Admin.
   */
  function admin() public view onlyOwner returns(address) {
    return _admin;
  }

  /**
   * @dev Throws if called by any account other than the Admin.
   */
  modifier onlyAdmin() {
    require(msg.sender == _admin);
    _;
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwner(address newOwner) public onlyOwner {
    _transferOwner(newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function _transferOwner(address newOwner) internal {
    require(newOwner != address(0));
    emit OwnerTransferred(_owner, newOwner);
    _owner = newOwner;
  }

  /**
   * @dev Allows the current admin to transfer access of the contract mint, burn function to a newAdmin.
   * @param newAdmin The address to transfer admin to.
   */
  function transferAdmin(address newAdmin) public onlyOwner {
    _transferAdmin(newAdmin);
  }

  /**
   * @dev Transfers access of the contract mint, burn function to a newAdmin.
   * @param newAdmin The address to transfer admin to.
   */
  function _transferAdmin(address newAdmin) internal {
    require(newAdmin != address(0));
    emit AdminTransferred(_admin, newAdmin);
    _admin = newAdmin;
  }
}
/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
function transferAdmin(address newAdmin) public onlyOwner {
  _transferAdmin(newAdmin);
}

/**
 * @dev Allows the current admin to transfer access of the contract mint, burn function to a newAdmin.
 * @param newAdmin The address to transfer admin to.
 */