diff --git a/cpp/dmi/hw_events_mgmt_service.pb.h b/cpp/dmi/hw_events_mgmt_service.pb.h
index 7e3e8bd..b4e0463 100644
--- a/cpp/dmi/hw_events_mgmt_service.pb.h
+++ b/cpp/dmi/hw_events_mgmt_service.pb.h
@@ -46,7 +46,7 @@
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::AuxillaryParseTableField aux[]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
-  static const ::google::protobuf::internal::ParseTable schema[17]
+  static const ::google::protobuf::internal::ParseTable schema[18]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::FieldMetadata field_metadata[];
   static const ::google::protobuf::internal::SerializationTable serialization_table[];
@@ -78,6 +78,9 @@
 class EventsConfigurationResponse;
 class EventsConfigurationResponseDefaultTypeInternal;
 extern EventsConfigurationResponseDefaultTypeInternal _EventsConfigurationResponse_default_instance_;
+class GenericEventInfo;
+class GenericEventInfoDefaultTypeInternal;
+extern GenericEventInfoDefaultTypeInternal _GenericEventInfo_default_instance_;
 class ListEventsResponse;
 class ListEventsResponseDefaultTypeInternal;
 extern ListEventsResponseDefaultTypeInternal _ListEventsResponse_default_instance_;
@@ -116,6 +119,7 @@
 template<> ::dmi::EventsCfg* Arena::CreateMaybeMessage<::dmi::EventsCfg>(Arena*);
 template<> ::dmi::EventsConfigurationRequest* Arena::CreateMaybeMessage<::dmi::EventsConfigurationRequest>(Arena*);
 template<> ::dmi::EventsConfigurationResponse* Arena::CreateMaybeMessage<::dmi::EventsConfigurationResponse>(Arena*);
+template<> ::dmi::GenericEventInfo* Arena::CreateMaybeMessage<::dmi::GenericEventInfo>(Arena*);
 template<> ::dmi::ListEventsResponse* Arena::CreateMaybeMessage<::dmi::ListEventsResponse>(Arena*);
 template<> ::dmi::OperStateChange* Arena::CreateMaybeMessage<::dmi::OperStateChange>(Arena*);
 template<> ::dmi::StandbyStateChange* Arena::CreateMaybeMessage<::dmi::StandbyStateChange>(Arena*);
@@ -176,6 +180,31 @@
   return ::google::protobuf::internal::ParseNamedEnum<EventsConfigurationResponse_Reason>(
     EventsConfigurationResponse_Reason_descriptor(), name, value);
 }
+enum GenericEventInfo_EventSeverity {
+  GenericEventInfo_EventSeverity_EVENT_SEVERITY_UNSPECIFIED = 0,
+  GenericEventInfo_EventSeverity_CRITICAL = 1,
+  GenericEventInfo_EventSeverity_MAJOR = 2,
+  GenericEventInfo_EventSeverity_MINOR = 3,
+  GenericEventInfo_EventSeverity_NORMAL = 4,
+  GenericEventInfo_EventSeverity_INFO = 5,
+  GenericEventInfo_EventSeverity_GenericEventInfo_EventSeverity_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
+  GenericEventInfo_EventSeverity_GenericEventInfo_EventSeverity_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
+};
+bool GenericEventInfo_EventSeverity_IsValid(int value);
+const GenericEventInfo_EventSeverity GenericEventInfo_EventSeverity_EventSeverity_MIN = GenericEventInfo_EventSeverity_EVENT_SEVERITY_UNSPECIFIED;
+const GenericEventInfo_EventSeverity GenericEventInfo_EventSeverity_EventSeverity_MAX = GenericEventInfo_EventSeverity_INFO;
+const int GenericEventInfo_EventSeverity_EventSeverity_ARRAYSIZE = GenericEventInfo_EventSeverity_EventSeverity_MAX + 1;
+
+const ::google::protobuf::EnumDescriptor* GenericEventInfo_EventSeverity_descriptor();
+inline const ::std::string& GenericEventInfo_EventSeverity_Name(GenericEventInfo_EventSeverity value) {
+  return ::google::protobuf::internal::NameOfEnum(
+    GenericEventInfo_EventSeverity_descriptor(), value);
+}
+inline bool GenericEventInfo_EventSeverity_Parse(
+    const ::std::string& name, GenericEventInfo_EventSeverity* value) {
+  return ::google::protobuf::internal::ParseNamedEnum<GenericEventInfo_EventSeverity>(
+    GenericEventInfo_EventSeverity_descriptor(), name, value);
+}
 enum EventIds {
   EVENT_NAME_UNDEFINED = 0,
   EVENT_TRANSCEIVER_PLUG_OUT = 100,
@@ -237,12 +266,13 @@
   EVENT_COMPONENT_ALARM_STATE_CHANGED = 702,
   EVENT_COMPONENT_USAGE_STATE_CHANGED = 703,
   EVENT_COMPONENT_STANDBY_STATE_CHANGED = 704,
+  EVENT_COMPONENT_GENERIC_EVENT = 705,
   EventIds_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
   EventIds_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
 };
 bool EventIds_IsValid(int value);
 const EventIds EventIds_MIN = EVENT_NAME_UNDEFINED;
