diff --git a/cpp/dmi/hw.pb.cc b/cpp/dmi/hw.pb.cc
index 563ab4d..d25ab3d 100644
--- a/cpp/dmi/hw.pb.cc
+++ b/cpp/dmi/hw.pb.cc
@@ -689,67 +689,75 @@
   "NT_TYPE_CPU\020\n\022\032\n\026COMPONENT_TYPE_BATTERY\020"
   "\013\022\032\n\026COMPONENT_TYPE_STORAGE\020\014\022\031\n\025COMPONE"
   "NT_TYPE_MEMORY\020\r\022\036\n\032COMPONENT_TYPE_TRANS"
-  "CEIVER\020\016*\263\001\n\023ComponentAdminState\022\036\n\032COMP"
+  "CEIVER\020\016*\363\001\n\023ComponentAdminState\022\036\n\032COMP"
   "_ADMIN_STATE_UNDEFINED\020\000\022\034\n\030COMP_ADMIN_S"
   "TATE_UNKNOWN\020\001\022\033\n\027COMP_ADMIN_STATE_LOCKE"
   "D\020\002\022\"\n\036COMP_ADMIN_STATE_SHUTTING_DOWN\020\003\022"
-  "\035\n\031COMP_ADMIN_STATE_UNLOCKED\020\004*\250\001\n\022Compo"
-  "nentOperState\022\035\n\031COMP_OPER_STATE_UNDEFIN"
-  "ED\020\000\022\033\n\027COMP_OPER_STATE_UNKNOWN\020\001\022\034\n\030COM"
-  "P_OPER_STATE_DISABLED\020\002\022\033\n\027COMP_OPER_STA"
-  "TE_ENABLED\020\003\022\033\n\027COMP_OPER_STATE_TESTING\020"
-  "\004*\246\001\n\023ComponentUsageState\022\036\n\032COMP_USAGE_"
-  "STATE_UNDEFINED\020\000\022\034\n\030COMP_USAGE_STATE_UN"
-  "KNOWN\020\001\022\031\n\025COMP_USAGE_STATE_IDLE\020\002\022\033\n\027CO"
-  "MP_USAGE_STATE_ACTIVE\020\003\022\031\n\025COMP_USAGE_ST"
-  "ATE_BUSY\020\004*\217\002\n\023ComponentAlarmState\022\036\n\032CO"
-  "MP_ALARM_STATE_UNDEFINED\020\000\022\034\n\030COMP_ALARM"
-  "_STATE_UNKNOWN\020\001\022!\n\035COMP_ALARM_STATE_UND"
-  "ER_REPAIR\020\002\022\035\n\031COMP_ALARM_STATE_CRITICAL"
-  "\020\003\022\032\n\026COMP_ALARM_STATE_MAJOR\020\004\022\032\n\026COMP_A"
-  "LARM_STATE_MINOR\020\005\022\034\n\030COMP_ALARM_STATE_W"
-  "ARNING\020\006\022\"\n\036COMP_ALARM_STATE_INDETERMINA"
-  "TE\020\007*\274\001\n\025ComponentStandbyState\022 \n\034COMP_S"
-  "TANDBY_STATE_UNDEFINED\020\000\022\036\n\032COMP_STANDBY"
-  "_STATE_UNKNOWN\020\001\022\032\n\026COMP_STANDBY_STATE_H"
-  "OT\020\002\022\033\n\027COMP_STANDBY_STATE_COLD\020\003\022(\n$COM"
-  "P_STANDBY_STATE_PROVIDING_SERVICE\020\004*\235\003\n\r"
-  "DataValueType\022\030\n\024VALUE_TYPE_UNDEFINED\020\000\022"
-  "\024\n\020VALUE_TYPE_OTHER\020\001\022\026\n\022VALUE_TYPE_UNKN"
-  "OWN\020\002\022\027\n\023VALUE_TYPE_VOLTS_AC\020\003\022\027\n\023VALUE_"
-  "TYPE_VOLTS_DC\020\004\022\026\n\022VALUE_TYPE_AMPERES\020\005\022"
-  "\024\n\020VALUE_TYPE_WATTS\020\006\022\024\n\020VALUE_TYPE_HERT"
-  "Z\020\007\022\026\n\022VALUE_TYPE_CELSIUS\020\010\022\031\n\025VALUE_TYP"
-  "E_PERCENT_RH\020\t\022\022\n\016VALUE_TYPE_RPM\020\n\022\022\n\016VA"
-  "LUE_TYPE_CMM\020\013\022\032\n\026VALUE_TYPE_TRUTH_VALUE"
-  "\020\014\022\026\n\022VALUE_TYPE_PERCENT\020\r\022\025\n\021VALUE_TYPE"
-  "_METERS\020\016\022\024\n\020VALUE_TYPE_BYTES\020\017\022\022\n\016VALUE"
-  "_TYPE_DBM\020\020*\244\003\n\nValueScale\022\031\n\025VALUE_SCAL"
-  "E_UNDEFINED\020\000\022\025\n\021VALUE_SCALE_YOCTO\020\001\022\025\n\021"
-  "VALUE_SCALE_ZEPTO\020\002\022\024\n\020VALUE_SCALE_ATTO\020"
-  "\003\022\025\n\021VALUE_SCALE_FEMTO\020\004\022\024\n\020VALUE_SCALE_"
-  "PICO\020\005\022\024\n\020VALUE_SCALE_NANO\020\006\022\025\n\021VALUE_SC"
-  "ALE_MICRO\020\007\022\025\n\021VALUE_SCALE_MILLI\020\010\022\025\n\021VA"
-  "LUE_SCALE_UNITS\020\t\022\024\n\020VALUE_SCALE_KILO\020\n\022"
-  "\024\n\020VALUE_SCALE_MEGA\020\013\022\024\n\020VALUE_SCALE_GIG"
-  "A\020\014\022\024\n\020VALUE_SCALE_TERA\020\r\022\024\n\020VALUE_SCALE"
-  "_PETA\020\016\022\023\n\017VALUE_SCALE_EXA\020\017\022\025\n\021VALUE_SC"
-  "ALE_ZETTA\020\020\022\025\n\021VALUE_SCALE_YOTTA\020\021*\202\001\n\014S"
-  "ensorStatus\022\033\n\027SENSOR_STATUS_UNDEFINED\020\000"
-  "\022\024\n\020SENSOR_STATUS_OK\020\001\022\035\n\031SENSOR_STATUS_"
-  "UNAVAILABLE\020\002\022 \n\034SENSOR_STATUS_NONOPERAT"
-  "IONAL\020\003*\244\001\n\017TransceiverType\022\022\n\016TYPE_UNDE"
-  "FINED\020\000\022\014\n\010ETHERNET\020\001\022\010\n\004GPON\020\002\022\t\n\005XGPON"
-  "\020\003\022\n\n\006XGSPON\020\004\022\010\n\004CPON\020\005\022\013\n\007NG_PON2\020\006\022\010\n"
-  "\004EPON\020\007\022\025\n\021COMBO_GPON_XGSPON\020\010\022\026\n\021TYPE_N"
-  "OT_DETECTED\020\377\001B;Z9github.com/opencord/de"
-  "vice-management-interface/v3/go/dmib\006pro"
-  "to3"
+  "\035\n\031COMP_ADMIN_STATE_UNLOCKED\020\004\022\035\n\031COMP_A"
+  "DMIN_STATE_ISOLATED\020\006\022\037\n\033COMP_ADMIN_STAT"
+  "E_PROHIBITED\020\005*\303\003\n\022ComponentOperState\022\035\n"
+  "\031COMP_OPER_STATE_UNDEFINED\020\000\022\033\n\027COMP_OPE"
+  "R_STATE_UNKNOWN\020\001\022\034\n\030COMP_OPER_STATE_DIS"
+  "ABLED\020\002\022\033\n\027COMP_OPER_STATE_ENABLED\020\003\022\033\n\027"
+  "COMP_OPER_STATE_TESTING\020\004\022\032\n\026COMP_OPER_S"
+  "TATE_NORMAL\020\005\022\037\n\033COMP_OPER_STATE_CONFIGU"
+  "RING\020\006\022%\n!COMP_OPER_STATE_AUTOMATIC_LOAD"
+  "ING\020\007\022\032\n\026COMP_OPER_STATE_FAILED\020\010\022&\n\"COM"
+  "P_OPER_STATE_HIGH_TEMP_SHUTDOWN\020\t\022#\n\037COM"
+  "P_OPER_STATE_MANUAL_SHUTDOWN\020\n\022)\n%COMP_O"
+  "PER_STATE_POWER_SAVING_SHUTDOWN\020\013\022!\n\035COM"
+  "P_OPER_STATE_TYPE_MISMATCH\020\014*\246\001\n\023Compone"
+  "ntUsageState\022\036\n\032COMP_USAGE_STATE_UNDEFIN"
+  "ED\020\000\022\034\n\030COMP_USAGE_STATE_UNKNOWN\020\001\022\031\n\025CO"
+  "MP_USAGE_STATE_IDLE\020\002\022\033\n\027COMP_USAGE_STAT"
+  "E_ACTIVE\020\003\022\031\n\025COMP_USAGE_STATE_BUSY\020\004*\217\002"
+  "\n\023ComponentAlarmState\022\036\n\032COMP_ALARM_STAT"
+  "E_UNDEFINED\020\000\022\034\n\030COMP_ALARM_STATE_UNKNOW"
+  "N\020\001\022!\n\035COMP_ALARM_STATE_UNDER_REPAIR\020\002\022\035"
+  "\n\031COMP_ALARM_STATE_CRITICAL\020\003\022\032\n\026COMP_AL"
+  "ARM_STATE_MAJOR\020\004\022\032\n\026COMP_ALARM_STATE_MI"
+  "NOR\020\005\022\034\n\030COMP_ALARM_STATE_WARNING\020\006\022\"\n\036C"
+  "OMP_ALARM_STATE_INDETERMINATE\020\007*\274\001\n\025Comp"
+  "onentStandbyState\022 \n\034COMP_STANDBY_STATE_"
+  "UNDEFINED\020\000\022\036\n\032COMP_STANDBY_STATE_UNKNOW"
+  "N\020\001\022\032\n\026COMP_STANDBY_STATE_HOT\020\002\022\033\n\027COMP_"
+  "STANDBY_STATE_COLD\020\003\022(\n$COMP_STANDBY_STA"
+  "TE_PROVIDING_SERVICE\020\004*\235\003\n\rDataValueType"
+  "\022\030\n\024VALUE_TYPE_UNDEFINED\020\000\022\024\n\020VALUE_TYPE"
+  "_OTHER\020\001\022\026\n\022VALUE_TYPE_UNKNOWN\020\002\022\027\n\023VALU"
+  "E_TYPE_VOLTS_AC\020\003\022\027\n\023VALUE_TYPE_VOLTS_DC"
+  "\020\004\022\026\n\022VALUE_TYPE_AMPERES\020\005\022\024\n\020VALUE_TYPE"
+  "_WATTS\020\006\022\024\n\020VALUE_TYPE_HERTZ\020\007\022\026\n\022VALUE_"
+  "TYPE_CELSIUS\020\010\022\031\n\025VALUE_TYPE_PERCENT_RH\020"
+  "\t\022\022\n\016VALUE_TYPE_RPM\020\n\022\022\n\016VALUE_TYPE_CMM\020"
+  "\013\022\032\n\026VALUE_TYPE_TRUTH_VALUE\020\014\022\026\n\022VALUE_T"
+  "YPE_PERCENT\020\r\022\025\n\021VALUE_TYPE_METERS\020\016\022\024\n\020"
+  "VALUE_TYPE_BYTES\020\017\022\022\n\016VALUE_TYPE_DBM\020\020*\244"
+  "\003\n\nValueScale\022\031\n\025VALUE_SCALE_UNDEFINED\020\000"
+  "\022\025\n\021VALUE_SCALE_YOCTO\020\001\022\025\n\021VALUE_SCALE_Z"
+  "EPTO\020\002\022\024\n\020VALUE_SCALE_ATTO\020\003\022\025\n\021VALUE_SC"
+  "ALE_FEMTO\020\004\022\024\n\020VALUE_SCALE_PICO\020\005\022\024\n\020VAL"
+  "UE_SCALE_NANO\020\006\022\025\n\021VALUE_SCALE_MICRO\020\007\022\025"
+  "\n\021VALUE_SCALE_MILLI\020\010\022\025\n\021VALUE_SCALE_UNI"
+  "TS\020\t\022\024\n\020VALUE_SCALE_KILO\020\n\022\024\n\020VALUE_SCAL"
+  "E_MEGA\020\013\022\024\n\020VALUE_SCALE_GIGA\020\014\022\024\n\020VALUE_"
+  "SCALE_TERA\020\r\022\024\n\020VALUE_SCALE_PETA\020\016\022\023\n\017VA"
+  "LUE_SCALE_EXA\020\017\022\025\n\021VALUE_SCALE_ZETTA\020\020\022\025"
+  "\n\021VALUE_SCALE_YOTTA\020\021*\202\001\n\014SensorStatus\022\033"
+  "\n\027SENSOR_STATUS_UNDEFINED\020\000\022\024\n\020SENSOR_ST"
+  "ATUS_OK\020\001\022\035\n\031SENSOR_STATUS_UNAVAILABLE\020\002"
+  "\022 \n\034SENSOR_STATUS_NONOPERATIONAL\020\003*\244\001\n\017T"
+  "ransceiverType\022\022\n\016TYPE_UNDEFINED\020\000\022\014\n\010ET"
+  "HERNET\020\001\022\010\n\004GPON\020\002\022\t\n\005XGPON\020\003\022\n\n\006XGSPON\020"
+  "\004\022\010\n\004CPON\020\005\022\013\n\007NG_PON2\020\006\022\010\n\004EPON\020\007\022\025\n\021CO"
+  "MBO_GPON_XGSPON\020\010\022\026\n\021TYPE_NOT_DETECTED\020\377"
+  "\001B;Z9github.com/opencord/device-manageme"
+  "nt-interface/v3/go/dmib\006proto3"
   ;
 ::google::protobuf::internal::DescriptorTable descriptor_table_dmi_2fhw_2eproto = {
   false, InitDefaults_dmi_2fhw_2eproto, 
   descriptor_table_protodef_dmi_2fhw_2eproto,
-  "dmi/hw.proto", &assign_descriptors_table_dmi_2fhw_2eproto, 6523,
+  "dmi/hw.proto", &assign_descriptors_table_dmi_2fhw_2eproto, 6870,
 };
 
 void AddDescriptors_dmi_2fhw_2eproto() {
@@ -976,6 +984,8 @@
     case 2:
     case 3:
     case 4:
+    case 5:
+    case 6:
       return true;
     default:
       return false;
@@ -993,6 +1003,14 @@
     case 2:
     case 3:
     case 4:
+    case 5:
+    case 6:
+    case 7:
+    case 8:
+    case 9:
+    case 10:
+    case 11:
+    case 12:
       return true;
     default:
       return false;
diff --git a/cpp/dmi/hw.pb.h b/cpp/dmi/hw.pb.h
index e32e1f0..e21c9a2 100644
--- a/cpp/dmi/hw.pb.h
+++ b/cpp/dmi/hw.pb.h
@@ -302,12 +302,14 @@
   COMP_ADMIN_STATE_LOCKED = 2,
   COMP_ADMIN_STATE_SHUTTING_DOWN = 3,
   COMP_ADMIN_STATE_UNLOCKED = 4,
+  COMP_ADMIN_STATE_ISOLATED = 6,
+  COMP_ADMIN_STATE_PROHIBITED = 5,
   ComponentAdminState_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
   ComponentAdminState_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
 };
 bool ComponentAdminState_IsValid(int value);
 const ComponentAdminState ComponentAdminState_MIN = COMP_ADMIN_STATE_UNDEFINED;
-const ComponentAdminState ComponentAdminState_MAX = COMP_ADMIN_STATE_UNLOCKED;
+const ComponentAdminState ComponentAdminState_MAX = COMP_ADMIN_STATE_ISOLATED;
 const int ComponentAdminState_ARRAYSIZE = ComponentAdminState_MAX + 1;
 
 const ::google::protobuf::EnumDescriptor* ComponentAdminState_descriptor();
@@ -326,12 +328,20 @@
   COMP_OPER_STATE_DISABLED = 2,
   COMP_OPER_STATE_ENABLED = 3,
   COMP_OPER_STATE_TESTING = 4,
+  COMP_OPER_STATE_NORMAL = 5,
+  COMP_OPER_STATE_CONFIGURING = 6,
+  COMP_OPER_STATE_AUTOMATIC_LOADING = 7,
+  COMP_OPER_STATE_FAILED = 8,
+  COMP_OPER_STATE_HIGH_TEMP_SHUTDOWN = 9,
+  COMP_OPER_STATE_MANUAL_SHUTDOWN = 10,
+  COMP_OPER_STATE_POWER_SAVING_SHUTDOWN = 11,
+  COMP_OPER_STATE_TYPE_MISMATCH = 12,
   ComponentOperState_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
   ComponentOperState_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
 };
 bool ComponentOperState_IsValid(int value);
 const ComponentOperState ComponentOperState_MIN = COMP_OPER_STATE_UNDEFINED;
-const ComponentOperState ComponentOperState_MAX = COMP_OPER_STATE_TESTING;
+const ComponentOperState ComponentOperState_MAX = COMP_OPER_STATE_TYPE_MISMATCH;
 const int ComponentOperState_ARRAYSIZE = ComponentOperState_MAX + 1;
 
 const ::google::protobuf::EnumDescriptor* ComponentOperState_descriptor();
diff --git a/cpp/dmi/hw_events_mgmt_service.pb.cc b/cpp/dmi/hw_events_mgmt_service.pb.cc
index 9166ef3..9a534e6 100644
--- a/cpp/dmi/hw_events_mgmt_service.pb.cc
+++ b/cpp/dmi/hw_events_mgmt_service.pb.cc
@@ -17,6 +17,11 @@
 #include <google/protobuf/port_def.inc>
 
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_Uuid_dmi_2fhw_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_AdminStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_AlarmStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_OperStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_StandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_UsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_ValueType_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_EventMetaData_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_EventsCfg_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
@@ -24,6 +29,7 @@
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<1> scc_info_WaterMarks_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_EventCfg_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<2> scc_info_ThresholdInformation_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+extern PROTOBUF_INTERNAL_EXPORT_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto ::google::protobuf::internal::SCCInfo<5> scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
 extern PROTOBUF_INTERNAL_EXPORT_google_2fprotobuf_2ftimestamp_2eproto ::google::protobuf::internal::SCCInfo<0> scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto;
 namespace dmi {
 class ValueTypeDefaultTypeInternal {
@@ -73,6 +79,35 @@
  public:
   ::google::protobuf::internal::ExplicitlyConstructed<EventMetaData> _instance;
 } _EventMetaData_default_instance_;
+class AdminStateChangeDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<AdminStateChange> _instance;
+} _AdminStateChange_default_instance_;
+class OperStateChangeDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<OperStateChange> _instance;
+} _OperStateChange_default_instance_;
+class AlarmStateChangeDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<AlarmStateChange> _instance;
+} _AlarmStateChange_default_instance_;
+class UsageStateChangeDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<UsageStateChange> _instance;
+} _UsageStateChange_default_instance_;
+class StandbyStateChangeDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<StandbyStateChange> _instance;
+} _StandbyStateChange_default_instance_;
+class StateChangeInfoDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<StateChangeInfo> _instance;
+  const ::dmi::AdminStateChange* admin_state_change_;
+  const ::dmi::OperStateChange* oper_state_change_;
+  const ::dmi::AlarmStateChange* alarm_state_change_;
+  const ::dmi::UsageStateChange* usage_state_change_;
+  const ::dmi::StandbyStateChange* standby_state_change_;
+} _StateChangeInfo_default_instance_;
 class EventDefaultTypeInternal {
  public:
   ::google::protobuf::internal::ExplicitlyConstructed<Event> _instance;
@@ -229,6 +264,95 @@
     {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsEventMetaData_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {
       &scc_info_Uuid_dmi_2fhw_2eproto.base,}};
 
+static void InitDefaultsAdminStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_AdminStateChange_default_instance_;
+    new (ptr) ::dmi::AdminStateChange();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::AdminStateChange::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_AdminStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsAdminStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {}};
+
+static void InitDefaultsOperStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_OperStateChange_default_instance_;
+    new (ptr) ::dmi::OperStateChange();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::OperStateChange::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_OperStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsOperStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {}};
+
+static void InitDefaultsAlarmStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_AlarmStateChange_default_instance_;
+    new (ptr) ::dmi::AlarmStateChange();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::AlarmStateChange::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_AlarmStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsAlarmStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {}};
+
+static void InitDefaultsUsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_UsageStateChange_default_instance_;
+    new (ptr) ::dmi::UsageStateChange();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::UsageStateChange::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_UsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsUsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {}};
+
+static void InitDefaultsStandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_StandbyStateChange_default_instance_;
+    new (ptr) ::dmi::StandbyStateChange();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::StandbyStateChange::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_StandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsStandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {}};
+
+static void InitDefaultsStateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_StateChangeInfo_default_instance_;
+    new (ptr) ::dmi::StateChangeInfo();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::StateChangeInfo::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<5> scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 5, InitDefaultsStateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {
+      &scc_info_AdminStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
+      &scc_info_OperStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
+      &scc_info_AlarmStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
+      &scc_info_UsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
+      &scc_info_StandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,}};
+
 static void InitDefaultsEvent_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
   GOOGLE_PROTOBUF_VERIFY_VERSION;
 
@@ -240,11 +364,12 @@
   ::dmi::Event::InitAsDefaultInstance();
 }
 
-::google::protobuf::internal::SCCInfo<3> scc_info_Event_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
-    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 3, InitDefaultsEvent_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {
+::google::protobuf::internal::SCCInfo<4> scc_info_Event_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 4, InitDefaultsEvent_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto}, {
       &scc_info_EventMetaData_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
       &scc_info_Timestamp_google_2fprotobuf_2ftimestamp_2eproto.base,
-      &scc_info_ThresholdInformation_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,}};
+      &scc_info_ThresholdInformation_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,
+      &scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base,}};
 
 void InitDefaults_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
   ::google::protobuf::internal::InitSCC(&scc_info_ValueType_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
@@ -257,10 +382,16 @@
   ::google::protobuf::internal::InitSCC(&scc_info_EventsConfigurationRequest_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_EventsConfigurationResponse_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_EventMetaData_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_AdminStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_OperStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_AlarmStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_UsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_StandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_Event_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
 }
 
-::google::protobuf::Metadata file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[11];
+::google::protobuf::Metadata file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[17];
 const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[3];
 constexpr ::google::protobuf::ServiceDescriptor const** file_level_service_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto = nullptr;
 
@@ -347,6 +478,52 @@
   PROTOBUF_FIELD_OFFSET(::dmi::EventMetaData, component_uuid_),
   PROTOBUF_FIELD_OFFSET(::dmi::EventMetaData, component_name_),
   ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::AdminStateChange, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::AdminStateChange, old_),
+  PROTOBUF_FIELD_OFFSET(::dmi::AdminStateChange, new__),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::OperStateChange, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::OperStateChange, old_),
+  PROTOBUF_FIELD_OFFSET(::dmi::OperStateChange, new__),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::AlarmStateChange, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::AlarmStateChange, old_),
+  PROTOBUF_FIELD_OFFSET(::dmi::AlarmStateChange, new__),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::UsageStateChange, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::UsageStateChange, old_),
+  PROTOBUF_FIELD_OFFSET(::dmi::UsageStateChange, new__),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::StandbyStateChange, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::StandbyStateChange, old_),
+  PROTOBUF_FIELD_OFFSET(::dmi::StandbyStateChange, new__),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::StateChangeInfo, _internal_metadata_),
+  ~0u,  // no _extensions_
+  PROTOBUF_FIELD_OFFSET(::dmi::StateChangeInfo, _oneof_case_[0]),
+  ~0u,  // no _weak_field_map_
+  offsetof(::dmi::StateChangeInfoDefaultTypeInternal, admin_state_change_),
+  offsetof(::dmi::StateChangeInfoDefaultTypeInternal, oper_state_change_),
+  offsetof(::dmi::StateChangeInfoDefaultTypeInternal, alarm_state_change_),
+  offsetof(::dmi::StateChangeInfoDefaultTypeInternal, usage_state_change_),
+  offsetof(::dmi::StateChangeInfoDefaultTypeInternal, standby_state_change_),
+  PROTOBUF_FIELD_OFFSET(::dmi::StateChangeInfo, state_change_),
+  ~0u,  // no _has_bits_
   PROTOBUF_FIELD_OFFSET(::dmi::Event, _internal_metadata_),
   ~0u,  // no _extensions_
   ~0u,  // no _oneof_case_
@@ -356,6 +533,7 @@
   PROTOBUF_FIELD_OFFSET(::dmi::Event, raised_ts_),
   PROTOBUF_FIELD_OFFSET(::dmi::Event, threshold_info_),
   PROTOBUF_FIELD_OFFSET(::dmi::Event, add_info_),
+  PROTOBUF_FIELD_OFFSET(::dmi::Event, state_change_info_),
 };
 static const ::google::protobuf::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
   { 0, -1, sizeof(::dmi::ValueType)},
@@ -368,7 +546,13 @@
   { 56, -1, sizeof(::dmi::EventsConfigurationRequest)},
   { 65, -1, sizeof(::dmi::EventsConfigurationResponse)},
   { 73, -1, sizeof(::dmi::EventMetaData)},
-  { 81, -1, sizeof(::dmi::Event)},
+  { 81, -1, sizeof(::dmi::AdminStateChange)},
+  { 88, -1, sizeof(::dmi::OperStateChange)},
+  { 95, -1, sizeof(::dmi::AlarmStateChange)},
+  { 102, -1, sizeof(::dmi::UsageStateChange)},
+  { 109, -1, sizeof(::dmi::StandbyStateChange)},
+  { 116, -1, sizeof(::dmi::StateChangeInfo)},
+  { 127, -1, sizeof(::dmi::Event)},
 };
 
 static ::google::protobuf::Message const * const file_default_instances[] = {
@@ -382,13 +566,19 @@
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_EventsConfigurationRequest_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_EventsConfigurationResponse_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_EventMetaData_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_AdminStateChange_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_OperStateChange_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_AlarmStateChange_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_UsageStateChange_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_StandbyStateChange_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_StateChangeInfo_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_Event_default_instance_),
 };
 
 ::google::protobuf::internal::AssignDescriptorsTable assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto = {
   {}, AddDescriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, "dmi/hw_events_mgmt_service.proto", schemas,
   file_default_instances, TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto::offsets,
-  file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 11, file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, file_level_service_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto,
+  file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 17, file_level_enum_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, file_level_service_descriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto,
 };
 
 const char descriptor_table_protodef_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[] =
@@ -428,85 +618,111 @@
   "_CONFIG\020\003\022\026\n\022DEVICE_UNREACHABLE\020\004\"j\n\rEve"
   "ntMetaData\022\036\n\013device_uuid\030\001 \001(\0132\t.dmi.Uu"
   "id\022!\n\016component_uuid\030\002 \001(\0132\t.dmi.Uuid\022\026\n"
-  "\016component_name\030\003 \001(\t\"\310\001\n\005Event\022*\n\016event"
-  "_metadata\030\001 \001(\0132\022.dmi.EventMetaData\022\037\n\010e"
-  "vent_id\030\002 \001(\0162\r.dmi.EventIds\022-\n\traised_t"
-  "s\030\003 \001(\0132\032.google.protobuf.Timestamp\0221\n\016t"
-  "hreshold_info\030\004 \001(\0132\031.dmi.ThresholdInfor"
-  "mation\022\020\n\010add_info\030\005 \001(\t*\342\022\n\010EventIds\022\030\n"
-  "\024EVENT_NAME_UNDEFINED\020\000\022\036\n\032EVENT_TRANSCE"
-  "IVER_PLUG_OUT\020d\022\035\n\031EVENT_TRANSCEIVER_PLU"
-  "G_IN\020e\022-\n)EVENT_TRANSCEIVER_VOLTAGE_ABOV"
-  "E_THRESHOLD\020f\022-\n)EVENT_TRANSCEIVER_VOLTA"
-  "GE_BELOW_THRESHOLD\020g\0221\n-EVENT_TRANSCEIVE"
-  "R_TEMPERATURE_ABOVE_THRESHOLD\020h\0221\n-EVENT"
-  "_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD"
-  "\020i\022-\n)EVENT_TRANSCEIVER_CURRENT_ABOVE_TH"
-  "RESHOLD\020j\022-\n)EVENT_TRANSCEIVER_CURRENT_B"
-  "ELOW_THRESHOLD\020k\022.\n*EVENT_TRANSCEIVER_RX"
-  "_POWER_ABOVE_THRESHOLD\020l\022.\n*EVENT_TRANSC"
-  "EIVER_RX_POWER_BELOW_THRESHOLD\020m\022.\n*EVEN"
-  "T_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD\020n"
-  "\022.\n*EVENT_TRANSCEIVER_TX_POWER_BELOW_THR"
-  "ESHOLD\020o\022\035\n\031EVENT_TRANSCEIVER_FAILURE\020p\022"
-  "7\n3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRES"
-  "HOLD_RECOVERED\020q\0227\n3EVENT_TRANSCEIVER_VO"
-  "LTAGE_BELOW_THRESHOLD_RECOVERED\020r\022;\n7EVE"
-  "NT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHO"
-  "LD_RECOVERED\020s\022;\n7EVENT_TRANSCEIVER_TEMP"
-  "ERATURE_BELOW_THRESHOLD_RECOVERED\020t\0227\n3E"
-  "VENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD"
-  "_RECOVERED\020u\0227\n3EVENT_TRANSCEIVER_CURREN"
-  "T_BELOW_THRESHOLD_RECOVERED\020v\0228\n4EVENT_T"
-  "RANSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECO"
-  "VERED\020w\0228\n4EVENT_TRANSCEIVER_RX_POWER_BE"
-  "LOW_THRESHOLD_RECOVERED\020x\0228\n4EVENT_TRANS"
-  "CEIVER_TX_POWER_ABOVE_THRESHOLD_RECOVERE"
-  "D\020y\0228\n4EVENT_TRANSCEIVER_TX_POWER_BELOW_"
-  "THRESHOLD_RECOVERED\020z\022\'\n#EVENT_TRANSCEIV"
-  "ER_FAILURE_RECOVERED\020{\022\027\n\022EVENT_PSU_PLUG"
-  "_OUT\020\310\001\022\026\n\021EVENT_PSU_PLUG_IN\020\311\001\022\026\n\021EVENT"
-  "_PSU_FAILURE\020\312\001\022 \n\033EVENT_PSU_FAILURE_REC"
-  "OVERED\020\313\001\022\026\n\021EVENT_FAN_FAILURE\020\254\002\022\027\n\022EVE"
-  "NT_FAN_PLUG_OUT\020\255\002\022\026\n\021EVENT_FAN_PLUG_IN\020"
-  "\256\002\022 \n\033EVENT_FAN_FAILURE_RECOVERED\020\257\002\022)\n$"
-  "EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL\020\220\003\022"
-  "&\n!EVENT_CPU_TEMPERATURE_ABOVE_FATAL\020\221\003\022"
-  "3\n.EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_"
-  "RECOVERED\020\222\003\0220\n+EVENT_CPU_TEMPERATURE_AB"
-  "OVE_FATAL_RECOVERED\020\223\003\022$\n\037EVENT_CPU_USAG"
-  "E_ABOVE_THRESHOLD\020\224\003\022.\n)EVENT_CPU_USAGE_"
-  "ABOVE_THRESHOLD_RECOVERED\020\225\003\022\032\n\025EVENT_HW"
-  "_DEVICE_RESET\020\364\003\022/\n*EVENT_HW_DEVICE_TEMP"
-  "ERATURE_ABOVE_CRITICAL\020\365\003\022,\n\'EVENT_HW_DE"
-  "VICE_TEMPERATURE_ABOVE_FATAL\020\366\003\0229\n4EVENT"
-  "_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RE"
-  "COVERED\020\367\003\0226\n1EVENT_HW_DEVICE_TEMPERATUR"
-  "E_ABOVE_FATAL_RECOVERED\020\370\003\022\033\n\026EVENT_HW_D"
-  "EVICE_REBOOT\020\371\003\022\'\n\"EVENT_HW_TEMPERATURE_"
-  "SENSOR_FAILED\020\372\003\022,\n\'EVENT_HW_ALL_TEMPERA"
-  "TURE_SENSORS_FAILED\020\373\003\022(\n#EVENT_HW_DISK_"
-  "USAGE_ABOVE_THRESHOLD\020\374\003\0222\n-EVENT_HW_DIS"
-  "K_USAGE_ABOVE_THRESHOLD_RECOVERED\020\375\003\022*\n%"
-  "EVENT_HW_MEMORY_USAGE_ABOVE_THRESHOLD\020\376\003"
-  "\0224\n/EVENT_HW_MEMORY_USAGE_ABOVE_THRESHOL"
-  "D_RECOVERED\020\377\003\022\036\n\031EVENT_HW_NTP_SYNC_FAIL"
-  "URE\020\200\004\022(\n#EVENT_HW_NTP_SYNC_FAILURE_RECO"
-  "VERED\020\201\004\022\035\n\030EVENT_LINE_CARD_PLUG_OUT\020\330\004\022"
-  "\034\n\027EVENT_LINE_CARD_PLUG_IN\020\331\0042\355\001\n\035Native"
-  "EventsManagementService\0226\n\nListEvents\022\017."
-  "dmi.HardwareID\032\027.dmi.ListEventsResponse\022"
-  "^\n\031UpdateEventsConfiguration\022\037.dmi.Event"
-  "sConfigurationRequest\032 .dmi.EventsConfig"
-  "urationResponse\0224\n\014StreamEvents\022\026.google"
-  ".protobuf.Empty\032\n.dmi.Event0\001B;Z9github."
-  "com/opencord/device-management-interface"
-  "/v3/go/dmib\006proto3"
+  "\016component_name\030\003 \001(\t\"`\n\020AdminStateChang"
+  "e\022%\n\003old\030\001 \001(\0162\030.dmi.ComponentAdminState"
+  "\022%\n\003new\030\002 \001(\0162\030.dmi.ComponentAdminState\""
+  "]\n\017OperStateChange\022$\n\003old\030\001 \001(\0162\027.dmi.Co"
+  "mponentOperState\022$\n\003new\030\002 \001(\0162\027.dmi.Comp"
+  "onentOperState\"`\n\020AlarmStateChange\022%\n\003ol"
+  "d\030\001 \001(\0162\030.dmi.ComponentAlarmState\022%\n\003new"
+  "\030\002 \001(\0162\030.dmi.ComponentAlarmState\"`\n\020Usag"
+  "eStateChange\022%\n\003old\030\001 \001(\0162\030.dmi.Componen"
+  "tUsageState\022%\n\003new\030\002 \001(\0162\030.dmi.Component"
+  "UsageState\"f\n\022StandbyStateChange\022\'\n\003old\030"
+  "\001 \001(\0162\032.dmi.ComponentStandbyState\022\'\n\003new"
+  "\030\002 \001(\0162\032.dmi.ComponentStandbyState\"\254\002\n\017S"
+  "tateChangeInfo\0223\n\022admin_state_change\030\001 \001"
+  "(\0132\025.dmi.AdminStateChangeH\000\0221\n\021oper_stat"
+  "e_change\030\002 \001(\0132\024.dmi.OperStateChangeH\000\0223"
+  "\n\022alarm_state_change\030\003 \001(\0132\025.dmi.AlarmSt"
+  "ateChangeH\000\0223\n\022usage_state_change\030\004 \001(\0132"
+  "\025.dmi.UsageStateChangeH\000\0227\n\024standby_stat"
+  "e_change\030\005 \001(\0132\027.dmi.StandbyStateChangeH"
+  "\000B\016\n\014state_change\"\371\001\n\005Event\022*\n\016event_met"
+  "adata\030\001 \001(\0132\022.dmi.EventMetaData\022\037\n\010event"
+  "_id\030\002 \001(\0162\r.dmi.EventIds\022-\n\traised_ts\030\003 "
+  "\001(\0132\032.google.protobuf.Timestamp\0221\n\016thres"
+  "hold_info\030\004 \001(\0132\031.dmi.ThresholdInformati"
+  "on\022\020\n\010add_info\030\005 \001(\t\022/\n\021state_change_inf"
+  "o\030\006 \001(\0132\024.dmi.StateChangeInfo*\265\024\n\010EventI"
+  "ds\022\030\n\024EVENT_NAME_UNDEFINED\020\000\022\036\n\032EVENT_TR"
+  "ANSCEIVER_PLUG_OUT\020d\022\035\n\031EVENT_TRANSCEIVE"
+  "R_PLUG_IN\020e\022-\n)EVENT_TRANSCEIVER_VOLTAGE"
+  "_ABOVE_THRESHOLD\020f\022-\n)EVENT_TRANSCEIVER_"
+  "VOLTAGE_BELOW_THRESHOLD\020g\0221\n-EVENT_TRANS"
+  "CEIVER_TEMPERATURE_ABOVE_THRESHOLD\020h\0221\n-"
+  "EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRE"
+  "SHOLD\020i\022-\n)EVENT_TRANSCEIVER_CURRENT_ABO"
+  "VE_THRESHOLD\020j\022-\n)EVENT_TRANSCEIVER_CURR"
+  "ENT_BELOW_THRESHOLD\020k\022.\n*EVENT_TRANSCEIV"
+  "ER_RX_POWER_ABOVE_THRESHOLD\020l\022.\n*EVENT_T"
+  "RANSCEIVER_RX_POWER_BELOW_THRESHOLD\020m\022.\n"
+  "*EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESH"
+  "OLD\020n\022.\n*EVENT_TRANSCEIVER_TX_POWER_BELO"
+  "W_THRESHOLD\020o\022\035\n\031EVENT_TRANSCEIVER_FAILU"
+  "RE\020p\0227\n3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_"
+  "THRESHOLD_RECOVERED\020q\0227\n3EVENT_TRANSCEIV"
+  "ER_VOLTAGE_BELOW_THRESHOLD_RECOVERED\020r\022;"
+  "\n7EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_TH"
+  "RESHOLD_RECOVERED\020s\022;\n7EVENT_TRANSCEIVER"
+  "_TEMPERATURE_BELOW_THRESHOLD_RECOVERED\020t"
+  "\0227\n3EVENT_TRANSCEIVER_CURRENT_ABOVE_THRE"
+  "SHOLD_RECOVERED\020u\0227\n3EVENT_TRANSCEIVER_C"
+  "URRENT_BELOW_THRESHOLD_RECOVERED\020v\0228\n4EV"
+  "ENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD"
+  "_RECOVERED\020w\0228\n4EVENT_TRANSCEIVER_RX_POW"
+  "ER_BELOW_THRESHOLD_RECOVERED\020x\0228\n4EVENT_"
+  "TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_REC"
+  "OVERED\020y\0228\n4EVENT_TRANSCEIVER_TX_POWER_B"
+  "ELOW_THRESHOLD_RECOVERED\020z\022\'\n#EVENT_TRAN"
+  "SCEIVER_FAILURE_RECOVERED\020{\022\027\n\022EVENT_PSU"
+  "_PLUG_OUT\020\310\001\022\026\n\021EVENT_PSU_PLUG_IN\020\311\001\022\026\n\021"
+  "EVENT_PSU_FAILURE\020\312\001\022 \n\033EVENT_PSU_FAILUR"
+  "E_RECOVERED\020\313\001\022\026\n\021EVENT_FAN_FAILURE\020\254\002\022\027"
+  "\n\022EVENT_FAN_PLUG_OUT\020\255\002\022\026\n\021EVENT_FAN_PLU"
+  "G_IN\020\256\002\022 \n\033EVENT_FAN_FAILURE_RECOVERED\020\257"
+  "\002\022)\n$EVENT_CPU_TEMPERATURE_ABOVE_CRITICA"
+  "L\020\220\003\022&\n!EVENT_CPU_TEMPERATURE_ABOVE_FATA"
+  "L\020\221\003\0223\n.EVENT_CPU_TEMPERATURE_ABOVE_CRIT"
+  "ICAL_RECOVERED\020\222\003\0220\n+EVENT_CPU_TEMPERATU"
+  "RE_ABOVE_FATAL_RECOVERED\020\223\003\022$\n\037EVENT_CPU"
+  "_USAGE_ABOVE_THRESHOLD\020\224\003\022.\n)EVENT_CPU_U"
+  "SAGE_ABOVE_THRESHOLD_RECOVERED\020\225\003\022\032\n\025EVE"
+  "NT_HW_DEVICE_RESET\020\364\003\022/\n*EVENT_HW_DEVICE"
+  "_TEMPERATURE_ABOVE_CRITICAL\020\365\003\022,\n\'EVENT_"
+  "HW_DEVICE_TEMPERATURE_ABOVE_FATAL\020\366\003\0229\n4"
+  "EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITIC"
+  "AL_RECOVERED\020\367\003\0226\n1EVENT_HW_DEVICE_TEMPE"
+  "RATURE_ABOVE_FATAL_RECOVERED\020\370\003\022\033\n\026EVENT"
+  "_HW_DEVICE_REBOOT\020\371\003\022\'\n\"EVENT_HW_TEMPERA"
+  "TURE_SENSOR_FAILED\020\372\003\022,\n\'EVENT_HW_ALL_TE"
+  "MPERATURE_SENSORS_FAILED\020\373\003\022(\n#EVENT_HW_"
+  "DISK_USAGE_ABOVE_THRESHOLD\020\374\003\0222\n-EVENT_H"
+  "W_DISK_USAGE_ABOVE_THRESHOLD_RECOVERED\020\375"
+  "\003\022*\n%EVENT_HW_MEMORY_USAGE_ABOVE_THRESHO"
+  "LD\020\376\003\0224\n/EVENT_HW_MEMORY_USAGE_ABOVE_THR"
+  "ESHOLD_RECOVERED\020\377\003\022\036\n\031EVENT_HW_NTP_SYNC"
+  "_FAILURE\020\200\004\022(\n#EVENT_HW_NTP_SYNC_FAILURE"
+  "_RECOVERED\020\201\004\022\035\n\030EVENT_LINE_CARD_PLUG_OU"
+  "T\020\330\004\022\034\n\027EVENT_LINE_CARD_PLUG_IN\020\331\004\022(\n#EV"
+  "ENT_COMPONENT_ADMIN_STATE_CHANGED\020\274\005\022\'\n\""
+  "EVENT_COMPONENT_OPER_STATE_CHANGED\020\275\005\022(\n"
+  "#EVENT_COMPONENT_ALARM_STATE_CHANGED\020\276\005\022"
+  "(\n#EVENT_COMPONENT_USAGE_STATE_CHANGED\020\277"
+  "\005\022*\n%EVENT_COMPONENT_STANDBY_STATE_CHANG"
+  "ED\020\300\0052\355\001\n\035NativeEventsManagementService\022"
+  "6\n\nListEvents\022\017.dmi.HardwareID\032\027.dmi.Lis"
+  "tEventsResponse\022^\n\031UpdateEventsConfigura"
+  "tion\022\037.dmi.EventsConfigurationRequest\032 ."
+  "dmi.EventsConfigurationResponse\0224\n\014Strea"
+  "mEvents\022\026.google.protobuf.Empty\032\n.dmi.Ev"
+  "ent0\001B;Z9github.com/opencord/device-mana"
+  "gement-interface/v3/go/dmib\006proto3"
   ;
 ::google::protobuf::internal::DescriptorTable descriptor_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto = {
   false, InitDefaults_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 
   descriptor_table_protodef_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto,
-  "dmi/hw_events_mgmt_service.proto", &assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 4378,
+  "dmi/hw_events_mgmt_service.proto", &assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto, 5434,
 };
 
 void AddDescriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto() {
@@ -636,6 +852,11 @@
     case 513:
     case 600:
     case 601:
+    case 700:
+    case 701:
+    case 702:
+    case 703:
+    case 704:
       return true;
     default:
       return false;
@@ -4705,6 +4926,2220 @@
 
 // ===================================================================
 
+void AdminStateChange::InitAsDefaultInstance() {
+}
+class AdminStateChange::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int AdminStateChange::kOldFieldNumber;
+const int AdminStateChange::kNewFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+AdminStateChange::AdminStateChange()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.AdminStateChange)
+}
+AdminStateChange::AdminStateChange(const AdminStateChange& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::memcpy(&old_, &from.old_,
+    static_cast<size_t>(reinterpret_cast<char*>(&new__) -
+    reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  // @@protoc_insertion_point(copy_constructor:dmi.AdminStateChange)
+}
+
+void AdminStateChange::SharedCtor() {
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+}
+
+AdminStateChange::~AdminStateChange() {
+  // @@protoc_insertion_point(destructor:dmi.AdminStateChange)
+  SharedDtor();
+}
+
+void AdminStateChange::SharedDtor() {
+}
+
+void AdminStateChange::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const AdminStateChange& AdminStateChange::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_AdminStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void AdminStateChange::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.AdminStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* AdminStateChange::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<AdminStateChange*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.ComponentAdminState old = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 8) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_old(static_cast<::dmi::ComponentAdminState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // .dmi.ComponentAdminState new = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 16) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_new_(static_cast<::dmi::ComponentAdminState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool AdminStateChange::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.AdminStateChange)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.ComponentAdminState old = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (8 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_old(static_cast< ::dmi::ComponentAdminState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.ComponentAdminState new = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (16 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_new_(static_cast< ::dmi::ComponentAdminState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.AdminStateChange)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.AdminStateChange)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void AdminStateChange::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.AdminStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentAdminState old = 1;
+  if (this->old() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      1, this->old(), output);
+  }
+
+  // .dmi.ComponentAdminState new = 2;
+  if (this->new_() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->new_(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.AdminStateChange)
+}
+
+::google::protobuf::uint8* AdminStateChange::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.AdminStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentAdminState old = 1;
+  if (this->old() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      1, this->old(), target);
+  }
+
+  // .dmi.ComponentAdminState new = 2;
+  if (this->new_() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      2, this->new_(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.AdminStateChange)
+  return target;
+}
+
+size_t AdminStateChange::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.AdminStateChange)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // .dmi.ComponentAdminState old = 1;
+  if (this->old() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->old());
+  }
+
+  // .dmi.ComponentAdminState new = 2;
+  if (this->new_() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->new_());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void AdminStateChange::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.AdminStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  const AdminStateChange* source =
+      ::google::protobuf::DynamicCastToGenerated<AdminStateChange>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.AdminStateChange)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.AdminStateChange)
+    MergeFrom(*source);
+  }
+}
+
+void AdminStateChange::MergeFrom(const AdminStateChange& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.AdminStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.old() != 0) {
+    set_old(from.old());
+  }
+  if (from.new_() != 0) {
+    set_new_(from.new_());
+  }
+}
+
+void AdminStateChange::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.AdminStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void AdminStateChange::CopyFrom(const AdminStateChange& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.AdminStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool AdminStateChange::IsInitialized() const {
+  return true;
+}
+
+void AdminStateChange::Swap(AdminStateChange* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void AdminStateChange::InternalSwap(AdminStateChange* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  swap(old_, other->old_);
+  swap(new__, other->new__);
+}
+
+::google::protobuf::Metadata AdminStateChange::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void OperStateChange::InitAsDefaultInstance() {
+}
+class OperStateChange::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int OperStateChange::kOldFieldNumber;
+const int OperStateChange::kNewFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+OperStateChange::OperStateChange()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.OperStateChange)
+}
+OperStateChange::OperStateChange(const OperStateChange& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::memcpy(&old_, &from.old_,
+    static_cast<size_t>(reinterpret_cast<char*>(&new__) -
+    reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  // @@protoc_insertion_point(copy_constructor:dmi.OperStateChange)
+}
+
+void OperStateChange::SharedCtor() {
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+}
+
+OperStateChange::~OperStateChange() {
+  // @@protoc_insertion_point(destructor:dmi.OperStateChange)
+  SharedDtor();
+}
+
+void OperStateChange::SharedDtor() {
+}
+
+void OperStateChange::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const OperStateChange& OperStateChange::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_OperStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void OperStateChange::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.OperStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* OperStateChange::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<OperStateChange*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.ComponentOperState old = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 8) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_old(static_cast<::dmi::ComponentOperState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // .dmi.ComponentOperState new = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 16) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_new_(static_cast<::dmi::ComponentOperState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool OperStateChange::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.OperStateChange)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.ComponentOperState old = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (8 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_old(static_cast< ::dmi::ComponentOperState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.ComponentOperState new = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (16 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_new_(static_cast< ::dmi::ComponentOperState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.OperStateChange)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.OperStateChange)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void OperStateChange::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.OperStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentOperState old = 1;
+  if (this->old() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      1, this->old(), output);
+  }
+
+  // .dmi.ComponentOperState new = 2;
+  if (this->new_() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->new_(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.OperStateChange)
+}
+
+::google::protobuf::uint8* OperStateChange::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.OperStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentOperState old = 1;
+  if (this->old() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      1, this->old(), target);
+  }
+
+  // .dmi.ComponentOperState new = 2;
+  if (this->new_() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      2, this->new_(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.OperStateChange)
+  return target;
+}
+
+size_t OperStateChange::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.OperStateChange)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // .dmi.ComponentOperState old = 1;
+  if (this->old() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->old());
+  }
+
+  // .dmi.ComponentOperState new = 2;
+  if (this->new_() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->new_());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void OperStateChange::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.OperStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  const OperStateChange* source =
+      ::google::protobuf::DynamicCastToGenerated<OperStateChange>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.OperStateChange)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.OperStateChange)
+    MergeFrom(*source);
+  }
+}
+
+void OperStateChange::MergeFrom(const OperStateChange& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.OperStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.old() != 0) {
+    set_old(from.old());
+  }
+  if (from.new_() != 0) {
+    set_new_(from.new_());
+  }
+}
+
+void OperStateChange::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.OperStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void OperStateChange::CopyFrom(const OperStateChange& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.OperStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool OperStateChange::IsInitialized() const {
+  return true;
+}
+
+void OperStateChange::Swap(OperStateChange* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void OperStateChange::InternalSwap(OperStateChange* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  swap(old_, other->old_);
+  swap(new__, other->new__);
+}
+
+::google::protobuf::Metadata OperStateChange::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void AlarmStateChange::InitAsDefaultInstance() {
+}
+class AlarmStateChange::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int AlarmStateChange::kOldFieldNumber;
+const int AlarmStateChange::kNewFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+AlarmStateChange::AlarmStateChange()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.AlarmStateChange)
+}
+AlarmStateChange::AlarmStateChange(const AlarmStateChange& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::memcpy(&old_, &from.old_,
+    static_cast<size_t>(reinterpret_cast<char*>(&new__) -
+    reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  // @@protoc_insertion_point(copy_constructor:dmi.AlarmStateChange)
+}
+
+void AlarmStateChange::SharedCtor() {
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+}
+
+AlarmStateChange::~AlarmStateChange() {
+  // @@protoc_insertion_point(destructor:dmi.AlarmStateChange)
+  SharedDtor();
+}
+
+void AlarmStateChange::SharedDtor() {
+}
+
+void AlarmStateChange::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const AlarmStateChange& AlarmStateChange::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_AlarmStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void AlarmStateChange::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.AlarmStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* AlarmStateChange::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<AlarmStateChange*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.ComponentAlarmState old = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 8) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_old(static_cast<::dmi::ComponentAlarmState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // .dmi.ComponentAlarmState new = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 16) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_new_(static_cast<::dmi::ComponentAlarmState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool AlarmStateChange::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.AlarmStateChange)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.ComponentAlarmState old = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (8 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_old(static_cast< ::dmi::ComponentAlarmState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.ComponentAlarmState new = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (16 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_new_(static_cast< ::dmi::ComponentAlarmState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.AlarmStateChange)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.AlarmStateChange)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void AlarmStateChange::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.AlarmStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentAlarmState old = 1;
+  if (this->old() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      1, this->old(), output);
+  }
+
+  // .dmi.ComponentAlarmState new = 2;
+  if (this->new_() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->new_(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.AlarmStateChange)
+}
+
+::google::protobuf::uint8* AlarmStateChange::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.AlarmStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentAlarmState old = 1;
+  if (this->old() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      1, this->old(), target);
+  }
+
+  // .dmi.ComponentAlarmState new = 2;
+  if (this->new_() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      2, this->new_(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.AlarmStateChange)
+  return target;
+}
+
+size_t AlarmStateChange::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.AlarmStateChange)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // .dmi.ComponentAlarmState old = 1;
+  if (this->old() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->old());
+  }
+
+  // .dmi.ComponentAlarmState new = 2;
+  if (this->new_() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->new_());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void AlarmStateChange::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.AlarmStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  const AlarmStateChange* source =
+      ::google::protobuf::DynamicCastToGenerated<AlarmStateChange>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.AlarmStateChange)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.AlarmStateChange)
+    MergeFrom(*source);
+  }
+}
+
+void AlarmStateChange::MergeFrom(const AlarmStateChange& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.AlarmStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.old() != 0) {
+    set_old(from.old());
+  }
+  if (from.new_() != 0) {
+    set_new_(from.new_());
+  }
+}
+
+void AlarmStateChange::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.AlarmStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void AlarmStateChange::CopyFrom(const AlarmStateChange& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.AlarmStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool AlarmStateChange::IsInitialized() const {
+  return true;
+}
+
+void AlarmStateChange::Swap(AlarmStateChange* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void AlarmStateChange::InternalSwap(AlarmStateChange* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  swap(old_, other->old_);
+  swap(new__, other->new__);
+}
+
+::google::protobuf::Metadata AlarmStateChange::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void UsageStateChange::InitAsDefaultInstance() {
+}
+class UsageStateChange::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int UsageStateChange::kOldFieldNumber;
+const int UsageStateChange::kNewFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+UsageStateChange::UsageStateChange()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.UsageStateChange)
+}
+UsageStateChange::UsageStateChange(const UsageStateChange& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::memcpy(&old_, &from.old_,
+    static_cast<size_t>(reinterpret_cast<char*>(&new__) -
+    reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  // @@protoc_insertion_point(copy_constructor:dmi.UsageStateChange)
+}
+
+void UsageStateChange::SharedCtor() {
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+}
+
+UsageStateChange::~UsageStateChange() {
+  // @@protoc_insertion_point(destructor:dmi.UsageStateChange)
+  SharedDtor();
+}
+
+void UsageStateChange::SharedDtor() {
+}
+
+void UsageStateChange::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const UsageStateChange& UsageStateChange::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_UsageStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void UsageStateChange::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.UsageStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* UsageStateChange::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<UsageStateChange*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.ComponentUsageState old = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 8) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_old(static_cast<::dmi::ComponentUsageState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // .dmi.ComponentUsageState new = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 16) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_new_(static_cast<::dmi::ComponentUsageState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool UsageStateChange::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.UsageStateChange)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.ComponentUsageState old = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (8 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_old(static_cast< ::dmi::ComponentUsageState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.ComponentUsageState new = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (16 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_new_(static_cast< ::dmi::ComponentUsageState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.UsageStateChange)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.UsageStateChange)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void UsageStateChange::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.UsageStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentUsageState old = 1;
+  if (this->old() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      1, this->old(), output);
+  }
+
+  // .dmi.ComponentUsageState new = 2;
+  if (this->new_() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->new_(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.UsageStateChange)
+}
+
+::google::protobuf::uint8* UsageStateChange::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.UsageStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentUsageState old = 1;
+  if (this->old() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      1, this->old(), target);
+  }
+
+  // .dmi.ComponentUsageState new = 2;
+  if (this->new_() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      2, this->new_(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.UsageStateChange)
+  return target;
+}
+
+size_t UsageStateChange::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.UsageStateChange)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // .dmi.ComponentUsageState old = 1;
+  if (this->old() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->old());
+  }
+
+  // .dmi.ComponentUsageState new = 2;
+  if (this->new_() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->new_());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void UsageStateChange::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.UsageStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  const UsageStateChange* source =
+      ::google::protobuf::DynamicCastToGenerated<UsageStateChange>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.UsageStateChange)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.UsageStateChange)
+    MergeFrom(*source);
+  }
+}
+
+void UsageStateChange::MergeFrom(const UsageStateChange& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.UsageStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.old() != 0) {
+    set_old(from.old());
+  }
+  if (from.new_() != 0) {
+    set_new_(from.new_());
+  }
+}
+
+void UsageStateChange::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.UsageStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void UsageStateChange::CopyFrom(const UsageStateChange& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.UsageStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool UsageStateChange::IsInitialized() const {
+  return true;
+}
+
+void UsageStateChange::Swap(UsageStateChange* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void UsageStateChange::InternalSwap(UsageStateChange* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  swap(old_, other->old_);
+  swap(new__, other->new__);
+}
+
+::google::protobuf::Metadata UsageStateChange::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void StandbyStateChange::InitAsDefaultInstance() {
+}
+class StandbyStateChange::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int StandbyStateChange::kOldFieldNumber;
+const int StandbyStateChange::kNewFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+StandbyStateChange::StandbyStateChange()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.StandbyStateChange)
+}
+StandbyStateChange::StandbyStateChange(const StandbyStateChange& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::memcpy(&old_, &from.old_,
+    static_cast<size_t>(reinterpret_cast<char*>(&new__) -
+    reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  // @@protoc_insertion_point(copy_constructor:dmi.StandbyStateChange)
+}
+
+void StandbyStateChange::SharedCtor() {
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+}
+
+StandbyStateChange::~StandbyStateChange() {
+  // @@protoc_insertion_point(destructor:dmi.StandbyStateChange)
+  SharedDtor();
+}
+
+void StandbyStateChange::SharedDtor() {
+}
+
+void StandbyStateChange::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const StandbyStateChange& StandbyStateChange::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_StandbyStateChange_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void StandbyStateChange::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.StandbyStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  ::memset(&old_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&new__) -
+      reinterpret_cast<char*>(&old_)) + sizeof(new__));
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* StandbyStateChange::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<StandbyStateChange*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.ComponentStandbyState old = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 8) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_old(static_cast<::dmi::ComponentStandbyState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // .dmi.ComponentStandbyState new = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 16) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_new_(static_cast<::dmi::ComponentStandbyState>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool StandbyStateChange::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.StandbyStateChange)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.ComponentStandbyState old = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (8 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_old(static_cast< ::dmi::ComponentStandbyState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.ComponentStandbyState new = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (16 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_new_(static_cast< ::dmi::ComponentStandbyState >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.StandbyStateChange)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.StandbyStateChange)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void StandbyStateChange::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.StandbyStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentStandbyState old = 1;
+  if (this->old() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      1, this->old(), output);
+  }
+
+  // .dmi.ComponentStandbyState new = 2;
+  if (this->new_() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->new_(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.StandbyStateChange)
+}
+
+::google::protobuf::uint8* StandbyStateChange::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.StandbyStateChange)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.ComponentStandbyState old = 1;
+  if (this->old() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      1, this->old(), target);
+  }
+
+  // .dmi.ComponentStandbyState new = 2;
+  if (this->new_() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      2, this->new_(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.StandbyStateChange)
+  return target;
+}
+
+size_t StandbyStateChange::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.StandbyStateChange)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // .dmi.ComponentStandbyState old = 1;
+  if (this->old() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->old());
+  }
+
+  // .dmi.ComponentStandbyState new = 2;
+  if (this->new_() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->new_());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void StandbyStateChange::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.StandbyStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  const StandbyStateChange* source =
+      ::google::protobuf::DynamicCastToGenerated<StandbyStateChange>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.StandbyStateChange)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.StandbyStateChange)
+    MergeFrom(*source);
+  }
+}
+
+void StandbyStateChange::MergeFrom(const StandbyStateChange& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.StandbyStateChange)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.old() != 0) {
+    set_old(from.old());
+  }
+  if (from.new_() != 0) {
+    set_new_(from.new_());
+  }
+}
+
+void StandbyStateChange::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.StandbyStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void StandbyStateChange::CopyFrom(const StandbyStateChange& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.StandbyStateChange)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool StandbyStateChange::IsInitialized() const {
+  return true;
+}
+
+void StandbyStateChange::Swap(StandbyStateChange* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void StandbyStateChange::InternalSwap(StandbyStateChange* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  swap(old_, other->old_);
+  swap(new__, other->new__);
+}
+
+::google::protobuf::Metadata StandbyStateChange::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void StateChangeInfo::InitAsDefaultInstance() {
+  ::dmi::_StateChangeInfo_default_instance_.admin_state_change_ = const_cast< ::dmi::AdminStateChange*>(
+      ::dmi::AdminStateChange::internal_default_instance());
+  ::dmi::_StateChangeInfo_default_instance_.oper_state_change_ = const_cast< ::dmi::OperStateChange*>(
+      ::dmi::OperStateChange::internal_default_instance());
+  ::dmi::_StateChangeInfo_default_instance_.alarm_state_change_ = const_cast< ::dmi::AlarmStateChange*>(
+      ::dmi::AlarmStateChange::internal_default_instance());
+  ::dmi::_StateChangeInfo_default_instance_.usage_state_change_ = const_cast< ::dmi::UsageStateChange*>(
+      ::dmi::UsageStateChange::internal_default_instance());
+  ::dmi::_StateChangeInfo_default_instance_.standby_state_change_ = const_cast< ::dmi::StandbyStateChange*>(
+      ::dmi::StandbyStateChange::internal_default_instance());
+}
+class StateChangeInfo::HasBitSetters {
+ public:
+  static const ::dmi::AdminStateChange& admin_state_change(const StateChangeInfo* msg);
+  static const ::dmi::OperStateChange& oper_state_change(const StateChangeInfo* msg);
+  static const ::dmi::AlarmStateChange& alarm_state_change(const StateChangeInfo* msg);
+  static const ::dmi::UsageStateChange& usage_state_change(const StateChangeInfo* msg);
+  static const ::dmi::StandbyStateChange& standby_state_change(const StateChangeInfo* msg);
+};
+
+const ::dmi::AdminStateChange&
+StateChangeInfo::HasBitSetters::admin_state_change(const StateChangeInfo* msg) {
+  return *msg->state_change_.admin_state_change_;
+}
+const ::dmi::OperStateChange&
+StateChangeInfo::HasBitSetters::oper_state_change(const StateChangeInfo* msg) {
+  return *msg->state_change_.oper_state_change_;
+}
+const ::dmi::AlarmStateChange&
+StateChangeInfo::HasBitSetters::alarm_state_change(const StateChangeInfo* msg) {
+  return *msg->state_change_.alarm_state_change_;
+}
+const ::dmi::UsageStateChange&
+StateChangeInfo::HasBitSetters::usage_state_change(const StateChangeInfo* msg) {
+  return *msg->state_change_.usage_state_change_;
+}
+const ::dmi::StandbyStateChange&
+StateChangeInfo::HasBitSetters::standby_state_change(const StateChangeInfo* msg) {
+  return *msg->state_change_.standby_state_change_;
+}
+void StateChangeInfo::set_allocated_admin_state_change(::dmi::AdminStateChange* admin_state_change) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  clear_state_change();
+  if (admin_state_change) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      admin_state_change = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, admin_state_change, submessage_arena);
+    }
+    set_has_admin_state_change();
+    state_change_.admin_state_change_ = admin_state_change;
+  }
+  // @@protoc_insertion_point(field_set_allocated:dmi.StateChangeInfo.admin_state_change)
+}
+void StateChangeInfo::set_allocated_oper_state_change(::dmi::OperStateChange* oper_state_change) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  clear_state_change();
+  if (oper_state_change) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      oper_state_change = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, oper_state_change, submessage_arena);
+    }
+    set_has_oper_state_change();
+    state_change_.oper_state_change_ = oper_state_change;
+  }
+  // @@protoc_insertion_point(field_set_allocated:dmi.StateChangeInfo.oper_state_change)
+}
+void StateChangeInfo::set_allocated_alarm_state_change(::dmi::AlarmStateChange* alarm_state_change) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  clear_state_change();
+  if (alarm_state_change) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      alarm_state_change = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, alarm_state_change, submessage_arena);
+    }
+    set_has_alarm_state_change();
+    state_change_.alarm_state_change_ = alarm_state_change;
+  }
+  // @@protoc_insertion_point(field_set_allocated:dmi.StateChangeInfo.alarm_state_change)
+}
+void StateChangeInfo::set_allocated_usage_state_change(::dmi::UsageStateChange* usage_state_change) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  clear_state_change();
+  if (usage_state_change) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      usage_state_change = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, usage_state_change, submessage_arena);
+    }
+    set_has_usage_state_change();
+    state_change_.usage_state_change_ = usage_state_change;
+  }
+  // @@protoc_insertion_point(field_set_allocated:dmi.StateChangeInfo.usage_state_change)
+}
+void StateChangeInfo::set_allocated_standby_state_change(::dmi::StandbyStateChange* standby_state_change) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  clear_state_change();
+  if (standby_state_change) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      standby_state_change = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, standby_state_change, submessage_arena);
+    }
+    set_has_standby_state_change();
+    state_change_.standby_state_change_ = standby_state_change;
+  }
+  // @@protoc_insertion_point(field_set_allocated:dmi.StateChangeInfo.standby_state_change)
+}
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int StateChangeInfo::kAdminStateChangeFieldNumber;
+const int StateChangeInfo::kOperStateChangeFieldNumber;
+const int StateChangeInfo::kAlarmStateChangeFieldNumber;
+const int StateChangeInfo::kUsageStateChangeFieldNumber;
+const int StateChangeInfo::kStandbyStateChangeFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+StateChangeInfo::StateChangeInfo()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.StateChangeInfo)
+}
+StateChangeInfo::StateChangeInfo(const StateChangeInfo& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  clear_has_state_change();
+  switch (from.state_change_case()) {
+    case kAdminStateChange: {
+      mutable_admin_state_change()->::dmi::AdminStateChange::MergeFrom(from.admin_state_change());
+      break;
+    }
+    case kOperStateChange: {
+      mutable_oper_state_change()->::dmi::OperStateChange::MergeFrom(from.oper_state_change());
+      break;
+    }
+    case kAlarmStateChange: {
+      mutable_alarm_state_change()->::dmi::AlarmStateChange::MergeFrom(from.alarm_state_change());
+      break;
+    }
+    case kUsageStateChange: {
+      mutable_usage_state_change()->::dmi::UsageStateChange::MergeFrom(from.usage_state_change());
+      break;
+    }
+    case kStandbyStateChange: {
+      mutable_standby_state_change()->::dmi::StandbyStateChange::MergeFrom(from.standby_state_change());
+      break;
+    }
+    case STATE_CHANGE_NOT_SET: {
+      break;
+    }
+  }
+  // @@protoc_insertion_point(copy_constructor:dmi.StateChangeInfo)
+}
+
+void StateChangeInfo::SharedCtor() {
+  ::google::protobuf::internal::InitSCC(
+      &scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  clear_has_state_change();
+}
+
+StateChangeInfo::~StateChangeInfo() {
+  // @@protoc_insertion_point(destructor:dmi.StateChangeInfo)
+  SharedDtor();
+}
+
+void StateChangeInfo::SharedDtor() {
+  if (has_state_change()) {
+    clear_state_change();
+  }
+}
+
+void StateChangeInfo::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const StateChangeInfo& StateChangeInfo::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_StateChangeInfo_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void StateChangeInfo::clear_state_change() {
+// @@protoc_insertion_point(one_of_clear_start:dmi.StateChangeInfo)
+  switch (state_change_case()) {
+    case kAdminStateChange: {
+      delete state_change_.admin_state_change_;
+      break;
+    }
+    case kOperStateChange: {
+      delete state_change_.oper_state_change_;
+      break;
+    }
+    case kAlarmStateChange: {
+      delete state_change_.alarm_state_change_;
+      break;
+    }
+    case kUsageStateChange: {
+      delete state_change_.usage_state_change_;
+      break;
+    }
+    case kStandbyStateChange: {
+      delete state_change_.standby_state_change_;
+      break;
+    }
+    case STATE_CHANGE_NOT_SET: {
+      break;
+    }
+  }
+  _oneof_case_[0] = STATE_CHANGE_NOT_SET;
+}
+
+
+void StateChangeInfo::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.StateChangeInfo)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  clear_state_change();
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* StateChangeInfo::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<StateChangeInfo*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.AdminStateChange admin_state_change = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 10) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::AdminStateChange::_InternalParse;
+        object = msg->mutable_admin_state_change();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // .dmi.OperStateChange oper_state_change = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 18) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::OperStateChange::_InternalParse;
+        object = msg->mutable_oper_state_change();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // .dmi.AlarmStateChange alarm_state_change = 3;
+      case 3: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 26) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::AlarmStateChange::_InternalParse;
+        object = msg->mutable_alarm_state_change();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // .dmi.UsageStateChange usage_state_change = 4;
+      case 4: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 34) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::UsageStateChange::_InternalParse;
+        object = msg->mutable_usage_state_change();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // .dmi.StandbyStateChange standby_state_change = 5;
+      case 5: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 42) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::StandbyStateChange::_InternalParse;
+        object = msg->mutable_standby_state_change();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+len_delim_till_end:
+  return ctx->StoreAndTailCall(ptr, end, {_InternalParse, msg},
+                               {parser_till_end, object}, size);
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool StateChangeInfo::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.StateChangeInfo)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.AdminStateChange admin_state_change = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (10 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_admin_state_change()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.OperStateChange oper_state_change = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (18 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_oper_state_change()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.AlarmStateChange alarm_state_change = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (26 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_alarm_state_change()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.UsageStateChange usage_state_change = 4;
+      case 4: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (34 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_usage_state_change()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.StandbyStateChange standby_state_change = 5;
+      case 5: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (42 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_standby_state_change()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.StateChangeInfo)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.StateChangeInfo)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void StateChangeInfo::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.StateChangeInfo)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.AdminStateChange admin_state_change = 1;
+  if (has_admin_state_change()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      1, HasBitSetters::admin_state_change(this), output);
+  }
+
+  // .dmi.OperStateChange oper_state_change = 2;
+  if (has_oper_state_change()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      2, HasBitSetters::oper_state_change(this), output);
+  }
+
+  // .dmi.AlarmStateChange alarm_state_change = 3;
+  if (has_alarm_state_change()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      3, HasBitSetters::alarm_state_change(this), output);
+  }
+
+  // .dmi.UsageStateChange usage_state_change = 4;
+  if (has_usage_state_change()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      4, HasBitSetters::usage_state_change(this), output);
+  }
+
+  // .dmi.StandbyStateChange standby_state_change = 5;
+  if (has_standby_state_change()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      5, HasBitSetters::standby_state_change(this), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.StateChangeInfo)
+}
+
+::google::protobuf::uint8* StateChangeInfo::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.StateChangeInfo)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.AdminStateChange admin_state_change = 1;
+  if (has_admin_state_change()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        1, HasBitSetters::admin_state_change(this), target);
+  }
+
+  // .dmi.OperStateChange oper_state_change = 2;
+  if (has_oper_state_change()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        2, HasBitSetters::oper_state_change(this), target);
+  }
+
+  // .dmi.AlarmStateChange alarm_state_change = 3;
+  if (has_alarm_state_change()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        3, HasBitSetters::alarm_state_change(this), target);
+  }
+
+  // .dmi.UsageStateChange usage_state_change = 4;
+  if (has_usage_state_change()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        4, HasBitSetters::usage_state_change(this), target);
+  }
+
+  // .dmi.StandbyStateChange standby_state_change = 5;
+  if (has_standby_state_change()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        5, HasBitSetters::standby_state_change(this), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.StateChangeInfo)
+  return target;
+}
+
+size_t StateChangeInfo::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.StateChangeInfo)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  switch (state_change_case()) {
+    // .dmi.AdminStateChange admin_state_change = 1;
+    case kAdminStateChange: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSize(
+          *state_change_.admin_state_change_);
+      break;
+    }
+    // .dmi.OperStateChange oper_state_change = 2;
+    case kOperStateChange: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSize(
+          *state_change_.oper_state_change_);
+      break;
+    }
+    // .dmi.AlarmStateChange alarm_state_change = 3;
+    case kAlarmStateChange: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSize(
+          *state_change_.alarm_state_change_);
+      break;
+    }
+    // .dmi.UsageStateChange usage_state_change = 4;
+    case kUsageStateChange: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSize(
+          *state_change_.usage_state_change_);
+      break;
+    }
+    // .dmi.StandbyStateChange standby_state_change = 5;
+    case kStandbyStateChange: {
+      total_size += 1 +
+        ::google::protobuf::internal::WireFormatLite::MessageSize(
+          *state_change_.standby_state_change_);
+      break;
+    }
+    case STATE_CHANGE_NOT_SET: {
+      break;
+    }
+  }
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void StateChangeInfo::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.StateChangeInfo)
+  GOOGLE_DCHECK_NE(&from, this);
+  const StateChangeInfo* source =
+      ::google::protobuf::DynamicCastToGenerated<StateChangeInfo>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.StateChangeInfo)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.StateChangeInfo)
+    MergeFrom(*source);
+  }
+}
+
+void StateChangeInfo::MergeFrom(const StateChangeInfo& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.StateChangeInfo)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  switch (from.state_change_case()) {
+    case kAdminStateChange: {
+      mutable_admin_state_change()->::dmi::AdminStateChange::MergeFrom(from.admin_state_change());
+      break;
+    }
+    case kOperStateChange: {
+      mutable_oper_state_change()->::dmi::OperStateChange::MergeFrom(from.oper_state_change());
+      break;
+    }
+    case kAlarmStateChange: {
+      mutable_alarm_state_change()->::dmi::AlarmStateChange::MergeFrom(from.alarm_state_change());
+      break;
+    }
+    case kUsageStateChange: {
+      mutable_usage_state_change()->::dmi::UsageStateChange::MergeFrom(from.usage_state_change());
+      break;
+    }
+    case kStandbyStateChange: {
+      mutable_standby_state_change()->::dmi::StandbyStateChange::MergeFrom(from.standby_state_change());
+      break;
+    }
+    case STATE_CHANGE_NOT_SET: {
+      break;
+    }
+  }
+}
+
+void StateChangeInfo::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.StateChangeInfo)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void StateChangeInfo::CopyFrom(const StateChangeInfo& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.StateChangeInfo)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool StateChangeInfo::IsInitialized() const {
+  return true;
+}
+
+void StateChangeInfo::Swap(StateChangeInfo* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void StateChangeInfo::InternalSwap(StateChangeInfo* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  swap(state_change_, other->state_change_);
+  swap(_oneof_case_[0], other->_oneof_case_[0]);
+}
+
+::google::protobuf::Metadata StateChangeInfo::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
 void Event::InitAsDefaultInstance() {
   ::dmi::_Event_default_instance_._instance.get_mutable()->event_metadata_ = const_cast< ::dmi::EventMetaData*>(
       ::dmi::EventMetaData::internal_default_instance());
@@ -4712,12 +7147,15 @@
       ::google::protobuf::Timestamp::internal_default_instance());
   ::dmi::_Event_default_instance_._instance.get_mutable()->threshold_info_ = const_cast< ::dmi::ThresholdInformation*>(
       ::dmi::ThresholdInformation::internal_default_instance());
+  ::dmi::_Event_default_instance_._instance.get_mutable()->state_change_info_ = const_cast< ::dmi::StateChangeInfo*>(
+      ::dmi::StateChangeInfo::internal_default_instance());
 }
 class Event::HasBitSetters {
  public:
   static const ::dmi::EventMetaData& event_metadata(const Event* msg);
   static const ::google::protobuf::Timestamp& raised_ts(const Event* msg);
   static const ::dmi::ThresholdInformation& threshold_info(const Event* msg);
+  static const ::dmi::StateChangeInfo& state_change_info(const Event* msg);
 };
 
 const ::dmi::EventMetaData&
@@ -4732,6 +7170,10 @@
 Event::HasBitSetters::threshold_info(const Event* msg) {
   return *msg->threshold_info_;
 }
+const ::dmi::StateChangeInfo&
+Event::HasBitSetters::state_change_info(const Event* msg) {
+  return *msg->state_change_info_;
+}
 void Event::clear_raised_ts() {
   if (GetArenaNoVirtual() == nullptr && raised_ts_ != nullptr) {
     delete raised_ts_;
@@ -4744,6 +7186,7 @@
 const int Event::kRaisedTsFieldNumber;
 const int Event::kThresholdInfoFieldNumber;
 const int Event::kAddInfoFieldNumber;
+const int Event::kStateChangeInfoFieldNumber;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 Event::Event()
@@ -4774,6 +7217,11 @@
   } else {
     threshold_info_ = nullptr;
   }
+  if (from.has_state_change_info()) {
+    state_change_info_ = new ::dmi::StateChangeInfo(*from.state_change_info_);
+  } else {
+    state_change_info_ = nullptr;
+  }
   event_id_ = from.event_id_;
   // @@protoc_insertion_point(copy_constructor:dmi.Event)
 }
@@ -4797,6 +7245,7 @@
   if (this != internal_default_instance()) delete event_metadata_;
   if (this != internal_default_instance()) delete raised_ts_;
   if (this != internal_default_instance()) delete threshold_info_;
+  if (this != internal_default_instance()) delete state_change_info_;
 }
 
 void Event::SetCachedSize(int size) const {
@@ -4827,6 +7276,10 @@
     delete threshold_info_;
   }
   threshold_info_ = nullptr;
+  if (GetArenaNoVirtual() == nullptr && state_change_info_ != nullptr) {
+    delete state_change_info_;
+  }
+  state_change_info_ = nullptr;
   event_id_ = 0;
   _internal_metadata_.Clear();
 }
@@ -4907,6 +7360,19 @@
         ptr += size;
         break;
       }
+      // .dmi.StateChangeInfo state_change_info = 6;
+      case 6: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 50) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::StateChangeInfo::_InternalParse;
+        object = msg->mutable_state_change_info();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
       default: {
       handle_unusual:
         if ((tag & 7) == 4 || tag == 0) {
@@ -5003,6 +7469,17 @@
         break;
       }
 
+      // .dmi.StateChangeInfo state_change_info = 6;
+      case 6: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (50 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_state_change_info()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
       default: {
       handle_unusual:
         if (tag == 0) {
@@ -5064,6 +7541,12 @@
       5, this->add_info(), output);
   }
 
+  // .dmi.StateChangeInfo state_change_info = 6;
+  if (this->has_state_change_info()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      6, HasBitSetters::state_change_info(this), output);
+  }
+
   if (_internal_metadata_.have_unknown_fields()) {
     ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
         _internal_metadata_.unknown_fields(), output);
@@ -5115,6 +7598,13 @@
         5, this->add_info(), target);
   }
 
+  // .dmi.StateChangeInfo state_change_info = 6;
+  if (this->has_state_change_info()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        6, HasBitSetters::state_change_info(this), target);
+  }
+
   if (_internal_metadata_.have_unknown_fields()) {
     target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
         _internal_metadata_.unknown_fields(), target);
@@ -5164,6 +7654,13 @@
         *threshold_info_);
   }
 
+  // .dmi.StateChangeInfo state_change_info = 6;
+  if (this->has_state_change_info()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSize(
+        *state_change_info_);
+  }
+
   // .dmi.EventIds event_id = 2;
   if (this->event_id() != 0) {
     total_size += 1 +
@@ -5210,6 +7707,9 @@
   if (from.has_threshold_info()) {
     mutable_threshold_info()->::dmi::ThresholdInformation::MergeFrom(from.threshold_info());
   }
+  if (from.has_state_change_info()) {
+    mutable_state_change_info()->::dmi::StateChangeInfo::MergeFrom(from.state_change_info());
+  }
   if (from.event_id() != 0) {
     set_event_id(from.event_id());
   }
@@ -5245,6 +7745,7 @@
   swap(event_metadata_, other->event_metadata_);
   swap(raised_ts_, other->raised_ts_);
   swap(threshold_info_, other->threshold_info_);
+  swap(state_change_info_, other->state_change_info_);
   swap(event_id_, other->event_id_);
 }
 
@@ -5288,6 +7789,24 @@
 template<> PROTOBUF_NOINLINE ::dmi::EventMetaData* Arena::CreateMaybeMessage< ::dmi::EventMetaData >(Arena* arena) {
   return Arena::CreateInternal< ::dmi::EventMetaData >(arena);
 }
+template<> PROTOBUF_NOINLINE ::dmi::AdminStateChange* Arena::CreateMaybeMessage< ::dmi::AdminStateChange >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::AdminStateChange >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::OperStateChange* Arena::CreateMaybeMessage< ::dmi::OperStateChange >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::OperStateChange >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::AlarmStateChange* Arena::CreateMaybeMessage< ::dmi::AlarmStateChange >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::AlarmStateChange >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::UsageStateChange* Arena::CreateMaybeMessage< ::dmi::UsageStateChange >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::UsageStateChange >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::StandbyStateChange* Arena::CreateMaybeMessage< ::dmi::StandbyStateChange >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::StandbyStateChange >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::StateChangeInfo* Arena::CreateMaybeMessage< ::dmi::StateChangeInfo >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::StateChangeInfo >(arena);
+}
 template<> PROTOBUF_NOINLINE ::dmi::Event* Arena::CreateMaybeMessage< ::dmi::Event >(Arena* arena) {
   return Arena::CreateInternal< ::dmi::Event >(arena);
 }
diff --git a/cpp/dmi/hw_events_mgmt_service.pb.h b/cpp/dmi/hw_events_mgmt_service.pb.h
index 4c4dfe9..7e3e8bd 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[11]
+  static const ::google::protobuf::internal::ParseTable schema[17]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::FieldMetadata field_metadata[];
   static const ::google::protobuf::internal::SerializationTable serialization_table[];
@@ -54,6 +54,12 @@
 };
 void AddDescriptors_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto();
 namespace dmi {
+class AdminStateChange;
+class AdminStateChangeDefaultTypeInternal;
+extern AdminStateChangeDefaultTypeInternal _AdminStateChange_default_instance_;
+class AlarmStateChange;
+class AlarmStateChangeDefaultTypeInternal;
+extern AlarmStateChangeDefaultTypeInternal _AlarmStateChange_default_instance_;
 class Event;
 class EventDefaultTypeInternal;
 extern EventDefaultTypeInternal _Event_default_instance_;
@@ -75,12 +81,24 @@
 class ListEventsResponse;
 class ListEventsResponseDefaultTypeInternal;
 extern ListEventsResponseDefaultTypeInternal _ListEventsResponse_default_instance_;
+class OperStateChange;
+class OperStateChangeDefaultTypeInternal;
+extern OperStateChangeDefaultTypeInternal _OperStateChange_default_instance_;
+class StandbyStateChange;
+class StandbyStateChangeDefaultTypeInternal;
+extern StandbyStateChangeDefaultTypeInternal _StandbyStateChange_default_instance_;
+class StateChangeInfo;
+class StateChangeInfoDefaultTypeInternal;
+extern StateChangeInfoDefaultTypeInternal _StateChangeInfo_default_instance_;
 class ThresholdInformation;
 class ThresholdInformationDefaultTypeInternal;
 extern ThresholdInformationDefaultTypeInternal _ThresholdInformation_default_instance_;
 class Thresholds;
 class ThresholdsDefaultTypeInternal;
 extern ThresholdsDefaultTypeInternal _Thresholds_default_instance_;
+class UsageStateChange;
+class UsageStateChangeDefaultTypeInternal;
+extern UsageStateChangeDefaultTypeInternal _UsageStateChange_default_instance_;
 class ValueType;
 class ValueTypeDefaultTypeInternal;
 extern ValueTypeDefaultTypeInternal _ValueType_default_instance_;
@@ -90,6 +108,8 @@
 }  // namespace dmi
 namespace google {
 namespace protobuf {
+template<> ::dmi::AdminStateChange* Arena::CreateMaybeMessage<::dmi::AdminStateChange>(Arena*);
+template<> ::dmi::AlarmStateChange* Arena::CreateMaybeMessage<::dmi::AlarmStateChange>(Arena*);
 template<> ::dmi::Event* Arena::CreateMaybeMessage<::dmi::Event>(Arena*);
 template<> ::dmi::EventCfg* Arena::CreateMaybeMessage<::dmi::EventCfg>(Arena*);
 template<> ::dmi::EventMetaData* Arena::CreateMaybeMessage<::dmi::EventMetaData>(Arena*);
@@ -97,8 +117,12 @@
 template<> ::dmi::EventsConfigurationRequest* Arena::CreateMaybeMessage<::dmi::EventsConfigurationRequest>(Arena*);
 template<> ::dmi::EventsConfigurationResponse* Arena::CreateMaybeMessage<::dmi::EventsConfigurationResponse>(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*);
+template<> ::dmi::StateChangeInfo* Arena::CreateMaybeMessage<::dmi::StateChangeInfo>(Arena*);
 template<> ::dmi::ThresholdInformation* Arena::CreateMaybeMessage<::dmi::ThresholdInformation>(Arena*);
 template<> ::dmi::Thresholds* Arena::CreateMaybeMessage<::dmi::Thresholds>(Arena*);
+template<> ::dmi::UsageStateChange* Arena::CreateMaybeMessage<::dmi::UsageStateChange>(Arena*);
 template<> ::dmi::ValueType* Arena::CreateMaybeMessage<::dmi::ValueType>(Arena*);
 template<> ::dmi::WaterMarks* Arena::CreateMaybeMessage<::dmi::WaterMarks>(Arena*);
 }  // namespace protobuf
@@ -208,12 +232,17 @@
   EVENT_HW_NTP_SYNC_FAILURE_RECOVERED = 513,
   EVENT_LINE_CARD_PLUG_OUT = 600,
   EVENT_LINE_CARD_PLUG_IN = 601,
+  EVENT_COMPONENT_ADMIN_STATE_CHANGED = 700,
+  EVENT_COMPONENT_OPER_STATE_CHANGED = 701,
+  EVENT_COMPONENT_ALARM_STATE_CHANGED = 702,
+  EVENT_COMPONENT_USAGE_STATE_CHANGED = 703,
+  EVENT_COMPONENT_STANDBY_STATE_CHANGED = 704,
   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_LINE_CARD_PLUG_IN;
+const EventIds EventIds_MAX = EVENT_COMPONENT_STANDBY_STATE_CHANGED;
 const int EventIds_ARRAYSIZE = EventIds_MAX + 1;
 
 const ::google::protobuf::EnumDescriptor* EventIds_descriptor();
@@ -1673,6 +1702,780 @@
 };
 // -------------------------------------------------------------------
 
+class AdminStateChange final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.AdminStateChange) */ {
+ public:
+  AdminStateChange();
+  virtual ~AdminStateChange();
+
+  AdminStateChange(const AdminStateChange& from);
+
+  inline AdminStateChange& operator=(const AdminStateChange& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  AdminStateChange(AdminStateChange&& from) noexcept
+    : AdminStateChange() {
+    *this = ::std::move(from);
+  }
+
+  inline AdminStateChange& operator=(AdminStateChange&& 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 AdminStateChange& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const AdminStateChange* internal_default_instance() {
+    return reinterpret_cast<const AdminStateChange*>(
+               &_AdminStateChange_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    10;
+
+  void Swap(AdminStateChange* other);
+  friend void swap(AdminStateChange& a, AdminStateChange& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline AdminStateChange* New() const final {
+    return CreateMaybeMessage<AdminStateChange>(nullptr);
+  }
+
+  AdminStateChange* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<AdminStateChange>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const AdminStateChange& from);
+  void MergeFrom(const AdminStateChange& 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(AdminStateChange* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // .dmi.ComponentAdminState old = 1;
+  void clear_old();
+  static const int kOldFieldNumber = 1;
+  ::dmi::ComponentAdminState old() const;
+  void set_old(::dmi::ComponentAdminState value);
+
+  // .dmi.ComponentAdminState new = 2;
+  void clear_new_();
+  static const int kNewFieldNumber = 2;
+  ::dmi::ComponentAdminState new_() const;
+  void set_new_(::dmi::ComponentAdminState value);
+
+  // @@protoc_insertion_point(class_scope:dmi.AdminStateChange)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  int old_;
+  int new__;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class OperStateChange final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.OperStateChange) */ {
+ public:
+  OperStateChange();
+  virtual ~OperStateChange();
+
+  OperStateChange(const OperStateChange& from);
+
+  inline OperStateChange& operator=(const OperStateChange& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  OperStateChange(OperStateChange&& from) noexcept
+    : OperStateChange() {
+    *this = ::std::move(from);
+  }
+
+  inline OperStateChange& operator=(OperStateChange&& 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 OperStateChange& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const OperStateChange* internal_default_instance() {
+    return reinterpret_cast<const OperStateChange*>(
+               &_OperStateChange_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    11;
+
+  void Swap(OperStateChange* other);
+  friend void swap(OperStateChange& a, OperStateChange& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline OperStateChange* New() const final {
+    return CreateMaybeMessage<OperStateChange>(nullptr);
+  }
+
+  OperStateChange* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<OperStateChange>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const OperStateChange& from);
+  void MergeFrom(const OperStateChange& 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(OperStateChange* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // .dmi.ComponentOperState old = 1;
+  void clear_old();
+  static const int kOldFieldNumber = 1;
+  ::dmi::ComponentOperState old() const;
+  void set_old(::dmi::ComponentOperState value);
+
+  // .dmi.ComponentOperState new = 2;
+  void clear_new_();
+  static const int kNewFieldNumber = 2;
+  ::dmi::ComponentOperState new_() const;
+  void set_new_(::dmi::ComponentOperState value);
+
+  // @@protoc_insertion_point(class_scope:dmi.OperStateChange)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  int old_;
+  int new__;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class AlarmStateChange final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.AlarmStateChange) */ {
+ public:
+  AlarmStateChange();
+  virtual ~AlarmStateChange();
+
+  AlarmStateChange(const AlarmStateChange& from);
+
+  inline AlarmStateChange& operator=(const AlarmStateChange& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  AlarmStateChange(AlarmStateChange&& from) noexcept
+    : AlarmStateChange() {
+    *this = ::std::move(from);
+  }
+
+  inline AlarmStateChange& operator=(AlarmStateChange&& 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 AlarmStateChange& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const AlarmStateChange* internal_default_instance() {
+    return reinterpret_cast<const AlarmStateChange*>(
+               &_AlarmStateChange_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    12;
+
+  void Swap(AlarmStateChange* other);
+  friend void swap(AlarmStateChange& a, AlarmStateChange& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline AlarmStateChange* New() const final {
+    return CreateMaybeMessage<AlarmStateChange>(nullptr);
+  }
+
+  AlarmStateChange* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<AlarmStateChange>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const AlarmStateChange& from);
+  void MergeFrom(const AlarmStateChange& 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(AlarmStateChange* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // .dmi.ComponentAlarmState old = 1;
+  void clear_old();
+  static const int kOldFieldNumber = 1;
+  ::dmi::ComponentAlarmState old() const;
+  void set_old(::dmi::ComponentAlarmState value);
+
+  // .dmi.ComponentAlarmState new = 2;
+  void clear_new_();
+  static const int kNewFieldNumber = 2;
+  ::dmi::ComponentAlarmState new_() const;
+  void set_new_(::dmi::ComponentAlarmState value);
+
+  // @@protoc_insertion_point(class_scope:dmi.AlarmStateChange)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  int old_;
+  int new__;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class UsageStateChange final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.UsageStateChange) */ {
+ public:
+  UsageStateChange();
+  virtual ~UsageStateChange();
+
+  UsageStateChange(const UsageStateChange& from);
+
+  inline UsageStateChange& operator=(const UsageStateChange& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  UsageStateChange(UsageStateChange&& from) noexcept
+    : UsageStateChange() {
+    *this = ::std::move(from);
+  }
+
+  inline UsageStateChange& operator=(UsageStateChange&& 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 UsageStateChange& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const UsageStateChange* internal_default_instance() {
+    return reinterpret_cast<const UsageStateChange*>(
+               &_UsageStateChange_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    13;
+
+  void Swap(UsageStateChange* other);
+  friend void swap(UsageStateChange& a, UsageStateChange& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline UsageStateChange* New() const final {
+    return CreateMaybeMessage<UsageStateChange>(nullptr);
+  }
+
+  UsageStateChange* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<UsageStateChange>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const UsageStateChange& from);
+  void MergeFrom(const UsageStateChange& 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(UsageStateChange* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // .dmi.ComponentUsageState old = 1;
+  void clear_old();
+  static const int kOldFieldNumber = 1;
+  ::dmi::ComponentUsageState old() const;
+  void set_old(::dmi::ComponentUsageState value);
+
+  // .dmi.ComponentUsageState new = 2;
+  void clear_new_();
+  static const int kNewFieldNumber = 2;
+  ::dmi::ComponentUsageState new_() const;
+  void set_new_(::dmi::ComponentUsageState value);
+
+  // @@protoc_insertion_point(class_scope:dmi.UsageStateChange)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  int old_;
+  int new__;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class StandbyStateChange final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.StandbyStateChange) */ {
+ public:
+  StandbyStateChange();
+  virtual ~StandbyStateChange();
+
+  StandbyStateChange(const StandbyStateChange& from);
+
+  inline StandbyStateChange& operator=(const StandbyStateChange& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  StandbyStateChange(StandbyStateChange&& from) noexcept
+    : StandbyStateChange() {
+    *this = ::std::move(from);
+  }
+
+  inline StandbyStateChange& operator=(StandbyStateChange&& 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 StandbyStateChange& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const StandbyStateChange* internal_default_instance() {
+    return reinterpret_cast<const StandbyStateChange*>(
+               &_StandbyStateChange_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    14;
+
+  void Swap(StandbyStateChange* other);
+  friend void swap(StandbyStateChange& a, StandbyStateChange& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline StandbyStateChange* New() const final {
+    return CreateMaybeMessage<StandbyStateChange>(nullptr);
+  }
+
+  StandbyStateChange* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<StandbyStateChange>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const StandbyStateChange& from);
+  void MergeFrom(const StandbyStateChange& 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(StandbyStateChange* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // .dmi.ComponentStandbyState old = 1;
+  void clear_old();
+  static const int kOldFieldNumber = 1;
+  ::dmi::ComponentStandbyState old() const;
+  void set_old(::dmi::ComponentStandbyState value);
+
+  // .dmi.ComponentStandbyState new = 2;
+  void clear_new_();
+  static const int kNewFieldNumber = 2;
+  ::dmi::ComponentStandbyState new_() const;
+  void set_new_(::dmi::ComponentStandbyState value);
+
+  // @@protoc_insertion_point(class_scope:dmi.StandbyStateChange)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  int old_;
+  int new__;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class StateChangeInfo final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.StateChangeInfo) */ {
+ public:
+  StateChangeInfo();
+  virtual ~StateChangeInfo();
+
+  StateChangeInfo(const StateChangeInfo& from);
+
+  inline StateChangeInfo& operator=(const StateChangeInfo& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  StateChangeInfo(StateChangeInfo&& from) noexcept
+    : StateChangeInfo() {
+    *this = ::std::move(from);
+  }
+
+  inline StateChangeInfo& operator=(StateChangeInfo&& 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 StateChangeInfo& default_instance();
+
+  enum StateChangeCase {
+    kAdminStateChange = 1,
+    kOperStateChange = 2,
+    kAlarmStateChange = 3,
+    kUsageStateChange = 4,
+    kStandbyStateChange = 5,
+    STATE_CHANGE_NOT_SET = 0,
+  };
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const StateChangeInfo* internal_default_instance() {
+    return reinterpret_cast<const StateChangeInfo*>(
+               &_StateChangeInfo_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    15;
+
+  void Swap(StateChangeInfo* other);
+  friend void swap(StateChangeInfo& a, StateChangeInfo& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline StateChangeInfo* New() const final {
+    return CreateMaybeMessage<StateChangeInfo>(nullptr);
+  }
+
+  StateChangeInfo* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<StateChangeInfo>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const StateChangeInfo& from);
+  void MergeFrom(const StateChangeInfo& 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(StateChangeInfo* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // .dmi.AdminStateChange admin_state_change = 1;
+  bool has_admin_state_change() const;
+  void clear_admin_state_change();
+  static const int kAdminStateChangeFieldNumber = 1;
+  const ::dmi::AdminStateChange& admin_state_change() const;
+  ::dmi::AdminStateChange* release_admin_state_change();
+  ::dmi::AdminStateChange* mutable_admin_state_change();
+  void set_allocated_admin_state_change(::dmi::AdminStateChange* admin_state_change);
+
+  // .dmi.OperStateChange oper_state_change = 2;
+  bool has_oper_state_change() const;
+  void clear_oper_state_change();
+  static const int kOperStateChangeFieldNumber = 2;
+  const ::dmi::OperStateChange& oper_state_change() const;
+  ::dmi::OperStateChange* release_oper_state_change();
+  ::dmi::OperStateChange* mutable_oper_state_change();
+  void set_allocated_oper_state_change(::dmi::OperStateChange* oper_state_change);
+
+  // .dmi.AlarmStateChange alarm_state_change = 3;
+  bool has_alarm_state_change() const;
+  void clear_alarm_state_change();
+  static const int kAlarmStateChangeFieldNumber = 3;
+  const ::dmi::AlarmStateChange& alarm_state_change() const;
+  ::dmi::AlarmStateChange* release_alarm_state_change();
+  ::dmi::AlarmStateChange* mutable_alarm_state_change();
+  void set_allocated_alarm_state_change(::dmi::AlarmStateChange* alarm_state_change);
+
+  // .dmi.UsageStateChange usage_state_change = 4;
+  bool has_usage_state_change() const;
+  void clear_usage_state_change();
+  static const int kUsageStateChangeFieldNumber = 4;
+  const ::dmi::UsageStateChange& usage_state_change() const;
+  ::dmi::UsageStateChange* release_usage_state_change();
+  ::dmi::UsageStateChange* mutable_usage_state_change();
+  void set_allocated_usage_state_change(::dmi::UsageStateChange* usage_state_change);
+
+  // .dmi.StandbyStateChange standby_state_change = 5;
+  bool has_standby_state_change() const;
+  void clear_standby_state_change();
+  static const int kStandbyStateChangeFieldNumber = 5;
+  const ::dmi::StandbyStateChange& standby_state_change() const;
+  ::dmi::StandbyStateChange* release_standby_state_change();
+  ::dmi::StandbyStateChange* mutable_standby_state_change();
+  void set_allocated_standby_state_change(::dmi::StandbyStateChange* standby_state_change);
+
+  void clear_state_change();
+  StateChangeCase state_change_case() const;
+  // @@protoc_insertion_point(class_scope:dmi.StateChangeInfo)
+ private:
+  class HasBitSetters;
+  void set_has_admin_state_change();
+  void set_has_oper_state_change();
+  void set_has_alarm_state_change();
+  void set_has_usage_state_change();
+  void set_has_standby_state_change();
+
+  inline bool has_state_change() const;
+  inline void clear_has_state_change();
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  union StateChangeUnion {
+    StateChangeUnion() {}
+    ::dmi::AdminStateChange* admin_state_change_;
+    ::dmi::OperStateChange* oper_state_change_;
+    ::dmi::AlarmStateChange* alarm_state_change_;
+    ::dmi::UsageStateChange* usage_state_change_;
+    ::dmi::StandbyStateChange* standby_state_change_;
+  } state_change_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  ::google::protobuf::uint32 _oneof_case_[1];
+
+  friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
 class Event final :
     public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.Event) */ {
  public:
@@ -1711,7 +2514,7 @@
                &_Event_default_instance_);
   }
   static constexpr int kIndexInFileMessages =
-    10;
+    16;
 
   void Swap(Event* other);
   friend void swap(Event& a, Event& b) {
@@ -1809,6 +2612,15 @@
   ::dmi::ThresholdInformation* mutable_threshold_info();
   void set_allocated_threshold_info(::dmi::ThresholdInformation* threshold_info);
 
+  // .dmi.StateChangeInfo state_change_info = 6;
+  bool has_state_change_info() const;
+  void clear_state_change_info();
+  static const int kStateChangeInfoFieldNumber = 6;
+  const ::dmi::StateChangeInfo& state_change_info() const;
+  ::dmi::StateChangeInfo* release_state_change_info();
+  ::dmi::StateChangeInfo* mutable_state_change_info();
+  void set_allocated_state_change_info(::dmi::StateChangeInfo* state_change_info);
+
   // .dmi.EventIds event_id = 2;
   void clear_event_id();
   static const int kEventIdFieldNumber = 2;
@@ -1824,6 +2636,7 @@
   ::dmi::EventMetaData* event_metadata_;
   ::google::protobuf::Timestamp* raised_ts_;
   ::dmi::ThresholdInformation* threshold_info_;
+  ::dmi::StateChangeInfo* state_change_info_;
   int event_id_;
   mutable ::google::protobuf::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_dmi_2fhw_5fevents_5fmgmt_5fservice_2eproto;
@@ -2916,6 +3729,384 @@
 
 // -------------------------------------------------------------------
 
+// AdminStateChange
+
+// .dmi.ComponentAdminState old = 1;
+inline void AdminStateChange::clear_old() {
+  old_ = 0;
+}
+inline ::dmi::ComponentAdminState AdminStateChange::old() const {
+  // @@protoc_insertion_point(field_get:dmi.AdminStateChange.old)
+  return static_cast< ::dmi::ComponentAdminState >(old_);
+}
+inline void AdminStateChange::set_old(::dmi::ComponentAdminState value) {
+  
+  old_ = value;
+  // @@protoc_insertion_point(field_set:dmi.AdminStateChange.old)
+}
+
+// .dmi.ComponentAdminState new = 2;
+inline void AdminStateChange::clear_new_() {
+  new__ = 0;
+}
+inline ::dmi::ComponentAdminState AdminStateChange::new_() const {
+  // @@protoc_insertion_point(field_get:dmi.AdminStateChange.new)
+  return static_cast< ::dmi::ComponentAdminState >(new__);
+}
+inline void AdminStateChange::set_new_(::dmi::ComponentAdminState value) {
+  
+  new__ = value;
+  // @@protoc_insertion_point(field_set:dmi.AdminStateChange.new)
+}
+
+// -------------------------------------------------------------------
+
+// OperStateChange
+
+// .dmi.ComponentOperState old = 1;
+inline void OperStateChange::clear_old() {
+  old_ = 0;
+}
+inline ::dmi::ComponentOperState OperStateChange::old() const {
+  // @@protoc_insertion_point(field_get:dmi.OperStateChange.old)
+  return static_cast< ::dmi::ComponentOperState >(old_);
+}
+inline void OperStateChange::set_old(::dmi::ComponentOperState value) {
+  
+  old_ = value;
+  // @@protoc_insertion_point(field_set:dmi.OperStateChange.old)
+}
+
+// .dmi.ComponentOperState new = 2;
+inline void OperStateChange::clear_new_() {
+  new__ = 0;
+}
+inline ::dmi::ComponentOperState OperStateChange::new_() const {
+  // @@protoc_insertion_point(field_get:dmi.OperStateChange.new)
+  return static_cast< ::dmi::ComponentOperState >(new__);
+}
+inline void OperStateChange::set_new_(::dmi::ComponentOperState value) {
+  
+  new__ = value;
+  // @@protoc_insertion_point(field_set:dmi.OperStateChange.new)
+}
+
+// -------------------------------------------------------------------
+
+// AlarmStateChange
+
+// .dmi.ComponentAlarmState old = 1;
+inline void AlarmStateChange::clear_old() {
+  old_ = 0;
+}
+inline ::dmi::ComponentAlarmState AlarmStateChange::old() const {
+  // @@protoc_insertion_point(field_get:dmi.AlarmStateChange.old)
+  return static_cast< ::dmi::ComponentAlarmState >(old_);
+}
+inline void AlarmStateChange::set_old(::dmi::ComponentAlarmState value) {
+  
+  old_ = value;
+  // @@protoc_insertion_point(field_set:dmi.AlarmStateChange.old)
+}
+
+// .dmi.ComponentAlarmState new = 2;
+inline void AlarmStateChange::clear_new_() {
+  new__ = 0;
+}
+inline ::dmi::ComponentAlarmState AlarmStateChange::new_() const {
+  // @@protoc_insertion_point(field_get:dmi.AlarmStateChange.new)
+  return static_cast< ::dmi::ComponentAlarmState >(new__);
+}
+inline void AlarmStateChange::set_new_(::dmi::ComponentAlarmState value) {
+  
+  new__ = value;
+  // @@protoc_insertion_point(field_set:dmi.AlarmStateChange.new)
+}
+
+// -------------------------------------------------------------------
+
+// UsageStateChange
+
+// .dmi.ComponentUsageState old = 1;
+inline void UsageStateChange::clear_old() {
+  old_ = 0;
+}
+inline ::dmi::ComponentUsageState UsageStateChange::old() const {
+  // @@protoc_insertion_point(field_get:dmi.UsageStateChange.old)
+  return static_cast< ::dmi::ComponentUsageState >(old_);
+}
+inline void UsageStateChange::set_old(::dmi::ComponentUsageState value) {
+  
+  old_ = value;
+  // @@protoc_insertion_point(field_set:dmi.UsageStateChange.old)
+}
+
+// .dmi.ComponentUsageState new = 2;
+inline void UsageStateChange::clear_new_() {
+  new__ = 0;
+}
+inline ::dmi::ComponentUsageState UsageStateChange::new_() const {
+  // @@protoc_insertion_point(field_get:dmi.UsageStateChange.new)
+  return static_cast< ::dmi::ComponentUsageState >(new__);
+}
+inline void UsageStateChange::set_new_(::dmi::ComponentUsageState value) {
+  
+  new__ = value;
+  // @@protoc_insertion_point(field_set:dmi.UsageStateChange.new)
+}
+
+// -------------------------------------------------------------------
+
+// StandbyStateChange
+
+// .dmi.ComponentStandbyState old = 1;
+inline void StandbyStateChange::clear_old() {
+  old_ = 0;
+}
+inline ::dmi::ComponentStandbyState StandbyStateChange::old() const {
+  // @@protoc_insertion_point(field_get:dmi.StandbyStateChange.old)
+  return static_cast< ::dmi::ComponentStandbyState >(old_);
+}
+inline void StandbyStateChange::set_old(::dmi::ComponentStandbyState value) {
+  
+  old_ = value;
+  // @@protoc_insertion_point(field_set:dmi.StandbyStateChange.old)
+}
+
+// .dmi.ComponentStandbyState new = 2;
+inline void StandbyStateChange::clear_new_() {
+  new__ = 0;
+}
+inline ::dmi::ComponentStandbyState StandbyStateChange::new_() const {
+  // @@protoc_insertion_point(field_get:dmi.StandbyStateChange.new)
+  return static_cast< ::dmi::ComponentStandbyState >(new__);
+}
+inline void StandbyStateChange::set_new_(::dmi::ComponentStandbyState value) {
+  
+  new__ = value;
+  // @@protoc_insertion_point(field_set:dmi.StandbyStateChange.new)
+}
+
+// -------------------------------------------------------------------
+
+// StateChangeInfo
+
+// .dmi.AdminStateChange admin_state_change = 1;
+inline bool StateChangeInfo::has_admin_state_change() const {
+  return state_change_case() == kAdminStateChange;
+}
+inline void StateChangeInfo::set_has_admin_state_change() {
+  _oneof_case_[0] = kAdminStateChange;
+}
+inline void StateChangeInfo::clear_admin_state_change() {
+  if (has_admin_state_change()) {
+    delete state_change_.admin_state_change_;
+    clear_has_state_change();
+  }
+}
+inline ::dmi::AdminStateChange* StateChangeInfo::release_admin_state_change() {
+  // @@protoc_insertion_point(field_release:dmi.StateChangeInfo.admin_state_change)
+  if (has_admin_state_change()) {
+    clear_has_state_change();
+      ::dmi::AdminStateChange* temp = state_change_.admin_state_change_;
+    state_change_.admin_state_change_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::dmi::AdminStateChange& StateChangeInfo::admin_state_change() const {
+  // @@protoc_insertion_point(field_get:dmi.StateChangeInfo.admin_state_change)
+  return has_admin_state_change()
+      ? *state_change_.admin_state_change_
+      : *reinterpret_cast< ::dmi::AdminStateChange*>(&::dmi::_AdminStateChange_default_instance_);
+}
+inline ::dmi::AdminStateChange* StateChangeInfo::mutable_admin_state_change() {
+  if (!has_admin_state_change()) {
+    clear_state_change();
+    set_has_admin_state_change();
+    state_change_.admin_state_change_ = CreateMaybeMessage< ::dmi::AdminStateChange >(
+        GetArenaNoVirtual());
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.StateChangeInfo.admin_state_change)
+  return state_change_.admin_state_change_;
+}
+
+// .dmi.OperStateChange oper_state_change = 2;
+inline bool StateChangeInfo::has_oper_state_change() const {
+  return state_change_case() == kOperStateChange;
+}
+inline void StateChangeInfo::set_has_oper_state_change() {
+  _oneof_case_[0] = kOperStateChange;
+}
+inline void StateChangeInfo::clear_oper_state_change() {
+  if (has_oper_state_change()) {
+    delete state_change_.oper_state_change_;
+    clear_has_state_change();
+  }
+}
+inline ::dmi::OperStateChange* StateChangeInfo::release_oper_state_change() {
+  // @@protoc_insertion_point(field_release:dmi.StateChangeInfo.oper_state_change)
+  if (has_oper_state_change()) {
+    clear_has_state_change();
+      ::dmi::OperStateChange* temp = state_change_.oper_state_change_;
+    state_change_.oper_state_change_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::dmi::OperStateChange& StateChangeInfo::oper_state_change() const {
+  // @@protoc_insertion_point(field_get:dmi.StateChangeInfo.oper_state_change)
+  return has_oper_state_change()
+      ? *state_change_.oper_state_change_
+      : *reinterpret_cast< ::dmi::OperStateChange*>(&::dmi::_OperStateChange_default_instance_);
+}
+inline ::dmi::OperStateChange* StateChangeInfo::mutable_oper_state_change() {
+  if (!has_oper_state_change()) {
+    clear_state_change();
+    set_has_oper_state_change();
+    state_change_.oper_state_change_ = CreateMaybeMessage< ::dmi::OperStateChange >(
+        GetArenaNoVirtual());
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.StateChangeInfo.oper_state_change)
+  return state_change_.oper_state_change_;
+}
+
+// .dmi.AlarmStateChange alarm_state_change = 3;
+inline bool StateChangeInfo::has_alarm_state_change() const {
+  return state_change_case() == kAlarmStateChange;
+}
+inline void StateChangeInfo::set_has_alarm_state_change() {
+  _oneof_case_[0] = kAlarmStateChange;
+}
+inline void StateChangeInfo::clear_alarm_state_change() {
+  if (has_alarm_state_change()) {
+    delete state_change_.alarm_state_change_;
+    clear_has_state_change();
+  }
+}
+inline ::dmi::AlarmStateChange* StateChangeInfo::release_alarm_state_change() {
+  // @@protoc_insertion_point(field_release:dmi.StateChangeInfo.alarm_state_change)
+  if (has_alarm_state_change()) {
+    clear_has_state_change();
+      ::dmi::AlarmStateChange* temp = state_change_.alarm_state_change_;
+    state_change_.alarm_state_change_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::dmi::AlarmStateChange& StateChangeInfo::alarm_state_change() const {
+  // @@protoc_insertion_point(field_get:dmi.StateChangeInfo.alarm_state_change)
+  return has_alarm_state_change()
+      ? *state_change_.alarm_state_change_
+      : *reinterpret_cast< ::dmi::AlarmStateChange*>(&::dmi::_AlarmStateChange_default_instance_);
+}
+inline ::dmi::AlarmStateChange* StateChangeInfo::mutable_alarm_state_change() {
+  if (!has_alarm_state_change()) {
+    clear_state_change();
+    set_has_alarm_state_change();
+    state_change_.alarm_state_change_ = CreateMaybeMessage< ::dmi::AlarmStateChange >(
+        GetArenaNoVirtual());
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.StateChangeInfo.alarm_state_change)
+  return state_change_.alarm_state_change_;
+}
+
+// .dmi.UsageStateChange usage_state_change = 4;
+inline bool StateChangeInfo::has_usage_state_change() const {
+  return state_change_case() == kUsageStateChange;
+}
+inline void StateChangeInfo::set_has_usage_state_change() {
+  _oneof_case_[0] = kUsageStateChange;
+}
+inline void StateChangeInfo::clear_usage_state_change() {
+  if (has_usage_state_change()) {
+    delete state_change_.usage_state_change_;
+    clear_has_state_change();
+  }
+}
+inline ::dmi::UsageStateChange* StateChangeInfo::release_usage_state_change() {
+  // @@protoc_insertion_point(field_release:dmi.StateChangeInfo.usage_state_change)
+  if (has_usage_state_change()) {
+    clear_has_state_change();
+      ::dmi::UsageStateChange* temp = state_change_.usage_state_change_;
+    state_change_.usage_state_change_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::dmi::UsageStateChange& StateChangeInfo::usage_state_change() const {
+  // @@protoc_insertion_point(field_get:dmi.StateChangeInfo.usage_state_change)
+  return has_usage_state_change()
+      ? *state_change_.usage_state_change_
+      : *reinterpret_cast< ::dmi::UsageStateChange*>(&::dmi::_UsageStateChange_default_instance_);
+}
+inline ::dmi::UsageStateChange* StateChangeInfo::mutable_usage_state_change() {
+  if (!has_usage_state_change()) {
+    clear_state_change();
+    set_has_usage_state_change();
+    state_change_.usage_state_change_ = CreateMaybeMessage< ::dmi::UsageStateChange >(
+        GetArenaNoVirtual());
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.StateChangeInfo.usage_state_change)
+  return state_change_.usage_state_change_;
+}
+
+// .dmi.StandbyStateChange standby_state_change = 5;
+inline bool StateChangeInfo::has_standby_state_change() const {
+  return state_change_case() == kStandbyStateChange;
+}
+inline void StateChangeInfo::set_has_standby_state_change() {
+  _oneof_case_[0] = kStandbyStateChange;
+}
+inline void StateChangeInfo::clear_standby_state_change() {
+  if (has_standby_state_change()) {
+    delete state_change_.standby_state_change_;
+    clear_has_state_change();
+  }
+}
+inline ::dmi::StandbyStateChange* StateChangeInfo::release_standby_state_change() {
+  // @@protoc_insertion_point(field_release:dmi.StateChangeInfo.standby_state_change)
+  if (has_standby_state_change()) {
+    clear_has_state_change();
+      ::dmi::StandbyStateChange* temp = state_change_.standby_state_change_;
+    state_change_.standby_state_change_ = nullptr;
+    return temp;
+  } else {
+    return nullptr;
+  }
+}
+inline const ::dmi::StandbyStateChange& StateChangeInfo::standby_state_change() const {
+  // @@protoc_insertion_point(field_get:dmi.StateChangeInfo.standby_state_change)
+  return has_standby_state_change()
+      ? *state_change_.standby_state_change_
+      : *reinterpret_cast< ::dmi::StandbyStateChange*>(&::dmi::_StandbyStateChange_default_instance_);
+}
+inline ::dmi::StandbyStateChange* StateChangeInfo::mutable_standby_state_change() {
+  if (!has_standby_state_change()) {
+    clear_state_change();
+    set_has_standby_state_change();
+    state_change_.standby_state_change_ = CreateMaybeMessage< ::dmi::StandbyStateChange >(
+        GetArenaNoVirtual());
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.StateChangeInfo.standby_state_change)
+  return state_change_.standby_state_change_;
+}
+
+inline bool StateChangeInfo::has_state_change() const {
+  return state_change_case() != STATE_CHANGE_NOT_SET;
+}
+inline void StateChangeInfo::clear_has_state_change() {
+  _oneof_case_[0] = STATE_CHANGE_NOT_SET;
+}
+inline StateChangeInfo::StateChangeCase StateChangeInfo::state_change_case() const {
+  return StateChangeInfo::StateChangeCase(_oneof_case_[0]);
+}
+// -------------------------------------------------------------------
+
 // Event
 
 // .dmi.EventMetaData event_metadata = 1;
@@ -3133,6 +4324,57 @@
   // @@protoc_insertion_point(field_set_allocated:dmi.Event.add_info)
 }
 
+// .dmi.StateChangeInfo state_change_info = 6;
+inline bool Event::has_state_change_info() const {
+  return this != internal_default_instance() && state_change_info_ != nullptr;
+}
+inline void Event::clear_state_change_info() {
+  if (GetArenaNoVirtual() == nullptr && state_change_info_ != nullptr) {
+    delete state_change_info_;
+  }
+  state_change_info_ = nullptr;
+}
+inline const ::dmi::StateChangeInfo& Event::state_change_info() const {
+  const ::dmi::StateChangeInfo* p = state_change_info_;
+  // @@protoc_insertion_point(field_get:dmi.Event.state_change_info)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::StateChangeInfo*>(
+      &::dmi::_StateChangeInfo_default_instance_);
+}
+inline ::dmi::StateChangeInfo* Event::release_state_change_info() {
+  // @@protoc_insertion_point(field_release:dmi.Event.state_change_info)
+  
+  ::dmi::StateChangeInfo* temp = state_change_info_;
+  state_change_info_ = nullptr;
+  return temp;
+}
+inline ::dmi::StateChangeInfo* Event::mutable_state_change_info() {
+  
+  if (state_change_info_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::StateChangeInfo>(GetArenaNoVirtual());
+    state_change_info_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.Event.state_change_info)
+  return state_change_info_;
+}
+inline void Event::set_allocated_state_change_info(::dmi::StateChangeInfo* state_change_info) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete state_change_info_;
+  }
+  if (state_change_info) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      state_change_info = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, state_change_info, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  state_change_info_ = state_change_info;
+  // @@protoc_insertion_point(field_set_allocated:dmi.Event.state_change_info)
+}
+
 #ifdef __GNUC__
   #pragma GCC diagnostic pop
 #endif  // __GNUC__
@@ -3156,6 +4398,18 @@
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 
diff --git a/cpp/dmi/hw_management_service.grpc.pb.cc b/cpp/dmi/hw_management_service.grpc.pb.cc
index ef057ff..19f6be0 100644
--- a/cpp/dmi/hw_management_service.grpc.pb.cc
+++ b/cpp/dmi/hw_management_service.grpc.pb.cc
@@ -39,6 +39,9 @@
   "/dmi.NativeHWManagementService/RebootDevice",
   "/dmi.NativeHWManagementService/SetDmLogLevel",
   "/dmi.NativeHWManagementService/GetDmLogLevel",
+  "/dmi.NativeHWManagementService/DisableHWComponent",
+  "/dmi.NativeHWManagementService/ResetHWComponent",
+  "/dmi.NativeHWManagementService/EnableHWComponent",
 };
 
 std::unique_ptr< NativeHWManagementService::Stub> NativeHWManagementService::NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options) {
@@ -65,6 +68,9 @@
   , rpcmethod_RebootDevice_(NativeHWManagementService_method_names[14], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   , rpcmethod_SetDmLogLevel_(NativeHWManagementService_method_names[15], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   , rpcmethod_GetDmLogLevel_(NativeHWManagementService_method_names[16], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_DisableHWComponent_(NativeHWManagementService_method_names[17], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_ResetHWComponent_(NativeHWManagementService_method_names[18], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
+  , rpcmethod_EnableHWComponent_(NativeHWManagementService_method_names[19], ::grpc::internal::RpcMethod::NORMAL_RPC, channel)
   {}
 
 ::grpc::ClientReader< ::dmi::StartManagingDeviceResponse>* NativeHWManagementService::Stub::StartManagingDeviceRaw(::grpc::ClientContext* context, const ::dmi::ModifiableComponent& request) {
@@ -507,6 +513,90 @@
   return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::GetDmLogLevelResponse>::Create(channel_.get(), cq, rpcmethod_GetDmLogLevel_, context, request, false);
 }
 
+::grpc::Status NativeHWManagementService::Stub::DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::dmi::DisableHWComponentResponse* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_DisableHWComponent_, context, request, response);
+}
+
+void NativeHWManagementService::Stub::experimental_async::DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response, std::function<void(::grpc::Status)> f) {
+  ::grpc_impl::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_DisableHWComponent_, context, request, response, std::move(f));
+}
+
+void NativeHWManagementService::Stub::experimental_async::DisableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::DisableHWComponentResponse* response, std::function<void(::grpc::Status)> f) {
+  ::grpc_impl::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_DisableHWComponent_, context, request, response, std::move(f));
+}
+
+void NativeHWManagementService::Stub::experimental_async::DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc_impl::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_DisableHWComponent_, context, request, response, reactor);
+}
+
+void NativeHWManagementService::Stub::experimental_async::DisableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::DisableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc_impl::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_DisableHWComponent_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::dmi::DisableHWComponentResponse>* NativeHWManagementService::Stub::AsyncDisableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::DisableHWComponentResponse>::Create(channel_.get(), cq, rpcmethod_DisableHWComponent_, context, request, true);
+}
+
+::grpc::ClientAsyncResponseReader< ::dmi::DisableHWComponentResponse>* NativeHWManagementService::Stub::PrepareAsyncDisableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::DisableHWComponentResponse>::Create(channel_.get(), cq, rpcmethod_DisableHWComponent_, context, request, false);
+}
+
+::grpc::Status NativeHWManagementService::Stub::ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::dmi::ResetHWComponentResponse* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_ResetHWComponent_, context, request, response);
+}
+
+void NativeHWManagementService::Stub::experimental_async::ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response, std::function<void(::grpc::Status)> f) {
+  ::grpc_impl::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_ResetHWComponent_, context, request, response, std::move(f));
+}
+
+void NativeHWManagementService::Stub::experimental_async::ResetHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::ResetHWComponentResponse* response, std::function<void(::grpc::Status)> f) {
+  ::grpc_impl::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_ResetHWComponent_, context, request, response, std::move(f));
+}
+
+void NativeHWManagementService::Stub::experimental_async::ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc_impl::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_ResetHWComponent_, context, request, response, reactor);
+}
+
+void NativeHWManagementService::Stub::experimental_async::ResetHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::ResetHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc_impl::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_ResetHWComponent_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::dmi::ResetHWComponentResponse>* NativeHWManagementService::Stub::AsyncResetHWComponentRaw(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::ResetHWComponentResponse>::Create(channel_.get(), cq, rpcmethod_ResetHWComponent_, context, request, true);
+}
+
+::grpc::ClientAsyncResponseReader< ::dmi::ResetHWComponentResponse>* NativeHWManagementService::Stub::PrepareAsyncResetHWComponentRaw(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::ResetHWComponentResponse>::Create(channel_.get(), cq, rpcmethod_ResetHWComponent_, context, request, false);
+}
+
+::grpc::Status NativeHWManagementService::Stub::EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::dmi::EnableHWComponentResponse* response) {
+  return ::grpc::internal::BlockingUnaryCall(channel_.get(), rpcmethod_EnableHWComponent_, context, request, response);
+}
+
+void NativeHWManagementService::Stub::experimental_async::EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response, std::function<void(::grpc::Status)> f) {
+  ::grpc_impl::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_EnableHWComponent_, context, request, response, std::move(f));
+}
+
+void NativeHWManagementService::Stub::experimental_async::EnableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EnableHWComponentResponse* response, std::function<void(::grpc::Status)> f) {
+  ::grpc_impl::internal::CallbackUnaryCall(stub_->channel_.get(), stub_->rpcmethod_EnableHWComponent_, context, request, response, std::move(f));
+}
+
+void NativeHWManagementService::Stub::experimental_async::EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc_impl::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_EnableHWComponent_, context, request, response, reactor);
+}
+
+void NativeHWManagementService::Stub::experimental_async::EnableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EnableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) {
+  ::grpc_impl::internal::ClientCallbackUnaryFactory::Create(stub_->channel_.get(), stub_->rpcmethod_EnableHWComponent_, context, request, response, reactor);
+}
+
+::grpc::ClientAsyncResponseReader< ::dmi::EnableHWComponentResponse>* NativeHWManagementService::Stub::AsyncEnableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::EnableHWComponentResponse>::Create(channel_.get(), cq, rpcmethod_EnableHWComponent_, context, request, true);
+}
+
+::grpc::ClientAsyncResponseReader< ::dmi::EnableHWComponentResponse>* NativeHWManagementService::Stub::PrepareAsyncEnableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+  return ::grpc_impl::internal::ClientAsyncResponseReaderFactory< ::dmi::EnableHWComponentResponse>::Create(channel_.get(), cq, rpcmethod_EnableHWComponent_, context, request, false);
+}
+
 NativeHWManagementService::Service::Service() {
   AddMethod(new ::grpc::internal::RpcServiceMethod(
       NativeHWManagementService_method_names[0],
@@ -678,6 +768,36 @@
              ::dmi::GetDmLogLevelResponse* resp) {
                return service->GetDmLogLevel(ctx, req, resp);
              }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      NativeHWManagementService_method_names[17],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< NativeHWManagementService::Service, ::dmi::DisableHWComponentRequest, ::dmi::DisableHWComponentResponse>(
+          [](NativeHWManagementService::Service* service,
+             ::grpc_impl::ServerContext* ctx,
+             const ::dmi::DisableHWComponentRequest* req,
+             ::dmi::DisableHWComponentResponse* resp) {
+               return service->DisableHWComponent(ctx, req, resp);
+             }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      NativeHWManagementService_method_names[18],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< NativeHWManagementService::Service, ::dmi::ResetHWComponentRequest, ::dmi::ResetHWComponentResponse>(
+          [](NativeHWManagementService::Service* service,
+             ::grpc_impl::ServerContext* ctx,
+             const ::dmi::ResetHWComponentRequest* req,
+             ::dmi::ResetHWComponentResponse* resp) {
+               return service->ResetHWComponent(ctx, req, resp);
+             }, this)));
+  AddMethod(new ::grpc::internal::RpcServiceMethod(
+      NativeHWManagementService_method_names[19],
+      ::grpc::internal::RpcMethod::NORMAL_RPC,
+      new ::grpc::internal::RpcMethodHandler< NativeHWManagementService::Service, ::dmi::EnableHWComponentRequest, ::dmi::EnableHWComponentResponse>(
+          [](NativeHWManagementService::Service* service,
+             ::grpc_impl::ServerContext* ctx,
+             const ::dmi::EnableHWComponentRequest* req,
+             ::dmi::EnableHWComponentResponse* resp) {
+               return service->EnableHWComponent(ctx, req, resp);
+             }, this)));
 }
 
 NativeHWManagementService::Service::~Service() {
@@ -802,6 +922,27 @@
   return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
 }
 
+::grpc::Status NativeHWManagementService::Service::DisableHWComponent(::grpc::ServerContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+::grpc::Status NativeHWManagementService::Service::ResetHWComponent(::grpc::ServerContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
+::grpc::Status NativeHWManagementService::Service::EnableHWComponent(::grpc::ServerContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response) {
+  (void) context;
+  (void) request;
+  (void) response;
+  return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+}
+
 
 }  // namespace dmi
 
diff --git a/cpp/dmi/hw_management_service.grpc.pb.h b/cpp/dmi/hw_management_service.grpc.pb.h
index 938264c..1d24ff5 100644
--- a/cpp/dmi/hw_management_service.grpc.pb.h
+++ b/cpp/dmi/hw_management_service.grpc.pb.h
@@ -193,6 +193,30 @@
     std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetDmLogLevelResponse>> PrepareAsyncGetDmLogLevel(::grpc::ClientContext* context, const ::dmi::GetDmLogLevelRequest& request, ::grpc::CompletionQueue* cq) {
       return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetDmLogLevelResponse>>(PrepareAsyncGetDmLogLevelRaw(context, request, cq));
     }
+    // Disables a hardware component on a device.
+    virtual ::grpc::Status DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::dmi::DisableHWComponentResponse* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::DisableHWComponentResponse>> AsyncDisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::DisableHWComponentResponse>>(AsyncDisableHWComponentRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::DisableHWComponentResponse>> PrepareAsyncDisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::DisableHWComponentResponse>>(PrepareAsyncDisableHWComponentRaw(context, request, cq));
+    }
+    // Resets a hardware component on a device.
+    virtual ::grpc::Status ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::dmi::ResetHWComponentResponse* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::ResetHWComponentResponse>> AsyncResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::ResetHWComponentResponse>>(AsyncResetHWComponentRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::ResetHWComponentResponse>> PrepareAsyncResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::ResetHWComponentResponse>>(PrepareAsyncResetHWComponentRaw(context, request, cq));
+    }
+    // Enables a hardware component on a device.
+    virtual ::grpc::Status EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::dmi::EnableHWComponentResponse* response) = 0;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EnableHWComponentResponse>> AsyncEnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EnableHWComponentResponse>>(AsyncEnableHWComponentRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EnableHWComponentResponse>> PrepareAsyncEnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EnableHWComponentResponse>>(PrepareAsyncEnableHWComponentRaw(context, request, cq));
+    }
     class experimental_async_interface {
      public:
       virtual ~experimental_async_interface() {}
@@ -411,6 +435,45 @@
       #else
       virtual void GetDmLogLevel(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::GetDmLogLevelResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
       #endif
+      // Disables a hardware component on a device.
+      virtual void DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response, std::function<void(::grpc::Status)>) = 0;
+      virtual void DisableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::DisableHWComponentResponse* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void DisableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::DisableHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void DisableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::DisableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      // Resets a hardware component on a device.
+      virtual void ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response, std::function<void(::grpc::Status)>) = 0;
+      virtual void ResetHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::ResetHWComponentResponse* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void ResetHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::ResetHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void ResetHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::ResetHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      // Enables a hardware component on a device.
+      virtual void EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response, std::function<void(::grpc::Status)>) = 0;
+      virtual void EnableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EnableHWComponentResponse* response, std::function<void(::grpc::Status)>) = 0;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      virtual void EnableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EnableHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) = 0;
+      #else
+      virtual void EnableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EnableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) = 0;
+      #endif
     };
     #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
     typedef class experimental_async_interface async_interface;
@@ -457,6 +520,12 @@
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::SetDmLogLevelResponse>* PrepareAsyncSetDmLogLevelRaw(::grpc::ClientContext* context, const ::dmi::SetDmLogLevelRequest& request, ::grpc::CompletionQueue* cq) = 0;
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetDmLogLevelResponse>* AsyncGetDmLogLevelRaw(::grpc::ClientContext* context, const ::dmi::GetDmLogLevelRequest& request, ::grpc::CompletionQueue* cq) = 0;
     virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::GetDmLogLevelResponse>* PrepareAsyncGetDmLogLevelRaw(::grpc::ClientContext* context, const ::dmi::GetDmLogLevelRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::DisableHWComponentResponse>* AsyncDisableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::DisableHWComponentResponse>* PrepareAsyncDisableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::ResetHWComponentResponse>* AsyncResetHWComponentRaw(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::ResetHWComponentResponse>* PrepareAsyncResetHWComponentRaw(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EnableHWComponentResponse>* AsyncEnableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) = 0;
+    virtual ::grpc::ClientAsyncResponseReaderInterface< ::dmi::EnableHWComponentResponse>* PrepareAsyncEnableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) = 0;
   };
   class Stub final : public StubInterface {
    public:
@@ -586,6 +655,27 @@
     std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::GetDmLogLevelResponse>> PrepareAsyncGetDmLogLevel(::grpc::ClientContext* context, const ::dmi::GetDmLogLevelRequest& request, ::grpc::CompletionQueue* cq) {
       return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::GetDmLogLevelResponse>>(PrepareAsyncGetDmLogLevelRaw(context, request, cq));
     }
+    ::grpc::Status DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::dmi::DisableHWComponentResponse* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::DisableHWComponentResponse>> AsyncDisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::DisableHWComponentResponse>>(AsyncDisableHWComponentRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::DisableHWComponentResponse>> PrepareAsyncDisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::DisableHWComponentResponse>>(PrepareAsyncDisableHWComponentRaw(context, request, cq));
+    }
+    ::grpc::Status ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::dmi::ResetHWComponentResponse* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::ResetHWComponentResponse>> AsyncResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::ResetHWComponentResponse>>(AsyncResetHWComponentRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::ResetHWComponentResponse>> PrepareAsyncResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::ResetHWComponentResponse>>(PrepareAsyncResetHWComponentRaw(context, request, cq));
+    }
+    ::grpc::Status EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::dmi::EnableHWComponentResponse* response) override;
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::EnableHWComponentResponse>> AsyncEnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::EnableHWComponentResponse>>(AsyncEnableHWComponentRaw(context, request, cq));
+    }
+    std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::EnableHWComponentResponse>> PrepareAsyncEnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) {
+      return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::dmi::EnableHWComponentResponse>>(PrepareAsyncEnableHWComponentRaw(context, request, cq));
+    }
     class experimental_async final :
       public StubInterface::experimental_async_interface {
      public:
@@ -772,6 +862,42 @@
       #else
       void GetDmLogLevel(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::GetDmLogLevelResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
       #endif
+      void DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response, std::function<void(::grpc::Status)>) override;
+      void DisableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::DisableHWComponentResponse* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void DisableHWComponent(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void DisableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::DisableHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void DisableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::DisableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      void ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response, std::function<void(::grpc::Status)>) override;
+      void ResetHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::ResetHWComponentResponse* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void ResetHWComponent(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void ResetHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::ResetHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void ResetHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::ResetHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      void EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response, std::function<void(::grpc::Status)>) override;
+      void EnableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EnableHWComponentResponse* response, std::function<void(::grpc::Status)>) override;
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void EnableHWComponent(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
+      #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      void EnableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EnableHWComponentResponse* response, ::grpc::ClientUnaryReactor* reactor) override;
+      #else
+      void EnableHWComponent(::grpc::ClientContext* context, const ::grpc::ByteBuffer* request, ::dmi::EnableHWComponentResponse* response, ::grpc::experimental::ClientUnaryReactor* reactor) override;
+      #endif
      private:
       friend class Stub;
       explicit experimental_async(Stub* stub): stub_(stub) { }
@@ -820,6 +946,12 @@
     ::grpc::ClientAsyncResponseReader< ::dmi::SetDmLogLevelResponse>* PrepareAsyncSetDmLogLevelRaw(::grpc::ClientContext* context, const ::dmi::SetDmLogLevelRequest& request, ::grpc::CompletionQueue* cq) override;
     ::grpc::ClientAsyncResponseReader< ::dmi::GetDmLogLevelResponse>* AsyncGetDmLogLevelRaw(::grpc::ClientContext* context, const ::dmi::GetDmLogLevelRequest& request, ::grpc::CompletionQueue* cq) override;
     ::grpc::ClientAsyncResponseReader< ::dmi::GetDmLogLevelResponse>* PrepareAsyncGetDmLogLevelRaw(::grpc::ClientContext* context, const ::dmi::GetDmLogLevelRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::dmi::DisableHWComponentResponse>* AsyncDisableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::dmi::DisableHWComponentResponse>* PrepareAsyncDisableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::DisableHWComponentRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::dmi::ResetHWComponentResponse>* AsyncResetHWComponentRaw(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::dmi::ResetHWComponentResponse>* PrepareAsyncResetHWComponentRaw(::grpc::ClientContext* context, const ::dmi::ResetHWComponentRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::dmi::EnableHWComponentResponse>* AsyncEnableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) override;
+    ::grpc::ClientAsyncResponseReader< ::dmi::EnableHWComponentResponse>* PrepareAsyncEnableHWComponentRaw(::grpc::ClientContext* context, const ::dmi::EnableHWComponentRequest& request, ::grpc::CompletionQueue* cq) override;
     const ::grpc::internal::RpcMethod rpcmethod_StartManagingDevice_;
     const ::grpc::internal::RpcMethod rpcmethod_StopManagingDevice_;
     const ::grpc::internal::RpcMethod rpcmethod_GetManagedDevices_;
@@ -837,6 +969,9 @@
     const ::grpc::internal::RpcMethod rpcmethod_RebootDevice_;
     const ::grpc::internal::RpcMethod rpcmethod_SetDmLogLevel_;
     const ::grpc::internal::RpcMethod rpcmethod_GetDmLogLevel_;
+    const ::grpc::internal::RpcMethod rpcmethod_DisableHWComponent_;
+    const ::grpc::internal::RpcMethod rpcmethod_ResetHWComponent_;
+    const ::grpc::internal::RpcMethod rpcmethod_EnableHWComponent_;
   };
   static std::unique_ptr<Stub> NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions());
 
@@ -893,6 +1028,12 @@
     virtual ::grpc::Status SetDmLogLevel(::grpc::ServerContext* context, const ::dmi::SetDmLogLevelRequest* request, ::dmi::SetDmLogLevelResponse* response);
     // Gets the log level at which the Device Manager is running
     virtual ::grpc::Status GetDmLogLevel(::grpc::ServerContext* context, const ::dmi::GetDmLogLevelRequest* request, ::dmi::GetDmLogLevelResponse* response);
+    // Disables a hardware component on a device.
+    virtual ::grpc::Status DisableHWComponent(::grpc::ServerContext* context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response);
+    // Resets a hardware component on a device.
+    virtual ::grpc::Status ResetHWComponent(::grpc::ServerContext* context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response);
+    // Enables a hardware component on a device.
+    virtual ::grpc::Status EnableHWComponent(::grpc::ServerContext* context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response);
   };
   template <class BaseClass>
   class WithAsyncMethod_StartManagingDevice : public BaseClass {
@@ -1234,7 +1375,67 @@
       ::grpc::Service::RequestAsyncUnary(16, context, request, response, new_call_cq, notification_cq, tag);
     }
   };
-  typedef WithAsyncMethod_StartManagingDevice<WithAsyncMethod_StopManagingDevice<WithAsyncMethod_GetManagedDevices<WithAsyncMethod_GetPhysicalInventory<WithAsyncMethod_GetHWComponentInfo<WithAsyncMethod_SetHWComponentInfo<WithAsyncMethod_SetLoggingEndpoint<WithAsyncMethod_GetLoggingEndpoint<WithAsyncMethod_SetMsgBusEndpoint<WithAsyncMethod_GetMsgBusEndpoint<WithAsyncMethod_GetLoggableEntities<WithAsyncMethod_SetLogLevel<WithAsyncMethod_GetLogLevel<WithAsyncMethod_HeartbeatCheck<WithAsyncMethod_RebootDevice<WithAsyncMethod_SetDmLogLevel<WithAsyncMethod_GetDmLogLevel<Service > > > > > > > > > > > > > > > > > AsyncService;
+  template <class BaseClass>
+  class WithAsyncMethod_DisableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_DisableHWComponent() {
+      ::grpc::Service::MarkMethodAsync(17);
+    }
+    ~WithAsyncMethod_DisableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status DisableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::DisableHWComponentRequest* /*request*/, ::dmi::DisableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestDisableHWComponent(::grpc::ServerContext* context, ::dmi::DisableHWComponentRequest* request, ::grpc::ServerAsyncResponseWriter< ::dmi::DisableHWComponentResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(17, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_ResetHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_ResetHWComponent() {
+      ::grpc::Service::MarkMethodAsync(18);
+    }
+    ~WithAsyncMethod_ResetHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status ResetHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::ResetHWComponentRequest* /*request*/, ::dmi::ResetHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestResetHWComponent(::grpc::ServerContext* context, ::dmi::ResetHWComponentRequest* request, ::grpc::ServerAsyncResponseWriter< ::dmi::ResetHWComponentResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(18, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithAsyncMethod_EnableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithAsyncMethod_EnableHWComponent() {
+      ::grpc::Service::MarkMethodAsync(19);
+    }
+    ~WithAsyncMethod_EnableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status EnableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::EnableHWComponentRequest* /*request*/, ::dmi::EnableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestEnableHWComponent(::grpc::ServerContext* context, ::dmi::EnableHWComponentRequest* request, ::grpc::ServerAsyncResponseWriter< ::dmi::EnableHWComponentResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(19, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  typedef WithAsyncMethod_StartManagingDevice<WithAsyncMethod_StopManagingDevice<WithAsyncMethod_GetManagedDevices<WithAsyncMethod_GetPhysicalInventory<WithAsyncMethod_GetHWComponentInfo<WithAsyncMethod_SetHWComponentInfo<WithAsyncMethod_SetLoggingEndpoint<WithAsyncMethod_GetLoggingEndpoint<WithAsyncMethod_SetMsgBusEndpoint<WithAsyncMethod_GetMsgBusEndpoint<WithAsyncMethod_GetLoggableEntities<WithAsyncMethod_SetLogLevel<WithAsyncMethod_GetLogLevel<WithAsyncMethod_HeartbeatCheck<WithAsyncMethod_RebootDevice<WithAsyncMethod_SetDmLogLevel<WithAsyncMethod_GetDmLogLevel<WithAsyncMethod_DisableHWComponent<WithAsyncMethod_ResetHWComponent<WithAsyncMethod_EnableHWComponent<Service > > > > > > > > > > > > > > > > > > > > AsyncService;
   template <class BaseClass>
   class ExperimentalWithCallbackMethod_StartManagingDevice : public BaseClass {
    private:
@@ -2007,11 +2208,152 @@
     #endif
       { return nullptr; }
   };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_DisableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_DisableHWComponent() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(17,
+          new ::grpc_impl::internal::CallbackUnaryHandler< ::dmi::DisableHWComponentRequest, ::dmi::DisableHWComponentResponse>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::dmi::DisableHWComponentRequest* request, ::dmi::DisableHWComponentResponse* response) { return this->DisableHWComponent(context, request, response); }));}
+    void SetMessageAllocatorFor_DisableHWComponent(
+        ::grpc::experimental::MessageAllocator< ::dmi::DisableHWComponentRequest, ::dmi::DisableHWComponentResponse>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(17);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(17);
+    #endif
+      static_cast<::grpc_impl::internal::CallbackUnaryHandler< ::dmi::DisableHWComponentRequest, ::dmi::DisableHWComponentResponse>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_DisableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status DisableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::DisableHWComponentRequest* /*request*/, ::dmi::DisableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* DisableHWComponent(
+      ::grpc::CallbackServerContext* /*context*/, const ::dmi::DisableHWComponentRequest* /*request*/, ::dmi::DisableHWComponentResponse* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* DisableHWComponent(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::dmi::DisableHWComponentRequest* /*request*/, ::dmi::DisableHWComponentResponse* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_ResetHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_ResetHWComponent() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(18,
+          new ::grpc_impl::internal::CallbackUnaryHandler< ::dmi::ResetHWComponentRequest, ::dmi::ResetHWComponentResponse>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::dmi::ResetHWComponentRequest* request, ::dmi::ResetHWComponentResponse* response) { return this->ResetHWComponent(context, request, response); }));}
+    void SetMessageAllocatorFor_ResetHWComponent(
+        ::grpc::experimental::MessageAllocator< ::dmi::ResetHWComponentRequest, ::dmi::ResetHWComponentResponse>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(18);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(18);
+    #endif
+      static_cast<::grpc_impl::internal::CallbackUnaryHandler< ::dmi::ResetHWComponentRequest, ::dmi::ResetHWComponentResponse>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_ResetHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status ResetHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::ResetHWComponentRequest* /*request*/, ::dmi::ResetHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* ResetHWComponent(
+      ::grpc::CallbackServerContext* /*context*/, const ::dmi::ResetHWComponentRequest* /*request*/, ::dmi::ResetHWComponentResponse* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* ResetHWComponent(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::dmi::ResetHWComponentRequest* /*request*/, ::dmi::ResetHWComponentResponse* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithCallbackMethod_EnableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithCallbackMethod_EnableHWComponent() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodCallback(19,
+          new ::grpc_impl::internal::CallbackUnaryHandler< ::dmi::EnableHWComponentRequest, ::dmi::EnableHWComponentResponse>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::dmi::EnableHWComponentRequest* request, ::dmi::EnableHWComponentResponse* response) { return this->EnableHWComponent(context, request, response); }));}
+    void SetMessageAllocatorFor_EnableHWComponent(
+        ::grpc::experimental::MessageAllocator< ::dmi::EnableHWComponentRequest, ::dmi::EnableHWComponentResponse>* allocator) {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::GetHandler(19);
+    #else
+      ::grpc::internal::MethodHandler* const handler = ::grpc::Service::experimental().GetHandler(19);
+    #endif
+      static_cast<::grpc_impl::internal::CallbackUnaryHandler< ::dmi::EnableHWComponentRequest, ::dmi::EnableHWComponentResponse>*>(handler)
+              ->SetMessageAllocator(allocator);
+    }
+    ~ExperimentalWithCallbackMethod_EnableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status EnableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::EnableHWComponentRequest* /*request*/, ::dmi::EnableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* EnableHWComponent(
+      ::grpc::CallbackServerContext* /*context*/, const ::dmi::EnableHWComponentRequest* /*request*/, ::dmi::EnableHWComponentResponse* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* EnableHWComponent(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::dmi::EnableHWComponentRequest* /*request*/, ::dmi::EnableHWComponentResponse* /*response*/)
+    #endif
+      { return nullptr; }
+  };
   #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
-  typedef ExperimentalWithCallbackMethod_StartManagingDevice<ExperimentalWithCallbackMethod_StopManagingDevice<ExperimentalWithCallbackMethod_GetManagedDevices<ExperimentalWithCallbackMethod_GetPhysicalInventory<ExperimentalWithCallbackMethod_GetHWComponentInfo<ExperimentalWithCallbackMethod_SetHWComponentInfo<ExperimentalWithCallbackMethod_SetLoggingEndpoint<ExperimentalWithCallbackMethod_GetLoggingEndpoint<ExperimentalWithCallbackMethod_SetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetLoggableEntities<ExperimentalWithCallbackMethod_SetLogLevel<ExperimentalWithCallbackMethod_GetLogLevel<ExperimentalWithCallbackMethod_HeartbeatCheck<ExperimentalWithCallbackMethod_RebootDevice<ExperimentalWithCallbackMethod_SetDmLogLevel<ExperimentalWithCallbackMethod_GetDmLogLevel<Service > > > > > > > > > > > > > > > > > CallbackService;
+  typedef ExperimentalWithCallbackMethod_StartManagingDevice<ExperimentalWithCallbackMethod_StopManagingDevice<ExperimentalWithCallbackMethod_GetManagedDevices<ExperimentalWithCallbackMethod_GetPhysicalInventory<ExperimentalWithCallbackMethod_GetHWComponentInfo<ExperimentalWithCallbackMethod_SetHWComponentInfo<ExperimentalWithCallbackMethod_SetLoggingEndpoint<ExperimentalWithCallbackMethod_GetLoggingEndpoint<ExperimentalWithCallbackMethod_SetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetLoggableEntities<ExperimentalWithCallbackMethod_SetLogLevel<ExperimentalWithCallbackMethod_GetLogLevel<ExperimentalWithCallbackMethod_HeartbeatCheck<ExperimentalWithCallbackMethod_RebootDevice<ExperimentalWithCallbackMethod_SetDmLogLevel<ExperimentalWithCallbackMethod_GetDmLogLevel<ExperimentalWithCallbackMethod_DisableHWComponent<ExperimentalWithCallbackMethod_ResetHWComponent<ExperimentalWithCallbackMethod_EnableHWComponent<Service > > > > > > > > > > > > > > > > > > > > CallbackService;
   #endif
 
-  typedef ExperimentalWithCallbackMethod_StartManagingDevice<ExperimentalWithCallbackMethod_StopManagingDevice<ExperimentalWithCallbackMethod_GetManagedDevices<ExperimentalWithCallbackMethod_GetPhysicalInventory<ExperimentalWithCallbackMethod_GetHWComponentInfo<ExperimentalWithCallbackMethod_SetHWComponentInfo<ExperimentalWithCallbackMethod_SetLoggingEndpoint<ExperimentalWithCallbackMethod_GetLoggingEndpoint<ExperimentalWithCallbackMethod_SetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetLoggableEntities<ExperimentalWithCallbackMethod_SetLogLevel<ExperimentalWithCallbackMethod_GetLogLevel<ExperimentalWithCallbackMethod_HeartbeatCheck<ExperimentalWithCallbackMethod_RebootDevice<ExperimentalWithCallbackMethod_SetDmLogLevel<ExperimentalWithCallbackMethod_GetDmLogLevel<Service > > > > > > > > > > > > > > > > > ExperimentalCallbackService;
+  typedef ExperimentalWithCallbackMethod_StartManagingDevice<ExperimentalWithCallbackMethod_StopManagingDevice<ExperimentalWithCallbackMethod_GetManagedDevices<ExperimentalWithCallbackMethod_GetPhysicalInventory<ExperimentalWithCallbackMethod_GetHWComponentInfo<ExperimentalWithCallbackMethod_SetHWComponentInfo<ExperimentalWithCallbackMethod_SetLoggingEndpoint<ExperimentalWithCallbackMethod_GetLoggingEndpoint<ExperimentalWithCallbackMethod_SetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetMsgBusEndpoint<ExperimentalWithCallbackMethod_GetLoggableEntities<ExperimentalWithCallbackMethod_SetLogLevel<ExperimentalWithCallbackMethod_GetLogLevel<ExperimentalWithCallbackMethod_HeartbeatCheck<ExperimentalWithCallbackMethod_RebootDevice<ExperimentalWithCallbackMethod_SetDmLogLevel<ExperimentalWithCallbackMethod_GetDmLogLevel<ExperimentalWithCallbackMethod_DisableHWComponent<ExperimentalWithCallbackMethod_ResetHWComponent<ExperimentalWithCallbackMethod_EnableHWComponent<Service > > > > > > > > > > > > > > > > > > > > ExperimentalCallbackService;
   template <class BaseClass>
   class WithGenericMethod_StartManagingDevice : public BaseClass {
    private:
@@ -2302,6 +2644,57 @@
     }
   };
   template <class BaseClass>
+  class WithGenericMethod_DisableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_DisableHWComponent() {
+      ::grpc::Service::MarkMethodGeneric(17);
+    }
+    ~WithGenericMethod_DisableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status DisableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::DisableHWComponentRequest* /*request*/, ::dmi::DisableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithGenericMethod_ResetHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_ResetHWComponent() {
+      ::grpc::Service::MarkMethodGeneric(18);
+    }
+    ~WithGenericMethod_ResetHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status ResetHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::ResetHWComponentRequest* /*request*/, ::dmi::ResetHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
+  class WithGenericMethod_EnableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithGenericMethod_EnableHWComponent() {
+      ::grpc::Service::MarkMethodGeneric(19);
+    }
+    ~WithGenericMethod_EnableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status EnableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::EnableHWComponentRequest* /*request*/, ::dmi::EnableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+  };
+  template <class BaseClass>
   class WithRawMethod_StartManagingDevice : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -2642,6 +3035,66 @@
     }
   };
   template <class BaseClass>
+  class WithRawMethod_DisableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_DisableHWComponent() {
+      ::grpc::Service::MarkMethodRaw(17);
+    }
+    ~WithRawMethod_DisableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status DisableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::DisableHWComponentRequest* /*request*/, ::dmi::DisableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestDisableHWComponent(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(17, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_ResetHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_ResetHWComponent() {
+      ::grpc::Service::MarkMethodRaw(18);
+    }
+    ~WithRawMethod_ResetHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status ResetHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::ResetHWComponentRequest* /*request*/, ::dmi::ResetHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestResetHWComponent(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(18, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
+  class WithRawMethod_EnableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithRawMethod_EnableHWComponent() {
+      ::grpc::Service::MarkMethodRaw(19);
+    }
+    ~WithRawMethod_EnableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status EnableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::EnableHWComponentRequest* /*request*/, ::dmi::EnableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    void RequestEnableHWComponent(::grpc::ServerContext* context, ::grpc::ByteBuffer* request, ::grpc::ServerAsyncResponseWriter< ::grpc::ByteBuffer>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) {
+      ::grpc::Service::RequestAsyncUnary(19, context, request, response, new_call_cq, notification_cq, tag);
+    }
+  };
+  template <class BaseClass>
   class ExperimentalWithRawCallbackMethod_StartManagingDevice : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -3288,6 +3741,120 @@
       { return nullptr; }
   };
   template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_DisableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_DisableHWComponent() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(17,
+          new ::grpc_impl::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->DisableHWComponent(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_DisableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status DisableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::DisableHWComponentRequest* /*request*/, ::dmi::DisableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* DisableHWComponent(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* DisableHWComponent(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_ResetHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_ResetHWComponent() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(18,
+          new ::grpc_impl::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->ResetHWComponent(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_ResetHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status ResetHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::ResetHWComponentRequest* /*request*/, ::dmi::ResetHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* ResetHWComponent(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* ResetHWComponent(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
+  class ExperimentalWithRawCallbackMethod_EnableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    ExperimentalWithRawCallbackMethod_EnableHWComponent() {
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+      ::grpc::Service::
+    #else
+      ::grpc::Service::experimental().
+    #endif
+        MarkMethodRawCallback(19,
+          new ::grpc_impl::internal::CallbackUnaryHandler< ::grpc::ByteBuffer, ::grpc::ByteBuffer>(
+            [this](
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+                   ::grpc::CallbackServerContext*
+    #else
+                   ::grpc::experimental::CallbackServerContext*
+    #endif
+                     context, const ::grpc::ByteBuffer* request, ::grpc::ByteBuffer* response) { return this->EnableHWComponent(context, request, response); }));
+    }
+    ~ExperimentalWithRawCallbackMethod_EnableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable synchronous version of this method
+    ::grpc::Status EnableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::EnableHWComponentRequest* /*request*/, ::dmi::EnableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    #ifdef GRPC_CALLBACK_API_NONEXPERIMENTAL
+    virtual ::grpc::ServerUnaryReactor* EnableHWComponent(
+      ::grpc::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #else
+    virtual ::grpc::experimental::ServerUnaryReactor* EnableHWComponent(
+      ::grpc::experimental::CallbackServerContext* /*context*/, const ::grpc::ByteBuffer* /*request*/, ::grpc::ByteBuffer* /*response*/)
+    #endif
+      { return nullptr; }
+  };
+  template <class BaseClass>
   class WithStreamedUnaryMethod_StopManagingDevice : public BaseClass {
    private:
     void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
@@ -3665,7 +4232,88 @@
     // replace default version of method with streamed unary
     virtual ::grpc::Status StreamedGetDmLogLevel(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::dmi::GetDmLogLevelRequest,::dmi::GetDmLogLevelResponse>* server_unary_streamer) = 0;
   };
-  typedef WithStreamedUnaryMethod_StopManagingDevice<WithStreamedUnaryMethod_GetManagedDevices<WithStreamedUnaryMethod_SetHWComponentInfo<WithStreamedUnaryMethod_SetLoggingEndpoint<WithStreamedUnaryMethod_GetLoggingEndpoint<WithStreamedUnaryMethod_SetMsgBusEndpoint<WithStreamedUnaryMethod_GetMsgBusEndpoint<WithStreamedUnaryMethod_GetLoggableEntities<WithStreamedUnaryMethod_SetLogLevel<WithStreamedUnaryMethod_GetLogLevel<WithStreamedUnaryMethod_HeartbeatCheck<WithStreamedUnaryMethod_RebootDevice<WithStreamedUnaryMethod_SetDmLogLevel<WithStreamedUnaryMethod_GetDmLogLevel<Service > > > > > > > > > > > > > > StreamedUnaryService;
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_DisableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_DisableHWComponent() {
+      ::grpc::Service::MarkMethodStreamed(17,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::dmi::DisableHWComponentRequest, ::dmi::DisableHWComponentResponse>(
+            [this](::grpc_impl::ServerContext* context,
+                   ::grpc_impl::ServerUnaryStreamer<
+                     ::dmi::DisableHWComponentRequest, ::dmi::DisableHWComponentResponse>* streamer) {
+                       return this->StreamedDisableHWComponent(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_DisableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status DisableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::DisableHWComponentRequest* /*request*/, ::dmi::DisableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreamedDisableHWComponent(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::dmi::DisableHWComponentRequest,::dmi::DisableHWComponentResponse>* server_unary_streamer) = 0;
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_ResetHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_ResetHWComponent() {
+      ::grpc::Service::MarkMethodStreamed(18,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::dmi::ResetHWComponentRequest, ::dmi::ResetHWComponentResponse>(
+            [this](::grpc_impl::ServerContext* context,
+                   ::grpc_impl::ServerUnaryStreamer<
+                     ::dmi::ResetHWComponentRequest, ::dmi::ResetHWComponentResponse>* streamer) {
+                       return this->StreamedResetHWComponent(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_ResetHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status ResetHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::ResetHWComponentRequest* /*request*/, ::dmi::ResetHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreamedResetHWComponent(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::dmi::ResetHWComponentRequest,::dmi::ResetHWComponentResponse>* server_unary_streamer) = 0;
+  };
+  template <class BaseClass>
+  class WithStreamedUnaryMethod_EnableHWComponent : public BaseClass {
+   private:
+    void BaseClassMustBeDerivedFromService(const Service* /*service*/) {}
+   public:
+    WithStreamedUnaryMethod_EnableHWComponent() {
+      ::grpc::Service::MarkMethodStreamed(19,
+        new ::grpc::internal::StreamedUnaryHandler<
+          ::dmi::EnableHWComponentRequest, ::dmi::EnableHWComponentResponse>(
+            [this](::grpc_impl::ServerContext* context,
+                   ::grpc_impl::ServerUnaryStreamer<
+                     ::dmi::EnableHWComponentRequest, ::dmi::EnableHWComponentResponse>* streamer) {
+                       return this->StreamedEnableHWComponent(context,
+                         streamer);
+                  }));
+    }
+    ~WithStreamedUnaryMethod_EnableHWComponent() override {
+      BaseClassMustBeDerivedFromService(this);
+    }
+    // disable regular version of this method
+    ::grpc::Status EnableHWComponent(::grpc::ServerContext* /*context*/, const ::dmi::EnableHWComponentRequest* /*request*/, ::dmi::EnableHWComponentResponse* /*response*/) override {
+      abort();
+      return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, "");
+    }
+    // replace default version of method with streamed unary
+    virtual ::grpc::Status StreamedEnableHWComponent(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::dmi::EnableHWComponentRequest,::dmi::EnableHWComponentResponse>* server_unary_streamer) = 0;
+  };
+  typedef WithStreamedUnaryMethod_StopManagingDevice<WithStreamedUnaryMethod_GetManagedDevices<WithStreamedUnaryMethod_SetHWComponentInfo<WithStreamedUnaryMethod_SetLoggingEndpoint<WithStreamedUnaryMethod_GetLoggingEndpoint<WithStreamedUnaryMethod_SetMsgBusEndpoint<WithStreamedUnaryMethod_GetMsgBusEndpoint<WithStreamedUnaryMethod_GetLoggableEntities<WithStreamedUnaryMethod_SetLogLevel<WithStreamedUnaryMethod_GetLogLevel<WithStreamedUnaryMethod_HeartbeatCheck<WithStreamedUnaryMethod_RebootDevice<WithStreamedUnaryMethod_SetDmLogLevel<WithStreamedUnaryMethod_GetDmLogLevel<WithStreamedUnaryMethod_DisableHWComponent<WithStreamedUnaryMethod_ResetHWComponent<WithStreamedUnaryMethod_EnableHWComponent<Service > > > > > > > > > > > > > > > > > StreamedUnaryService;
   template <class BaseClass>
   class WithSplitStreamingMethod_StartManagingDevice : public BaseClass {
    private:
@@ -3748,7 +4396,7 @@
     virtual ::grpc::Status StreamedGetHWComponentInfo(::grpc::ServerContext* context, ::grpc::ServerSplitStreamer< ::dmi::HWComponentInfoGetRequest,::dmi::HWComponentInfoGetResponse>* server_split_streamer) = 0;
   };
   typedef WithSplitStreamingMethod_StartManagingDevice<WithSplitStreamingMethod_GetPhysicalInventory<WithSplitStreamingMethod_GetHWComponentInfo<Service > > > SplitStreamedService;
-  typedef WithSplitStreamingMethod_StartManagingDevice<WithStreamedUnaryMethod_StopManagingDevice<WithStreamedUnaryMethod_GetManagedDevices<WithSplitStreamingMethod_GetPhysicalInventory<WithSplitStreamingMethod_GetHWComponentInfo<WithStreamedUnaryMethod_SetHWComponentInfo<WithStreamedUnaryMethod_SetLoggingEndpoint<WithStreamedUnaryMethod_GetLoggingEndpoint<WithStreamedUnaryMethod_SetMsgBusEndpoint<WithStreamedUnaryMethod_GetMsgBusEndpoint<WithStreamedUnaryMethod_GetLoggableEntities<WithStreamedUnaryMethod_SetLogLevel<WithStreamedUnaryMethod_GetLogLevel<WithStreamedUnaryMethod_HeartbeatCheck<WithStreamedUnaryMethod_RebootDevice<WithStreamedUnaryMethod_SetDmLogLevel<WithStreamedUnaryMethod_GetDmLogLevel<Service > > > > > > > > > > > > > > > > > StreamedService;
+  typedef WithSplitStreamingMethod_StartManagingDevice<WithStreamedUnaryMethod_StopManagingDevice<WithStreamedUnaryMethod_GetManagedDevices<WithSplitStreamingMethod_GetPhysicalInventory<WithSplitStreamingMethod_GetHWComponentInfo<WithStreamedUnaryMethod_SetHWComponentInfo<WithStreamedUnaryMethod_SetLoggingEndpoint<WithStreamedUnaryMethod_GetLoggingEndpoint<WithStreamedUnaryMethod_SetMsgBusEndpoint<WithStreamedUnaryMethod_GetMsgBusEndpoint<WithStreamedUnaryMethod_GetLoggableEntities<WithStreamedUnaryMethod_SetLogLevel<WithStreamedUnaryMethod_GetLogLevel<WithStreamedUnaryMethod_HeartbeatCheck<WithStreamedUnaryMethod_RebootDevice<WithStreamedUnaryMethod_SetDmLogLevel<WithStreamedUnaryMethod_GetDmLogLevel<WithStreamedUnaryMethod_DisableHWComponent<WithStreamedUnaryMethod_ResetHWComponent<WithStreamedUnaryMethod_EnableHWComponent<Service > > > > > > > > > > > > > > > > > > > > StreamedService;
 };
 
 }  // namespace dmi
diff --git a/cpp/dmi/hw_management_service.pb.cc b/cpp/dmi/hw_management_service.pb.cc
index 850ac0e..cdad77a 100644
--- a/cpp/dmi/hw_management_service.pb.cc
+++ b/cpp/dmi/hw_management_service.pb.cc
@@ -139,6 +139,30 @@
  public:
   ::google::protobuf::internal::ExplicitlyConstructed<RebootDeviceResponse> _instance;
 } _RebootDeviceResponse_default_instance_;
+class DisableHWComponentRequestDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<DisableHWComponentRequest> _instance;
+} _DisableHWComponentRequest_default_instance_;
+class DisableHWComponentResponseDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<DisableHWComponentResponse> _instance;
+} _DisableHWComponentResponse_default_instance_;
+class ResetHWComponentRequestDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<ResetHWComponentRequest> _instance;
+} _ResetHWComponentRequest_default_instance_;
+class ResetHWComponentResponseDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<ResetHWComponentResponse> _instance;
+} _ResetHWComponentResponse_default_instance_;
+class EnableHWComponentRequestDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<EnableHWComponentRequest> _instance;
+} _EnableHWComponentRequest_default_instance_;
+class EnableHWComponentResponseDefaultTypeInternal {
+ public:
+  ::google::protobuf::internal::ExplicitlyConstructed<EnableHWComponentResponse> _instance;
+} _EnableHWComponentResponse_default_instance_;
 }  // namespace dmi
 static void InitDefaultsPhysicalInventoryRequest_dmi_2fhw_5fmanagement_5fservice_2eproto() {
   GOOGLE_PROTOBUF_VERIFY_VERSION;
@@ -565,6 +589,93 @@
 ::google::protobuf::internal::SCCInfo<0> scc_info_RebootDeviceResponse_dmi_2fhw_5fmanagement_5fservice_2eproto =
     {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsRebootDeviceResponse_dmi_2fhw_5fmanagement_5fservice_2eproto}, {}};
 
+static void InitDefaultsDisableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_DisableHWComponentRequest_default_instance_;
+    new (ptr) ::dmi::DisableHWComponentRequest();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::DisableHWComponentRequest::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<1> scc_info_DisableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsDisableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto}, {
+      &scc_info_Uuid_dmi_2fhw_2eproto.base,}};
+
+static void InitDefaultsDisableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_DisableHWComponentResponse_default_instance_;
+    new (ptr) ::dmi::DisableHWComponentResponse();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::DisableHWComponentResponse::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_DisableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsDisableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto}, {}};
+
+static void InitDefaultsResetHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_ResetHWComponentRequest_default_instance_;
+    new (ptr) ::dmi::ResetHWComponentRequest();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::ResetHWComponentRequest::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<1> scc_info_ResetHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsResetHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto}, {
+      &scc_info_Uuid_dmi_2fhw_2eproto.base,}};
+
+static void InitDefaultsResetHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_ResetHWComponentResponse_default_instance_;
+    new (ptr) ::dmi::ResetHWComponentResponse();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::ResetHWComponentResponse::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_ResetHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsResetHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto}, {}};
+
+static void InitDefaultsEnableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_EnableHWComponentRequest_default_instance_;
+    new (ptr) ::dmi::EnableHWComponentRequest();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::EnableHWComponentRequest::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<1> scc_info_EnableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 1, InitDefaultsEnableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto}, {
+      &scc_info_Uuid_dmi_2fhw_2eproto.base,}};
+
+static void InitDefaultsEnableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto() {
+  GOOGLE_PROTOBUF_VERIFY_VERSION;
+
+  {
+    void* ptr = &::dmi::_EnableHWComponentResponse_default_instance_;
+    new (ptr) ::dmi::EnableHWComponentResponse();
+    ::google::protobuf::internal::OnShutdownDestroyMessage(ptr);
+  }
+  ::dmi::EnableHWComponentResponse::InitAsDefaultInstance();
+}
+
+::google::protobuf::internal::SCCInfo<0> scc_info_EnableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto =
+    {{ATOMIC_VAR_INIT(::google::protobuf::internal::SCCInfoBase::kUninitialized), 0, InitDefaultsEnableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto}, {}};
+
 void InitDefaults_dmi_2fhw_5fmanagement_5fservice_2eproto() {
   ::google::protobuf::internal::InitSCC(&scc_info_PhysicalInventoryRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_PhysicalInventoryResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
@@ -595,10 +706,16 @@
   ::google::protobuf::internal::InitSCC(&scc_info_Heartbeat_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_RebootDeviceRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
   ::google::protobuf::internal::InitSCC(&scc_info_RebootDeviceResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_DisableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_DisableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_ResetHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_ResetHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_EnableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  ::google::protobuf::internal::InitSCC(&scc_info_EnableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
 }
 
-::google::protobuf::Metadata file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[29];
-const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto[14];
+::google::protobuf::Metadata file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[35];
+const ::google::protobuf::EnumDescriptor* file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto[17];
 constexpr ::google::protobuf::ServiceDescriptor const** file_level_service_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto = nullptr;
 
 const ::google::protobuf::uint32 TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto::offsets[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
@@ -824,6 +941,54 @@
   PROTOBUF_FIELD_OFFSET(::dmi::RebootDeviceResponse, status_),
   PROTOBUF_FIELD_OFFSET(::dmi::RebootDeviceResponse, reason_),
   PROTOBUF_FIELD_OFFSET(::dmi::RebootDeviceResponse, reason_detail_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::DisableHWComponentRequest, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::DisableHWComponentRequest, device_uuid_),
+  PROTOBUF_FIELD_OFFSET(::dmi::DisableHWComponentRequest, component_uuid_),
+  PROTOBUF_FIELD_OFFSET(::dmi::DisableHWComponentRequest, component_name_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::DisableHWComponentResponse, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::DisableHWComponentResponse, status_),
+  PROTOBUF_FIELD_OFFSET(::dmi::DisableHWComponentResponse, reason_),
+  PROTOBUF_FIELD_OFFSET(::dmi::DisableHWComponentResponse, reason_detail_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::ResetHWComponentRequest, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::ResetHWComponentRequest, device_uuid_),
+  PROTOBUF_FIELD_OFFSET(::dmi::ResetHWComponentRequest, component_uuid_),
+  PROTOBUF_FIELD_OFFSET(::dmi::ResetHWComponentRequest, component_name_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::ResetHWComponentResponse, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::ResetHWComponentResponse, status_),
+  PROTOBUF_FIELD_OFFSET(::dmi::ResetHWComponentResponse, reason_),
+  PROTOBUF_FIELD_OFFSET(::dmi::ResetHWComponentResponse, reason_detail_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::EnableHWComponentRequest, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::EnableHWComponentRequest, device_uuid_),
+  PROTOBUF_FIELD_OFFSET(::dmi::EnableHWComponentRequest, component_uuid_),
+  PROTOBUF_FIELD_OFFSET(::dmi::EnableHWComponentRequest, component_name_),
+  ~0u,  // no _has_bits_
+  PROTOBUF_FIELD_OFFSET(::dmi::EnableHWComponentResponse, _internal_metadata_),
+  ~0u,  // no _extensions_
+  ~0u,  // no _oneof_case_
+  ~0u,  // no _weak_field_map_
+  PROTOBUF_FIELD_OFFSET(::dmi::EnableHWComponentResponse, status_),
+  PROTOBUF_FIELD_OFFSET(::dmi::EnableHWComponentResponse, reason_),
+  PROTOBUF_FIELD_OFFSET(::dmi::EnableHWComponentResponse, reason_detail_),
 };
 static const ::google::protobuf::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = {
   { 0, -1, sizeof(::dmi::PhysicalInventoryRequest)},
@@ -855,6 +1020,12 @@
   { 202, -1, sizeof(::dmi::Heartbeat)},
   { 208, -1, sizeof(::dmi::RebootDeviceRequest)},
   { 214, -1, sizeof(::dmi::RebootDeviceResponse)},
+  { 222, -1, sizeof(::dmi::DisableHWComponentRequest)},
+  { 230, -1, sizeof(::dmi::DisableHWComponentResponse)},
+  { 238, -1, sizeof(::dmi::ResetHWComponentRequest)},
+  { 246, -1, sizeof(::dmi::ResetHWComponentResponse)},
+  { 254, -1, sizeof(::dmi::EnableHWComponentRequest)},
+  { 262, -1, sizeof(::dmi::EnableHWComponentResponse)},
 };
 
 static ::google::protobuf::Message const * const file_default_instances[] = {
@@ -887,12 +1058,18 @@
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_Heartbeat_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_RebootDeviceRequest_default_instance_),
   reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_RebootDeviceResponse_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_DisableHWComponentRequest_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_DisableHWComponentResponse_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_ResetHWComponentRequest_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_ResetHWComponentResponse_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_EnableHWComponentRequest_default_instance_),
+  reinterpret_cast<const ::google::protobuf::Message*>(&::dmi::_EnableHWComponentResponse_default_instance_),
 };
 
 ::google::protobuf::internal::AssignDescriptorsTable assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto = {
   {}, AddDescriptors_dmi_2fhw_5fmanagement_5fservice_2eproto, "dmi/hw_management_service.proto", schemas,
   file_default_instances, TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto::offsets,
-  file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto, 29, file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto, file_level_service_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto,
+  file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto, 35, file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto, file_level_service_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto,
 };
 
 const char descriptor_table_protodef_dmi_2fhw_5fmanagement_5fservice_2eproto[] =
@@ -1020,47 +1197,85 @@
   "ail\030\005 \001(\t\"y\n\006Reason\022\024\n\020UNDEFINED_REASON\020"
   "\000\022\022\n\016UNKNOWN_DEVICE\020\001\022\022\n\016INTERNAL_ERROR\020"
   "\002\022\026\n\022DEVICE_UNREACHABLE\020\003\022\031\n\025DEVICE_IN_W"
-  "RONG_STATE\020\0042\276\n\n\031NativeHWManagementServi"
-  "ce\022S\n\023StartManagingDevice\022\030.dmi.Modifiab"
-  "leComponent\032 .dmi.StartManagingDeviceRes"
-  "ponse0\001\022U\n\022StopManagingDevice\022\036.dmi.Stop"
-  "ManagingDeviceRequest\032\037.dmi.StopManaging"
-  "DeviceResponse\022H\n\021GetManagedDevices\022\026.go"
-  "ogle.protobuf.Empty\032\033.dmi.ManagedDevices"
-  "Response\022W\n\024GetPhysicalInventory\022\035.dmi.P"
-  "hysicalInventoryRequest\032\036.dmi.PhysicalIn"
-  "ventoryResponse0\001\022W\n\022GetHWComponentInfo\022"
-  "\036.dmi.HWComponentInfoGetRequest\032\037.dmi.HW"
-  "ComponentInfoGetResponse0\001\022U\n\022SetHWCompo"
-  "nentInfo\022\036.dmi.HWComponentInfoSetRequest"
-  "\032\037.dmi.HWComponentInfoSetResponse\022T\n\022Set"
-  "LoggingEndpoint\022\036.dmi.SetLoggingEndpoint"
-  "Request\032\036.dmi.SetRemoteEndpointResponse\022"
-  "F\n\022GetLoggingEndpoint\022\017.dmi.HardwareID\032\037"
-  ".dmi.GetLoggingEndpointResponse\022R\n\021SetMs"
-  "gBusEndpoint\022\035.dmi.SetMsgBusEndpointRequ"
-  "est\032\036.dmi.SetRemoteEndpointResponse\022K\n\021G"
-  "etMsgBusEndpoint\022\026.google.protobuf.Empty"
-  "\032\036.dmi.GetMsgBusEndpointResponse\022P\n\023GetL"
-  "oggableEntities\022\037.dmi.GetLoggableEntitie"
-  "sRequest\032\030.dmi.GetLogLevelResponse\022@\n\013Se"
-  "tLogLevel\022\027.dmi.SetLogLevelRequest\032\030.dmi"
-  ".SetLogLevelResponse\022@\n\013GetLogLevel\022\027.dm"
-  "i.GetLogLevelRequest\032\030.dmi.GetLogLevelRe"
-  "sponse\0228\n\016HeartbeatCheck\022\026.google.protob"
-  "uf.Empty\032\016.dmi.Heartbeat\022C\n\014RebootDevice"
-  "\022\030.dmi.RebootDeviceRequest\032\031.dmi.RebootD"
-  "eviceResponse\022F\n\rSetDmLogLevel\022\031.dmi.Set"
-  "DmLogLevelRequest\032\032.dmi.SetDmLogLevelRes"
-  "ponse\022F\n\rGetDmLogLevel\022\031.dmi.GetDmLogLev"
-  "elRequest\032\032.dmi.GetDmLogLevelResponseB;Z"
-  "9github.com/opencord/device-management-i"
-  "nterface/v3/go/dmib\006proto3"
+  "RONG_STATE\020\004\"v\n\031DisableHWComponentReques"
+  "t\022\036\n\013device_uuid\030\001 \001(\0132\t.dmi.Uuid\022!\n\016com"
+  "ponent_uuid\030\002 \001(\0132\t.dmi.Uuid\022\026\n\016componen"
+  "t_name\030\003 \001(\t\"\255\002\n\032DisableHWComponentRespo"
+  "nse\022\033\n\006status\030\001 \001(\0162\013.dmi.Status\0226\n\006reas"
+  "on\030\002 \001(\0162&.dmi.DisableHWComponentRespons"
+  "e.Reason\022\025\n\rreason_detail\030\003 \001(\t\"\242\001\n\006Reas"
+  "on\022\024\n\020UNDEFINED_REASON\020\000\022\022\n\016UNKNOWN_DEVI"
+  "CE\020\001\022\025\n\021UNKNOWN_COMPONENT\020\002\022\022\n\016INTERNAL_"
+  "ERROR\020\003\022\026\n\022DEVICE_UNREACHABLE\020\004\022\027\n\023DISAB"
+  "LE_UNSUPPORTED\020\005\022\022\n\016INVALID_PARAMS\020\006\"t\n\027"
+  "ResetHWComponentRequest\022\036\n\013device_uuid\030\001"
+  " \001(\0132\t.dmi.Uuid\022!\n\016component_uuid\030\002 \001(\0132"
+  "\t.dmi.Uuid\022\026\n\016component_name\030\003 \001(\t\"\247\002\n\030R"
+  "esetHWComponentResponse\022\033\n\006status\030\001 \001(\0162"
+  "\013.dmi.Status\0224\n\006reason\030\002 \001(\0162$.dmi.Reset"
+  "HWComponentResponse.Reason\022\025\n\rreason_det"
+  "ail\030\003 \001(\t\"\240\001\n\006Reason\022\024\n\020UNDEFINED_REASON"
+  "\020\000\022\022\n\016UNKNOWN_DEVICE\020\001\022\025\n\021UNKNOWN_COMPON"
+  "ENT\020\002\022\022\n\016INTERNAL_ERROR\020\003\022\026\n\022DEVICE_UNRE"
+  "ACHABLE\020\004\022\025\n\021RESET_UNSUPPORTED\020\005\022\022\n\016INVA"
+  "LID_PARAMS\020\006\"u\n\030EnableHWComponentRequest"
+  "\022\036\n\013device_uuid\030\001 \001(\0132\t.dmi.Uuid\022!\n\016comp"
+  "onent_uuid\030\002 \001(\0132\t.dmi.Uuid\022\026\n\016component"
+  "_name\030\003 \001(\t\"\252\002\n\031EnableHWComponentRespons"
+  "e\022\033\n\006status\030\001 \001(\0162\013.dmi.Status\0225\n\006reason"
+  "\030\002 \001(\0162%.dmi.EnableHWComponentResponse.R"
+  "eason\022\025\n\rreason_detail\030\003 \001(\t\"\241\001\n\006Reason\022"
+  "\024\n\020UNDEFINED_REASON\020\000\022\022\n\016UNKNOWN_DEVICE\020"
+  "\001\022\025\n\021UNKNOWN_COMPONENT\020\002\022\022\n\016INTERNAL_ERR"
+  "OR\020\003\022\026\n\022DEVICE_UNREACHABLE\020\004\022\026\n\022ENABLE_U"
+  "NSUPPORTED\020\005\022\022\n\016INVALID_PARAMS\020\0062\272\014\n\031Nat"
+  "iveHWManagementService\022S\n\023StartManagingD"
+  "evice\022\030.dmi.ModifiableComponent\032 .dmi.St"
+  "artManagingDeviceResponse0\001\022U\n\022StopManag"
+  "ingDevice\022\036.dmi.StopManagingDeviceReques"
+  "t\032\037.dmi.StopManagingDeviceResponse\022H\n\021Ge"
+  "tManagedDevices\022\026.google.protobuf.Empty\032"
+  "\033.dmi.ManagedDevicesResponse\022W\n\024GetPhysi"
+  "calInventory\022\035.dmi.PhysicalInventoryRequ"
+  "est\032\036.dmi.PhysicalInventoryResponse0\001\022W\n"
+  "\022GetHWComponentInfo\022\036.dmi.HWComponentInf"
+  "oGetRequest\032\037.dmi.HWComponentInfoGetResp"
+  "onse0\001\022U\n\022SetHWComponentInfo\022\036.dmi.HWCom"
+  "ponentInfoSetRequest\032\037.dmi.HWComponentIn"
+  "foSetResponse\022T\n\022SetLoggingEndpoint\022\036.dm"
+  "i.SetLoggingEndpointRequest\032\036.dmi.SetRem"
+  "oteEndpointResponse\022F\n\022GetLoggingEndpoin"
+  "t\022\017.dmi.HardwareID\032\037.dmi.GetLoggingEndpo"
+  "intResponse\022R\n\021SetMsgBusEndpoint\022\035.dmi.S"
+  "etMsgBusEndpointRequest\032\036.dmi.SetRemoteE"
+  "ndpointResponse\022K\n\021GetMsgBusEndpoint\022\026.g"
+  "oogle.protobuf.Empty\032\036.dmi.GetMsgBusEndp"
+  "ointResponse\022P\n\023GetLoggableEntities\022\037.dm"
+  "i.GetLoggableEntitiesRequest\032\030.dmi.GetLo"
+  "gLevelResponse\022@\n\013SetLogLevel\022\027.dmi.SetL"
+  "ogLevelRequest\032\030.dmi.SetLogLevelResponse"
+  "\022@\n\013GetLogLevel\022\027.dmi.GetLogLevelRequest"
+  "\032\030.dmi.GetLogLevelResponse\0228\n\016HeartbeatC"
+  "heck\022\026.google.protobuf.Empty\032\016.dmi.Heart"
+  "beat\022C\n\014RebootDevice\022\030.dmi.RebootDeviceR"
+  "equest\032\031.dmi.RebootDeviceResponse\022F\n\rSet"
+  "DmLogLevel\022\031.dmi.SetDmLogLevelRequest\032\032."
+  "dmi.SetDmLogLevelResponse\022F\n\rGetDmLogLev"
+  "el\022\031.dmi.GetDmLogLevelRequest\032\032.dmi.GetD"
+  "mLogLevelResponse\022U\n\022DisableHWComponent\022"
+  "\036.dmi.DisableHWComponentRequest\032\037.dmi.Di"
+  "sableHWComponentResponse\022O\n\020ResetHWCompo"
+  "nent\022\034.dmi.ResetHWComponentRequest\032\035.dmi"
+  ".ResetHWComponentResponse\022R\n\021EnableHWCom"
+  "ponent\022\035.dmi.EnableHWComponentRequest\032\036."
+  "dmi.EnableHWComponentResponseB;Z9github."
+  "com/opencord/device-management-interface"
+  "/v3/go/dmib\006proto3"
   ;
 ::google::protobuf::internal::DescriptorTable descriptor_table_dmi_2fhw_5fmanagement_5fservice_2eproto = {
   false, InitDefaults_dmi_2fhw_5fmanagement_5fservice_2eproto, 
   descriptor_table_protodef_dmi_2fhw_5fmanagement_5fservice_2eproto,
-  "dmi/hw_management_service.proto", &assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto, 6386,
+  "dmi/hw_management_service.proto", &assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto, 7898,
 };
 
 void AddDescriptors_dmi_2fhw_5fmanagement_5fservice_2eproto() {
@@ -1438,6 +1653,99 @@
 const RebootDeviceResponse_Reason RebootDeviceResponse::Reason_MAX;
 const int RebootDeviceResponse::Reason_ARRAYSIZE;
 #endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+const ::google::protobuf::EnumDescriptor* DisableHWComponentResponse_Reason_descriptor() {
+  ::google::protobuf::internal::AssignDescriptors(&assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto[14];
+}
+bool DisableHWComponentResponse_Reason_IsValid(int value) {
+  switch (value) {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::UNDEFINED_REASON;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::UNKNOWN_DEVICE;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::UNKNOWN_COMPONENT;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::INTERNAL_ERROR;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::DEVICE_UNREACHABLE;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::DISABLE_UNSUPPORTED;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::INVALID_PARAMS;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::Reason_MIN;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse::Reason_MAX;
+const int DisableHWComponentResponse::Reason_ARRAYSIZE;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+const ::google::protobuf::EnumDescriptor* ResetHWComponentResponse_Reason_descriptor() {
+  ::google::protobuf::internal::AssignDescriptors(&assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto[15];
+}
+bool ResetHWComponentResponse_Reason_IsValid(int value) {
+  switch (value) {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::UNDEFINED_REASON;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::UNKNOWN_DEVICE;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::UNKNOWN_COMPONENT;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::INTERNAL_ERROR;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::DEVICE_UNREACHABLE;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::RESET_UNSUPPORTED;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::INVALID_PARAMS;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::Reason_MIN;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse::Reason_MAX;
+const int ResetHWComponentResponse::Reason_ARRAYSIZE;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+const ::google::protobuf::EnumDescriptor* EnableHWComponentResponse_Reason_descriptor() {
+  ::google::protobuf::internal::AssignDescriptors(&assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return file_level_enum_descriptors_dmi_2fhw_5fmanagement_5fservice_2eproto[16];
+}
+bool EnableHWComponentResponse_Reason_IsValid(int value) {
+  switch (value) {
+    case 0:
+    case 1:
+    case 2:
+    case 3:
+    case 4:
+    case 5:
+    case 6:
+      return true;
+    default:
+      return false;
+  }
+}
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::UNDEFINED_REASON;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::UNKNOWN_DEVICE;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::UNKNOWN_COMPONENT;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::INTERNAL_ERROR;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::DEVICE_UNREACHABLE;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::ENABLE_UNSUPPORTED;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::INVALID_PARAMS;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::Reason_MIN;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse::Reason_MAX;
+const int EnableHWComponentResponse::Reason_ARRAYSIZE;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
 
 // ===================================================================
 
@@ -12681,6 +12989,2526 @@
 }
 
 
+// ===================================================================
+
+void DisableHWComponentRequest::InitAsDefaultInstance() {
+  ::dmi::_DisableHWComponentRequest_default_instance_._instance.get_mutable()->device_uuid_ = const_cast< ::dmi::Uuid*>(
+      ::dmi::Uuid::internal_default_instance());
+  ::dmi::_DisableHWComponentRequest_default_instance_._instance.get_mutable()->component_uuid_ = const_cast< ::dmi::Uuid*>(
+      ::dmi::Uuid::internal_default_instance());
+}
+class DisableHWComponentRequest::HasBitSetters {
+ public:
+  static const ::dmi::Uuid& device_uuid(const DisableHWComponentRequest* msg);
+  static const ::dmi::Uuid& component_uuid(const DisableHWComponentRequest* msg);
+};
+
+const ::dmi::Uuid&
+DisableHWComponentRequest::HasBitSetters::device_uuid(const DisableHWComponentRequest* msg) {
+  return *msg->device_uuid_;
+}
+const ::dmi::Uuid&
+DisableHWComponentRequest::HasBitSetters::component_uuid(const DisableHWComponentRequest* msg) {
+  return *msg->component_uuid_;
+}
+void DisableHWComponentRequest::clear_device_uuid() {
+  if (GetArenaNoVirtual() == nullptr && device_uuid_ != nullptr) {
+    delete device_uuid_;
+  }
+  device_uuid_ = nullptr;
+}
+void DisableHWComponentRequest::clear_component_uuid() {
+  if (GetArenaNoVirtual() == nullptr && component_uuid_ != nullptr) {
+    delete component_uuid_;
+  }
+  component_uuid_ = nullptr;
+}
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int DisableHWComponentRequest::kDeviceUuidFieldNumber;
+const int DisableHWComponentRequest::kComponentUuidFieldNumber;
+const int DisableHWComponentRequest::kComponentNameFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+DisableHWComponentRequest::DisableHWComponentRequest()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.DisableHWComponentRequest)
+}
+DisableHWComponentRequest::DisableHWComponentRequest(const DisableHWComponentRequest& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  component_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (from.component_name().size() > 0) {
+    component_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.component_name_);
+  }
+  if (from.has_device_uuid()) {
+    device_uuid_ = new ::dmi::Uuid(*from.device_uuid_);
+  } else {
+    device_uuid_ = nullptr;
+  }
+  if (from.has_component_uuid()) {
+    component_uuid_ = new ::dmi::Uuid(*from.component_uuid_);
+  } else {
+    component_uuid_ = nullptr;
+  }
+  // @@protoc_insertion_point(copy_constructor:dmi.DisableHWComponentRequest)
+}
+
+void DisableHWComponentRequest::SharedCtor() {
+  ::google::protobuf::internal::InitSCC(
+      &scc_info_DisableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  component_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&device_uuid_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&component_uuid_) -
+      reinterpret_cast<char*>(&device_uuid_)) + sizeof(component_uuid_));
+}
+
+DisableHWComponentRequest::~DisableHWComponentRequest() {
+  // @@protoc_insertion_point(destructor:dmi.DisableHWComponentRequest)
+  SharedDtor();
+}
+
+void DisableHWComponentRequest::SharedDtor() {
+  component_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != internal_default_instance()) delete device_uuid_;
+  if (this != internal_default_instance()) delete component_uuid_;
+}
+
+void DisableHWComponentRequest::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const DisableHWComponentRequest& DisableHWComponentRequest::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_DisableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void DisableHWComponentRequest::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.DisableHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  component_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() == nullptr && device_uuid_ != nullptr) {
+    delete device_uuid_;
+  }
+  device_uuid_ = nullptr;
+  if (GetArenaNoVirtual() == nullptr && component_uuid_ != nullptr) {
+    delete component_uuid_;
+  }
+  component_uuid_ = nullptr;
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* DisableHWComponentRequest::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<DisableHWComponentRequest*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.Uuid device_uuid = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 10) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::Uuid::_InternalParse;
+        object = msg->mutable_device_uuid();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // .dmi.Uuid component_uuid = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 18) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::Uuid::_InternalParse;
+        object = msg->mutable_component_uuid();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // string component_name = 3;
+      case 3: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 26) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        ctx->extra_parse_data().SetFieldName("dmi.DisableHWComponentRequest.component_name");
+        object = msg->mutable_component_name();
+        if (size > end - ptr + ::google::protobuf::internal::ParseContext::kSlopBytes) {
+          parser_till_end = ::google::protobuf::internal::GreedyStringParserUTF8;
+          goto string_till_end;
+        }
+        GOOGLE_PROTOBUF_PARSER_ASSERT(::google::protobuf::internal::StringCheckUTF8(ptr, size, ctx));
+        ::google::protobuf::internal::InlineGreedyStringParser(object, ptr, size, ctx);
+        ptr += size;
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+string_till_end:
+  static_cast<::std::string*>(object)->clear();
+  static_cast<::std::string*>(object)->reserve(size);
+  goto len_delim_till_end;
+len_delim_till_end:
+  return ctx->StoreAndTailCall(ptr, end, {_InternalParse, msg},
+                               {parser_till_end, object}, size);
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool DisableHWComponentRequest::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.DisableHWComponentRequest)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.Uuid device_uuid = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (10 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_device_uuid()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.Uuid component_uuid = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (18 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_component_uuid()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // string component_name = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (26 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_component_name()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->component_name().data(), static_cast<int>(this->component_name().length()),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "dmi.DisableHWComponentRequest.component_name"));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.DisableHWComponentRequest)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.DisableHWComponentRequest)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void DisableHWComponentRequest::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.DisableHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      1, HasBitSetters::device_uuid(this), output);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      2, HasBitSetters::component_uuid(this), output);
+  }
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->component_name().data(), static_cast<int>(this->component_name().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.DisableHWComponentRequest.component_name");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      3, this->component_name(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.DisableHWComponentRequest)
+}
+
+::google::protobuf::uint8* DisableHWComponentRequest::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.DisableHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        1, HasBitSetters::device_uuid(this), target);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        2, HasBitSetters::component_uuid(this), target);
+  }
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->component_name().data(), static_cast<int>(this->component_name().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.DisableHWComponentRequest.component_name");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->component_name(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.DisableHWComponentRequest)
+  return target;
+}
+
+size_t DisableHWComponentRequest::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.DisableHWComponentRequest)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->component_name());
+  }
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSize(
+        *device_uuid_);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSize(
+        *component_uuid_);
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void DisableHWComponentRequest::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.DisableHWComponentRequest)
+  GOOGLE_DCHECK_NE(&from, this);
+  const DisableHWComponentRequest* source =
+      ::google::protobuf::DynamicCastToGenerated<DisableHWComponentRequest>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.DisableHWComponentRequest)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.DisableHWComponentRequest)
+    MergeFrom(*source);
+  }
+}
+
+void DisableHWComponentRequest::MergeFrom(const DisableHWComponentRequest& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.DisableHWComponentRequest)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.component_name().size() > 0) {
+
+    component_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.component_name_);
+  }
+  if (from.has_device_uuid()) {
+    mutable_device_uuid()->::dmi::Uuid::MergeFrom(from.device_uuid());
+  }
+  if (from.has_component_uuid()) {
+    mutable_component_uuid()->::dmi::Uuid::MergeFrom(from.component_uuid());
+  }
+}
+
+void DisableHWComponentRequest::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.DisableHWComponentRequest)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void DisableHWComponentRequest::CopyFrom(const DisableHWComponentRequest& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.DisableHWComponentRequest)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool DisableHWComponentRequest::IsInitialized() const {
+  return true;
+}
+
+void DisableHWComponentRequest::Swap(DisableHWComponentRequest* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void DisableHWComponentRequest::InternalSwap(DisableHWComponentRequest* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  component_name_.Swap(&other->component_name_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
+  swap(device_uuid_, other->device_uuid_);
+  swap(component_uuid_, other->component_uuid_);
+}
+
+::google::protobuf::Metadata DisableHWComponentRequest::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void DisableHWComponentResponse::InitAsDefaultInstance() {
+}
+class DisableHWComponentResponse::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int DisableHWComponentResponse::kStatusFieldNumber;
+const int DisableHWComponentResponse::kReasonFieldNumber;
+const int DisableHWComponentResponse::kReasonDetailFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+DisableHWComponentResponse::DisableHWComponentResponse()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.DisableHWComponentResponse)
+}
+DisableHWComponentResponse::DisableHWComponentResponse(const DisableHWComponentResponse& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  reason_detail_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (from.reason_detail().size() > 0) {
+    reason_detail_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.reason_detail_);
+  }
+  ::memcpy(&status_, &from.status_,
+    static_cast<size_t>(reinterpret_cast<char*>(&reason_) -
+    reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+  // @@protoc_insertion_point(copy_constructor:dmi.DisableHWComponentResponse)
+}
+
+void DisableHWComponentResponse::SharedCtor() {
+  ::google::protobuf::internal::InitSCC(
+      &scc_info_DisableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  reason_detail_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&status_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&reason_) -
+      reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+}
+
+DisableHWComponentResponse::~DisableHWComponentResponse() {
+  // @@protoc_insertion_point(destructor:dmi.DisableHWComponentResponse)
+  SharedDtor();
+}
+
+void DisableHWComponentResponse::SharedDtor() {
+  reason_detail_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+
+void DisableHWComponentResponse::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const DisableHWComponentResponse& DisableHWComponentResponse::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_DisableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void DisableHWComponentResponse::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.DisableHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  reason_detail_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&status_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&reason_) -
+      reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* DisableHWComponentResponse::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<DisableHWComponentResponse*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.Status status = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 8) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_status(static_cast<::dmi::Status>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // .dmi.DisableHWComponentResponse.Reason reason = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 16) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_reason(static_cast<::dmi::DisableHWComponentResponse_Reason>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // string reason_detail = 3;
+      case 3: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 26) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        ctx->extra_parse_data().SetFieldName("dmi.DisableHWComponentResponse.reason_detail");
+        object = msg->mutable_reason_detail();
+        if (size > end - ptr + ::google::protobuf::internal::ParseContext::kSlopBytes) {
+          parser_till_end = ::google::protobuf::internal::GreedyStringParserUTF8;
+          goto string_till_end;
+        }
+        GOOGLE_PROTOBUF_PARSER_ASSERT(::google::protobuf::internal::StringCheckUTF8(ptr, size, ctx));
+        ::google::protobuf::internal::InlineGreedyStringParser(object, ptr, size, ctx);
+        ptr += size;
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+string_till_end:
+  static_cast<::std::string*>(object)->clear();
+  static_cast<::std::string*>(object)->reserve(size);
+  goto len_delim_till_end;
+len_delim_till_end:
+  return ctx->StoreAndTailCall(ptr, end, {_InternalParse, msg},
+                               {parser_till_end, object}, size);
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool DisableHWComponentResponse::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.DisableHWComponentResponse)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.Status status = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (8 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_status(static_cast< ::dmi::Status >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.DisableHWComponentResponse.Reason reason = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (16 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_reason(static_cast< ::dmi::DisableHWComponentResponse_Reason >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // string reason_detail = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (26 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_reason_detail()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "dmi.DisableHWComponentResponse.reason_detail"));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.DisableHWComponentResponse)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.DisableHWComponentResponse)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void DisableHWComponentResponse::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.DisableHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      1, this->status(), output);
+  }
+
+  // .dmi.DisableHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->reason(), output);
+  }
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.DisableHWComponentResponse.reason_detail");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      3, this->reason_detail(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.DisableHWComponentResponse)
+}
+
+::google::protobuf::uint8* DisableHWComponentResponse::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.DisableHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      1, this->status(), target);
+  }
+
+  // .dmi.DisableHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      2, this->reason(), target);
+  }
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.DisableHWComponentResponse.reason_detail");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->reason_detail(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.DisableHWComponentResponse)
+  return target;
+}
+
+size_t DisableHWComponentResponse::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.DisableHWComponentResponse)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->reason_detail());
+  }
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->status());
+  }
+
+  // .dmi.DisableHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->reason());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void DisableHWComponentResponse::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.DisableHWComponentResponse)
+  GOOGLE_DCHECK_NE(&from, this);
+  const DisableHWComponentResponse* source =
+      ::google::protobuf::DynamicCastToGenerated<DisableHWComponentResponse>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.DisableHWComponentResponse)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.DisableHWComponentResponse)
+    MergeFrom(*source);
+  }
+}
+
+void DisableHWComponentResponse::MergeFrom(const DisableHWComponentResponse& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.DisableHWComponentResponse)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.reason_detail().size() > 0) {
+
+    reason_detail_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.reason_detail_);
+  }
+  if (from.status() != 0) {
+    set_status(from.status());
+  }
+  if (from.reason() != 0) {
+    set_reason(from.reason());
+  }
+}
+
+void DisableHWComponentResponse::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.DisableHWComponentResponse)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void DisableHWComponentResponse::CopyFrom(const DisableHWComponentResponse& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.DisableHWComponentResponse)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool DisableHWComponentResponse::IsInitialized() const {
+  return true;
+}
+
+void DisableHWComponentResponse::Swap(DisableHWComponentResponse* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void DisableHWComponentResponse::InternalSwap(DisableHWComponentResponse* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  reason_detail_.Swap(&other->reason_detail_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
+  swap(status_, other->status_);
+  swap(reason_, other->reason_);
+}
+
+::google::protobuf::Metadata DisableHWComponentResponse::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void ResetHWComponentRequest::InitAsDefaultInstance() {
+  ::dmi::_ResetHWComponentRequest_default_instance_._instance.get_mutable()->device_uuid_ = const_cast< ::dmi::Uuid*>(
+      ::dmi::Uuid::internal_default_instance());
+  ::dmi::_ResetHWComponentRequest_default_instance_._instance.get_mutable()->component_uuid_ = const_cast< ::dmi::Uuid*>(
+      ::dmi::Uuid::internal_default_instance());
+}
+class ResetHWComponentRequest::HasBitSetters {
+ public:
+  static const ::dmi::Uuid& device_uuid(const ResetHWComponentRequest* msg);
+  static const ::dmi::Uuid& component_uuid(const ResetHWComponentRequest* msg);
+};
+
+const ::dmi::Uuid&
+ResetHWComponentRequest::HasBitSetters::device_uuid(const ResetHWComponentRequest* msg) {
+  return *msg->device_uuid_;
+}
+const ::dmi::Uuid&
+ResetHWComponentRequest::HasBitSetters::component_uuid(const ResetHWComponentRequest* msg) {
+  return *msg->component_uuid_;
+}
+void ResetHWComponentRequest::clear_device_uuid() {
+  if (GetArenaNoVirtual() == nullptr && device_uuid_ != nullptr) {
+    delete device_uuid_;
+  }
+  device_uuid_ = nullptr;
+}
+void ResetHWComponentRequest::clear_component_uuid() {
+  if (GetArenaNoVirtual() == nullptr && component_uuid_ != nullptr) {
+    delete component_uuid_;
+  }
+  component_uuid_ = nullptr;
+}
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int ResetHWComponentRequest::kDeviceUuidFieldNumber;
+const int ResetHWComponentRequest::kComponentUuidFieldNumber;
+const int ResetHWComponentRequest::kComponentNameFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+ResetHWComponentRequest::ResetHWComponentRequest()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.ResetHWComponentRequest)
+}
+ResetHWComponentRequest::ResetHWComponentRequest(const ResetHWComponentRequest& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  component_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (from.component_name().size() > 0) {
+    component_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.component_name_);
+  }
+  if (from.has_device_uuid()) {
+    device_uuid_ = new ::dmi::Uuid(*from.device_uuid_);
+  } else {
+    device_uuid_ = nullptr;
+  }
+  if (from.has_component_uuid()) {
+    component_uuid_ = new ::dmi::Uuid(*from.component_uuid_);
+  } else {
+    component_uuid_ = nullptr;
+  }
+  // @@protoc_insertion_point(copy_constructor:dmi.ResetHWComponentRequest)
+}
+
+void ResetHWComponentRequest::SharedCtor() {
+  ::google::protobuf::internal::InitSCC(
+      &scc_info_ResetHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  component_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&device_uuid_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&component_uuid_) -
+      reinterpret_cast<char*>(&device_uuid_)) + sizeof(component_uuid_));
+}
+
+ResetHWComponentRequest::~ResetHWComponentRequest() {
+  // @@protoc_insertion_point(destructor:dmi.ResetHWComponentRequest)
+  SharedDtor();
+}
+
+void ResetHWComponentRequest::SharedDtor() {
+  component_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != internal_default_instance()) delete device_uuid_;
+  if (this != internal_default_instance()) delete component_uuid_;
+}
+
+void ResetHWComponentRequest::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const ResetHWComponentRequest& ResetHWComponentRequest::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_ResetHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void ResetHWComponentRequest::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.ResetHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  component_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() == nullptr && device_uuid_ != nullptr) {
+    delete device_uuid_;
+  }
+  device_uuid_ = nullptr;
+  if (GetArenaNoVirtual() == nullptr && component_uuid_ != nullptr) {
+    delete component_uuid_;
+  }
+  component_uuid_ = nullptr;
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* ResetHWComponentRequest::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<ResetHWComponentRequest*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.Uuid device_uuid = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 10) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::Uuid::_InternalParse;
+        object = msg->mutable_device_uuid();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // .dmi.Uuid component_uuid = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 18) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::Uuid::_InternalParse;
+        object = msg->mutable_component_uuid();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // string component_name = 3;
+      case 3: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 26) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        ctx->extra_parse_data().SetFieldName("dmi.ResetHWComponentRequest.component_name");
+        object = msg->mutable_component_name();
+        if (size > end - ptr + ::google::protobuf::internal::ParseContext::kSlopBytes) {
+          parser_till_end = ::google::protobuf::internal::GreedyStringParserUTF8;
+          goto string_till_end;
+        }
+        GOOGLE_PROTOBUF_PARSER_ASSERT(::google::protobuf::internal::StringCheckUTF8(ptr, size, ctx));
+        ::google::protobuf::internal::InlineGreedyStringParser(object, ptr, size, ctx);
+        ptr += size;
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+string_till_end:
+  static_cast<::std::string*>(object)->clear();
+  static_cast<::std::string*>(object)->reserve(size);
+  goto len_delim_till_end;
+len_delim_till_end:
+  return ctx->StoreAndTailCall(ptr, end, {_InternalParse, msg},
+                               {parser_till_end, object}, size);
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool ResetHWComponentRequest::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.ResetHWComponentRequest)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.Uuid device_uuid = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (10 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_device_uuid()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.Uuid component_uuid = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (18 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_component_uuid()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // string component_name = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (26 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_component_name()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->component_name().data(), static_cast<int>(this->component_name().length()),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "dmi.ResetHWComponentRequest.component_name"));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.ResetHWComponentRequest)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.ResetHWComponentRequest)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void ResetHWComponentRequest::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.ResetHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      1, HasBitSetters::device_uuid(this), output);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      2, HasBitSetters::component_uuid(this), output);
+  }
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->component_name().data(), static_cast<int>(this->component_name().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.ResetHWComponentRequest.component_name");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      3, this->component_name(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.ResetHWComponentRequest)
+}
+
+::google::protobuf::uint8* ResetHWComponentRequest::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.ResetHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        1, HasBitSetters::device_uuid(this), target);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        2, HasBitSetters::component_uuid(this), target);
+  }
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->component_name().data(), static_cast<int>(this->component_name().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.ResetHWComponentRequest.component_name");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->component_name(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.ResetHWComponentRequest)
+  return target;
+}
+
+size_t ResetHWComponentRequest::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.ResetHWComponentRequest)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->component_name());
+  }
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSize(
+        *device_uuid_);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSize(
+        *component_uuid_);
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void ResetHWComponentRequest::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.ResetHWComponentRequest)
+  GOOGLE_DCHECK_NE(&from, this);
+  const ResetHWComponentRequest* source =
+      ::google::protobuf::DynamicCastToGenerated<ResetHWComponentRequest>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.ResetHWComponentRequest)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.ResetHWComponentRequest)
+    MergeFrom(*source);
+  }
+}
+
+void ResetHWComponentRequest::MergeFrom(const ResetHWComponentRequest& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.ResetHWComponentRequest)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.component_name().size() > 0) {
+
+    component_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.component_name_);
+  }
+  if (from.has_device_uuid()) {
+    mutable_device_uuid()->::dmi::Uuid::MergeFrom(from.device_uuid());
+  }
+  if (from.has_component_uuid()) {
+    mutable_component_uuid()->::dmi::Uuid::MergeFrom(from.component_uuid());
+  }
+}
+
+void ResetHWComponentRequest::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.ResetHWComponentRequest)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void ResetHWComponentRequest::CopyFrom(const ResetHWComponentRequest& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.ResetHWComponentRequest)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool ResetHWComponentRequest::IsInitialized() const {
+  return true;
+}
+
+void ResetHWComponentRequest::Swap(ResetHWComponentRequest* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void ResetHWComponentRequest::InternalSwap(ResetHWComponentRequest* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  component_name_.Swap(&other->component_name_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
+  swap(device_uuid_, other->device_uuid_);
+  swap(component_uuid_, other->component_uuid_);
+}
+
+::google::protobuf::Metadata ResetHWComponentRequest::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void ResetHWComponentResponse::InitAsDefaultInstance() {
+}
+class ResetHWComponentResponse::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int ResetHWComponentResponse::kStatusFieldNumber;
+const int ResetHWComponentResponse::kReasonFieldNumber;
+const int ResetHWComponentResponse::kReasonDetailFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+ResetHWComponentResponse::ResetHWComponentResponse()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.ResetHWComponentResponse)
+}
+ResetHWComponentResponse::ResetHWComponentResponse(const ResetHWComponentResponse& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  reason_detail_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (from.reason_detail().size() > 0) {
+    reason_detail_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.reason_detail_);
+  }
+  ::memcpy(&status_, &from.status_,
+    static_cast<size_t>(reinterpret_cast<char*>(&reason_) -
+    reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+  // @@protoc_insertion_point(copy_constructor:dmi.ResetHWComponentResponse)
+}
+
+void ResetHWComponentResponse::SharedCtor() {
+  ::google::protobuf::internal::InitSCC(
+      &scc_info_ResetHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  reason_detail_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&status_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&reason_) -
+      reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+}
+
+ResetHWComponentResponse::~ResetHWComponentResponse() {
+  // @@protoc_insertion_point(destructor:dmi.ResetHWComponentResponse)
+  SharedDtor();
+}
+
+void ResetHWComponentResponse::SharedDtor() {
+  reason_detail_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+
+void ResetHWComponentResponse::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const ResetHWComponentResponse& ResetHWComponentResponse::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_ResetHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void ResetHWComponentResponse::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.ResetHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  reason_detail_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&status_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&reason_) -
+      reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* ResetHWComponentResponse::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<ResetHWComponentResponse*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.Status status = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 8) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_status(static_cast<::dmi::Status>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // .dmi.ResetHWComponentResponse.Reason reason = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 16) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_reason(static_cast<::dmi::ResetHWComponentResponse_Reason>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // string reason_detail = 3;
+      case 3: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 26) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        ctx->extra_parse_data().SetFieldName("dmi.ResetHWComponentResponse.reason_detail");
+        object = msg->mutable_reason_detail();
+        if (size > end - ptr + ::google::protobuf::internal::ParseContext::kSlopBytes) {
+          parser_till_end = ::google::protobuf::internal::GreedyStringParserUTF8;
+          goto string_till_end;
+        }
+        GOOGLE_PROTOBUF_PARSER_ASSERT(::google::protobuf::internal::StringCheckUTF8(ptr, size, ctx));
+        ::google::protobuf::internal::InlineGreedyStringParser(object, ptr, size, ctx);
+        ptr += size;
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+string_till_end:
+  static_cast<::std::string*>(object)->clear();
+  static_cast<::std::string*>(object)->reserve(size);
+  goto len_delim_till_end;
+len_delim_till_end:
+  return ctx->StoreAndTailCall(ptr, end, {_InternalParse, msg},
+                               {parser_till_end, object}, size);
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool ResetHWComponentResponse::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.ResetHWComponentResponse)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.Status status = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (8 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_status(static_cast< ::dmi::Status >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.ResetHWComponentResponse.Reason reason = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (16 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_reason(static_cast< ::dmi::ResetHWComponentResponse_Reason >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // string reason_detail = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (26 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_reason_detail()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "dmi.ResetHWComponentResponse.reason_detail"));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.ResetHWComponentResponse)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.ResetHWComponentResponse)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void ResetHWComponentResponse::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.ResetHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      1, this->status(), output);
+  }
+
+  // .dmi.ResetHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->reason(), output);
+  }
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.ResetHWComponentResponse.reason_detail");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      3, this->reason_detail(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.ResetHWComponentResponse)
+}
+
+::google::protobuf::uint8* ResetHWComponentResponse::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.ResetHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      1, this->status(), target);
+  }
+
+  // .dmi.ResetHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      2, this->reason(), target);
+  }
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.ResetHWComponentResponse.reason_detail");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->reason_detail(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.ResetHWComponentResponse)
+  return target;
+}
+
+size_t ResetHWComponentResponse::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.ResetHWComponentResponse)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->reason_detail());
+  }
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->status());
+  }
+
+  // .dmi.ResetHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->reason());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void ResetHWComponentResponse::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.ResetHWComponentResponse)
+  GOOGLE_DCHECK_NE(&from, this);
+  const ResetHWComponentResponse* source =
+      ::google::protobuf::DynamicCastToGenerated<ResetHWComponentResponse>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.ResetHWComponentResponse)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.ResetHWComponentResponse)
+    MergeFrom(*source);
+  }
+}
+
+void ResetHWComponentResponse::MergeFrom(const ResetHWComponentResponse& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.ResetHWComponentResponse)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.reason_detail().size() > 0) {
+
+    reason_detail_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.reason_detail_);
+  }
+  if (from.status() != 0) {
+    set_status(from.status());
+  }
+  if (from.reason() != 0) {
+    set_reason(from.reason());
+  }
+}
+
+void ResetHWComponentResponse::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.ResetHWComponentResponse)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void ResetHWComponentResponse::CopyFrom(const ResetHWComponentResponse& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.ResetHWComponentResponse)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool ResetHWComponentResponse::IsInitialized() const {
+  return true;
+}
+
+void ResetHWComponentResponse::Swap(ResetHWComponentResponse* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void ResetHWComponentResponse::InternalSwap(ResetHWComponentResponse* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  reason_detail_.Swap(&other->reason_detail_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
+  swap(status_, other->status_);
+  swap(reason_, other->reason_);
+}
+
+::google::protobuf::Metadata ResetHWComponentResponse::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void EnableHWComponentRequest::InitAsDefaultInstance() {
+  ::dmi::_EnableHWComponentRequest_default_instance_._instance.get_mutable()->device_uuid_ = const_cast< ::dmi::Uuid*>(
+      ::dmi::Uuid::internal_default_instance());
+  ::dmi::_EnableHWComponentRequest_default_instance_._instance.get_mutable()->component_uuid_ = const_cast< ::dmi::Uuid*>(
+      ::dmi::Uuid::internal_default_instance());
+}
+class EnableHWComponentRequest::HasBitSetters {
+ public:
+  static const ::dmi::Uuid& device_uuid(const EnableHWComponentRequest* msg);
+  static const ::dmi::Uuid& component_uuid(const EnableHWComponentRequest* msg);
+};
+
+const ::dmi::Uuid&
+EnableHWComponentRequest::HasBitSetters::device_uuid(const EnableHWComponentRequest* msg) {
+  return *msg->device_uuid_;
+}
+const ::dmi::Uuid&
+EnableHWComponentRequest::HasBitSetters::component_uuid(const EnableHWComponentRequest* msg) {
+  return *msg->component_uuid_;
+}
+void EnableHWComponentRequest::clear_device_uuid() {
+  if (GetArenaNoVirtual() == nullptr && device_uuid_ != nullptr) {
+    delete device_uuid_;
+  }
+  device_uuid_ = nullptr;
+}
+void EnableHWComponentRequest::clear_component_uuid() {
+  if (GetArenaNoVirtual() == nullptr && component_uuid_ != nullptr) {
+    delete component_uuid_;
+  }
+  component_uuid_ = nullptr;
+}
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int EnableHWComponentRequest::kDeviceUuidFieldNumber;
+const int EnableHWComponentRequest::kComponentUuidFieldNumber;
+const int EnableHWComponentRequest::kComponentNameFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+EnableHWComponentRequest::EnableHWComponentRequest()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.EnableHWComponentRequest)
+}
+EnableHWComponentRequest::EnableHWComponentRequest(const EnableHWComponentRequest& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  component_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (from.component_name().size() > 0) {
+    component_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.component_name_);
+  }
+  if (from.has_device_uuid()) {
+    device_uuid_ = new ::dmi::Uuid(*from.device_uuid_);
+  } else {
+    device_uuid_ = nullptr;
+  }
+  if (from.has_component_uuid()) {
+    component_uuid_ = new ::dmi::Uuid(*from.component_uuid_);
+  } else {
+    component_uuid_ = nullptr;
+  }
+  // @@protoc_insertion_point(copy_constructor:dmi.EnableHWComponentRequest)
+}
+
+void EnableHWComponentRequest::SharedCtor() {
+  ::google::protobuf::internal::InitSCC(
+      &scc_info_EnableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  component_name_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&device_uuid_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&component_uuid_) -
+      reinterpret_cast<char*>(&device_uuid_)) + sizeof(component_uuid_));
+}
+
+EnableHWComponentRequest::~EnableHWComponentRequest() {
+  // @@protoc_insertion_point(destructor:dmi.EnableHWComponentRequest)
+  SharedDtor();
+}
+
+void EnableHWComponentRequest::SharedDtor() {
+  component_name_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (this != internal_default_instance()) delete device_uuid_;
+  if (this != internal_default_instance()) delete component_uuid_;
+}
+
+void EnableHWComponentRequest::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const EnableHWComponentRequest& EnableHWComponentRequest::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_EnableHWComponentRequest_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void EnableHWComponentRequest::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.EnableHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  component_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (GetArenaNoVirtual() == nullptr && device_uuid_ != nullptr) {
+    delete device_uuid_;
+  }
+  device_uuid_ = nullptr;
+  if (GetArenaNoVirtual() == nullptr && component_uuid_ != nullptr) {
+    delete component_uuid_;
+  }
+  component_uuid_ = nullptr;
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* EnableHWComponentRequest::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<EnableHWComponentRequest*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.Uuid device_uuid = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 10) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::Uuid::_InternalParse;
+        object = msg->mutable_device_uuid();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // .dmi.Uuid component_uuid = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 18) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        parser_till_end = ::dmi::Uuid::_InternalParse;
+        object = msg->mutable_component_uuid();
+        if (size > end - ptr) goto len_delim_till_end;
+        ptr += size;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ctx->ParseExactRange(
+            {parser_till_end, object}, ptr - size, ptr));
+        break;
+      }
+      // string component_name = 3;
+      case 3: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 26) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        ctx->extra_parse_data().SetFieldName("dmi.EnableHWComponentRequest.component_name");
+        object = msg->mutable_component_name();
+        if (size > end - ptr + ::google::protobuf::internal::ParseContext::kSlopBytes) {
+          parser_till_end = ::google::protobuf::internal::GreedyStringParserUTF8;
+          goto string_till_end;
+        }
+        GOOGLE_PROTOBUF_PARSER_ASSERT(::google::protobuf::internal::StringCheckUTF8(ptr, size, ctx));
+        ::google::protobuf::internal::InlineGreedyStringParser(object, ptr, size, ctx);
+        ptr += size;
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+string_till_end:
+  static_cast<::std::string*>(object)->clear();
+  static_cast<::std::string*>(object)->reserve(size);
+  goto len_delim_till_end;
+len_delim_till_end:
+  return ctx->StoreAndTailCall(ptr, end, {_InternalParse, msg},
+                               {parser_till_end, object}, size);
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool EnableHWComponentRequest::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.EnableHWComponentRequest)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.Uuid device_uuid = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (10 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_device_uuid()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.Uuid component_uuid = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (18 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadMessage(
+               input, mutable_component_uuid()));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // string component_name = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (26 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_component_name()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->component_name().data(), static_cast<int>(this->component_name().length()),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "dmi.EnableHWComponentRequest.component_name"));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.EnableHWComponentRequest)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.EnableHWComponentRequest)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void EnableHWComponentRequest::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.EnableHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      1, HasBitSetters::device_uuid(this), output);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    ::google::protobuf::internal::WireFormatLite::WriteMessageMaybeToArray(
+      2, HasBitSetters::component_uuid(this), output);
+  }
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->component_name().data(), static_cast<int>(this->component_name().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.EnableHWComponentRequest.component_name");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      3, this->component_name(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.EnableHWComponentRequest)
+}
+
+::google::protobuf::uint8* EnableHWComponentRequest::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.EnableHWComponentRequest)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        1, HasBitSetters::device_uuid(this), target);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    target = ::google::protobuf::internal::WireFormatLite::
+      InternalWriteMessageToArray(
+        2, HasBitSetters::component_uuid(this), target);
+  }
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->component_name().data(), static_cast<int>(this->component_name().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.EnableHWComponentRequest.component_name");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->component_name(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.EnableHWComponentRequest)
+  return target;
+}
+
+size_t EnableHWComponentRequest::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.EnableHWComponentRequest)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // string component_name = 3;
+  if (this->component_name().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->component_name());
+  }
+
+  // .dmi.Uuid device_uuid = 1;
+  if (this->has_device_uuid()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSize(
+        *device_uuid_);
+  }
+
+  // .dmi.Uuid component_uuid = 2;
+  if (this->has_component_uuid()) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::MessageSize(
+        *component_uuid_);
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void EnableHWComponentRequest::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.EnableHWComponentRequest)
+  GOOGLE_DCHECK_NE(&from, this);
+  const EnableHWComponentRequest* source =
+      ::google::protobuf::DynamicCastToGenerated<EnableHWComponentRequest>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.EnableHWComponentRequest)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.EnableHWComponentRequest)
+    MergeFrom(*source);
+  }
+}
+
+void EnableHWComponentRequest::MergeFrom(const EnableHWComponentRequest& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.EnableHWComponentRequest)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.component_name().size() > 0) {
+
+    component_name_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.component_name_);
+  }
+  if (from.has_device_uuid()) {
+    mutable_device_uuid()->::dmi::Uuid::MergeFrom(from.device_uuid());
+  }
+  if (from.has_component_uuid()) {
+    mutable_component_uuid()->::dmi::Uuid::MergeFrom(from.component_uuid());
+  }
+}
+
+void EnableHWComponentRequest::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.EnableHWComponentRequest)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void EnableHWComponentRequest::CopyFrom(const EnableHWComponentRequest& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.EnableHWComponentRequest)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool EnableHWComponentRequest::IsInitialized() const {
+  return true;
+}
+
+void EnableHWComponentRequest::Swap(EnableHWComponentRequest* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void EnableHWComponentRequest::InternalSwap(EnableHWComponentRequest* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  component_name_.Swap(&other->component_name_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
+  swap(device_uuid_, other->device_uuid_);
+  swap(component_uuid_, other->component_uuid_);
+}
+
+::google::protobuf::Metadata EnableHWComponentRequest::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
+// ===================================================================
+
+void EnableHWComponentResponse::InitAsDefaultInstance() {
+}
+class EnableHWComponentResponse::HasBitSetters {
+ public:
+};
+
+#if !defined(_MSC_VER) || _MSC_VER >= 1900
+const int EnableHWComponentResponse::kStatusFieldNumber;
+const int EnableHWComponentResponse::kReasonFieldNumber;
+const int EnableHWComponentResponse::kReasonDetailFieldNumber;
+#endif  // !defined(_MSC_VER) || _MSC_VER >= 1900
+
+EnableHWComponentResponse::EnableHWComponentResponse()
+  : ::google::protobuf::Message(), _internal_metadata_(nullptr) {
+  SharedCtor();
+  // @@protoc_insertion_point(constructor:dmi.EnableHWComponentResponse)
+}
+EnableHWComponentResponse::EnableHWComponentResponse(const EnableHWComponentResponse& from)
+  : ::google::protobuf::Message(),
+      _internal_metadata_(nullptr) {
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  reason_detail_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  if (from.reason_detail().size() > 0) {
+    reason_detail_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.reason_detail_);
+  }
+  ::memcpy(&status_, &from.status_,
+    static_cast<size_t>(reinterpret_cast<char*>(&reason_) -
+    reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+  // @@protoc_insertion_point(copy_constructor:dmi.EnableHWComponentResponse)
+}
+
+void EnableHWComponentResponse::SharedCtor() {
+  ::google::protobuf::internal::InitSCC(
+      &scc_info_EnableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  reason_detail_.UnsafeSetDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&status_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&reason_) -
+      reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+}
+
+EnableHWComponentResponse::~EnableHWComponentResponse() {
+  // @@protoc_insertion_point(destructor:dmi.EnableHWComponentResponse)
+  SharedDtor();
+}
+
+void EnableHWComponentResponse::SharedDtor() {
+  reason_detail_.DestroyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+
+void EnableHWComponentResponse::SetCachedSize(int size) const {
+  _cached_size_.Set(size);
+}
+const EnableHWComponentResponse& EnableHWComponentResponse::default_instance() {
+  ::google::protobuf::internal::InitSCC(&::scc_info_EnableHWComponentResponse_dmi_2fhw_5fmanagement_5fservice_2eproto.base);
+  return *internal_default_instance();
+}
+
+
+void EnableHWComponentResponse::Clear() {
+// @@protoc_insertion_point(message_clear_start:dmi.EnableHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  reason_detail_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+  ::memset(&status_, 0, static_cast<size_t>(
+      reinterpret_cast<char*>(&reason_) -
+      reinterpret_cast<char*>(&status_)) + sizeof(reason_));
+  _internal_metadata_.Clear();
+}
+
+#if GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+const char* EnableHWComponentResponse::_InternalParse(const char* begin, const char* end, void* object,
+                  ::google::protobuf::internal::ParseContext* ctx) {
+  auto msg = static_cast<EnableHWComponentResponse*>(object);
+  ::google::protobuf::int32 size; (void)size;
+  int depth; (void)depth;
+  ::google::protobuf::uint32 tag;
+  ::google::protobuf::internal::ParseFunc parser_till_end; (void)parser_till_end;
+  auto ptr = begin;
+  while (ptr < end) {
+    ptr = ::google::protobuf::io::Parse32(ptr, &tag);
+    GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+    switch (tag >> 3) {
+      // .dmi.Status status = 1;
+      case 1: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 8) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_status(static_cast<::dmi::Status>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // .dmi.EnableHWComponentResponse.Reason reason = 2;
+      case 2: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 16) goto handle_unusual;
+        ::google::protobuf::uint64 val = ::google::protobuf::internal::ReadVarint(&ptr);
+        msg->set_reason(static_cast<::dmi::EnableHWComponentResponse_Reason>(val));
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        break;
+      }
+      // string reason_detail = 3;
+      case 3: {
+        if (static_cast<::google::protobuf::uint8>(tag) != 26) goto handle_unusual;
+        ptr = ::google::protobuf::io::ReadSize(ptr, &size);
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr);
+        ctx->extra_parse_data().SetFieldName("dmi.EnableHWComponentResponse.reason_detail");
+        object = msg->mutable_reason_detail();
+        if (size > end - ptr + ::google::protobuf::internal::ParseContext::kSlopBytes) {
+          parser_till_end = ::google::protobuf::internal::GreedyStringParserUTF8;
+          goto string_till_end;
+        }
+        GOOGLE_PROTOBUF_PARSER_ASSERT(::google::protobuf::internal::StringCheckUTF8(ptr, size, ctx));
+        ::google::protobuf::internal::InlineGreedyStringParser(object, ptr, size, ctx);
+        ptr += size;
+        break;
+      }
+      default: {
+      handle_unusual:
+        if ((tag & 7) == 4 || tag == 0) {
+          ctx->EndGroup(tag);
+          return ptr;
+        }
+        auto res = UnknownFieldParse(tag, {_InternalParse, msg},
+          ptr, end, msg->_internal_metadata_.mutable_unknown_fields(), ctx);
+        ptr = res.first;
+        GOOGLE_PROTOBUF_PARSER_ASSERT(ptr != nullptr);
+        if (res.second) return ptr;
+      }
+    }  // switch
+  }  // while
+  return ptr;
+string_till_end:
+  static_cast<::std::string*>(object)->clear();
+  static_cast<::std::string*>(object)->reserve(size);
+  goto len_delim_till_end;
+len_delim_till_end:
+  return ctx->StoreAndTailCall(ptr, end, {_InternalParse, msg},
+                               {parser_till_end, object}, size);
+}
+#else  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+bool EnableHWComponentResponse::MergePartialFromCodedStream(
+    ::google::protobuf::io::CodedInputStream* input) {
+#define DO_(EXPRESSION) if (!PROTOBUF_PREDICT_TRUE(EXPRESSION)) goto failure
+  ::google::protobuf::uint32 tag;
+  // @@protoc_insertion_point(parse_start:dmi.EnableHWComponentResponse)
+  for (;;) {
+    ::std::pair<::google::protobuf::uint32, bool> p = input->ReadTagWithCutoffNoLastTag(127u);
+    tag = p.first;
+    if (!p.second) goto handle_unusual;
+    switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) {
+      // .dmi.Status status = 1;
+      case 1: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (8 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_status(static_cast< ::dmi::Status >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // .dmi.EnableHWComponentResponse.Reason reason = 2;
+      case 2: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (16 & 0xFF)) {
+          int value = 0;
+          DO_((::google::protobuf::internal::WireFormatLite::ReadPrimitive<
+                   int, ::google::protobuf::internal::WireFormatLite::TYPE_ENUM>(
+                 input, &value)));
+          set_reason(static_cast< ::dmi::EnableHWComponentResponse_Reason >(value));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      // string reason_detail = 3;
+      case 3: {
+        if (static_cast< ::google::protobuf::uint8>(tag) == (26 & 0xFF)) {
+          DO_(::google::protobuf::internal::WireFormatLite::ReadString(
+                input, this->mutable_reason_detail()));
+          DO_(::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+            this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+            ::google::protobuf::internal::WireFormatLite::PARSE,
+            "dmi.EnableHWComponentResponse.reason_detail"));
+        } else {
+          goto handle_unusual;
+        }
+        break;
+      }
+
+      default: {
+      handle_unusual:
+        if (tag == 0) {
+          goto success;
+        }
+        DO_(::google::protobuf::internal::WireFormat::SkipField(
+              input, tag, _internal_metadata_.mutable_unknown_fields()));
+        break;
+      }
+    }
+  }
+success:
+  // @@protoc_insertion_point(parse_success:dmi.EnableHWComponentResponse)
+  return true;
+failure:
+  // @@protoc_insertion_point(parse_failure:dmi.EnableHWComponentResponse)
+  return false;
+#undef DO_
+}
+#endif  // GOOGLE_PROTOBUF_ENABLE_EXPERIMENTAL_PARSER
+
+void EnableHWComponentResponse::SerializeWithCachedSizes(
+    ::google::protobuf::io::CodedOutputStream* output) const {
+  // @@protoc_insertion_point(serialize_start:dmi.EnableHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      1, this->status(), output);
+  }
+
+  // .dmi.EnableHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    ::google::protobuf::internal::WireFormatLite::WriteEnum(
+      2, this->reason(), output);
+  }
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.EnableHWComponentResponse.reason_detail");
+    ::google::protobuf::internal::WireFormatLite::WriteStringMaybeAliased(
+      3, this->reason_detail(), output);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    ::google::protobuf::internal::WireFormat::SerializeUnknownFields(
+        _internal_metadata_.unknown_fields(), output);
+  }
+  // @@protoc_insertion_point(serialize_end:dmi.EnableHWComponentResponse)
+}
+
+::google::protobuf::uint8* EnableHWComponentResponse::InternalSerializeWithCachedSizesToArray(
+    ::google::protobuf::uint8* target) const {
+  // @@protoc_insertion_point(serialize_to_array_start:dmi.EnableHWComponentResponse)
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      1, this->status(), target);
+  }
+
+  // .dmi.EnableHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    target = ::google::protobuf::internal::WireFormatLite::WriteEnumToArray(
+      2, this->reason(), target);
+  }
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    ::google::protobuf::internal::WireFormatLite::VerifyUtf8String(
+      this->reason_detail().data(), static_cast<int>(this->reason_detail().length()),
+      ::google::protobuf::internal::WireFormatLite::SERIALIZE,
+      "dmi.EnableHWComponentResponse.reason_detail");
+    target =
+      ::google::protobuf::internal::WireFormatLite::WriteStringToArray(
+        3, this->reason_detail(), target);
+  }
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray(
+        _internal_metadata_.unknown_fields(), target);
+  }
+  // @@protoc_insertion_point(serialize_to_array_end:dmi.EnableHWComponentResponse)
+  return target;
+}
+
+size_t EnableHWComponentResponse::ByteSizeLong() const {
+// @@protoc_insertion_point(message_byte_size_start:dmi.EnableHWComponentResponse)
+  size_t total_size = 0;
+
+  if (_internal_metadata_.have_unknown_fields()) {
+    total_size +=
+      ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize(
+        _internal_metadata_.unknown_fields());
+  }
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  // Prevent compiler warnings about cached_has_bits being unused
+  (void) cached_has_bits;
+
+  // string reason_detail = 3;
+  if (this->reason_detail().size() > 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::StringSize(
+        this->reason_detail());
+  }
+
+  // .dmi.Status status = 1;
+  if (this->status() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->status());
+  }
+
+  // .dmi.EnableHWComponentResponse.Reason reason = 2;
+  if (this->reason() != 0) {
+    total_size += 1 +
+      ::google::protobuf::internal::WireFormatLite::EnumSize(this->reason());
+  }
+
+  int cached_size = ::google::protobuf::internal::ToCachedSize(total_size);
+  SetCachedSize(cached_size);
+  return total_size;
+}
+
+void EnableHWComponentResponse::MergeFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_merge_from_start:dmi.EnableHWComponentResponse)
+  GOOGLE_DCHECK_NE(&from, this);
+  const EnableHWComponentResponse* source =
+      ::google::protobuf::DynamicCastToGenerated<EnableHWComponentResponse>(
+          &from);
+  if (source == nullptr) {
+  // @@protoc_insertion_point(generalized_merge_from_cast_fail:dmi.EnableHWComponentResponse)
+    ::google::protobuf::internal::ReflectionOps::Merge(from, this);
+  } else {
+  // @@protoc_insertion_point(generalized_merge_from_cast_success:dmi.EnableHWComponentResponse)
+    MergeFrom(*source);
+  }
+}
+
+void EnableHWComponentResponse::MergeFrom(const EnableHWComponentResponse& from) {
+// @@protoc_insertion_point(class_specific_merge_from_start:dmi.EnableHWComponentResponse)
+  GOOGLE_DCHECK_NE(&from, this);
+  _internal_metadata_.MergeFrom(from._internal_metadata_);
+  ::google::protobuf::uint32 cached_has_bits = 0;
+  (void) cached_has_bits;
+
+  if (from.reason_detail().size() > 0) {
+
+    reason_detail_.AssignWithDefault(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), from.reason_detail_);
+  }
+  if (from.status() != 0) {
+    set_status(from.status());
+  }
+  if (from.reason() != 0) {
+    set_reason(from.reason());
+  }
+}
+
+void EnableHWComponentResponse::CopyFrom(const ::google::protobuf::Message& from) {
+// @@protoc_insertion_point(generalized_copy_from_start:dmi.EnableHWComponentResponse)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+void EnableHWComponentResponse::CopyFrom(const EnableHWComponentResponse& from) {
+// @@protoc_insertion_point(class_specific_copy_from_start:dmi.EnableHWComponentResponse)
+  if (&from == this) return;
+  Clear();
+  MergeFrom(from);
+}
+
+bool EnableHWComponentResponse::IsInitialized() const {
+  return true;
+}
+
+void EnableHWComponentResponse::Swap(EnableHWComponentResponse* other) {
+  if (other == this) return;
+  InternalSwap(other);
+}
+void EnableHWComponentResponse::InternalSwap(EnableHWComponentResponse* other) {
+  using std::swap;
+  _internal_metadata_.Swap(&other->_internal_metadata_);
+  reason_detail_.Swap(&other->reason_detail_, &::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+    GetArenaNoVirtual());
+  swap(status_, other->status_);
+  swap(reason_, other->reason_);
+}
+
+::google::protobuf::Metadata EnableHWComponentResponse::GetMetadata() const {
+  ::google::protobuf::internal::AssignDescriptors(&::assign_descriptors_table_dmi_2fhw_5fmanagement_5fservice_2eproto);
+  return ::file_level_metadata_dmi_2fhw_5fmanagement_5fservice_2eproto[kIndexInFileMessages];
+}
+
+
 // @@protoc_insertion_point(namespace_scope)
 }  // namespace dmi
 namespace google {
@@ -12772,6 +15600,24 @@
 template<> PROTOBUF_NOINLINE ::dmi::RebootDeviceResponse* Arena::CreateMaybeMessage< ::dmi::RebootDeviceResponse >(Arena* arena) {
   return Arena::CreateInternal< ::dmi::RebootDeviceResponse >(arena);
 }
+template<> PROTOBUF_NOINLINE ::dmi::DisableHWComponentRequest* Arena::CreateMaybeMessage< ::dmi::DisableHWComponentRequest >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::DisableHWComponentRequest >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::DisableHWComponentResponse* Arena::CreateMaybeMessage< ::dmi::DisableHWComponentResponse >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::DisableHWComponentResponse >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::ResetHWComponentRequest* Arena::CreateMaybeMessage< ::dmi::ResetHWComponentRequest >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::ResetHWComponentRequest >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::ResetHWComponentResponse* Arena::CreateMaybeMessage< ::dmi::ResetHWComponentResponse >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::ResetHWComponentResponse >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::EnableHWComponentRequest* Arena::CreateMaybeMessage< ::dmi::EnableHWComponentRequest >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::EnableHWComponentRequest >(arena);
+}
+template<> PROTOBUF_NOINLINE ::dmi::EnableHWComponentResponse* Arena::CreateMaybeMessage< ::dmi::EnableHWComponentResponse >(Arena* arena) {
+  return Arena::CreateInternal< ::dmi::EnableHWComponentResponse >(arena);
+}
 }  // namespace protobuf
 }  // namespace google
 
diff --git a/cpp/dmi/hw_management_service.pb.h b/cpp/dmi/hw_management_service.pb.h
index 7f502f3..fbaa2de 100644
--- a/cpp/dmi/hw_management_service.pb.h
+++ b/cpp/dmi/hw_management_service.pb.h
@@ -45,7 +45,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[29]
+  static const ::google::protobuf::internal::ParseTable schema[35]
     PROTOBUF_SECTION_VARIABLE(protodesc_cold);
   static const ::google::protobuf::internal::FieldMetadata field_metadata[];
   static const ::google::protobuf::internal::SerializationTable serialization_table[];
@@ -53,6 +53,18 @@
 };
 void AddDescriptors_dmi_2fhw_5fmanagement_5fservice_2eproto();
 namespace dmi {
+class DisableHWComponentRequest;
+class DisableHWComponentRequestDefaultTypeInternal;
+extern DisableHWComponentRequestDefaultTypeInternal _DisableHWComponentRequest_default_instance_;
+class DisableHWComponentResponse;
+class DisableHWComponentResponseDefaultTypeInternal;
+extern DisableHWComponentResponseDefaultTypeInternal _DisableHWComponentResponse_default_instance_;
+class EnableHWComponentRequest;
+class EnableHWComponentRequestDefaultTypeInternal;
+extern EnableHWComponentRequestDefaultTypeInternal _EnableHWComponentRequest_default_instance_;
+class EnableHWComponentResponse;
+class EnableHWComponentResponseDefaultTypeInternal;
+extern EnableHWComponentResponseDefaultTypeInternal _EnableHWComponentResponse_default_instance_;
 class EntitiesLogLevel;
 class EntitiesLogLevelDefaultTypeInternal;
 extern EntitiesLogLevelDefaultTypeInternal _EntitiesLogLevel_default_instance_;
@@ -110,6 +122,12 @@
 class RebootDeviceResponse;
 class RebootDeviceResponseDefaultTypeInternal;
 extern RebootDeviceResponseDefaultTypeInternal _RebootDeviceResponse_default_instance_;
+class ResetHWComponentRequest;
+class ResetHWComponentRequestDefaultTypeInternal;
+extern ResetHWComponentRequestDefaultTypeInternal _ResetHWComponentRequest_default_instance_;
+class ResetHWComponentResponse;
+class ResetHWComponentResponseDefaultTypeInternal;
+extern ResetHWComponentResponseDefaultTypeInternal _ResetHWComponentResponse_default_instance_;
 class SetDmLogLevelRequest;
 class SetDmLogLevelRequestDefaultTypeInternal;
 extern SetDmLogLevelRequestDefaultTypeInternal _SetDmLogLevelRequest_default_instance_;
@@ -143,6 +161,10 @@
 }  // namespace dmi
 namespace google {
 namespace protobuf {
+template<> ::dmi::DisableHWComponentRequest* Arena::CreateMaybeMessage<::dmi::DisableHWComponentRequest>(Arena*);
+template<> ::dmi::DisableHWComponentResponse* Arena::CreateMaybeMessage<::dmi::DisableHWComponentResponse>(Arena*);
+template<> ::dmi::EnableHWComponentRequest* Arena::CreateMaybeMessage<::dmi::EnableHWComponentRequest>(Arena*);
+template<> ::dmi::EnableHWComponentResponse* Arena::CreateMaybeMessage<::dmi::EnableHWComponentResponse>(Arena*);
 template<> ::dmi::EntitiesLogLevel* Arena::CreateMaybeMessage<::dmi::EntitiesLogLevel>(Arena*);
 template<> ::dmi::GetDmLogLevelRequest* Arena::CreateMaybeMessage<::dmi::GetDmLogLevelRequest>(Arena*);
 template<> ::dmi::GetDmLogLevelResponse* Arena::CreateMaybeMessage<::dmi::GetDmLogLevelResponse>(Arena*);
@@ -162,6 +184,8 @@
 template<> ::dmi::PhysicalInventoryResponse* Arena::CreateMaybeMessage<::dmi::PhysicalInventoryResponse>(Arena*);
 template<> ::dmi::RebootDeviceRequest* Arena::CreateMaybeMessage<::dmi::RebootDeviceRequest>(Arena*);
 template<> ::dmi::RebootDeviceResponse* Arena::CreateMaybeMessage<::dmi::RebootDeviceResponse>(Arena*);
+template<> ::dmi::ResetHWComponentRequest* Arena::CreateMaybeMessage<::dmi::ResetHWComponentRequest>(Arena*);
+template<> ::dmi::ResetHWComponentResponse* Arena::CreateMaybeMessage<::dmi::ResetHWComponentResponse>(Arena*);
 template<> ::dmi::SetDmLogLevelRequest* Arena::CreateMaybeMessage<::dmi::SetDmLogLevelRequest>(Arena*);
 template<> ::dmi::SetDmLogLevelResponse* Arena::CreateMaybeMessage<::dmi::SetDmLogLevelResponse>(Arena*);
 template<> ::dmi::SetLogLevelRequest* Arena::CreateMaybeMessage<::dmi::SetLogLevelRequest>(Arena*);
@@ -504,6 +528,84 @@
   return ::google::protobuf::internal::ParseNamedEnum<RebootDeviceResponse_Reason>(
     RebootDeviceResponse_Reason_descriptor(), name, value);
 }
+enum DisableHWComponentResponse_Reason {
+  DisableHWComponentResponse_Reason_UNDEFINED_REASON = 0,
+  DisableHWComponentResponse_Reason_UNKNOWN_DEVICE = 1,
+  DisableHWComponentResponse_Reason_UNKNOWN_COMPONENT = 2,
+  DisableHWComponentResponse_Reason_INTERNAL_ERROR = 3,
+  DisableHWComponentResponse_Reason_DEVICE_UNREACHABLE = 4,
+  DisableHWComponentResponse_Reason_DISABLE_UNSUPPORTED = 5,
+  DisableHWComponentResponse_Reason_INVALID_PARAMS = 6,
+  DisableHWComponentResponse_Reason_DisableHWComponentResponse_Reason_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
+  DisableHWComponentResponse_Reason_DisableHWComponentResponse_Reason_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
+};
+bool DisableHWComponentResponse_Reason_IsValid(int value);
+const DisableHWComponentResponse_Reason DisableHWComponentResponse_Reason_Reason_MIN = DisableHWComponentResponse_Reason_UNDEFINED_REASON;
+const DisableHWComponentResponse_Reason DisableHWComponentResponse_Reason_Reason_MAX = DisableHWComponentResponse_Reason_INVALID_PARAMS;
+const int DisableHWComponentResponse_Reason_Reason_ARRAYSIZE = DisableHWComponentResponse_Reason_Reason_MAX + 1;
+
+const ::google::protobuf::EnumDescriptor* DisableHWComponentResponse_Reason_descriptor();
+inline const ::std::string& DisableHWComponentResponse_Reason_Name(DisableHWComponentResponse_Reason value) {
+  return ::google::protobuf::internal::NameOfEnum(
+    DisableHWComponentResponse_Reason_descriptor(), value);
+}
+inline bool DisableHWComponentResponse_Reason_Parse(
+    const ::std::string& name, DisableHWComponentResponse_Reason* value) {
+  return ::google::protobuf::internal::ParseNamedEnum<DisableHWComponentResponse_Reason>(
+    DisableHWComponentResponse_Reason_descriptor(), name, value);
+}
+enum ResetHWComponentResponse_Reason {
+  ResetHWComponentResponse_Reason_UNDEFINED_REASON = 0,
+  ResetHWComponentResponse_Reason_UNKNOWN_DEVICE = 1,
+  ResetHWComponentResponse_Reason_UNKNOWN_COMPONENT = 2,
+  ResetHWComponentResponse_Reason_INTERNAL_ERROR = 3,
+  ResetHWComponentResponse_Reason_DEVICE_UNREACHABLE = 4,
+  ResetHWComponentResponse_Reason_RESET_UNSUPPORTED = 5,
+  ResetHWComponentResponse_Reason_INVALID_PARAMS = 6,
+  ResetHWComponentResponse_Reason_ResetHWComponentResponse_Reason_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
+  ResetHWComponentResponse_Reason_ResetHWComponentResponse_Reason_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
+};
+bool ResetHWComponentResponse_Reason_IsValid(int value);
+const ResetHWComponentResponse_Reason ResetHWComponentResponse_Reason_Reason_MIN = ResetHWComponentResponse_Reason_UNDEFINED_REASON;
+const ResetHWComponentResponse_Reason ResetHWComponentResponse_Reason_Reason_MAX = ResetHWComponentResponse_Reason_INVALID_PARAMS;
+const int ResetHWComponentResponse_Reason_Reason_ARRAYSIZE = ResetHWComponentResponse_Reason_Reason_MAX + 1;
+
+const ::google::protobuf::EnumDescriptor* ResetHWComponentResponse_Reason_descriptor();
+inline const ::std::string& ResetHWComponentResponse_Reason_Name(ResetHWComponentResponse_Reason value) {
+  return ::google::protobuf::internal::NameOfEnum(
+    ResetHWComponentResponse_Reason_descriptor(), value);
+}
+inline bool ResetHWComponentResponse_Reason_Parse(
+    const ::std::string& name, ResetHWComponentResponse_Reason* value) {
+  return ::google::protobuf::internal::ParseNamedEnum<ResetHWComponentResponse_Reason>(
+    ResetHWComponentResponse_Reason_descriptor(), name, value);
+}
+enum EnableHWComponentResponse_Reason {
+  EnableHWComponentResponse_Reason_UNDEFINED_REASON = 0,
+  EnableHWComponentResponse_Reason_UNKNOWN_DEVICE = 1,
+  EnableHWComponentResponse_Reason_UNKNOWN_COMPONENT = 2,
+  EnableHWComponentResponse_Reason_INTERNAL_ERROR = 3,
+  EnableHWComponentResponse_Reason_DEVICE_UNREACHABLE = 4,
+  EnableHWComponentResponse_Reason_ENABLE_UNSUPPORTED = 5,
+  EnableHWComponentResponse_Reason_INVALID_PARAMS = 6,
+  EnableHWComponentResponse_Reason_EnableHWComponentResponse_Reason_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::min(),
+  EnableHWComponentResponse_Reason_EnableHWComponentResponse_Reason_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::google::protobuf::int32>::max()
+};
+bool EnableHWComponentResponse_Reason_IsValid(int value);
+const EnableHWComponentResponse_Reason EnableHWComponentResponse_Reason_Reason_MIN = EnableHWComponentResponse_Reason_UNDEFINED_REASON;
+const EnableHWComponentResponse_Reason EnableHWComponentResponse_Reason_Reason_MAX = EnableHWComponentResponse_Reason_INVALID_PARAMS;
+const int EnableHWComponentResponse_Reason_Reason_ARRAYSIZE = EnableHWComponentResponse_Reason_Reason_MAX + 1;
+
+const ::google::protobuf::EnumDescriptor* EnableHWComponentResponse_Reason_descriptor();
+inline const ::std::string& EnableHWComponentResponse_Reason_Name(EnableHWComponentResponse_Reason value) {
+  return ::google::protobuf::internal::NameOfEnum(
+    EnableHWComponentResponse_Reason_descriptor(), value);
+}
+inline bool EnableHWComponentResponse_Reason_Parse(
+    const ::std::string& name, EnableHWComponentResponse_Reason* value) {
+  return ::google::protobuf::internal::ParseNamedEnum<EnableHWComponentResponse_Reason>(
+    EnableHWComponentResponse_Reason_descriptor(), name, value);
+}
 // ===================================================================
 
 class PhysicalInventoryRequest final :
@@ -4800,6 +4902,936 @@
   mutable ::google::protobuf::internal::CachedSize _cached_size_;
   friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
 };
+// -------------------------------------------------------------------
+
+class DisableHWComponentRequest final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.DisableHWComponentRequest) */ {
+ public:
+  DisableHWComponentRequest();
+  virtual ~DisableHWComponentRequest();
+
+  DisableHWComponentRequest(const DisableHWComponentRequest& from);
+
+  inline DisableHWComponentRequest& operator=(const DisableHWComponentRequest& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  DisableHWComponentRequest(DisableHWComponentRequest&& from) noexcept
+    : DisableHWComponentRequest() {
+    *this = ::std::move(from);
+  }
+
+  inline DisableHWComponentRequest& operator=(DisableHWComponentRequest&& 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 DisableHWComponentRequest& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const DisableHWComponentRequest* internal_default_instance() {
+    return reinterpret_cast<const DisableHWComponentRequest*>(
+               &_DisableHWComponentRequest_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    29;
+
+  void Swap(DisableHWComponentRequest* other);
+  friend void swap(DisableHWComponentRequest& a, DisableHWComponentRequest& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline DisableHWComponentRequest* New() const final {
+    return CreateMaybeMessage<DisableHWComponentRequest>(nullptr);
+  }
+
+  DisableHWComponentRequest* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<DisableHWComponentRequest>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const DisableHWComponentRequest& from);
+  void MergeFrom(const DisableHWComponentRequest& 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(DisableHWComponentRequest* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // string component_name = 3;
+  void clear_component_name();
+  static const int kComponentNameFieldNumber = 3;
+  const ::std::string& component_name() const;
+  void set_component_name(const ::std::string& value);
+  #if LANG_CXX11
+  void set_component_name(::std::string&& value);
+  #endif
+  void set_component_name(const char* value);
+  void set_component_name(const char* value, size_t size);
+  ::std::string* mutable_component_name();
+  ::std::string* release_component_name();
+  void set_allocated_component_name(::std::string* component_name);
+
+  // .dmi.Uuid device_uuid = 1;
+  bool has_device_uuid() const;
+  void clear_device_uuid();
+  static const int kDeviceUuidFieldNumber = 1;
+  const ::dmi::Uuid& device_uuid() const;
+  ::dmi::Uuid* release_device_uuid();
+  ::dmi::Uuid* mutable_device_uuid();
+  void set_allocated_device_uuid(::dmi::Uuid* device_uuid);
+
+  // .dmi.Uuid component_uuid = 2;
+  bool has_component_uuid() const;
+  void clear_component_uuid();
+  static const int kComponentUuidFieldNumber = 2;
+  const ::dmi::Uuid& component_uuid() const;
+  ::dmi::Uuid* release_component_uuid();
+  ::dmi::Uuid* mutable_component_uuid();
+  void set_allocated_component_uuid(::dmi::Uuid* component_uuid);
+
+  // @@protoc_insertion_point(class_scope:dmi.DisableHWComponentRequest)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::internal::ArenaStringPtr component_name_;
+  ::dmi::Uuid* device_uuid_;
+  ::dmi::Uuid* component_uuid_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class DisableHWComponentResponse final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.DisableHWComponentResponse) */ {
+ public:
+  DisableHWComponentResponse();
+  virtual ~DisableHWComponentResponse();
+
+  DisableHWComponentResponse(const DisableHWComponentResponse& from);
+
+  inline DisableHWComponentResponse& operator=(const DisableHWComponentResponse& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  DisableHWComponentResponse(DisableHWComponentResponse&& from) noexcept
+    : DisableHWComponentResponse() {
+    *this = ::std::move(from);
+  }
+
+  inline DisableHWComponentResponse& operator=(DisableHWComponentResponse&& 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 DisableHWComponentResponse& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const DisableHWComponentResponse* internal_default_instance() {
+    return reinterpret_cast<const DisableHWComponentResponse*>(
+               &_DisableHWComponentResponse_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    30;
+
+  void Swap(DisableHWComponentResponse* other);
+  friend void swap(DisableHWComponentResponse& a, DisableHWComponentResponse& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline DisableHWComponentResponse* New() const final {
+    return CreateMaybeMessage<DisableHWComponentResponse>(nullptr);
+  }
+
+  DisableHWComponentResponse* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<DisableHWComponentResponse>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const DisableHWComponentResponse& from);
+  void MergeFrom(const DisableHWComponentResponse& 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(DisableHWComponentResponse* 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 DisableHWComponentResponse_Reason Reason;
+  static const Reason UNDEFINED_REASON =
+    DisableHWComponentResponse_Reason_UNDEFINED_REASON;
+  static const Reason UNKNOWN_DEVICE =
+    DisableHWComponentResponse_Reason_UNKNOWN_DEVICE;
+  static const Reason UNKNOWN_COMPONENT =
+    DisableHWComponentResponse_Reason_UNKNOWN_COMPONENT;
+  static const Reason INTERNAL_ERROR =
+    DisableHWComponentResponse_Reason_INTERNAL_ERROR;
+  static const Reason DEVICE_UNREACHABLE =
+    DisableHWComponentResponse_Reason_DEVICE_UNREACHABLE;
+  static const Reason DISABLE_UNSUPPORTED =
+    DisableHWComponentResponse_Reason_DISABLE_UNSUPPORTED;
+  static const Reason INVALID_PARAMS =
+    DisableHWComponentResponse_Reason_INVALID_PARAMS;
+  static inline bool Reason_IsValid(int value) {
+    return DisableHWComponentResponse_Reason_IsValid(value);
+  }
+  static const Reason Reason_MIN =
+    DisableHWComponentResponse_Reason_Reason_MIN;
+  static const Reason Reason_MAX =
+    DisableHWComponentResponse_Reason_Reason_MAX;
+  static const int Reason_ARRAYSIZE =
+    DisableHWComponentResponse_Reason_Reason_ARRAYSIZE;
+  static inline const ::google::protobuf::EnumDescriptor*
+  Reason_descriptor() {
+    return DisableHWComponentResponse_Reason_descriptor();
+  }
+  static inline const ::std::string& Reason_Name(Reason value) {
+    return DisableHWComponentResponse_Reason_Name(value);
+  }
+  static inline bool Reason_Parse(const ::std::string& name,
+      Reason* value) {
+    return DisableHWComponentResponse_Reason_Parse(name, value);
+  }
+
+  // accessors -------------------------------------------------------
+
+  // string reason_detail = 3;
+  void clear_reason_detail();
+  static const int kReasonDetailFieldNumber = 3;
+  const ::std::string& reason_detail() const;
+  void set_reason_detail(const ::std::string& value);
+  #if LANG_CXX11
+  void set_reason_detail(::std::string&& value);
+  #endif
+  void set_reason_detail(const char* value);
+  void set_reason_detail(const char* value, size_t size);
+  ::std::string* mutable_reason_detail();
+  ::std::string* release_reason_detail();
+  void set_allocated_reason_detail(::std::string* reason_detail);
+
+  // .dmi.Status status = 1;
+  void clear_status();
+  static const int kStatusFieldNumber = 1;
+  ::dmi::Status status() const;
+  void set_status(::dmi::Status value);
+
+  // .dmi.DisableHWComponentResponse.Reason reason = 2;
+  void clear_reason();
+  static const int kReasonFieldNumber = 2;
+  ::dmi::DisableHWComponentResponse_Reason reason() const;
+  void set_reason(::dmi::DisableHWComponentResponse_Reason value);
+
+  // @@protoc_insertion_point(class_scope:dmi.DisableHWComponentResponse)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::internal::ArenaStringPtr reason_detail_;
+  int status_;
+  int reason_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class ResetHWComponentRequest final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.ResetHWComponentRequest) */ {
+ public:
+  ResetHWComponentRequest();
+  virtual ~ResetHWComponentRequest();
+
+  ResetHWComponentRequest(const ResetHWComponentRequest& from);
+
+  inline ResetHWComponentRequest& operator=(const ResetHWComponentRequest& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  ResetHWComponentRequest(ResetHWComponentRequest&& from) noexcept
+    : ResetHWComponentRequest() {
+    *this = ::std::move(from);
+  }
+
+  inline ResetHWComponentRequest& operator=(ResetHWComponentRequest&& 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 ResetHWComponentRequest& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const ResetHWComponentRequest* internal_default_instance() {
+    return reinterpret_cast<const ResetHWComponentRequest*>(
+               &_ResetHWComponentRequest_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    31;
+
+  void Swap(ResetHWComponentRequest* other);
+  friend void swap(ResetHWComponentRequest& a, ResetHWComponentRequest& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline ResetHWComponentRequest* New() const final {
+    return CreateMaybeMessage<ResetHWComponentRequest>(nullptr);
+  }
+
+  ResetHWComponentRequest* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<ResetHWComponentRequest>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const ResetHWComponentRequest& from);
+  void MergeFrom(const ResetHWComponentRequest& 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(ResetHWComponentRequest* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // string component_name = 3;
+  void clear_component_name();
+  static const int kComponentNameFieldNumber = 3;
+  const ::std::string& component_name() const;
+  void set_component_name(const ::std::string& value);
+  #if LANG_CXX11
+  void set_component_name(::std::string&& value);
+  #endif
+  void set_component_name(const char* value);
+  void set_component_name(const char* value, size_t size);
+  ::std::string* mutable_component_name();
+  ::std::string* release_component_name();
+  void set_allocated_component_name(::std::string* component_name);
+
+  // .dmi.Uuid device_uuid = 1;
+  bool has_device_uuid() const;
+  void clear_device_uuid();
+  static const int kDeviceUuidFieldNumber = 1;
+  const ::dmi::Uuid& device_uuid() const;
+  ::dmi::Uuid* release_device_uuid();
+  ::dmi::Uuid* mutable_device_uuid();
+  void set_allocated_device_uuid(::dmi::Uuid* device_uuid);
+
+  // .dmi.Uuid component_uuid = 2;
+  bool has_component_uuid() const;
+  void clear_component_uuid();
+  static const int kComponentUuidFieldNumber = 2;
+  const ::dmi::Uuid& component_uuid() const;
+  ::dmi::Uuid* release_component_uuid();
+  ::dmi::Uuid* mutable_component_uuid();
+  void set_allocated_component_uuid(::dmi::Uuid* component_uuid);
+
+  // @@protoc_insertion_point(class_scope:dmi.ResetHWComponentRequest)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::internal::ArenaStringPtr component_name_;
+  ::dmi::Uuid* device_uuid_;
+  ::dmi::Uuid* component_uuid_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class ResetHWComponentResponse final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.ResetHWComponentResponse) */ {
+ public:
+  ResetHWComponentResponse();
+  virtual ~ResetHWComponentResponse();
+
+  ResetHWComponentResponse(const ResetHWComponentResponse& from);
+
+  inline ResetHWComponentResponse& operator=(const ResetHWComponentResponse& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  ResetHWComponentResponse(ResetHWComponentResponse&& from) noexcept
+    : ResetHWComponentResponse() {
+    *this = ::std::move(from);
+  }
+
+  inline ResetHWComponentResponse& operator=(ResetHWComponentResponse&& 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 ResetHWComponentResponse& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const ResetHWComponentResponse* internal_default_instance() {
+    return reinterpret_cast<const ResetHWComponentResponse*>(
+               &_ResetHWComponentResponse_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    32;
+
+  void Swap(ResetHWComponentResponse* other);
+  friend void swap(ResetHWComponentResponse& a, ResetHWComponentResponse& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline ResetHWComponentResponse* New() const final {
+    return CreateMaybeMessage<ResetHWComponentResponse>(nullptr);
+  }
+
+  ResetHWComponentResponse* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<ResetHWComponentResponse>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const ResetHWComponentResponse& from);
+  void MergeFrom(const ResetHWComponentResponse& 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(ResetHWComponentResponse* 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 ResetHWComponentResponse_Reason Reason;
+  static const Reason UNDEFINED_REASON =
+    ResetHWComponentResponse_Reason_UNDEFINED_REASON;
+  static const Reason UNKNOWN_DEVICE =
+    ResetHWComponentResponse_Reason_UNKNOWN_DEVICE;
+  static const Reason UNKNOWN_COMPONENT =
+    ResetHWComponentResponse_Reason_UNKNOWN_COMPONENT;
+  static const Reason INTERNAL_ERROR =
+    ResetHWComponentResponse_Reason_INTERNAL_ERROR;
+  static const Reason DEVICE_UNREACHABLE =
+    ResetHWComponentResponse_Reason_DEVICE_UNREACHABLE;
+  static const Reason RESET_UNSUPPORTED =
+    ResetHWComponentResponse_Reason_RESET_UNSUPPORTED;
+  static const Reason INVALID_PARAMS =
+    ResetHWComponentResponse_Reason_INVALID_PARAMS;
+  static inline bool Reason_IsValid(int value) {
+    return ResetHWComponentResponse_Reason_IsValid(value);
+  }
+  static const Reason Reason_MIN =
+    ResetHWComponentResponse_Reason_Reason_MIN;
+  static const Reason Reason_MAX =
+    ResetHWComponentResponse_Reason_Reason_MAX;
+  static const int Reason_ARRAYSIZE =
+    ResetHWComponentResponse_Reason_Reason_ARRAYSIZE;
+  static inline const ::google::protobuf::EnumDescriptor*
+  Reason_descriptor() {
+    return ResetHWComponentResponse_Reason_descriptor();
+  }
+  static inline const ::std::string& Reason_Name(Reason value) {
+    return ResetHWComponentResponse_Reason_Name(value);
+  }
+  static inline bool Reason_Parse(const ::std::string& name,
+      Reason* value) {
+    return ResetHWComponentResponse_Reason_Parse(name, value);
+  }
+
+  // accessors -------------------------------------------------------
+
+  // string reason_detail = 3;
+  void clear_reason_detail();
+  static const int kReasonDetailFieldNumber = 3;
+  const ::std::string& reason_detail() const;
+  void set_reason_detail(const ::std::string& value);
+  #if LANG_CXX11
+  void set_reason_detail(::std::string&& value);
+  #endif
+  void set_reason_detail(const char* value);
+  void set_reason_detail(const char* value, size_t size);
+  ::std::string* mutable_reason_detail();
+  ::std::string* release_reason_detail();
+  void set_allocated_reason_detail(::std::string* reason_detail);
+
+  // .dmi.Status status = 1;
+  void clear_status();
+  static const int kStatusFieldNumber = 1;
+  ::dmi::Status status() const;
+  void set_status(::dmi::Status value);
+
+  // .dmi.ResetHWComponentResponse.Reason reason = 2;
+  void clear_reason();
+  static const int kReasonFieldNumber = 2;
+  ::dmi::ResetHWComponentResponse_Reason reason() const;
+  void set_reason(::dmi::ResetHWComponentResponse_Reason value);
+
+  // @@protoc_insertion_point(class_scope:dmi.ResetHWComponentResponse)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::internal::ArenaStringPtr reason_detail_;
+  int status_;
+  int reason_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class EnableHWComponentRequest final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.EnableHWComponentRequest) */ {
+ public:
+  EnableHWComponentRequest();
+  virtual ~EnableHWComponentRequest();
+
+  EnableHWComponentRequest(const EnableHWComponentRequest& from);
+
+  inline EnableHWComponentRequest& operator=(const EnableHWComponentRequest& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  EnableHWComponentRequest(EnableHWComponentRequest&& from) noexcept
+    : EnableHWComponentRequest() {
+    *this = ::std::move(from);
+  }
+
+  inline EnableHWComponentRequest& operator=(EnableHWComponentRequest&& 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 EnableHWComponentRequest& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const EnableHWComponentRequest* internal_default_instance() {
+    return reinterpret_cast<const EnableHWComponentRequest*>(
+               &_EnableHWComponentRequest_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    33;
+
+  void Swap(EnableHWComponentRequest* other);
+  friend void swap(EnableHWComponentRequest& a, EnableHWComponentRequest& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline EnableHWComponentRequest* New() const final {
+    return CreateMaybeMessage<EnableHWComponentRequest>(nullptr);
+  }
+
+  EnableHWComponentRequest* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<EnableHWComponentRequest>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const EnableHWComponentRequest& from);
+  void MergeFrom(const EnableHWComponentRequest& 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(EnableHWComponentRequest* 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 ----------------------------------------------------
+
+  // accessors -------------------------------------------------------
+
+  // string component_name = 3;
+  void clear_component_name();
+  static const int kComponentNameFieldNumber = 3;
+  const ::std::string& component_name() const;
+  void set_component_name(const ::std::string& value);
+  #if LANG_CXX11
+  void set_component_name(::std::string&& value);
+  #endif
+  void set_component_name(const char* value);
+  void set_component_name(const char* value, size_t size);
+  ::std::string* mutable_component_name();
+  ::std::string* release_component_name();
+  void set_allocated_component_name(::std::string* component_name);
+
+  // .dmi.Uuid device_uuid = 1;
+  bool has_device_uuid() const;
+  void clear_device_uuid();
+  static const int kDeviceUuidFieldNumber = 1;
+  const ::dmi::Uuid& device_uuid() const;
+  ::dmi::Uuid* release_device_uuid();
+  ::dmi::Uuid* mutable_device_uuid();
+  void set_allocated_device_uuid(::dmi::Uuid* device_uuid);
+
+  // .dmi.Uuid component_uuid = 2;
+  bool has_component_uuid() const;
+  void clear_component_uuid();
+  static const int kComponentUuidFieldNumber = 2;
+  const ::dmi::Uuid& component_uuid() const;
+  ::dmi::Uuid* release_component_uuid();
+  ::dmi::Uuid* mutable_component_uuid();
+  void set_allocated_component_uuid(::dmi::Uuid* component_uuid);
+
+  // @@protoc_insertion_point(class_scope:dmi.EnableHWComponentRequest)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::internal::ArenaStringPtr component_name_;
+  ::dmi::Uuid* device_uuid_;
+  ::dmi::Uuid* component_uuid_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
+};
+// -------------------------------------------------------------------
+
+class EnableHWComponentResponse final :
+    public ::google::protobuf::Message /* @@protoc_insertion_point(class_definition:dmi.EnableHWComponentResponse) */ {
+ public:
+  EnableHWComponentResponse();
+  virtual ~EnableHWComponentResponse();
+
+  EnableHWComponentResponse(const EnableHWComponentResponse& from);
+
+  inline EnableHWComponentResponse& operator=(const EnableHWComponentResponse& from) {
+    CopyFrom(from);
+    return *this;
+  }
+  #if LANG_CXX11
+  EnableHWComponentResponse(EnableHWComponentResponse&& from) noexcept
+    : EnableHWComponentResponse() {
+    *this = ::std::move(from);
+  }
+
+  inline EnableHWComponentResponse& operator=(EnableHWComponentResponse&& 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 EnableHWComponentResponse& default_instance();
+
+  static void InitAsDefaultInstance();  // FOR INTERNAL USE ONLY
+  static inline const EnableHWComponentResponse* internal_default_instance() {
+    return reinterpret_cast<const EnableHWComponentResponse*>(
+               &_EnableHWComponentResponse_default_instance_);
+  }
+  static constexpr int kIndexInFileMessages =
+    34;
+
+  void Swap(EnableHWComponentResponse* other);
+  friend void swap(EnableHWComponentResponse& a, EnableHWComponentResponse& b) {
+    a.Swap(&b);
+  }
+
+  // implements Message ----------------------------------------------
+
+  inline EnableHWComponentResponse* New() const final {
+    return CreateMaybeMessage<EnableHWComponentResponse>(nullptr);
+  }
+
+  EnableHWComponentResponse* New(::google::protobuf::Arena* arena) const final {
+    return CreateMaybeMessage<EnableHWComponentResponse>(arena);
+  }
+  void CopyFrom(const ::google::protobuf::Message& from) final;
+  void MergeFrom(const ::google::protobuf::Message& from) final;
+  void CopyFrom(const EnableHWComponentResponse& from);
+  void MergeFrom(const EnableHWComponentResponse& 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(EnableHWComponentResponse* 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 EnableHWComponentResponse_Reason Reason;
+  static const Reason UNDEFINED_REASON =
+    EnableHWComponentResponse_Reason_UNDEFINED_REASON;
+  static const Reason UNKNOWN_DEVICE =
+    EnableHWComponentResponse_Reason_UNKNOWN_DEVICE;
+  static const Reason UNKNOWN_COMPONENT =
+    EnableHWComponentResponse_Reason_UNKNOWN_COMPONENT;
+  static const Reason INTERNAL_ERROR =
+    EnableHWComponentResponse_Reason_INTERNAL_ERROR;
+  static const Reason DEVICE_UNREACHABLE =
+    EnableHWComponentResponse_Reason_DEVICE_UNREACHABLE;
+  static const Reason ENABLE_UNSUPPORTED =
+    EnableHWComponentResponse_Reason_ENABLE_UNSUPPORTED;
+  static const Reason INVALID_PARAMS =
+    EnableHWComponentResponse_Reason_INVALID_PARAMS;
+  static inline bool Reason_IsValid(int value) {
+    return EnableHWComponentResponse_Reason_IsValid(value);
+  }
+  static const Reason Reason_MIN =
+    EnableHWComponentResponse_Reason_Reason_MIN;
+  static const Reason Reason_MAX =
+    EnableHWComponentResponse_Reason_Reason_MAX;
+  static const int Reason_ARRAYSIZE =
+    EnableHWComponentResponse_Reason_Reason_ARRAYSIZE;
+  static inline const ::google::protobuf::EnumDescriptor*
+  Reason_descriptor() {
+    return EnableHWComponentResponse_Reason_descriptor();
+  }
+  static inline const ::std::string& Reason_Name(Reason value) {
+    return EnableHWComponentResponse_Reason_Name(value);
+  }
+  static inline bool Reason_Parse(const ::std::string& name,
+      Reason* value) {
+    return EnableHWComponentResponse_Reason_Parse(name, value);
+  }
+
+  // accessors -------------------------------------------------------
+
+  // string reason_detail = 3;
+  void clear_reason_detail();
+  static const int kReasonDetailFieldNumber = 3;
+  const ::std::string& reason_detail() const;
+  void set_reason_detail(const ::std::string& value);
+  #if LANG_CXX11
+  void set_reason_detail(::std::string&& value);
+  #endif
+  void set_reason_detail(const char* value);
+  void set_reason_detail(const char* value, size_t size);
+  ::std::string* mutable_reason_detail();
+  ::std::string* release_reason_detail();
+  void set_allocated_reason_detail(::std::string* reason_detail);
+
+  // .dmi.Status status = 1;
+  void clear_status();
+  static const int kStatusFieldNumber = 1;
+  ::dmi::Status status() const;
+  void set_status(::dmi::Status value);
+
+  // .dmi.EnableHWComponentResponse.Reason reason = 2;
+  void clear_reason();
+  static const int kReasonFieldNumber = 2;
+  ::dmi::EnableHWComponentResponse_Reason reason() const;
+  void set_reason(::dmi::EnableHWComponentResponse_Reason value);
+
+  // @@protoc_insertion_point(class_scope:dmi.EnableHWComponentResponse)
+ private:
+  class HasBitSetters;
+
+  ::google::protobuf::internal::InternalMetadataWithArena _internal_metadata_;
+  ::google::protobuf::internal::ArenaStringPtr reason_detail_;
+  int status_;
+  int reason_;
+  mutable ::google::protobuf::internal::CachedSize _cached_size_;
+  friend struct ::TableStruct_dmi_2fhw_5fmanagement_5fservice_2eproto;
+};
 // ===================================================================
 
 
@@ -7575,6 +8607,702 @@
   // @@protoc_insertion_point(field_set_allocated:dmi.RebootDeviceResponse.reason_detail)
 }
 
+// -------------------------------------------------------------------
+
+// DisableHWComponentRequest
+
+// .dmi.Uuid device_uuid = 1;
+inline bool DisableHWComponentRequest::has_device_uuid() const {
+  return this != internal_default_instance() && device_uuid_ != nullptr;
+}
+inline const ::dmi::Uuid& DisableHWComponentRequest::device_uuid() const {
+  const ::dmi::Uuid* p = device_uuid_;
+  // @@protoc_insertion_point(field_get:dmi.DisableHWComponentRequest.device_uuid)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::Uuid*>(
+      &::dmi::_Uuid_default_instance_);
+}
+inline ::dmi::Uuid* DisableHWComponentRequest::release_device_uuid() {
+  // @@protoc_insertion_point(field_release:dmi.DisableHWComponentRequest.device_uuid)
+  
+  ::dmi::Uuid* temp = device_uuid_;
+  device_uuid_ = nullptr;
+  return temp;
+}
+inline ::dmi::Uuid* DisableHWComponentRequest::mutable_device_uuid() {
+  
+  if (device_uuid_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::Uuid>(GetArenaNoVirtual());
+    device_uuid_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.DisableHWComponentRequest.device_uuid)
+  return device_uuid_;
+}
+inline void DisableHWComponentRequest::set_allocated_device_uuid(::dmi::Uuid* device_uuid) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete reinterpret_cast< ::google::protobuf::MessageLite*>(device_uuid_);
+  }
+  if (device_uuid) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      device_uuid = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, device_uuid, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  device_uuid_ = device_uuid;
+  // @@protoc_insertion_point(field_set_allocated:dmi.DisableHWComponentRequest.device_uuid)
+}
+
+// .dmi.Uuid component_uuid = 2;
+inline bool DisableHWComponentRequest::has_component_uuid() const {
+  return this != internal_default_instance() && component_uuid_ != nullptr;
+}
+inline const ::dmi::Uuid& DisableHWComponentRequest::component_uuid() const {
+  const ::dmi::Uuid* p = component_uuid_;
+  // @@protoc_insertion_point(field_get:dmi.DisableHWComponentRequest.component_uuid)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::Uuid*>(
+      &::dmi::_Uuid_default_instance_);
+}
+inline ::dmi::Uuid* DisableHWComponentRequest::release_component_uuid() {
+  // @@protoc_insertion_point(field_release:dmi.DisableHWComponentRequest.component_uuid)
+  
+  ::dmi::Uuid* temp = component_uuid_;
+  component_uuid_ = nullptr;
+  return temp;
+}
+inline ::dmi::Uuid* DisableHWComponentRequest::mutable_component_uuid() {
+  
+  if (component_uuid_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::Uuid>(GetArenaNoVirtual());
+    component_uuid_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.DisableHWComponentRequest.component_uuid)
+  return component_uuid_;
+}
+inline void DisableHWComponentRequest::set_allocated_component_uuid(::dmi::Uuid* component_uuid) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete reinterpret_cast< ::google::protobuf::MessageLite*>(component_uuid_);
+  }
+  if (component_uuid) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      component_uuid = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, component_uuid, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  component_uuid_ = component_uuid;
+  // @@protoc_insertion_point(field_set_allocated:dmi.DisableHWComponentRequest.component_uuid)
+}
+
+// string component_name = 3;
+inline void DisableHWComponentRequest::clear_component_name() {
+  component_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& DisableHWComponentRequest::component_name() const {
+  // @@protoc_insertion_point(field_get:dmi.DisableHWComponentRequest.component_name)
+  return component_name_.GetNoArena();
+}
+inline void DisableHWComponentRequest::set_component_name(const ::std::string& value) {
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.DisableHWComponentRequest.component_name)
+}
+#if LANG_CXX11
+inline void DisableHWComponentRequest::set_component_name(::std::string&& value) {
+  
+  component_name_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.DisableHWComponentRequest.component_name)
+}
+#endif
+inline void DisableHWComponentRequest::set_component_name(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.DisableHWComponentRequest.component_name)
+}
+inline void DisableHWComponentRequest::set_component_name(const char* value, size_t size) {
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.DisableHWComponentRequest.component_name)
+}
+inline ::std::string* DisableHWComponentRequest::mutable_component_name() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.DisableHWComponentRequest.component_name)
+  return component_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* DisableHWComponentRequest::release_component_name() {
+  // @@protoc_insertion_point(field_release:dmi.DisableHWComponentRequest.component_name)
+  
+  return component_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void DisableHWComponentRequest::set_allocated_component_name(::std::string* component_name) {
+  if (component_name != nullptr) {
+    
+  } else {
+    
+  }
+  component_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), component_name);
+  // @@protoc_insertion_point(field_set_allocated:dmi.DisableHWComponentRequest.component_name)
+}
+
+// -------------------------------------------------------------------
+
+// DisableHWComponentResponse
+
+// .dmi.Status status = 1;
+inline void DisableHWComponentResponse::clear_status() {
+  status_ = 0;
+}
+inline ::dmi::Status DisableHWComponentResponse::status() const {
+  // @@protoc_insertion_point(field_get:dmi.DisableHWComponentResponse.status)
+  return static_cast< ::dmi::Status >(status_);
+}
+inline void DisableHWComponentResponse::set_status(::dmi::Status value) {
+  
+  status_ = value;
+  // @@protoc_insertion_point(field_set:dmi.DisableHWComponentResponse.status)
+}
+
+// .dmi.DisableHWComponentResponse.Reason reason = 2;
+inline void DisableHWComponentResponse::clear_reason() {
+  reason_ = 0;
+}
+inline ::dmi::DisableHWComponentResponse_Reason DisableHWComponentResponse::reason() const {
+  // @@protoc_insertion_point(field_get:dmi.DisableHWComponentResponse.reason)
+  return static_cast< ::dmi::DisableHWComponentResponse_Reason >(reason_);
+}
+inline void DisableHWComponentResponse::set_reason(::dmi::DisableHWComponentResponse_Reason value) {
+  
+  reason_ = value;
+  // @@protoc_insertion_point(field_set:dmi.DisableHWComponentResponse.reason)
+}
+
+// string reason_detail = 3;
+inline void DisableHWComponentResponse::clear_reason_detail() {
+  reason_detail_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& DisableHWComponentResponse::reason_detail() const {
+  // @@protoc_insertion_point(field_get:dmi.DisableHWComponentResponse.reason_detail)
+  return reason_detail_.GetNoArena();
+}
+inline void DisableHWComponentResponse::set_reason_detail(const ::std::string& value) {
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.DisableHWComponentResponse.reason_detail)
+}
+#if LANG_CXX11
+inline void DisableHWComponentResponse::set_reason_detail(::std::string&& value) {
+  
+  reason_detail_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.DisableHWComponentResponse.reason_detail)
+}
+#endif
+inline void DisableHWComponentResponse::set_reason_detail(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.DisableHWComponentResponse.reason_detail)
+}
+inline void DisableHWComponentResponse::set_reason_detail(const char* value, size_t size) {
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.DisableHWComponentResponse.reason_detail)
+}
+inline ::std::string* DisableHWComponentResponse::mutable_reason_detail() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.DisableHWComponentResponse.reason_detail)
+  return reason_detail_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* DisableHWComponentResponse::release_reason_detail() {
+  // @@protoc_insertion_point(field_release:dmi.DisableHWComponentResponse.reason_detail)
+  
+  return reason_detail_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void DisableHWComponentResponse::set_allocated_reason_detail(::std::string* reason_detail) {
+  if (reason_detail != nullptr) {
+    
+  } else {
+    
+  }
+  reason_detail_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), reason_detail);
+  // @@protoc_insertion_point(field_set_allocated:dmi.DisableHWComponentResponse.reason_detail)
+}
+
+// -------------------------------------------------------------------
+
+// ResetHWComponentRequest
+
+// .dmi.Uuid device_uuid = 1;
+inline bool ResetHWComponentRequest::has_device_uuid() const {
+  return this != internal_default_instance() && device_uuid_ != nullptr;
+}
+inline const ::dmi::Uuid& ResetHWComponentRequest::device_uuid() const {
+  const ::dmi::Uuid* p = device_uuid_;
+  // @@protoc_insertion_point(field_get:dmi.ResetHWComponentRequest.device_uuid)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::Uuid*>(
+      &::dmi::_Uuid_default_instance_);
+}
+inline ::dmi::Uuid* ResetHWComponentRequest::release_device_uuid() {
+  // @@protoc_insertion_point(field_release:dmi.ResetHWComponentRequest.device_uuid)
+  
+  ::dmi::Uuid* temp = device_uuid_;
+  device_uuid_ = nullptr;
+  return temp;
+}
+inline ::dmi::Uuid* ResetHWComponentRequest::mutable_device_uuid() {
+  
+  if (device_uuid_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::Uuid>(GetArenaNoVirtual());
+    device_uuid_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.ResetHWComponentRequest.device_uuid)
+  return device_uuid_;
+}
+inline void ResetHWComponentRequest::set_allocated_device_uuid(::dmi::Uuid* device_uuid) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete reinterpret_cast< ::google::protobuf::MessageLite*>(device_uuid_);
+  }
+  if (device_uuid) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      device_uuid = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, device_uuid, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  device_uuid_ = device_uuid;
+  // @@protoc_insertion_point(field_set_allocated:dmi.ResetHWComponentRequest.device_uuid)
+}
+
+// .dmi.Uuid component_uuid = 2;
+inline bool ResetHWComponentRequest::has_component_uuid() const {
+  return this != internal_default_instance() && component_uuid_ != nullptr;
+}
+inline const ::dmi::Uuid& ResetHWComponentRequest::component_uuid() const {
+  const ::dmi::Uuid* p = component_uuid_;
+  // @@protoc_insertion_point(field_get:dmi.ResetHWComponentRequest.component_uuid)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::Uuid*>(
+      &::dmi::_Uuid_default_instance_);
+}
+inline ::dmi::Uuid* ResetHWComponentRequest::release_component_uuid() {
+  // @@protoc_insertion_point(field_release:dmi.ResetHWComponentRequest.component_uuid)
+  
+  ::dmi::Uuid* temp = component_uuid_;
+  component_uuid_ = nullptr;
+  return temp;
+}
+inline ::dmi::Uuid* ResetHWComponentRequest::mutable_component_uuid() {
+  
+  if (component_uuid_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::Uuid>(GetArenaNoVirtual());
+    component_uuid_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.ResetHWComponentRequest.component_uuid)
+  return component_uuid_;
+}
+inline void ResetHWComponentRequest::set_allocated_component_uuid(::dmi::Uuid* component_uuid) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete reinterpret_cast< ::google::protobuf::MessageLite*>(component_uuid_);
+  }
+  if (component_uuid) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      component_uuid = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, component_uuid, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  component_uuid_ = component_uuid;
+  // @@protoc_insertion_point(field_set_allocated:dmi.ResetHWComponentRequest.component_uuid)
+}
+
+// string component_name = 3;
+inline void ResetHWComponentRequest::clear_component_name() {
+  component_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& ResetHWComponentRequest::component_name() const {
+  // @@protoc_insertion_point(field_get:dmi.ResetHWComponentRequest.component_name)
+  return component_name_.GetNoArena();
+}
+inline void ResetHWComponentRequest::set_component_name(const ::std::string& value) {
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.ResetHWComponentRequest.component_name)
+}
+#if LANG_CXX11
+inline void ResetHWComponentRequest::set_component_name(::std::string&& value) {
+  
+  component_name_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.ResetHWComponentRequest.component_name)
+}
+#endif
+inline void ResetHWComponentRequest::set_component_name(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.ResetHWComponentRequest.component_name)
+}
+inline void ResetHWComponentRequest::set_component_name(const char* value, size_t size) {
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.ResetHWComponentRequest.component_name)
+}
+inline ::std::string* ResetHWComponentRequest::mutable_component_name() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.ResetHWComponentRequest.component_name)
+  return component_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* ResetHWComponentRequest::release_component_name() {
+  // @@protoc_insertion_point(field_release:dmi.ResetHWComponentRequest.component_name)
+  
+  return component_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void ResetHWComponentRequest::set_allocated_component_name(::std::string* component_name) {
+  if (component_name != nullptr) {
+    
+  } else {
+    
+  }
+  component_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), component_name);
+  // @@protoc_insertion_point(field_set_allocated:dmi.ResetHWComponentRequest.component_name)
+}
+
+// -------------------------------------------------------------------
+
+// ResetHWComponentResponse
+
+// .dmi.Status status = 1;
+inline void ResetHWComponentResponse::clear_status() {
+  status_ = 0;
+}
+inline ::dmi::Status ResetHWComponentResponse::status() const {
+  // @@protoc_insertion_point(field_get:dmi.ResetHWComponentResponse.status)
+  return static_cast< ::dmi::Status >(status_);
+}
+inline void ResetHWComponentResponse::set_status(::dmi::Status value) {
+  
+  status_ = value;
+  // @@protoc_insertion_point(field_set:dmi.ResetHWComponentResponse.status)
+}
+
+// .dmi.ResetHWComponentResponse.Reason reason = 2;
+inline void ResetHWComponentResponse::clear_reason() {
+  reason_ = 0;
+}
+inline ::dmi::ResetHWComponentResponse_Reason ResetHWComponentResponse::reason() const {
+  // @@protoc_insertion_point(field_get:dmi.ResetHWComponentResponse.reason)
+  return static_cast< ::dmi::ResetHWComponentResponse_Reason >(reason_);
+}
+inline void ResetHWComponentResponse::set_reason(::dmi::ResetHWComponentResponse_Reason value) {
+  
+  reason_ = value;
+  // @@protoc_insertion_point(field_set:dmi.ResetHWComponentResponse.reason)
+}
+
+// string reason_detail = 3;
+inline void ResetHWComponentResponse::clear_reason_detail() {
+  reason_detail_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& ResetHWComponentResponse::reason_detail() const {
+  // @@protoc_insertion_point(field_get:dmi.ResetHWComponentResponse.reason_detail)
+  return reason_detail_.GetNoArena();
+}
+inline void ResetHWComponentResponse::set_reason_detail(const ::std::string& value) {
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.ResetHWComponentResponse.reason_detail)
+}
+#if LANG_CXX11
+inline void ResetHWComponentResponse::set_reason_detail(::std::string&& value) {
+  
+  reason_detail_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.ResetHWComponentResponse.reason_detail)
+}
+#endif
+inline void ResetHWComponentResponse::set_reason_detail(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.ResetHWComponentResponse.reason_detail)
+}
+inline void ResetHWComponentResponse::set_reason_detail(const char* value, size_t size) {
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.ResetHWComponentResponse.reason_detail)
+}
+inline ::std::string* ResetHWComponentResponse::mutable_reason_detail() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.ResetHWComponentResponse.reason_detail)
+  return reason_detail_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* ResetHWComponentResponse::release_reason_detail() {
+  // @@protoc_insertion_point(field_release:dmi.ResetHWComponentResponse.reason_detail)
+  
+  return reason_detail_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void ResetHWComponentResponse::set_allocated_reason_detail(::std::string* reason_detail) {
+  if (reason_detail != nullptr) {
+    
+  } else {
+    
+  }
+  reason_detail_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), reason_detail);
+  // @@protoc_insertion_point(field_set_allocated:dmi.ResetHWComponentResponse.reason_detail)
+}
+
+// -------------------------------------------------------------------
+
+// EnableHWComponentRequest
+
+// .dmi.Uuid device_uuid = 1;
+inline bool EnableHWComponentRequest::has_device_uuid() const {
+  return this != internal_default_instance() && device_uuid_ != nullptr;
+}
+inline const ::dmi::Uuid& EnableHWComponentRequest::device_uuid() const {
+  const ::dmi::Uuid* p = device_uuid_;
+  // @@protoc_insertion_point(field_get:dmi.EnableHWComponentRequest.device_uuid)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::Uuid*>(
+      &::dmi::_Uuid_default_instance_);
+}
+inline ::dmi::Uuid* EnableHWComponentRequest::release_device_uuid() {
+  // @@protoc_insertion_point(field_release:dmi.EnableHWComponentRequest.device_uuid)
+  
+  ::dmi::Uuid* temp = device_uuid_;
+  device_uuid_ = nullptr;
+  return temp;
+}
+inline ::dmi::Uuid* EnableHWComponentRequest::mutable_device_uuid() {
+  
+  if (device_uuid_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::Uuid>(GetArenaNoVirtual());
+    device_uuid_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.EnableHWComponentRequest.device_uuid)
+  return device_uuid_;
+}
+inline void EnableHWComponentRequest::set_allocated_device_uuid(::dmi::Uuid* device_uuid) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete reinterpret_cast< ::google::protobuf::MessageLite*>(device_uuid_);
+  }
+  if (device_uuid) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      device_uuid = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, device_uuid, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  device_uuid_ = device_uuid;
+  // @@protoc_insertion_point(field_set_allocated:dmi.EnableHWComponentRequest.device_uuid)
+}
+
+// .dmi.Uuid component_uuid = 2;
+inline bool EnableHWComponentRequest::has_component_uuid() const {
+  return this != internal_default_instance() && component_uuid_ != nullptr;
+}
+inline const ::dmi::Uuid& EnableHWComponentRequest::component_uuid() const {
+  const ::dmi::Uuid* p = component_uuid_;
+  // @@protoc_insertion_point(field_get:dmi.EnableHWComponentRequest.component_uuid)
+  return p != nullptr ? *p : *reinterpret_cast<const ::dmi::Uuid*>(
+      &::dmi::_Uuid_default_instance_);
+}
+inline ::dmi::Uuid* EnableHWComponentRequest::release_component_uuid() {
+  // @@protoc_insertion_point(field_release:dmi.EnableHWComponentRequest.component_uuid)
+  
+  ::dmi::Uuid* temp = component_uuid_;
+  component_uuid_ = nullptr;
+  return temp;
+}
+inline ::dmi::Uuid* EnableHWComponentRequest::mutable_component_uuid() {
+  
+  if (component_uuid_ == nullptr) {
+    auto* p = CreateMaybeMessage<::dmi::Uuid>(GetArenaNoVirtual());
+    component_uuid_ = p;
+  }
+  // @@protoc_insertion_point(field_mutable:dmi.EnableHWComponentRequest.component_uuid)
+  return component_uuid_;
+}
+inline void EnableHWComponentRequest::set_allocated_component_uuid(::dmi::Uuid* component_uuid) {
+  ::google::protobuf::Arena* message_arena = GetArenaNoVirtual();
+  if (message_arena == nullptr) {
+    delete reinterpret_cast< ::google::protobuf::MessageLite*>(component_uuid_);
+  }
+  if (component_uuid) {
+    ::google::protobuf::Arena* submessage_arena = nullptr;
+    if (message_arena != submessage_arena) {
+      component_uuid = ::google::protobuf::internal::GetOwnedMessage(
+          message_arena, component_uuid, submessage_arena);
+    }
+    
+  } else {
+    
+  }
+  component_uuid_ = component_uuid;
+  // @@protoc_insertion_point(field_set_allocated:dmi.EnableHWComponentRequest.component_uuid)
+}
+
+// string component_name = 3;
+inline void EnableHWComponentRequest::clear_component_name() {
+  component_name_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& EnableHWComponentRequest::component_name() const {
+  // @@protoc_insertion_point(field_get:dmi.EnableHWComponentRequest.component_name)
+  return component_name_.GetNoArena();
+}
+inline void EnableHWComponentRequest::set_component_name(const ::std::string& value) {
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.EnableHWComponentRequest.component_name)
+}
+#if LANG_CXX11
+inline void EnableHWComponentRequest::set_component_name(::std::string&& value) {
+  
+  component_name_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.EnableHWComponentRequest.component_name)
+}
+#endif
+inline void EnableHWComponentRequest::set_component_name(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.EnableHWComponentRequest.component_name)
+}
+inline void EnableHWComponentRequest::set_component_name(const char* value, size_t size) {
+  
+  component_name_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.EnableHWComponentRequest.component_name)
+}
+inline ::std::string* EnableHWComponentRequest::mutable_component_name() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.EnableHWComponentRequest.component_name)
+  return component_name_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* EnableHWComponentRequest::release_component_name() {
+  // @@protoc_insertion_point(field_release:dmi.EnableHWComponentRequest.component_name)
+  
+  return component_name_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void EnableHWComponentRequest::set_allocated_component_name(::std::string* component_name) {
+  if (component_name != nullptr) {
+    
+  } else {
+    
+  }
+  component_name_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), component_name);
+  // @@protoc_insertion_point(field_set_allocated:dmi.EnableHWComponentRequest.component_name)
+}
+
+// -------------------------------------------------------------------
+
+// EnableHWComponentResponse
+
+// .dmi.Status status = 1;
+inline void EnableHWComponentResponse::clear_status() {
+  status_ = 0;
+}
+inline ::dmi::Status EnableHWComponentResponse::status() const {
+  // @@protoc_insertion_point(field_get:dmi.EnableHWComponentResponse.status)
+  return static_cast< ::dmi::Status >(status_);
+}
+inline void EnableHWComponentResponse::set_status(::dmi::Status value) {
+  
+  status_ = value;
+  // @@protoc_insertion_point(field_set:dmi.EnableHWComponentResponse.status)
+}
+
+// .dmi.EnableHWComponentResponse.Reason reason = 2;
+inline void EnableHWComponentResponse::clear_reason() {
+  reason_ = 0;
+}
+inline ::dmi::EnableHWComponentResponse_Reason EnableHWComponentResponse::reason() const {
+  // @@protoc_insertion_point(field_get:dmi.EnableHWComponentResponse.reason)
+  return static_cast< ::dmi::EnableHWComponentResponse_Reason >(reason_);
+}
+inline void EnableHWComponentResponse::set_reason(::dmi::EnableHWComponentResponse_Reason value) {
+  
+  reason_ = value;
+  // @@protoc_insertion_point(field_set:dmi.EnableHWComponentResponse.reason)
+}
+
+// string reason_detail = 3;
+inline void EnableHWComponentResponse::clear_reason_detail() {
+  reason_detail_.ClearToEmptyNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline const ::std::string& EnableHWComponentResponse::reason_detail() const {
+  // @@protoc_insertion_point(field_get:dmi.EnableHWComponentResponse.reason_detail)
+  return reason_detail_.GetNoArena();
+}
+inline void EnableHWComponentResponse::set_reason_detail(const ::std::string& value) {
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), value);
+  // @@protoc_insertion_point(field_set:dmi.EnableHWComponentResponse.reason_detail)
+}
+#if LANG_CXX11
+inline void EnableHWComponentResponse::set_reason_detail(::std::string&& value) {
+  
+  reason_detail_.SetNoArena(
+    &::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::move(value));
+  // @@protoc_insertion_point(field_set_rvalue:dmi.EnableHWComponentResponse.reason_detail)
+}
+#endif
+inline void EnableHWComponentResponse::set_reason_detail(const char* value) {
+  GOOGLE_DCHECK(value != nullptr);
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), ::std::string(value));
+  // @@protoc_insertion_point(field_set_char:dmi.EnableHWComponentResponse.reason_detail)
+}
+inline void EnableHWComponentResponse::set_reason_detail(const char* value, size_t size) {
+  
+  reason_detail_.SetNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(),
+      ::std::string(reinterpret_cast<const char*>(value), size));
+  // @@protoc_insertion_point(field_set_pointer:dmi.EnableHWComponentResponse.reason_detail)
+}
+inline ::std::string* EnableHWComponentResponse::mutable_reason_detail() {
+  
+  // @@protoc_insertion_point(field_mutable:dmi.EnableHWComponentResponse.reason_detail)
+  return reason_detail_.MutableNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline ::std::string* EnableHWComponentResponse::release_reason_detail() {
+  // @@protoc_insertion_point(field_release:dmi.EnableHWComponentResponse.reason_detail)
+  
+  return reason_detail_.ReleaseNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited());
+}
+inline void EnableHWComponentResponse::set_allocated_reason_detail(::std::string* reason_detail) {
+  if (reason_detail != nullptr) {
+    
+  } else {
+    
+  }
+  reason_detail_.SetAllocatedNoArena(&::google::protobuf::internal::GetEmptyStringAlreadyInited(), reason_detail);
+  // @@protoc_insertion_point(field_set_allocated:dmi.EnableHWComponentResponse.reason_detail)
+}
+
 #ifdef __GNUC__
   #pragma GCC diagnostic pop
 #endif  // __GNUC__
@@ -7634,6 +9362,18 @@
 
 // -------------------------------------------------------------------
 
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
+// -------------------------------------------------------------------
+
 
 // @@protoc_insertion_point(namespace_scope)
 
@@ -7712,6 +9452,21 @@
 inline const EnumDescriptor* GetEnumDescriptor< ::dmi::RebootDeviceResponse_Reason>() {
   return ::dmi::RebootDeviceResponse_Reason_descriptor();
 }
+template <> struct is_proto_enum< ::dmi::DisableHWComponentResponse_Reason> : ::std::true_type {};
+template <>
+inline const EnumDescriptor* GetEnumDescriptor< ::dmi::DisableHWComponentResponse_Reason>() {
+  return ::dmi::DisableHWComponentResponse_Reason_descriptor();
+}
+template <> struct is_proto_enum< ::dmi::ResetHWComponentResponse_Reason> : ::std::true_type {};
+template <>
+inline const EnumDescriptor* GetEnumDescriptor< ::dmi::ResetHWComponentResponse_Reason>() {
+  return ::dmi::ResetHWComponentResponse_Reason_descriptor();
+}
+template <> struct is_proto_enum< ::dmi::EnableHWComponentResponse_Reason> : ::std::true_type {};
+template <>
+inline const EnumDescriptor* GetEnumDescriptor< ::dmi::EnableHWComponentResponse_Reason>() {
+  return ::dmi::EnableHWComponentResponse_Reason_descriptor();
+}
 
 }  // namespace protobuf
 }  // namespace google
diff --git a/dmi.pb b/dmi.pb
index 406ccdd..db36a67 100644
--- a/dmi.pb
+++ b/dmi.pb
Binary files differ
diff --git a/docs/EventsMetrics.md b/docs/EventsMetrics.md
index 443c85b..84c85ca 100644
--- a/docs/EventsMetrics.md
+++ b/docs/EventsMetrics.md
@@ -1,16 +1,17 @@
 # Events and Metrics
 
-The events and periodic metrics are asynchronously sent out by implementations of a Device Manager. A Device Manager implementing this interface should write these to a kafka bus.
+The events and periodic metrics are asynchronously sent out by implementations of a Device Manager. A Device Manager implementing this interface should write these to a Kafka bus.
 
-Kafka has been chosen as a means to export from the device manager as it is suitable for handling asynchronous events. Persistence for the events and metrics can be easily achieved using kafka. Moreover kafka gives the flexibilites of handling and processing of the events and metrics by different/mulitple north-bound components/processes. Implementations could choose to have different services (with potentially multiple instances) handling the events and metrics.
+Kafka has been chosen as a means to export from the device manager as it is suitable for handling asynchronous events. Persistence for the events and metrics can be easily achieved using Kafka. Moreover, Kafka gives the flexibility of handling and processing the events and metrics by different/multiple north-bound components/processes. Implementations could choose to have different services (with potentially multiple instances) handling the events and metrics.
 
 ![Events and Metrics](images/events_metrics.png "Events and Metrics flow")
 
-The kafka topics to which these are written should be configurable at startup of the components, so that different deployments have the flexibility of choosing those.
-The recomendation is to use **dm.events** for the events and **dm.metrics** for the metrics as the names of the kafka topics.
+The Kafka topics to which these are written should be configurable at startup of the components, so that different deployments have the flexibility of choosing those.
+The recommendation is to use **dm.events** for the events and **dm.metrics** for the metrics as the names of the Kafka topics.
 
-The two protobuf messages which would be used for this are:
-``` protobuf
+The two protobuf messages which are used for this are:
+
+```protobuf
 message Metric {
     MetricNames metric_id = 1;
     MetricMetaData metric_metadata = 2;
@@ -25,8 +26,31 @@
     ThresholdInformation threshold_info = 4;
     // Any additional info regarding the event
     string add_info = 5;
+    // For component state change events, conveys the old and new states
+    StateChangeInfo state_change_info = 6;
 }
 ```
-Note: The on-demand metrics query using the API `GetMetric` would be passed back over GRPC and not over the kafka bus.
 
-The device/device manager implementations shall persist the active events across the device reboot. On the device reboot, the alarms which are no longer active shall be cleared.
+For state change events (such as `EVENT_COMPONENT_ADMIN_STATE_CHANGED`, `EVENT_COMPONENT_OPER_STATE_CHANGED`, etc.), the `state_change_info` field is populated. The `StateChangeInfo` message uses a `oneof` to represent the specific type of state change, ensuring only the relevant state change is set:
+
+```protobuf
+message StateChangeInfo {
+    oneof state_change {
+        AdminStateChange admin_state_change = 1;
+        OperStateChange oper_state_change = 2;
+        AlarmStateChange alarm_state_change = 3;
+        UsageStateChange usage_state_change = 4;
+        StandbyStateChange standby_state_change = 5;
+    }
+}
+
+message AdminStateChange {
+    ComponentAdminState old = 1;
+    ComponentAdminState new = 2;
+}
+// ... similar for OperStateChange, AlarmStateChange, UsageStateChange, StandbyStateChange
+```
+
+Note: The on-demand metrics query using the API `GetMetric` is returned over gRPC and not over the Kafka bus.
+
+The device/device manager implementations shall persist the active events across device reboot. On device reboot, the alarms which are no longer active shall be cleared.
diff --git a/docs/ManagingDevice.md b/docs/ManagingDevice.md
index eb32361..5aefcf2 100644
--- a/docs/ManagingDevice.md
+++ b/docs/ManagingDevice.md
@@ -4,7 +4,7 @@
 
 ## StartManagingDevice
 ![Managing a Device](images/managing_device.png "Start Managing an OLT")
-``` protobuf
+```protobuf
 service NativeHWManagementService {
     // Initializes context for a device and sets up required states
     // In the call to StartManagingDevice, the fields of ModifiableComponent which are relevant
@@ -27,31 +27,37 @@
 *The device manager implementation should ensure that the `uuid` returned is universally unique and* ***does not change across reboots of the device.*** An example could be that the device manager first connects to the device and learns the serial number of the device and then uses this serial number to generate the `uuid` for the device.
 
 ## StopManagingDevice
-``` protobuf
+```protobuf
 // Stop management of a device and clean up any context caches for that device
 rpc StopManagingDevice(StopManagingDeviceRequest) returns(StopManagingDeviceResponse);
 ```
 This RPC is to be used when a device is to be released from the system and no longer needs to be managed.
 
+## GetManagedDevices
+```protobuf
+// Returns an object containing a list of devices managed by this entity
+rpc GetManagedDevices(google.protobuf.Empty) returns(ManagedDevicesResponse);
+```
+This RPC returns a list of all devices currently managed by the Device Manager.
+
 ## GetPhysicalInventory
-``` protobuf
+```protobuf
 // Get the HW inventory details of the Device
 rpc GetPhysicalInventory(PhysicalInventoryRequest) returns(stream PhysicalInventoryResponse);
 ```
-
 This RPC is used to retrieve the entire inventory of components of the Hardware. Again the caller has to wait on the response in a stream as implementations of Device Manager could take time to gather all this information.
 
 ## GetHWComponentInfo
-``` protobuf
+```protobuf
 // Get the details of a particular HW component
-rpc GetHWComponentInfo(HWComponentInfoGetRequest) returns(stream Component);
+rpc GetHWComponentInfo(HWComponentInfoGetRequest) returns(stream HWComponentInfoGetResponse);
 ```
 In the call to this RPC, both the `name` and the `uuid` of the component need to be passed in the `HWComponentInfoGetRequest`.
 
 The `name` has to be unique for each of the components of the hardware and the `uuid` has to be universally unique. Implementation of Device Manager need to ensure this. Both of these two attributes are generated by the Device Manager.
 
 ## SetHWComponentInfo
-``` protobuf
+```protobuf
 // Sets the permissible attributes of a HW component
 rpc SetHWComponentInfo(HWComponentInfoSetRequest) returns(HWComponentInfoSetResponse);
 ```
@@ -59,20 +65,117 @@
 
 Using this RPC, it is possible to modify the `name` of a component, and the Device Manager has to ensure that the name is unique, else it should return an error for this RPC. Although the `name` can be modified, it is recommended that NEM implementations do not do this because Device Managers and take advantage of this and come up with efficient implementations.
 
+## SetLoggingEndpoint
+```protobuf
+// Sets the location to which logs need to be shipped
+rpc SetLoggingEndpoint(SetLoggingEndpointRequest) returns(SetRemoteEndpointResponse);
+```
+This RPC sets the endpoint where logs from the device should be sent.
+
+## GetLoggingEndpoint
+```protobuf
+// Gets the configured location to which the logs are being shipped
+rpc GetLoggingEndpoint(HardwareID) returns(GetLoggingEndpointResponse);
+```
+This RPC retrieves the current logging endpoint configuration for a device.
+
+## SetMsgBusEndpoint
+```protobuf
+// Sets the location of the Message Bus to which events and metrics are shipped
+rpc SetMsgBusEndpoint(SetMsgBusEndpointRequest) returns(SetRemoteEndpointResponse);
+```
+This RPC sets the endpoint for the message bus used for events and metrics.
+
+## GetMsgBusEndpoint
+```protobuf
+// Gets the configured location to which the events and metrics are being shipped
+rpc GetMsgBusEndpoint(google.protobuf.Empty) returns(GetMsgBusEndpointResponse);
+```
+This RPC retrieves the current message bus endpoint configuration.
+
+## GetLoggableEntities
+```protobuf
+// Gets the entities of a device on which log can be configured.
+rpc GetLoggableEntities(GetLoggableEntitiesRequest) returns(GetLogLevelResponse);
+```
+This RPC returns the list of entities (e.g., OS, PON Management, etc.) on which log levels can be configured.
+
+## SetLogLevel
+```protobuf
+// Sets the log level of the device, for each given entity to a certain level.
+rpc SetLogLevel(SetLogLevelRequest) returns(SetLogLevelResponse);
+```
+This RPC sets the log level for one or more entities on a device.
+
+## GetLogLevel
+```protobuf
+// Gets the configured log level for a certain entity on a certain device.
+rpc GetLogLevel(GetLogLevelRequest) returns(GetLogLevelResponse);
+```
+This RPC retrieves the log level for one or more entities on a device.
+
 ## HeartbeatCheck
-``` protobuf
+```protobuf
 // Performs the heartbeat check
 rpc HeartbeatCheck(google.protobuf.Empty) returns (Heartbeat);
 ```
 This RPC is used to perform the hearbeat check for the connectivity. When the gRPC server streaming is used for conveying the Events and Metrics to external systems, on the connectivity break and reestablishment, the server streaming RPCs need to be established again.
 
 ## RebootDevice
-``` protobuf
+```protobuf
 // Performs the reboot of the device
 rpc RebootDevice(RebootDeviceRequest) returns (RebootDeviceResponse);
 ```
 This RPC is used to administratively reboot the device. The server side implementations should reboot the device only after successfully returning this RPC.
 
+## SetDmLogLevel
+```protobuf
+// Sets the log level of the Device Manager itself
+rpc SetDmLogLevel(SetDmLogLevelRequest) returns(SetDmLogLevelResponse);
+```
+This RPC sets the log level for the Device Manager process.
+
+## GetDmLogLevel
+```protobuf
+// Gets the log level at which the Device Manager is running
+rpc GetDmLogLevel(GetDmLogLevelRequest) returns(GetDmLogLevelResponse);
+```
+This RPC retrieves the current log level of the Device Manager process.
+
+---
+
+## EnableHWComponent
+```protobuf
+// Enables a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+rpc EnableHWComponent(EnableHWComponentRequest) returns(EnableHWComponentResponse);
+```
+This RPC enables a hardware component (such as a port or module) on a managed device.  
+You must provide the `device_uuid` and at least one of `component_name` or `component_uuid` in the request.  
+If the operation is not supported or the parameters are invalid, an appropriate error will be returned in the response.
+
+## DisableHWComponent
+```protobuf
+// Disables a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+rpc DisableHWComponent(DisableHWComponentRequest) returns(DisableHWComponentResponse);
+```
+This RPC disables a hardware component on a managed device.  
+You must provide the `device_uuid` and at least one of `component_name` or `component_uuid` in the request.  
+If the operation is not supported or the parameters are invalid, an appropriate error will be returned in the response.
+
+## ResetHWComponent
+```protobuf
+// Resets a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+rpc ResetHWComponent(ResetHWComponentRequest) returns(ResetHWComponentResponse);
+```
+This RPC resets a hardware component on a managed device.  
+You must provide the `device_uuid` and at least one of `component_name` or `component_uuid` in the request.  
+If the operation is not supported or the parameters are invalid, an appropriate error will be returned in the response.
+
+---
+
 ## Port Speed configuration
 The Device Management Interface does not support runtime NNI (network to network interface) port speed configuration on the OLT device.
 The speed of the NNI ports is configured, for each port, at startup time through the startup configuration file that can be provided via the
diff --git a/go/dmi/hw.pb.go b/go/dmi/hw.pb.go
index 7b944ef..c83b4c0 100644
--- a/go/dmi/hw.pb.go
+++ b/go/dmi/hw.pb.go
@@ -94,6 +94,12 @@
 	ComponentAdminState_COMP_ADMIN_STATE_LOCKED        ComponentAdminState = 2
 	ComponentAdminState_COMP_ADMIN_STATE_SHUTTING_DOWN ComponentAdminState = 3
 	ComponentAdminState_COMP_ADMIN_STATE_UNLOCKED      ComponentAdminState = 4
+	// Indicates that the component is in a prohibited administrative state, meaning operations are not allowed.
+	// Typically used to enforce security or policy restrictions.
+	ComponentAdminState_COMP_ADMIN_STATE_ISOLATED ComponentAdminState = 6
+	// Indicates that the component is administratively isolated from the rest of the system.
+	// Used when a component must be separated for maintenance, troubleshooting, or security reasons.
+	ComponentAdminState_COMP_ADMIN_STATE_PROHIBITED ComponentAdminState = 5
 )
 
 var ComponentAdminState_name = map[int32]string{
@@ -102,6 +108,8 @@
 	2: "COMP_ADMIN_STATE_LOCKED",
 	3: "COMP_ADMIN_STATE_SHUTTING_DOWN",
 	4: "COMP_ADMIN_STATE_UNLOCKED",
+	6: "COMP_ADMIN_STATE_ISOLATED",
+	5: "COMP_ADMIN_STATE_PROHIBITED",
 }
 
 var ComponentAdminState_value = map[string]int32{
@@ -110,6 +118,8 @@
 	"COMP_ADMIN_STATE_LOCKED":        2,
 	"COMP_ADMIN_STATE_SHUTTING_DOWN": 3,
 	"COMP_ADMIN_STATE_UNLOCKED":      4,
+	"COMP_ADMIN_STATE_ISOLATED":      6,
+	"COMP_ADMIN_STATE_PROHIBITED":    5,
 }
 
 func (x ComponentAdminState) String() string {
@@ -128,22 +138,55 @@
 	ComponentOperState_COMP_OPER_STATE_DISABLED  ComponentOperState = 2
 	ComponentOperState_COMP_OPER_STATE_ENABLED   ComponentOperState = 3
 	ComponentOperState_COMP_OPER_STATE_TESTING   ComponentOperState = 4
+	// Indicates that the component is operating normally.
+	ComponentOperState_COMP_OPER_STATE_NORMAL ComponentOperState = 5
+	// Indicates that the component is currently being configured.
+	ComponentOperState_COMP_OPER_STATE_CONFIGURING ComponentOperState = 6
+	// Indicates that the component is automatically loading configuration or software.
+	ComponentOperState_COMP_OPER_STATE_AUTOMATIC_LOADING ComponentOperState = 7
+	// Indicates that the component has encountered a failure.
+	ComponentOperState_COMP_OPER_STATE_FAILED ComponentOperState = 8
+	// Indicates that the component is temporarily shut down.
+	// The component is in a high temperature shutdown state due to exceeding safe operating temperature limits.
+	ComponentOperState_COMP_OPER_STATE_HIGH_TEMP_SHUTDOWN ComponentOperState = 9
+	// Indicates that the component is manually shut down.
+	ComponentOperState_COMP_OPER_STATE_MANUAL_SHUTDOWN ComponentOperState = 10
+	// Indicates that the component is shut down to save power.
+	ComponentOperState_COMP_OPER_STATE_POWER_SAVING_SHUTDOWN ComponentOperState = 11
+	// Indicates that the component's type does not match the expected type.
+	ComponentOperState_COMP_OPER_STATE_TYPE_MISMATCH ComponentOperState = 12
 )
 
 var ComponentOperState_name = map[int32]string{
-	0: "COMP_OPER_STATE_UNDEFINED",
-	1: "COMP_OPER_STATE_UNKNOWN",
-	2: "COMP_OPER_STATE_DISABLED",
-	3: "COMP_OPER_STATE_ENABLED",
-	4: "COMP_OPER_STATE_TESTING",
+	0:  "COMP_OPER_STATE_UNDEFINED",
+	1:  "COMP_OPER_STATE_UNKNOWN",
+	2:  "COMP_OPER_STATE_DISABLED",
+	3:  "COMP_OPER_STATE_ENABLED",
+	4:  "COMP_OPER_STATE_TESTING",
+	5:  "COMP_OPER_STATE_NORMAL",
+	6:  "COMP_OPER_STATE_CONFIGURING",
+	7:  "COMP_OPER_STATE_AUTOMATIC_LOADING",
+	8:  "COMP_OPER_STATE_FAILED",
+	9:  "COMP_OPER_STATE_HIGH_TEMP_SHUTDOWN",
+	10: "COMP_OPER_STATE_MANUAL_SHUTDOWN",
+	11: "COMP_OPER_STATE_POWER_SAVING_SHUTDOWN",
+	12: "COMP_OPER_STATE_TYPE_MISMATCH",
 }
 
 var ComponentOperState_value = map[string]int32{
-	"COMP_OPER_STATE_UNDEFINED": 0,
-	"COMP_OPER_STATE_UNKNOWN":   1,
-	"COMP_OPER_STATE_DISABLED":  2,
-	"COMP_OPER_STATE_ENABLED":   3,
-	"COMP_OPER_STATE_TESTING":   4,
+	"COMP_OPER_STATE_UNDEFINED":             0,
+	"COMP_OPER_STATE_UNKNOWN":               1,
+	"COMP_OPER_STATE_DISABLED":              2,
+	"COMP_OPER_STATE_ENABLED":               3,
+	"COMP_OPER_STATE_TESTING":               4,
+	"COMP_OPER_STATE_NORMAL":                5,
+	"COMP_OPER_STATE_CONFIGURING":           6,
+	"COMP_OPER_STATE_AUTOMATIC_LOADING":     7,
+	"COMP_OPER_STATE_FAILED":                8,
+	"COMP_OPER_STATE_HIGH_TEMP_SHUTDOWN":    9,
+	"COMP_OPER_STATE_MANUAL_SHUTDOWN":       10,
+	"COMP_OPER_STATE_POWER_SAVING_SHUTDOWN": 11,
+	"COMP_OPER_STATE_TYPE_MISMATCH":         12,
 }
 
 func (x ComponentOperState) String() string {
@@ -2017,188 +2060,197 @@
 func init() { proto.RegisterFile("dmi/hw.proto", fileDescriptor_d7c33d745c4ab367) }
 
 var fileDescriptor_d7c33d745c4ab367 = []byte{
-	// 2926 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x92, 0xdb, 0xc6,
-	0x11, 0x16, 0xff, 0xc9, 0x26, 0xb9, 0x3b, 0x3b, 0xfa, 0xa3, 0xfe, 0x6c, 0x99, 0x91, 0x5d, 0xf2,
-	0xc6, 0xde, 0x5d, 0xad, 0xa4, 0x94, 0x6c, 0x97, 0x2b, 0x85, 0x05, 0xc1, 0x5d, 0x58, 0x24, 0x00,
-	0x0f, 0xc0, 0x95, 0xd6, 0x39, 0xa0, 0xb0, 0x24, 0x48, 0xa1, 0x8a, 0x24, 0x58, 0x00, 0xb8, 0x5a,
-	0x55, 0xe5, 0x94, 0xe4, 0x9e, 0x27, 0xc8, 0xcd, 0x95, 0xf2, 0x29, 0x87, 0x24, 0xc7, 0x1c, 0x72,
-	0xc9, 0x31, 0x0f, 0x90, 0x67, 0xc8, 0x21, 0x8f, 0x90, 0xd4, 0xcc, 0x00, 0x20, 0x08, 0x42, 0xb2,
-	0x5c, 0x95, 0xdb, 0x4c, 0xf7, 0xd7, 0x3d, 0x3d, 0xdd, 0x3d, 0x3d, 0xd3, 0x00, 0x34, 0x46, 0x33,
-	0x67, 0xff, 0xd5, 0xeb, 0xbd, 0x85, 0xe7, 0x06, 0x2e, 0x2e, 0x8c, 0x66, 0xce, 0xed, 0x0f, 0x27,
-	0xae, 0x3b, 0x99, 0xda, 0xfb, 0x8c, 0x74, 0xbe, 0x1c, 0xef, 0x07, 0xce, 0xcc, 0xf6, 0x03, 0x6b,
-	0xb6, 0xe0, 0xa8, 0xf6, 0x6d, 0x28, 0x0e, 0x96, 0xce, 0x08, 0x63, 0x28, 0x2e, 0x97, 0xce, 0xa8,
-	0x95, 0xbb, 0x9f, 0x7b, 0x58, 0x23, 0x6c, 0xdc, 0xfe, 0x39, 0xc0, 0x89, 0xe5, 0x8d, 0x5e, 0x5b,
-	0x9e, 0x2d, 0x77, 0xf0, 0xbd, 0x04, 0xa2, 0x7e, 0x58, 0xdb, 0x1b, 0xcd, 0x9c, 0x3d, 0x2a, 0x1a,
-	0x82, 0x6f, 0x42, 0x61, 0xe0, 0x39, 0x18, 0x41, 0x61, 0xe9, 0x39, 0xa1, 0x1a, 0x3a, 0x6c, 0xff,
-	0xae, 0x00, 0x5b, 0xa2, 0x3b, 0x5b, 0xb8, 0x73, 0x7b, 0x1e, 0xe8, 0x81, 0x15, 0xd8, 0xf8, 0x04,
-	0xb0, 0x4f, 0x07, 0xe6, 0xd4, 0xf2, 0x03, 0x73, 0xf8, 0xca, 0x9a, 0x4f, 0xec, 0x48, 0xf1, 0xed,
-	0x3d, 0x6e, 0xf2, 0x5e, 0x64, 0xf2, 0x9e, 0x11, 0x99, 0x4c, 0x10, 0x93, 0xea, 0x59, 0x7e, 0x20,
-	0x72, 0x19, 0xfc, 0x05, 0xd4, 0xad, 0xd1, 0xcc, 0x99, 0x9b, 0x8c, 0xd3, 0xca, 0xdf, 0xcf, 0x3d,
-	0xdc, 0x3a, 0x6c, 0x31, 0xdb, 0xe2, 0x35, 0x05, 0x0a, 0x60, 0x0b, 0x13, 0xb0, 0xe2, 0x31, 0xfe,
-	0x05, 0x80, 0xbb, 0xb0, 0xbd, 0x50, 0xb2, 0xc0, 0x24, 0x6f, 0xae, 0x4b, 0xaa, 0x0b, 0xdb, 0xe3,
-	0x82, 0x35, 0x37, 0x1a, 0xd2, 0x25, 0x97, 0xbe, 0x35, 0xb1, 0x43, 0xc1, 0x62, 0xd6, 0x92, 0x03,
-	0x0a, 0x08, 0x97, 0x5c, 0xc6, 0x63, 0x66, 0xed, 0xd4, 0xf2, 0x66, 0xa1, 0x68, 0x29, 0xd3, 0x5a,
-	0x0a, 0x88, 0xac, 0x8d, 0xc7, 0xf8, 0x97, 0xd0, 0xf4, 0x03, 0x6b, 0x3e, 0x3a, 0x7f, 0x13, 0x0a,
-	0x97, 0x99, 0xf0, 0xed, 0x75, 0x61, 0x9d, 0x43, 0xb8, 0x78, 0xc3, 0x4f, 0xcc, 0xda, 0xff, 0xce,
-	0xc3, 0xd5, 0x15, 0xce, 0x9e, 0xfb, 0xae, 0xd7, 0xb1, 0x02, 0x0b, 0x5f, 0x83, 0xd2, 0x85, 0x35,
-	0x5d, 0xda, 0xcc, 0xfd, 0x25, 0xc2, 0x27, 0xf8, 0x13, 0x28, 0x06, 0x6f, 0x16, 0x91, 0x43, 0x31,
-	0x5b, 0x85, 0xc2, 0x4f, 0x29, 0xd7, 0x78, 0xb3, 0xb0, 0x09, 0xe3, 0xe3, 0x8f, 0xa1, 0xe4, 0x0f,
-	0xad, 0x69, 0xe4, 0xbf, 0x6d, 0x06, 0x64, 0x20, 0x9d, 0x92, 0x09, 0xe7, 0xe2, 0xbb, 0x50, 0x5b,
-	0x78, 0xf6, 0xd0, 0xf1, 0x1d, 0x77, 0xce, 0x3c, 0x56, 0x22, 0x2b, 0x02, 0xfe, 0x14, 0xca, 0x74,
-	0x4f, 0x4b, 0x3f, 0xf4, 0xc8, 0x0e, 0xd3, 0xc2, 0x6d, 0xd4, 0x19, 0x83, 0x84, 0x00, 0xfc, 0x33,
-	0x68, 0x2e, 0xe7, 0x4e, 0xe0, 0x9b, 0x23, 0xc7, 0x5f, 0x4c, 0xad, 0x37, 0xcc, 0x0d, 0x35, 0xd2,
-	0x60, 0xc4, 0x0e, 0xa7, 0xe1, 0x67, 0x50, 0x8b, 0xd3, 0xbc, 0x55, 0xf9, 0xd1, 0xac, 0x5a, 0x81,
-	0xf1, 0x2e, 0xec, 0xb0, 0xfd, 0x9b, 0xcb, 0xc5, 0x88, 0xe6, 0xa7, 0x47, 0x3d, 0x5d, 0xbd, 0x9f,
-	0x7b, 0xd8, 0x24, 0xdb, 0x8c, 0x31, 0x60, 0x74, 0x42, 0x23, 0x72, 0x07, 0x6a, 0x23, 0x2b, 0xb0,
-	0x4c, 0xe6, 0xa7, 0x1a, 0x33, 0xa3, 0x4a, 0x09, 0xd4, 0x3b, 0xed, 0xff, 0x94, 0xe1, 0xa6, 0xe6,
-	0x7a, 0xc1, 0x2a, 0xac, 0x41, 0xe0, 0x39, 0xe7, 0xcb, 0xc0, 0xf6, 0xf1, 0xb7, 0xb0, 0x35, 0x74,
-	0xe7, 0x73, 0x7b, 0x18, 0xb8, 0x1e, 0x97, 0xce, 0xb1, 0x6d, 0xef, 0xb2, 0x6d, 0xbf, 0x45, 0x6a,
-	0x4f, 0x8c, 0x44, 0x98, 0xf7, 0x9b, 0xc3, 0xe4, 0x14, 0x3f, 0x83, 0x92, 0xbf, 0xb0, 0xed, 0x51,
-	0x18, 0xaf, 0xf6, 0x3b, 0x35, 0xe9, 0x14, 0x49, 0xb8, 0x00, 0x16, 0xa0, 0xca, 0x5c, 0x32, 0x74,
-	0xa7, 0x61, 0x0c, 0x3f, 0x7e, 0xa7, 0xb0, 0x16, 0x82, 0x49, 0x2c, 0x86, 0x3f, 0x86, 0xad, 0xc5,
-	0xab, 0x37, 0xbe, 0x33, 0xb4, 0xa6, 0xe6, 0xd4, 0x3a, 0xb7, 0xa7, 0x2c, 0xc2, 0x35, 0xd2, 0x8c,
-	0xa8, 0x3d, 0x4a, 0xa4, 0xa1, 0x9b, 0x59, 0x8b, 0x85, 0x33, 0x9f, 0x84, 0xa8, 0x12, 0x0f, 0x5d,
-	0x48, 0xe4, 0xa0, 0x27, 0xd0, 0x5c, 0xb8, 0x73, 0xd3, 0x19, 0x99, 0x43, 0x77, 0x3e, 0x76, 0x26,
-	0x2c, 0xbe, 0xf5, 0x43, 0x14, 0xda, 0x34, 0x97, 0x47, 0x22, 0xa3, 0x93, 0xfa, 0x62, 0x35, 0xc1,
-	0x8f, 0xe1, 0x3a, 0xdb, 0x8d, 0x69, 0x2d, 0x03, 0x77, 0x6e, 0x4f, 0xdc, 0xc0, 0xb1, 0x02, 0x9a,
-	0x6a, 0x34, 0xf8, 0x55, 0x72, 0x8d, 0x31, 0x85, 0x75, 0x1e, 0xfe, 0x0c, 0xaa, 0x23, 0x87, 0x1e,
-	0x91, 0x21, 0x0f, 0x71, 0x62, 0x95, 0x4e, 0x48, 0x27, 0x31, 0xa2, 0xbd, 0x80, 0xe6, 0x5a, 0x04,
-	0xf0, 0x5d, 0x68, 0x89, 0xaa, 0xa2, 0x48, 0xa2, 0xa1, 0x12, 0xd3, 0x38, 0xd3, 0x24, 0x73, 0xa0,
-	0x74, 0xa4, 0xae, 0xac, 0x48, 0x1d, 0x74, 0x05, 0x57, 0xa1, 0x48, 0xbe, 0x79, 0xf2, 0x14, 0xe5,
-	0x70, 0x03, 0xaa, 0x5d, 0xf9, 0x48, 0x22, 0x66, 0x4f, 0x44, 0x79, 0xbc, 0x0d, 0x75, 0x3e, 0xd3,
-	0x45, 0x53, 0x13, 0x51, 0x01, 0x37, 0xa1, 0xc6, 0x09, 0x7d, 0x4d, 0x45, 0x45, 0x5c, 0x83, 0x12,
-	0xd1, 0x0f, 0x1f, 0x1f, 0xa2, 0x52, 0xfb, 0x4f, 0x39, 0x28, 0xb1, 0x50, 0xe1, 0xab, 0xb0, 0xad,
-	0x6b, 0x92, 0xd4, 0x59, 0x5b, 0xa1, 0x0e, 0x95, 0xce, 0x99, 0x22, 0xf4, 0x65, 0x11, 0xe5, 0xa8,
-	0x96, 0x63, 0xf9, 0x58, 0x38, 0x92, 0x0d, 0xf3, 0x11, 0xca, 0xe3, 0x2d, 0x80, 0x78, 0x7a, 0x80,
-	0x0a, 0xc9, 0xf9, 0xe1, 0x53, 0x54, 0x4c, 0xce, 0x9f, 0x1c, 0xa0, 0x12, 0xb5, 0x6a, 0x85, 0x3f,
-	0x40, 0xe5, 0x24, 0xe1, 0xc9, 0xc1, 0x01, 0xaa, 0x60, 0x04, 0x8d, 0xbe, 0x14, 0x69, 0x38, 0x38,
-	0x40, 0xd5, 0x24, 0xe5, 0xd1, 0xe1, 0xd3, 0x03, 0x54, 0x6b, 0xff, 0x1a, 0xaa, 0x51, 0x76, 0xe0,
-	0x1b, 0x80, 0x35, 0xa2, 0x1a, 0xaa, 0xa8, 0xf6, 0xd6, 0xac, 0x6e, 0x40, 0x55, 0x32, 0x4e, 0x24,
-	0xa2, 0x48, 0x06, 0xca, 0x51, 0x2f, 0x1d, 0x6b, 0xaa, 0x82, 0xf2, 0x74, 0xdf, 0x2f, 0xd9, 0xb0,
-	0x80, 0x01, 0xca, 0x2f, 0x8f, 0x75, 0x3a, 0x66, 0xee, 0x38, 0xee, 0x0a, 0xba, 0x81, 0x4a, 0x94,
-	0xac, 0x4b, 0x44, 0x16, 0x7a, 0xa8, 0x4c, 0xe5, 0x24, 0x0a, 0xa8, 0xd0, 0xd1, 0x91, 0x6c, 0xe8,
-	0xa8, 0xda, 0x9e, 0x42, 0x3d, 0x11, 0x39, 0xfc, 0x11, 0x34, 0x66, 0xd6, 0xa5, 0x19, 0x47, 0x38,
-	0xc7, 0x0e, 0x71, 0x7d, 0x66, 0x5d, 0xc6, 0x90, 0x2f, 0xe1, 0x16, 0x87, 0x8c, 0xc7, 0xb6, 0x67,
-	0xcf, 0x03, 0xc7, 0x9a, 0xae, 0xf0, 0x79, 0x86, 0xbf, 0xc9, 0xf0, 0x2b, 0x7e, 0x24, 0xdb, 0xfe,
-	0x6d, 0x0e, 0xee, 0xad, 0x1d, 0x11, 0x7e, 0x21, 0x25, 0x4e, 0xf9, 0x46, 0x26, 0xe7, 0xde, 0x27,
-	0x93, 0x93, 0x49, 0x99, 0xff, 0xd1, 0xa4, 0xfc, 0x15, 0x3c, 0x30, 0x3c, 0x6b, 0xee, 0x0f, 0x6d,
-	0xe7, 0xc2, 0xf6, 0xde, 0x6e, 0xcb, 0x63, 0x80, 0x80, 0xe2, 0x92, 0xd5, 0xe6, 0x1a, 0xd3, 0x9b,
-	0x10, 0x67, 0x75, 0xa5, 0xc6, 0x70, 0xac, 0x84, 0x0d, 0x99, 0x43, 0x63, 0xcb, 0xae, 0x43, 0x99,
-	0xef, 0x87, 0xc9, 0x37, 0x48, 0x89, 0x99, 0x8d, 0xbf, 0x86, 0x3b, 0xe1, 0x36, 0x99, 0xe4, 0xcc,
-	0x09, 0xcc, 0x85, 0xed, 0x39, 0xee, 0xc8, 0x19, 0x3a, 0xc1, 0x9b, 0xd0, 0x8d, 0x2d, 0x86, 0x35,
-	0x42, 0x80, 0xb6, 0xe2, 0xb7, 0x25, 0xb8, 0x2b, 0xba, 0xf3, 0xc0, 0x72, 0xe6, 0x09, 0xfb, 0x13,
-	0x96, 0x6f, 0xd6, 0x96, 0x5c, 0x46, 0x6d, 0x69, 0xff, 0x23, 0x07, 0x37, 0x34, 0x7f, 0x99, 0xa5,
-	0xe1, 0x0c, 0x76, 0xfc, 0xe5, 0x62, 0xe1, 0x7a, 0x81, 0x3d, 0x32, 0x2f, 0xdc, 0x69, 0x60, 0x4d,
-	0x22, 0x17, 0x7c, 0xc6, 0x5d, 0x9b, 0x29, 0xb7, 0xa7, 0x47, 0x42, 0xa7, 0x5c, 0x86, 0x20, 0x3f,
-	0x45, 0x69, 0x6b, 0x80, 0xd2, 0x28, 0xfc, 0x21, 0xdc, 0xd1, 0x07, 0x9a, 0xa6, 0x12, 0x43, 0xea,
-	0x98, 0xa7, 0x6a, 0xcf, 0x10, 0x8e, 0xd7, 0x2b, 0x43, 0x05, 0x0a, 0xa7, 0x4f, 0x9e, 0xf1, 0xe4,
-	0x3f, 0x3d, 0x7c, 0x7c, 0x80, 0xf2, 0x6c, 0xf4, 0xe8, 0xd1, 0x53, 0x54, 0x68, 0xff, 0xb9, 0x04,
-	0x1f, 0x66, 0x45, 0xd4, 0x4f, 0x6c, 0x48, 0x83, 0xfa, 0xd8, 0xf5, 0x66, 0xe6, 0xd8, 0xa2, 0xb5,
-	0x28, 0xdc, 0xca, 0x7e, 0x3a, 0x9a, 0x59, 0xa2, 0x7b, 0x5d, 0xd7, 0x9b, 0x75, 0x99, 0x18, 0x81,
-	0x71, 0x3c, 0x4e, 0xa5, 0x47, 0xfe, 0xbd, 0xd2, 0x63, 0xe3, 0x80, 0x15, 0x36, 0x0f, 0xd8, 0xd7,
-	0x80, 0x93, 0x10, 0x93, 0xbf, 0x14, 0x8a, 0xd9, 0x2f, 0x05, 0x94, 0x90, 0x64, 0x14, 0x7a, 0x61,
-	0x78, 0x97, 0xe6, 0x6b, 0xeb, 0xc2, 0x9e, 0xda, 0xf3, 0x49, 0xf0, 0xaa, 0x55, 0xba, 0x5f, 0x78,
-	0xd8, 0x24, 0x0d, 0xef, 0xf2, 0x45, 0x4c, 0xa3, 0xa0, 0x60, 0x0d, 0x54, 0xe6, 0xa0, 0x20, 0x09,
-	0xfa, 0x12, 0xd0, 0x0a, 0x11, 0x9a, 0x51, 0xc9, 0x36, 0x63, 0x7b, 0x05, 0xe4, 0x56, 0xdc, 0x82,
-	0x6a, 0x70, 0x69, 0x2e, 0xdc, 0xd7, 0xb6, 0xd7, 0xaa, 0xde, 0x2f, 0x3c, 0x2c, 0x91, 0x4a, 0x70,
-	0xa9, 0xd1, 0x29, 0x7e, 0x0a, 0x5b, 0x11, 0x2b, 0x54, 0x5a, 0xcb, 0x56, 0xda, 0x08, 0x25, 0xd8,
-	0xac, 0xfd, 0xcf, 0x1c, 0xc0, 0x2a, 0x12, 0xf8, 0x26, 0x5c, 0xed, 0xaa, 0xa4, 0x6f, 0x76, 0x05,
-	0x76, 0x95, 0x0c, 0x94, 0xe7, 0x8a, 0xfa, 0x42, 0xe1, 0x77, 0xc8, 0xb7, 0x7a, 0x57, 0xe3, 0xe5,
-	0x9d, 0x8e, 0x4c, 0xad, 0x37, 0xd0, 0x51, 0x9e, 0x96, 0x42, 0x3a, 0x3d, 0x7c, 0x86, 0x0a, 0x34,
-	0x9d, 0x28, 0xa6, 0x48, 0x2b, 0x6b, 0x0c, 0x29, 0x51, 0xf2, 0xcb, 0xae, 0xc6, 0x4b, 0xa5, 0xd8,
-	0xd5, 0x9e, 0xf0, 0x52, 0x29, 0x76, 0xb5, 0x43, 0x54, 0x65, 0x23, 0x4d, 0x78, 0x8e, 0x6a, 0xb8,
-	0x0c, 0xf9, 0x97, 0x87, 0x08, 0x68, 0x9d, 0x55, 0x69, 0x59, 0x46, 0x75, 0x2a, 0x29, 0x76, 0x35,
-	0xd4, 0xa0, 0x0a, 0x29, 0xde, 0x14, 0x44, 0x15, 0x35, 0xe3, 0x59, 0x47, 0x54, 0xd1, 0x16, 0xbd,
-	0x7c, 0x98, 0x41, 0x9d, 0x0e, 0xda, 0x6e, 0xff, 0xab, 0x02, 0xb5, 0x38, 0xdd, 0x68, 0x23, 0x31,
-	0xb7, 0x66, 0x76, 0xd4, 0x48, 0xd0, 0x31, 0x7e, 0x08, 0xa5, 0xe1, 0xd4, 0xf2, 0xfd, 0xb5, 0xe7,
-	0x64, 0x2c, 0xc2, 0x32, 0x8b, 0x03, 0xf0, 0x7d, 0xa8, 0x8f, 0x6c, 0x7f, 0xe8, 0x39, 0x0b, 0x76,
-	0x7f, 0x17, 0x98, 0x92, 0x24, 0x09, 0xdf, 0x80, 0xf2, 0xc2, 0xa2, 0xe5, 0x38, 0x7c, 0x65, 0x84,
-	0x33, 0xfc, 0x00, 0xb6, 0xf8, 0xc8, 0xf4, 0xec, 0xa9, 0xb9, 0x70, 0xf9, 0x63, 0xb2, 0x44, 0x1a,
-	0x9c, 0x4a, 0xec, 0xa9, 0xe6, 0xfa, 0x78, 0x17, 0xaa, 0xc3, 0x57, 0xce, 0x74, 0xe4, 0xd9, 0x73,
-	0x96, 0x29, 0xf5, 0xc3, 0xad, 0x75, 0x63, 0x48, 0xcc, 0xa7, 0x19, 0xfe, 0x2a, 0x6c, 0x7f, 0x4c,
-	0xcf, 0xbe, 0x60, 0x19, 0x53, 0x23, 0xf5, 0x88, 0x46, 0xec, 0x0b, 0x0a, 0x19, 0x3b, 0xde, 0x2c,
-	0x86, 0x54, 0x39, 0x24, 0xa2, 0x85, 0x10, 0xdf, 0x1d, 0x07, 0x31, 0x84, 0xbf, 0x14, 0xeb, 0x11,
-	0x8d, 0x42, 0xee, 0x01, 0xf8, 0xb6, 0x47, 0xaf, 0x9f, 0xf9, 0x72, 0xd6, 0x02, 0x06, 0xa8, 0x71,
-	0x8a, 0xb2, 0x9c, 0xd1, 0x0c, 0x9c, 0x8d, 0x27, 0x26, 0xf3, 0x6a, 0x9d, 0x31, 0x2b, 0xb3, 0xf1,
-	0x44, 0xa1, 0x8e, 0xbd, 0x07, 0x30, 0x73, 0x47, 0xf6, 0x94, 0x33, 0x1b, 0x5c, 0x92, 0x51, 0x18,
-	0xfb, 0x1a, 0x94, 0xac, 0xa9, 0x63, 0xf9, 0xad, 0x26, 0xe3, 0xf0, 0x09, 0xd5, 0x67, 0xf9, 0xbe,
-	0x1d, 0xd0, 0x5a, 0xbe, 0xc5, 0xf5, 0xb1, 0xb9, 0x3c, 0xa2, 0x45, 0xde, 0xf1, 0xcd, 0xb1, 0xb7,
-	0x6c, 0x6d, 0xb3, 0x97, 0x53, 0xc9, 0xf1, 0xbb, 0xde, 0x12, 0x3f, 0xe5, 0x16, 0xd0, 0xa7, 0x6f,
-	0x0b, 0xfd, 0xe8, 0x7b, 0x9a, 0x5a, 0xd7, 0xa1, 0x2f, 0xe4, 0xdb, 0xbc, 0x17, 0xdc, 0x61, 0x12,
-	0x55, 0xde, 0x30, 0x7a, 0x0e, 0xeb, 0x0a, 0xe3, 0x6e, 0x12, 0x67, 0x76, 0x93, 0xf8, 0x53, 0x28,
-	0xf1, 0x36, 0xe7, 0x2a, 0xe3, 0x5f, 0xdd, 0x68, 0x73, 0x02, 0xda, 0x5b, 0x44, 0x4d, 0x95, 0xcf,
-	0x5a, 0x05, 0x6a, 0x9f, 0xd5, 0xba, 0xc6, 0xa2, 0x9a, 0x6a, 0xaa, 0x56, 0xfd, 0x0e, 0x01, 0x7f,
-	0xd5, 0xfb, 0x7c, 0x05, 0x35, 0x5a, 0xbd, 0x4d, 0x2b, 0x08, 0xbc, 0xd6, 0x21, 0x5b, 0xe9, 0xee,
-	0xbb, 0x5e, 0xbf, 0x27, 0x57, 0x48, 0x95, 0x0a, 0x50, 0x0a, 0xfe, 0x86, 0x3d, 0xe3, 0xf9, 0xd5,
-	0xc5, 0x35, 0x3c, 0x66, 0x1a, 0x3e, 0x0a, 0x97, 0x7e, 0xfb, 0xad, 0x76, 0x72, 0x85, 0xbd, 0xdf,
-	0x39, 0x9f, 0xe9, 0x7a, 0x06, 0xd5, 0x85, 0xbf, 0xe4, 0x5a, 0x9e, 0x30, 0x2d, 0x77, 0xde, 0x71,
-	0x37, 0x9d, 0x5c, 0x21, 0x95, 0x85, 0xbf, 0x64, 0x92, 0xdf, 0x02, 0x0a, 0x56, 0x45, 0x9a, 0x6b,
-	0x78, 0xca, 0x34, 0x3c, 0x78, 0x9f, 0x2b, 0xe1, 0xe4, 0x0a, 0xd9, 0x4e, 0xc8, 0x53, 0xc6, 0x11,
-	0x40, 0xd5, 0x5f, 0xd8, 0x43, 0x67, 0xec, 0x0c, 0xdb, 0x3f, 0xe4, 0xa0, 0x1a, 0x7d, 0x03, 0xc0,
-	0x5f, 0x41, 0x3d, 0xd1, 0xb0, 0xbf, 0x47, 0xbf, 0x0e, 0xd3, 0xb8, 0x55, 0xc7, 0x6d, 0x28, 0x7a,
-	0xae, 0x1b, 0x84, 0xaf, 0x9a, 0xf4, 0xa9, 0x63, 0xbc, 0x78, 0x81, 0x73, 0xd7, 0x0d, 0xec, 0x11,
-	0x3b, 0xfd, 0xef, 0xb1, 0xc0, 0x11, 0x43, 0xb7, 0xff, 0x5e, 0x80, 0xab, 0x7d, 0x77, 0xe4, 0x8c,
-	0x1d, 0xeb, 0x7c, 0x6a, 0xff, 0xbf, 0x0a, 0xd2, 0x27, 0x71, 0xb9, 0x29, 0x64, 0x1a, 0xfe, 0xf6,
-	0xf2, 0x53, 0xcc, 0x28, 0x3f, 0xf1, 0x81, 0x2c, 0xbd, 0xed, 0x40, 0x96, 0xd7, 0x0f, 0x64, 0x78,
-	0x84, 0x2a, 0x59, 0x47, 0x28, 0xf5, 0xed, 0xa3, 0xfa, 0x13, 0xbe, 0x7d, 0x08, 0x9b, 0x89, 0x9f,
-	0xd1, 0x33, 0xa6, 0xdf, 0x91, 0x6b, 0xe9, 0xdf, 0x85, 0x6a, 0xe0, 0x5d, 0x26, 0x13, 0xff, 0xd3,
-	0xb7, 0x26, 0x5c, 0x86, 0xa2, 0x4a, 0xe0, 0x5d, 0xa6, 0xb3, 0x6d, 0xf7, 0xaf, 0x05, 0xda, 0x65,
-	0x25, 0xa2, 0xc0, 0xbb, 0xac, 0xbe, 0xa6, 0x2a, 0x92, 0x62, 0x6c, 0x76, 0x59, 0xb7, 0xe1, 0xc6,
-	0x06, 0x97, 0xdf, 0x9e, 0xb9, 0x0c, 0x9e, 0x78, 0x22, 0xe8, 0xba, 0x4c, 0x2f, 0xd0, 0x4d, 0xad,
-	0x47, 0x82, 0xf8, 0x5c, 0xeb, 0x09, 0x8a, 0x84, 0x0a, 0x19, 0x5c, 0x51, 0x55, 0x0c, 0x41, 0x56,
-	0x24, 0x82, 0x8a, 0xf4, 0x81, 0x97, 0xe2, 0x6a, 0xea, 0x0b, 0xda, 0xd0, 0x0d, 0x34, 0xad, 0x77,
-	0x86, 0x4a, 0xb4, 0xf5, 0x49, 0x01, 0xba, 0x82, 0x82, 0xca, 0xf8, 0x16, 0x5c, 0x4f, 0xd1, 0x75,
-	0x49, 0xd1, 0x55, 0x82, 0x2a, 0x19, 0xac, 0xbe, 0xda, 0x19, 0xf4, 0x24, 0x54, 0xa5, 0xaf, 0x83,
-	0x8d, 0xe5, 0x88, 0x81, 0x6a, 0x19, 0xcb, 0x88, 0xda, 0x00, 0x41, 0xc6, 0xbe, 0x8f, 0x04, 0xc3,
-	0x90, 0xc8, 0x19, 0xaa, 0x67, 0xf0, 0x74, 0x43, 0x25, 0xc2, 0xb1, 0x84, 0x1a, 0x59, 0x36, 0x48,
-	0x7d, 0x95, 0x9c, 0xa1, 0x26, 0xfe, 0x00, 0x6e, 0xa7, 0x58, 0x06, 0x11, 0x14, 0x5d, 0x94, 0xe4,
-	0x53, 0x89, 0xa0, 0xad, 0xdd, 0xbf, 0xe4, 0x12, 0x9f, 0x96, 0x56, 0x19, 0x17, 0xc9, 0x99, 0x42,
-	0xa7, 0x2f, 0x2b, 0xa6, 0x6e, 0x08, 0xc6, 0x7a, 0xf8, 0x42, 0x47, 0xa7, 0xf8, 0x51, 0x00, 0xef,
-	0xc0, 0xcd, 0x0d, 0x6e, 0x4f, 0x15, 0x9f, 0x4b, 0x1d, 0x94, 0xc7, 0x6d, 0xf8, 0x60, 0x83, 0xa9,
-	0x9f, 0x0c, 0x0c, 0x43, 0x56, 0x8e, 0xcd, 0x0e, 0x55, 0x50, 0xc0, 0xf7, 0xe0, 0x56, 0x86, 0xfa,
-	0x50, 0x45, 0x71, 0xf7, 0x87, 0x1c, 0xe0, 0xcd, 0x2f, 0x7d, 0xb1, 0x94, 0xaa, 0xd1, 0xa0, 0x6e,
-	0xd8, 0x1c, 0x59, 0xb5, 0xc6, 0x8e, 0x4c, 0x8e, 0x36, 0x94, 0x60, 0x76, 0x64, 0x5d, 0x38, 0xea,
-	0x31, 0x9b, 0x33, 0x44, 0x25, 0x85, 0x33, 0x0b, 0x59, 0x4c, 0x43, 0xd2, 0xe9, 0x76, 0x50, 0x71,
-	0xf7, 0x8f, 0x49, 0x07, 0xaf, 0xbe, 0x2d, 0xc6, 0x0e, 0x1e, 0xe8, 0xb4, 0xcb, 0x78, 0xbb, 0x83,
-	0xd7, 0xf9, 0x91, 0xb5, 0x61, 0xc4, 0xd7, 0xb8, 0x72, 0xa7, 0x27, 0x25, 0x4c, 0x4d, 0xb2, 0x04,
-	0xd1, 0x90, 0x4f, 0xe9, 0xf9, 0xc8, 0x92, 0x3b, 0x1a, 0xe8, 0x67, 0xa8, 0xb8, 0xfb, 0xfb, 0xe4,
-	0x47, 0xc6, 0xd5, 0x97, 0xcc, 0x55, 0x26, 0xf4, 0x04, 0xd2, 0x7f, 0x57, 0x26, 0xac, 0xf1, 0x23,
-	0x43, 0x3f, 0x82, 0x7b, 0x99, 0xd2, 0xc4, 0x24, 0x92, 0x26, 0xc8, 0x04, 0xe5, 0x57, 0xb1, 0x4e,
-	0x40, 0x44, 0x22, 0x1b, 0xb2, 0x28, 0xf4, 0x50, 0x21, 0x4a, 0xfc, 0x35, 0x76, 0x5f, 0xf8, 0x46,
-	0xa5, 0x07, 0x3a, 0x93, 0x27, 0x2b, 0x2a, 0x41, 0xa5, 0x4c, 0xbb, 0x5e, 0x08, 0x44, 0xa1, 0x61,
-	0x29, 0xaf, 0x92, 0x30, 0xc1, 0x95, 0x95, 0x8e, 0x64, 0x48, 0xa4, 0x2f, 0x2b, 0x82, 0x21, 0xa1,
-	0xca, 0xee, 0xdf, 0x72, 0x70, 0x3d, 0xf3, 0xf3, 0x2c, 0xbe, 0x0f, 0x77, 0x99, 0xb4, 0x6e, 0x08,
-	0x4a, 0xe7, 0xe8, 0x2c, 0xc3, 0x2b, 0x91, 0xd7, 0xd2, 0x88, 0x54, 0x89, 0x4b, 0xf1, 0x4f, 0x54,
-	0x23, 0x11, 0xc1, 0x75, 0x9e, 0xa8, 0xf6, 0x68, 0xb2, 0x3d, 0x84, 0x07, 0x19, 0x4c, 0x8d, 0xa8,
-	0xa7, 0x72, 0x87, 0x1e, 0x20, 0x5d, 0x22, 0xa7, 0xb2, 0x28, 0xa1, 0xe2, 0xee, 0x1f, 0x0a, 0xd0,
-	0x5c, 0xfb, 0xee, 0x8b, 0x5b, 0x70, 0xed, 0x54, 0xe8, 0x0d, 0xa4, 0xcd, 0x6a, 0x7c, 0x0d, 0x50,
-	0x82, 0xc3, 0xfb, 0x89, 0x1c, 0xad, 0x53, 0x6b, 0x78, 0x6e, 0x7c, 0x9e, 0x16, 0xb6, 0x04, 0x9d,
-	0x76, 0xca, 0xba, 0x29, 0x88, 0xa8, 0x90, 0xc9, 0xe8, 0x88, 0xa8, 0x98, 0xd2, 0x24, 0xf4, 0x35,
-	0x89, 0x48, 0xb4, 0xd7, 0x59, 0x5f, 0xf7, 0x85, 0x60, 0x18, 0x3a, 0x2a, 0xa7, 0xa8, 0x27, 0x12,
-	0x31, 0xbe, 0x43, 0x95, 0x94, 0x0e, 0x51, 0xea, 0xe9, 0xf2, 0x40, 0x47, 0x55, 0x9a, 0xd3, 0x09,
-	0xba, 0x26, 0x11, 0x91, 0xd6, 0x3a, 0x72, 0x82, 0x6a, 0x18, 0xc3, 0x56, 0x82, 0x45, 0xb4, 0x3e,
-	0x82, 0x14, 0x4d, 0xec, 0xf7, 0x79, 0x71, 0x4d, 0xd0, 0x0c, 0x32, 0x30, 0x4e, 0x4c, 0x46, 0x40,
-	0x8d, 0xd4, 0xb2, 0xa1, 0x7a, 0xd4, 0xc4, 0xd7, 0x61, 0x27, 0x41, 0xef, 0xd3, 0xcc, 0xd1, 0xd1,
-	0x56, 0xca, 0xf6, 0xa3, 0x33, 0x43, 0xd2, 0xd1, 0x76, 0x6a, 0xd1, 0xce, 0x51, 0x1f, 0xa1, 0xdd,
-	0xef, 0x0b, 0x00, 0xab, 0x46, 0x73, 0xb5, 0x0d, 0x5d, 0x14, 0x7a, 0xeb, 0xd1, 0x89, 0x97, 0xe2,
-	0xac, 0x33, 0x55, 0x34, 0x54, 0x94, 0x4b, 0x93, 0xbf, 0x93, 0x34, 0x43, 0x45, 0xf9, 0x95, 0x05,
-	0x9c, 0x2c, 0x18, 0x86, 0x8a, 0x0a, 0x69, 0x70, 0x57, 0xea, 0x1b, 0x2a, 0x2a, 0xa6, 0xc1, 0x9a,
-	0x2c, 0xaa, 0xc9, 0xb0, 0x70, 0xaa, 0x22, 0x28, 0x2a, 0x2a, 0xa7, 0x55, 0xf4, 0x65, 0x91, 0xa8,
-	0xa8, 0xb2, 0x49, 0xee, 0xf5, 0x64, 0x54, 0x4d, 0x93, 0x07, 0x8a, 0x6c, 0xe8, 0xa8, 0x96, 0x56,
-	0xfd, 0x5c, 0xee, 0xa9, 0x08, 0xd2, 0xd4, 0xbe, 0x74, 0x2c, 0xa0, 0x7a, 0x9a, 0x7a, 0x2c, 0x1f,
-	0x0b, 0xa8, 0x91, 0xa6, 0x1a, 0x12, 0x11, 0x50, 0x73, 0x63, 0x23, 0x92, 0x21, 0xa0, 0x2d, 0x7c,
-	0x15, 0xb6, 0x93, 0x54, 0xe9, 0xa5, 0x80, 0xb6, 0x37, 0xfd, 0x66, 0x18, 0x02, 0x42, 0x9b, 0x5e,
-	0xa6, 0xe4, 0x9d, 0xdd, 0xdf, 0xe4, 0xa0, 0x91, 0xfc, 0x9f, 0x41, 0x8f, 0x27, 0xbf, 0xfd, 0xd9,
-	0xd9, 0x1b, 0xe8, 0xe9, 0x83, 0xb4, 0xce, 0x54, 0x9f, 0xa3, 0x1c, 0x2d, 0x71, 0x69, 0x11, 0xe1,
-	0x54, 0x90, 0x7b, 0xf4, 0x06, 0x41, 0x79, 0x5a, 0x4e, 0xd6, 0xd9, 0x8a, 0xaa, 0xd0, 0xcb, 0x44,
-	0x30, 0x64, 0x55, 0xa1, 0x45, 0x70, 0xf7, 0xfb, 0x1c, 0x6c, 0xa7, 0x3e, 0xe8, 0xd0, 0x9c, 0xda,
-	0x38, 0xc7, 0x3f, 0xf1, 0x1b, 0x2d, 0xfb, 0x9a, 0xa0, 0x2a, 0xa8, 0x84, 0xeb, 0x50, 0x51, 0x8e,
-	0x4d, 0x4d, 0x55, 0x0e, 0xd7, 0xbe, 0xd1, 0x5e, 0x87, 0x1d, 0x51, 0xed, 0x1f, 0xa9, 0x26, 0x15,
-	0x36, 0x43, 0xb9, 0x2a, 0xbe, 0x01, 0x3b, 0x6c, 0x69, 0x45, 0x35, 0x4c, 0x5a, 0x33, 0x45, 0x43,
-	0xea, 0xa0, 0xff, 0xe6, 0x8e, 0xbe, 0xfa, 0xee, 0x8b, 0x89, 0x13, 0xbc, 0x5a, 0x9e, 0xef, 0x0d,
-	0xdd, 0xd9, 0xbe, 0xbb, 0xb0, 0xe7, 0x43, 0xd7, 0x1b, 0xed, 0x8f, 0xec, 0x0b, 0x67, 0x68, 0x7f,
-	0x3e, 0xb3, 0xe6, 0xd6, 0xc4, 0x9e, 0xd9, 0xf3, 0xe0, 0x73, 0x67, 0x1e, 0xd8, 0xde, 0xd8, 0x1a,
-	0xda, 0xfb, 0x17, 0x8f, 0xf7, 0x27, 0xee, 0xfe, 0x68, 0xe6, 0x9c, 0x97, 0x59, 0x93, 0xf0, 0xf8,
-	0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x35, 0x9b, 0x5d, 0x4d, 0x0b, 0x1d, 0x00, 0x00,
+	// 3060 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x59, 0xcd, 0x8e, 0xdb, 0xc8,
+	0xf1, 0xb7, 0xbe, 0xa5, 0x92, 0x66, 0xa6, 0xa7, 0xfd, 0x35, 0xfe, 0x5a, 0xdb, 0x5a, 0x7b, 0x61,
+	0xcf, 0x7f, 0x77, 0x66, 0x3c, 0xb6, 0xff, 0xf0, 0xee, 0x62, 0x11, 0x50, 0x14, 0x35, 0xe2, 0x5a,
+	0x22, 0xb9, 0x4d, 0x6a, 0xec, 0xd9, 0x1c, 0x08, 0x8e, 0x44, 0x8d, 0x09, 0x48, 0xa2, 0x40, 0x52,
+	0xe3, 0x31, 0x90, 0x53, 0x92, 0x7b, 0x9e, 0x20, 0xb7, 0x45, 0x90, 0x53, 0x0e, 0x41, 0x8e, 0x39,
+	0x04, 0x08, 0x72, 0xcc, 0x03, 0xe4, 0x19, 0x72, 0xc8, 0x21, 0x0f, 0x90, 0xa0, 0xbb, 0x49, 0x8a,
+	0xa2, 0x68, 0xaf, 0x17, 0xc8, 0xad, 0xbb, 0xea, 0x57, 0xd5, 0xd5, 0x55, 0xd5, 0xd5, 0x5d, 0x24,
+	0x34, 0x46, 0x53, 0x67, 0xff, 0xcd, 0xdb, 0xbd, 0xb9, 0xe7, 0x06, 0x2e, 0x2e, 0x8c, 0xa6, 0xce,
+	0xcd, 0xbb, 0x67, 0xae, 0x7b, 0x36, 0xb1, 0xf7, 0x19, 0xe9, 0x74, 0x31, 0xde, 0x0f, 0x9c, 0xa9,
+	0xed, 0x07, 0xd6, 0x74, 0xce, 0x51, 0xcd, 0x9b, 0x50, 0x1c, 0x2c, 0x9c, 0x11, 0xc6, 0x50, 0x5c,
+	0x2c, 0x9c, 0xd1, 0x4e, 0xee, 0x5e, 0xee, 0x51, 0x8d, 0xb0, 0x71, 0xf3, 0xff, 0x00, 0xba, 0x96,
+	0x37, 0x7a, 0x6b, 0x79, 0xb6, 0xdc, 0xc6, 0x77, 0x12, 0x88, 0xfa, 0x61, 0x6d, 0x6f, 0x34, 0x75,
+	0xf6, 0xa8, 0x68, 0x08, 0xbe, 0x0e, 0x85, 0x81, 0xe7, 0x60, 0x04, 0x85, 0x85, 0xe7, 0x84, 0x6a,
+	0xe8, 0xb0, 0xf9, 0xeb, 0x02, 0x6c, 0x8a, 0xee, 0x74, 0xee, 0xce, 0xec, 0x59, 0xa0, 0x07, 0x56,
+	0x60, 0xe3, 0x2e, 0x60, 0x9f, 0x0e, 0xcc, 0x89, 0xe5, 0x07, 0xe6, 0xf0, 0x8d, 0x35, 0x3b, 0xb3,
+	0x23, 0xc5, 0x37, 0xf7, 0xb8, 0xc9, 0x7b, 0x91, 0xc9, 0x7b, 0x46, 0x64, 0x32, 0x41, 0x4c, 0xaa,
+	0x67, 0xf9, 0x81, 0xc8, 0x65, 0xf0, 0x97, 0x50, 0xb7, 0x46, 0x53, 0x67, 0x66, 0x32, 0xce, 0x4e,
+	0xfe, 0x5e, 0xee, 0xd1, 0xe6, 0xe1, 0x0e, 0xb3, 0x2d, 0x5e, 0x53, 0xa0, 0x00, 0xb6, 0x30, 0x01,
+	0x2b, 0x1e, 0xe3, 0xff, 0x07, 0x70, 0xe7, 0xb6, 0x17, 0x4a, 0x16, 0x98, 0xe4, 0xf5, 0x55, 0x49,
+	0x75, 0x6e, 0x7b, 0x5c, 0xb0, 0xe6, 0x46, 0x43, 0xba, 0xe4, 0xc2, 0xb7, 0xce, 0xec, 0x50, 0xb0,
+	0x98, 0xb5, 0xe4, 0x80, 0x02, 0xc2, 0x25, 0x17, 0xf1, 0x98, 0x59, 0x3b, 0xb1, 0xbc, 0x69, 0x28,
+	0x5a, 0xca, 0xb4, 0x96, 0x02, 0x22, 0x6b, 0xe3, 0x31, 0xfe, 0x19, 0x6c, 0xf8, 0x81, 0x35, 0x1b,
+	0x9d, 0xbe, 0x0b, 0x85, 0xcb, 0x4c, 0xf8, 0xe6, 0xaa, 0xb0, 0xce, 0x21, 0x5c, 0xbc, 0xe1, 0x27,
+	0x66, 0xcd, 0x7f, 0xe6, 0xe1, 0xf2, 0x12, 0x67, 0xcf, 0x7c, 0xd7, 0x6b, 0x5b, 0x81, 0x85, 0xaf,
+	0x40, 0xe9, 0xdc, 0x9a, 0x2c, 0x6c, 0xe6, 0xfe, 0x12, 0xe1, 0x13, 0xfc, 0x19, 0x14, 0x83, 0x77,
+	0xf3, 0xc8, 0xa1, 0x98, 0xad, 0x42, 0xe1, 0xc7, 0x94, 0x6b, 0xbc, 0x9b, 0xdb, 0x84, 0xf1, 0xf1,
+	0x43, 0x28, 0xf9, 0x43, 0x6b, 0x12, 0xf9, 0x6f, 0x8b, 0x01, 0x19, 0x48, 0xa7, 0x64, 0xc2, 0xb9,
+	0xf8, 0x36, 0xd4, 0xe6, 0x9e, 0x3d, 0x74, 0x7c, 0xc7, 0x9d, 0x31, 0x8f, 0x95, 0xc8, 0x92, 0x80,
+	0x1f, 0x43, 0x99, 0xee, 0x69, 0xe1, 0x87, 0x1e, 0xd9, 0x66, 0x5a, 0xb8, 0x8d, 0x3a, 0x63, 0x90,
+	0x10, 0x80, 0x3f, 0x85, 0x8d, 0xc5, 0xcc, 0x09, 0x7c, 0x73, 0xe4, 0xf8, 0xf3, 0x89, 0xf5, 0x8e,
+	0xb9, 0xa1, 0x46, 0x1a, 0x8c, 0xd8, 0xe6, 0x34, 0xfc, 0x02, 0x6a, 0x71, 0x9a, 0xef, 0x54, 0x7e,
+	0x34, 0xab, 0x96, 0x60, 0xbc, 0x0b, 0xdb, 0x6c, 0xff, 0xe6, 0x62, 0x3e, 0xa2, 0xf9, 0xe9, 0x51,
+	0x4f, 0x57, 0xef, 0xe5, 0x1e, 0x6d, 0x90, 0x2d, 0xc6, 0x18, 0x30, 0x3a, 0xa1, 0x11, 0xb9, 0x05,
+	0xb5, 0x91, 0x15, 0x58, 0x26, 0xf3, 0x53, 0x8d, 0x99, 0x51, 0xa5, 0x04, 0xea, 0x9d, 0xe6, 0xbf,
+	0xca, 0x70, 0x5d, 0x73, 0xbd, 0x60, 0x19, 0xd6, 0x20, 0xf0, 0x9c, 0xd3, 0x45, 0x60, 0xfb, 0xf8,
+	0x3b, 0xd8, 0x1c, 0xba, 0xb3, 0x99, 0x3d, 0x0c, 0x5c, 0x8f, 0x4b, 0xe7, 0xd8, 0xb6, 0x77, 0xd9,
+	0xb6, 0xdf, 0x23, 0xb5, 0x27, 0x46, 0x22, 0xcc, 0xfb, 0x1b, 0xc3, 0xe4, 0x14, 0xbf, 0x80, 0x92,
+	0x3f, 0xb7, 0xed, 0x51, 0x18, 0xaf, 0xe6, 0x07, 0x35, 0xe9, 0x14, 0x49, 0xb8, 0x00, 0x16, 0xa0,
+	0xca, 0x5c, 0x32, 0x74, 0x27, 0x61, 0x0c, 0x1f, 0x7e, 0x50, 0x58, 0x0b, 0xc1, 0x24, 0x16, 0xc3,
+	0x0f, 0x61, 0x73, 0xfe, 0xe6, 0x9d, 0xef, 0x0c, 0xad, 0x89, 0x39, 0xb1, 0x4e, 0xed, 0x09, 0x8b,
+	0x70, 0x8d, 0x6c, 0x44, 0xd4, 0x1e, 0x25, 0xd2, 0xd0, 0x4d, 0xad, 0xf9, 0xdc, 0x99, 0x9d, 0x85,
+	0xa8, 0x12, 0x0f, 0x5d, 0x48, 0xe4, 0xa0, 0x67, 0xb0, 0x31, 0x77, 0x67, 0xa6, 0x33, 0x32, 0x87,
+	0xee, 0x6c, 0xec, 0x9c, 0xb1, 0xf8, 0xd6, 0x0f, 0x51, 0x68, 0xd3, 0x4c, 0x1e, 0x89, 0x8c, 0x4e,
+	0xea, 0xf3, 0xe5, 0x04, 0x3f, 0x85, 0xab, 0x6c, 0x37, 0xa6, 0xb5, 0x08, 0xdc, 0x99, 0x7d, 0xe6,
+	0x06, 0x8e, 0x15, 0xd0, 0x54, 0xa3, 0xc1, 0xaf, 0x92, 0x2b, 0x8c, 0x29, 0xac, 0xf2, 0xf0, 0xe7,
+	0x50, 0x1d, 0x39, 0xf4, 0x88, 0x0c, 0x79, 0x88, 0x13, 0xab, 0xb4, 0x43, 0x3a, 0x89, 0x11, 0xcd,
+	0x39, 0x6c, 0xac, 0x44, 0x00, 0xdf, 0x86, 0x1d, 0x51, 0x55, 0x14, 0x49, 0x34, 0x54, 0x62, 0x1a,
+	0x27, 0x9a, 0x64, 0x0e, 0x94, 0xb6, 0xd4, 0x91, 0x15, 0xa9, 0x8d, 0x2e, 0xe1, 0x2a, 0x14, 0xc9,
+	0xb7, 0xcf, 0x9e, 0xa3, 0x1c, 0x6e, 0x40, 0xb5, 0x23, 0xb7, 0x24, 0x62, 0xf6, 0x44, 0x94, 0xc7,
+	0x5b, 0x50, 0xe7, 0x33, 0x5d, 0x34, 0x35, 0x11, 0x15, 0xf0, 0x06, 0xd4, 0x38, 0xa1, 0xaf, 0xa9,
+	0xa8, 0x88, 0x6b, 0x50, 0x22, 0xfa, 0xe1, 0xd3, 0x43, 0x54, 0x6a, 0xfe, 0x21, 0x07, 0x25, 0x16,
+	0x2a, 0x7c, 0x19, 0xb6, 0x74, 0x4d, 0x92, 0xda, 0x2b, 0x2b, 0xd4, 0xa1, 0xd2, 0x3e, 0x51, 0x84,
+	0xbe, 0x2c, 0xa2, 0x1c, 0xd5, 0x72, 0x24, 0x1f, 0x09, 0x2d, 0xd9, 0x30, 0x9f, 0xa0, 0x3c, 0xde,
+	0x04, 0x88, 0xa7, 0x07, 0xa8, 0x90, 0x9c, 0x1f, 0x3e, 0x47, 0xc5, 0xe4, 0xfc, 0xd9, 0x01, 0x2a,
+	0x51, 0xab, 0x96, 0xf8, 0x03, 0x54, 0x4e, 0x12, 0x9e, 0x1d, 0x1c, 0xa0, 0x0a, 0x46, 0xd0, 0xe8,
+	0x4b, 0x91, 0x86, 0x83, 0x03, 0x54, 0x4d, 0x52, 0x9e, 0x1c, 0x3e, 0x3f, 0x40, 0xb5, 0xe6, 0x2f,
+	0xa0, 0x1a, 0x65, 0x07, 0xbe, 0x06, 0x58, 0x23, 0xaa, 0xa1, 0x8a, 0x6a, 0x6f, 0xc5, 0xea, 0x06,
+	0x54, 0x25, 0xa3, 0x2b, 0x11, 0x45, 0x32, 0x50, 0x8e, 0x7a, 0xe9, 0x48, 0x53, 0x15, 0x94, 0xa7,
+	0xfb, 0x7e, 0xcd, 0x86, 0x05, 0x0c, 0x50, 0x7e, 0x7d, 0xa4, 0xd3, 0x31, 0x73, 0xc7, 0x51, 0x47,
+	0xd0, 0x0d, 0x54, 0xa2, 0x64, 0x5d, 0x22, 0xb2, 0xd0, 0x43, 0x65, 0x2a, 0x27, 0x51, 0x40, 0x85,
+	0x8e, 0x5a, 0xb2, 0xa1, 0xa3, 0x6a, 0x73, 0x02, 0xf5, 0x44, 0xe4, 0xf0, 0x7d, 0x68, 0x4c, 0xad,
+	0x0b, 0x33, 0x8e, 0x70, 0x8e, 0x1d, 0xe2, 0xfa, 0xd4, 0xba, 0x88, 0x21, 0x5f, 0xc1, 0x0d, 0x0e,
+	0x19, 0x8f, 0x6d, 0xcf, 0x9e, 0x05, 0x8e, 0x35, 0x59, 0xe2, 0xf3, 0x0c, 0x7f, 0x9d, 0xe1, 0x97,
+	0xfc, 0x48, 0xb6, 0xf9, 0xab, 0x1c, 0xdc, 0x59, 0x39, 0x22, 0xfc, 0x42, 0x4a, 0x9c, 0xf2, 0xb5,
+	0x4c, 0xce, 0x7d, 0x4c, 0x26, 0x27, 0x93, 0x32, 0xff, 0xa3, 0x49, 0xf9, 0x73, 0x78, 0x60, 0x78,
+	0xd6, 0xcc, 0x1f, 0xda, 0xce, 0xb9, 0xed, 0xbd, 0xdf, 0x96, 0xa7, 0x00, 0x01, 0xc5, 0x25, 0xab,
+	0xcd, 0x15, 0xa6, 0x37, 0x21, 0xce, 0xea, 0x4a, 0x8d, 0xe1, 0x58, 0x09, 0x1b, 0x32, 0x87, 0xc6,
+	0x96, 0x5d, 0x85, 0x32, 0xdf, 0x0f, 0x93, 0x6f, 0x90, 0x12, 0x33, 0x1b, 0x7f, 0x03, 0xb7, 0xc2,
+	0x6d, 0x32, 0xc9, 0xa9, 0x13, 0x98, 0x73, 0xdb, 0x73, 0xdc, 0x91, 0x33, 0x74, 0x82, 0x77, 0xa1,
+	0x1b, 0x77, 0x18, 0xd6, 0x08, 0x01, 0xda, 0x92, 0xdf, 0x94, 0xe0, 0xb6, 0xe8, 0xce, 0x02, 0xcb,
+	0x99, 0x25, 0xec, 0x4f, 0x58, 0xbe, 0x5e, 0x5b, 0x72, 0x19, 0xb5, 0xa5, 0xf9, 0xb7, 0x1c, 0x5c,
+	0xd3, 0xfc, 0x45, 0x96, 0x86, 0x13, 0xd8, 0xf6, 0x17, 0xf3, 0xb9, 0xeb, 0x05, 0xf6, 0xc8, 0x3c,
+	0x77, 0x27, 0x81, 0x75, 0x16, 0xb9, 0xe0, 0x73, 0xee, 0xda, 0x4c, 0xb9, 0x3d, 0x3d, 0x12, 0x3a,
+	0xe6, 0x32, 0x04, 0xf9, 0x29, 0x4a, 0x53, 0x03, 0x94, 0x46, 0xe1, 0xbb, 0x70, 0x4b, 0x1f, 0x68,
+	0x9a, 0x4a, 0x0c, 0xa9, 0x6d, 0x1e, 0xab, 0x3d, 0x43, 0x38, 0x5a, 0xad, 0x0c, 0x15, 0x28, 0x1c,
+	0x3f, 0x7b, 0xc1, 0x93, 0xff, 0xf8, 0xf0, 0xe9, 0x01, 0xca, 0xb3, 0xd1, 0x93, 0x27, 0xcf, 0x51,
+	0xa1, 0xf9, 0xc7, 0x12, 0xdc, 0xcd, 0x8a, 0xa8, 0x9f, 0xd8, 0x90, 0x06, 0xf5, 0xb1, 0xeb, 0x4d,
+	0xcd, 0xb1, 0x45, 0x6b, 0x51, 0xb8, 0x95, 0xfd, 0x74, 0x34, 0xb3, 0x44, 0xf7, 0x3a, 0xae, 0x37,
+	0xed, 0x30, 0x31, 0x02, 0xe3, 0x78, 0x9c, 0x4a, 0x8f, 0xfc, 0x47, 0xa5, 0xc7, 0xda, 0x01, 0x2b,
+	0xac, 0x1f, 0xb0, 0x6f, 0x00, 0x27, 0x21, 0x26, 0x7f, 0x29, 0x14, 0xb3, 0x5f, 0x0a, 0x28, 0x21,
+	0xc9, 0x28, 0xf4, 0xc2, 0xf0, 0x2e, 0xcc, 0xb7, 0xd6, 0xb9, 0x3d, 0xb1, 0x67, 0x67, 0xc1, 0x9b,
+	0x9d, 0xd2, 0xbd, 0xc2, 0xa3, 0x0d, 0xd2, 0xf0, 0x2e, 0x5e, 0xc5, 0x34, 0x0a, 0x0a, 0x56, 0x40,
+	0x65, 0x0e, 0x0a, 0x92, 0xa0, 0xaf, 0x00, 0x2d, 0x11, 0xa1, 0x19, 0x95, 0x6c, 0x33, 0xb6, 0x96,
+	0x40, 0x6e, 0xc5, 0x0d, 0xa8, 0x06, 0x17, 0xe6, 0xdc, 0x7d, 0x6b, 0x7b, 0x3b, 0xd5, 0x7b, 0x85,
+	0x47, 0x25, 0x52, 0x09, 0x2e, 0x34, 0x3a, 0xc5, 0xcf, 0x61, 0x33, 0x62, 0x85, 0x4a, 0x6b, 0xd9,
+	0x4a, 0x1b, 0xa1, 0x04, 0x9b, 0x35, 0xff, 0x9e, 0x03, 0x58, 0x46, 0x02, 0x5f, 0x87, 0xcb, 0x1d,
+	0x95, 0xf4, 0xcd, 0x8e, 0xc0, 0xae, 0x92, 0x81, 0xf2, 0x52, 0x51, 0x5f, 0x29, 0xfc, 0x0e, 0xf9,
+	0x4e, 0xef, 0x68, 0xbc, 0xbc, 0xd3, 0x91, 0xa9, 0xf5, 0x06, 0x3a, 0xca, 0xd3, 0x52, 0x48, 0xa7,
+	0x87, 0x2f, 0x50, 0x81, 0xa6, 0x13, 0xc5, 0x14, 0x69, 0x65, 0x8d, 0x21, 0x25, 0x4a, 0x7e, 0xdd,
+	0xd1, 0x78, 0xa9, 0x14, 0x3b, 0xda, 0x33, 0x5e, 0x2a, 0xc5, 0x8e, 0x76, 0x88, 0xaa, 0x6c, 0xa4,
+	0x09, 0x2f, 0x51, 0x0d, 0x97, 0x21, 0xff, 0xfa, 0x10, 0x01, 0xad, 0xb3, 0x2a, 0x2d, 0xcb, 0xa8,
+	0x4e, 0x25, 0xc5, 0x8e, 0x86, 0x1a, 0x54, 0x21, 0xc5, 0x9b, 0x82, 0xa8, 0xa2, 0x8d, 0x78, 0xd6,
+	0x16, 0x55, 0xb4, 0x49, 0x2f, 0x1f, 0x66, 0x50, 0xbb, 0x8d, 0xb6, 0x9a, 0xff, 0xa8, 0x40, 0x2d,
+	0x4e, 0x37, 0xda, 0x48, 0xcc, 0xac, 0xa9, 0x1d, 0x35, 0x12, 0x74, 0x8c, 0x1f, 0x41, 0x69, 0x38,
+	0xb1, 0x7c, 0x7f, 0xe5, 0x39, 0x19, 0x8b, 0xb0, 0xcc, 0xe2, 0x00, 0x7c, 0x0f, 0xea, 0x23, 0xdb,
+	0x1f, 0x7a, 0xce, 0x9c, 0xdd, 0xdf, 0x05, 0xa6, 0x24, 0x49, 0xc2, 0xd7, 0xa0, 0x3c, 0xb7, 0x68,
+	0x39, 0x0e, 0x5f, 0x19, 0xe1, 0x0c, 0x3f, 0x80, 0x4d, 0x3e, 0x32, 0x3d, 0x7b, 0x62, 0xce, 0x5d,
+	0xfe, 0x98, 0x2c, 0x91, 0x06, 0xa7, 0x12, 0x7b, 0xa2, 0xb9, 0x3e, 0xde, 0x85, 0xea, 0xf0, 0x8d,
+	0x33, 0x19, 0x79, 0xf6, 0x8c, 0x65, 0x4a, 0xfd, 0x70, 0x73, 0xd5, 0x18, 0x12, 0xf3, 0x69, 0x86,
+	0xbf, 0x09, 0xdb, 0x1f, 0xd3, 0xb3, 0xcf, 0x59, 0xc6, 0xd4, 0x48, 0x3d, 0xa2, 0x11, 0xfb, 0x9c,
+	0x42, 0xc6, 0x8e, 0x37, 0x8d, 0x21, 0x55, 0x0e, 0x89, 0x68, 0x21, 0xc4, 0x77, 0xc7, 0x41, 0x0c,
+	0xe1, 0x2f, 0xc5, 0x7a, 0x44, 0xa3, 0x90, 0x3b, 0x00, 0xbe, 0xed, 0xd1, 0xeb, 0x67, 0xb6, 0x98,
+	0xee, 0x00, 0x03, 0xd4, 0x38, 0x45, 0x59, 0x4c, 0x69, 0x06, 0x4e, 0xc7, 0x67, 0x26, 0xf3, 0x6a,
+	0x9d, 0x31, 0x2b, 0xd3, 0xf1, 0x99, 0x42, 0x1d, 0x7b, 0x07, 0x60, 0xea, 0x8e, 0xec, 0x09, 0x67,
+	0x36, 0xb8, 0x24, 0xa3, 0x30, 0xf6, 0x15, 0x28, 0x59, 0x13, 0xc7, 0xf2, 0x77, 0x36, 0x18, 0x87,
+	0x4f, 0xa8, 0x3e, 0xcb, 0xf7, 0xed, 0x80, 0xd6, 0xf2, 0x4d, 0xae, 0x8f, 0xcd, 0xe5, 0x11, 0x2d,
+	0xf2, 0x8e, 0x6f, 0x8e, 0xbd, 0xc5, 0xce, 0x16, 0x7b, 0x39, 0x95, 0x1c, 0xbf, 0xe3, 0x2d, 0xf0,
+	0x73, 0x6e, 0x01, 0x7d, 0xfa, 0xee, 0xa0, 0x1f, 0x7d, 0x4f, 0x53, 0xeb, 0xda, 0xf4, 0x85, 0x7c,
+	0x93, 0xf7, 0x82, 0xdb, 0x4c, 0xa2, 0xca, 0x1b, 0x46, 0xcf, 0x61, 0x5d, 0x61, 0xdc, 0x4d, 0xe2,
+	0xcc, 0x6e, 0x12, 0x3f, 0x86, 0x12, 0x6f, 0x73, 0x2e, 0x33, 0xfe, 0xe5, 0xb5, 0x36, 0x27, 0xa0,
+	0xbd, 0x45, 0xd4, 0x54, 0xf9, 0xac, 0x55, 0xa0, 0xf6, 0x59, 0x3b, 0x57, 0x58, 0x54, 0x53, 0x4d,
+	0xd5, 0xb2, 0xdf, 0x21, 0xe0, 0x2f, 0x7b, 0x9f, 0xaf, 0xa1, 0x46, 0xab, 0xb7, 0x69, 0x05, 0x81,
+	0xb7, 0x73, 0xc8, 0x56, 0xba, 0xfd, 0xa1, 0xd7, 0x6f, 0xf7, 0x12, 0xa9, 0x52, 0x01, 0x4a, 0xc1,
+	0xdf, 0xb2, 0x67, 0x3c, 0xbf, 0xba, 0xb8, 0x86, 0xa7, 0x4c, 0xc3, 0xfd, 0x70, 0xe9, 0xf7, 0xdf,
+	0x6a, 0xdd, 0x4b, 0xec, 0xfd, 0xce, 0xf9, 0x4c, 0xd7, 0x0b, 0xa8, 0xce, 0xfd, 0x05, 0xd7, 0xf2,
+	0x8c, 0x69, 0xb9, 0xf5, 0x81, 0xbb, 0xa9, 0x7b, 0x89, 0x54, 0xe6, 0xfe, 0x82, 0x49, 0x7e, 0x07,
+	0x28, 0x58, 0x16, 0x69, 0xae, 0xe1, 0x39, 0xd3, 0xf0, 0xe0, 0x63, 0xae, 0x84, 0xee, 0x25, 0xb2,
+	0x95, 0x90, 0xa7, 0x8c, 0x16, 0x40, 0xd5, 0x9f, 0xdb, 0x43, 0x67, 0xec, 0x0c, 0x9b, 0xbf, 0xcf,
+	0x41, 0x35, 0xfa, 0x06, 0x80, 0xbf, 0x86, 0x7a, 0xa2, 0x61, 0xff, 0x88, 0x7e, 0x1d, 0x26, 0x71,
+	0xab, 0x8e, 0x9b, 0x50, 0xf4, 0x5c, 0x37, 0x08, 0x5f, 0x35, 0xe9, 0x53, 0xc7, 0x78, 0xf1, 0x02,
+	0xa7, 0xae, 0x1b, 0xd8, 0x23, 0x76, 0xfa, 0x3f, 0x62, 0x81, 0x16, 0x43, 0x37, 0xff, 0x52, 0x80,
+	0xcb, 0x7d, 0x77, 0xe4, 0x8c, 0x1d, 0xeb, 0x74, 0x62, 0xff, 0xaf, 0x0a, 0xd2, 0x67, 0x71, 0xb9,
+	0x29, 0x64, 0x1a, 0xfe, 0xfe, 0xf2, 0x53, 0xcc, 0x28, 0x3f, 0xf1, 0x81, 0x2c, 0xbd, 0xef, 0x40,
+	0x96, 0x57, 0x0f, 0x64, 0x78, 0x84, 0x2a, 0x59, 0x47, 0x28, 0xf5, 0xed, 0xa3, 0xfa, 0x13, 0xbe,
+	0x7d, 0x08, 0xeb, 0x89, 0x9f, 0xd1, 0x33, 0xa6, 0xdf, 0x91, 0x2b, 0xe9, 0xdf, 0x81, 0x6a, 0xe0,
+	0x5d, 0x24, 0x13, 0xff, 0xf1, 0x7b, 0x13, 0x2e, 0x43, 0x51, 0x25, 0xf0, 0x2e, 0xd2, 0xd9, 0xb6,
+	0xfb, 0xa7, 0x02, 0xed, 0xb2, 0x12, 0x51, 0xe0, 0x5d, 0x56, 0x5f, 0x53, 0x15, 0x49, 0x31, 0xd6,
+	0xbb, 0xac, 0x9b, 0x70, 0x6d, 0x8d, 0xcb, 0x6f, 0xcf, 0x5c, 0x06, 0x4f, 0xec, 0x0a, 0xba, 0x2e,
+	0xd3, 0x0b, 0x74, 0x5d, 0x6b, 0x4b, 0x10, 0x5f, 0x6a, 0x3d, 0x41, 0x91, 0x50, 0x21, 0x83, 0x2b,
+	0xaa, 0x8a, 0x21, 0xc8, 0x8a, 0x44, 0x50, 0x91, 0x3e, 0xf0, 0x52, 0x5c, 0x4d, 0x7d, 0x45, 0x1b,
+	0xba, 0x81, 0xa6, 0xf5, 0x4e, 0x50, 0x89, 0xb6, 0x3e, 0x29, 0x40, 0x47, 0x50, 0x50, 0x19, 0xdf,
+	0x80, 0xab, 0x29, 0xba, 0x2e, 0x29, 0xba, 0x4a, 0x50, 0x25, 0x83, 0xd5, 0x57, 0xdb, 0x83, 0x9e,
+	0x84, 0xaa, 0xf4, 0x75, 0xb0, 0xb6, 0x1c, 0x31, 0x50, 0x2d, 0x63, 0x19, 0x51, 0x1b, 0x20, 0xc8,
+	0xd8, 0x77, 0x4b, 0x30, 0x0c, 0x89, 0x9c, 0xa0, 0x7a, 0x06, 0x4f, 0x37, 0x54, 0x22, 0x1c, 0x49,
+	0xa8, 0x91, 0x65, 0x83, 0xd4, 0x57, 0xc9, 0x09, 0xda, 0xc0, 0x9f, 0xc0, 0xcd, 0x14, 0xcb, 0x20,
+	0x82, 0xa2, 0x8b, 0x92, 0x7c, 0x2c, 0x11, 0xb4, 0xb9, 0xfb, 0xef, 0x5c, 0xe2, 0xd3, 0xd2, 0x32,
+	0xe3, 0x22, 0x39, 0x53, 0x68, 0xf7, 0x65, 0xc5, 0xd4, 0x0d, 0xc1, 0x58, 0x0d, 0x5f, 0xe8, 0xe8,
+	0x14, 0x3f, 0x0a, 0xe0, 0x2d, 0xb8, 0xbe, 0xc6, 0xed, 0xa9, 0xe2, 0x4b, 0xa9, 0x8d, 0xf2, 0xb8,
+	0x09, 0x9f, 0xac, 0x31, 0xf5, 0xee, 0xc0, 0x30, 0x64, 0xe5, 0xc8, 0x6c, 0x53, 0x05, 0x05, 0x7c,
+	0x07, 0x6e, 0x64, 0xa8, 0x0f, 0x55, 0x14, 0x33, 0xd9, 0xb2, 0xae, 0xf6, 0x04, 0x43, 0x6a, 0xa3,
+	0x72, 0x14, 0xe7, 0x15, 0xb6, 0x46, 0xd4, 0xae, 0xdc, 0x92, 0x29, 0xa0, 0xb4, 0xfb, 0xd7, 0x02,
+	0xe0, 0xf5, 0x2f, 0x85, 0xb1, 0x5a, 0x55, 0xa3, 0x49, 0xb1, 0xb6, 0xe7, 0x68, 0x57, 0x2b, 0xec,
+	0x68, 0xcb, 0x91, 0x43, 0x12, 0xcc, 0xb6, 0xac, 0x0b, 0xad, 0x1e, 0xdb, 0x73, 0x86, 0xa8, 0xa4,
+	0x70, 0x66, 0x21, 0x8b, 0x69, 0x48, 0x3a, 0x75, 0x07, 0x2a, 0x46, 0x71, 0x4f, 0x32, 0x15, 0x95,
+	0xf4, 0x85, 0x1e, 0x2a, 0xc5, 0xfb, 0x4c, 0xf0, 0x44, 0x55, 0xe9, 0xc8, 0x47, 0x03, 0x42, 0x85,
+	0xcb, 0xf8, 0x21, 0xdc, 0x4f, 0x03, 0x84, 0x81, 0xa1, 0xf6, 0x05, 0x43, 0x16, 0xcd, 0x9e, 0x2a,
+	0xb4, 0x29, 0xac, 0x92, 0xb5, 0x46, 0x47, 0x90, 0xa9, 0x71, 0x55, 0xfc, 0x19, 0x34, 0xd3, 0xbc,
+	0xae, 0x7c, 0xd4, 0x35, 0x0d, 0xa9, 0xaf, 0xb1, 0xb0, 0xb1, 0x88, 0xd5, 0xf0, 0xa7, 0x70, 0x37,
+	0x8d, 0xeb, 0x0b, 0xca, 0x40, 0xe8, 0x2d, 0x41, 0x80, 0x1f, 0xc3, 0xc3, 0x34, 0x28, 0x3c, 0x81,
+	0xc2, 0x31, 0x8d, 0x7e, 0x0c, 0xad, 0xe3, 0xfb, 0x70, 0x67, 0xcd, 0x29, 0x2c, 0xb3, 0x65, 0xbd,
+	0x2f, 0x18, 0x62, 0x17, 0x35, 0x76, 0x7f, 0x97, 0xcc, 0xdd, 0xe5, 0x67, 0xdb, 0x38, 0x77, 0x07,
+	0x3a, 0x6d, 0xe0, 0xde, 0x9f, 0xbb, 0xab, 0xfc, 0x28, 0x90, 0xe1, 0x61, 0x5a, 0xe1, 0xca, 0xed,
+	0x9e, 0x94, 0x88, 0x62, 0x92, 0x25, 0x88, 0x86, 0x7c, 0x4c, 0x4b, 0x4f, 0x96, 0x5c, 0x6b, 0xa0,
+	0x9f, 0xa0, 0xe2, 0xee, 0x6f, 0x92, 0xdf, 0x6f, 0x97, 0x1f, 0x89, 0x97, 0x87, 0xac, 0x27, 0x90,
+	0xfe, 0x87, 0x0e, 0xd9, 0x0a, 0x3f, 0x32, 0x34, 0xf2, 0x50, 0x5a, 0x9a, 0x98, 0x44, 0xd2, 0x04,
+	0x99, 0xa0, 0xfc, 0xf2, 0x9c, 0x24, 0x20, 0x22, 0x91, 0x0d, 0x59, 0x14, 0x7a, 0xa8, 0x10, 0xc7,
+	0x3d, 0xc9, 0xee, 0x0b, 0xdf, 0xaa, 0x24, 0x91, 0x77, 0x2b, 0x3c, 0x59, 0x51, 0x09, 0x2a, 0x65,
+	0xda, 0xf5, 0x4a, 0x20, 0x0a, 0x4f, 0xba, 0xf8, 0x7c, 0x27, 0xb8, 0xb2, 0xd2, 0x96, 0x0c, 0x89,
+	0xf4, 0x65, 0x45, 0x30, 0x24, 0x54, 0xd9, 0xfd, 0x73, 0x0e, 0xae, 0x66, 0x7e, 0xf9, 0xc6, 0xf7,
+	0xe0, 0x36, 0x93, 0xd6, 0x0d, 0x41, 0x69, 0xb7, 0x4e, 0x32, 0xbc, 0x12, 0x79, 0x2d, 0x8d, 0x48,
+	0xdd, 0x1e, 0x29, 0x7e, 0x57, 0x35, 0x12, 0x11, 0x5c, 0xe5, 0x89, 0x6a, 0x8f, 0x9e, 0xc3, 0x47,
+	0xf0, 0x20, 0x83, 0xa9, 0x11, 0xf5, 0x58, 0x6e, 0xb3, 0xec, 0x94, 0xc8, 0xb1, 0x2c, 0x4a, 0xa8,
+	0xb8, 0xfb, 0xdb, 0x02, 0x6c, 0xac, 0x7c, 0x52, 0xc7, 0x3b, 0x70, 0xe5, 0x58, 0xe8, 0x0d, 0xa4,
+	0xf5, 0x8b, 0xee, 0x0a, 0xa0, 0x04, 0x87, 0xb7, 0x6a, 0x39, 0x7a, 0x05, 0xac, 0xe0, 0xb9, 0xf1,
+	0x79, 0x7a, 0x67, 0x24, 0xe8, 0xc7, 0x6a, 0xcf, 0xd0, 0x4d, 0x41, 0x44, 0x85, 0x4c, 0x46, 0x5b,
+	0x44, 0xc5, 0x94, 0x26, 0xa1, 0xaf, 0x49, 0x44, 0xa2, 0x6d, 0xe4, 0xea, 0xba, 0xaf, 0x04, 0xc3,
+	0xd0, 0x51, 0x39, 0x45, 0xed, 0x4a, 0xc4, 0xf8, 0x1e, 0x55, 0x52, 0x3a, 0x44, 0xa9, 0xa7, 0xcb,
+	0x03, 0x1d, 0x55, 0x69, 0x4e, 0x27, 0xe8, 0x9a, 0x44, 0x44, 0x7a, 0x8d, 0x90, 0x2e, 0xaa, 0x61,
+	0x0c, 0x9b, 0x09, 0x16, 0xd1, 0xfa, 0x08, 0x52, 0x34, 0xb1, 0xdf, 0xe7, 0xf7, 0x56, 0x82, 0x66,
+	0x90, 0x81, 0xd1, 0x35, 0x19, 0x01, 0x35, 0x52, 0xcb, 0x86, 0xea, 0xd1, 0x06, 0xbe, 0x0a, 0xdb,
+	0x09, 0x7a, 0x9f, 0x66, 0x8e, 0x8e, 0x36, 0x53, 0xb6, 0xb7, 0x4e, 0x0c, 0x49, 0x47, 0x5b, 0xa9,
+	0x45, 0xdb, 0xad, 0x3e, 0x42, 0xbb, 0x3f, 0x14, 0x00, 0x96, 0x3d, 0xfc, 0x72, 0x1b, 0xba, 0x28,
+	0xf4, 0x56, 0xa3, 0x13, 0x2f, 0xc5, 0x59, 0x27, 0xaa, 0x68, 0xa8, 0x28, 0x97, 0x26, 0x7f, 0x2f,
+	0x69, 0x86, 0x8a, 0xf2, 0x4b, 0x0b, 0x38, 0x59, 0x30, 0x0c, 0x15, 0x15, 0xd2, 0xe0, 0x8e, 0xd4,
+	0x37, 0x54, 0x54, 0x4c, 0x83, 0x35, 0x59, 0x54, 0x93, 0x61, 0xe1, 0x54, 0x45, 0x50, 0x54, 0x54,
+	0x4e, 0xab, 0xe8, 0xcb, 0x22, 0x51, 0x51, 0x65, 0x9d, 0xdc, 0xeb, 0xc9, 0xa8, 0x9a, 0x26, 0x0f,
+	0x14, 0xd9, 0xd0, 0x51, 0x2d, 0xad, 0xfa, 0xa5, 0xdc, 0x53, 0x11, 0xa4, 0xa9, 0x7d, 0xe9, 0x48,
+	0x40, 0xf5, 0x34, 0xf5, 0x48, 0x3e, 0x12, 0x50, 0x23, 0x4d, 0x35, 0x24, 0x22, 0xa0, 0x8d, 0xb5,
+	0x8d, 0x48, 0x86, 0x80, 0x36, 0xf1, 0x65, 0xd8, 0x4a, 0x52, 0xa5, 0xd7, 0x02, 0xda, 0x5a, 0xf7,
+	0x9b, 0x61, 0x08, 0x08, 0xad, 0x7b, 0x99, 0x92, 0xb7, 0x77, 0x7f, 0x99, 0x83, 0x46, 0xf2, 0x57,
+	0x11, 0x3d, 0x9e, 0xfc, 0x61, 0xc5, 0xce, 0xde, 0x40, 0x4f, 0x1f, 0xa4, 0x55, 0xa6, 0xfa, 0x12,
+	0xe5, 0x68, 0x89, 0x4b, 0x8b, 0x08, 0xc7, 0x82, 0xdc, 0xa3, 0x97, 0x2b, 0xca, 0xd3, 0x72, 0xb2,
+	0xca, 0x56, 0x54, 0x85, 0x5e, 0x29, 0x82, 0x21, 0xab, 0x0a, 0x2d, 0x82, 0xbb, 0x3f, 0xe4, 0x60,
+	0x2b, 0xf5, 0xad, 0x8c, 0xe6, 0xd4, 0xda, 0x39, 0xfe, 0x89, 0x9f, 0xbf, 0xd9, 0x87, 0x1a, 0x55,
+	0x41, 0x25, 0x5c, 0x87, 0x8a, 0x72, 0x64, 0x6a, 0xaa, 0x72, 0xb8, 0xf2, 0xf9, 0xfb, 0x2a, 0x6c,
+	0x8b, 0x6a, 0xbf, 0xa5, 0x9a, 0x54, 0xd8, 0x0c, 0xe5, 0xaa, 0xf8, 0x1a, 0x6c, 0xb3, 0xa5, 0x15,
+	0xd5, 0x30, 0x69, 0xcd, 0x14, 0xe9, 0x8b, 0xe5, 0x3f, 0xb9, 0xd6, 0xd7, 0xdf, 0x7f, 0x79, 0xe6,
+	0x04, 0x6f, 0x16, 0xa7, 0x7b, 0x43, 0x77, 0xba, 0xef, 0xce, 0xed, 0xd9, 0xd0, 0xf5, 0x46, 0xfb,
+	0x23, 0xfb, 0xdc, 0x19, 0xda, 0x5f, 0x4c, 0xad, 0x99, 0x75, 0x66, 0x4f, 0xed, 0x59, 0xf0, 0x85,
+	0x33, 0x0b, 0x6c, 0x6f, 0x6c, 0x0d, 0xed, 0xfd, 0xf3, 0xa7, 0xfb, 0x67, 0xee, 0xfe, 0x68, 0xea,
+	0x9c, 0x96, 0x59, 0xff, 0xf5, 0xf4, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x6b, 0xb1, 0xa0, 0x6b,
+	0x66, 0x1e, 0x00, 0x00,
 }
diff --git a/go/dmi/hw_events_mgmt_service.pb.go b/go/dmi/hw_events_mgmt_service.pb.go
index cfca737..b2fffa4 100644
--- a/go/dmi/hw_events_mgmt_service.pb.go
+++ b/go/dmi/hw_events_mgmt_service.pb.go
@@ -96,6 +96,13 @@
 	// Events for the line cards on the HW Device
 	EventIds_EVENT_LINE_CARD_PLUG_OUT EventIds = 600
 	EventIds_EVENT_LINE_CARD_PLUG_IN  EventIds = 601
+	// Indicates that the a state of a component has changed.
+	// The StateChangeInfo message inside the event conveys the old and new states.
+	EventIds_EVENT_COMPONENT_ADMIN_STATE_CHANGED   EventIds = 700
+	EventIds_EVENT_COMPONENT_OPER_STATE_CHANGED    EventIds = 701
+	EventIds_EVENT_COMPONENT_ALARM_STATE_CHANGED   EventIds = 702
+	EventIds_EVENT_COMPONENT_USAGE_STATE_CHANGED   EventIds = 703
+	EventIds_EVENT_COMPONENT_STANDBY_STATE_CHANGED EventIds = 704
 )
 
 var EventIds_name = map[int32]string{
@@ -154,6 +161,11 @@
 	513: "EVENT_HW_NTP_SYNC_FAILURE_RECOVERED",
 	600: "EVENT_LINE_CARD_PLUG_OUT",
 	601: "EVENT_LINE_CARD_PLUG_IN",
+	700: "EVENT_COMPONENT_ADMIN_STATE_CHANGED",
+	701: "EVENT_COMPONENT_OPER_STATE_CHANGED",
+	702: "EVENT_COMPONENT_ALARM_STATE_CHANGED",
+	703: "EVENT_COMPONENT_USAGE_STATE_CHANGED",
+	704: "EVENT_COMPONENT_STANDBY_STATE_CHANGED",
 }
 
 var EventIds_value = map[string]int32{
@@ -212,6 +224,11 @@
 	"EVENT_HW_NTP_SYNC_FAILURE_RECOVERED":                     513,
 	"EVENT_LINE_CARD_PLUG_OUT":                                600,
 	"EVENT_LINE_CARD_PLUG_IN":                                 601,
+	"EVENT_COMPONENT_ADMIN_STATE_CHANGED":                     700,
+	"EVENT_COMPONENT_OPER_STATE_CHANGED":                      701,
+	"EVENT_COMPONENT_ALARM_STATE_CHANGED":                     702,
+	"EVENT_COMPONENT_USAGE_STATE_CHANGED":                     703,
+	"EVENT_COMPONENT_STANDBY_STATE_CHANGED":                   704,
 }
 
 func (x EventIds) String() string {
@@ -938,6 +955,366 @@
 	return ""
 }
 
+type AdminStateChange struct {
+	Old                  ComponentAdminState `protobuf:"varint,1,opt,name=old,proto3,enum=dmi.ComponentAdminState" json:"old,omitempty"`
+	New                  ComponentAdminState `protobuf:"varint,2,opt,name=new,proto3,enum=dmi.ComponentAdminState" json:"new,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *AdminStateChange) Reset()         { *m = AdminStateChange{} }
+func (m *AdminStateChange) String() string { return proto.CompactTextString(m) }
+func (*AdminStateChange) ProtoMessage()    {}
+func (*AdminStateChange) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{10}
+}
+
+func (m *AdminStateChange) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AdminStateChange.Unmarshal(m, b)
+}
+func (m *AdminStateChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AdminStateChange.Marshal(b, m, deterministic)
+}
+func (m *AdminStateChange) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AdminStateChange.Merge(m, src)
+}
+func (m *AdminStateChange) XXX_Size() int {
+	return xxx_messageInfo_AdminStateChange.Size(m)
+}
+func (m *AdminStateChange) XXX_DiscardUnknown() {
+	xxx_messageInfo_AdminStateChange.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AdminStateChange proto.InternalMessageInfo
+
+func (m *AdminStateChange) GetOld() ComponentAdminState {
+	if m != nil {
+		return m.Old
+	}
+	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
+}
+
+func (m *AdminStateChange) GetNew() ComponentAdminState {
+	if m != nil {
+		return m.New
+	}
+	return ComponentAdminState_COMP_ADMIN_STATE_UNDEFINED
+}
+
+type OperStateChange struct {
+	Old                  ComponentOperState `protobuf:"varint,1,opt,name=old,proto3,enum=dmi.ComponentOperState" json:"old,omitempty"`
+	New                  ComponentOperState `protobuf:"varint,2,opt,name=new,proto3,enum=dmi.ComponentOperState" json:"new,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
+	XXX_unrecognized     []byte             `json:"-"`
+	XXX_sizecache        int32              `json:"-"`
+}
+
+func (m *OperStateChange) Reset()         { *m = OperStateChange{} }
+func (m *OperStateChange) String() string { return proto.CompactTextString(m) }
+func (*OperStateChange) ProtoMessage()    {}
+func (*OperStateChange) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{11}
+}
+
+func (m *OperStateChange) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_OperStateChange.Unmarshal(m, b)
+}
+func (m *OperStateChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_OperStateChange.Marshal(b, m, deterministic)
+}
+func (m *OperStateChange) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_OperStateChange.Merge(m, src)
+}
+func (m *OperStateChange) XXX_Size() int {
+	return xxx_messageInfo_OperStateChange.Size(m)
+}
+func (m *OperStateChange) XXX_DiscardUnknown() {
+	xxx_messageInfo_OperStateChange.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_OperStateChange proto.InternalMessageInfo
+
+func (m *OperStateChange) GetOld() ComponentOperState {
+	if m != nil {
+		return m.Old
+	}
+	return ComponentOperState_COMP_OPER_STATE_UNDEFINED
+}
+
+func (m *OperStateChange) GetNew() ComponentOperState {
+	if m != nil {
+		return m.New
+	}
+	return ComponentOperState_COMP_OPER_STATE_UNDEFINED
+}
+
+type AlarmStateChange struct {
+	Old                  ComponentAlarmState `protobuf:"varint,1,opt,name=old,proto3,enum=dmi.ComponentAlarmState" json:"old,omitempty"`
+	New                  ComponentAlarmState `protobuf:"varint,2,opt,name=new,proto3,enum=dmi.ComponentAlarmState" json:"new,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *AlarmStateChange) Reset()         { *m = AlarmStateChange{} }
+func (m *AlarmStateChange) String() string { return proto.CompactTextString(m) }
+func (*AlarmStateChange) ProtoMessage()    {}
+func (*AlarmStateChange) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{12}
+}
+
+func (m *AlarmStateChange) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AlarmStateChange.Unmarshal(m, b)
+}
+func (m *AlarmStateChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AlarmStateChange.Marshal(b, m, deterministic)
+}
+func (m *AlarmStateChange) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AlarmStateChange.Merge(m, src)
+}
+func (m *AlarmStateChange) XXX_Size() int {
+	return xxx_messageInfo_AlarmStateChange.Size(m)
+}
+func (m *AlarmStateChange) XXX_DiscardUnknown() {
+	xxx_messageInfo_AlarmStateChange.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AlarmStateChange proto.InternalMessageInfo
+
+func (m *AlarmStateChange) GetOld() ComponentAlarmState {
+	if m != nil {
+		return m.Old
+	}
+	return ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED
+}
+
+func (m *AlarmStateChange) GetNew() ComponentAlarmState {
+	if m != nil {
+		return m.New
+	}
+	return ComponentAlarmState_COMP_ALARM_STATE_UNDEFINED
+}
+
+type UsageStateChange struct {
+	Old                  ComponentUsageState `protobuf:"varint,1,opt,name=old,proto3,enum=dmi.ComponentUsageState" json:"old,omitempty"`
+	New                  ComponentUsageState `protobuf:"varint,2,opt,name=new,proto3,enum=dmi.ComponentUsageState" json:"new,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}            `json:"-"`
+	XXX_unrecognized     []byte              `json:"-"`
+	XXX_sizecache        int32               `json:"-"`
+}
+
+func (m *UsageStateChange) Reset()         { *m = UsageStateChange{} }
+func (m *UsageStateChange) String() string { return proto.CompactTextString(m) }
+func (*UsageStateChange) ProtoMessage()    {}
+func (*UsageStateChange) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{13}
+}
+
+func (m *UsageStateChange) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UsageStateChange.Unmarshal(m, b)
+}
+func (m *UsageStateChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UsageStateChange.Marshal(b, m, deterministic)
+}
+func (m *UsageStateChange) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UsageStateChange.Merge(m, src)
+}
+func (m *UsageStateChange) XXX_Size() int {
+	return xxx_messageInfo_UsageStateChange.Size(m)
+}
+func (m *UsageStateChange) XXX_DiscardUnknown() {
+	xxx_messageInfo_UsageStateChange.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UsageStateChange proto.InternalMessageInfo
+
+func (m *UsageStateChange) GetOld() ComponentUsageState {
+	if m != nil {
+		return m.Old
+	}
+	return ComponentUsageState_COMP_USAGE_STATE_UNDEFINED
+}
+
+func (m *UsageStateChange) GetNew() ComponentUsageState {
+	if m != nil {
+		return m.New
+	}
+	return ComponentUsageState_COMP_USAGE_STATE_UNDEFINED
+}
+
+type StandbyStateChange struct {
+	Old                  ComponentStandbyState `protobuf:"varint,1,opt,name=old,proto3,enum=dmi.ComponentStandbyState" json:"old,omitempty"`
+	New                  ComponentStandbyState `protobuf:"varint,2,opt,name=new,proto3,enum=dmi.ComponentStandbyState" json:"new,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *StandbyStateChange) Reset()         { *m = StandbyStateChange{} }
+func (m *StandbyStateChange) String() string { return proto.CompactTextString(m) }
+func (*StandbyStateChange) ProtoMessage()    {}
+func (*StandbyStateChange) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{14}
+}
+
+func (m *StandbyStateChange) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StandbyStateChange.Unmarshal(m, b)
+}
+func (m *StandbyStateChange) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StandbyStateChange.Marshal(b, m, deterministic)
+}
+func (m *StandbyStateChange) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StandbyStateChange.Merge(m, src)
+}
+func (m *StandbyStateChange) XXX_Size() int {
+	return xxx_messageInfo_StandbyStateChange.Size(m)
+}
+func (m *StandbyStateChange) XXX_DiscardUnknown() {
+	xxx_messageInfo_StandbyStateChange.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StandbyStateChange proto.InternalMessageInfo
+
+func (m *StandbyStateChange) GetOld() ComponentStandbyState {
+	if m != nil {
+		return m.Old
+	}
+	return ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED
+}
+
+func (m *StandbyStateChange) GetNew() ComponentStandbyState {
+	if m != nil {
+		return m.New
+	}
+	return ComponentStandbyState_COMP_STANDBY_STATE_UNDEFINED
+}
+
+type StateChangeInfo struct {
+	// Types that are valid to be assigned to StateChange:
+	//	*StateChangeInfo_AdminStateChange
+	//	*StateChangeInfo_OperStateChange
+	//	*StateChangeInfo_AlarmStateChange
+	//	*StateChangeInfo_UsageStateChange
+	//	*StateChangeInfo_StandbyStateChange
+	StateChange          isStateChangeInfo_StateChange `protobuf_oneof:"state_change"`
+	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
+	XXX_unrecognized     []byte                        `json:"-"`
+	XXX_sizecache        int32                         `json:"-"`
+}
+
+func (m *StateChangeInfo) Reset()         { *m = StateChangeInfo{} }
+func (m *StateChangeInfo) String() string { return proto.CompactTextString(m) }
+func (*StateChangeInfo) ProtoMessage()    {}
+func (*StateChangeInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8962d785556e9979, []int{15}
+}
+
+func (m *StateChangeInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StateChangeInfo.Unmarshal(m, b)
+}
+func (m *StateChangeInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StateChangeInfo.Marshal(b, m, deterministic)
+}
+func (m *StateChangeInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StateChangeInfo.Merge(m, src)
+}
+func (m *StateChangeInfo) XXX_Size() int {
+	return xxx_messageInfo_StateChangeInfo.Size(m)
+}
+func (m *StateChangeInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_StateChangeInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StateChangeInfo proto.InternalMessageInfo
+
+type isStateChangeInfo_StateChange interface {
+	isStateChangeInfo_StateChange()
+}
+
+type StateChangeInfo_AdminStateChange struct {
+	AdminStateChange *AdminStateChange `protobuf:"bytes,1,opt,name=admin_state_change,json=adminStateChange,proto3,oneof"`
+}
+
+type StateChangeInfo_OperStateChange struct {
+	OperStateChange *OperStateChange `protobuf:"bytes,2,opt,name=oper_state_change,json=operStateChange,proto3,oneof"`
+}
+
+type StateChangeInfo_AlarmStateChange struct {
+	AlarmStateChange *AlarmStateChange `protobuf:"bytes,3,opt,name=alarm_state_change,json=alarmStateChange,proto3,oneof"`
+}
+
+type StateChangeInfo_UsageStateChange struct {
+	UsageStateChange *UsageStateChange `protobuf:"bytes,4,opt,name=usage_state_change,json=usageStateChange,proto3,oneof"`
+}
+
+type StateChangeInfo_StandbyStateChange struct {
+	StandbyStateChange *StandbyStateChange `protobuf:"bytes,5,opt,name=standby_state_change,json=standbyStateChange,proto3,oneof"`
+}
+
+func (*StateChangeInfo_AdminStateChange) isStateChangeInfo_StateChange() {}
+
+func (*StateChangeInfo_OperStateChange) isStateChangeInfo_StateChange() {}
+
+func (*StateChangeInfo_AlarmStateChange) isStateChangeInfo_StateChange() {}
+
+func (*StateChangeInfo_UsageStateChange) isStateChangeInfo_StateChange() {}
+
+func (*StateChangeInfo_StandbyStateChange) isStateChangeInfo_StateChange() {}
+
+func (m *StateChangeInfo) GetStateChange() isStateChangeInfo_StateChange {
+	if m != nil {
+		return m.StateChange
+	}
+	return nil
+}
+
+func (m *StateChangeInfo) GetAdminStateChange() *AdminStateChange {
+	if x, ok := m.GetStateChange().(*StateChangeInfo_AdminStateChange); ok {
+		return x.AdminStateChange
+	}
+	return nil
+}
+
+func (m *StateChangeInfo) GetOperStateChange() *OperStateChange {
+	if x, ok := m.GetStateChange().(*StateChangeInfo_OperStateChange); ok {
+		return x.OperStateChange
+	}
+	return nil
+}
+
+func (m *StateChangeInfo) GetAlarmStateChange() *AlarmStateChange {
+	if x, ok := m.GetStateChange().(*StateChangeInfo_AlarmStateChange); ok {
+		return x.AlarmStateChange
+	}
+	return nil
+}
+
+func (m *StateChangeInfo) GetUsageStateChange() *UsageStateChange {
+	if x, ok := m.GetStateChange().(*StateChangeInfo_UsageStateChange); ok {
+		return x.UsageStateChange
+	}
+	return nil
+}
+
+func (m *StateChangeInfo) GetStandbyStateChange() *StandbyStateChange {
+	if x, ok := m.GetStateChange().(*StateChangeInfo_StandbyStateChange); ok {
+		return x.StandbyStateChange
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*StateChangeInfo) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*StateChangeInfo_AdminStateChange)(nil),
+		(*StateChangeInfo_OperStateChange)(nil),
+		(*StateChangeInfo_AlarmStateChange)(nil),
+		(*StateChangeInfo_UsageStateChange)(nil),
+		(*StateChangeInfo_StandbyStateChange)(nil),
+	}
+}
+
 type Event struct {
 	EventMetadata *EventMetaData       `protobuf:"bytes,1,opt,name=event_metadata,json=eventMetadata,proto3" json:"event_metadata,omitempty"`
 	EventId       EventIds             `protobuf:"varint,2,opt,name=event_id,json=eventId,proto3,enum=dmi.EventIds" json:"event_id,omitempty"`
@@ -945,17 +1322,18 @@
 	// Optional threshold information for an event
 	ThresholdInfo *ThresholdInformation `protobuf:"bytes,4,opt,name=threshold_info,json=thresholdInfo,proto3" json:"threshold_info,omitempty"`
 	// Any additional info regarding the event
-	AddInfo              string   `protobuf:"bytes,5,opt,name=add_info,json=addInfo,proto3" json:"add_info,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
+	AddInfo              string           `protobuf:"bytes,5,opt,name=add_info,json=addInfo,proto3" json:"add_info,omitempty"`
+	StateChangeInfo      *StateChangeInfo `protobuf:"bytes,6,opt,name=state_change_info,json=stateChangeInfo,proto3" json:"state_change_info,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
 }
 
 func (m *Event) Reset()         { *m = Event{} }
 func (m *Event) String() string { return proto.CompactTextString(m) }
 func (*Event) ProtoMessage()    {}
 func (*Event) Descriptor() ([]byte, []int) {
-	return fileDescriptor_8962d785556e9979, []int{10}
+	return fileDescriptor_8962d785556e9979, []int{16}
 }
 
 func (m *Event) XXX_Unmarshal(b []byte) error {
@@ -1011,6 +1389,13 @@
 	return ""
 }
 
+func (m *Event) GetStateChangeInfo() *StateChangeInfo {
+	if m != nil {
+		return m.StateChangeInfo
+	}
+	return nil
+}
+
 func init() {
 	proto.RegisterEnum("dmi.EventIds", EventIds_name, EventIds_value)
 	proto.RegisterEnum("dmi.ListEventsResponse_Reason", ListEventsResponse_Reason_name, ListEventsResponse_Reason_value)
@@ -1025,119 +1410,145 @@
 	proto.RegisterType((*EventsConfigurationRequest)(nil), "dmi.EventsConfigurationRequest")
 	proto.RegisterType((*EventsConfigurationResponse)(nil), "dmi.EventsConfigurationResponse")
 	proto.RegisterType((*EventMetaData)(nil), "dmi.EventMetaData")
+	proto.RegisterType((*AdminStateChange)(nil), "dmi.AdminStateChange")
+	proto.RegisterType((*OperStateChange)(nil), "dmi.OperStateChange")
+	proto.RegisterType((*AlarmStateChange)(nil), "dmi.AlarmStateChange")
+	proto.RegisterType((*UsageStateChange)(nil), "dmi.UsageStateChange")
+	proto.RegisterType((*StandbyStateChange)(nil), "dmi.StandbyStateChange")
+	proto.RegisterType((*StateChangeInfo)(nil), "dmi.StateChangeInfo")
 	proto.RegisterType((*Event)(nil), "dmi.Event")
 }
 
 func init() { proto.RegisterFile("dmi/hw_events_mgmt_service.proto", fileDescriptor_8962d785556e9979) }
 
 var fileDescriptor_8962d785556e9979 = []byte{
-	// 1682 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0x5b, 0x73, 0xe3, 0x48,
-	0x15, 0x8e, 0xad, 0x5c, 0x4f, 0x26, 0x46, 0x7b, 0x6a, 0x98, 0x49, 0x1c, 0x66, 0xc6, 0x78, 0x76,
-	0x37, 0xd9, 0xc0, 0xd8, 0xd9, 0xcc, 0x30, 0xc3, 0xd4, 0x3e, 0x80, 0x62, 0x2b, 0x63, 0xd5, 0x3a,
-	0x72, 0xaa, 0x2d, 0x3b, 0x2c, 0x0f, 0xab, 0xea, 0x89, 0xda, 0x8e, 0x18, 0x4b, 0xf2, 0x4a, 0xed,
-	0x84, 0x40, 0x15, 0x05, 0xfc, 0x02, 0x2e, 0xcb, 0x13, 0x14, 0xbf, 0x80, 0x85, 0x3f, 0xc0, 0x0f,
-	0xe0, 0xf2, 0x07, 0xe0, 0x95, 0x77, 0xde, 0xb8, 0xdf, 0x4b, 0x2d, 0xd9, 0x56, 0x7c, 0xcd, 0x54,
-	0xf1, 0x66, 0x9d, 0xf3, 0x7d, 0xe7, 0x7c, 0xdd, 0xe7, 0xf4, 0x91, 0xda, 0x90, 0xb3, 0x1c, 0xbb,
-	0x78, 0x7e, 0x69, 0xb2, 0x0b, 0xe6, 0xf2, 0xc0, 0x74, 0xda, 0x0e, 0x37, 0x03, 0xe6, 0x5f, 0xd8,
-	0x67, 0xac, 0xd0, 0xf5, 0x3d, 0xee, 0xa1, 0x64, 0x39, 0x76, 0xf6, 0x8d, 0x10, 0x76, 0xe6, 0x39,
-	0x8e, 0xe7, 0x06, 0x91, 0x3d, 0x7b, 0x2b, 0x62, 0xc6, 0x4f, 0x0f, 0xda, 0x9e, 0xd7, 0xee, 0xb0,
-	0xa2, 0x78, 0x7a, 0xd9, 0x6b, 0x15, 0xb9, 0xed, 0xb0, 0x80, 0x53, 0xa7, 0x1b, 0x03, 0xb6, 0x47,
-	0x01, 0xcc, 0xe9, 0xf2, 0xab, 0xc8, 0x99, 0xff, 0x71, 0x0a, 0xd6, 0x9a, 0xb4, 0xd3, 0x63, 0xc6,
-	0x55, 0x97, 0xe1, 0x16, 0xac, 0xd8, 0x2e, 0x37, 0x2f, 0x68, 0x67, 0x33, 0x95, 0x4b, 0xed, 0x4a,
-	0x95, 0x05, 0xb2, 0x6c, 0xbb, 0xbc, 0x49, 0x3b, 0xb8, 0x0d, 0xab, 0xbd, 0xbe, 0x2f, 0x9d, 0x4b,
-	0xed, 0x2e, 0x56, 0x16, 0xc8, 0x4a, 0x2f, 0x76, 0xde, 0x83, 0xb5, 0x56, 0xc7, 0xa3, 0x91, 0x57,
-	0xca, 0xa5, 0x76, 0xd3, 0x95, 0x05, 0xb2, 0x2a, 0x4c, 0xa1, 0x7b, 0x1f, 0xd6, 0xf8, 0x55, 0x97,
-	0xd5, 0x5a, 0x4d, 0xda, 0xd9, 0x5c, 0xcc, 0xa5, 0x76, 0x33, 0x07, 0x58, 0xb0, 0x1c, 0xbb, 0x50,
-	0xa6, 0x9c, 0x0e, 0xb2, 0x93, 0x21, 0xe8, 0x70, 0x09, 0xa4, 0x0b, 0xda, 0xc9, 0x13, 0x80, 0x53,
-	0xca, 0x99, 0x7f, 0x4c, 0xfd, 0x57, 0x01, 0xe6, 0x61, 0xf1, 0xdc, 0x6e, 0x9f, 0x0b, 0x69, 0xeb,
-	0x07, 0x19, 0x11, 0x61, 0xc8, 0x16, 0x3e, 0xcc, 0x81, 0xd4, 0xf1, 0x2e, 0x85, 0xc2, 0x71, 0x48,
-	0xe8, 0xca, 0xbf, 0x02, 0x30, 0xce, 0x7d, 0x16, 0x9c, 0x7b, 0x1d, 0x2b, 0xc0, 0x1d, 0x58, 0xea,
-	0x75, 0xbb, 0xcc, 0x8f, 0x83, 0x7e, 0x4a, 0x30, 0x86, 0x39, 0x2b, 0x0b, 0x24, 0xf2, 0x87, 0xc0,
-	0x8e, 0x77, 0xc9, 0xfc, 0x38, 0xf4, 0x24, 0xa0, 0xf0, 0x1f, 0xae, 0xc3, 0x1a, 0xef, 0xc7, 0xcf,
-	0x7f, 0x0b, 0x6e, 0x0f, 0x92, 0x69, 0x6e, 0xcb, 0xf3, 0x1d, 0xca, 0x6d, 0xcf, 0xc5, 0x2f, 0x40,
-	0xc6, 0x7b, 0x19, 0x56, 0x9b, 0x59, 0xe1, 0x9e, 0xf5, 0xd8, 0x94, 0x45, 0x6d, 0xf4, 0x51, 0xc2,
-	0x84, 0x45, 0x80, 0x41, 0xec, 0xe0, 0x9a, 0x92, 0xe1, 0x92, 0x48, 0x02, 0x92, 0xff, 0x65, 0x0a,
-	0x56, 0xd5, 0xb0, 0xc1, 0x4a, 0xad, 0x36, 0xee, 0xc2, 0xaa, 0x68, 0x36, 0xd3, 0xb6, 0x44, 0xba,
-	0xcc, 0xc1, 0x86, 0xe0, 0x0a, 0x80, 0x66, 0x05, 0x64, 0x85, 0x45, 0xbf, 0xf0, 0x21, 0x6c, 0xd8,
-	0x81, 0x79, 0xe6, 0xb9, 0x2d, 0xbb, 0xdd, 0xf3, 0x99, 0x25, 0x52, 0xad, 0x92, 0x5b, 0x76, 0x50,
-	0x1a, 0xd8, 0x46, 0xc4, 0x48, 0x73, 0xc5, 0xe0, 0x3e, 0x64, 0xce, 0x3c, 0xa7, 0xeb, 0xb9, 0xa1,
-	0x86, 0x5e, 0xcf, 0xb6, 0x44, 0x2f, 0xac, 0x1f, 0xac, 0x09, 0x52, 0xa3, 0x67, 0x5b, 0x64, 0x63,
-	0x00, 0x08, 0x1f, 0xf3, 0xfb, 0xb0, 0x26, 0xc4, 0x05, 0xa1, 0xfc, 0x87, 0xb0, 0x64, 0x73, 0xe6,
-	0x04, 0x9b, 0xa9, 0x9c, 0xb4, 0xbb, 0x9e, 0xd4, 0x5e, 0x6a, 0xb5, 0x49, 0xe4, 0xcb, 0xff, 0x34,
-	0x0d, 0x58, 0xb5, 0x03, 0x1e, 0xd1, 0x08, 0x0b, 0xba, 0x9e, 0x1b, 0x30, 0x7c, 0x08, 0xcb, 0x01,
-	0xa7, 0xbc, 0x17, 0xc4, 0x0b, 0x5f, 0x17, 0xe4, 0xba, 0x30, 0x91, 0xd8, 0x85, 0x4f, 0x61, 0xd9,
-	0x67, 0x34, 0xf0, 0x5c, 0xb1, 0xdc, 0xcc, 0xc1, 0x7d, 0x01, 0x1a, 0x8f, 0x56, 0x20, 0x02, 0x45,
-	0x62, 0x34, 0xbe, 0x0d, 0xcb, 0xd1, 0x21, 0x8e, 0x37, 0x21, 0x33, 0x54, 0x16, 0x0a, 0x27, 0xb1,
-	0x37, 0xdc, 0xd5, 0x88, 0x61, 0x5a, 0x8c, 0x53, 0x3b, 0x3a, 0x0a, 0x6b, 0xe4, 0x56, 0x64, 0x2c,
-	0x0b, 0x5b, 0xfe, 0x43, 0x58, 0x8e, 0xc2, 0xe3, 0x6d, 0x90, 0x1b, 0x7a, 0x59, 0x3d, 0xd2, 0x74,
-	0xb5, 0x6c, 0x12, 0x55, 0xa9, 0xd7, 0x74, 0x79, 0x01, 0x11, 0x32, 0x0d, 0xfd, 0x7d, 0xbd, 0x76,
-	0xaa, 0x9b, 0x65, 0xb5, 0xa9, 0x95, 0x54, 0x39, 0x15, 0xda, 0x34, 0xdd, 0x50, 0x89, 0xae, 0x54,
-	0x4d, 0x95, 0x90, 0x1a, 0x91, 0xd3, 0x78, 0x07, 0x30, 0xf2, 0x9b, 0x0d, 0x9d, 0xa8, 0x4a, 0xa9,
-	0xa2, 0x1c, 0x56, 0x55, 0x59, 0xca, 0x7f, 0x92, 0x82, 0x6c, 0x2c, 0x2d, 0x2e, 0xa5, 0xe8, 0x48,
-	0xc2, 0x3e, 0xea, 0xb1, 0x80, 0xe3, 0x1e, 0xac, 0x5b, 0x2c, 0x9c, 0x41, 0x51, 0x81, 0x52, 0xa3,
-	0x05, 0x82, 0xc8, 0x1b, 0xfe, 0xc6, 0x3d, 0x58, 0x39, 0x3b, 0xa7, 0x6e, 0x9b, 0x05, 0xd7, 0xce,
-	0xdb, 0x60, 0xe1, 0xe1, 0x84, 0x88, 0x01, 0xb8, 0x07, 0xb2, 0xcf, 0x02, 0xc6, 0x4d, 0xee, 0x99,
-	0x16, 0x6b, 0xd1, 0x5e, 0x87, 0x8b, 0xdd, 0x5a, 0xad, 0x2c, 0x90, 0x8c, 0xf0, 0x18, 0x5e, 0x39,
-	0xb2, 0x87, 0x27, 0xc8, 0xeb, 0xb2, 0x48, 0x57, 0xfe, 0x27, 0x69, 0xd8, 0x9e, 0xa8, 0xf7, 0x75,
-	0x2a, 0xfb, 0xa5, 0x91, 0xca, 0xee, 0x24, 0x85, 0x4e, 0x0a, 0x3b, 0x5a, 0xe2, 0xb1, 0xd2, 0x49,
-	0x13, 0x4a, 0xe7, 0xff, 0x9f, 0x4a, 0x27, 0x6c, 0x4d, 0xa5, 0xaa, 0x95, 0xcd, 0x52, 0x4d, 0x3f,
-	0xd2, 0x5e, 0xc8, 0xd2, 0x94, 0x72, 0x2e, 0xe6, 0x3f, 0x4e, 0xc1, 0x86, 0x58, 0xc7, 0x31, 0xe3,
-	0x34, 0x1c, 0xa7, 0xaf, 0x55, 0xc1, 0xf1, 0x13, 0x99, 0x9e, 0x7d, 0x22, 0xf1, 0xad, 0x24, 0xc3,
-	0xa5, 0x0e, 0x8b, 0x77, 0x62, 0x08, 0xd3, 0xa9, 0xc3, 0xf2, 0xdf, 0x4d, 0xc3, 0x92, 0x90, 0x85,
-	0xcf, 0x21, 0x13, 0x0d, 0x1d, 0x87, 0x71, 0x6a, 0x51, 0x4e, 0x63, 0x45, 0x38, 0x2c, 0x41, 0x5f,
-	0x3a, 0xd9, 0x60, 0xfd, 0xc7, 0x10, 0x78, 0x6d, 0x5e, 0xa5, 0x67, 0xce, 0xab, 0x67, 0xb0, 0xe6,
-	0x53, 0x3b, 0x60, 0x96, 0x39, 0x38, 0x84, 0xd9, 0x42, 0xf4, 0xda, 0x2b, 0xf4, 0x5f, 0x7b, 0x05,
-	0xa3, 0xff, 0x5e, 0x24, 0xab, 0x11, 0xd8, 0x08, 0xf0, 0xcb, 0x90, 0x19, 0x0c, 0x28, 0xd3, 0x76,
-	0x5b, 0x5e, 0x3c, 0x92, 0xb6, 0xae, 0xcf, 0xb1, 0xc4, 0xe8, 0x26, 0x1b, 0x3c, 0x69, 0xc5, 0x2d,
-	0x58, 0xa5, 0x56, 0xcc, 0x5d, 0x12, 0x5b, 0xb1, 0x42, 0x2d, 0xe1, 0xda, 0xfb, 0x03, 0xc6, 0xc3,
-	0x57, 0xb3, 0x02, 0xdc, 0x84, 0xdb, 0x6a, 0x53, 0xd5, 0x0d, 0x53, 0x57, 0x8e, 0xc3, 0x22, 0xc6,
-	0xdd, 0x21, 0x2f, 0xe0, 0x7d, 0xc8, 0x46, 0x1e, 0x83, 0x28, 0x7a, 0xbd, 0xa4, 0x6a, 0x4d, 0x95,
-	0x98, 0x27, 0xd5, 0xc6, 0x0b, 0xb3, 0xd6, 0x30, 0x64, 0x0b, 0xef, 0xc1, 0xd6, 0x14, 0xbf, 0xa6,
-	0xcb, 0x0c, 0x1f, 0xc1, 0x3b, 0xe3, 0xee, 0x66, 0xad, 0x6a, 0x28, 0x2f, 0x54, 0x53, 0x39, 0xac,
-	0x35, 0x55, 0xd3, 0xa8, 0x10, 0xb5, 0x5e, 0xa9, 0x55, 0xcb, 0x72, 0x6b, 0x36, 0xfc, 0x50, 0xad,
-	0xd6, 0x4e, 0x13, 0xf0, 0x36, 0xbe, 0x0b, 0x8f, 0xc6, 0xe1, 0x86, 0x7a, 0x7c, 0xa2, 0x12, 0xc5,
-	0x68, 0x90, 0xf1, 0x0c, 0xe7, 0xf3, 0x29, 0xa3, 0x59, 0xec, 0xc9, 0xa2, 0x4a, 0x0d, 0x42, 0x42,
-	0xdb, 0x68, 0x86, 0xaf, 0xcd, 0x86, 0x8f, 0x46, 0x7f, 0x85, 0x05, 0xd8, 0x1b, 0x87, 0x93, 0xaf,
-	0x98, 0x27, 0xb5, 0x53, 0x95, 0x8c, 0x85, 0xef, 0xcc, 0xc1, 0x8f, 0xc6, 0x77, 0x26, 0xe3, 0x8d,
-	0x69, 0xf1, 0xdd, 0x39, 0xf8, 0xd1, 0xf8, 0xde, 0xe4, 0x06, 0x38, 0x52, 0xb4, 0x6a, 0x83, 0xa8,
-	0x72, 0x17, 0x9f, 0xc1, 0xe3, 0x1b, 0x37, 0x80, 0x49, 0xd4, 0x52, 0xad, 0xa9, 0x12, 0xb5, 0x2c,
-	0x7f, 0x34, 0x9b, 0x38, 0x22, 0x23, 0x41, 0xf4, 0xf1, 0x3d, 0x78, 0xf6, 0x5a, 0x4d, 0x91, 0x20,
-	0x07, 0xf3, 0xc9, 0xd3, 0x33, 0xf3, 0xc9, 0x92, 0xa7, 0x34, 0x4a, 0x82, 0xd8, 0x9b, 0x4d, 0x9c,
-	0x9e, 0xf1, 0x02, 0xbf, 0x08, 0x4f, 0x6e, 0xde, 0x3c, 0x09, 0xe6, 0xe5, 0x1c, 0xe6, 0xf4, 0x9c,
-	0x5f, 0x9f, 0xcc, 0x34, 0xe6, 0xe7, 0xbc, 0x9a, 0xc3, 0x9c, 0x9e, 0xf3, 0x1b, 0xb8, 0x03, 0x0f,
-	0xa7, 0x36, 0x59, 0x02, 0xf8, 0x4d, 0xbc, 0x0b, 0x18, 0x01, 0x4f, 0xea, 0x8d, 0xe1, 0x98, 0xfa,
-	0x55, 0x0a, 0xef, 0xc0, 0x1b, 0x23, 0x0e, 0x4d, 0x97, 0x7f, 0x3d, 0x62, 0xef, 0xb7, 0xed, 0x6f,
-	0x52, 0x98, 0x83, 0xed, 0x31, 0x7b, 0x22, 0xd3, 0x6f, 0x13, 0xcc, 0x23, 0x45, 0x1f, 0x30, 0x7f,
-	0x96, 0x1e, 0x4a, 0x08, 0xed, 0x03, 0x09, 0x9f, 0xa4, 0xaf, 0x13, 0xfa, 0x12, 0x7e, 0x9e, 0x1e,
-	0xa6, 0x4a, 0x04, 0x4a, 0xa4, 0xfa, 0x45, 0x1a, 0xdf, 0x81, 0x37, 0x23, 0x44, 0xe9, 0xa4, 0x31,
-	0xa1, 0x95, 0x4b, 0x44, 0x33, 0xb4, 0x92, 0x52, 0x95, 0xbf, 0x27, 0xe1, 0xdb, 0xf0, 0xd9, 0x59,
-	0xd0, 0x23, 0xc5, 0x50, 0xaa, 0xf2, 0xf7, 0x25, 0x7c, 0x0c, 0x85, 0x9b, 0x84, 0x4c, 0xe8, 0xf8,
-	0x81, 0x84, 0xfb, 0xf0, 0xb9, 0xb9, 0xc1, 0x13, 0x8c, 0x1f, 0x4a, 0xf8, 0x26, 0x3c, 0x18, 0x32,
-	0x1a, 0xf5, 0x49, 0x53, 0xff, 0x63, 0x09, 0x0b, 0xfd, 0x91, 0x39, 0x15, 0x95, 0x88, 0xfa, 0x23,
-	0x09, 0xb3, 0xf0, 0xe9, 0x08, 0x5f, 0x39, 0x8d, 0x3f, 0x56, 0x4c, 0xa2, 0xd6, 0x55, 0x43, 0xfe,
-	0x93, 0x84, 0xc5, 0xfe, 0xfc, 0x1a, 0xfa, 0x66, 0xec, 0xd8, 0x9f, 0x25, 0xfc, 0x3c, 0xec, 0xcc,
-	0x27, 0x44, 0xfb, 0xf6, 0x17, 0x09, 0x9f, 0xf7, 0x7b, 0xf8, 0x26, 0xe1, 0x13, 0xaa, 0xff, 0x2a,
-	0xe1, 0x53, 0x78, 0xf7, 0x86, 0x89, 0x12, 0xbc, 0xbf, 0x49, 0xb8, 0x0d, 0x77, 0xc6, 0x57, 0x7b,
-	0x58, 0xab, 0x19, 0xf2, 0xdf, 0x25, 0xdc, 0x81, 0xfc, 0xc0, 0x99, 0x8c, 0x56, 0x57, 0xf5, 0x7a,
-	0x2d, 0x3a, 0x23, 0x6a, 0x59, 0xfe, 0xc7, 0xf5, 0x65, 0x2a, 0xd5, 0xea, 0x04, 0x70, 0xbd, 0x8f,
-	0xfe, 0xa7, 0x84, 0xbb, 0xfd, 0x03, 0x17, 0xe6, 0xd4, 0xea, 0xef, 0x4f, 0xa9, 0xdd, 0xbf, 0x24,
-	0x3c, 0xe8, 0xbf, 0x50, 0x67, 0x22, 0x13, 0x2b, 0xfa, 0xb7, 0x84, 0x7b, 0xf0, 0xd6, 0x80, 0x73,
-	0xac, 0x1e, 0xd7, 0xc8, 0x07, 0x53, 0xe2, 0xff, 0x47, 0xc2, 0x27, 0x50, 0xbc, 0x11, 0x36, 0x91,
-	0xe1, 0xbf, 0x12, 0xde, 0xef, 0xbf, 0x95, 0x2a, 0xa7, 0xa6, 0x6e, 0x9c, 0x98, 0xf5, 0x0f, 0xf4,
-	0xd2, 0xe0, 0x90, 0x7e, 0x7b, 0xf1, 0xda, 0xfa, 0x46, 0xfd, 0x89, 0x48, 0xdf, 0x59, 0xc4, 0x7b,
-	0xb0, 0x19, 0x21, 0xab, 0x9a, 0xae, 0x9a, 0x25, 0x85, 0x94, 0x87, 0x87, 0xfa, 0x77, 0x8b, 0xf8,
-	0x19, 0xb8, 0x3b, 0xd1, 0xad, 0xe9, 0xf2, 0xef, 0x17, 0x0f, 0xfe, 0x98, 0x82, 0x7b, 0x3a, 0xe5,
-	0xf6, 0x05, 0x8b, 0x3e, 0xe7, 0x8f, 0xa9, 0x4b, 0xdb, 0xcc, 0x61, 0x2e, 0xaf, 0x47, 0x7f, 0xa6,
-	0xe0, 0x53, 0x80, 0xe1, 0x1d, 0x0e, 0xa3, 0x1b, 0x6a, 0x85, 0xfa, 0xd6, 0x25, 0xf5, 0x99, 0x56,
-	0xce, 0xde, 0x9d, 0x72, 0xcb, 0xc3, 0x0f, 0x61, 0xab, 0xd1, 0xb5, 0x28, 0x67, 0x13, 0xee, 0x09,
-	0xf8, 0x60, 0xfa, 0x0d, 0x42, 0x5c, 0xa4, 0xb2, 0xb9, 0x79, 0x57, 0x0c, 0x7c, 0x02, 0xb7, 0xea,
-	0xdc, 0x67, 0xd4, 0x89, 0x95, 0xdd, 0x19, 0xfb, 0x62, 0x55, 0x9d, 0x2e, 0xbf, 0xca, 0xc2, 0x30,
-	0xd2, 0x7e, 0xea, 0xf0, 0xbd, 0xaf, 0x3e, 0x6f, 0xdb, 0xfc, 0xbc, 0xf7, 0xb2, 0x70, 0xe6, 0x39,
-	0x45, 0xaf, 0xcb, 0xdc, 0x33, 0xcf, 0xb7, 0x8a, 0xd1, 0x47, 0xfd, 0x23, 0x67, 0xb0, 0xfa, 0x47,
-	0xb6, 0xcb, 0x99, 0xdf, 0xa2, 0x67, 0xac, 0x78, 0xf1, 0xb8, 0xd8, 0xf6, 0x8a, 0x96, 0x63, 0xbf,
-	0x5c, 0x16, 0xa1, 0x1f, 0xff, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x76, 0x35, 0xd3, 0x5d, 0x7c, 0x12,
-	0x00, 0x00,
+	// 2015 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xac, 0x58, 0x4b, 0x73, 0xdb, 0xc8,
+	0x11, 0x26, 0x09, 0x51, 0x96, 0x5a, 0x16, 0x0d, 0x4f, 0x69, 0x2d, 0x89, 0x8a, 0x6d, 0x85, 0xde,
+	0x5d, 0xc9, 0x8a, 0x4d, 0x6a, 0x65, 0xc7, 0x8e, 0x6b, 0x0f, 0x59, 0x90, 0x84, 0x4c, 0x96, 0x49,
+	0x40, 0x35, 0x04, 0xa9, 0x38, 0x87, 0x45, 0x41, 0xc2, 0x90, 0xc2, 0x9a, 0x00, 0xb8, 0x00, 0x28,
+	0x45, 0x49, 0x55, 0x2a, 0x39, 0xe5, 0x9a, 0xc7, 0xe6, 0x94, 0x54, 0x7e, 0x41, 0x36, 0x39, 0xe5,
+	0xb6, 0x79, 0x1c, 0x72, 0xc8, 0xe3, 0x0f, 0x24, 0x3f, 0x22, 0xb7, 0xbc, 0xdf, 0x05, 0x0c, 0x48,
+	0x0c, 0xc1, 0x97, 0x5c, 0xb5, 0x37, 0xb1, 0xfb, 0xeb, 0xef, 0xeb, 0x99, 0xee, 0x69, 0x8c, 0x06,
+	0xb6, 0x75, 0xd3, 0x28, 0x9c, 0x5d, 0xa8, 0xe4, 0x9c, 0x58, 0x9e, 0xab, 0x9a, 0x1d, 0xd3, 0x53,
+	0x5d, 0xe2, 0x9c, 0x1b, 0xa7, 0x24, 0xdf, 0x73, 0x6c, 0xcf, 0x46, 0x9c, 0x6e, 0x1a, 0xd9, 0x9b,
+	0x3e, 0xec, 0xd4, 0x36, 0x4d, 0xdb, 0x72, 0xa9, 0x3d, 0x7b, 0x9d, 0x46, 0x86, 0xbf, 0xee, 0x76,
+	0x6c, 0xbb, 0xd3, 0x25, 0x85, 0xe0, 0xd7, 0x49, 0xbf, 0x5d, 0xf0, 0x0c, 0x93, 0xb8, 0x9e, 0x66,
+	0xf6, 0x42, 0xc0, 0x56, 0x1c, 0x40, 0xcc, 0x9e, 0x77, 0x49, 0x9d, 0xb9, 0x1f, 0x24, 0x61, 0xb9,
+	0xa5, 0x75, 0xfb, 0x44, 0xb9, 0xec, 0x11, 0xb4, 0x09, 0xd7, 0x0c, 0xcb, 0x53, 0xcf, 0xb5, 0xee,
+	0x46, 0x72, 0x3b, 0xb9, 0xcb, 0x55, 0x12, 0x78, 0xd1, 0xb0, 0xbc, 0x96, 0xd6, 0x45, 0x5b, 0xb0,
+	0xd4, 0x1f, 0xf8, 0x52, 0xdb, 0xc9, 0xdd, 0x85, 0x4a, 0x02, 0x5f, 0xeb, 0x87, 0xce, 0xdb, 0xb0,
+	0xdc, 0xee, 0xda, 0x1a, 0xf5, 0x72, 0xdb, 0xc9, 0xdd, 0x54, 0x25, 0x81, 0x97, 0x02, 0x93, 0xef,
+	0xde, 0x87, 0x65, 0xef, 0xb2, 0x47, 0xe4, 0x76, 0x4b, 0xeb, 0x6e, 0x2c, 0x6c, 0x27, 0x77, 0x33,
+	0x07, 0x28, 0xaf, 0x9b, 0x46, 0xbe, 0xac, 0x79, 0xda, 0x50, 0x1d, 0x47, 0xa0, 0x62, 0x1a, 0xb8,
+	0x73, 0xad, 0x9b, 0xc3, 0x00, 0xc7, 0x9a, 0x47, 0x9c, 0xba, 0xe6, 0xbc, 0x72, 0x51, 0x0e, 0x16,
+	0xce, 0x8c, 0xce, 0x59, 0x90, 0xda, 0xca, 0x41, 0x26, 0x60, 0x88, 0xa2, 0x03, 0x1f, 0xda, 0x06,
+	0xae, 0x6b, 0x5f, 0x04, 0x19, 0x8e, 0x43, 0x7c, 0x57, 0xee, 0x15, 0x80, 0x72, 0xe6, 0x10, 0xf7,
+	0xcc, 0xee, 0xea, 0x2e, 0xda, 0x81, 0x74, 0xbf, 0xd7, 0x23, 0x4e, 0x48, 0x7a, 0x23, 0x88, 0x88,
+	0x34, 0x2b, 0x09, 0x4c, 0xfd, 0x3e, 0xb0, 0x6b, 0x5f, 0x10, 0x27, 0xa4, 0x9e, 0x04, 0x0c, 0xfc,
+	0xc5, 0x15, 0x58, 0xf6, 0x06, 0xfc, 0xb9, 0xaf, 0xc3, 0xda, 0x50, 0xac, 0x6a, 0xb5, 0x6d, 0xc7,
+	0xd4, 0x3c, 0xc3, 0xb6, 0xd0, 0xe7, 0x21, 0x63, 0x9f, 0xf8, 0xd5, 0x26, 0xba, 0xbf, 0x67, 0x7d,
+	0x32, 0x65, 0x51, 0xab, 0x03, 0x54, 0x60, 0x42, 0x05, 0x80, 0x21, 0xb7, 0x3b, 0x92, 0x49, 0xb4,
+	0x24, 0xcc, 0x40, 0x72, 0x9f, 0x24, 0x61, 0x49, 0xf4, 0x1b, 0xac, 0xd4, 0xee, 0xa0, 0x5d, 0x58,
+	0x0a, 0x9a, 0x4d, 0x35, 0xf4, 0x40, 0x2e, 0x73, 0xb0, 0x1a, 0xc4, 0x06, 0x80, 0xaa, 0xee, 0xe2,
+	0x6b, 0x84, 0xfe, 0x85, 0xee, 0xc1, 0xaa, 0xe1, 0xaa, 0xa7, 0xb6, 0xd5, 0x36, 0x3a, 0x7d, 0x87,
+	0xe8, 0x81, 0xd4, 0x12, 0xbe, 0x6e, 0xb8, 0xa5, 0xa1, 0x2d, 0x96, 0x0c, 0x37, 0x37, 0x19, 0xb4,
+	0x0f, 0x99, 0x53, 0xdb, 0xec, 0xd9, 0x96, 0x9f, 0x43, 0xbf, 0x6f, 0xe8, 0x41, 0x2f, 0xac, 0x1c,
+	0x2c, 0x07, 0x41, 0xcd, 0xbe, 0xa1, 0xe3, 0xd5, 0x21, 0xc0, 0xff, 0x99, 0xdb, 0x87, 0xe5, 0x20,
+	0x39, 0xd7, 0x4f, 0xff, 0x1e, 0xa4, 0x0d, 0x8f, 0x98, 0xee, 0x46, 0x72, 0x9b, 0xdb, 0x5d, 0x61,
+	0x73, 0x2f, 0xb5, 0x3b, 0x98, 0xfa, 0x72, 0x3f, 0x4a, 0x01, 0xaa, 0x19, 0xae, 0x47, 0xc3, 0x30,
+	0x71, 0x7b, 0xb6, 0xe5, 0x12, 0x74, 0x0f, 0x16, 0x5d, 0x4f, 0xf3, 0xfa, 0x6e, 0xb8, 0xf0, 0x95,
+	0x20, 0xb8, 0x11, 0x98, 0x70, 0xe8, 0x42, 0x4f, 0x60, 0xd1, 0x21, 0x9a, 0x6b, 0x5b, 0xc1, 0x72,
+	0x33, 0x07, 0x77, 0x02, 0xd0, 0x38, 0x5b, 0x1e, 0x07, 0x28, 0x1c, 0xa2, 0xd1, 0xdb, 0xb0, 0x48,
+	0x0f, 0x71, 0xb8, 0x09, 0x99, 0x28, 0x33, 0x3f, 0x71, 0x1c, 0x7a, 0xfd, 0x5d, 0xa5, 0x11, 0xaa,
+	0x4e, 0x3c, 0xcd, 0xa0, 0x47, 0x61, 0x19, 0x5f, 0xa7, 0xc6, 0x72, 0x60, 0xcb, 0xbd, 0x0f, 0x8b,
+	0x94, 0x1e, 0xad, 0x01, 0xdf, 0x94, 0xca, 0xe2, 0x61, 0x55, 0x12, 0xcb, 0x2a, 0x16, 0x85, 0x86,
+	0x2c, 0xf1, 0x09, 0x84, 0x20, 0xd3, 0x94, 0x5e, 0x48, 0xf2, 0xb1, 0xa4, 0x96, 0xc5, 0x56, 0xb5,
+	0x24, 0xf2, 0x49, 0xdf, 0x56, 0x95, 0x14, 0x11, 0x4b, 0x42, 0x4d, 0x15, 0x31, 0x96, 0x31, 0x9f,
+	0x42, 0xb7, 0x00, 0x51, 0xbf, 0xda, 0x94, 0xb0, 0x28, 0x94, 0x2a, 0x42, 0xb1, 0x26, 0xf2, 0x5c,
+	0xee, 0xe3, 0x24, 0x64, 0xc3, 0xd4, 0xc2, 0x52, 0x06, 0x1d, 0x89, 0xc9, 0x87, 0x7d, 0xe2, 0x7a,
+	0x68, 0x0f, 0x56, 0x74, 0xe2, 0xcf, 0x20, 0x5a, 0xa0, 0x64, 0xbc, 0x40, 0x40, 0xbd, 0xfe, 0xdf,
+	0x68, 0x0f, 0xae, 0x9d, 0x9e, 0x69, 0x56, 0x87, 0xb8, 0x23, 0xe7, 0x6d, 0xb8, 0x70, 0x7f, 0x42,
+	0x84, 0x00, 0xb4, 0x07, 0xbc, 0x43, 0x5c, 0xe2, 0xa9, 0x9e, 0xad, 0xea, 0xa4, 0xad, 0xf5, 0xbb,
+	0x5e, 0xb0, 0x5b, 0x4b, 0x95, 0x04, 0xce, 0x04, 0x1e, 0xc5, 0x2e, 0x53, 0xbb, 0x7f, 0x82, 0xec,
+	0x1e, 0xa1, 0x79, 0xe5, 0x7e, 0x98, 0x82, 0xad, 0x89, 0xf9, 0xbe, 0x4e, 0x65, 0xbf, 0x18, 0xab,
+	0xec, 0x0e, 0x9b, 0xe8, 0x24, 0xda, 0x78, 0x89, 0xc7, 0x4a, 0xc7, 0x4d, 0x28, 0x9d, 0xf3, 0x29,
+	0x95, 0x2e, 0xb0, 0xb5, 0x84, 0x5a, 0xb5, 0xac, 0x96, 0x64, 0xe9, 0xb0, 0xfa, 0x9c, 0xe7, 0xa6,
+	0x94, 0x73, 0x21, 0xf7, 0x51, 0x12, 0x56, 0x83, 0x75, 0xd4, 0x89, 0xa7, 0xf9, 0xe3, 0xf4, 0xb5,
+	0x2a, 0x38, 0x7e, 0x22, 0x53, 0xb3, 0x4f, 0x24, 0x7a, 0x8b, 0x8d, 0xb0, 0x34, 0x93, 0x84, 0x3b,
+	0x11, 0xc1, 0x24, 0xcd, 0x24, 0xb9, 0x0f, 0x80, 0x17, 0x74, 0xd3, 0xb0, 0xfc, 0x3a, 0x90, 0x52,
+	0xd0, 0x03, 0x68, 0x0f, 0x38, 0xbb, 0x3b, 0x98, 0x3c, 0x1b, 0x81, 0x42, 0x69, 0x10, 0x14, 0x81,
+	0xb1, 0x0f, 0xf2, 0xb1, 0x16, 0xb9, 0x08, 0xab, 0x35, 0x03, 0x6b, 0x91, 0x8b, 0x5c, 0x07, 0x6e,
+	0xc8, 0x3d, 0xe2, 0xb0, 0x52, 0xf7, 0x59, 0xa9, 0xf5, 0xd1, 0xf0, 0x21, 0x96, 0x2a, 0xdd, 0x67,
+	0x95, 0xa6, 0x43, 0x7d, 0x21, 0x7f, 0x51, 0x5d, 0xcd, 0x31, 0xaf, 0xbc, 0xa8, 0x21, 0xf8, 0x0a,
+	0x8b, 0x62, 0xb0, 0xa1, 0x56, 0xd3, 0xd5, 0x3a, 0xe4, 0xaa, 0x5a, 0x11, 0x78, 0xbe, 0x16, 0x8b,
+	0xf5, 0xb5, 0x7a, 0x80, 0x1a, 0x9e, 0x66, 0xe9, 0x27, 0x97, 0xac, 0xda, 0x03, 0x56, 0x2d, 0x3b,
+	0xca, 0xc0, 0xc2, 0xa9, 0xde, 0x03, 0x56, 0x6f, 0x26, 0xda, 0x57, 0xfc, 0x16, 0x07, 0x37, 0x18,
+	0x2d, 0xff, 0xcb, 0x88, 0x44, 0x40, 0x9a, 0x5f, 0x59, 0xd5, 0x3f, 0xb3, 0x44, 0xa5, 0x83, 0x23,
+	0x6c, 0xdf, 0x37, 0x02, 0xc2, 0x78, 0x47, 0x55, 0x12, 0x98, 0xd7, 0xe2, 0x5d, 0x56, 0x84, 0x9b,
+	0xfe, 0xf0, 0x18, 0x65, 0xa1, 0x5d, 0xbd, 0x16, 0xb0, 0xc4, 0x7a, 0xa5, 0x92, 0xc0, 0x37, 0xec,
+	0x58, 0xfb, 0xf8, 0xa9, 0xf8, 0xf5, 0x18, 0x25, 0xe1, 0xd8, 0x54, 0x62, 0x7d, 0x10, 0xa4, 0x12,
+	0xef, 0x0d, 0x11, 0x50, 0xdf, 0xdf, 0xea, 0x51, 0x9a, 0x05, 0x86, 0x26, 0x5e, 0x62, 0x9f, 0xa6,
+	0x1f, 0x2f, 0xfb, 0x0b, 0x58, 0x73, 0xe9, 0x0e, 0x8e, 0x12, 0xa5, 0x03, 0xa2, 0xf5, 0xc1, 0xbc,
+	0x8b, 0xd5, 0xaf, 0x92, 0xc0, 0xc8, 0x1d, 0xb3, 0x16, 0x33, 0x70, 0x9d, 0x25, 0xc9, 0xfd, 0x3a,
+	0x05, 0xe9, 0x60, 0x7e, 0xa0, 0x67, 0x90, 0xa1, 0xb7, 0x03, 0x93, 0x78, 0x9a, 0xae, 0x79, 0x5a,
+	0xb8, 0xf7, 0x28, 0x9a, 0x95, 0x83, 0x19, 0x83, 0x57, 0xc9, 0xe0, 0xa7, 0x0f, 0x1c, 0xb9, 0x58,
+	0xa4, 0x66, 0x5e, 0x2c, 0x9e, 0xc2, 0xb2, 0xa3, 0x19, 0x2e, 0xd1, 0xd5, 0xe1, 0xd7, 0x32, 0x9b,
+	0xa7, 0xf7, 0xd3, 0xfc, 0xe0, 0x7e, 0x9a, 0x57, 0x06, 0x17, 0x58, 0xbc, 0x44, 0xc1, 0x8a, 0x8b,
+	0xde, 0x83, 0xcc, 0xf0, 0x26, 0xa1, 0x1a, 0x56, 0xdb, 0x0e, 0xf7, 0x71, 0x73, 0xf4, 0xc2, 0xc1,
+	0xdc, 0xb1, 0xf0, 0xaa, 0xc7, 0x5a, 0xd1, 0x26, 0x2c, 0x69, 0x7a, 0x18, 0x9b, 0x0e, 0x66, 0xd6,
+	0x35, 0x4d, 0xa7, 0xae, 0xf7, 0xe0, 0x26, 0xbb, 0x29, 0x14, 0xb3, 0xc8, 0xf4, 0x4c, 0xac, 0x57,
+	0xf1, 0x0d, 0x77, 0xd4, 0xb0, 0xf7, 0xb3, 0xb5, 0xf0, 0x9e, 0x55, 0xd5, 0x5d, 0xb4, 0x01, 0x6b,
+	0x62, 0x4b, 0x94, 0x14, 0x55, 0x12, 0xea, 0xfe, 0xbc, 0x0e, 0x3f, 0x04, 0x7c, 0x02, 0xdd, 0x81,
+	0x2c, 0xf5, 0x28, 0x58, 0x90, 0x1a, 0x25, 0xb1, 0xda, 0x12, 0xb1, 0x7a, 0x54, 0x6b, 0x3e, 0x57,
+	0xe5, 0xa6, 0xc2, 0xeb, 0xe8, 0x36, 0x6c, 0x4e, 0xf1, 0x57, 0x25, 0x9e, 0xa0, 0x87, 0x70, 0x7f,
+	0xdc, 0xdd, 0x92, 0x6b, 0x8a, 0xf0, 0x5c, 0x54, 0x85, 0xa2, 0xdc, 0x12, 0x55, 0xa5, 0x82, 0xc5,
+	0x46, 0x45, 0xae, 0x95, 0xf9, 0xf6, 0x6c, 0x78, 0x51, 0xac, 0xc9, 0xc7, 0x0c, 0xbc, 0x83, 0xde,
+	0x81, 0x87, 0xe3, 0x70, 0x45, 0xac, 0x1f, 0x89, 0x58, 0x50, 0x9a, 0x78, 0x5c, 0xe1, 0x6c, 0x7e,
+	0x48, 0x5c, 0xc5, 0x98, 0x9c, 0x54, 0xa9, 0x89, 0xb1, 0x6f, 0x8b, 0x2b, 0x7c, 0x30, 0x1b, 0x1e,
+	0x67, 0x7f, 0x85, 0xf2, 0xb0, 0x37, 0x0e, 0xc7, 0x5f, 0x52, 0x8f, 0xe4, 0x63, 0x11, 0x8f, 0xd1,
+	0x77, 0xe7, 0xe0, 0xe3, 0xfc, 0xe6, 0x64, 0xbc, 0x32, 0x8d, 0xdf, 0x9a, 0x83, 0x8f, 0xf3, 0xdb,
+	0x93, 0x1b, 0xe0, 0x50, 0xa8, 0xd6, 0x9a, 0x58, 0xe4, 0x7b, 0xe8, 0x29, 0x3c, 0xba, 0x72, 0x03,
+	0xa8, 0x58, 0x2c, 0xc9, 0x2d, 0x11, 0x8b, 0x65, 0xfe, 0xc3, 0xd9, 0x81, 0xb1, 0x34, 0x98, 0x40,
+	0x07, 0xbd, 0x0b, 0x4f, 0x5f, 0xab, 0x29, 0x98, 0x60, 0x77, 0x7e, 0xf0, 0x74, 0x65, 0x6f, 0x72,
+	0xca, 0x53, 0x1a, 0x85, 0x09, 0xec, 0xcf, 0x0e, 0x9c, 0xae, 0x78, 0x8e, 0xbe, 0x00, 0x8f, 0xaf,
+	0xde, 0x3c, 0x4c, 0xe4, 0xc5, 0x9c, 0xc8, 0xe9, 0x9a, 0x5f, 0x99, 0x1c, 0xa9, 0xcc, 0xd7, 0xbc,
+	0x9c, 0x13, 0x39, 0x5d, 0xf3, 0xab, 0x68, 0x07, 0xee, 0x4d, 0x6d, 0x32, 0x06, 0xf8, 0x35, 0xb4,
+	0x0e, 0x88, 0x02, 0x8f, 0x1a, 0xcd, 0x68, 0x4c, 0xfd, 0x26, 0x89, 0x6e, 0xc1, 0xcd, 0x98, 0xa3,
+	0x2a, 0xf1, 0xbf, 0x8d, 0xd9, 0x07, 0x6d, 0xfb, 0xbb, 0x24, 0xda, 0x86, 0xad, 0x31, 0x3b, 0xa3,
+	0xf4, 0x7b, 0x26, 0xf2, 0x50, 0x90, 0x86, 0x91, 0x3f, 0x4e, 0x45, 0x29, 0xf8, 0xf6, 0x61, 0x0a,
+	0x1f, 0xa7, 0x46, 0x03, 0x06, 0x29, 0xfc, 0x24, 0x15, 0x49, 0x31, 0x44, 0x8c, 0xd4, 0x4f, 0x53,
+	0xe8, 0x3e, 0xbc, 0x49, 0x11, 0xa5, 0xa3, 0xe6, 0x84, 0x56, 0x2e, 0xe1, 0xaa, 0x52, 0x2d, 0x09,
+	0x35, 0xfe, 0xdb, 0x1c, 0x7a, 0x1b, 0x3e, 0x3b, 0x0b, 0x7a, 0x28, 0x28, 0x42, 0x8d, 0xff, 0x0e,
+	0x87, 0x1e, 0x41, 0xfe, 0x2a, 0x94, 0x4c, 0x1e, 0xdf, 0xe5, 0xd0, 0x3e, 0x7c, 0x6e, 0x2e, 0x39,
+	0x13, 0xf1, 0x3d, 0x0e, 0xbd, 0x09, 0x77, 0xa3, 0x88, 0x66, 0x63, 0xd2, 0xd4, 0xff, 0x88, 0x43,
+	0xf9, 0xc1, 0xc8, 0x9c, 0x8a, 0x62, 0x58, 0xbf, 0xcf, 0xa1, 0x2c, 0xbc, 0x41, 0xf1, 0x95, 0xe3,
+	0xf0, 0xff, 0x12, 0x15, 0x8b, 0x0d, 0x51, 0xe1, 0xff, 0xcc, 0xa1, 0xc2, 0x60, 0x7e, 0x45, 0xbe,
+	0x19, 0x3b, 0xf6, 0x17, 0x0e, 0x3d, 0x80, 0x9d, 0xf9, 0x01, 0x74, 0xdf, 0xfe, 0xca, 0xa1, 0x67,
+	0x83, 0x1e, 0xbe, 0x0a, 0x3d, 0x93, 0xf5, 0xdf, 0x38, 0xf4, 0x04, 0xde, 0xb9, 0xa2, 0x10, 0x13,
+	0xf7, 0x77, 0x0e, 0x6d, 0xc1, 0xad, 0xf1, 0xd5, 0x16, 0x65, 0x59, 0xe1, 0xff, 0xc1, 0xa1, 0x1d,
+	0xc8, 0x0d, 0x9d, 0x2c, 0x5b, 0x43, 0x94, 0x1a, 0x32, 0x3d, 0x23, 0x62, 0x99, 0xff, 0xe7, 0xe8,
+	0x32, 0x85, 0x5a, 0x6d, 0x02, 0xb8, 0x31, 0x40, 0xff, 0x8b, 0x43, 0xbb, 0x83, 0x03, 0xe7, 0x6b,
+	0x56, 0x1b, 0x2f, 0xa6, 0xd4, 0xee, 0xdf, 0x1c, 0x3a, 0x18, 0x7c, 0x50, 0x67, 0x22, 0x99, 0x15,
+	0xfd, 0x87, 0x43, 0x7b, 0xf0, 0xd6, 0x30, 0xa6, 0x2e, 0xd6, 0x65, 0xfc, 0x72, 0x0a, 0xff, 0x7f,
+	0x39, 0xf4, 0x18, 0x0a, 0x57, 0xc2, 0x32, 0x0a, 0xff, 0xe3, 0xd0, 0x9d, 0xc1, 0x57, 0xa9, 0x72,
+	0xac, 0x4a, 0xca, 0x91, 0xda, 0x78, 0x29, 0x95, 0x86, 0x87, 0xf4, 0x1b, 0x0b, 0x23, 0xeb, 0x8b,
+	0xfb, 0x19, 0xa6, 0x6f, 0x2e, 0xa0, 0xdb, 0xb0, 0x41, 0x91, 0xb5, 0xaa, 0x24, 0xaa, 0x25, 0x01,
+	0x97, 0xa3, 0x43, 0xfd, 0x87, 0x05, 0xf4, 0x19, 0x58, 0x9f, 0xe8, 0xae, 0x4a, 0xfc, 0x1f, 0x19,
+	0x99, 0x92, 0x5c, 0x3f, 0x92, 0xa5, 0xe0, 0x3b, 0x50, 0xae, 0x57, 0x25, 0xb5, 0xa1, 0x08, 0x8a,
+	0xa8, 0x96, 0x2a, 0x82, 0xf4, 0x5c, 0x2c, 0xf3, 0x9f, 0xa4, 0xa3, 0x3a, 0x46, 0x48, 0xf9, 0x48,
+	0xc4, 0x31, 0xe0, 0xcf, 0xd3, 0x13, 0x29, 0x6b, 0x02, 0xae, 0xc7, 0x90, 0xbf, 0x98, 0x88, 0xa4,
+	0x3b, 0x37, 0x8a, 0xfc, 0x65, 0x3a, 0xaa, 0x47, 0x84, 0x6c, 0x28, 0x82, 0x54, 0x2e, 0xbe, 0x8c,
+	0x61, 0x7f, 0x95, 0x3e, 0xf8, 0x53, 0x12, 0x6e, 0x4b, 0x9a, 0x67, 0x9c, 0x13, 0xfa, 0x18, 0x51,
+	0xd7, 0x2c, 0xad, 0x43, 0x4c, 0xff, 0x9f, 0x26, 0xfa, 0x14, 0x8c, 0x9e, 0x00, 0x44, 0x2f, 0x50,
+	0x88, 0xbe, 0xaf, 0x55, 0x34, 0x47, 0xbf, 0xd0, 0x1c, 0x52, 0x2d, 0x67, 0xd7, 0xa7, 0xbc, 0x51,
+	0xa1, 0xf7, 0x61, 0xb3, 0xd9, 0xd3, 0x35, 0x8f, 0x4c, 0x78, 0xe5, 0x40, 0x77, 0xa7, 0xbf, 0x7f,
+	0x04, 0xcf, 0x40, 0xd9, 0xed, 0x79, 0x0f, 0x24, 0xe8, 0x31, 0x5c, 0x6f, 0x78, 0x0e, 0xd1, 0xcc,
+	0x30, 0xb3, 0x5b, 0x63, 0xd7, 0x78, 0xd1, 0xec, 0x79, 0x97, 0x59, 0x88, 0x98, 0xf6, 0x93, 0xc5,
+	0x77, 0xbf, 0xfc, 0xac, 0x63, 0x78, 0x67, 0xfd, 0x93, 0xfc, 0xa9, 0x6d, 0x16, 0xec, 0x1e, 0xb1,
+	0x4e, 0x6d, 0x47, 0x2f, 0xd0, 0x27, 0x89, 0x87, 0xe6, 0x70, 0xf5, 0x0f, 0x0d, 0xcb, 0x23, 0x4e,
+	0x5b, 0x3b, 0x25, 0x85, 0xf3, 0x47, 0x85, 0x8e, 0x5d, 0xd0, 0x4d, 0xe3, 0x64, 0x31, 0xa0, 0x7e,
+	0xf4, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1c, 0x32, 0xf3, 0xdf, 0x3a, 0x17, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
diff --git a/go/dmi/hw_management_service.pb.go b/go/dmi/hw_management_service.pb.go
index 783cbac..efe6f32 100644
--- a/go/dmi/hw_management_service.pb.go
+++ b/go/dmi/hw_management_service.pb.go
@@ -488,6 +488,126 @@
 	return fileDescriptor_eae902e73066286d, []int{28, 0}
 }
 
+type DisableHWComponentResponse_Reason int32
+
+const (
+	DisableHWComponentResponse_UNDEFINED_REASON    DisableHWComponentResponse_Reason = 0
+	DisableHWComponentResponse_UNKNOWN_DEVICE      DisableHWComponentResponse_Reason = 1
+	DisableHWComponentResponse_UNKNOWN_COMPONENT   DisableHWComponentResponse_Reason = 2
+	DisableHWComponentResponse_INTERNAL_ERROR      DisableHWComponentResponse_Reason = 3
+	DisableHWComponentResponse_DEVICE_UNREACHABLE  DisableHWComponentResponse_Reason = 4
+	DisableHWComponentResponse_DISABLE_UNSUPPORTED DisableHWComponentResponse_Reason = 5
+	DisableHWComponentResponse_INVALID_PARAMS      DisableHWComponentResponse_Reason = 6
+)
+
+var DisableHWComponentResponse_Reason_name = map[int32]string{
+	0: "UNDEFINED_REASON",
+	1: "UNKNOWN_DEVICE",
+	2: "UNKNOWN_COMPONENT",
+	3: "INTERNAL_ERROR",
+	4: "DEVICE_UNREACHABLE",
+	5: "DISABLE_UNSUPPORTED",
+	6: "INVALID_PARAMS",
+}
+
+var DisableHWComponentResponse_Reason_value = map[string]int32{
+	"UNDEFINED_REASON":    0,
+	"UNKNOWN_DEVICE":      1,
+	"UNKNOWN_COMPONENT":   2,
+	"INTERNAL_ERROR":      3,
+	"DEVICE_UNREACHABLE":  4,
+	"DISABLE_UNSUPPORTED": 5,
+	"INVALID_PARAMS":      6,
+}
+
+func (x DisableHWComponentResponse_Reason) String() string {
+	return proto.EnumName(DisableHWComponentResponse_Reason_name, int32(x))
+}
+
+func (DisableHWComponentResponse_Reason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{30, 0}
+}
+
+type ResetHWComponentResponse_Reason int32
+
+const (
+	ResetHWComponentResponse_UNDEFINED_REASON   ResetHWComponentResponse_Reason = 0
+	ResetHWComponentResponse_UNKNOWN_DEVICE     ResetHWComponentResponse_Reason = 1
+	ResetHWComponentResponse_UNKNOWN_COMPONENT  ResetHWComponentResponse_Reason = 2
+	ResetHWComponentResponse_INTERNAL_ERROR     ResetHWComponentResponse_Reason = 3
+	ResetHWComponentResponse_DEVICE_UNREACHABLE ResetHWComponentResponse_Reason = 4
+	ResetHWComponentResponse_RESET_UNSUPPORTED  ResetHWComponentResponse_Reason = 5
+	ResetHWComponentResponse_INVALID_PARAMS     ResetHWComponentResponse_Reason = 6
+)
+
+var ResetHWComponentResponse_Reason_name = map[int32]string{
+	0: "UNDEFINED_REASON",
+	1: "UNKNOWN_DEVICE",
+	2: "UNKNOWN_COMPONENT",
+	3: "INTERNAL_ERROR",
+	4: "DEVICE_UNREACHABLE",
+	5: "RESET_UNSUPPORTED",
+	6: "INVALID_PARAMS",
+}
+
+var ResetHWComponentResponse_Reason_value = map[string]int32{
+	"UNDEFINED_REASON":   0,
+	"UNKNOWN_DEVICE":     1,
+	"UNKNOWN_COMPONENT":  2,
+	"INTERNAL_ERROR":     3,
+	"DEVICE_UNREACHABLE": 4,
+	"RESET_UNSUPPORTED":  5,
+	"INVALID_PARAMS":     6,
+}
+
+func (x ResetHWComponentResponse_Reason) String() string {
+	return proto.EnumName(ResetHWComponentResponse_Reason_name, int32(x))
+}
+
+func (ResetHWComponentResponse_Reason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{32, 0}
+}
+
+type EnableHWComponentResponse_Reason int32
+
+const (
+	EnableHWComponentResponse_UNDEFINED_REASON   EnableHWComponentResponse_Reason = 0
+	EnableHWComponentResponse_UNKNOWN_DEVICE     EnableHWComponentResponse_Reason = 1
+	EnableHWComponentResponse_UNKNOWN_COMPONENT  EnableHWComponentResponse_Reason = 2
+	EnableHWComponentResponse_INTERNAL_ERROR     EnableHWComponentResponse_Reason = 3
+	EnableHWComponentResponse_DEVICE_UNREACHABLE EnableHWComponentResponse_Reason = 4
+	EnableHWComponentResponse_ENABLE_UNSUPPORTED EnableHWComponentResponse_Reason = 5
+	EnableHWComponentResponse_INVALID_PARAMS     EnableHWComponentResponse_Reason = 6
+)
+
+var EnableHWComponentResponse_Reason_name = map[int32]string{
+	0: "UNDEFINED_REASON",
+	1: "UNKNOWN_DEVICE",
+	2: "UNKNOWN_COMPONENT",
+	3: "INTERNAL_ERROR",
+	4: "DEVICE_UNREACHABLE",
+	5: "ENABLE_UNSUPPORTED",
+	6: "INVALID_PARAMS",
+}
+
+var EnableHWComponentResponse_Reason_value = map[string]int32{
+	"UNDEFINED_REASON":   0,
+	"UNKNOWN_DEVICE":     1,
+	"UNKNOWN_COMPONENT":  2,
+	"INTERNAL_ERROR":     3,
+	"DEVICE_UNREACHABLE": 4,
+	"ENABLE_UNSUPPORTED": 5,
+	"INVALID_PARAMS":     6,
+}
+
+func (x EnableHWComponentResponse_Reason) String() string {
+	return proto.EnumName(EnableHWComponentResponse_Reason_name, int32(x))
+}
+
+func (EnableHWComponentResponse_Reason) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{34, 0}
+}
+
 type PhysicalInventoryRequest struct {
 	DeviceUuid           *Uuid    `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
 	XXX_NoUnkeyedLiteral struct{} `json:"-"`
@@ -2006,6 +2126,363 @@
 	return ""
 }
 
+// Request to disable a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+type DisableHWComponentRequest struct {
+	// UUID of the device containing the component to disable (required)
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// UUID of the component to disable (optional, but either this or component_name must be set)
+	ComponentUuid *Uuid `protobuf:"bytes,2,opt,name=component_uuid,json=componentUuid,proto3" json:"component_uuid,omitempty"`
+	// Name of the component to disable (optional, but either this or component_uuid must be set)
+	ComponentName        string   `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DisableHWComponentRequest) Reset()         { *m = DisableHWComponentRequest{} }
+func (m *DisableHWComponentRequest) String() string { return proto.CompactTextString(m) }
+func (*DisableHWComponentRequest) ProtoMessage()    {}
+func (*DisableHWComponentRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{29}
+}
+
+func (m *DisableHWComponentRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DisableHWComponentRequest.Unmarshal(m, b)
+}
+func (m *DisableHWComponentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DisableHWComponentRequest.Marshal(b, m, deterministic)
+}
+func (m *DisableHWComponentRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DisableHWComponentRequest.Merge(m, src)
+}
+func (m *DisableHWComponentRequest) XXX_Size() int {
+	return xxx_messageInfo_DisableHWComponentRequest.Size(m)
+}
+func (m *DisableHWComponentRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_DisableHWComponentRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DisableHWComponentRequest proto.InternalMessageInfo
+
+func (m *DisableHWComponentRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *DisableHWComponentRequest) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *DisableHWComponentRequest) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+// Response for DisableHWComponent RPC.
+type DisableHWComponentResponse struct {
+	// Indicates whether the operation was successful or not.
+	Status Status `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	// Reason for failure, if any
+	Reason DisableHWComponentResponse_Reason `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.DisableHWComponentResponse_Reason" json:"reason,omitempty"`
+	// Human-readable details for logging or display
+	ReasonDetail         string   `protobuf:"bytes,3,opt,name=reason_detail,json=reasonDetail,proto3" json:"reason_detail,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *DisableHWComponentResponse) Reset()         { *m = DisableHWComponentResponse{} }
+func (m *DisableHWComponentResponse) String() string { return proto.CompactTextString(m) }
+func (*DisableHWComponentResponse) ProtoMessage()    {}
+func (*DisableHWComponentResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{30}
+}
+
+func (m *DisableHWComponentResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DisableHWComponentResponse.Unmarshal(m, b)
+}
+func (m *DisableHWComponentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DisableHWComponentResponse.Marshal(b, m, deterministic)
+}
+func (m *DisableHWComponentResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DisableHWComponentResponse.Merge(m, src)
+}
+func (m *DisableHWComponentResponse) XXX_Size() int {
+	return xxx_messageInfo_DisableHWComponentResponse.Size(m)
+}
+func (m *DisableHWComponentResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_DisableHWComponentResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DisableHWComponentResponse proto.InternalMessageInfo
+
+func (m *DisableHWComponentResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *DisableHWComponentResponse) GetReason() DisableHWComponentResponse_Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return DisableHWComponentResponse_UNDEFINED_REASON
+}
+
+func (m *DisableHWComponentResponse) GetReasonDetail() string {
+	if m != nil {
+		return m.ReasonDetail
+	}
+	return ""
+}
+
+// Request to reset a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+type ResetHWComponentRequest struct {
+	// UUID of the device containing the component to reset (required)
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// UUID of the component to reset (optional, but either this or component_name must be set)
+	ComponentUuid *Uuid `protobuf:"bytes,2,opt,name=component_uuid,json=componentUuid,proto3" json:"component_uuid,omitempty"`
+	// Name of the component to reset (optional, but either this or component_uuid must be set)
+	ComponentName        string   `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ResetHWComponentRequest) Reset()         { *m = ResetHWComponentRequest{} }
+func (m *ResetHWComponentRequest) String() string { return proto.CompactTextString(m) }
+func (*ResetHWComponentRequest) ProtoMessage()    {}
+func (*ResetHWComponentRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{31}
+}
+
+func (m *ResetHWComponentRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResetHWComponentRequest.Unmarshal(m, b)
+}
+func (m *ResetHWComponentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResetHWComponentRequest.Marshal(b, m, deterministic)
+}
+func (m *ResetHWComponentRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResetHWComponentRequest.Merge(m, src)
+}
+func (m *ResetHWComponentRequest) XXX_Size() int {
+	return xxx_messageInfo_ResetHWComponentRequest.Size(m)
+}
+func (m *ResetHWComponentRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResetHWComponentRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResetHWComponentRequest proto.InternalMessageInfo
+
+func (m *ResetHWComponentRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *ResetHWComponentRequest) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *ResetHWComponentRequest) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+// Response for ResetHWComponent RPC.
+type ResetHWComponentResponse struct {
+	// Indicates whether the operation was successful or not.
+	Status Status `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	// Reason for failure, if any
+	Reason ResetHWComponentResponse_Reason `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.ResetHWComponentResponse_Reason" json:"reason,omitempty"`
+	// Human-readable details for logging or display
+	ReasonDetail         string   `protobuf:"bytes,3,opt,name=reason_detail,json=reasonDetail,proto3" json:"reason_detail,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ResetHWComponentResponse) Reset()         { *m = ResetHWComponentResponse{} }
+func (m *ResetHWComponentResponse) String() string { return proto.CompactTextString(m) }
+func (*ResetHWComponentResponse) ProtoMessage()    {}
+func (*ResetHWComponentResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{32}
+}
+
+func (m *ResetHWComponentResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ResetHWComponentResponse.Unmarshal(m, b)
+}
+func (m *ResetHWComponentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ResetHWComponentResponse.Marshal(b, m, deterministic)
+}
+func (m *ResetHWComponentResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ResetHWComponentResponse.Merge(m, src)
+}
+func (m *ResetHWComponentResponse) XXX_Size() int {
+	return xxx_messageInfo_ResetHWComponentResponse.Size(m)
+}
+func (m *ResetHWComponentResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ResetHWComponentResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ResetHWComponentResponse proto.InternalMessageInfo
+
+func (m *ResetHWComponentResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *ResetHWComponentResponse) GetReason() ResetHWComponentResponse_Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return ResetHWComponentResponse_UNDEFINED_REASON
+}
+
+func (m *ResetHWComponentResponse) GetReasonDetail() string {
+	if m != nil {
+		return m.ReasonDetail
+	}
+	return ""
+}
+
+// Request to enable a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+type EnableHWComponentRequest struct {
+	// UUID of the device containing the component to enable (required)
+	DeviceUuid *Uuid `protobuf:"bytes,1,opt,name=device_uuid,json=deviceUuid,proto3" json:"device_uuid,omitempty"`
+	// UUID of the component to enable (optional, but either this or component_name must be set)
+	ComponentUuid *Uuid `protobuf:"bytes,2,opt,name=component_uuid,json=componentUuid,proto3" json:"component_uuid,omitempty"`
+	// Name of the component to enable (optional, but either this or component_uuid must be set)
+	ComponentName        string   `protobuf:"bytes,3,opt,name=component_name,json=componentName,proto3" json:"component_name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EnableHWComponentRequest) Reset()         { *m = EnableHWComponentRequest{} }
+func (m *EnableHWComponentRequest) String() string { return proto.CompactTextString(m) }
+func (*EnableHWComponentRequest) ProtoMessage()    {}
+func (*EnableHWComponentRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{33}
+}
+
+func (m *EnableHWComponentRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EnableHWComponentRequest.Unmarshal(m, b)
+}
+func (m *EnableHWComponentRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EnableHWComponentRequest.Marshal(b, m, deterministic)
+}
+func (m *EnableHWComponentRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EnableHWComponentRequest.Merge(m, src)
+}
+func (m *EnableHWComponentRequest) XXX_Size() int {
+	return xxx_messageInfo_EnableHWComponentRequest.Size(m)
+}
+func (m *EnableHWComponentRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_EnableHWComponentRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EnableHWComponentRequest proto.InternalMessageInfo
+
+func (m *EnableHWComponentRequest) GetDeviceUuid() *Uuid {
+	if m != nil {
+		return m.DeviceUuid
+	}
+	return nil
+}
+
+func (m *EnableHWComponentRequest) GetComponentUuid() *Uuid {
+	if m != nil {
+		return m.ComponentUuid
+	}
+	return nil
+}
+
+func (m *EnableHWComponentRequest) GetComponentName() string {
+	if m != nil {
+		return m.ComponentName
+	}
+	return ""
+}
+
+// Response for EnableHWComponent RPC.
+type EnableHWComponentResponse struct {
+	// Indicates whether the operation was successful or not.
+	Status Status `protobuf:"varint,1,opt,name=status,proto3,enum=dmi.Status" json:"status,omitempty"`
+	// Reason for failure, if any
+	Reason EnableHWComponentResponse_Reason `protobuf:"varint,2,opt,name=reason,proto3,enum=dmi.EnableHWComponentResponse_Reason" json:"reason,omitempty"`
+	// Human-readable details for logging or display
+	ReasonDetail         string   `protobuf:"bytes,3,opt,name=reason_detail,json=reasonDetail,proto3" json:"reason_detail,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *EnableHWComponentResponse) Reset()         { *m = EnableHWComponentResponse{} }
+func (m *EnableHWComponentResponse) String() string { return proto.CompactTextString(m) }
+func (*EnableHWComponentResponse) ProtoMessage()    {}
+func (*EnableHWComponentResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_eae902e73066286d, []int{34}
+}
+
+func (m *EnableHWComponentResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_EnableHWComponentResponse.Unmarshal(m, b)
+}
+func (m *EnableHWComponentResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_EnableHWComponentResponse.Marshal(b, m, deterministic)
+}
+func (m *EnableHWComponentResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_EnableHWComponentResponse.Merge(m, src)
+}
+func (m *EnableHWComponentResponse) XXX_Size() int {
+	return xxx_messageInfo_EnableHWComponentResponse.Size(m)
+}
+func (m *EnableHWComponentResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_EnableHWComponentResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_EnableHWComponentResponse proto.InternalMessageInfo
+
+func (m *EnableHWComponentResponse) GetStatus() Status {
+	if m != nil {
+		return m.Status
+	}
+	return Status_UNDEFINED_STATUS
+}
+
+func (m *EnableHWComponentResponse) GetReason() EnableHWComponentResponse_Reason {
+	if m != nil {
+		return m.Reason
+	}
+	return EnableHWComponentResponse_UNDEFINED_REASON
+}
+
+func (m *EnableHWComponentResponse) GetReasonDetail() string {
+	if m != nil {
+		return m.ReasonDetail
+	}
+	return ""
+}
+
 func init() {
 	proto.RegisterEnum("dmi.PhysicalInventoryResponse_Reason", PhysicalInventoryResponse_Reason_name, PhysicalInventoryResponse_Reason_value)
 	proto.RegisterEnum("dmi.HWComponentInfoGetResponse_Reason", HWComponentInfoGetResponse_Reason_name, HWComponentInfoGetResponse_Reason_value)
@@ -2021,6 +2498,9 @@
 	proto.RegisterEnum("dmi.SetDmLogLevelResponse_Reason", SetDmLogLevelResponse_Reason_name, SetDmLogLevelResponse_Reason_value)
 	proto.RegisterEnum("dmi.GetDmLogLevelResponse_Reason", GetDmLogLevelResponse_Reason_name, GetDmLogLevelResponse_Reason_value)
 	proto.RegisterEnum("dmi.RebootDeviceResponse_Reason", RebootDeviceResponse_Reason_name, RebootDeviceResponse_Reason_value)
+	proto.RegisterEnum("dmi.DisableHWComponentResponse_Reason", DisableHWComponentResponse_Reason_name, DisableHWComponentResponse_Reason_value)
+	proto.RegisterEnum("dmi.ResetHWComponentResponse_Reason", ResetHWComponentResponse_Reason_name, ResetHWComponentResponse_Reason_value)
+	proto.RegisterEnum("dmi.EnableHWComponentResponse_Reason", EnableHWComponentResponse_Reason_name, EnableHWComponentResponse_Reason_value)
 	proto.RegisterType((*PhysicalInventoryRequest)(nil), "dmi.PhysicalInventoryRequest")
 	proto.RegisterType((*PhysicalInventoryResponse)(nil), "dmi.PhysicalInventoryResponse")
 	proto.RegisterType((*HWComponentInfoGetRequest)(nil), "dmi.HWComponentInfoGetRequest")
@@ -2050,120 +2530,137 @@
 	proto.RegisterType((*Heartbeat)(nil), "dmi.Heartbeat")
 	proto.RegisterType((*RebootDeviceRequest)(nil), "dmi.RebootDeviceRequest")
 	proto.RegisterType((*RebootDeviceResponse)(nil), "dmi.RebootDeviceResponse")
+	proto.RegisterType((*DisableHWComponentRequest)(nil), "dmi.DisableHWComponentRequest")
+	proto.RegisterType((*DisableHWComponentResponse)(nil), "dmi.DisableHWComponentResponse")
+	proto.RegisterType((*ResetHWComponentRequest)(nil), "dmi.ResetHWComponentRequest")
+	proto.RegisterType((*ResetHWComponentResponse)(nil), "dmi.ResetHWComponentResponse")
+	proto.RegisterType((*EnableHWComponentRequest)(nil), "dmi.EnableHWComponentRequest")
+	proto.RegisterType((*EnableHWComponentResponse)(nil), "dmi.EnableHWComponentResponse")
 }
 
 func init() { proto.RegisterFile("dmi/hw_management_service.proto", fileDescriptor_eae902e73066286d) }
 
 var fileDescriptor_eae902e73066286d = []byte{
-	// 1726 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x59, 0xcd, 0x6f, 0xe3, 0xc6,
-	0x15, 0x2f, 0x29, 0xdb, 0x1b, 0x3d, 0xef, 0x7a, 0xe5, 0xf1, 0xda, 0x91, 0xb8, 0x88, 0xed, 0xe5,
-	0x22, 0xcd, 0xa6, 0x4d, 0x24, 0x43, 0x7b, 0x68, 0xb6, 0xe9, 0x17, 0x2d, 0xd1, 0x14, 0x13, 0x89,
-	0x14, 0x86, 0xd2, 0x1a, 0x5b, 0x14, 0x25, 0x68, 0x69, 0x2c, 0x13, 0x15, 0x49, 0x55, 0xa4, 0x1c,
-	0xf8, 0xcf, 0xe8, 0xa1, 0x87, 0x1e, 0x5a, 0xf4, 0x5f, 0xe8, 0x35, 0x28, 0x7a, 0xed, 0xa1, 0xd7,
-	0x1e, 0x0b, 0x14, 0x3d, 0xf5, 0xdc, 0x02, 0xbd, 0x17, 0xe4, 0x90, 0xfa, 0xa0, 0x48, 0x7d, 0x79,
-	0x83, 0xec, 0x4d, 0x9c, 0x79, 0xf3, 0xe3, 0xf0, 0xfd, 0xde, 0xfc, 0xe6, 0xbd, 0x27, 0x38, 0xe9,
-	0x5a, 0x66, 0xe9, 0xe6, 0x2b, 0xdd, 0x32, 0x6c, 0xa3, 0x47, 0x2c, 0x62, 0x7b, 0xba, 0x4b, 0x86,
-	0xb7, 0x66, 0x87, 0x14, 0x07, 0x43, 0xc7, 0x73, 0x50, 0xa6, 0x6b, 0x99, 0xdc, 0xbe, 0x6f, 0xd5,
-	0x71, 0x2c, 0xcb, 0xb1, 0x5d, 0x3a, 0xce, 0x3d, 0xa4, 0x0b, 0xc3, 0xa7, 0xa7, 0x3d, 0xc7, 0xe9,
-	0xf5, 0x49, 0x29, 0x78, 0xba, 0x1a, 0x5d, 0x97, 0x88, 0x35, 0xf0, 0xee, 0xe8, 0x24, 0x7f, 0x01,
-	0xf9, 0xe6, 0xcd, 0x9d, 0x6b, 0x76, 0x8c, 0xbe, 0x6c, 0xdf, 0x12, 0xdb, 0x73, 0x86, 0x77, 0x98,
-	0xfc, 0x7a, 0x44, 0x5c, 0x0f, 0x7d, 0x0f, 0x76, 0xbb, 0xc4, 0x7f, 0x9d, 0x3e, 0x1a, 0x99, 0xdd,
-	0x3c, 0x73, 0xca, 0xbc, 0xd8, 0x2d, 0x67, 0x8b, 0x5d, 0xcb, 0x2c, 0xb6, 0x47, 0x66, 0x17, 0x03,
-	0x9d, 0xf5, 0x7f, 0xf3, 0x7f, 0x62, 0xa1, 0x90, 0x00, 0xe4, 0x0e, 0x1c, 0xdb, 0x25, 0xe8, 0x39,
-	0xec, 0xb8, 0x9e, 0xe1, 0x8d, 0xdc, 0x00, 0x64, 0xaf, 0xbc, 0x1b, 0x80, 0x68, 0xc1, 0x10, 0x0e,
-	0xa7, 0xd0, 0x8f, 0x61, 0x67, 0x48, 0x0c, 0xd7, 0xb1, 0xf3, 0x6c, 0x60, 0xf4, 0x61, 0x60, 0x94,
-	0x0a, 0x5a, 0xc4, 0x81, 0x31, 0x0e, 0x17, 0xa1, 0xef, 0x43, 0xd6, 0x8c, 0x6c, 0xf2, 0x99, 0x60,
-	0xaf, 0x8f, 0x02, 0x84, 0x9a, 0x31, 0xec, 0x7e, 0x65, 0x0c, 0x09, 0x9e, 0xcc, 0xa3, 0xe7, 0xf0,
-	0x88, 0x2e, 0xd3, 0xbb, 0xc4, 0x33, 0xcc, 0x7e, 0x7e, 0xeb, 0x94, 0x79, 0x91, 0xc5, 0x0f, 0xe9,
-	0x60, 0x35, 0x18, 0xe3, 0x7f, 0x09, 0x3b, 0xf4, 0x1d, 0xe8, 0x09, 0xe4, 0xda, 0x4a, 0x55, 0xbc,
-	0x90, 0x15, 0xb1, 0xaa, 0x63, 0x51, 0xd0, 0x54, 0x25, 0xf7, 0x1d, 0x84, 0x60, 0xaf, 0xad, 0x7c,
-	0xa9, 0xa8, 0x97, 0x8a, 0x5e, 0x15, 0x5f, 0xcb, 0x15, 0x31, 0xc7, 0xf8, 0x63, 0xb2, 0xd2, 0x12,
-	0xb1, 0x22, 0xd4, 0x75, 0x11, 0x63, 0x15, 0xe7, 0x58, 0x74, 0x04, 0x88, 0xce, 0xeb, 0x6d, 0x05,
-	0x8b, 0x42, 0xa5, 0x26, 0x9c, 0xd7, 0xc5, 0x5c, 0x86, 0xff, 0x23, 0x03, 0x85, 0xda, 0x65, 0xc5,
-	0xb1, 0x06, 0x8e, 0x4d, 0x6c, 0x4f, 0xb6, 0xaf, 0x1d, 0x89, 0x78, 0x1b, 0x78, 0x1f, 0x9d, 0xc1,
-	0x5e, 0x27, 0x82, 0xa1, 0xe6, 0x6c, 0xdc, 0xfc, 0xd1, 0xd8, 0x20, 0x58, 0xf1, 0xe1, 0xf4, 0x0a,
-	0xdb, 0xb0, 0x48, 0xe0, 0xb2, 0xec, 0x94, 0x99, 0x62, 0x58, 0x84, 0xff, 0x1b, 0x0b, 0x5c, 0xd2,
-	0x16, 0xd7, 0xe1, 0xf5, 0x27, 0x31, 0x5e, 0xbf, 0x4b, 0x59, 0x49, 0x45, 0x8d, 0x13, 0xfb, 0x09,
-	0x64, 0xc7, 0x9b, 0x0a, 0x89, 0xdd, 0x0b, 0x20, 0xc6, 0x00, 0x78, 0x62, 0xb0, 0x1a, 0xb3, 0xa3,
-	0x0d, 0x98, 0x3d, 0x84, 0xfd, 0x68, 0xac, 0xa2, 0x36, 0x9a, 0xaa, 0x22, 0x2a, 0xad, 0x1c, 0x9b,
-	0x40, 0x78, 0x26, 0x85, 0xf0, 0x2d, 0xfe, 0xef, 0xf3, 0x84, 0x6b, 0xef, 0x16, 0xe1, 0xa8, 0x0c,
-	0x0f, 0x3a, 0x37, 0x86, 0xdd, 0x23, 0x6e, 0xe0, 0xb8, 0xdd, 0x72, 0x3e, 0x40, 0x6c, 0x38, 0x5d,
-	0xf3, 0xda, 0x34, 0xae, 0xfa, 0x64, 0xe2, 0xf4, 0xc8, 0x90, 0xff, 0xeb, 0x7c, 0x90, 0x68, 0xdf,
-	0x48, 0x90, 0x68, 0xe9, 0x41, 0x32, 0x47, 0x7b, 0x26, 0x81, 0xf6, 0x3f, 0x30, 0x6f, 0x99, 0xf7,
-	0xd7, 0x42, 0x5d, 0xae, 0xea, 0x4d, 0x01, 0x0b, 0x0d, 0x2d, 0x97, 0x49, 0x88, 0x85, 0xad, 0x94,
-	0x58, 0xd8, 0x46, 0x07, 0xf0, 0x58, 0x13, 0x5b, 0x7a, 0x5b, 0xd1, 0xda, 0xcd, 0xa6, 0x8a, 0x5b,
-	0x62, 0x35, 0xb7, 0xc3, 0xff, 0x26, 0x03, 0x4f, 0x35, 0xcf, 0x18, 0x7a, 0x0d, 0x5f, 0xf2, 0x4d,
-	0xbb, 0x57, 0x0d, 0x28, 0x5f, 0xcf, 0x95, 0x3f, 0x8d, 0xb9, 0xf2, 0xa3, 0xc8, 0x28, 0x0d, 0x36,
-	0xee, 0xcb, 0x58, 0x20, 0x66, 0x16, 0x05, 0xe2, 0x4a, 0xc7, 0xed, 0xeb, 0x65, 0x7e, 0xe7, 0xe0,
-	0x28, 0x74, 0x92, 0x50, 0xc7, 0xa2, 0x50, 0x7d, 0xa3, 0x37, 0x04, 0x45, 0x90, 0xc4, 0x6a, 0x8e,
-	0x41, 0xcf, 0xe0, 0x03, 0xb5, 0x29, 0x62, 0xa1, 0x25, 0xab, 0xca, 0x78, 0x5a, 0x56, 0xf4, 0x26,
-	0x56, 0x25, 0x2c, 0x6a, 0xda, 0x1a, 0x5c, 0x70, 0x70, 0x24, 0xb4, 0x5b, 0x35, 0x51, 0x69, 0xc9,
-	0x15, 0x8a, 0x77, 0x21, 0xc8, 0xf5, 0x36, 0xf6, 0xf9, 0x78, 0x1f, 0x0e, 0x64, 0xc5, 0x27, 0x58,
-	0x68, 0xc9, 0xe7, 0x75, 0x31, 0xe2, 0x7f, 0x87, 0x2f, 0x41, 0x41, 0xf3, 0x9c, 0x41, 0xdc, 0x75,
-	0xf4, 0xcc, 0x22, 0xd8, 0x0a, 0xce, 0x12, 0x13, 0x7c, 0x75, 0xf0, 0x9b, 0xff, 0x2f, 0x03, 0x5c,
-	0xd2, 0x8a, 0xfb, 0x1f, 0x87, 0x74, 0xd4, 0x8d, 0x8e, 0xc3, 0x17, 0x1b, 0x9c, 0x86, 0xe4, 0x70,
-	0x66, 0x79, 0x0b, 0xf6, 0x83, 0x9d, 0x91, 0x2e, 0xdd, 0x98, 0x7f, 0x5c, 0xd1, 0x27, 0xb0, 0x65,
-	0xda, 0xd7, 0x4e, 0x28, 0x65, 0xe9, 0x4a, 0x12, 0x58, 0xc5, 0xc3, 0x8e, 0x5d, 0x94, 0x6e, 0xfc,
-	0x93, 0x81, 0xa3, 0x99, 0xf7, 0xb9, 0xeb, 0xf9, 0xf7, 0x87, 0x31, 0xff, 0xf2, 0x74, 0x6f, 0x89,
-	0x88, 0x71, 0xdf, 0x9e, 0xc1, 0x03, 0xba, 0x13, 0x37, 0x9f, 0x39, 0xcd, 0xbc, 0xd8, 0x2d, 0x1f,
-	0xcd, 0x2f, 0xf6, 0x3f, 0x1f, 0x47, 0x66, 0x7c, 0x79, 0xb9, 0xa3, 0x63, 0xb1, 0xca, 0xf0, 0xbf,
-	0x67, 0xa0, 0xa0, 0x11, 0xaf, 0xee, 0xf4, 0x7c, 0xb6, 0x45, 0xbb, 0x3b, 0x70, 0x4c, 0x7b, 0xa3,
-	0xbb, 0xe2, 0x63, 0xc8, 0xf5, 0x29, 0x8a, 0x4e, 0x42, 0x98, 0xe0, 0xab, 0xb3, 0xf8, 0x71, 0x7f,
-	0x16, 0x7d, 0xda, 0x34, 0x48, 0x0f, 0x3b, 0x4e, 0x14, 0x39, 0x91, 0x69, 0x33, 0x1c, 0xe6, 0xff,
-	0xc5, 0x06, 0xfb, 0xc3, 0xc4, 0x72, 0x3c, 0x32, 0xd9, 0xde, 0xfd, 0x13, 0xbe, 0x54, 0xd0, 0x8d,
-	0x62, 0xfc, 0x6b, 0xe6, 0x2d, 0x25, 0x71, 0x1c, 0x1c, 0xd5, 0x55, 0x49, 0x92, 0x15, 0x49, 0x17,
-	0x95, 0x6a, 0x53, 0x95, 0x95, 0xd6, 0xf8, 0xbe, 0x7f, 0x0e, 0x27, 0x73, 0x73, 0x4d, 0xac, 0xb6,
-	0xd4, 0x8a, 0x3a, 0x11, 0x9f, 0x02, 0x1c, 0x36, 0x34, 0xe9, 0xbc, 0xad, 0xc5, 0xd7, 0x6f, 0xa7,
-	0x1c, 0xaa, 0x1d, 0xfe, 0x1f, 0x2c, 0x70, 0x52, 0x42, 0x0c, 0xdc, 0x5f, 0x49, 0xd2, 0x51, 0xe3,
-	0x5e, 0x4e, 0x8a, 0x9e, 0xcc, 0xea, 0xd1, 0xb3, 0x95, 0x18, 0x3d, 0xf3, 0xdc, 0x6d, 0x7f, 0x0b,
-	0xf9, 0x77, 0x05, 0xf2, 0x1a, 0xf1, 0x1a, 0x6e, 0xef, 0x7c, 0xe4, 0xc6, 0x0f, 0xd8, 0x47, 0xf0,
-	0xd8, 0x72, 0x7b, 0x57, 0x23, 0x77, 0xf2, 0xd5, 0x54, 0xe3, 0xf7, 0xe8, 0x70, 0x64, 0xcf, 0xff,
-	0x8e, 0x85, 0x82, 0x34, 0x8f, 0x72, 0xff, 0x73, 0x90, 0x0a, 0x1a, 0x67, 0x28, 0x61, 0xab, 0x99,
-	0xa4, 0xad, 0xae, 0x76, 0x57, 0x7f, 0xb1, 0xbe, 0x56, 0xa5, 0x5e, 0x0a, 0x6f, 0x20, 0x27, 0xda,
-	0x9e, 0xe9, 0x99, 0xc4, 0xad, 0x3b, 0xbd, 0x3a, 0xb9, 0x25, 0x7d, 0xf4, 0x31, 0xbc, 0xd7, 0x0f,
-	0x7f, 0x87, 0x3e, 0xa1, 0x55, 0x5a, 0x64, 0x80, 0xc7, 0xd3, 0x88, 0x83, 0xf7, 0x48, 0xb8, 0x3c,
-	0xcf, 0x9e, 0x66, 0x5e, 0x64, 0xf1, 0xf8, 0x99, 0x1f, 0x01, 0xa2, 0xea, 0x48, 0x17, 0x6d, 0x20,
-	0x8b, 0x2f, 0x21, 0xdb, 0xf7, 0xeb, 0xe2, 0x5b, 0xd2, 0xa7, 0xf0, 0xbb, 0xe5, 0xc3, 0xc0, 0x32,
-	0xbe, 0x65, 0x3c, 0xb1, 0xe3, 0xff, 0xcc, 0xc2, 0xc1, 0xcc, 0x7b, 0x43, 0x9e, 0xd7, 0x79, 0xf1,
-	0x24, 0x26, 0xd8, 0xf4, 0x98, 0xf8, 0xc1, 0x38, 0x26, 0x32, 0x81, 0xd1, 0x49, 0xa4, 0x8d, 0xf1,
-	0x57, 0x2f, 0x55, 0xc5, 0x24, 0x92, 0x6f, 0xdf, 0xde, 0xc9, 0x8a, 0xec, 0xea, 0xaa, 0x2f, 0x7e,
-	0x2d, 0xb9, 0xf5, 0x66, 0x41, 0x01, 0xf4, 0x0b, 0x40, 0xd2, 0xfd, 0x58, 0x5b, 0x14, 0x13, 0xff,
-	0x61, 0xe1, 0x40, 0xba, 0x27, 0x39, 0x34, 0x2a, 0xea, 0x2b, 0x46, 0x05, 0xb5, 0x9b, 0x62, 0x34,
-	0xb3, 0x0a, 0xa3, 0x5b, 0x53, 0x8c, 0x4a, 0x1b, 0x30, 0xba, 0xfd, 0x0e, 0x31, 0x5a, 0x1b, 0xdf,
-	0x50, 0x7e, 0x4a, 0x17, 0x39, 0x69, 0x93, 0x0e, 0xd2, 0xe7, 0xf0, 0x44, 0x23, 0x5e, 0xd5, 0x8a,
-	0x47, 0xc7, 0x73, 0xd8, 0xee, 0xa7, 0xab, 0x05, 0x9d, 0xe3, 0xff, 0xcd, 0xc0, 0x61, 0x6c, 0xf5,
-	0x3a, 0x0a, 0xfc, 0x2a, 0xa6, 0xc0, 0xcf, 0xa2, 0xd3, 0x36, 0x0f, 0xb8, 0x51, 0x16, 0x22, 0x6f,
-	0x20, 0xaa, 0x53, 0x75, 0xa7, 0xcf, 0x44, 0x5d, 0x7c, 0x2d, 0xd6, 0x73, 0x2c, 0x7f, 0x04, 0x4f,
-	0xa4, 0x04, 0x37, 0xf1, 0xff, 0x63, 0xe0, 0x50, 0x4a, 0xf1, 0xc0, 0x72, 0x07, 0xae, 0x26, 0x4a,
-	0xaf, 0x62, 0xa2, 0xf4, 0x2c, 0x0a, 0xe1, 0x0d, 0xdc, 0x94, 0x24, 0x4b, 0x9b, 0xe4, 0xc9, 0x3f,
-	0x82, 0x6c, 0x8d, 0x18, 0x43, 0xef, 0x8a, 0x18, 0x1e, 0x2a, 0xc1, 0xc1, 0x4d, 0xf4, 0xa0, 0xbb,
-	0x66, 0xcf, 0x36, 0xbc, 0xd1, 0x90, 0x56, 0x67, 0x0f, 0x30, 0x1a, 0x4f, 0x69, 0xd1, 0x0c, 0x2f,
-	0xc0, 0x01, 0x26, 0x57, 0x8e, 0xe3, 0xcd, 0x96, 0x75, 0xeb, 0xc4, 0xed, 0x6f, 0x59, 0x78, 0x32,
-	0x8b, 0x31, 0x17, 0x79, 0x0b, 0x54, 0xe1, 0xb3, 0x98, 0x2a, 0x9c, 0x06, 0x46, 0x49, 0x78, 0x1b,
-	0xc9, 0xc2, 0xdd, 0x37, 0x9b, 0x42, 0xf9, 0x49, 0x6d, 0x38, 0x2e, 0x2b, 0xfa, 0x25, 0x56, 0x15,
-	0x49, 0xd7, 0x5a, 0x42, 0x4b, 0xcc, 0x6d, 0x95, 0xff, 0x02, 0x50, 0x50, 0x0c, 0xcf, 0xbc, 0x25,
-	0xb5, 0xcb, 0xc6, 0xb8, 0x83, 0xad, 0xd1, 0x06, 0x36, 0xd2, 0xe0, 0x20, 0xa1, 0x23, 0x81, 0x52,
-	0x6b, 0x44, 0xee, 0x74, 0x59, 0x17, 0xe3, 0x8c, 0x41, 0x6d, 0x40, 0xf3, 0x25, 0x32, 0x3a, 0x4e,
-	0xad, 0x9d, 0x03, 0xb2, 0xb9, 0x93, 0x25, 0xb5, 0x35, 0xaa, 0xc1, 0xbe, 0x9f, 0x8c, 0xcd, 0x14,
-	0x87, 0xe8, 0xa8, 0x48, 0xdb, 0xea, 0xc5, 0xa8, 0xad, 0x5e, 0x14, 0xad, 0x81, 0x77, 0xc7, 0x3d,
-	0x5d, 0x50, 0x49, 0xa2, 0xcb, 0xe0, 0xf0, 0xce, 0xb5, 0xb4, 0xd1, 0x07, 0x69, 0xad, 0x6e, 0xba,
-	0xc3, 0xe3, 0xc5, 0x9d, 0xf0, 0x33, 0x06, 0x5d, 0x06, 0x17, 0x6b, 0xac, 0x5d, 0x16, 0x7e, 0x79,
-	0x6a, 0x8b, 0x39, 0xfc, 0xf2, 0xf4, 0x4e, 0x6c, 0xe8, 0xd2, 0x15, 0x81, 0xb5, 0x25, 0xc0, 0xd3,
-	0x3d, 0xc1, 0x56, 0x94, 0xbe, 0xcd, 0x14, 0x10, 0xc7, 0x53, 0x49, 0x4e, 0x42, 0xd5, 0xcb, 0x1d,
-	0x2f, 0x2e, 0x10, 0xd1, 0x45, 0x94, 0x5e, 0xcc, 0xa0, 0x3e, 0x9e, 0xf9, 0x17, 0x40, 0xae, 0x72,
-	0x27, 0x4b, 0x4a, 0x20, 0x84, 0x61, 0x7f, 0xae, 0x30, 0x08, 0x39, 0x4a, 0x2b, 0x18, 0x96, 0xee,
-	0xed, 0x4b, 0x1a, 0x44, 0xb3, 0x98, 0x69, 0x41, 0x74, 0xbc, 0xb8, 0x02, 0x40, 0xcd, 0x28, 0xd1,
-	0x99, 0xb9, 0x75, 0xd1, 0xcc, 0x87, 0x25, 0xdc, 0xc7, 0x5c, 0x3e, 0x2d, 0xe7, 0x40, 0x3f, 0x83,
-	0xdd, 0xa9, 0xe4, 0x12, 0xbd, 0x3f, 0x9f, 0x6e, 0x4e, 0x23, 0x68, 0xc9, 0x08, 0xd2, 0x1c, 0x82,
-	0x94, 0x86, 0x90, 0xb4, 0x87, 0xcf, 0x60, 0x6f, 0x2c, 0xe5, 0x95, 0x1b, 0xd2, 0xf9, 0x55, 0xaa,
-	0x7f, 0x68, 0xff, 0x7f, 0xa2, 0xfb, 0x15, 0x78, 0x38, 0x2d, 0x99, 0xa1, 0x8c, 0x24, 0x28, 0x3b,
-	0x57, 0x48, 0xd5, 0x57, 0x74, 0x01, 0x8f, 0x66, 0x6e, 0x7c, 0x54, 0x48, 0xca, 0x02, 0x28, 0x0c,
-	0x97, 0x9e, 0x20, 0xf8, 0x38, 0x52, 0x02, 0x8e, 0x94, 0x8e, 0x93, 0x78, 0x83, 0x9e, 0x7f, 0xfe,
-	0xf3, 0x57, 0x3d, 0xd3, 0xbb, 0x19, 0x5d, 0x15, 0x3b, 0x8e, 0x55, 0x72, 0x06, 0xc4, 0xee, 0x38,
-	0xc3, 0x6e, 0x89, 0x5e, 0x3d, 0x9f, 0x4e, 0xfe, 0x14, 0xfc, 0xd4, 0xb4, 0x3d, 0x32, 0xbc, 0x36,
-	0x3a, 0xa4, 0x74, 0xfb, 0xb2, 0xd4, 0x73, 0x4a, 0x5d, 0xcb, 0xbc, 0xda, 0x09, 0x3c, 0xf6, 0xf2,
-	0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xe8, 0x0a, 0x35, 0x98, 0x44, 0x1c, 0x00, 0x00,
+	// 1901 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x5a, 0xcd, 0x6f, 0xdb, 0xd8,
+	0x11, 0x2f, 0x29, 0xdb, 0x59, 0x8d, 0x13, 0x47, 0x7e, 0x8e, 0x15, 0x49, 0x69, 0x62, 0x87, 0xe9,
+	0x76, 0xb3, 0xed, 0xae, 0x15, 0x38, 0x87, 0x6e, 0xba, 0xdb, 0x0f, 0x59, 0xa2, 0x69, 0xee, 0xca,
+	0x94, 0xf0, 0x28, 0xc5, 0x48, 0x51, 0x94, 0xa0, 0xa5, 0x67, 0x99, 0xa8, 0x48, 0xba, 0x22, 0xe5,
+	0x85, 0xff, 0x8c, 0x1e, 0x7a, 0xe8, 0xa1, 0xdb, 0xb4, 0xff, 0x41, 0xaf, 0x41, 0xaf, 0x45, 0x0b,
+	0xf4, 0xda, 0x63, 0x81, 0xa2, 0xa7, 0x9e, 0x5b, 0xa0, 0xf7, 0x05, 0xf9, 0x48, 0x7d, 0x90, 0x7c,
+	0xfa, 0xa0, 0xb3, 0x88, 0x6f, 0xd6, 0x7b, 0xf3, 0x7e, 0x1c, 0xce, 0x6f, 0x66, 0x38, 0x33, 0xcf,
+	0xb0, 0xd3, 0x35, 0x8d, 0xf2, 0xf9, 0x97, 0x9a, 0xa9, 0x5b, 0x7a, 0x8f, 0x98, 0xc4, 0x72, 0x35,
+	0x87, 0x0c, 0x2e, 0x8d, 0x0e, 0xd9, 0xbb, 0x18, 0xd8, 0xae, 0x8d, 0x32, 0x5d, 0xd3, 0x28, 0x6d,
+	0x7a, 0x52, 0x1d, 0xdb, 0x34, 0x6d, 0xcb, 0xa1, 0xeb, 0xa5, 0xdb, 0xf4, 0x60, 0xf0, 0xeb, 0x41,
+	0xcf, 0xb6, 0x7b, 0x7d, 0x52, 0xf6, 0x7f, 0x9d, 0x0e, 0xcf, 0xca, 0xc4, 0xbc, 0x70, 0xaf, 0xe8,
+	0xa6, 0x70, 0x08, 0x85, 0xe6, 0xf9, 0x95, 0x63, 0x74, 0xf4, 0xbe, 0x6c, 0x5d, 0x12, 0xcb, 0xb5,
+	0x07, 0x57, 0x98, 0xfc, 0x6a, 0x48, 0x1c, 0x17, 0x7d, 0x0f, 0xd6, 0xbb, 0xc4, 0x7b, 0x9c, 0x36,
+	0x1c, 0x1a, 0xdd, 0x02, 0xb7, 0xcb, 0x3d, 0x5d, 0xdf, 0xcf, 0xee, 0x75, 0x4d, 0x63, 0xaf, 0x3d,
+	0x34, 0xba, 0x18, 0xe8, 0xae, 0xf7, 0xb7, 0xf0, 0x27, 0x1e, 0x8a, 0x09, 0x40, 0xce, 0x85, 0x6d,
+	0x39, 0x04, 0x3d, 0x81, 0x35, 0xc7, 0xd5, 0xdd, 0xa1, 0xe3, 0x83, 0x6c, 0xec, 0xaf, 0xfb, 0x20,
+	0xaa, 0xbf, 0x84, 0x83, 0x2d, 0xf4, 0x23, 0x58, 0x1b, 0x10, 0xdd, 0xb1, 0xad, 0x02, 0xef, 0x0b,
+	0xbd, 0xef, 0x0b, 0x31, 0x41, 0xf7, 0xb0, 0x2f, 0x8c, 0x83, 0x43, 0xe8, 0xfb, 0x90, 0x35, 0x42,
+	0x99, 0x42, 0xc6, 0xd7, 0xf5, 0x8e, 0x8f, 0x70, 0xa4, 0x0f, 0xba, 0x5f, 0xea, 0x03, 0x82, 0xc7,
+	0xfb, 0xe8, 0x09, 0xdc, 0xa1, 0xc7, 0xb4, 0x2e, 0x71, 0x75, 0xa3, 0x5f, 0x58, 0xd9, 0xe5, 0x9e,
+	0x66, 0xf1, 0x6d, 0xba, 0x58, 0xf3, 0xd7, 0x84, 0x5f, 0xc0, 0x1a, 0x7d, 0x06, 0xba, 0x07, 0xb9,
+	0xb6, 0x52, 0x13, 0x0f, 0x65, 0x45, 0xac, 0x69, 0x58, 0xac, 0xa8, 0x0d, 0x25, 0xf7, 0x2d, 0x84,
+	0x60, 0xa3, 0xad, 0x7c, 0xa1, 0x34, 0x4e, 0x14, 0xad, 0x26, 0xbe, 0x94, 0xab, 0x62, 0x8e, 0xf3,
+	0xd6, 0x64, 0xa5, 0x25, 0x62, 0xa5, 0x52, 0xd7, 0x44, 0x8c, 0x1b, 0x38, 0xc7, 0xa3, 0x3c, 0x20,
+	0xba, 0xaf, 0xb5, 0x15, 0x2c, 0x56, 0xaa, 0x47, 0x95, 0x83, 0xba, 0x98, 0xcb, 0x08, 0xaf, 0x39,
+	0x28, 0x1e, 0x9d, 0x54, 0x6d, 0xf3, 0xc2, 0xb6, 0x88, 0xe5, 0xca, 0xd6, 0x99, 0x2d, 0x11, 0x37,
+	0x85, 0xf5, 0xd1, 0x33, 0xd8, 0xe8, 0x84, 0x30, 0x54, 0x9c, 0x8f, 0x8a, 0xdf, 0x19, 0x09, 0xf8,
+	0x27, 0xde, 0x9f, 0x3c, 0x61, 0xe9, 0x26, 0xf1, 0x4d, 0x96, 0x9d, 0x10, 0x53, 0x74, 0x93, 0x08,
+	0x7f, 0xe7, 0xa1, 0x94, 0xa4, 0xe2, 0x32, 0xbc, 0xfe, 0x38, 0xc2, 0xeb, 0x77, 0x29, 0x2b, 0x4c,
+	0xd4, 0x28, 0xb1, 0x1f, 0x41, 0x76, 0xa4, 0x54, 0x40, 0xec, 0x86, 0x0f, 0x31, 0x02, 0xc0, 0x63,
+	0x81, 0xc5, 0x98, 0x1d, 0xa6, 0x60, 0x76, 0x1b, 0x36, 0xc3, 0xb5, 0x6a, 0xe3, 0xb8, 0xd9, 0x50,
+	0x44, 0xa5, 0x95, 0xe3, 0x13, 0x08, 0xcf, 0x30, 0x08, 0x5f, 0x11, 0xfe, 0x11, 0x27, 0x5c, 0xbd,
+	0x59, 0x84, 0xa3, 0x7d, 0xb8, 0xd5, 0x39, 0xd7, 0xad, 0x1e, 0x71, 0x7c, 0xc3, 0xad, 0xef, 0x17,
+	0x7c, 0xc4, 0x63, 0xbb, 0x6b, 0x9c, 0x19, 0xfa, 0x69, 0x9f, 0x8c, 0x8d, 0x1e, 0x0a, 0x0a, 0x7f,
+	0x8d, 0x3b, 0x89, 0xfa, 0x8d, 0x38, 0x89, 0xca, 0x76, 0x92, 0x18, 0xed, 0x99, 0x04, 0xda, 0xbf,
+	0xe2, 0xde, 0x32, 0xef, 0x2f, 0x2b, 0x75, 0xb9, 0xa6, 0x35, 0x2b, 0xb8, 0x72, 0xac, 0xe6, 0x32,
+	0x09, 0xbe, 0xb0, 0xc2, 0xf0, 0x85, 0x55, 0xb4, 0x05, 0x77, 0x55, 0xb1, 0xa5, 0xb5, 0x15, 0xb5,
+	0xdd, 0x6c, 0x36, 0x70, 0x4b, 0xac, 0xe5, 0xd6, 0x84, 0x5f, 0x67, 0xe0, 0x81, 0xea, 0xea, 0x03,
+	0xf7, 0xd8, 0x4b, 0xf9, 0x86, 0xd5, 0xab, 0xf9, 0x94, 0x2f, 0x67, 0xca, 0x9f, 0x44, 0x4c, 0xf9,
+	0x41, 0x28, 0xc4, 0x82, 0x8d, 0xda, 0x32, 0xe2, 0x88, 0x99, 0x59, 0x8e, 0xb8, 0x50, 0xb8, 0xbd,
+	0x99, 0x67, 0xf7, 0x12, 0xe4, 0x03, 0x23, 0x55, 0xea, 0x58, 0xac, 0xd4, 0x5e, 0x69, 0xc7, 0x15,
+	0xa5, 0x22, 0x89, 0xb5, 0x1c, 0x87, 0x1e, 0xc3, 0xc3, 0x46, 0x53, 0xc4, 0x95, 0x96, 0xdc, 0x50,
+	0x46, 0xdb, 0xb2, 0xa2, 0x35, 0x71, 0x43, 0xc2, 0xa2, 0xaa, 0x2e, 0xc1, 0x45, 0x09, 0xf2, 0x95,
+	0x76, 0xeb, 0x48, 0x54, 0x5a, 0x72, 0x95, 0xe2, 0x1d, 0x56, 0xe4, 0x7a, 0x1b, 0x7b, 0x7c, 0xdc,
+	0x87, 0x2d, 0x59, 0xf1, 0x08, 0xae, 0xb4, 0xe4, 0x83, 0xba, 0x18, 0xf2, 0xbf, 0x26, 0x94, 0xa1,
+	0xa8, 0xba, 0xf6, 0x45, 0xd4, 0x74, 0x34, 0x66, 0x11, 0xac, 0xf8, 0xb1, 0xc4, 0xf9, 0x6f, 0xed,
+	0xff, 0x2d, 0xfc, 0x8f, 0x83, 0x52, 0xd2, 0x89, 0xeb, 0x87, 0x03, 0x1b, 0x35, 0x55, 0x38, 0x7c,
+	0x9e, 0x22, 0x1a, 0x92, 0xdd, 0x99, 0x17, 0x4c, 0xd8, 0xf4, 0x35, 0x23, 0x5d, 0xaa, 0x98, 0x17,
+	0xae, 0xe8, 0x23, 0x58, 0x31, 0xac, 0x33, 0x3b, 0x48, 0x65, 0xec, 0x4c, 0xe2, 0x4b, 0x45, 0xdd,
+	0x8e, 0x9f, 0x55, 0x6e, 0xfc, 0x8b, 0x83, 0xfc, 0xd4, 0xf3, 0x9c, 0xe5, 0xec, 0xfb, 0xc3, 0x88,
+	0x7d, 0x05, 0xaa, 0x5b, 0x22, 0x62, 0xd4, 0xb6, 0xcf, 0xe0, 0x16, 0xd5, 0xc4, 0x29, 0x64, 0x76,
+	0x33, 0x4f, 0xd7, 0xf7, 0xf3, 0xf1, 0xc3, 0xde, 0xeb, 0xe3, 0x50, 0x4c, 0xd8, 0x9f, 0x6f, 0xe8,
+	0x88, 0xaf, 0x72, 0xc2, 0xef, 0x38, 0x28, 0xaa, 0xc4, 0xad, 0xdb, 0x3d, 0x8f, 0x6d, 0xd1, 0xea,
+	0x5e, 0xd8, 0x86, 0x95, 0xea, 0x5b, 0xf1, 0x21, 0xe4, 0xfa, 0x14, 0x45, 0x23, 0x01, 0x8c, 0xff,
+	0xd6, 0x59, 0x7c, 0xb7, 0x3f, 0x8d, 0x3e, 0x29, 0xea, 0x97, 0x87, 0x1d, 0x3b, 0xf4, 0x9c, 0x50,
+	0xb4, 0x19, 0x2c, 0x0b, 0xff, 0xe6, 0x7d, 0xfd, 0x30, 0x31, 0x6d, 0x97, 0x8c, 0xd5, 0xbb, 0x7e,
+	0xc1, 0xc7, 0x04, 0x4d, 0xe5, 0xe3, 0x6f, 0xb8, 0xb7, 0x54, 0xc4, 0x95, 0x20, 0x5f, 0x6f, 0x48,
+	0x92, 0xac, 0x48, 0x9a, 0xa8, 0xd4, 0x9a, 0x0d, 0x59, 0x69, 0x8d, 0xbe, 0xf7, 0x4f, 0x60, 0x27,
+	0xb6, 0xd7, 0xc4, 0x8d, 0x56, 0xa3, 0xda, 0x18, 0x27, 0x9f, 0x22, 0x6c, 0x1f, 0xab, 0xd2, 0x41,
+	0x5b, 0x8d, 0x9e, 0x5f, 0x65, 0x04, 0xd5, 0x9a, 0xf0, 0x4f, 0x1e, 0x4a, 0x52, 0x82, 0x0f, 0x5c,
+	0x3f, 0x93, 0xb0, 0x51, 0xa3, 0x56, 0x4e, 0xf2, 0x9e, 0xcc, 0xe2, 0xde, 0xb3, 0x92, 0xe8, 0x3d,
+	0x71, 0xee, 0x56, 0xdf, 0x41, 0xfd, 0x5d, 0x85, 0x82, 0x4a, 0xdc, 0x63, 0xa7, 0x77, 0x30, 0x74,
+	0xa2, 0x01, 0xf6, 0x01, 0xdc, 0x35, 0x9d, 0xde, 0xe9, 0xd0, 0x19, 0xbf, 0x35, 0xcd, 0xf1, 0x1b,
+	0x74, 0x39, 0x94, 0x17, 0x7e, 0xcb, 0x43, 0x51, 0x8a, 0xa3, 0x5c, 0x3f, 0x0e, 0x98, 0xa0, 0x51,
+	0x86, 0x12, 0x54, 0xcd, 0x24, 0xa9, 0xba, 0xd8, 0xb7, 0xfa, 0xf3, 0xe5, 0x73, 0x15, 0xf3, 0xa3,
+	0xf0, 0x0a, 0x72, 0xa2, 0xe5, 0x1a, 0xae, 0x41, 0x9c, 0xba, 0xdd, 0xab, 0x93, 0x4b, 0xd2, 0x47,
+	0x1f, 0xc2, 0x7b, 0xfd, 0xe0, 0xef, 0xc0, 0x26, 0xb4, 0x4b, 0x0b, 0x05, 0xf0, 0x68, 0x1b, 0x95,
+	0xe0, 0x3d, 0x12, 0x1c, 0x2f, 0xf0, 0xbb, 0x99, 0xa7, 0x59, 0x3c, 0xfa, 0x2d, 0x0c, 0x01, 0xd1,
+	0xec, 0x48, 0x0f, 0xa5, 0x48, 0x8b, 0xcf, 0x21, 0xdb, 0xf7, 0xfa, 0xe2, 0x4b, 0xd2, 0xa7, 0xf0,
+	0xeb, 0xfb, 0xdb, 0xbe, 0x64, 0x54, 0x65, 0x3c, 0x96, 0x13, 0xfe, 0xcc, 0xc3, 0xd6, 0xd4, 0x73,
+	0x03, 0x9e, 0x97, 0x79, 0xf0, 0xd8, 0x27, 0x78, 0xb6, 0x4f, 0xfc, 0x60, 0xe4, 0x13, 0x19, 0x5f,
+	0x68, 0x27, 0xcc, 0x8d, 0xd1, 0x47, 0xcf, 0xcd, 0x8a, 0x49, 0x24, 0x5f, 0xbe, 0xbd, 0xc8, 0x0a,
+	0xe5, 0xea, 0x0d, 0x2f, 0xf9, 0xb5, 0xe4, 0xd6, 0xab, 0x19, 0x0d, 0xd0, 0xcf, 0x01, 0x49, 0xd7,
+	0x63, 0x6d, 0x96, 0x4f, 0xfc, 0x97, 0x87, 0x2d, 0xe9, 0x9a, 0xe4, 0x50, 0xaf, 0xa8, 0x2f, 0xe8,
+	0x15, 0x54, 0x6e, 0x82, 0xd1, 0xcc, 0x22, 0x8c, 0xae, 0x4c, 0x30, 0x2a, 0xa5, 0x60, 0x74, 0xf5,
+	0x06, 0x31, 0x7a, 0x34, 0xfa, 0x42, 0x79, 0x25, 0x5d, 0x68, 0xa4, 0x34, 0x13, 0xa4, 0x4f, 0xe1,
+	0x9e, 0x4a, 0xdc, 0x9a, 0x19, 0xf5, 0x8e, 0x27, 0xb0, 0xda, 0x67, 0x67, 0x0b, 0xba, 0x27, 0xfc,
+	0x87, 0x83, 0xed, 0xc8, 0xe9, 0x65, 0x32, 0xf0, 0x8b, 0x48, 0x06, 0x7e, 0x1c, 0x46, 0x5b, 0x1c,
+	0x30, 0x55, 0x15, 0x22, 0xa7, 0x48, 0xaa, 0x13, 0x7d, 0xa7, 0xc7, 0x44, 0x5d, 0x7c, 0x29, 0xd6,
+	0x73, 0xbc, 0x90, 0x87, 0x7b, 0x52, 0x82, 0x99, 0x84, 0xff, 0x73, 0xb0, 0x2d, 0x31, 0x2c, 0x30,
+	0xdf, 0x80, 0x8b, 0x25, 0xa5, 0x17, 0x91, 0xa4, 0xf4, 0x38, 0x74, 0xe1, 0x14, 0x66, 0x4a, 0x4a,
+	0x4b, 0x69, 0xea, 0xe4, 0xcf, 0x20, 0x7b, 0x44, 0xf4, 0x81, 0x7b, 0x4a, 0x74, 0x17, 0x95, 0x61,
+	0xeb, 0x3c, 0xfc, 0xa1, 0x39, 0x46, 0xcf, 0xd2, 0xdd, 0xe1, 0x80, 0x76, 0x67, 0xb7, 0x30, 0x1a,
+	0x6d, 0xa9, 0xe1, 0x8e, 0x50, 0x81, 0x2d, 0x4c, 0x4e, 0x6d, 0xdb, 0x9d, 0x6e, 0xeb, 0x96, 0xf1,
+	0xdb, 0xdf, 0xf0, 0x70, 0x6f, 0x1a, 0x23, 0xe6, 0x79, 0x33, 0xb2, 0xc2, 0x27, 0x91, 0xac, 0xb0,
+	0xeb, 0x0b, 0x25, 0xe1, 0xa5, 0x4a, 0x0b, 0x57, 0xdf, 0x6c, 0x09, 0xe5, 0x15, 0xb5, 0xc1, 0xba,
+	0xac, 0x68, 0x27, 0xb8, 0xa1, 0x48, 0x9a, 0xda, 0xaa, 0xb4, 0xbc, 0xcc, 0xf0, 0x9a, 0x83, 0x62,
+	0xcd, 0x70, 0xbc, 0xb4, 0x30, 0x31, 0xc6, 0xb9, 0x71, 0xd3, 0xcd, 0x24, 0x15, 0xaf, 0x5f, 0x5f,
+	0xb3, 0x51, 0x53, 0xe5, 0x8f, 0x3f, 0x72, 0xef, 0x64, 0x60, 0x89, 0xee, 0xc3, 0x56, 0x4d, 0x56,
+	0xbd, 0x1f, 0x53, 0x83, 0xaa, 0xd5, 0x84, 0x89, 0xcb, 0x9a, 0xf0, 0x15, 0x07, 0xf7, 0x31, 0x71,
+	0x88, 0x7b, 0x53, 0xe9, 0xfe, 0x0b, 0x0f, 0x85, 0xb8, 0x82, 0xcb, 0x90, 0xfd, 0x59, 0x84, 0xec,
+	0xef, 0x04, 0xd1, 0x9a, 0x8c, 0x99, 0x8a, 0xea, 0xd7, 0xef, 0x88, 0xea, 0x6d, 0xd8, 0xc4, 0x62,
+	0x74, 0x22, 0x99, 0x4c, 0xf4, 0xef, 0x39, 0x28, 0x88, 0xd6, 0x4d, 0x0e, 0xec, 0xbf, 0xf1, 0x50,
+	0x4c, 0xd0, 0xf0, 0xfa, 0x4d, 0x19, 0x13, 0x34, 0x15, 0xd7, 0x7f, 0x78, 0x47, 0x5c, 0xe7, 0x01,
+	0x89, 0xca, 0x62, 0x51, 0xbd, 0xff, 0xe6, 0x36, 0x14, 0x15, 0xdd, 0x35, 0x2e, 0xc9, 0xd1, 0xc9,
+	0xf1, 0xe8, 0x22, 0x52, 0xa5, 0xf7, 0x90, 0x48, 0x85, 0xad, 0x84, 0xc1, 0x32, 0x62, 0x8e, 0xfa,
+	0x4a, 0xbb, 0xf3, 0x86, 0xd1, 0xcf, 0x38, 0xd4, 0x06, 0x14, 0x9f, 0x74, 0xa2, 0x47, 0xcc, 0x11,
+	0xa8, 0xef, 0x78, 0xa5, 0x9d, 0x39, 0x23, 0x52, 0x74, 0x04, 0x9b, 0x5e, 0x4f, 0x3d, 0x35, 0xe3,
+	0x43, 0xf9, 0x3d, 0x7a, 0x3b, 0xba, 0x17, 0xde, 0x8e, 0xee, 0x89, 0xe6, 0x85, 0x7b, 0x55, 0x7a,
+	0x30, 0x63, 0x20, 0x88, 0x4e, 0xfc, 0x1a, 0x2c, 0x76, 0x33, 0x89, 0x1e, 0xb2, 0x6e, 0x2c, 0xa9,
+	0x86, 0x8f, 0x66, 0x5f, 0x68, 0x3e, 0xe3, 0xd0, 0x89, 0xdf, 0x1f, 0x45, 0x6e, 0x3d, 0x82, 0x37,
+	0x67, 0xde, 0x14, 0x06, 0x6f, 0xce, 0xbe, 0x50, 0x0b, 0x4c, 0xba, 0x20, 0xb0, 0x3a, 0x07, 0x78,
+	0xf2, 0x6a, 0xa7, 0x15, 0x76, 0xe1, 0x53, 0x73, 0xa0, 0x47, 0x13, 0xbd, 0x6a, 0xc2, 0xf0, 0xb2,
+	0xf4, 0x68, 0xf6, 0x9c, 0x0f, 0x1d, 0x86, 0x5d, 0xe2, 0x14, 0xea, 0xdd, 0xa9, 0xcb, 0x5c, 0xb9,
+	0x56, 0xda, 0x99, 0x33, 0xc9, 0x42, 0x18, 0x36, 0x63, 0xf3, 0x9d, 0x80, 0x23, 0xd6, 0xdc, 0x67,
+	0xae, 0x6e, 0x5f, 0x50, 0x27, 0x9a, 0xc6, 0x64, 0x39, 0xd1, 0xa3, 0xd9, 0x83, 0x1c, 0xd4, 0x0c,
+	0xfb, 0xd5, 0xa9, 0xe6, 0x09, 0x4d, 0xbd, 0x58, 0x42, 0x5b, 0x55, 0x2a, 0xb0, 0x5a, 0x47, 0xf4,
+	0x53, 0x58, 0x9f, 0x98, 0x11, 0xa0, 0xfb, 0xf1, 0xa9, 0xc1, 0x24, 0x82, 0x9a, 0x8c, 0x20, 0xc5,
+	0x10, 0x24, 0x16, 0x42, 0x92, 0x0e, 0x9f, 0xc0, 0xc6, 0xa8, 0x22, 0xaf, 0x9e, 0x93, 0xce, 0x2f,
+	0x99, 0xf6, 0xa1, 0xd7, 0xb8, 0xe3, 0xf2, 0xbd, 0x0a, 0xb7, 0x27, 0x2b, 0xdf, 0x20, 0x8d, 0x24,
+	0x14, 0xe8, 0xa5, 0x22, 0xb3, 0x4c, 0x46, 0x87, 0x70, 0x67, 0xaa, 0x71, 0x43, 0xc5, 0xa4, 0x66,
+	0x8e, 0xc2, 0x94, 0xd8, 0x7d, 0x9e, 0x87, 0x23, 0x25, 0xe0, 0x48, 0x6c, 0x9c, 0xe4, 0xf6, 0xab,
+	0x0d, 0x28, 0x5e, 0x0d, 0x06, 0x31, 0xc2, 0xac, 0x8f, 0x03, 0xe7, 0x9e, 0x51, 0x9c, 0x36, 0x20,
+	0x17, 0xad, 0x3b, 0xd0, 0xb7, 0x19, 0xe5, 0x08, 0x85, 0x7c, 0x38, 0xb3, 0x58, 0xf1, 0xa2, 0x25,
+	0xf6, 0x75, 0x0b, 0xa2, 0x85, 0xf5, 0xb1, 0x0f, 0x1c, 0x9c, 0xf9, 0x51, 0x3c, 0xf8, 0xf4, 0x67,
+	0x2f, 0x7a, 0x86, 0x7b, 0x3e, 0x3c, 0xdd, 0xeb, 0xd8, 0x66, 0xd9, 0xbe, 0x20, 0x56, 0xc7, 0x1e,
+	0x74, 0xcb, 0xb4, 0x04, 0xf8, 0x78, 0xfc, 0x7f, 0x2d, 0x1f, 0x1b, 0x96, 0x4b, 0x06, 0x67, 0x7a,
+	0x87, 0x94, 0x2f, 0x9f, 0x97, 0x7b, 0x76, 0xb9, 0x6b, 0x1a, 0xa7, 0x6b, 0xbe, 0xb7, 0x3c, 0xff,
+	0x3a, 0x00, 0x00, 0xff, 0xff, 0xac, 0x7c, 0x97, 0xc0, 0x07, 0x23, 0x00, 0x00,
 }
 
 // Reference imports to suppress errors if they are not otherwise used.
@@ -2227,6 +2724,12 @@
 	SetDmLogLevel(ctx context.Context, in *SetDmLogLevelRequest, opts ...grpc.CallOption) (*SetDmLogLevelResponse, error)
 	// Gets the log level at which the Device Manager is running
 	GetDmLogLevel(ctx context.Context, in *GetDmLogLevelRequest, opts ...grpc.CallOption) (*GetDmLogLevelResponse, error)
+	// Disables a hardware component on a device.
+	DisableHWComponent(ctx context.Context, in *DisableHWComponentRequest, opts ...grpc.CallOption) (*DisableHWComponentResponse, error)
+	// Resets a hardware component on a device.
+	ResetHWComponent(ctx context.Context, in *ResetHWComponentRequest, opts ...grpc.CallOption) (*ResetHWComponentResponse, error)
+	// Enables a hardware component on a device.
+	EnableHWComponent(ctx context.Context, in *EnableHWComponentRequest, opts ...grpc.CallOption) (*EnableHWComponentResponse, error)
 }
 
 type nativeHWManagementServiceClient struct {
@@ -2459,6 +2962,33 @@
 	return out, nil
 }
 
+func (c *nativeHWManagementServiceClient) DisableHWComponent(ctx context.Context, in *DisableHWComponentRequest, opts ...grpc.CallOption) (*DisableHWComponentResponse, error) {
+	out := new(DisableHWComponentResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/DisableHWComponent", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeHWManagementServiceClient) ResetHWComponent(ctx context.Context, in *ResetHWComponentRequest, opts ...grpc.CallOption) (*ResetHWComponentResponse, error) {
+	out := new(ResetHWComponentResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/ResetHWComponent", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
+func (c *nativeHWManagementServiceClient) EnableHWComponent(ctx context.Context, in *EnableHWComponentRequest, opts ...grpc.CallOption) (*EnableHWComponentResponse, error) {
+	out := new(EnableHWComponentResponse)
+	err := c.cc.Invoke(ctx, "/dmi.NativeHWManagementService/EnableHWComponent", in, out, opts...)
+	if err != nil {
+		return nil, err
+	}
+	return out, nil
+}
+
 // NativeHWManagementServiceServer is the server API for NativeHWManagementService service.
 type NativeHWManagementServiceServer interface {
 	// Initializes context for a device and sets up required states
@@ -2510,6 +3040,12 @@
 	SetDmLogLevel(context.Context, *SetDmLogLevelRequest) (*SetDmLogLevelResponse, error)
 	// Gets the log level at which the Device Manager is running
 	GetDmLogLevel(context.Context, *GetDmLogLevelRequest) (*GetDmLogLevelResponse, error)
+	// Disables a hardware component on a device.
+	DisableHWComponent(context.Context, *DisableHWComponentRequest) (*DisableHWComponentResponse, error)
+	// Resets a hardware component on a device.
+	ResetHWComponent(context.Context, *ResetHWComponentRequest) (*ResetHWComponentResponse, error)
+	// Enables a hardware component on a device.
+	EnableHWComponent(context.Context, *EnableHWComponentRequest) (*EnableHWComponentResponse, error)
 }
 
 // UnimplementedNativeHWManagementServiceServer can be embedded to have forward compatible implementations.
@@ -2567,6 +3103,15 @@
 func (*UnimplementedNativeHWManagementServiceServer) GetDmLogLevel(ctx context.Context, req *GetDmLogLevelRequest) (*GetDmLogLevelResponse, error) {
 	return nil, status.Errorf(codes.Unimplemented, "method GetDmLogLevel not implemented")
 }
+func (*UnimplementedNativeHWManagementServiceServer) DisableHWComponent(ctx context.Context, req *DisableHWComponentRequest) (*DisableHWComponentResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method DisableHWComponent not implemented")
+}
+func (*UnimplementedNativeHWManagementServiceServer) ResetHWComponent(ctx context.Context, req *ResetHWComponentRequest) (*ResetHWComponentResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method ResetHWComponent not implemented")
+}
+func (*UnimplementedNativeHWManagementServiceServer) EnableHWComponent(ctx context.Context, req *EnableHWComponentRequest) (*EnableHWComponentResponse, error) {
+	return nil, status.Errorf(codes.Unimplemented, "method EnableHWComponent not implemented")
+}
 
 func RegisterNativeHWManagementServiceServer(s *grpc.Server, srv NativeHWManagementServiceServer) {
 	s.RegisterService(&_NativeHWManagementService_serviceDesc, srv)
@@ -2887,6 +3432,60 @@
 	return interceptor(ctx, in, info, handler)
 }
 
+func _NativeHWManagementService_DisableHWComponent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(DisableHWComponentRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).DisableHWComponent(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/DisableHWComponent",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).DisableHWComponent(ctx, req.(*DisableHWComponentRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeHWManagementService_ResetHWComponent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(ResetHWComponentRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).ResetHWComponent(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/ResetHWComponent",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).ResetHWComponent(ctx, req.(*ResetHWComponentRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
+func _NativeHWManagementService_EnableHWComponent_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
+	in := new(EnableHWComponentRequest)
+	if err := dec(in); err != nil {
+		return nil, err
+	}
+	if interceptor == nil {
+		return srv.(NativeHWManagementServiceServer).EnableHWComponent(ctx, in)
+	}
+	info := &grpc.UnaryServerInfo{
+		Server:     srv,
+		FullMethod: "/dmi.NativeHWManagementService/EnableHWComponent",
+	}
+	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
+		return srv.(NativeHWManagementServiceServer).EnableHWComponent(ctx, req.(*EnableHWComponentRequest))
+	}
+	return interceptor(ctx, in, info, handler)
+}
+
 var _NativeHWManagementService_serviceDesc = grpc.ServiceDesc{
 	ServiceName: "dmi.NativeHWManagementService",
 	HandlerType: (*NativeHWManagementServiceServer)(nil),
@@ -2947,6 +3546,18 @@
 			MethodName: "GetDmLogLevel",
 			Handler:    _NativeHWManagementService_GetDmLogLevel_Handler,
 		},
+		{
+			MethodName: "DisableHWComponent",
+			Handler:    _NativeHWManagementService_DisableHWComponent_Handler,
+		},
+		{
+			MethodName: "ResetHWComponent",
+			Handler:    _NativeHWManagementService_ResetHWComponent_Handler,
+		},
+		{
+			MethodName: "EnableHWComponent",
+			Handler:    _NativeHWManagementService_EnableHWComponent_Handler,
+		},
 	},
 	Streams: []grpc.StreamDesc{
 		{
diff --git a/protos/dmi/hw.proto b/protos/dmi/hw.proto
index d79da0a..422370f 100644
--- a/protos/dmi/hw.proto
+++ b/protos/dmi/hw.proto
@@ -44,6 +44,12 @@
     COMP_ADMIN_STATE_LOCKED = 2;
     COMP_ADMIN_STATE_SHUTTING_DOWN = 3;
     COMP_ADMIN_STATE_UNLOCKED = 4;
+    // Indicates that the component is in a prohibited administrative state, meaning operations are not allowed.
+    // Typically used to enforce security or policy restrictions.
+    COMP_ADMIN_STATE_ISOLATED = 6;    
+    // Indicates that the component is administratively isolated from the rest of the system.
+    // Used when a component must be separated for maintenance, troubleshooting, or security reasons.
+    COMP_ADMIN_STATE_PROHIBITED = 5;
 }
 
 enum ComponentOperState {
@@ -52,6 +58,23 @@
     COMP_OPER_STATE_DISABLED = 2;
     COMP_OPER_STATE_ENABLED = 3;
     COMP_OPER_STATE_TESTING = 4;
+    // Indicates that the component is operating normally.
+    COMP_OPER_STATE_NORMAL = 5;
+    // Indicates that the component is currently being configured.
+    COMP_OPER_STATE_CONFIGURING = 6;
+    // Indicates that the component is automatically loading configuration or software.
+    COMP_OPER_STATE_AUTOMATIC_LOADING = 7;
+    // Indicates that the component has encountered a failure.
+    COMP_OPER_STATE_FAILED = 8;
+    // Indicates that the component is temporarily shut down.
+    // The component is in a high temperature shutdown state due to exceeding safe operating temperature limits.
+    COMP_OPER_STATE_HIGH_TEMP_SHUTDOWN= 9;
+    // Indicates that the component is manually shut down.
+    COMP_OPER_STATE_MANUAL_SHUTDOWN = 10;
+    // Indicates that the component is shut down to save power.
+    COMP_OPER_STATE_POWER_SAVING_SHUTDOWN = 11;
+    // Indicates that the component's type does not match the expected type.
+    COMP_OPER_STATE_TYPE_MISMATCH = 12;  
 }
 
 enum ComponentUsageState {
diff --git a/protos/dmi/hw_events_mgmt_service.proto b/protos/dmi/hw_events_mgmt_service.proto
index e8c1e9c..7cde7d9 100644
--- a/protos/dmi/hw_events_mgmt_service.proto
+++ b/protos/dmi/hw_events_mgmt_service.proto
@@ -85,6 +85,14 @@
     EVENT_LINE_CARD_PLUG_OUT = 600;
     EVENT_LINE_CARD_PLUG_IN = 601;
 
+    // Indicates that the a state of a component has changed.
+    // The StateChangeInfo message inside the event conveys the old and new states.
+    EVENT_COMPONENT_ADMIN_STATE_CHANGED = 700;
+    EVENT_COMPONENT_OPER_STATE_CHANGED = 701;
+    EVENT_COMPONENT_ALARM_STATE_CHANGED = 702;
+    EVENT_COMPONENT_USAGE_STATE_CHANGED = 703;
+    EVENT_COMPONENT_STANDBY_STATE_CHANGED = 704;
+
     // More to be added
 }
 
@@ -176,6 +184,40 @@
     string component_name = 3;
 }
 
+message AdminStateChange {
+    ComponentAdminState old = 1;
+    ComponentAdminState new = 2;
+}
+
+message OperStateChange {
+    ComponentOperState old = 1;
+    ComponentOperState new = 2;
+}
+
+message AlarmStateChange {
+    ComponentAlarmState old = 1;
+    ComponentAlarmState new = 2;
+}
+
+message UsageStateChange {
+    ComponentUsageState old = 1;
+    ComponentUsageState new = 2;
+}
+
+message StandbyStateChange {
+    ComponentStandbyState old = 1;
+    ComponentStandbyState new = 2;
+}
+
+message StateChangeInfo {
+    oneof state_change {
+        AdminStateChange admin_state_change = 1;
+        OperStateChange oper_state_change = 2;
+        AlarmStateChange alarm_state_change = 3;
+        UsageStateChange usage_state_change = 4;
+        StandbyStateChange standby_state_change = 5;
+    }
+}
 // The Events are conveyed to external systems either by submitting them on a message bus or using gRPC server streaming.
 // The message bus topic to which are Events are submitted would be configured as startup
 // configuration of the components
@@ -188,6 +230,7 @@
     ThresholdInformation threshold_info = 4;
     // Any additional info regarding the event
     string add_info = 5;
+    StateChangeInfo state_change_info = 6; // Only set for state change events
 }
 
 service NativeEventsManagementService {
diff --git a/protos/dmi/hw_management_service.proto b/protos/dmi/hw_management_service.proto
index 6caa7a5..58be1a1 100644
--- a/protos/dmi/hw_management_service.proto
+++ b/protos/dmi/hw_management_service.proto
@@ -279,6 +279,96 @@
     string reason_detail = 5;
 }
 
+// Request to disable a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+message DisableHWComponentRequest {
+    // UUID of the device containing the component to disable (required)
+    Uuid device_uuid = 1;
+    // UUID of the component to disable (optional, but either this or component_name must be set)
+    Uuid component_uuid = 2;
+    // Name of the component to disable (optional, but either this or component_uuid must be set)
+    string component_name = 3;
+}
+
+// Response for DisableHWComponent RPC.
+message DisableHWComponentResponse {
+    enum Reason {
+        UNDEFINED_REASON = 0;
+        UNKNOWN_DEVICE = 1;
+        UNKNOWN_COMPONENT = 2;
+        INTERNAL_ERROR = 3;
+        DEVICE_UNREACHABLE = 4;
+        DISABLE_UNSUPPORTED = 5; // Disabling this component is not supported
+        INVALID_PARAMS = 6;      // Neither component_name nor component_uuid provided
+    }
+    // Indicates whether the operation was successful or not.
+    Status status = 1;
+    // Reason for failure, if any
+    Reason reason = 2;
+    // Human-readable details for logging or display
+    string reason_detail = 3;
+}
+
+// Request to reset a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+message ResetHWComponentRequest {
+    // UUID of the device containing the component to reset (required)
+    Uuid device_uuid = 1;
+    // UUID of the component to reset (optional, but either this or component_name must be set)
+    Uuid component_uuid = 2;
+    // Name of the component to reset (optional, but either this or component_uuid must be set)
+    string component_name = 3;
+}
+
+// Response for ResetHWComponent RPC.
+message ResetHWComponentResponse {
+    enum Reason {
+        UNDEFINED_REASON = 0;
+        UNKNOWN_DEVICE = 1;
+        UNKNOWN_COMPONENT = 2;
+        INTERNAL_ERROR = 3;
+        DEVICE_UNREACHABLE = 4;
+        RESET_UNSUPPORTED = 5; // Resetting this component is not supported
+        INVALID_PARAMS = 6;    // Neither component_name nor component_uuid provided
+    }
+    // Indicates whether the operation was successful or not.
+    Status status = 1;
+    // Reason for failure, if any
+    Reason reason = 2;
+    // Human-readable details for logging or display
+    string reason_detail = 3;
+}
+
+// Request to enable a hardware component on a device.
+// At least one of component_name or component_uuid must be provided, along with device_uuid.
+message EnableHWComponentRequest {
+    // UUID of the device containing the component to enable (required)
+    Uuid device_uuid = 1;
+    // UUID of the component to enable (optional, but either this or component_name must be set)
+    Uuid component_uuid = 2;
+    // Name of the component to enable (optional, but either this or component_uuid must be set)
+    string component_name = 3;
+}
+
+// Response for EnableHWComponent RPC.
+message EnableHWComponentResponse {
+    enum Reason {
+        UNDEFINED_REASON = 0;
+        UNKNOWN_DEVICE = 1;
+        UNKNOWN_COMPONENT = 2;
+        INTERNAL_ERROR = 3;
+        DEVICE_UNREACHABLE = 4;
+        ENABLE_UNSUPPORTED = 5; // Enabling this component is not supported
+        INVALID_PARAMS = 6;     // Neither component_name nor component_uuid provided
+    }
+    // Indicates whether the operation was successful or not.
+    Status status = 1;
+    // Reason for failure, if any
+    Reason reason = 2;
+    // Human-readable details for logging or display
+    string reason_detail = 3;
+}
+
 service NativeHWManagementService {
     // Initializes context for a device and sets up required states
     // In the call to StartManagingDevice, the fields of ModifiableComponent which are relevant
@@ -345,4 +435,13 @@
 
     // Gets the log level at which the Device Manager is running
     rpc GetDmLogLevel(GetDmLogLevelRequest) returns(GetDmLogLevelResponse);
+
+    // Disables a hardware component on a device.
+    rpc DisableHWComponent(DisableHWComponentRequest) returns(DisableHWComponentResponse);
+
+    // Resets a hardware component on a device.
+    rpc ResetHWComponent(ResetHWComponentRequest) returns(ResetHWComponentResponse);
+
+    // Enables a hardware component on a device.
+    rpc EnableHWComponent(EnableHWComponentRequest) returns(EnableHWComponentResponse);
 }
diff --git a/python/dmi/hw_events_mgmt_service_pb2.py b/python/dmi/hw_events_mgmt_service_pb2.py
index 79731be..ce3500d 100644
--- a/python/dmi/hw_events_mgmt_service_pb2.py
+++ b/python/dmi/hw_events_mgmt_service_pb2.py
@@ -19,7 +19,7 @@
 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n dmi/hw_events_mgmt_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\"u\n\tValueType\x12\x11\n\x07int_val\x18\x01 \x01(\x03H\x00\x12\x12\n\x08uint_val\x18\x02 \x01(\x04H\x00\x12\x13\n\tfloat_val\x18\x03 \x01(\x02H\x00\x12%\n\ttypeOfVal\x18\x04 \x01(\x0e\x32\x12.dmi.DataValueTypeB\x05\n\x03val\"G\n\nWaterMarks\x12\x1c\n\x04high\x18\x01 \x01(\x0b\x32\x0e.dmi.ValueType\x12\x1b\n\x03low\x18\x02 \x01(\x0b\x32\x0e.dmi.ValueType\"]\n\nThresholds\x12 \n\x05upper\x18\x01 \x01(\x0b\x32\x0f.dmi.WaterMarksH\x00\x12 \n\x05lower\x18\x02 \x01(\x0b\x32\x0f.dmi.WaterMarksH\x00\x42\x0b\n\tthreshold\"c\n\x14ThresholdInformation\x12&\n\x0eobserved_value\x18\x01 \x01(\x0b\x32\x0e.dmi.ValueType\x12#\n\nthresholds\x18\x02 \x01(\x0b\x32\x0f.dmi.Thresholds\"\x8a\x01\n\x08\x45ventCfg\x12\x1f\n\x08\x65vent_id\x18\x01 \x01(\x0e\x32\r.dmi.EventIds\x12\x15\n\ris_configured\x18\x02 \x01(\x08\x12#\n\nthresholds\x18\x03 \x01(\x0b\x32\x0f.dmi.Thresholds\x12!\n\x0e\x63omponent_uuid\x18\x04 \x01(\x0b\x32\t.dmi.Uuid\")\n\tEventsCfg\x12\x1c\n\x05items\x18\x01 \x03(\x0b\x32\r.dmi.EventCfg\"\xf8\x01\n\x12ListEventsResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12.\n\x06reason\x18\x02 \x01(\x0e\x32\x1e.dmi.ListEventsResponse.Reason\x12\x1e\n\x06\x65vents\x18\x03 \x01(\x0b\x32\x0e.dmi.EventsCfg\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"\x88\x01\n\x1a\x45ventsConfigurationRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x0e.dmi.EventsCfgH\x00\x12\x1a\n\x10reset_to_default\x18\x03 \x01(\x08H\x00\x42\x0b\n\toperation\"\xfe\x01\n\x1b\x45ventsConfigurationResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x37\n\x06reason\x18\x02 \x01(\x0e\x32\'.dmi.EventsConfigurationResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"r\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x12\n\x0eINVALID_CONFIG\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"j\n\rEventMetaData\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\xc8\x01\n\x05\x45vent\x12*\n\x0e\x65vent_metadata\x18\x01 \x01(\x0b\x32\x12.dmi.EventMetaData\x12\x1f\n\x08\x65vent_id\x18\x02 \x01(\x0e\x32\r.dmi.EventIds\x12-\n\traised_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\x0ethreshold_info\x18\x04 \x01(\x0b\x32\x19.dmi.ThresholdInformation\x12\x10\n\x08\x61\x64\x64_info\x18\x05 \x01(\t*\xe2\x12\n\x08\x45ventIds\x12\x18\n\x14\x45VENT_NAME_UNDEFINED\x10\x00\x12\x1e\n\x1a\x45VENT_TRANSCEIVER_PLUG_OUT\x10\x64\x12\x1d\n\x19\x45VENT_TRANSCEIVER_PLUG_IN\x10\x65\x12-\n)EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD\x10\x66\x12-\n)EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD\x10g\x12\x31\n-EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD\x10h\x12\x31\n-EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD\x10i\x12-\n)EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD\x10j\x12-\n)EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD\x10k\x12.\n*EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD\x10l\x12.\n*EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD\x10m\x12.\n*EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD\x10n\x12.\n*EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD\x10o\x12\x1d\n\x19\x45VENT_TRANSCEIVER_FAILURE\x10p\x12\x37\n3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD_RECOVERED\x10q\x12\x37\n3EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD_RECOVERED\x10r\x12;\n7EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD_RECOVERED\x10s\x12;\n7EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD_RECOVERED\x10t\x12\x37\n3EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD_RECOVERED\x10u\x12\x37\n3EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD_RECOVERED\x10v\x12\x38\n4EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECOVERED\x10w\x12\x38\n4EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD_RECOVERED\x10x\x12\x38\n4EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_RECOVERED\x10y\x12\x38\n4EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD_RECOVERED\x10z\x12\'\n#EVENT_TRANSCEIVER_FAILURE_RECOVERED\x10{\x12\x17\n\x12\x45VENT_PSU_PLUG_OUT\x10\xc8\x01\x12\x16\n\x11\x45VENT_PSU_PLUG_IN\x10\xc9\x01\x12\x16\n\x11\x45VENT_PSU_FAILURE\x10\xca\x01\x12 \n\x1b\x45VENT_PSU_FAILURE_RECOVERED\x10\xcb\x01\x12\x16\n\x11\x45VENT_FAN_FAILURE\x10\xac\x02\x12\x17\n\x12\x45VENT_FAN_PLUG_OUT\x10\xad\x02\x12\x16\n\x11\x45VENT_FAN_PLUG_IN\x10\xae\x02\x12 \n\x1b\x45VENT_FAN_FAILURE_RECOVERED\x10\xaf\x02\x12)\n$EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL\x10\x90\x03\x12&\n!EVENT_CPU_TEMPERATURE_ABOVE_FATAL\x10\x91\x03\x12\x33\n.EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_RECOVERED\x10\x92\x03\x12\x30\n+EVENT_CPU_TEMPERATURE_ABOVE_FATAL_RECOVERED\x10\x93\x03\x12$\n\x1f\x45VENT_CPU_USAGE_ABOVE_THRESHOLD\x10\x94\x03\x12.\n)EVENT_CPU_USAGE_ABOVE_THRESHOLD_RECOVERED\x10\x95\x03\x12\x1a\n\x15\x45VENT_HW_DEVICE_RESET\x10\xf4\x03\x12/\n*EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL\x10\xf5\x03\x12,\n\'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL\x10\xf6\x03\x12\x39\n4EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED\x10\xf7\x03\x12\x36\n1EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL_RECOVERED\x10\xf8\x03\x12\x1b\n\x16\x45VENT_HW_DEVICE_REBOOT\x10\xf9\x03\x12\'\n\"EVENT_HW_TEMPERATURE_SENSOR_FAILED\x10\xfa\x03\x12,\n\'EVENT_HW_ALL_TEMPERATURE_SENSORS_FAILED\x10\xfb\x03\x12(\n#EVENT_HW_DISK_USAGE_ABOVE_THRESHOLD\x10\xfc\x03\x12\x32\n-EVENT_HW_DISK_USAGE_ABOVE_THRESHOLD_RECOVERED\x10\xfd\x03\x12*\n%EVENT_HW_MEMORY_USAGE_ABOVE_THRESHOLD\x10\xfe\x03\x12\x34\n/EVENT_HW_MEMORY_USAGE_ABOVE_THRESHOLD_RECOVERED\x10\xff\x03\x12\x1e\n\x19\x45VENT_HW_NTP_SYNC_FAILURE\x10\x80\x04\x12(\n#EVENT_HW_NTP_SYNC_FAILURE_RECOVERED\x10\x81\x04\x12\x1d\n\x18\x45VENT_LINE_CARD_PLUG_OUT\x10\xd8\x04\x12\x1c\n\x17\x45VENT_LINE_CARD_PLUG_IN\x10\xd9\x04\x32\xed\x01\n\x1dNativeEventsManagementService\x12\x36\n\nListEvents\x12\x0f.dmi.HardwareID\x1a\x17.dmi.ListEventsResponse\x12^\n\x19UpdateEventsConfiguration\x12\x1f.dmi.EventsConfigurationRequest\x1a .dmi.EventsConfigurationResponse\x12\x34\n\x0cStreamEvents\x12\x16.google.protobuf.Empty\x1a\n.dmi.Event0\x01\x42;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n dmi/hw_events_mgmt_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\"u\n\tValueType\x12\x11\n\x07int_val\x18\x01 \x01(\x03H\x00\x12\x12\n\x08uint_val\x18\x02 \x01(\x04H\x00\x12\x13\n\tfloat_val\x18\x03 \x01(\x02H\x00\x12%\n\ttypeOfVal\x18\x04 \x01(\x0e\x32\x12.dmi.DataValueTypeB\x05\n\x03val\"G\n\nWaterMarks\x12\x1c\n\x04high\x18\x01 \x01(\x0b\x32\x0e.dmi.ValueType\x12\x1b\n\x03low\x18\x02 \x01(\x0b\x32\x0e.dmi.ValueType\"]\n\nThresholds\x12 \n\x05upper\x18\x01 \x01(\x0b\x32\x0f.dmi.WaterMarksH\x00\x12 \n\x05lower\x18\x02 \x01(\x0b\x32\x0f.dmi.WaterMarksH\x00\x42\x0b\n\tthreshold\"c\n\x14ThresholdInformation\x12&\n\x0eobserved_value\x18\x01 \x01(\x0b\x32\x0e.dmi.ValueType\x12#\n\nthresholds\x18\x02 \x01(\x0b\x32\x0f.dmi.Thresholds\"\x8a\x01\n\x08\x45ventCfg\x12\x1f\n\x08\x65vent_id\x18\x01 \x01(\x0e\x32\r.dmi.EventIds\x12\x15\n\ris_configured\x18\x02 \x01(\x08\x12#\n\nthresholds\x18\x03 \x01(\x0b\x32\x0f.dmi.Thresholds\x12!\n\x0e\x63omponent_uuid\x18\x04 \x01(\x0b\x32\t.dmi.Uuid\")\n\tEventsCfg\x12\x1c\n\x05items\x18\x01 \x03(\x0b\x32\r.dmi.EventCfg\"\xf8\x01\n\x12ListEventsResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12.\n\x06reason\x18\x02 \x01(\x0e\x32\x1e.dmi.ListEventsResponse.Reason\x12\x1e\n\x06\x65vents\x18\x03 \x01(\x0b\x32\x0e.dmi.EventsCfg\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"\x88\x01\n\x1a\x45ventsConfigurationRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x07\x63hanges\x18\x02 \x01(\x0b\x32\x0e.dmi.EventsCfgH\x00\x12\x1a\n\x10reset_to_default\x18\x03 \x01(\x08H\x00\x42\x0b\n\toperation\"\xfe\x01\n\x1b\x45ventsConfigurationResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x37\n\x06reason\x18\x02 \x01(\x0e\x32\'.dmi.EventsConfigurationResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"r\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x12\n\x0eINVALID_CONFIG\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"j\n\rEventMetaData\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"`\n\x10\x41\x64minStateChange\x12%\n\x03old\x18\x01 \x01(\x0e\x32\x18.dmi.ComponentAdminState\x12%\n\x03new\x18\x02 \x01(\x0e\x32\x18.dmi.ComponentAdminState\"]\n\x0fOperStateChange\x12$\n\x03old\x18\x01 \x01(\x0e\x32\x17.dmi.ComponentOperState\x12$\n\x03new\x18\x02 \x01(\x0e\x32\x17.dmi.ComponentOperState\"`\n\x10\x41larmStateChange\x12%\n\x03old\x18\x01 \x01(\x0e\x32\x18.dmi.ComponentAlarmState\x12%\n\x03new\x18\x02 \x01(\x0e\x32\x18.dmi.ComponentAlarmState\"`\n\x10UsageStateChange\x12%\n\x03old\x18\x01 \x01(\x0e\x32\x18.dmi.ComponentUsageState\x12%\n\x03new\x18\x02 \x01(\x0e\x32\x18.dmi.ComponentUsageState\"f\n\x12StandbyStateChange\x12\'\n\x03old\x18\x01 \x01(\x0e\x32\x1a.dmi.ComponentStandbyState\x12\'\n\x03new\x18\x02 \x01(\x0e\x32\x1a.dmi.ComponentStandbyState\"\xac\x02\n\x0fStateChangeInfo\x12\x33\n\x12\x61\x64min_state_change\x18\x01 \x01(\x0b\x32\x15.dmi.AdminStateChangeH\x00\x12\x31\n\x11oper_state_change\x18\x02 \x01(\x0b\x32\x14.dmi.OperStateChangeH\x00\x12\x33\n\x12\x61larm_state_change\x18\x03 \x01(\x0b\x32\x15.dmi.AlarmStateChangeH\x00\x12\x33\n\x12usage_state_change\x18\x04 \x01(\x0b\x32\x15.dmi.UsageStateChangeH\x00\x12\x37\n\x14standby_state_change\x18\x05 \x01(\x0b\x32\x17.dmi.StandbyStateChangeH\x00\x42\x0e\n\x0cstate_change\"\xf9\x01\n\x05\x45vent\x12*\n\x0e\x65vent_metadata\x18\x01 \x01(\x0b\x32\x12.dmi.EventMetaData\x12\x1f\n\x08\x65vent_id\x18\x02 \x01(\x0e\x32\r.dmi.EventIds\x12-\n\traised_ts\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x31\n\x0ethreshold_info\x18\x04 \x01(\x0b\x32\x19.dmi.ThresholdInformation\x12\x10\n\x08\x61\x64\x64_info\x18\x05 \x01(\t\x12/\n\x11state_change_info\x18\x06 \x01(\x0b\x32\x14.dmi.StateChangeInfo*\xb5\x14\n\x08\x45ventIds\x12\x18\n\x14\x45VENT_NAME_UNDEFINED\x10\x00\x12\x1e\n\x1a\x45VENT_TRANSCEIVER_PLUG_OUT\x10\x64\x12\x1d\n\x19\x45VENT_TRANSCEIVER_PLUG_IN\x10\x65\x12-\n)EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD\x10\x66\x12-\n)EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD\x10g\x12\x31\n-EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD\x10h\x12\x31\n-EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD\x10i\x12-\n)EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD\x10j\x12-\n)EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD\x10k\x12.\n*EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD\x10l\x12.\n*EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD\x10m\x12.\n*EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD\x10n\x12.\n*EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD\x10o\x12\x1d\n\x19\x45VENT_TRANSCEIVER_FAILURE\x10p\x12\x37\n3EVENT_TRANSCEIVER_VOLTAGE_ABOVE_THRESHOLD_RECOVERED\x10q\x12\x37\n3EVENT_TRANSCEIVER_VOLTAGE_BELOW_THRESHOLD_RECOVERED\x10r\x12;\n7EVENT_TRANSCEIVER_TEMPERATURE_ABOVE_THRESHOLD_RECOVERED\x10s\x12;\n7EVENT_TRANSCEIVER_TEMPERATURE_BELOW_THRESHOLD_RECOVERED\x10t\x12\x37\n3EVENT_TRANSCEIVER_CURRENT_ABOVE_THRESHOLD_RECOVERED\x10u\x12\x37\n3EVENT_TRANSCEIVER_CURRENT_BELOW_THRESHOLD_RECOVERED\x10v\x12\x38\n4EVENT_TRANSCEIVER_RX_POWER_ABOVE_THRESHOLD_RECOVERED\x10w\x12\x38\n4EVENT_TRANSCEIVER_RX_POWER_BELOW_THRESHOLD_RECOVERED\x10x\x12\x38\n4EVENT_TRANSCEIVER_TX_POWER_ABOVE_THRESHOLD_RECOVERED\x10y\x12\x38\n4EVENT_TRANSCEIVER_TX_POWER_BELOW_THRESHOLD_RECOVERED\x10z\x12\'\n#EVENT_TRANSCEIVER_FAILURE_RECOVERED\x10{\x12\x17\n\x12\x45VENT_PSU_PLUG_OUT\x10\xc8\x01\x12\x16\n\x11\x45VENT_PSU_PLUG_IN\x10\xc9\x01\x12\x16\n\x11\x45VENT_PSU_FAILURE\x10\xca\x01\x12 \n\x1b\x45VENT_PSU_FAILURE_RECOVERED\x10\xcb\x01\x12\x16\n\x11\x45VENT_FAN_FAILURE\x10\xac\x02\x12\x17\n\x12\x45VENT_FAN_PLUG_OUT\x10\xad\x02\x12\x16\n\x11\x45VENT_FAN_PLUG_IN\x10\xae\x02\x12 \n\x1b\x45VENT_FAN_FAILURE_RECOVERED\x10\xaf\x02\x12)\n$EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL\x10\x90\x03\x12&\n!EVENT_CPU_TEMPERATURE_ABOVE_FATAL\x10\x91\x03\x12\x33\n.EVENT_CPU_TEMPERATURE_ABOVE_CRITICAL_RECOVERED\x10\x92\x03\x12\x30\n+EVENT_CPU_TEMPERATURE_ABOVE_FATAL_RECOVERED\x10\x93\x03\x12$\n\x1f\x45VENT_CPU_USAGE_ABOVE_THRESHOLD\x10\x94\x03\x12.\n)EVENT_CPU_USAGE_ABOVE_THRESHOLD_RECOVERED\x10\x95\x03\x12\x1a\n\x15\x45VENT_HW_DEVICE_RESET\x10\xf4\x03\x12/\n*EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL\x10\xf5\x03\x12,\n\'EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL\x10\xf6\x03\x12\x39\n4EVENT_HW_DEVICE_TEMPERATURE_ABOVE_CRITICAL_RECOVERED\x10\xf7\x03\x12\x36\n1EVENT_HW_DEVICE_TEMPERATURE_ABOVE_FATAL_RECOVERED\x10\xf8\x03\x12\x1b\n\x16\x45VENT_HW_DEVICE_REBOOT\x10\xf9\x03\x12\'\n\"EVENT_HW_TEMPERATURE_SENSOR_FAILED\x10\xfa\x03\x12,\n\'EVENT_HW_ALL_TEMPERATURE_SENSORS_FAILED\x10\xfb\x03\x12(\n#EVENT_HW_DISK_USAGE_ABOVE_THRESHOLD\x10\xfc\x03\x12\x32\n-EVENT_HW_DISK_USAGE_ABOVE_THRESHOLD_RECOVERED\x10\xfd\x03\x12*\n%EVENT_HW_MEMORY_USAGE_ABOVE_THRESHOLD\x10\xfe\x03\x12\x34\n/EVENT_HW_MEMORY_USAGE_ABOVE_THRESHOLD_RECOVERED\x10\xff\x03\x12\x1e\n\x19\x45VENT_HW_NTP_SYNC_FAILURE\x10\x80\x04\x12(\n#EVENT_HW_NTP_SYNC_FAILURE_RECOVERED\x10\x81\x04\x12\x1d\n\x18\x45VENT_LINE_CARD_PLUG_OUT\x10\xd8\x04\x12\x1c\n\x17\x45VENT_LINE_CARD_PLUG_IN\x10\xd9\x04\x12(\n#EVENT_COMPONENT_ADMIN_STATE_CHANGED\x10\xbc\x05\x12\'\n\"EVENT_COMPONENT_OPER_STATE_CHANGED\x10\xbd\x05\x12(\n#EVENT_COMPONENT_ALARM_STATE_CHANGED\x10\xbe\x05\x12(\n#EVENT_COMPONENT_USAGE_STATE_CHANGED\x10\xbf\x05\x12*\n%EVENT_COMPONENT_STANDBY_STATE_CHANGED\x10\xc0\x05\x32\xed\x01\n\x1dNativeEventsManagementService\x12\x36\n\nListEvents\x12\x0f.dmi.HardwareID\x1a\x17.dmi.ListEventsResponse\x12^\n\x19UpdateEventsConfiguration\x12\x1f.dmi.EventsConfigurationRequest\x1a .dmi.EventsConfigurationResponse\x12\x34\n\x0cStreamEvents\x12\x16.google.protobuf.Empty\x1a\n.dmi.Event0\x01\x42;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3')
 
 _EVENTIDS = DESCRIPTOR.enum_types_by_name['EventIds']
 EventIds = enum_type_wrapper.EnumTypeWrapper(_EVENTIDS)
@@ -78,6 +78,11 @@
 EVENT_HW_NTP_SYNC_FAILURE_RECOVERED = 513
 EVENT_LINE_CARD_PLUG_OUT = 600
 EVENT_LINE_CARD_PLUG_IN = 601
+EVENT_COMPONENT_ADMIN_STATE_CHANGED = 700
+EVENT_COMPONENT_OPER_STATE_CHANGED = 701
+EVENT_COMPONENT_ALARM_STATE_CHANGED = 702
+EVENT_COMPONENT_USAGE_STATE_CHANGED = 703
+EVENT_COMPONENT_STANDBY_STATE_CHANGED = 704
 
 
 _VALUETYPE = DESCRIPTOR.message_types_by_name['ValueType']
@@ -90,6 +95,12 @@
 _EVENTSCONFIGURATIONREQUEST = DESCRIPTOR.message_types_by_name['EventsConfigurationRequest']
 _EVENTSCONFIGURATIONRESPONSE = DESCRIPTOR.message_types_by_name['EventsConfigurationResponse']
 _EVENTMETADATA = DESCRIPTOR.message_types_by_name['EventMetaData']
+_ADMINSTATECHANGE = DESCRIPTOR.message_types_by_name['AdminStateChange']
+_OPERSTATECHANGE = DESCRIPTOR.message_types_by_name['OperStateChange']
+_ALARMSTATECHANGE = DESCRIPTOR.message_types_by_name['AlarmStateChange']
+_USAGESTATECHANGE = DESCRIPTOR.message_types_by_name['UsageStateChange']
+_STANDBYSTATECHANGE = DESCRIPTOR.message_types_by_name['StandbyStateChange']
+_STATECHANGEINFO = DESCRIPTOR.message_types_by_name['StateChangeInfo']
 _EVENT = DESCRIPTOR.message_types_by_name['Event']
 _LISTEVENTSRESPONSE_REASON = _LISTEVENTSRESPONSE.enum_types_by_name['Reason']
 _EVENTSCONFIGURATIONRESPONSE_REASON = _EVENTSCONFIGURATIONRESPONSE.enum_types_by_name['Reason']
@@ -163,6 +174,48 @@
   })
 _sym_db.RegisterMessage(EventMetaData)
 
+AdminStateChange = _reflection.GeneratedProtocolMessageType('AdminStateChange', (_message.Message,), {
+  'DESCRIPTOR' : _ADMINSTATECHANGE,
+  '__module__' : 'dmi.hw_events_mgmt_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.AdminStateChange)
+  })
+_sym_db.RegisterMessage(AdminStateChange)
+
+OperStateChange = _reflection.GeneratedProtocolMessageType('OperStateChange', (_message.Message,), {
+  'DESCRIPTOR' : _OPERSTATECHANGE,
+  '__module__' : 'dmi.hw_events_mgmt_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.OperStateChange)
+  })
+_sym_db.RegisterMessage(OperStateChange)
+
+AlarmStateChange = _reflection.GeneratedProtocolMessageType('AlarmStateChange', (_message.Message,), {
+  'DESCRIPTOR' : _ALARMSTATECHANGE,
+  '__module__' : 'dmi.hw_events_mgmt_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.AlarmStateChange)
+  })
+_sym_db.RegisterMessage(AlarmStateChange)
+
+UsageStateChange = _reflection.GeneratedProtocolMessageType('UsageStateChange', (_message.Message,), {
+  'DESCRIPTOR' : _USAGESTATECHANGE,
+  '__module__' : 'dmi.hw_events_mgmt_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.UsageStateChange)
+  })
+_sym_db.RegisterMessage(UsageStateChange)
+
+StandbyStateChange = _reflection.GeneratedProtocolMessageType('StandbyStateChange', (_message.Message,), {
+  'DESCRIPTOR' : _STANDBYSTATECHANGE,
+  '__module__' : 'dmi.hw_events_mgmt_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.StandbyStateChange)
+  })
+_sym_db.RegisterMessage(StandbyStateChange)
+
+StateChangeInfo = _reflection.GeneratedProtocolMessageType('StateChangeInfo', (_message.Message,), {
+  'DESCRIPTOR' : _STATECHANGEINFO,
+  '__module__' : 'dmi.hw_events_mgmt_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.StateChangeInfo)
+  })
+_sym_db.RegisterMessage(StateChangeInfo)
+
 Event = _reflection.GeneratedProtocolMessageType('Event', (_message.Message,), {
   'DESCRIPTOR' : _EVENT,
   '__module__' : 'dmi.hw_events_mgmt_service_pb2'
@@ -175,8 +228,8 @@
 
   DESCRIPTOR._options = None
   DESCRIPTOR._serialized_options = b'Z9github.com/opencord/device-management-interface/v3/go/dmi'
-  _EVENTIDS._serialized_start=1667
-  _EVENTIDS._serialized_end=4069
+  _EVENTIDS._serialized_start=2512
+  _EVENTIDS._serialized_end=5125
   _VALUETYPE._serialized_start=136
   _VALUETYPE._serialized_end=253
   _WATERMARKS._serialized_start=255
@@ -201,8 +254,20 @@
   _EVENTSCONFIGURATIONRESPONSE_REASON._serialized_end=1353
   _EVENTMETADATA._serialized_start=1355
   _EVENTMETADATA._serialized_end=1461
-  _EVENT._serialized_start=1464
-  _EVENT._serialized_end=1664
-  _NATIVEEVENTSMANAGEMENTSERVICE._serialized_start=4072
-  _NATIVEEVENTSMANAGEMENTSERVICE._serialized_end=4309
+  _ADMINSTATECHANGE._serialized_start=1463
+  _ADMINSTATECHANGE._serialized_end=1559
+  _OPERSTATECHANGE._serialized_start=1561
+  _OPERSTATECHANGE._serialized_end=1654
+  _ALARMSTATECHANGE._serialized_start=1656
+  _ALARMSTATECHANGE._serialized_end=1752
+  _USAGESTATECHANGE._serialized_start=1754
+  _USAGESTATECHANGE._serialized_end=1850
+  _STANDBYSTATECHANGE._serialized_start=1852
+  _STANDBYSTATECHANGE._serialized_end=1954
+  _STATECHANGEINFO._serialized_start=1957
+  _STATECHANGEINFO._serialized_end=2257
+  _EVENT._serialized_start=2260
+  _EVENT._serialized_end=2509
+  _NATIVEEVENTSMANAGEMENTSERVICE._serialized_start=5128
+  _NATIVEEVENTSMANAGEMENTSERVICE._serialized_end=5365
 # @@protoc_insertion_point(module_scope)
diff --git a/python/dmi/hw_management_service_pb2.py b/python/dmi/hw_management_service_pb2.py
index 4cc9076..c397447 100644
--- a/python/dmi/hw_management_service_pb2.py
+++ b/python/dmi/hw_management_service_pb2.py
@@ -17,7 +17,7 @@
 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1f\x64mi/hw_management_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1bgoogle/protobuf/empty.proto\":\n\x18PhysicalInventoryRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"\x88\x02\n\x19PhysicalInventoryResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.PhysicalInventoryResponse.Reason\x12 \n\tinventory\x18\x03 \x01(\x0b\x32\r.dmi.Hardware\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"v\n\x19HWComponentInfoGetRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\xa2\x02\n\x1aHWComponentInfoGetResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.HWComponentInfoGetResponse.Reason\x12!\n\tcomponent\x18\x03 \x01(\x0b\x32\x0e.dmi.Component\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"u\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"\xa1\x01\n\x19HWComponentInfoSetRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\x12)\n\x07\x63hanges\x18\x04 \x01(\x0b\x32\x18.dmi.ModifiableComponent\"\xa9\x02\n\x1aHWComponentInfoSetResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.HWComponentInfoSetResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\x9e\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINVALID_PARAMS\x10\x03\x12\x12\n\x0eINTERNAL_ERROR\x10\x04\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x05\x12\x13\n\x0fSET_UNSUPPORTED\x10\x06\"\xe7\x02\n\x1bStartManagingDeviceResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x37\n\x06reason\x18\x02 \x01(\x0e\x32\'.dmi.StartManagingDeviceResponse.Reason\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x03 \x01(\x0b\x32\t.dmi.Uuid\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"\xba\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x1a\n\x16\x44\x45VICE_ALREADY_MANAGED\x10\x01\x12!\n\x1dOPERATION_ALREADY_IN_PROGRESS\x10\x02\x12\x12\n\x0eINVALID_PARAMS\x10\x03\x12\x12\n\x0eINTERNAL_ERROR\x10\x04\x12\x1a\n\x16\x41UTHENTICATION_FAILURE\x10\x05\x12\x17\n\x13INCOMPATIBLE_DEVICE\x10\x06\")\n\x19StopManagingDeviceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xd4\x01\n\x1aStopManagingDeviceResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.StopManagingDeviceResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"J\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x02\"[\n\x11ManagedDeviceInfo\x12&\n\x04info\x18\x01 \x01(\x0b\x32\x18.dmi.ModifiableComponent\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\"\xc6\x01\n\x16ManagedDevicesResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x32\n\x06reason\x18\x02 \x01(\x0e\x32\".dmi.ManagedDevicesResponse.Reason\x12\'\n\x07\x64\x65vices\x18\x03 \x03(\x0b\x32\x16.dmi.ManagedDeviceInfo\"2\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\"o\n\x19SetLoggingEndpointRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x18\n\x10logging_endpoint\x18\x02 \x01(\t\x12\x18\n\x10logging_protocol\x18\x03 \x01(\t\"\xc3\x02\n\x19SetRemoteEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.SetRemoteEndpointResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\xba\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x1a\n\x16LOGGING_ENDPOINT_ERROR\x10\x03\x12#\n\x1fLOGGING_ENDPOINT_PROTOCOL_ERROR\x10\x04\x12\x19\n\x15MSGBUS_ENDPOINT_ERROR\x10\x05\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x06\"\x9c\x02\n\x1aGetLoggingEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.GetLoggingEndpointResponse.Reason\x12\x18\n\x10logging_endpoint\x18\x03 \x01(\t\x12\x18\n\x10logging_protocol\x18\x04 \x01(\t\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"3\n\x18SetMsgBusEndpointRequest\x12\x17\n\x0fmsgbus_endpoint\x18\x01 \x01(\t\"\xeb\x01\n\x19GetMsgBusEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.GetMsgBusEndpointResponse.Reason\x12\x17\n\x0fmsgbus_endpoint\x18\x03 \x01(\t\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"J\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x02\"E\n\x10\x45ntitiesLogLevel\x12\x1f\n\x08logLevel\x18\x01 \x01(\x0e\x32\r.dmi.LogLevel\x12\x10\n\x08\x65ntities\x18\x02 \x03(\t\"^\n\x12SetLogLevelRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12(\n\tloglevels\x18\x02 \x03(\x0b\x32\x15.dmi.EntitiesLogLevel\"\x92\x02\n\x13SetLogLevelResponse\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x03 \x01(\x0e\x32\x1f.dmi.SetLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"v\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12UNKNOWN_LOG_ENTITY\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"F\n\x12GetLogLevelRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x10\n\x08\x65ntities\x18\x02 \x03(\t\"\xbc\x02\n\x13GetLogLevelResponse\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12(\n\tlogLevels\x18\x02 \x03(\x0b\x32\x15.dmi.EntitiesLogLevel\x12\x1b\n\x06status\x18\x03 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x04 \x01(\x0e\x32\x1f.dmi.GetLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"v\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12UNKNOWN_LOG_ENTITY\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"<\n\x1aGetLoggableEntitiesRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"4\n\x14SetDmLogLevelRequest\x12\x1c\n\x05level\x18\x01 \x01(\x0e\x32\r.dmi.LogLevel\"\xc9\x01\n\x15SetDmLogLevelResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x31\n\x06reason\x18\x02 \x01(\x0e\x32!.dmi.SetDmLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"I\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\x12\x15\n\x11UNKNOWN_LOG_LEVEL\x10\x02\"\x16\n\x14GetDmLogLevelRequest\"\xd0\x01\n\x15GetDmLogLevelResponse\x12\x1c\n\x05level\x18\x01 \x01(\x0e\x32\r.dmi.LogLevel\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.dmi.Status\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.dmi.GetDmLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"2\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\"(\n\tHeartbeat\x12\x1b\n\x13heartbeat_signature\x18\x01 \x01(\x07\"5\n\x13RebootDeviceRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"\xf7\x01\n\x14RebootDeviceResponse\x12\x1b\n\x06status\x18\x03 \x01(\x0e\x32\x0b.dmi.Status\x12\x30\n\x06reason\x18\x04 \x01(\x0e\x32 .dmi.RebootDeviceResponse.Reason\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"y\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\x12\x19\n\x15\x44\x45VICE_IN_WRONG_STATE\x10\x04\x32\xbe\n\n\x19NativeHWManagementService\x12S\n\x13StartManagingDevice\x12\x18.dmi.ModifiableComponent\x1a .dmi.StartManagingDeviceResponse0\x01\x12U\n\x12StopManagingDevice\x12\x1e.dmi.StopManagingDeviceRequest\x1a\x1f.dmi.StopManagingDeviceResponse\x12H\n\x11GetManagedDevices\x12\x16.google.protobuf.Empty\x1a\x1b.dmi.ManagedDevicesResponse\x12W\n\x14GetPhysicalInventory\x12\x1d.dmi.PhysicalInventoryRequest\x1a\x1e.dmi.PhysicalInventoryResponse0\x01\x12W\n\x12GetHWComponentInfo\x12\x1e.dmi.HWComponentInfoGetRequest\x1a\x1f.dmi.HWComponentInfoGetResponse0\x01\x12U\n\x12SetHWComponentInfo\x12\x1e.dmi.HWComponentInfoSetRequest\x1a\x1f.dmi.HWComponentInfoSetResponse\x12T\n\x12SetLoggingEndpoint\x12\x1e.dmi.SetLoggingEndpointRequest\x1a\x1e.dmi.SetRemoteEndpointResponse\x12\x46\n\x12GetLoggingEndpoint\x12\x0f.dmi.HardwareID\x1a\x1f.dmi.GetLoggingEndpointResponse\x12R\n\x11SetMsgBusEndpoint\x12\x1d.dmi.SetMsgBusEndpointRequest\x1a\x1e.dmi.SetRemoteEndpointResponse\x12K\n\x11GetMsgBusEndpoint\x12\x16.google.protobuf.Empty\x1a\x1e.dmi.GetMsgBusEndpointResponse\x12P\n\x13GetLoggableEntities\x12\x1f.dmi.GetLoggableEntitiesRequest\x1a\x18.dmi.GetLogLevelResponse\x12@\n\x0bSetLogLevel\x12\x17.dmi.SetLogLevelRequest\x1a\x18.dmi.SetLogLevelResponse\x12@\n\x0bGetLogLevel\x12\x17.dmi.GetLogLevelRequest\x1a\x18.dmi.GetLogLevelResponse\x12\x38\n\x0eHeartbeatCheck\x12\x16.google.protobuf.Empty\x1a\x0e.dmi.Heartbeat\x12\x43\n\x0cRebootDevice\x12\x18.dmi.RebootDeviceRequest\x1a\x19.dmi.RebootDeviceResponse\x12\x46\n\rSetDmLogLevel\x12\x19.dmi.SetDmLogLevelRequest\x1a\x1a.dmi.SetDmLogLevelResponse\x12\x46\n\rGetDmLogLevel\x12\x19.dmi.GetDmLogLevelRequest\x1a\x1a.dmi.GetDmLogLevelResponseB;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1f\x64mi/hw_management_service.proto\x12\x03\x64mi\x1a\x11\x64mi/commons.proto\x1a\x0c\x64mi/hw.proto\x1a\x1bgoogle/protobuf/empty.proto\":\n\x18PhysicalInventoryRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"\x88\x02\n\x19PhysicalInventoryResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.PhysicalInventoryResponse.Reason\x12 \n\tinventory\x18\x03 \x01(\x0b\x32\r.dmi.Hardware\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"v\n\x19HWComponentInfoGetRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\xa2\x02\n\x1aHWComponentInfoGetResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.HWComponentInfoGetResponse.Reason\x12!\n\tcomponent\x18\x03 \x01(\x0b\x32\x0e.dmi.Component\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"u\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"\xa1\x01\n\x19HWComponentInfoSetRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\x12)\n\x07\x63hanges\x18\x04 \x01(\x0b\x32\x18.dmi.ModifiableComponent\"\xa9\x02\n\x1aHWComponentInfoSetResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.HWComponentInfoSetResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\x9e\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINVALID_PARAMS\x10\x03\x12\x12\n\x0eINTERNAL_ERROR\x10\x04\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x05\x12\x13\n\x0fSET_UNSUPPORTED\x10\x06\"\xe7\x02\n\x1bStartManagingDeviceResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x37\n\x06reason\x18\x02 \x01(\x0e\x32\'.dmi.StartManagingDeviceResponse.Reason\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x03 \x01(\x0b\x32\t.dmi.Uuid\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"\xba\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x1a\n\x16\x44\x45VICE_ALREADY_MANAGED\x10\x01\x12!\n\x1dOPERATION_ALREADY_IN_PROGRESS\x10\x02\x12\x12\n\x0eINVALID_PARAMS\x10\x03\x12\x12\n\x0eINTERNAL_ERROR\x10\x04\x12\x1a\n\x16\x41UTHENTICATION_FAILURE\x10\x05\x12\x17\n\x13INCOMPATIBLE_DEVICE\x10\x06\")\n\x19StopManagingDeviceRequest\x12\x0c\n\x04name\x18\x01 \x01(\t\"\xd4\x01\n\x1aStopManagingDeviceResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.StopManagingDeviceResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"J\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x02\"[\n\x11ManagedDeviceInfo\x12&\n\x04info\x18\x01 \x01(\x0b\x32\x18.dmi.ModifiableComponent\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\"\xc6\x01\n\x16ManagedDevicesResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x32\n\x06reason\x18\x02 \x01(\x0e\x32\".dmi.ManagedDevicesResponse.Reason\x12\'\n\x07\x64\x65vices\x18\x03 \x03(\x0b\x32\x16.dmi.ManagedDeviceInfo\"2\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\"o\n\x19SetLoggingEndpointRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x18\n\x10logging_endpoint\x18\x02 \x01(\t\x12\x18\n\x10logging_protocol\x18\x03 \x01(\t\"\xc3\x02\n\x19SetRemoteEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.SetRemoteEndpointResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\xba\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x1a\n\x16LOGGING_ENDPOINT_ERROR\x10\x03\x12#\n\x1fLOGGING_ENDPOINT_PROTOCOL_ERROR\x10\x04\x12\x19\n\x15MSGBUS_ENDPOINT_ERROR\x10\x05\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x06\"\x9c\x02\n\x1aGetLoggingEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.GetLoggingEndpointResponse.Reason\x12\x18\n\x10logging_endpoint\x18\x03 \x01(\t\x12\x18\n\x10logging_protocol\x18\x04 \x01(\t\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"^\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\"3\n\x18SetMsgBusEndpointRequest\x12\x17\n\x0fmsgbus_endpoint\x18\x01 \x01(\t\"\xeb\x01\n\x19GetMsgBusEndpointResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.GetMsgBusEndpointResponse.Reason\x12\x17\n\x0fmsgbus_endpoint\x18\x03 \x01(\t\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"J\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x02\"E\n\x10\x45ntitiesLogLevel\x12\x1f\n\x08logLevel\x18\x01 \x01(\x0e\x32\r.dmi.LogLevel\x12\x10\n\x08\x65ntities\x18\x02 \x03(\t\"^\n\x12SetLogLevelRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12(\n\tloglevels\x18\x02 \x03(\x0b\x32\x15.dmi.EntitiesLogLevel\"\x92\x02\n\x13SetLogLevelResponse\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x03 \x01(\x0e\x32\x1f.dmi.SetLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"v\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12UNKNOWN_LOG_ENTITY\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"F\n\x12GetLogLevelRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12\x10\n\x08\x65ntities\x18\x02 \x03(\t\"\xbc\x02\n\x13GetLogLevelResponse\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12(\n\tlogLevels\x18\x02 \x03(\x0b\x32\x15.dmi.EntitiesLogLevel\x12\x1b\n\x06status\x18\x03 \x01(\x0e\x32\x0b.dmi.Status\x12/\n\x06reason\x18\x04 \x01(\x0e\x32\x1f.dmi.GetLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"v\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12UNKNOWN_LOG_ENTITY\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\"<\n\x1aGetLoggableEntitiesRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"4\n\x14SetDmLogLevelRequest\x12\x1c\n\x05level\x18\x01 \x01(\x0e\x32\r.dmi.LogLevel\"\xc9\x01\n\x15SetDmLogLevelResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x31\n\x06reason\x18\x02 \x01(\x0e\x32!.dmi.SetDmLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"I\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\x12\x15\n\x11UNKNOWN_LOG_LEVEL\x10\x02\"\x16\n\x14GetDmLogLevelRequest\"\xd0\x01\n\x15GetDmLogLevelResponse\x12\x1c\n\x05level\x18\x01 \x01(\x0e\x32\r.dmi.LogLevel\x12\x1b\n\x06status\x18\x02 \x01(\x0e\x32\x0b.dmi.Status\x12\x31\n\x06reason\x18\x03 \x01(\x0e\x32!.dmi.GetDmLogLevelResponse.Reason\x12\x15\n\rreason_detail\x18\x04 \x01(\t\"2\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eINTERNAL_ERROR\x10\x01\"(\n\tHeartbeat\x12\x1b\n\x13heartbeat_signature\x18\x01 \x01(\x07\"5\n\x13RebootDeviceRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"\xf7\x01\n\x14RebootDeviceResponse\x12\x1b\n\x06status\x18\x03 \x01(\x0e\x32\x0b.dmi.Status\x12\x30\n\x06reason\x18\x04 \x01(\x0e\x32 .dmi.RebootDeviceResponse.Reason\x12\x15\n\rreason_detail\x18\x05 \x01(\t\"y\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x12\n\x0eINTERNAL_ERROR\x10\x02\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x03\x12\x19\n\x15\x44\x45VICE_IN_WRONG_STATE\x10\x04\"v\n\x19\x44isableHWComponentRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\xad\x02\n\x1a\x44isableHWComponentResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x36\n\x06reason\x18\x02 \x01(\x0e\x32&.dmi.DisableHWComponentResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\xa2\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\x12\x17\n\x13\x44ISABLE_UNSUPPORTED\x10\x05\x12\x12\n\x0eINVALID_PARAMS\x10\x06\"t\n\x17ResetHWComponentRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\xa7\x02\n\x18ResetHWComponentResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x34\n\x06reason\x18\x02 \x01(\x0e\x32$.dmi.ResetHWComponentResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\xa0\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\x12\x15\n\x11RESET_UNSUPPORTED\x10\x05\x12\x12\n\x0eINVALID_PARAMS\x10\x06\"u\n\x18\x45nableHWComponentRequest\x12\x1e\n\x0b\x64\x65vice_uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\x12!\n\x0e\x63omponent_uuid\x18\x02 \x01(\x0b\x32\t.dmi.Uuid\x12\x16\n\x0e\x63omponent_name\x18\x03 \x01(\t\"\xaa\x02\n\x19\x45nableHWComponentResponse\x12\x1b\n\x06status\x18\x01 \x01(\x0e\x32\x0b.dmi.Status\x12\x35\n\x06reason\x18\x02 \x01(\x0e\x32%.dmi.EnableHWComponentResponse.Reason\x12\x15\n\rreason_detail\x18\x03 \x01(\t\"\xa1\x01\n\x06Reason\x12\x14\n\x10UNDEFINED_REASON\x10\x00\x12\x12\n\x0eUNKNOWN_DEVICE\x10\x01\x12\x15\n\x11UNKNOWN_COMPONENT\x10\x02\x12\x12\n\x0eINTERNAL_ERROR\x10\x03\x12\x16\n\x12\x44\x45VICE_UNREACHABLE\x10\x04\x12\x16\n\x12\x45NABLE_UNSUPPORTED\x10\x05\x12\x12\n\x0eINVALID_PARAMS\x10\x06\x32\xba\x0c\n\x19NativeHWManagementService\x12S\n\x13StartManagingDevice\x12\x18.dmi.ModifiableComponent\x1a .dmi.StartManagingDeviceResponse0\x01\x12U\n\x12StopManagingDevice\x12\x1e.dmi.StopManagingDeviceRequest\x1a\x1f.dmi.StopManagingDeviceResponse\x12H\n\x11GetManagedDevices\x12\x16.google.protobuf.Empty\x1a\x1b.dmi.ManagedDevicesResponse\x12W\n\x14GetPhysicalInventory\x12\x1d.dmi.PhysicalInventoryRequest\x1a\x1e.dmi.PhysicalInventoryResponse0\x01\x12W\n\x12GetHWComponentInfo\x12\x1e.dmi.HWComponentInfoGetRequest\x1a\x1f.dmi.HWComponentInfoGetResponse0\x01\x12U\n\x12SetHWComponentInfo\x12\x1e.dmi.HWComponentInfoSetRequest\x1a\x1f.dmi.HWComponentInfoSetResponse\x12T\n\x12SetLoggingEndpoint\x12\x1e.dmi.SetLoggingEndpointRequest\x1a\x1e.dmi.SetRemoteEndpointResponse\x12\x46\n\x12GetLoggingEndpoint\x12\x0f.dmi.HardwareID\x1a\x1f.dmi.GetLoggingEndpointResponse\x12R\n\x11SetMsgBusEndpoint\x12\x1d.dmi.SetMsgBusEndpointRequest\x1a\x1e.dmi.SetRemoteEndpointResponse\x12K\n\x11GetMsgBusEndpoint\x12\x16.google.protobuf.Empty\x1a\x1e.dmi.GetMsgBusEndpointResponse\x12P\n\x13GetLoggableEntities\x12\x1f.dmi.GetLoggableEntitiesRequest\x1a\x18.dmi.GetLogLevelResponse\x12@\n\x0bSetLogLevel\x12\x17.dmi.SetLogLevelRequest\x1a\x18.dmi.SetLogLevelResponse\x12@\n\x0bGetLogLevel\x12\x17.dmi.GetLogLevelRequest\x1a\x18.dmi.GetLogLevelResponse\x12\x38\n\x0eHeartbeatCheck\x12\x16.google.protobuf.Empty\x1a\x0e.dmi.Heartbeat\x12\x43\n\x0cRebootDevice\x12\x18.dmi.RebootDeviceRequest\x1a\x19.dmi.RebootDeviceResponse\x12\x46\n\rSetDmLogLevel\x12\x19.dmi.SetDmLogLevelRequest\x1a\x1a.dmi.SetDmLogLevelResponse\x12\x46\n\rGetDmLogLevel\x12\x19.dmi.GetDmLogLevelRequest\x1a\x1a.dmi.GetDmLogLevelResponse\x12U\n\x12\x44isableHWComponent\x12\x1e.dmi.DisableHWComponentRequest\x1a\x1f.dmi.DisableHWComponentResponse\x12O\n\x10ResetHWComponent\x12\x1c.dmi.ResetHWComponentRequest\x1a\x1d.dmi.ResetHWComponentResponse\x12R\n\x11\x45nableHWComponent\x12\x1d.dmi.EnableHWComponentRequest\x1a\x1e.dmi.EnableHWComponentResponseB;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3')
 
 
 
@@ -50,6 +50,12 @@
 _HEARTBEAT = DESCRIPTOR.message_types_by_name['Heartbeat']
 _REBOOTDEVICEREQUEST = DESCRIPTOR.message_types_by_name['RebootDeviceRequest']
 _REBOOTDEVICERESPONSE = DESCRIPTOR.message_types_by_name['RebootDeviceResponse']
+_DISABLEHWCOMPONENTREQUEST = DESCRIPTOR.message_types_by_name['DisableHWComponentRequest']
+_DISABLEHWCOMPONENTRESPONSE = DESCRIPTOR.message_types_by_name['DisableHWComponentResponse']
+_RESETHWCOMPONENTREQUEST = DESCRIPTOR.message_types_by_name['ResetHWComponentRequest']
+_RESETHWCOMPONENTRESPONSE = DESCRIPTOR.message_types_by_name['ResetHWComponentResponse']
+_ENABLEHWCOMPONENTREQUEST = DESCRIPTOR.message_types_by_name['EnableHWComponentRequest']
+_ENABLEHWCOMPONENTRESPONSE = DESCRIPTOR.message_types_by_name['EnableHWComponentResponse']
 _PHYSICALINVENTORYRESPONSE_REASON = _PHYSICALINVENTORYRESPONSE.enum_types_by_name['Reason']
 _HWCOMPONENTINFOGETRESPONSE_REASON = _HWCOMPONENTINFOGETRESPONSE.enum_types_by_name['Reason']
 _HWCOMPONENTINFOSETRESPONSE_REASON = _HWCOMPONENTINFOSETRESPONSE.enum_types_by_name['Reason']
@@ -64,6 +70,9 @@
 _SETDMLOGLEVELRESPONSE_REASON = _SETDMLOGLEVELRESPONSE.enum_types_by_name['Reason']
 _GETDMLOGLEVELRESPONSE_REASON = _GETDMLOGLEVELRESPONSE.enum_types_by_name['Reason']
 _REBOOTDEVICERESPONSE_REASON = _REBOOTDEVICERESPONSE.enum_types_by_name['Reason']
+_DISABLEHWCOMPONENTRESPONSE_REASON = _DISABLEHWCOMPONENTRESPONSE.enum_types_by_name['Reason']
+_RESETHWCOMPONENTRESPONSE_REASON = _RESETHWCOMPONENTRESPONSE.enum_types_by_name['Reason']
+_ENABLEHWCOMPONENTRESPONSE_REASON = _ENABLEHWCOMPONENTRESPONSE.enum_types_by_name['Reason']
 PhysicalInventoryRequest = _reflection.GeneratedProtocolMessageType('PhysicalInventoryRequest', (_message.Message,), {
   'DESCRIPTOR' : _PHYSICALINVENTORYREQUEST,
   '__module__' : 'dmi.hw_management_service_pb2'
@@ -267,6 +276,48 @@
   })
 _sym_db.RegisterMessage(RebootDeviceResponse)
 
+DisableHWComponentRequest = _reflection.GeneratedProtocolMessageType('DisableHWComponentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _DISABLEHWCOMPONENTREQUEST,
+  '__module__' : 'dmi.hw_management_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.DisableHWComponentRequest)
+  })
+_sym_db.RegisterMessage(DisableHWComponentRequest)
+
+DisableHWComponentResponse = _reflection.GeneratedProtocolMessageType('DisableHWComponentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _DISABLEHWCOMPONENTRESPONSE,
+  '__module__' : 'dmi.hw_management_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.DisableHWComponentResponse)
+  })
+_sym_db.RegisterMessage(DisableHWComponentResponse)
+
+ResetHWComponentRequest = _reflection.GeneratedProtocolMessageType('ResetHWComponentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _RESETHWCOMPONENTREQUEST,
+  '__module__' : 'dmi.hw_management_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.ResetHWComponentRequest)
+  })
+_sym_db.RegisterMessage(ResetHWComponentRequest)
+
+ResetHWComponentResponse = _reflection.GeneratedProtocolMessageType('ResetHWComponentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _RESETHWCOMPONENTRESPONSE,
+  '__module__' : 'dmi.hw_management_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.ResetHWComponentResponse)
+  })
+_sym_db.RegisterMessage(ResetHWComponentResponse)
+
+EnableHWComponentRequest = _reflection.GeneratedProtocolMessageType('EnableHWComponentRequest', (_message.Message,), {
+  'DESCRIPTOR' : _ENABLEHWCOMPONENTREQUEST,
+  '__module__' : 'dmi.hw_management_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.EnableHWComponentRequest)
+  })
+_sym_db.RegisterMessage(EnableHWComponentRequest)
+
+EnableHWComponentResponse = _reflection.GeneratedProtocolMessageType('EnableHWComponentResponse', (_message.Message,), {
+  'DESCRIPTOR' : _ENABLEHWCOMPONENTRESPONSE,
+  '__module__' : 'dmi.hw_management_service_pb2'
+  # @@protoc_insertion_point(class_scope:dmi.EnableHWComponentResponse)
+  })
+_sym_db.RegisterMessage(EnableHWComponentResponse)
+
 _NATIVEHWMANAGEMENTSERVICE = DESCRIPTOR.services_by_name['NativeHWManagementService']
 if _descriptor._USE_C_DESCRIPTORS == False:
 
@@ -358,6 +409,24 @@
   _REBOOTDEVICERESPONSE._serialized_end=4972
   _REBOOTDEVICERESPONSE_REASON._serialized_start=4851
   _REBOOTDEVICERESPONSE_REASON._serialized_end=4972
-  _NATIVEHWMANAGEMENTSERVICE._serialized_start=4975
-  _NATIVEHWMANAGEMENTSERVICE._serialized_end=6317
+  _DISABLEHWCOMPONENTREQUEST._serialized_start=4974
+  _DISABLEHWCOMPONENTREQUEST._serialized_end=5092
+  _DISABLEHWCOMPONENTRESPONSE._serialized_start=5095
+  _DISABLEHWCOMPONENTRESPONSE._serialized_end=5396
+  _DISABLEHWCOMPONENTRESPONSE_REASON._serialized_start=5234
+  _DISABLEHWCOMPONENTRESPONSE_REASON._serialized_end=5396
+  _RESETHWCOMPONENTREQUEST._serialized_start=5398
+  _RESETHWCOMPONENTREQUEST._serialized_end=5514
+  _RESETHWCOMPONENTRESPONSE._serialized_start=5517
+  _RESETHWCOMPONENTRESPONSE._serialized_end=5812
+  _RESETHWCOMPONENTRESPONSE_REASON._serialized_start=5652
+  _RESETHWCOMPONENTRESPONSE_REASON._serialized_end=5812
+  _ENABLEHWCOMPONENTREQUEST._serialized_start=5814
+  _ENABLEHWCOMPONENTREQUEST._serialized_end=5931
+  _ENABLEHWCOMPONENTRESPONSE._serialized_start=5934
+  _ENABLEHWCOMPONENTRESPONSE._serialized_end=6232
+  _ENABLEHWCOMPONENTRESPONSE_REASON._serialized_start=6071
+  _ENABLEHWCOMPONENTRESPONSE_REASON._serialized_end=6232
+  _NATIVEHWMANAGEMENTSERVICE._serialized_start=6235
+  _NATIVEHWMANAGEMENTSERVICE._serialized_end=7829
 # @@protoc_insertion_point(module_scope)
diff --git a/python/dmi/hw_management_service_pb2_grpc.py b/python/dmi/hw_management_service_pb2_grpc.py
index 574490a..035987b 100644
--- a/python/dmi/hw_management_service_pb2_grpc.py
+++ b/python/dmi/hw_management_service_pb2_grpc.py
@@ -101,6 +101,21 @@
                 request_serializer=dmi_dot_hw__management__service__pb2.GetDmLogLevelRequest.SerializeToString,
                 response_deserializer=dmi_dot_hw__management__service__pb2.GetDmLogLevelResponse.FromString,
                 )
+        self.DisableHWComponent = channel.unary_unary(
+                '/dmi.NativeHWManagementService/DisableHWComponent',
+                request_serializer=dmi_dot_hw__management__service__pb2.DisableHWComponentRequest.SerializeToString,
+                response_deserializer=dmi_dot_hw__management__service__pb2.DisableHWComponentResponse.FromString,
+                )
+        self.ResetHWComponent = channel.unary_unary(
+                '/dmi.NativeHWManagementService/ResetHWComponent',
+                request_serializer=dmi_dot_hw__management__service__pb2.ResetHWComponentRequest.SerializeToString,
+                response_deserializer=dmi_dot_hw__management__service__pb2.ResetHWComponentResponse.FromString,
+                )
+        self.EnableHWComponent = channel.unary_unary(
+                '/dmi.NativeHWManagementService/EnableHWComponent',
+                request_serializer=dmi_dot_hw__management__service__pb2.EnableHWComponentRequest.SerializeToString,
+                response_deserializer=dmi_dot_hw__management__service__pb2.EnableHWComponentResponse.FromString,
+                )
 
 
 class NativeHWManagementServiceServicer(object):
@@ -240,6 +255,27 @@
         context.set_details('Method not implemented!')
         raise NotImplementedError('Method not implemented!')
 
+    def DisableHWComponent(self, request, context):
+        """Disables a hardware component on a device.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ResetHWComponent(self, request, context):
+        """Resets a hardware component on a device.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def EnableHWComponent(self, request, context):
+        """Enables a hardware component on a device.
+        """
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
 
 def add_NativeHWManagementServiceServicer_to_server(servicer, server):
     rpc_method_handlers = {
@@ -328,6 +364,21 @@
                     request_deserializer=dmi_dot_hw__management__service__pb2.GetDmLogLevelRequest.FromString,
                     response_serializer=dmi_dot_hw__management__service__pb2.GetDmLogLevelResponse.SerializeToString,
             ),
+            'DisableHWComponent': grpc.unary_unary_rpc_method_handler(
+                    servicer.DisableHWComponent,
+                    request_deserializer=dmi_dot_hw__management__service__pb2.DisableHWComponentRequest.FromString,
+                    response_serializer=dmi_dot_hw__management__service__pb2.DisableHWComponentResponse.SerializeToString,
+            ),
+            'ResetHWComponent': grpc.unary_unary_rpc_method_handler(
+                    servicer.ResetHWComponent,
+                    request_deserializer=dmi_dot_hw__management__service__pb2.ResetHWComponentRequest.FromString,
+                    response_serializer=dmi_dot_hw__management__service__pb2.ResetHWComponentResponse.SerializeToString,
+            ),
+            'EnableHWComponent': grpc.unary_unary_rpc_method_handler(
+                    servicer.EnableHWComponent,
+                    request_deserializer=dmi_dot_hw__management__service__pb2.EnableHWComponentRequest.FromString,
+                    response_serializer=dmi_dot_hw__management__service__pb2.EnableHWComponentResponse.SerializeToString,
+            ),
     }
     generic_handler = grpc.method_handlers_generic_handler(
             'dmi.NativeHWManagementService', rpc_method_handlers)
@@ -626,3 +677,54 @@
             dmi_dot_hw__management__service__pb2.GetDmLogLevelResponse.FromString,
             options, channel_credentials,
             insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def DisableHWComponent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/dmi.NativeHWManagementService/DisableHWComponent',
+            dmi_dot_hw__management__service__pb2.DisableHWComponentRequest.SerializeToString,
+            dmi_dot_hw__management__service__pb2.DisableHWComponentResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ResetHWComponent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/dmi.NativeHWManagementService/ResetHWComponent',
+            dmi_dot_hw__management__service__pb2.ResetHWComponentRequest.SerializeToString,
+            dmi_dot_hw__management__service__pb2.ResetHWComponentResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def EnableHWComponent(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/dmi.NativeHWManagementService/EnableHWComponent',
+            dmi_dot_hw__management__service__pb2.EnableHWComponentRequest.SerializeToString,
+            dmi_dot_hw__management__service__pb2.EnableHWComponentResponse.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/python/dmi/hw_pb2.py b/python/dmi/hw_pb2.py
index 981361d..52dfc5b 100644
--- a/python/dmi/hw_pb2.py
+++ b/python/dmi/hw_pb2.py
@@ -16,7 +16,7 @@
 from google.protobuf import timestamp_pb2 as google_dot_protobuf_dot_timestamp__pb2
 
 
-DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x64mi/hw.proto\x12\x03\x64mi\x1a\x1fgoogle/protobuf/timestamp.proto\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"%\n\nHardwareID\x12\x17\n\x04uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"\x12\n\x03Uri\x12\x0b\n\x03uri\x18\x01 \x01(\t\"\xb5\x02\n\x0e\x43omponentState\x12\x36\n\x12state_last_changed\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12-\n\x0b\x61\x64min_state\x18\x02 \x01(\x0e\x32\x18.dmi.ComponentAdminState\x12+\n\noper_state\x18\x03 \x01(\x0e\x32\x17.dmi.ComponentOperState\x12-\n\x0busage_state\x18\x04 \x01(\x0e\x32\x18.dmi.ComponentUsageState\x12-\n\x0b\x61larm_state\x18\x05 \x01(\x0e\x32\x18.dmi.ComponentAlarmState\x12\x31\n\rstandby_state\x18\x06 \x01(\x0e\x32\x1a.dmi.ComponentStandbyState\"\x90\x02\n\x13\x43omponentSensorData\x12\r\n\x05value\x18\x01 \x01(\x05\x12 \n\x04type\x18\x02 \x01(\x0e\x32\x12.dmi.DataValueType\x12\x1e\n\x05scale\x18\x03 \x01(\x0e\x32\x0f.dmi.ValueScale\x12\x11\n\tprecision\x18\x04 \x01(\x05\x12!\n\x06status\x18\x05 \x01(\x0e\x32\x11.dmi.SensorStatus\x12\x15\n\runits_display\x18\x06 \x01(\t\x12-\n\ttimestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x19\n\x11value_update_rate\x18\x08 \x01(\r\x12\x11\n\tdata_type\x18\t \x01(\t\"\x85\x06\n\x17PortComponentAttributes\x12\x42\n\x0e\x63onnector_type\x18\x01 \x01(\x0e\x32*.dmi.PortComponentAttributes.ConnectorType\x12\x31\n\x05speed\x18\x02 \x01(\x0e\x32\".dmi.PortComponentAttributes.Speed\x12\x37\n\x08protocol\x18\x03 \x01(\x0e\x32%.dmi.PortComponentAttributes.Protocol\x12\x16\n\x0ephysical_label\x18\x04 \x01(\t\x12\x15\n\rmapping_label\x18\x05 \x01(\t\x12\'\n\rpon_id_config\x18\x06 \x01(\x0b\x32\x10.dmi.PonIdConfig\x12\x1d\n\x15speed_autonegotiation\x18\x07 \x01(\x08\x12\"\n\x08\x64istance\x18\x08 \x01(\x0b\x32\x10.dmi.PonDistance\"p\n\rConnectorType\x12\x1c\n\x18\x43ONNECTOR_TYPE_UNDEFINED\x10\x00\x12\x08\n\x04RJ45\x10\x01\x12\x0c\n\x08\x46IBER_LC\x10\x02\x12\x0f\n\x0b\x46IBER_SC_PC\x10\x03\x12\r\n\tFIBER_MPO\x10\x04\x12\t\n\x05RS232\x10\x05\"\xae\x01\n\x05Speed\x12\x13\n\x0fSPEED_UNDEFINED\x10\x00\x12\x0b\n\x07\x44YNAMIC\x10\x01\x12\r\n\tGIGABIT_1\x10\x02\x12\x0e\n\nGIGABIT_10\x10\x03\x12\x0e\n\nGIGABIT_25\x10\x04\x12\x0e\n\nGIGABIT_40\x10\x05\x12\x0f\n\x0bGIGABIT_100\x10\x06\x12\x0f\n\x0bGIGABIT_400\x10\x07\x12\x10\n\x0cMEGABIT_2500\x10\x08\x12\x10\n\x0cMEGABIT_1250\x10\t\"|\n\x08Protocol\x12\x16\n\x12PROTOCOL_UNDEFINED\x10\x00\x12\x0c\n\x08\x45THERNET\x10\x01\x12\x08\n\x04GPON\x10\x02\x12\t\n\x05XGPON\x10\x03\x12\n\n\x06XGSPON\x10\x04\x12\t\n\x05GFAST\x10\x05\x12\n\n\x06SERIAL\x10\x06\x12\x08\n\x04\x45PON\x10\x07\x12\x08\n\x04\x42ITS\x10\x08\"F\n\x0bPonDistance\x12\x14\n\x0cmax_distance\x18\x01 \x01(\r\x12!\n\x19max_differential_distance\x18\x02 \x01(\r\"l\n\x1dPortComponentChangeAttributes\x12\'\n\rpon_id_config\x18\x01 \x01(\x0b\x32\x10.dmi.PonIdConfig\x12\"\n\x08\x64istance\x18\x02 \x01(\x0b\x32\x10.dmi.PonDistance\"P\n$TransceiverComponentChangeAttributes\x12(\n\ntrans_type\x18\x01 \x01(\x0e\x32\x14.dmi.TransceiverType\"B\n\x0bPonIdConfig\x12\x0e\n\x06pon_id\x18\x01 \x01(\x0c\x12#\n\x1bpon_id_transmit_periodicity\x18\x02 \x01(\r\"6\n\x1c\x43ontainerComponentAttributes\x12\x16\n\x0ephysical_label\x18\x01 \x01(\t\"\xb3\x01\n\x16PsuComponentAttributes\x12G\n\x11supported_voltage\x18\x01 \x01(\x0e\x32,.dmi.PsuComponentAttributes.SupportedVoltage\"P\n\x10SupportedVoltage\x12\x1f\n\x1bSUPPORTED_VOLTAGE_UNDEFINED\x10\x00\x12\x07\n\x03V48\x10\x01\x12\x08\n\x04V230\x10\x02\x12\x08\n\x04V115\x10\x03\"\xb8\x04\n\x1fTransceiverComponentsAttributes\x12\x44\n\x0b\x66orm_factor\x18\x01 \x01(\x0e\x32/.dmi.TransceiverComponentsAttributes.FormFactor\x12(\n\ntrans_type\x18\x02 \x01(\x0e\x32\x14.dmi.TransceiverType\x12\x14\n\x0cmax_distance\x18\x03 \x01(\r\x12+\n\x12max_distance_scale\x18\x04 \x01(\x0e\x32\x0f.dmi.ValueScale\x12\x15\n\rrx_wavelength\x18\x05 \x03(\r\x12\x15\n\rtx_wavelength\x18\x06 \x03(\r\x12)\n\x10wavelength_scale\x18\x07 \x01(\x0e\x32\x0f.dmi.ValueScale\x12\x10\n\x08tx_power\x18\x08 \x03(\x05\x12\'\n\x0etx_power_scale\x18\t \x01(\x0e\x32\x0f.dmi.ValueScale\"\xcd\x01\n\nFormFactor\x12\x17\n\x13\x46ORM_FACTOR_UNKNOWN\x10\x00\x12\x08\n\x04QSFP\x10\x01\x12\r\n\tQSFP_PLUS\x10\x02\x12\n\n\x06QSFP28\x10\x03\x12\x07\n\x03SFP\x10\x04\x12\x0c\n\x08SFP_PLUS\x10\x05\x12\x07\n\x03XFP\x10\x06\x12\x08\n\x04\x43\x46P4\x10\x07\x12\x08\n\x04\x43\x46P2\x10\x08\x12\x08\n\x04\x43PAK\x10\t\x12\x06\n\x02X2\x10\n\x12\t\n\x05OTHER\x10\x0b\x12\x07\n\x03\x43\x46P\x10\x0c\x12\x0c\n\x08\x43\x46P2_ACO\x10\r\x12\x0c\n\x08\x43\x46P2_DCO\x10\x0e\x12\x0b\n\x07QSFP_DD\x10\x0f\"\xe8\x05\n\tComponent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12!\n\x05\x63lass\x18\x02 \x01(\x0e\x32\x12.dmi.ComponentType\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0e\n\x06parent\x18\x04 \x01(\t\x12\x16\n\x0eparent_rel_pos\x18\x05 \x01(\x05\x12 \n\x08\x63hildren\x18\x06 \x03(\x0b\x32\x0e.dmi.Component\x12\x14\n\x0chardware_rev\x18\x07 \x01(\t\x12\x14\n\x0c\x66irmware_rev\x18\x08 \x01(\t\x12\x14\n\x0csoftware_rev\x18\t \x01(\t\x12\x12\n\nserial_num\x18\n \x01(\t\x12\x10\n\x08mfg_name\x18\x0b \x01(\t\x12\x12\n\nmodel_name\x18\x0c \x01(\t\x12\r\n\x05\x61lias\x18\r \x01(\t\x12\x10\n\x08\x61sset_id\x18\x0e \x01(\t\x12\x0e\n\x06is_fru\x18\x0f \x01(\x08\x12,\n\x08mfg_date\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\x03uri\x18\x11 \x01(\x0b\x32\x08.dmi.Uri\x12\x17\n\x04uuid\x18\x12 \x01(\x0b\x32\t.dmi.Uuid\x12\"\n\x05state\x18\x13 \x01(\x0b\x32\x13.dmi.ComponentState\x12-\n\x0bsensor_data\x18\x14 \x03(\x0b\x32\x18.dmi.ComponentSensorData\x12\x31\n\tport_attr\x18\x32 \x01(\x0b\x32\x1c.dmi.PortComponentAttributesH\x00\x12;\n\x0e\x63ontainer_attr\x18\x33 \x01(\x0b\x32!.dmi.ContainerComponentAttributesH\x00\x12/\n\x08psu_attr\x18\x34 \x01(\x0b\x32\x1b.dmi.PsuComponentAttributesH\x00\x12@\n\x10transceiver_attr\x18\x35 \x01(\x0b\x32$.dmi.TransceiverComponentsAttributesH\x00\x42\n\n\x08specific\"\x8a\x01\n\x08Hardware\x12/\n\x0blast_change\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1c\n\x04root\x18\x02 \x01(\x0b\x32\x0e.dmi.Component\x12/\n\x0blast_booted\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xe9\x02\n\x13ModifiableComponent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12!\n\x05\x63lass\x18\x02 \x01(\x0e\x32\x12.dmi.ComponentType\x12\x1e\n\x06parent\x18\x03 \x01(\x0b\x32\x0e.dmi.Component\x12\x16\n\x0eparent_rel_pos\x18\x04 \x01(\x05\x12\r\n\x05\x61lias\x18\x05 \x01(\t\x12\x10\n\x08\x61sset_id\x18\x06 \x01(\t\x12\x15\n\x03uri\x18\x07 \x01(\x0b\x32\x08.dmi.Uri\x12-\n\x0b\x61\x64min_state\x18\x08 \x01(\x0e\x32\x18.dmi.ComponentAdminState\x12\x37\n\tport_attr\x18\x32 \x01(\x0b\x32\".dmi.PortComponentChangeAttributesH\x00\x12=\n\x08trx_attr\x18\x33 \x01(\x0b\x32).dmi.TransceiverComponentChangeAttributesH\x00\x42\n\n\x08specific*\xb4\x03\n\rComponentType\x12\x1c\n\x18\x43OMPONENT_TYPE_UNDEFINED\x10\x00\x12\x1a\n\x16\x43OMPONENT_TYPE_UNKNOWN\x10\x01\x12\x1a\n\x16\x43OMPONENT_TYPE_CHASSIS\x10\x02\x12\x1c\n\x18\x43OMPONENT_TYPE_BACKPLANE\x10\x03\x12\x1c\n\x18\x43OMPONENT_TYPE_CONTAINER\x10\x04\x12\x1f\n\x1b\x43OMPONENT_TYPE_POWER_SUPPLY\x10\x05\x12\x16\n\x12\x43OMPONENT_TYPE_FAN\x10\x06\x12\x19\n\x15\x43OMPONENT_TYPE_SENSOR\x10\x07\x12\x19\n\x15\x43OMPONENT_TYPE_MODULE\x10\x08\x12\x17\n\x13\x43OMPONENT_TYPE_PORT\x10\t\x12\x16\n\x12\x43OMPONENT_TYPE_CPU\x10\n\x12\x1a\n\x16\x43OMPONENT_TYPE_BATTERY\x10\x0b\x12\x1a\n\x16\x43OMPONENT_TYPE_STORAGE\x10\x0c\x12\x19\n\x15\x43OMPONENT_TYPE_MEMORY\x10\r\x12\x1e\n\x1a\x43OMPONENT_TYPE_TRANSCEIVER\x10\x0e*\xb3\x01\n\x13\x43omponentAdminState\x12\x1e\n\x1a\x43OMP_ADMIN_STATE_UNDEFINED\x10\x00\x12\x1c\n\x18\x43OMP_ADMIN_STATE_UNKNOWN\x10\x01\x12\x1b\n\x17\x43OMP_ADMIN_STATE_LOCKED\x10\x02\x12\"\n\x1e\x43OMP_ADMIN_STATE_SHUTTING_DOWN\x10\x03\x12\x1d\n\x19\x43OMP_ADMIN_STATE_UNLOCKED\x10\x04*\xa8\x01\n\x12\x43omponentOperState\x12\x1d\n\x19\x43OMP_OPER_STATE_UNDEFINED\x10\x00\x12\x1b\n\x17\x43OMP_OPER_STATE_UNKNOWN\x10\x01\x12\x1c\n\x18\x43OMP_OPER_STATE_DISABLED\x10\x02\x12\x1b\n\x17\x43OMP_OPER_STATE_ENABLED\x10\x03\x12\x1b\n\x17\x43OMP_OPER_STATE_TESTING\x10\x04*\xa6\x01\n\x13\x43omponentUsageState\x12\x1e\n\x1a\x43OMP_USAGE_STATE_UNDEFINED\x10\x00\x12\x1c\n\x18\x43OMP_USAGE_STATE_UNKNOWN\x10\x01\x12\x19\n\x15\x43OMP_USAGE_STATE_IDLE\x10\x02\x12\x1b\n\x17\x43OMP_USAGE_STATE_ACTIVE\x10\x03\x12\x19\n\x15\x43OMP_USAGE_STATE_BUSY\x10\x04*\x8f\x02\n\x13\x43omponentAlarmState\x12\x1e\n\x1a\x43OMP_ALARM_STATE_UNDEFINED\x10\x00\x12\x1c\n\x18\x43OMP_ALARM_STATE_UNKNOWN\x10\x01\x12!\n\x1d\x43OMP_ALARM_STATE_UNDER_REPAIR\x10\x02\x12\x1d\n\x19\x43OMP_ALARM_STATE_CRITICAL\x10\x03\x12\x1a\n\x16\x43OMP_ALARM_STATE_MAJOR\x10\x04\x12\x1a\n\x16\x43OMP_ALARM_STATE_MINOR\x10\x05\x12\x1c\n\x18\x43OMP_ALARM_STATE_WARNING\x10\x06\x12\"\n\x1e\x43OMP_ALARM_STATE_INDETERMINATE\x10\x07*\xbc\x01\n\x15\x43omponentStandbyState\x12 \n\x1c\x43OMP_STANDBY_STATE_UNDEFINED\x10\x00\x12\x1e\n\x1a\x43OMP_STANDBY_STATE_UNKNOWN\x10\x01\x12\x1a\n\x16\x43OMP_STANDBY_STATE_HOT\x10\x02\x12\x1b\n\x17\x43OMP_STANDBY_STATE_COLD\x10\x03\x12(\n$COMP_STANDBY_STATE_PROVIDING_SERVICE\x10\x04*\x9d\x03\n\rDataValueType\x12\x18\n\x14VALUE_TYPE_UNDEFINED\x10\x00\x12\x14\n\x10VALUE_TYPE_OTHER\x10\x01\x12\x16\n\x12VALUE_TYPE_UNKNOWN\x10\x02\x12\x17\n\x13VALUE_TYPE_VOLTS_AC\x10\x03\x12\x17\n\x13VALUE_TYPE_VOLTS_DC\x10\x04\x12\x16\n\x12VALUE_TYPE_AMPERES\x10\x05\x12\x14\n\x10VALUE_TYPE_WATTS\x10\x06\x12\x14\n\x10VALUE_TYPE_HERTZ\x10\x07\x12\x16\n\x12VALUE_TYPE_CELSIUS\x10\x08\x12\x19\n\x15VALUE_TYPE_PERCENT_RH\x10\t\x12\x12\n\x0eVALUE_TYPE_RPM\x10\n\x12\x12\n\x0eVALUE_TYPE_CMM\x10\x0b\x12\x1a\n\x16VALUE_TYPE_TRUTH_VALUE\x10\x0c\x12\x16\n\x12VALUE_TYPE_PERCENT\x10\r\x12\x15\n\x11VALUE_TYPE_METERS\x10\x0e\x12\x14\n\x10VALUE_TYPE_BYTES\x10\x0f\x12\x12\n\x0eVALUE_TYPE_DBM\x10\x10*\xa4\x03\n\nValueScale\x12\x19\n\x15VALUE_SCALE_UNDEFINED\x10\x00\x12\x15\n\x11VALUE_SCALE_YOCTO\x10\x01\x12\x15\n\x11VALUE_SCALE_ZEPTO\x10\x02\x12\x14\n\x10VALUE_SCALE_ATTO\x10\x03\x12\x15\n\x11VALUE_SCALE_FEMTO\x10\x04\x12\x14\n\x10VALUE_SCALE_PICO\x10\x05\x12\x14\n\x10VALUE_SCALE_NANO\x10\x06\x12\x15\n\x11VALUE_SCALE_MICRO\x10\x07\x12\x15\n\x11VALUE_SCALE_MILLI\x10\x08\x12\x15\n\x11VALUE_SCALE_UNITS\x10\t\x12\x14\n\x10VALUE_SCALE_KILO\x10\n\x12\x14\n\x10VALUE_SCALE_MEGA\x10\x0b\x12\x14\n\x10VALUE_SCALE_GIGA\x10\x0c\x12\x14\n\x10VALUE_SCALE_TERA\x10\r\x12\x14\n\x10VALUE_SCALE_PETA\x10\x0e\x12\x13\n\x0fVALUE_SCALE_EXA\x10\x0f\x12\x15\n\x11VALUE_SCALE_ZETTA\x10\x10\x12\x15\n\x11VALUE_SCALE_YOTTA\x10\x11*\x82\x01\n\x0cSensorStatus\x12\x1b\n\x17SENSOR_STATUS_UNDEFINED\x10\x00\x12\x14\n\x10SENSOR_STATUS_OK\x10\x01\x12\x1d\n\x19SENSOR_STATUS_UNAVAILABLE\x10\x02\x12 \n\x1cSENSOR_STATUS_NONOPERATIONAL\x10\x03*\xa4\x01\n\x0fTransceiverType\x12\x12\n\x0eTYPE_UNDEFINED\x10\x00\x12\x0c\n\x08\x45THERNET\x10\x01\x12\x08\n\x04GPON\x10\x02\x12\t\n\x05XGPON\x10\x03\x12\n\n\x06XGSPON\x10\x04\x12\x08\n\x04\x43PON\x10\x05\x12\x0b\n\x07NG_PON2\x10\x06\x12\x08\n\x04\x45PON\x10\x07\x12\x15\n\x11\x43OMBO_GPON_XGSPON\x10\x08\x12\x16\n\x11TYPE_NOT_DETECTED\x10\xff\x01\x42;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3')
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0c\x64mi/hw.proto\x12\x03\x64mi\x1a\x1fgoogle/protobuf/timestamp.proto\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"%\n\nHardwareID\x12\x17\n\x04uuid\x18\x01 \x01(\x0b\x32\t.dmi.Uuid\"\x12\n\x03Uri\x12\x0b\n\x03uri\x18\x01 \x01(\t\"\xb5\x02\n\x0e\x43omponentState\x12\x36\n\x12state_last_changed\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12-\n\x0b\x61\x64min_state\x18\x02 \x01(\x0e\x32\x18.dmi.ComponentAdminState\x12+\n\noper_state\x18\x03 \x01(\x0e\x32\x17.dmi.ComponentOperState\x12-\n\x0busage_state\x18\x04 \x01(\x0e\x32\x18.dmi.ComponentUsageState\x12-\n\x0b\x61larm_state\x18\x05 \x01(\x0e\x32\x18.dmi.ComponentAlarmState\x12\x31\n\rstandby_state\x18\x06 \x01(\x0e\x32\x1a.dmi.ComponentStandbyState\"\x90\x02\n\x13\x43omponentSensorData\x12\r\n\x05value\x18\x01 \x01(\x05\x12 \n\x04type\x18\x02 \x01(\x0e\x32\x12.dmi.DataValueType\x12\x1e\n\x05scale\x18\x03 \x01(\x0e\x32\x0f.dmi.ValueScale\x12\x11\n\tprecision\x18\x04 \x01(\x05\x12!\n\x06status\x18\x05 \x01(\x0e\x32\x11.dmi.SensorStatus\x12\x15\n\runits_display\x18\x06 \x01(\t\x12-\n\ttimestamp\x18\x07 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x19\n\x11value_update_rate\x18\x08 \x01(\r\x12\x11\n\tdata_type\x18\t \x01(\t\"\x85\x06\n\x17PortComponentAttributes\x12\x42\n\x0e\x63onnector_type\x18\x01 \x01(\x0e\x32*.dmi.PortComponentAttributes.ConnectorType\x12\x31\n\x05speed\x18\x02 \x01(\x0e\x32\".dmi.PortComponentAttributes.Speed\x12\x37\n\x08protocol\x18\x03 \x01(\x0e\x32%.dmi.PortComponentAttributes.Protocol\x12\x16\n\x0ephysical_label\x18\x04 \x01(\t\x12\x15\n\rmapping_label\x18\x05 \x01(\t\x12\'\n\rpon_id_config\x18\x06 \x01(\x0b\x32\x10.dmi.PonIdConfig\x12\x1d\n\x15speed_autonegotiation\x18\x07 \x01(\x08\x12\"\n\x08\x64istance\x18\x08 \x01(\x0b\x32\x10.dmi.PonDistance\"p\n\rConnectorType\x12\x1c\n\x18\x43ONNECTOR_TYPE_UNDEFINED\x10\x00\x12\x08\n\x04RJ45\x10\x01\x12\x0c\n\x08\x46IBER_LC\x10\x02\x12\x0f\n\x0b\x46IBER_SC_PC\x10\x03\x12\r\n\tFIBER_MPO\x10\x04\x12\t\n\x05RS232\x10\x05\"\xae\x01\n\x05Speed\x12\x13\n\x0fSPEED_UNDEFINED\x10\x00\x12\x0b\n\x07\x44YNAMIC\x10\x01\x12\r\n\tGIGABIT_1\x10\x02\x12\x0e\n\nGIGABIT_10\x10\x03\x12\x0e\n\nGIGABIT_25\x10\x04\x12\x0e\n\nGIGABIT_40\x10\x05\x12\x0f\n\x0bGIGABIT_100\x10\x06\x12\x0f\n\x0bGIGABIT_400\x10\x07\x12\x10\n\x0cMEGABIT_2500\x10\x08\x12\x10\n\x0cMEGABIT_1250\x10\t\"|\n\x08Protocol\x12\x16\n\x12PROTOCOL_UNDEFINED\x10\x00\x12\x0c\n\x08\x45THERNET\x10\x01\x12\x08\n\x04GPON\x10\x02\x12\t\n\x05XGPON\x10\x03\x12\n\n\x06XGSPON\x10\x04\x12\t\n\x05GFAST\x10\x05\x12\n\n\x06SERIAL\x10\x06\x12\x08\n\x04\x45PON\x10\x07\x12\x08\n\x04\x42ITS\x10\x08\"F\n\x0bPonDistance\x12\x14\n\x0cmax_distance\x18\x01 \x01(\r\x12!\n\x19max_differential_distance\x18\x02 \x01(\r\"l\n\x1dPortComponentChangeAttributes\x12\'\n\rpon_id_config\x18\x01 \x01(\x0b\x32\x10.dmi.PonIdConfig\x12\"\n\x08\x64istance\x18\x02 \x01(\x0b\x32\x10.dmi.PonDistance\"P\n$TransceiverComponentChangeAttributes\x12(\n\ntrans_type\x18\x01 \x01(\x0e\x32\x14.dmi.TransceiverType\"B\n\x0bPonIdConfig\x12\x0e\n\x06pon_id\x18\x01 \x01(\x0c\x12#\n\x1bpon_id_transmit_periodicity\x18\x02 \x01(\r\"6\n\x1c\x43ontainerComponentAttributes\x12\x16\n\x0ephysical_label\x18\x01 \x01(\t\"\xb3\x01\n\x16PsuComponentAttributes\x12G\n\x11supported_voltage\x18\x01 \x01(\x0e\x32,.dmi.PsuComponentAttributes.SupportedVoltage\"P\n\x10SupportedVoltage\x12\x1f\n\x1bSUPPORTED_VOLTAGE_UNDEFINED\x10\x00\x12\x07\n\x03V48\x10\x01\x12\x08\n\x04V230\x10\x02\x12\x08\n\x04V115\x10\x03\"\xb8\x04\n\x1fTransceiverComponentsAttributes\x12\x44\n\x0b\x66orm_factor\x18\x01 \x01(\x0e\x32/.dmi.TransceiverComponentsAttributes.FormFactor\x12(\n\ntrans_type\x18\x02 \x01(\x0e\x32\x14.dmi.TransceiverType\x12\x14\n\x0cmax_distance\x18\x03 \x01(\r\x12+\n\x12max_distance_scale\x18\x04 \x01(\x0e\x32\x0f.dmi.ValueScale\x12\x15\n\rrx_wavelength\x18\x05 \x03(\r\x12\x15\n\rtx_wavelength\x18\x06 \x03(\r\x12)\n\x10wavelength_scale\x18\x07 \x01(\x0e\x32\x0f.dmi.ValueScale\x12\x10\n\x08tx_power\x18\x08 \x03(\x05\x12\'\n\x0etx_power_scale\x18\t \x01(\x0e\x32\x0f.dmi.ValueScale\"\xcd\x01\n\nFormFactor\x12\x17\n\x13\x46ORM_FACTOR_UNKNOWN\x10\x00\x12\x08\n\x04QSFP\x10\x01\x12\r\n\tQSFP_PLUS\x10\x02\x12\n\n\x06QSFP28\x10\x03\x12\x07\n\x03SFP\x10\x04\x12\x0c\n\x08SFP_PLUS\x10\x05\x12\x07\n\x03XFP\x10\x06\x12\x08\n\x04\x43\x46P4\x10\x07\x12\x08\n\x04\x43\x46P2\x10\x08\x12\x08\n\x04\x43PAK\x10\t\x12\x06\n\x02X2\x10\n\x12\t\n\x05OTHER\x10\x0b\x12\x07\n\x03\x43\x46P\x10\x0c\x12\x0c\n\x08\x43\x46P2_ACO\x10\r\x12\x0c\n\x08\x43\x46P2_DCO\x10\x0e\x12\x0b\n\x07QSFP_DD\x10\x0f\"\xe8\x05\n\tComponent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12!\n\x05\x63lass\x18\x02 \x01(\x0e\x32\x12.dmi.ComponentType\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x0e\n\x06parent\x18\x04 \x01(\t\x12\x16\n\x0eparent_rel_pos\x18\x05 \x01(\x05\x12 \n\x08\x63hildren\x18\x06 \x03(\x0b\x32\x0e.dmi.Component\x12\x14\n\x0chardware_rev\x18\x07 \x01(\t\x12\x14\n\x0c\x66irmware_rev\x18\x08 \x01(\t\x12\x14\n\x0csoftware_rev\x18\t \x01(\t\x12\x12\n\nserial_num\x18\n \x01(\t\x12\x10\n\x08mfg_name\x18\x0b \x01(\t\x12\x12\n\nmodel_name\x18\x0c \x01(\t\x12\r\n\x05\x61lias\x18\r \x01(\t\x12\x10\n\x08\x61sset_id\x18\x0e \x01(\t\x12\x0e\n\x06is_fru\x18\x0f \x01(\x08\x12,\n\x08mfg_date\x18\x10 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x15\n\x03uri\x18\x11 \x01(\x0b\x32\x08.dmi.Uri\x12\x17\n\x04uuid\x18\x12 \x01(\x0b\x32\t.dmi.Uuid\x12\"\n\x05state\x18\x13 \x01(\x0b\x32\x13.dmi.ComponentState\x12-\n\x0bsensor_data\x18\x14 \x03(\x0b\x32\x18.dmi.ComponentSensorData\x12\x31\n\tport_attr\x18\x32 \x01(\x0b\x32\x1c.dmi.PortComponentAttributesH\x00\x12;\n\x0e\x63ontainer_attr\x18\x33 \x01(\x0b\x32!.dmi.ContainerComponentAttributesH\x00\x12/\n\x08psu_attr\x18\x34 \x01(\x0b\x32\x1b.dmi.PsuComponentAttributesH\x00\x12@\n\x10transceiver_attr\x18\x35 \x01(\x0b\x32$.dmi.TransceiverComponentsAttributesH\x00\x42\n\n\x08specific\"\x8a\x01\n\x08Hardware\x12/\n\x0blast_change\x18\x01 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\x12\x1c\n\x04root\x18\x02 \x01(\x0b\x32\x0e.dmi.Component\x12/\n\x0blast_booted\x18\x03 \x01(\x0b\x32\x1a.google.protobuf.Timestamp\"\xe9\x02\n\x13ModifiableComponent\x12\x0c\n\x04name\x18\x01 \x01(\t\x12!\n\x05\x63lass\x18\x02 \x01(\x0e\x32\x12.dmi.ComponentType\x12\x1e\n\x06parent\x18\x03 \x01(\x0b\x32\x0e.dmi.Component\x12\x16\n\x0eparent_rel_pos\x18\x04 \x01(\x05\x12\r\n\x05\x61lias\x18\x05 \x01(\t\x12\x10\n\x08\x61sset_id\x18\x06 \x01(\t\x12\x15\n\x03uri\x18\x07 \x01(\x0b\x32\x08.dmi.Uri\x12-\n\x0b\x61\x64min_state\x18\x08 \x01(\x0e\x32\x18.dmi.ComponentAdminState\x12\x37\n\tport_attr\x18\x32 \x01(\x0b\x32\".dmi.PortComponentChangeAttributesH\x00\x12=\n\x08trx_attr\x18\x33 \x01(\x0b\x32).dmi.TransceiverComponentChangeAttributesH\x00\x42\n\n\x08specific*\xb4\x03\n\rComponentType\x12\x1c\n\x18\x43OMPONENT_TYPE_UNDEFINED\x10\x00\x12\x1a\n\x16\x43OMPONENT_TYPE_UNKNOWN\x10\x01\x12\x1a\n\x16\x43OMPONENT_TYPE_CHASSIS\x10\x02\x12\x1c\n\x18\x43OMPONENT_TYPE_BACKPLANE\x10\x03\x12\x1c\n\x18\x43OMPONENT_TYPE_CONTAINER\x10\x04\x12\x1f\n\x1b\x43OMPONENT_TYPE_POWER_SUPPLY\x10\x05\x12\x16\n\x12\x43OMPONENT_TYPE_FAN\x10\x06\x12\x19\n\x15\x43OMPONENT_TYPE_SENSOR\x10\x07\x12\x19\n\x15\x43OMPONENT_TYPE_MODULE\x10\x08\x12\x17\n\x13\x43OMPONENT_TYPE_PORT\x10\t\x12\x16\n\x12\x43OMPONENT_TYPE_CPU\x10\n\x12\x1a\n\x16\x43OMPONENT_TYPE_BATTERY\x10\x0b\x12\x1a\n\x16\x43OMPONENT_TYPE_STORAGE\x10\x0c\x12\x19\n\x15\x43OMPONENT_TYPE_MEMORY\x10\r\x12\x1e\n\x1a\x43OMPONENT_TYPE_TRANSCEIVER\x10\x0e*\xf3\x01\n\x13\x43omponentAdminState\x12\x1e\n\x1a\x43OMP_ADMIN_STATE_UNDEFINED\x10\x00\x12\x1c\n\x18\x43OMP_ADMIN_STATE_UNKNOWN\x10\x01\x12\x1b\n\x17\x43OMP_ADMIN_STATE_LOCKED\x10\x02\x12\"\n\x1e\x43OMP_ADMIN_STATE_SHUTTING_DOWN\x10\x03\x12\x1d\n\x19\x43OMP_ADMIN_STATE_UNLOCKED\x10\x04\x12\x1d\n\x19\x43OMP_ADMIN_STATE_ISOLATED\x10\x06\x12\x1f\n\x1b\x43OMP_ADMIN_STATE_PROHIBITED\x10\x05*\xc3\x03\n\x12\x43omponentOperState\x12\x1d\n\x19\x43OMP_OPER_STATE_UNDEFINED\x10\x00\x12\x1b\n\x17\x43OMP_OPER_STATE_UNKNOWN\x10\x01\x12\x1c\n\x18\x43OMP_OPER_STATE_DISABLED\x10\x02\x12\x1b\n\x17\x43OMP_OPER_STATE_ENABLED\x10\x03\x12\x1b\n\x17\x43OMP_OPER_STATE_TESTING\x10\x04\x12\x1a\n\x16\x43OMP_OPER_STATE_NORMAL\x10\x05\x12\x1f\n\x1b\x43OMP_OPER_STATE_CONFIGURING\x10\x06\x12%\n!COMP_OPER_STATE_AUTOMATIC_LOADING\x10\x07\x12\x1a\n\x16\x43OMP_OPER_STATE_FAILED\x10\x08\x12&\n\"COMP_OPER_STATE_HIGH_TEMP_SHUTDOWN\x10\t\x12#\n\x1f\x43OMP_OPER_STATE_MANUAL_SHUTDOWN\x10\n\x12)\n%COMP_OPER_STATE_POWER_SAVING_SHUTDOWN\x10\x0b\x12!\n\x1d\x43OMP_OPER_STATE_TYPE_MISMATCH\x10\x0c*\xa6\x01\n\x13\x43omponentUsageState\x12\x1e\n\x1a\x43OMP_USAGE_STATE_UNDEFINED\x10\x00\x12\x1c\n\x18\x43OMP_USAGE_STATE_UNKNOWN\x10\x01\x12\x19\n\x15\x43OMP_USAGE_STATE_IDLE\x10\x02\x12\x1b\n\x17\x43OMP_USAGE_STATE_ACTIVE\x10\x03\x12\x19\n\x15\x43OMP_USAGE_STATE_BUSY\x10\x04*\x8f\x02\n\x13\x43omponentAlarmState\x12\x1e\n\x1a\x43OMP_ALARM_STATE_UNDEFINED\x10\x00\x12\x1c\n\x18\x43OMP_ALARM_STATE_UNKNOWN\x10\x01\x12!\n\x1d\x43OMP_ALARM_STATE_UNDER_REPAIR\x10\x02\x12\x1d\n\x19\x43OMP_ALARM_STATE_CRITICAL\x10\x03\x12\x1a\n\x16\x43OMP_ALARM_STATE_MAJOR\x10\x04\x12\x1a\n\x16\x43OMP_ALARM_STATE_MINOR\x10\x05\x12\x1c\n\x18\x43OMP_ALARM_STATE_WARNING\x10\x06\x12\"\n\x1e\x43OMP_ALARM_STATE_INDETERMINATE\x10\x07*\xbc\x01\n\x15\x43omponentStandbyState\x12 \n\x1c\x43OMP_STANDBY_STATE_UNDEFINED\x10\x00\x12\x1e\n\x1a\x43OMP_STANDBY_STATE_UNKNOWN\x10\x01\x12\x1a\n\x16\x43OMP_STANDBY_STATE_HOT\x10\x02\x12\x1b\n\x17\x43OMP_STANDBY_STATE_COLD\x10\x03\x12(\n$COMP_STANDBY_STATE_PROVIDING_SERVICE\x10\x04*\x9d\x03\n\rDataValueType\x12\x18\n\x14VALUE_TYPE_UNDEFINED\x10\x00\x12\x14\n\x10VALUE_TYPE_OTHER\x10\x01\x12\x16\n\x12VALUE_TYPE_UNKNOWN\x10\x02\x12\x17\n\x13VALUE_TYPE_VOLTS_AC\x10\x03\x12\x17\n\x13VALUE_TYPE_VOLTS_DC\x10\x04\x12\x16\n\x12VALUE_TYPE_AMPERES\x10\x05\x12\x14\n\x10VALUE_TYPE_WATTS\x10\x06\x12\x14\n\x10VALUE_TYPE_HERTZ\x10\x07\x12\x16\n\x12VALUE_TYPE_CELSIUS\x10\x08\x12\x19\n\x15VALUE_TYPE_PERCENT_RH\x10\t\x12\x12\n\x0eVALUE_TYPE_RPM\x10\n\x12\x12\n\x0eVALUE_TYPE_CMM\x10\x0b\x12\x1a\n\x16VALUE_TYPE_TRUTH_VALUE\x10\x0c\x12\x16\n\x12VALUE_TYPE_PERCENT\x10\r\x12\x15\n\x11VALUE_TYPE_METERS\x10\x0e\x12\x14\n\x10VALUE_TYPE_BYTES\x10\x0f\x12\x12\n\x0eVALUE_TYPE_DBM\x10\x10*\xa4\x03\n\nValueScale\x12\x19\n\x15VALUE_SCALE_UNDEFINED\x10\x00\x12\x15\n\x11VALUE_SCALE_YOCTO\x10\x01\x12\x15\n\x11VALUE_SCALE_ZEPTO\x10\x02\x12\x14\n\x10VALUE_SCALE_ATTO\x10\x03\x12\x15\n\x11VALUE_SCALE_FEMTO\x10\x04\x12\x14\n\x10VALUE_SCALE_PICO\x10\x05\x12\x14\n\x10VALUE_SCALE_NANO\x10\x06\x12\x15\n\x11VALUE_SCALE_MICRO\x10\x07\x12\x15\n\x11VALUE_SCALE_MILLI\x10\x08\x12\x15\n\x11VALUE_SCALE_UNITS\x10\t\x12\x14\n\x10VALUE_SCALE_KILO\x10\n\x12\x14\n\x10VALUE_SCALE_MEGA\x10\x0b\x12\x14\n\x10VALUE_SCALE_GIGA\x10\x0c\x12\x14\n\x10VALUE_SCALE_TERA\x10\r\x12\x14\n\x10VALUE_SCALE_PETA\x10\x0e\x12\x13\n\x0fVALUE_SCALE_EXA\x10\x0f\x12\x15\n\x11VALUE_SCALE_ZETTA\x10\x10\x12\x15\n\x11VALUE_SCALE_YOTTA\x10\x11*\x82\x01\n\x0cSensorStatus\x12\x1b\n\x17SENSOR_STATUS_UNDEFINED\x10\x00\x12\x14\n\x10SENSOR_STATUS_OK\x10\x01\x12\x1d\n\x19SENSOR_STATUS_UNAVAILABLE\x10\x02\x12 \n\x1cSENSOR_STATUS_NONOPERATIONAL\x10\x03*\xa4\x01\n\x0fTransceiverType\x12\x12\n\x0eTYPE_UNDEFINED\x10\x00\x12\x0c\n\x08\x45THERNET\x10\x01\x12\x08\n\x04GPON\x10\x02\x12\t\n\x05XGPON\x10\x03\x12\n\n\x06XGSPON\x10\x04\x12\x08\n\x04\x43PON\x10\x05\x12\x0b\n\x07NG_PON2\x10\x06\x12\x08\n\x04\x45PON\x10\x07\x12\x15\n\x11\x43OMBO_GPON_XGSPON\x10\x08\x12\x16\n\x11TYPE_NOT_DETECTED\x10\xff\x01\x42;Z9github.com/opencord/device-management-interface/v3/go/dmib\x06proto3')
 
 _COMPONENTTYPE = DESCRIPTOR.enum_types_by_name['ComponentType']
 ComponentType = enum_type_wrapper.EnumTypeWrapper(_COMPONENTTYPE)
@@ -58,11 +58,21 @@
 COMP_ADMIN_STATE_LOCKED = 2
 COMP_ADMIN_STATE_SHUTTING_DOWN = 3
 COMP_ADMIN_STATE_UNLOCKED = 4
+COMP_ADMIN_STATE_ISOLATED = 6
+COMP_ADMIN_STATE_PROHIBITED = 5
 COMP_OPER_STATE_UNDEFINED = 0
 COMP_OPER_STATE_UNKNOWN = 1
 COMP_OPER_STATE_DISABLED = 2
 COMP_OPER_STATE_ENABLED = 3
 COMP_OPER_STATE_TESTING = 4
+COMP_OPER_STATE_NORMAL = 5
+COMP_OPER_STATE_CONFIGURING = 6
+COMP_OPER_STATE_AUTOMATIC_LOADING = 7
+COMP_OPER_STATE_FAILED = 8
+COMP_OPER_STATE_HIGH_TEMP_SHUTDOWN = 9
+COMP_OPER_STATE_MANUAL_SHUTDOWN = 10
+COMP_OPER_STATE_POWER_SAVING_SHUTDOWN = 11
+COMP_OPER_STATE_TYPE_MISMATCH = 12
 COMP_USAGE_STATE_UNDEFINED = 0
 COMP_USAGE_STATE_UNKNOWN = 1
 COMP_USAGE_STATE_IDLE = 2
@@ -272,23 +282,23 @@
   _COMPONENTTYPE._serialized_start=3892
   _COMPONENTTYPE._serialized_end=4328
   _COMPONENTADMINSTATE._serialized_start=4331
-  _COMPONENTADMINSTATE._serialized_end=4510
-  _COMPONENTOPERSTATE._serialized_start=4513
-  _COMPONENTOPERSTATE._serialized_end=4681
-  _COMPONENTUSAGESTATE._serialized_start=4684
-  _COMPONENTUSAGESTATE._serialized_end=4850
-  _COMPONENTALARMSTATE._serialized_start=4853
-  _COMPONENTALARMSTATE._serialized_end=5124
-  _COMPONENTSTANDBYSTATE._serialized_start=5127
-  _COMPONENTSTANDBYSTATE._serialized_end=5315
-  _DATAVALUETYPE._serialized_start=5318
-  _DATAVALUETYPE._serialized_end=5731
-  _VALUESCALE._serialized_start=5734
-  _VALUESCALE._serialized_end=6154
-  _SENSORSTATUS._serialized_start=6157
-  _SENSORSTATUS._serialized_end=6287
-  _TRANSCEIVERTYPE._serialized_start=6290
-  _TRANSCEIVERTYPE._serialized_end=6454
+  _COMPONENTADMINSTATE._serialized_end=4574
+  _COMPONENTOPERSTATE._serialized_start=4577
+  _COMPONENTOPERSTATE._serialized_end=5028
+  _COMPONENTUSAGESTATE._serialized_start=5031
+  _COMPONENTUSAGESTATE._serialized_end=5197
+  _COMPONENTALARMSTATE._serialized_start=5200
+  _COMPONENTALARMSTATE._serialized_end=5471
+  _COMPONENTSTANDBYSTATE._serialized_start=5474
+  _COMPONENTSTANDBYSTATE._serialized_end=5662
+  _DATAVALUETYPE._serialized_start=5665
+  _DATAVALUETYPE._serialized_end=6078
+  _VALUESCALE._serialized_start=6081
+  _VALUESCALE._serialized_end=6501
+  _SENSORSTATUS._serialized_start=6504
+  _SENSORSTATUS._serialized_end=6634
+  _TRANSCEIVERTYPE._serialized_start=6637
+  _TRANSCEIVERTYPE._serialized_end=6801
   _UUID._serialized_start=54
   _UUID._serialized_end=74
   _HARDWAREID._serialized_start=76
