abstract contract ERC165 {
  /**
   * @notice Query if a contract implements an interface
   * @param _interfaceID The interface identifier, as specified in ERC-165
   * @return `true` if the contract implements `_interfaceID`
   */
  function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) {
    return _interfaceID == this.supportsInterface.selector;
  }
}
function supportsInterface(bytes4 _interfaceID) virtual public pure returns (bool) {
  return _interfaceID == this.supportsInterface.selector;
}

/**
 * @notice Query if a contract implements an interface
 * @param _interfaceID The interface identifier, as specified in ERC-165
 * @return `true` if the contract implements `_interfaceID`
 */