-const EventIds EventIds_MAX = EVENT_COMPONENT_STANDBY_STATE_CHANGED;
+const EventIds EventIds_MAX = EVENT_COMPONENT_GENERIC_EVENT;
 const int EventIds_ARRAYSIZE = EventIds_MAX + 1;
 
 const ::google::protobuf::EnumDescriptor* EventIds_descriptor();
@@ -2476,6 +2506,182 @@
 };
 // -------------------------------------------------------------------
 
+class GenericEventInfo final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.GenericEventInfo) */ {
+ public:
+  GenericEventInfo();
+  virtual ~GenericEventInfo();
+
+  GenericEventInfo(const GenericEventInfo& from);
+
+  inline GenericEventInfo& operator=(const GenericEventInfo& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  GenericEventInfo(GenericEventInfo&& from) noexcept
+    : GenericEventInfo() {
+    *this = ::std::move(from);
+  }
+
+  inline GenericEventInfo& operator=(GenericEventInfo&& from) noexcept {
+    if (GetArenaNoVirtual() == from.GetArenaNoVirtual()) {
+      if (this != &from) InternalSwap(&from);
+    } else {
+      CopyFrom(from);
+    }
+    return *this;
+  }
+  #endif
+  static const ::google::protobuf::Descriptor* descriptor() {
+    return default_instance().GetDescriptor();
+  }
+  static const GenericEventInfo& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const GenericEventInfo* internal_default_instance() {
+    return reinterpret_cast<const GenericEventInfo*>(
+               &_GenericEventInfo_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    16;
+
+  void Swap(GenericEventInfo* other);
+  friend void swap(GenericEventInfo& a, GenericEventInfo& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline GenericEventInfo* New() const final {
+    return CreateMaybeMessage<GenericEventInfo>(nullptr);
+  }
+
+  GenericEventInfo* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<GenericEventInfo>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const GenericEventInfo& from);
+  void MergeFrom(const GenericEventInfo& from);
+  PROTOBUF_ATTRIBUTE_REINITIALIZES void Clear() final;
+  bool IsInitialized() const final;
+
+  size_t ByteSizeLong() const final;
+  #if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+  static const char* _InternalParse(const char* begin, const char* end, void* object, ::google::protobuf::internal::ParseContext* ctx);
+  ::google::protobuf::internal::ParseFunc _ParseFunc() const final { return _InternalParse; }
+  #else
+  bool MergePartialFromCodedStream(
+      ::google::protobuf::io::CodedInputStream* input) final;
+  #endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+  void SerializeWithCachedSizes(
+      ::google::protobuf::io::CodedOutputStream* output) const final;
+  ::google::protobuf::uint8* InternalSerializeWithCachedSizesToArray(
+      ::google::protobuf::uint8* target) const final;
+  int GetCachedSize() const final { return _cached_size_.Get(); }
+
+  private:
+  void SharedCtor();
+  void SharedDtor();
+  void SetCachedSize(int size) const final;
+  void InternalSwap(GenericEventInfo* other);
+  private:
+  inline ::google::protobuf::Arena* GetArenaNoVirtual() const {
+    return nullptr;
+  }
+  inline void* MaybeArenaPtr() const {
+    return nullptr;
+  }
+  public:
+
+  ::google::protobuf::Metadata GetMetadata() const final;
+
+  // nested types ----------------------------------------------------
+
+  typedef GenericEventInfo_EventSeverity EventSeverity;
+  static const EventSeverity EVENT_SEVERITY_UNSPECIFIED =
+    GenericEventInfo_EventSeverity_EVENT_SEVERITY_UNSPECIFIED;
+  static const EventSeverity CRITICAL =
+    GenericEventInfo_EventSeverity_CRITICAL;
+  static const EventSeverity MAJOR =
+    GenericEventInfo_EventSeverity_MAJOR;
+  static const EventSeverity MINOR =
+    GenericEventInfo_EventSeverity_MINOR;
+  static const EventSeverity NORMAL =
+    GenericEventInfo_EventSeverity_NORMAL;
+  static const EventSeverity INFO =
+    GenericEventInfo_EventSeverity_INFO;
+  static inline bool EventSeverity_IsValid(int value) {
+    return GenericEventInfo_EventSeverity_IsValid(value);
+  }
+  static const EventSeverity EventSeverity_MIN =
+    GenericEventInfo_EventSeverity_EventSeverity_MIN;
+  static const EventSeverity EventSeverity_MAX =
+    GenericEventInfo_EventSeverity_EventSeverity_MAX;
+  static const int EventSeverity_ARRAYSIZE =
+    GenericEventInfo_EventSeverity_EventSeverity_ARRAYSIZE;
+  static inline const ::google::protobuf::EnumDescriptor*
+  EventSeverity_descriptor() {
+    return GenericEventInfo_EventSeverity_descriptor();
+  }
+  static inline const ::std::string& EventSeverity_Name(EventSeverity value) {
+    return GenericEventInfo_EventSeverity_Name(value);
+  }
+  static inline bool EventSeverity_Parse(const ::std::string& name,
+      EventSeverity* value) {
+    return GenericEventInfo_EventSeverity_Parse(name, value);
+  }
+
+  // accessors -------------------------------------------------------
+
+  // string message = 1;
+  void clear_message();
+  static const int kMessageFieldNumber = 1;
+  const ::std::string& message() const;
+  void set_message(const ::std::string& value);
+  #if LANG_CXX11
+  void set_message(::std::string&& value);
+  #endif
+  void set_message(const char* value);
+  void set_message(const char* value, size_t size);
+  ::std::string* mutable_message();
+  ::std::string* release_message();
+  void set_allocated_message(::std::string* message);
+
+  // string message_code = 2;
+  void clear_message_code();
+  static const int kMessageCodeFieldNumber = 2;
+  const ::std::string& message_code() const;
+  void set_message_code(const ::std::string& value);
+  #if LANG_CXX11
+  void set_message_code(::std::string&& value);
+  #endif
+  void set_message_code(const char* value);
+  void set_message_code(const char* value, size_t size);
+  ::std::string* mutable_message_code();
+  ::std::string* release_message_code();
+  void set_allocated_message_code(::std::string* message_code);
+
+  // .dmi.GenericEventInfo.EventSeverity severity = 3;
+  void clear_severity();
+  static const int kSeverityFieldNumber = 3;
+  ::dmi::GenericEventInfo_EventSeverity severity() const;
+  void set_severity(::dmi::GenericEventInfo_EventSeverity value);
+
+  // @@protoc_insertion_point(class_scope:dmi.GenericEventInfo)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::internal::ArenaStringPtr message_;
+  ::google::protobuf::internal::ArenaStringPtr message_code_;
+  int severity_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
 class Event final :
     public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.Event) */ {
  public:
@@ -2514,7 +2720,7 @@
                &_Event_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    16;
+    17;
 
   void Swap(Event* other);
   friend void swap(Event& a, Event& b) {
@@ -2621,6 +2827,15 @@
   ::dmi::StateChangeInfo* mutable_state_change_info();
   void set_allocated_state_change_info(::dmi::StateChangeInfo* state_change_info);
 
+  // .dmi.GenericEventInfo generic_event_info = 7;
+  bool has_generic_event_info() const;
+  void clear_generic_event_info();
+  static const int kGenericEventInfoFieldNumber = 7;
+  const ::dmi::GenericEventInfo& generic_event_info() const;
+  ::dmi::GenericEventInfo* release_generic_event_info();
+  ::dmi::GenericEventInfo* mutable_generic_event_info();
+  void set_allocated_generic_event_info(::dmi::GenericEventInfo* generic_event_info);
+
   // .dmi.EventIds event_id = 2;
   void clear_event_id();
   static const int kEventIdFieldNumber = 2;
@@ -2637,6 +2852,7 @@
   ::google::protobuf::Timestamp* raised_ts_;
   ::dmi::ThresholdInformation* threshold_info_;
   ::dmi::StateChangeInfo* state_change_info_;
+  ::dmi::GenericEventInfo* generic_event_info_;
   int event_id_;
   mutable ::google::protobuf::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
@@ -4107,6 +4323,130 @@
 }
 // -------------------------------------------------------------------
 
+// GenericEventInfo
+
+// string message = 1;
+inline void GenericEventInfo::clear_message() {
+  message_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& GenericEventInfo::message() const {
+  // @@protoc_insertion_point(field_get:dmi.GenericEventInfo.message)
+  return message_.GetNoArena();
+}
+inline void GenericEventInfo::set_message(const ::std::string& value) {
+  
+  message_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.GenericEventInfo.message)
+}
+#if LANG_CXX11
+inline void GenericEventInfo::set_message(::std::string&& value) {
+  
+  message_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.GenericEventInfo.message)
+}
+#endif
+inline void GenericEventInfo::set_message(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  message_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.GenericEventInfo.message)
+}
+inline void GenericEventInfo::set_message(const char* value, size_t size) {
+  
+  message_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.GenericEventInfo.message)
+}
+inline ::std::string* GenericEventInfo::mutable_message() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.GenericEventInfo.message)
+  return message_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* GenericEventInfo::release_message() {
+  // @@protoc_insertion_point(field_release:dmi.GenericEventInfo.message)
+  
+  return message_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void GenericEventInfo::set_allocated_message(::std::string* message) {
+  if (message != nullptr) {
+    
+  } else {
+    
+  }
+  message_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), message);
+  // @@protoc_insertion_point(field_set_allocated:dmi.GenericEventInfo.message)
+}
+
+// string message_code = 2;
+inline void GenericEventInfo::clear_message_code() {
+  message_code_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& GenericEventInfo::message_code() const {
+  // @@protoc_insertion_point(field_get:dmi.GenericEventInfo.message_code)
+  return message_code_.GetNoArena();
+}
+inline void GenericEventInfo::set_message_code(const ::std::string& value) {
+  
+  message_code_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.GenericEventInfo.message_code)
+}
+#if LANG_CXX11
+inline void GenericEventInfo::set_message_code(::std::string&& value) {
+  
+  message_code_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.GenericEventInfo.message_code)
+}
+#endif
+inline void GenericEventInfo::set_message_code(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  message_code_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.GenericEventInfo.message_code)
+}
+inline void GenericEventInfo::set_message_code(const char* value, size_t size) {
+  
+  message_code_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.GenericEventInfo.message_code)
+}
+inline ::std::string* GenericEventInfo::mutable_message_code() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.GenericEventInfo.message_code)
+  return message_code_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* GenericEventInfo::release_message_code() {
+  // @@protoc_insertion_point(field_release:dmi.GenericEventInfo.message_code)
+  
+  return message_code_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void GenericEventInfo::set_allocated_message_code(::std::string* message_code) {
+  if (message_code != nullptr) {
+    
+  } else {
+    
+  }
+  message_code_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), message_code);
+  // @@protoc_insertion_point(field_set_allocated:dmi.GenericEventInfo.message_code)
+}
+
+// .dmi.GenericEventInfo.EventSeverity severity = 3;
+inline void GenericEventInfo::clear_severity() {
+  severity_ = 0;
+}
+inline ::dmi::GenericEventInfo_EventSeverity GenericEventInfo::severity() const {
+  // @@protoc_insertion_point(field_get:dmi.GenericEventInfo.severity)
+  return static_cast< ::dmi::GenericEventInfo_EventSeverity >(severity_);
+}
+inline void GenericEventInfo::set_severity(::dmi::GenericEventInfo_EventSeverity value) {
+  
+  severity_ = value;
+  // @@protoc_insertion_point(field_set:dmi.GenericEventInfo.severity)
+}
+
+// -------------------------------------------------------------------
+
 // Event
 
 // .dmi.EventMetaData event_metadata = 1;
@@ -4375,6 +4715,57 @@
   // @@protoc_insertion_point(field_set_allocated:dmi.Event.state_change_info)
 }
 
+// .dmi.GenericEventInfo generic_event_info = 7;
+inline bool Event::has_generic_event_info() const {
+  return this != internal_default_instance() && generic_event_info_ != nullptr;
+}
+inline void Event::clear_generic_event_info() {
+  if (GetArenaNoVirtual() == nullptr && generic_event_info_ != nullptr) {
+    delete generic_event_info_;
+  }
+  generic_event_info_ = nullptr;
+}
+inline const ::dmi::GenericEventInfo& Event::generic_event_info() const {
+  const ::dmi::GenericEventInfo* p = generic_event_info_;
+  // @@protoc_insertion_point(field_get:dmi.Event.generic_event_info)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::GenericEventInfo*>(
+      &::dmi::_GenericEventInfo_default_instance_);
+}
+inline ::dmi::GenericEventInfo* Event::release_generic_event_info() {
+  // @@protoc_insertion_point(field_release:dmi.Event.generic_event_info)
+  
+  ::dmi::GenericEventInfo* temp = generic_event_info_;
+  generic_event_info_ = nullptr;
+  return temp;
+}
+inline ::dmi::GenericEventInfo* Event::mutable_generic_event_info() {
+  
+  if (generic_event_info_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::GenericEventInfo>(GetArenaNoVirtual());
+    generic_event_info_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.Event.generic_event_info)
+  return generic_event_info_;
+}
+inline void Event::set_allocated_generic_event_info(::dmi::GenericEventInfo* generic_event_info) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete generic_event_info_;
+  }
+  if (generic_event_info) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      generic_event_info = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, generic_event_info, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  generic_event_info_ = generic_event_info;
+  // @@protoc_insertion_point(field_set_allocated:dmi.Event.generic_event_info)
+}
+
 #ifdef __GNUC__
   #pragma GCC diagnostic pop
 #endif  // __GNUC__
@@ -4410,6 +4801,8 @@
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 
@@ -4428,6 +4821,11 @@
 inline const EnumDescriptor* GetEnumDescriptor< ::dmi::EventsConfigurationResponse_Reason>() {
   return ::dmi::EventsConfigurationResponse_Reason_descriptor();
 }
+template <> struct is_proto_enum< ::dmi::GenericEventInfo_EventSeverity> : ::std::true_type {};
+template <>
+inline const EnumDescriptor* GetEnumDescriptor< ::dmi::GenericEventInfo_EventSeverity>() {
+  return ::dmi::GenericEventInfo_EventSeverity_descriptor();
+}
 template <> struct is_proto_enum< ::dmi::EventIds> : ::std::true_type {};
 template <>
 inline const EnumDescriptor* GetEnumDescriptor< ::dmi::EventIds>() {
