diff --git a/clients/proto/descriptors/mxaccessgw-client-v1.protoset b/clients/proto/descriptors/mxaccessgw-client-v1.protoset index 3e1541c..002fe83 100644 Binary files a/clients/proto/descriptors/mxaccessgw-client-v1.protoset and b/clients/proto/descriptors/mxaccessgw-client-v1.protoset differ diff --git a/clients/rust/protos/mxaccess_gateway.proto b/clients/rust/protos/mxaccess_gateway.proto index 6b00da9..915b1e8 100644 --- a/clients/rust/protos/mxaccess_gateway.proto +++ b/clients/rust/protos/mxaccess_gateway.proto @@ -391,10 +391,13 @@ message AlarmFailoverConfig { int32 failback_stable_probes = 3; // clean probes before switching back (>=1) } -// Acknowledge a single alarm by its GUID. Operator identity fields are -// recorded atomically with the ack transition in the alarm-history log. -// The reply's hresult / native_status surfaces AVEVA's -// AlarmAckByGUID return code. +// Acknowledge a single alarm by its GUID. The worker resolves the GUID to the +// alarm's Galaxy reference from its active-alarm snapshot and acknowledges it +// by writing `comment` to `.AckMsg` over MXAccess after +// AuthenticateUser as the operator, so the alarm history records the real +// operator. The reply's hresult / native_status is 0 when the write was +// applied (or sent but unconfirmed), otherwise the AuthenticateUser HRESULT or +// the OnWriteComplete status detail. message AcknowledgeAlarmCommand { // Canonical 8-4-4-4-12 GUID string (e.g. "BCC47053-9542-4D65-BDAA-BCDEA6A32A73"). string alarm_guid = 1; @@ -403,6 +406,10 @@ message AcknowledgeAlarmCommand { string operator_node = 4; string operator_domain = 5; string operator_full_name = 6; + // Operator credential used for AuthenticateUser before the AckMsg write. + // Implementations must keep this field out of logs, metrics labels, command + // lines, and diagnostics. + string operator_password = 7; } // Snapshot the currently-active alarm set. Optional filter prefix scopes @@ -414,9 +421,7 @@ message QueryActiveAlarmsCommand { // Acknowledge a single alarm by its (name, provider, group) tuple. Used // when the public RPC's AlarmFullReference (Provider!Group.Tag) cannot -// be resolved to a GUID directly. The worker invokes -// wwAlarmConsumerClass.AlarmAckByName which reaches the same alarm -// history path as AlarmAckByGUID. +// be resolved to a GUID directly. The worker acknowledges by writing `comment` to `.AckMsg` (Galaxy provider only) after AuthenticateUser as the operator. message AcknowledgeAlarmByNameCommand { // Tag/alarm name (e.g. "TestMachine_001.TestAlarm001"). Tag itself // may contain dots; the gateway-side parser splits on the first dot @@ -431,6 +436,10 @@ message AcknowledgeAlarmByNameCommand { string operator_node = 6; string operator_domain = 7; string operator_full_name = 8; + // Operator credential used for AuthenticateUser before the AckMsg write. + // Implementations must keep this field out of logs, metrics labels, command + // lines, and diagnostics. + string operator_password = 9; } message UnsubscribeBulkCommand { @@ -725,11 +734,11 @@ message DrainEventsReply { // Reply payload for AcknowledgeAlarmCommand AND // AcknowledgeAlarmByNameCommand — both ack command kinds reuse this // payload case (`MxCommandReply.acknowledge_alarm`); there is no -// dedicated by-name reply case. Surfaces AVEVA's native ack return -// code (AlarmAckByGUID for the GUID arm, AlarmAckByName for the -// by-name arm); 0 means success. The MxCommandReply's hresult field +// dedicated by-name reply case. Surfaces the ack outcome: 0 when the +// AckMsg write was applied or sent but unconfirmed; otherwise the +// AuthenticateUser HRESULT or the OnWriteComplete status detail. The MxCommandReply's hresult field // carries the same value and is preferred for protocol consumers — -// this payload exists so the gateway-side WorkerAlarmRpcDispatcher +// this payload exists so GatewayAlarmMonitor // can echo native_status into AcknowledgeAlarmReply.hresult without // unpacking the outer envelope. message AcknowledgeAlarmReplyPayload { @@ -987,6 +996,15 @@ message AcknowledgeAlarmRequest { // Operator principal performing the acknowledgement. The lmxopcua side // resolves this from the OPC UA session prior to invoking the RPC. string operator_user = 5; + // Operator's Galaxy (or OS) password. The gateway authenticates as + // operator_user with it before writing the acknowledgement so the alarm + // history records the real operator. May be empty for accounts without a + // password. Credential-sensitive: implementations must keep this field out + // of logs, metrics labels, command lines, and diagnostics. + string operator_password = 6; + // Optional domain for OS-authenticated galaxies. When set the gateway + // authenticates as "\". + string operator_domain = 7; } message AcknowledgeAlarmReply { @@ -997,8 +1015,7 @@ message AcknowledgeAlarmReply { ProtocolStatus protocol_status = 3; // Native ack return code echoed from the worker. The worker carries the // ack outcome as a single int32 (AcknowledgeAlarmReplyPayload.native_status, - // = AlarmAckByName / AlarmAckByGUID return code; 0 = success); the gateway's - // WorkerAlarmRpcDispatcher copies that value here. This is the authoritative + // 0 = applied or sent; otherwise the AuthenticateUser HRESULT or OnWriteComplete detail); GatewayAlarmMonitor copies that value here. This is the authoritative // ack-outcome field for the public RPC. Absent only when the worker reply // omitted the value entirely (a protocol violation). optional int32 hresult = 4; diff --git a/src/ZB.MOM.WW.MxGateway.Contracts/Generated/MxaccessGateway.cs b/src/ZB.MOM.WW.MxGateway.Contracts/Generated/MxaccessGateway.cs index 8075357..9e1229e 100644 --- a/src/ZB.MOM.WW.MxGateway.Contracts/Generated/MxaccessGateway.cs +++ b/src/ZB.MOM.WW.MxGateway.Contracts/Generated/MxaccessGateway.cs @@ -172,370 +172,373 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { "cmlvcml0eV9zdWJ0YWcYBiABKAkihQEKE0FsYXJtRmFpbG92ZXJDb25maWcS", "JQodY29uc2VjdXRpdmVfZmFpbHVyZV90aHJlc2hvbGQYASABKAUSJwofZmFp", "bGJhY2tfcHJvYmVfaW50ZXJ2YWxfc2Vjb25kcxgCIAEoBRIeChZmYWlsYmFj", - "a19zdGFibGVfcHJvYmVzGAMgASgFIqEBChdBY2tub3dsZWRnZUFsYXJtQ29t", + "a19zdGFibGVfcHJvYmVzGAMgASgFIrwBChdBY2tub3dsZWRnZUFsYXJtQ29t", "bWFuZBISCgphbGFybV9ndWlkGAEgASgJEg8KB2NvbW1lbnQYAiABKAkSFQoN", "b3BlcmF0b3JfdXNlchgDIAEoCRIVCg1vcGVyYXRvcl9ub2RlGAQgASgJEhcK", "D29wZXJhdG9yX2RvbWFpbhgFIAEoCRIaChJvcGVyYXRvcl9mdWxsX25hbWUY", - "BiABKAkiNwoYUXVlcnlBY3RpdmVBbGFybXNDb21tYW5kEhsKE2FsYXJtX2Zp", - "bHRlcl9wcmVmaXgYASABKAki0gEKHUFja25vd2xlZGdlQWxhcm1CeU5hbWVD", - "b21tYW5kEhIKCmFsYXJtX25hbWUYASABKAkSFQoNcHJvdmlkZXJfbmFtZRgC", - "IAEoCRISCgpncm91cF9uYW1lGAMgASgJEg8KB2NvbW1lbnQYBCABKAkSFQoN", - "b3BlcmF0b3JfdXNlchgFIAEoCRIVCg1vcGVyYXRvcl9ub2RlGAYgASgJEhcK", - "D29wZXJhdG9yX2RvbWFpbhgHIAEoCRIaChJvcGVyYXRvcl9mdWxsX25hbWUY", - "CCABKAkiRQoWVW5zdWJzY3JpYmVCdWxrQ29tbWFuZBIVCg1zZXJ2ZXJfaGFu", - "ZGxlGAEgASgFEhQKDGl0ZW1faGFuZGxlcxgCIAMoBSJfChBXcml0ZUJ1bGtD", - "b21tYW5kEhUKDXNlcnZlcl9oYW5kbGUYASABKAUSNAoHZW50cmllcxgCIAMo", - "CzIjLm14YWNjZXNzX2dhdGV3YXkudjEuV3JpdGVCdWxrRW50cnkiYwoOV3Jp", - "dGVCdWxrRW50cnkSEwoLaXRlbV9oYW5kbGUYASABKAUSKwoFdmFsdWUYAiAB", - "KAsyHC5teGFjY2Vzc19nYXRld2F5LnYxLk14VmFsdWUSDwoHdXNlcl9pZBgD", - "IAEoBSJhChFXcml0ZTJCdWxrQ29tbWFuZBIVCg1zZXJ2ZXJfaGFuZGxlGAEg", - "ASgFEjUKB2VudHJpZXMYAiADKAsyJC5teGFjY2Vzc19nYXRld2F5LnYxLldy", - "aXRlMkJ1bGtFbnRyeSKbAQoPV3JpdGUyQnVsa0VudHJ5EhMKC2l0ZW1faGFu", - "ZGxlGAEgASgFEisKBXZhbHVlGAIgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52", - "MS5NeFZhbHVlEjUKD3RpbWVzdGFtcF92YWx1ZRgDIAEoCzIcLm14YWNjZXNz", - "X2dhdGV3YXkudjEuTXhWYWx1ZRIPCgd1c2VyX2lkGAQgASgFIm0KF1dyaXRl", - "U2VjdXJlZEJ1bGtDb21tYW5kEhUKDXNlcnZlcl9oYW5kbGUYASABKAUSOwoH", - "ZW50cmllcxgCIAMoCzIqLm14YWNjZXNzX2dhdGV3YXkudjEuV3JpdGVTZWN1", - "cmVkQnVsa0VudHJ5IowBChVXcml0ZVNlY3VyZWRCdWxrRW50cnkSEwoLaXRl", - "bV9oYW5kbGUYASABKAUSFwoPY3VycmVudF91c2VyX2lkGAIgASgFEhgKEHZl", - "cmlmaWVyX3VzZXJfaWQYAyABKAUSKwoFdmFsdWUYBCABKAsyHC5teGFjY2Vz", - "c19nYXRld2F5LnYxLk14VmFsdWUibwoYV3JpdGVTZWN1cmVkMkJ1bGtDb21t", - "YW5kEhUKDXNlcnZlcl9oYW5kbGUYASABKAUSPAoHZW50cmllcxgCIAMoCzIr", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuV3JpdGVTZWN1cmVkMkJ1bGtFbnRyeSLE", - "AQoWV3JpdGVTZWN1cmVkMkJ1bGtFbnRyeRITCgtpdGVtX2hhbmRsZRgBIAEo", - "BRIXCg9jdXJyZW50X3VzZXJfaWQYAiABKAUSGAoQdmVyaWZpZXJfdXNlcl9p", - "ZBgDIAEoBRIrCgV2YWx1ZRgEIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEu", - "TXhWYWx1ZRI1Cg90aW1lc3RhbXBfdmFsdWUYBSABKAsyHC5teGFjY2Vzc19n", - "YXRld2F5LnYxLk14VmFsdWUiUwoPUmVhZEJ1bGtDb21tYW5kEhUKDXNlcnZl", - "cl9oYW5kbGUYASABKAUSFQoNdGFnX2FkZHJlc3NlcxgCIAMoCRISCgp0aW1l", - "b3V0X21zGAMgASgNIh4KC1BpbmdDb21tYW5kEg8KB21lc3NhZ2UYASABKAki", - "GAoWR2V0U2Vzc2lvblN0YXRlQ29tbWFuZCIWChRHZXRXb3JrZXJJbmZvQ29t", - "bWFuZCIoChJEcmFpbkV2ZW50c0NvbW1hbmQSEgoKbWF4X2V2ZW50cxgBIAEo", - "DSJIChVTaHV0ZG93bldvcmtlckNvbW1hbmQSLwoMZ3JhY2VfcGVyaW9kGAEg", - "ASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIoYPCg5NeENvbW1hbmRS", - "ZXBseRISCgpzZXNzaW9uX2lkGAEgASgJEhYKDmNvcnJlbGF0aW9uX2lkGAIg", - "ASgJEjAKBGtpbmQYAyABKA4yIi5teGFjY2Vzc19nYXRld2F5LnYxLk14Q29t", - "bWFuZEtpbmQSPAoPcHJvdG9jb2xfc3RhdHVzGAQgASgLMiMubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5Qcm90b2NvbFN0YXR1cxIUCgdocmVzdWx0GAUgASgFSAGI", - "AQESMgoMcmV0dXJuX3ZhbHVlGAYgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52", - "MS5NeFZhbHVlEjQKCHN0YXR1c2VzGAcgAygLMiIubXhhY2Nlc3NfZ2F0ZXdh", - "eS52MS5NeFN0YXR1c1Byb3h5EhoKEmRpYWdub3N0aWNfbWVzc2FnZRgIIAEo", - "CRI2CghyZWdpc3RlchgUIAEoCzIiLm14YWNjZXNzX2dhdGV3YXkudjEuUmVn", - "aXN0ZXJSZXBseUgAEjUKCGFkZF9pdGVtGBUgASgLMiEubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5BZGRJdGVtUmVwbHlIABI3CglhZGRfaXRlbTIYFiABKAsyIi5t", - "eGFjY2Vzc19nYXRld2F5LnYxLkFkZEl0ZW0yUmVwbHlIABJGChFhZGRfYnVm", - "ZmVyZWRfaXRlbRgXIAEoCzIpLm14YWNjZXNzX2dhdGV3YXkudjEuQWRkQnVm", - "ZmVyZWRJdGVtUmVwbHlIABI0CgdzdXNwZW5kGBggASgLMiEubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5TdXNwZW5kUmVwbHlIABI2CghhY3RpdmF0ZRgZIAEoCzIi", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuQWN0aXZhdGVSZXBseUgAEkcKEWF1dGhl", - "bnRpY2F0ZV91c2VyGBogASgLMioubXhhY2Nlc3NfZ2F0ZXdheS52MS5BdXRo", - "ZW50aWNhdGVVc2VyUmVwbHlIABJLChRhcmNoZXN0cmFfdXNlcl90b19pZBgb", - "IAEoCzIrLm14YWNjZXNzX2dhdGV3YXkudjEuQXJjaGVzdHJBVXNlclRvSWRS", - "ZXBseUgAEkAKDWFkZF9pdGVtX2J1bGsYHCABKAsyJy5teGFjY2Vzc19nYXRl", - "d2F5LnYxLkJ1bGtTdWJzY3JpYmVSZXBseUgAEkMKEGFkdmlzZV9pdGVtX2J1", - "bGsYHSABKAsyJy5teGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtTdWJzY3JpYmVS", - "ZXBseUgAEkMKEHJlbW92ZV9pdGVtX2J1bGsYHiABKAsyJy5teGFjY2Vzc19n", - "YXRld2F5LnYxLkJ1bGtTdWJzY3JpYmVSZXBseUgAEkYKE3VuX2FkdmlzZV9p", - "dGVtX2J1bGsYHyABKAsyJy5teGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtTdWJz", - "Y3JpYmVSZXBseUgAEkEKDnN1YnNjcmliZV9idWxrGCAgASgLMicubXhhY2Nl", - "c3NfZ2F0ZXdheS52MS5CdWxrU3Vic2NyaWJlUmVwbHlIABJDChB1bnN1YnNj", - "cmliZV9idWxrGCEgASgLMicubXhhY2Nlc3NfZ2F0ZXdheS52MS5CdWxrU3Vi", - "c2NyaWJlUmVwbHlIABJOChFhY2tub3dsZWRnZV9hbGFybRgiIAEoCzIxLm14", - "YWNjZXNzX2dhdGV3YXkudjEuQWNrbm93bGVkZ2VBbGFybVJlcGx5UGF5bG9h", - "ZEgAElEKE3F1ZXJ5X2FjdGl2ZV9hbGFybXMYIyABKAsyMi5teGFjY2Vzc19n", - "YXRld2F5LnYxLlF1ZXJ5QWN0aXZlQWxhcm1zUmVwbHlQYXlsb2FkSAASOQoK", - "d3JpdGVfYnVsaxgkIAEoCzIjLm14YWNjZXNzX2dhdGV3YXkudjEuQnVsa1dy", - "aXRlUmVwbHlIABI6Cgt3cml0ZTJfYnVsaxglIAEoCzIjLm14YWNjZXNzX2dh", - "dGV3YXkudjEuQnVsa1dyaXRlUmVwbHlIABJBChJ3cml0ZV9zZWN1cmVkX2J1", - "bGsYJiABKAsyIy5teGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtXcml0ZVJlcGx5", - "SAASQgoTd3JpdGVfc2VjdXJlZDJfYnVsaxgnIAEoCzIjLm14YWNjZXNzX2dh", - "dGV3YXkudjEuQnVsa1dyaXRlUmVwbHlIABI3CglyZWFkX2J1bGsYKCABKAsy", - "Ii5teGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtSZWFkUmVwbHlIABI/Cg1zZXNz", - "aW9uX3N0YXRlGGQgASgLMiYubXhhY2Nlc3NfZ2F0ZXdheS52MS5TZXNzaW9u", - "U3RhdGVSZXBseUgAEjsKC3dvcmtlcl9pbmZvGGUgASgLMiQubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5Xb3JrZXJJbmZvUmVwbHlIABI9CgxkcmFpbl9ldmVudHMY", - "ZiABKAsyJS5teGFjY2Vzc19nYXRld2F5LnYxLkRyYWluRXZlbnRzUmVwbHlI", - "AEIJCgdwYXlsb2FkQgoKCF9ocmVzdWx0IiYKDVJlZ2lzdGVyUmVwbHkSFQoN", - "c2VydmVyX2hhbmRsZRgBIAEoBSIjCgxBZGRJdGVtUmVwbHkSEwoLaXRlbV9o", - "YW5kbGUYASABKAUiJAoNQWRkSXRlbTJSZXBseRITCgtpdGVtX2hhbmRsZRgB", - "IAEoBSIrChRBZGRCdWZmZXJlZEl0ZW1SZXBseRITCgtpdGVtX2hhbmRsZRgB", - "IAEoBSJCCgxTdXNwZW5kUmVwbHkSMgoGc3RhdHVzGAEgASgLMiIubXhhY2Nl", - "c3NfZ2F0ZXdheS52MS5NeFN0YXR1c1Byb3h5IkMKDUFjdGl2YXRlUmVwbHkS", - "MgoGc3RhdHVzGAEgASgLMiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1", - "c1Byb3h5IigKFUF1dGhlbnRpY2F0ZVVzZXJSZXBseRIPCgd1c2VyX2lkGAEg", - "ASgFIikKFkFyY2hlc3RyQVVzZXJUb0lkUmVwbHkSDwoHdXNlcl9pZBgBIAEo", - "BSKBAQoPU3Vic2NyaWJlUmVzdWx0EhUKDXNlcnZlcl9oYW5kbGUYASABKAUS", - "EwoLdGFnX2FkZHJlc3MYAiABKAkSEwoLaXRlbV9oYW5kbGUYAyABKAUSFgoO", - "d2FzX3N1Y2Nlc3NmdWwYBCABKAgSFQoNZXJyb3JfbWVzc2FnZRgFIAEoCSJL", - "ChJCdWxrU3Vic2NyaWJlUmVwbHkSNQoHcmVzdWx0cxgBIAMoCzIkLm14YWNj", - "ZXNzX2dhdGV3YXkudjEuU3Vic2NyaWJlUmVzdWx0IsQBCg9CdWxrV3JpdGVS", - "ZXN1bHQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRITCgtpdGVtX2hhbmRsZRgC", - "IAEoBRIWCg53YXNfc3VjY2Vzc2Z1bBgDIAEoCBIUCgdocmVzdWx0GAQgASgF", - "SACIAQESNAoIc3RhdHVzZXMYBSADKAsyIi5teGFjY2Vzc19nYXRld2F5LnYx", - "Lk14U3RhdHVzUHJveHkSFQoNZXJyb3JfbWVzc2FnZRgGIAEoCUIKCghfaHJl", - "c3VsdCJHCg5CdWxrV3JpdGVSZXBseRI1CgdyZXN1bHRzGAEgAygLMiQubXhh", - "Y2Nlc3NfZ2F0ZXdheS52MS5CdWxrV3JpdGVSZXN1bHQivgIKDkJ1bGtSZWFk", - "UmVzdWx0EhUKDXNlcnZlcl9oYW5kbGUYASABKAUSEwoLdGFnX2FkZHJlc3MY", - "AiABKAkSEwoLaXRlbV9oYW5kbGUYAyABKAUSFgoOd2FzX3N1Y2Nlc3NmdWwY", - "BCABKAgSEgoKd2FzX2NhY2hlZBgFIAEoCBIrCgV2YWx1ZRgGIAEoCzIcLm14", - "YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIPCgdxdWFsaXR5GAcgASgFEjQK", - "EHNvdXJjZV90aW1lc3RhbXAYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGlt", - "ZXN0YW1wEjQKCHN0YXR1c2VzGAkgAygLMiIubXhhY2Nlc3NfZ2F0ZXdheS52", - "MS5NeFN0YXR1c1Byb3h5EhUKDWVycm9yX21lc3NhZ2UYCiABKAkiRQoNQnVs", - "a1JlYWRSZXBseRI0CgdyZXN1bHRzGAEgAygLMiMubXhhY2Nlc3NfZ2F0ZXdh", - "eS52MS5CdWxrUmVhZFJlc3VsdCJFChFTZXNzaW9uU3RhdGVSZXBseRIwCgVz", - "dGF0ZRgBIAEoDjIhLm14YWNjZXNzX2dhdGV3YXkudjEuU2Vzc2lvblN0YXRl", - "InUKD1dvcmtlckluZm9SZXBseRIZChF3b3JrZXJfcHJvY2Vzc19pZBgBIAEo", - "BRIWCg53b3JrZXJfdmVyc2lvbhgCIAEoCRIXCg9teGFjY2Vzc19wcm9naWQY", - "AyABKAkSFgoObXhhY2Nlc3NfY2xzaWQYBCABKAkiQAoQRHJhaW5FdmVudHNS", - "ZXBseRIsCgZldmVudHMYASADKAsyHC5teGFjY2Vzc19nYXRld2F5LnYxLk14", - "RXZlbnQiNQocQWNrbm93bGVkZ2VBbGFybVJlcGx5UGF5bG9hZBIVCg1uYXRp", - "dmVfc3RhdHVzGAEgASgFIngKHVF1ZXJ5QWN0aXZlQWxhcm1zUmVwbHlQYXls", - "b2FkEjsKCXNuYXBzaG90cxgBIAMoCzIoLm14YWNjZXNzX2dhdGV3YXkudjEu", - "QWN0aXZlQWxhcm1TbmFwc2hvdBIaChJzbmFwc2hvdF90cnVuY2F0ZWQYAiAB", - "KAgijwgKB014RXZlbnQSMgoGZmFtaWx5GAEgASgOMiIubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5NeEV2ZW50RmFtaWx5EhIKCnNlc3Npb25faWQYAiABKAkSFQoN", - "c2VydmVyX2hhbmRsZRgDIAEoBRITCgtpdGVtX2hhbmRsZRgEIAEoBRIrCgV2", - "YWx1ZRgFIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIPCgdx", - "dWFsaXR5GAYgASgFEjQKEHNvdXJjZV90aW1lc3RhbXAYByABKAsyGi5nb29n", - "bGUucHJvdG9idWYuVGltZXN0YW1wEjQKCHN0YXR1c2VzGAggAygLMiIubXhh", - "Y2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1c1Byb3h5EhcKD3dvcmtlcl9zZXF1", - "ZW5jZRgJIAEoBBI0ChB3b3JrZXJfdGltZXN0YW1wGAogASgLMhouZ29vZ2xl", - "LnByb3RvYnVmLlRpbWVzdGFtcBI9ChlnYXRld2F5X3JlY2VpdmVfdGltZXN0", - "YW1wGAsgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIUCgdocmVz", - "dWx0GAwgASgFSAGIAQESEgoKcmF3X3N0YXR1cxgNIAEoCRI3CgpyZXBsYXlf", - "Z2FwGA4gASgLMh4ubXhhY2Nlc3NfZ2F0ZXdheS52MS5SZXBsYXlHYXBIAogB", - "ARJACg5vbl9kYXRhX2NoYW5nZRgUIAEoCzImLm14YWNjZXNzX2dhdGV3YXku", - "djEuT25EYXRhQ2hhbmdlRXZlbnRIABJGChFvbl93cml0ZV9jb21wbGV0ZRgV", - "IAEoCzIpLm14YWNjZXNzX2dhdGV3YXkudjEuT25Xcml0ZUNvbXBsZXRlRXZl", - "bnRIABJJChJvcGVyYXRpb25fY29tcGxldGUYFiABKAsyKy5teGFjY2Vzc19n", - "YXRld2F5LnYxLk9wZXJhdGlvbkNvbXBsZXRlRXZlbnRIABJRChdvbl9idWZm", - "ZXJlZF9kYXRhX2NoYW5nZRgXIAEoCzIuLm14YWNjZXNzX2dhdGV3YXkudjEu", - "T25CdWZmZXJlZERhdGFDaGFuZ2VFdmVudEgAEkoKE29uX2FsYXJtX3RyYW5z", - "aXRpb24YGCABKAsyKy5teGFjY2Vzc19nYXRld2F5LnYxLk9uQWxhcm1UcmFu", - "c2l0aW9uRXZlbnRIABJeCh5vbl9hbGFybV9wcm92aWRlcl9tb2RlX2NoYW5n", - "ZWQYGSABKAsyNC5teGFjY2Vzc19nYXRld2F5LnYxLk9uQWxhcm1Qcm92aWRl", - "ck1vZGVDaGFuZ2VkRXZlbnRIAEIGCgRib2R5QgoKCF9ocmVzdWx0Qg0KC19y", - "ZXBsYXlfZ2FwIlAKCVJlcGxheUdhcBIgChhyZXF1ZXN0ZWRfYWZ0ZXJfc2Vx", - "dWVuY2UYASABKAQSIQoZb2xkZXN0X2F2YWlsYWJsZV9zZXF1ZW5jZRgCIAEo", - "BCITChFPbkRhdGFDaGFuZ2VFdmVudCIWChRPbldyaXRlQ29tcGxldGVFdmVu", - "dCIYChZPcGVyYXRpb25Db21wbGV0ZUV2ZW50ItQBChlPbkJ1ZmZlcmVkRGF0", - "YUNoYW5nZUV2ZW50EjIKCWRhdGFfdHlwZRgBIAEoDjIfLm14YWNjZXNzX2dh", - "dGV3YXkudjEuTXhEYXRhVHlwZRI0Cg5xdWFsaXR5X3ZhbHVlcxgCIAEoCzIc", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuTXhBcnJheRI2ChB0aW1lc3RhbXBfdmFs", - "dWVzGAMgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEFycmF5EhUKDXJh", - "d19kYXRhX3R5cGUYBCABKAUi0AQKFk9uQWxhcm1UcmFuc2l0aW9uRXZlbnQS", - "HAoUYWxhcm1fZnVsbF9yZWZlcmVuY2UYASABKAkSHwoXc291cmNlX29iamVj", - "dF9yZWZlcmVuY2UYAiABKAkSFwoPYWxhcm1fdHlwZV9uYW1lGAMgASgJEkEK", - "D3RyYW5zaXRpb25fa2luZBgEIAEoDjIoLm14YWNjZXNzX2dhdGV3YXkudjEu", - "QWxhcm1UcmFuc2l0aW9uS2luZBIQCghzZXZlcml0eRgFIAEoBRI8Chhvcmln", - "aW5hbF9yYWlzZV90aW1lc3RhbXAYBiABKAsyGi5nb29nbGUucHJvdG9idWYu", - "VGltZXN0YW1wEjgKFHRyYW5zaXRpb25fdGltZXN0YW1wGAcgASgLMhouZ29v", - "Z2xlLnByb3RvYnVmLlRpbWVzdGFtcBIVCg1vcGVyYXRvcl91c2VyGAggASgJ", - "EhgKEG9wZXJhdG9yX2NvbW1lbnQYCSABKAkSEAoIY2F0ZWdvcnkYCiABKAkS", - "EwoLZGVzY3JpcHRpb24YCyABKAkSMwoNY3VycmVudF92YWx1ZRgMIAEoCzIc", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIxCgtsaW1pdF92YWx1ZRgN", - "IAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIQCghkZWdyYWRl", - "ZBgOIAEoCBI/Cg9zb3VyY2VfcHJvdmlkZXIYDyABKA4yJi5teGFjY2Vzc19n", - "YXRld2F5LnYxLkFsYXJtUHJvdmlkZXJNb2RlIqABCh9PbkFsYXJtUHJvdmlk", - "ZXJNb2RlQ2hhbmdlZEV2ZW50EjQKBG1vZGUYASABKA4yJi5teGFjY2Vzc19n", - "YXRld2F5LnYxLkFsYXJtUHJvdmlkZXJNb2RlEg4KBnJlYXNvbhgCIAEoCRIP", - "CgdocmVzdWx0GAMgASgFEiYKAmF0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVm", - "LlRpbWVzdGFtcCLxBAoTQWN0aXZlQWxhcm1TbmFwc2hvdBIcChRhbGFybV9m", - "dWxsX3JlZmVyZW5jZRgBIAEoCRIfChdzb3VyY2Vfb2JqZWN0X3JlZmVyZW5j", - "ZRgCIAEoCRIXCg9hbGFybV90eXBlX25hbWUYAyABKAkSEAoIc2V2ZXJpdHkY", - "BCABKAUSPAoYb3JpZ2luYWxfcmFpc2VfdGltZXN0YW1wGAUgASgLMhouZ29v", - "Z2xlLnByb3RvYnVmLlRpbWVzdGFtcBI/Cg1jdXJyZW50X3N0YXRlGAYgASgO", - "MigubXhhY2Nlc3NfZ2F0ZXdheS52MS5BbGFybUNvbmRpdGlvblN0YXRlEhAK", - "CGNhdGVnb3J5GAcgASgJEhMKC2Rlc2NyaXB0aW9uGAggASgJEj0KGWxhc3Rf", - "dHJhbnNpdGlvbl90aW1lc3RhbXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYu", - "VGltZXN0YW1wEhUKDW9wZXJhdG9yX3VzZXIYCiABKAkSGAoQb3BlcmF0b3Jf", - "Y29tbWVudBgLIAEoCRIzCg1jdXJyZW50X3ZhbHVlGAwgASgLMhwubXhhY2Nl", - "c3NfZ2F0ZXdheS52MS5NeFZhbHVlEjEKC2xpbWl0X3ZhbHVlGA0gASgLMhwu", - "bXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZhbHVlEhAKCGRlZ3JhZGVkGA4gASgI", - "Ej8KD3NvdXJjZV9wcm92aWRlchgPIAEoDjImLm14YWNjZXNzX2dhdGV3YXku", - "djEuQWxhcm1Qcm92aWRlck1vZGUSHwoXZnJvbV90cnVuY2F0ZWRfc25hcHNo", - "b3QYECABKAgikAEKF0Fja25vd2xlZGdlQWxhcm1SZXF1ZXN0Eh0KFWNsaWVu", - "dF9jb3JyZWxhdGlvbl9pZBgCIAEoCRIcChRhbGFybV9mdWxsX3JlZmVyZW5j", - "ZRgDIAEoCRIPCgdjb21tZW50GAQgASgJEhUKDW9wZXJhdG9yX3VzZXIYBSAB", - "KAlKBAgBEAJSCnNlc3Npb25faWQi8QEKFUFja25vd2xlZGdlQWxhcm1SZXBs", - "eRIWCg5jb3JyZWxhdGlvbl9pZBgCIAEoCRI8Cg9wcm90b2NvbF9zdGF0dXMY", - "AyABKAsyIy5teGFjY2Vzc19nYXRld2F5LnYxLlByb3RvY29sU3RhdHVzEhQK", - "B2hyZXN1bHQYBCABKAVIAIgBARIyCgZzdGF0dXMYBSABKAsyIi5teGFjY2Vz", - "c19nYXRld2F5LnYxLk14U3RhdHVzUHJveHkSGgoSZGlhZ25vc3RpY19tZXNz", - "YWdlGAYgASgJQgoKCF9ocmVzdWx0SgQIARACUgpzZXNzaW9uX2lkIlEKE1N0", - "cmVhbUFsYXJtc1JlcXVlc3QSHQoVY2xpZW50X2NvcnJlbGF0aW9uX2lkGAEg", - "ASgJEhsKE2FsYXJtX2ZpbHRlcl9wcmVmaXgYAiABKAkiyQIKEEFsYXJtRmVl", - "ZE1lc3NhZ2USQAoMYWN0aXZlX2FsYXJtGAEgASgLMigubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5BY3RpdmVBbGFybVNuYXBzaG90SAASGwoRc25hcHNob3RfY29t", - "cGxldGUYAiABKAhIABJBCgp0cmFuc2l0aW9uGAMgASgLMisubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5PbkFsYXJtVHJhbnNpdGlvbkV2ZW50SAASQwoPcHJvdmlk", - "ZXJfc3RhdHVzGAQgASgLMigubXhhY2Nlc3NfZ2F0ZXdheS52MS5BbGFybVBy", - "b3ZpZGVyU3RhdHVzSAASQwoPc25hcHNob3Rfc3RhdHVzGAUgASgLMigubXhh", - "Y2Nlc3NfZ2F0ZXdheS52MS5BbGFybVNuYXBzaG90U3RhdHVzSABCCQoHcGF5", - "bG9hZCKYAQoTQWxhcm1Qcm92aWRlclN0YXR1cxI0CgRtb2RlGAEgASgOMiYu", - "bXhhY2Nlc3NfZ2F0ZXdheS52MS5BbGFybVByb3ZpZGVyTW9kZRIQCghkZWdy", - "YWRlZBgCIAEoCBIOCgZyZWFzb24YAyABKAkSKQoFc2luY2UYBCABKAsyGi5n", - "b29nbGUucHJvdG9idWYuVGltZXN0YW1wIigKE0FsYXJtU25hcHNob3RTdGF0", - "dXMSEQoJdHJ1bmNhdGVkGAEgASgIIusBCg1NeFN0YXR1c1Byb3h5Eg8KB3N1", - "Y2Nlc3MYASABKAUSNwoIY2F0ZWdvcnkYAiABKA4yJS5teGFjY2Vzc19nYXRl", - "d2F5LnYxLk14U3RhdHVzQ2F0ZWdvcnkSOAoLZGV0ZWN0ZWRfYnkYAyABKA4y", - "Iy5teGFjY2Vzc19nYXRld2F5LnYxLk14U3RhdHVzU291cmNlEg4KBmRldGFp", - "bBgEIAEoBRIUCgxyYXdfY2F0ZWdvcnkYBSABKAUSFwoPcmF3X2RldGVjdGVk", - "X2J5GAYgASgFEhcKD2RpYWdub3N0aWNfdGV4dBgHIAEoCSLpAwoHTXhWYWx1", - "ZRIyCglkYXRhX3R5cGUYASABKA4yHy5teGFjY2Vzc19nYXRld2F5LnYxLk14", - "RGF0YVR5cGUSFAoMdmFyaWFudF90eXBlGAIgASgJEg8KB2lzX251bGwYAyAB", - "KAgSFgoOcmF3X2RpYWdub3N0aWMYBCABKAkSFQoNcmF3X2RhdGFfdHlwZRgF", - "IAEoBRIUCgpib29sX3ZhbHVlGAogASgISAASFQoLaW50MzJfdmFsdWUYCyAB", - "KAVIABIVCgtpbnQ2NF92YWx1ZRgMIAEoA0gAEhUKC2Zsb2F0X3ZhbHVlGA0g", - "ASgCSAASFgoMZG91YmxlX3ZhbHVlGA4gASgBSAASFgoMc3RyaW5nX3ZhbHVl", - "GA8gASgJSAASNQoPdGltZXN0YW1wX3ZhbHVlGBAgASgLMhouZ29vZ2xlLnBy", - "b3RvYnVmLlRpbWVzdGFtcEgAEjMKC2FycmF5X3ZhbHVlGBEgASgLMhwubXhh", - "Y2Nlc3NfZ2F0ZXdheS52MS5NeEFycmF5SAASEwoJcmF3X3ZhbHVlGBIgASgM", - "SAASQAoSc3BhcnNlX2FycmF5X3ZhbHVlGBMgASgLMiIubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5NeFNwYXJzZUFycmF5SABCBgoEa2luZCL+BAoHTXhBcnJheRI6", - "ChFlbGVtZW50X2RhdGFfdHlwZRgBIAEoDjIfLm14YWNjZXNzX2dhdGV3YXku", - "djEuTXhEYXRhVHlwZRIUCgx2YXJpYW50X3R5cGUYAiABKAkSEgoKZGltZW5z", - "aW9ucxgDIAMoDRIWCg5yYXdfZGlhZ25vc3RpYxgEIAEoCRIdChVyYXdfZWxl", - "bWVudF9kYXRhX3R5cGUYBSABKAUSNQoLYm9vbF92YWx1ZXMYCiABKAsyHi5t", - "eGFjY2Vzc19nYXRld2F5LnYxLkJvb2xBcnJheUgAEjcKDGludDMyX3ZhbHVl", - "cxgLIAEoCzIfLm14YWNjZXNzX2dhdGV3YXkudjEuSW50MzJBcnJheUgAEjcK", - "DGludDY0X3ZhbHVlcxgMIAEoCzIfLm14YWNjZXNzX2dhdGV3YXkudjEuSW50", - "NjRBcnJheUgAEjcKDGZsb2F0X3ZhbHVlcxgNIAEoCzIfLm14YWNjZXNzX2dh", - "dGV3YXkudjEuRmxvYXRBcnJheUgAEjkKDWRvdWJsZV92YWx1ZXMYDiABKAsy", - "IC5teGFjY2Vzc19nYXRld2F5LnYxLkRvdWJsZUFycmF5SAASOQoNc3RyaW5n", - "X3ZhbHVlcxgPIAEoCzIgLm14YWNjZXNzX2dhdGV3YXkudjEuU3RyaW5nQXJy", - "YXlIABI/ChB0aW1lc3RhbXBfdmFsdWVzGBAgASgLMiMubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5UaW1lc3RhbXBBcnJheUgAEjMKCnJhd192YWx1ZXMYESABKAsy", - "HS5teGFjY2Vzc19nYXRld2F5LnYxLlJhd0FycmF5SABCCAoGdmFsdWVzIpkB", - "Cg1NeFNwYXJzZUFycmF5EjoKEWVsZW1lbnRfZGF0YV90eXBlGAEgASgOMh8u", - "bXhhY2Nlc3NfZ2F0ZXdheS52MS5NeERhdGFUeXBlEhQKDHRvdGFsX2xlbmd0", - "aBgCIAEoDRI2CghlbGVtZW50cxgDIAMoCzIkLm14YWNjZXNzX2dhdGV3YXku", - "djEuTXhTcGFyc2VFbGVtZW50Ik0KD014U3BhcnNlRWxlbWVudBINCgVpbmRl", - "eBgBIAEoDRIrCgV2YWx1ZRgCIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEu", - "TXhWYWx1ZSIbCglCb29sQXJyYXkSDgoGdmFsdWVzGAEgAygIIhwKCkludDMy", - "QXJyYXkSDgoGdmFsdWVzGAEgAygFIhwKCkludDY0QXJyYXkSDgoGdmFsdWVz", - "GAEgAygDIhwKCkZsb2F0QXJyYXkSDgoGdmFsdWVzGAEgAygCIh0KC0RvdWJs", - "ZUFycmF5Eg4KBnZhbHVlcxgBIAMoASIdCgtTdHJpbmdBcnJheRIOCgZ2YWx1", - "ZXMYASADKAkiPAoOVGltZXN0YW1wQXJyYXkSKgoGdmFsdWVzGAEgAygLMhou", - "Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIaCghSYXdBcnJheRIOCgZ2YWx1", - "ZXMYASADKAwiWAoOUHJvdG9jb2xTdGF0dXMSNQoEY29kZRgBIAEoDjInLm14", - "YWNjZXNzX2dhdGV3YXkudjEuUHJvdG9jb2xTdGF0dXNDb2RlEg8KB21lc3Nh", - "Z2UYAiABKAkqzAsKDU14Q29tbWFuZEtpbmQSHwobTVhfQ09NTUFORF9LSU5E", - "X1VOU1BFQ0lGSUVEEAASHAoYTVhfQ09NTUFORF9LSU5EX1JFR0lTVEVSEAES", - "HgoaTVhfQ09NTUFORF9LSU5EX1VOUkVHSVNURVIQAhIcChhNWF9DT01NQU5E", - "X0tJTkRfQUREX0lURU0QAxIdChlNWF9DT01NQU5EX0tJTkRfQUREX0lURU0y", - "EAQSHwobTVhfQ09NTUFORF9LSU5EX1JFTU9WRV9JVEVNEAUSGgoWTVhfQ09N", - "TUFORF9LSU5EX0FEVklTRRAGEh0KGU1YX0NPTU1BTkRfS0lORF9VTl9BRFZJ", - "U0UQBxImCiJNWF9DT01NQU5EX0tJTkRfQURWSVNFX1NVUEVSVklTT1JZEAgS", - "JQohTVhfQ09NTUFORF9LSU5EX0FERF9CVUZGRVJFRF9JVEVNEAkSMAosTVhf", - "Q09NTUFORF9LSU5EX1NFVF9CVUZGRVJFRF9VUERBVEVfSU5URVJWQUwQChIb", - "ChdNWF9DT01NQU5EX0tJTkRfU1VTUEVORBALEhwKGE1YX0NPTU1BTkRfS0lO", - "RF9BQ1RJVkFURRAMEhkKFU1YX0NPTU1BTkRfS0lORF9XUklURRANEhoKFk1Y", - "X0NPTU1BTkRfS0lORF9XUklURTIQDhIhCh1NWF9DT01NQU5EX0tJTkRfV1JJ", - "VEVfU0VDVVJFRBAPEiIKHk1YX0NPTU1BTkRfS0lORF9XUklURV9TRUNVUkVE", - "MhAQEiUKIU1YX0NPTU1BTkRfS0lORF9BVVRIRU5USUNBVEVfVVNFUhAREigK", - "JE1YX0NPTU1BTkRfS0lORF9BUkNIRVNUUkFfVVNFUl9UT19JRBASEiEKHU1Y", - "X0NPTU1BTkRfS0lORF9BRERfSVRFTV9CVUxLEBMSJAogTVhfQ09NTUFORF9L", - "SU5EX0FEVklTRV9JVEVNX0JVTEsQFBIkCiBNWF9DT01NQU5EX0tJTkRfUkVN", - "T1ZFX0lURU1fQlVMSxAVEicKI01YX0NPTU1BTkRfS0lORF9VTl9BRFZJU0Vf", - "SVRFTV9CVUxLEBYSIgoeTVhfQ09NTUFORF9LSU5EX1NVQlNDUklCRV9CVUxL", - "EBcSJAogTVhfQ09NTUFORF9LSU5EX1VOU1VCU0NSSUJFX0JVTEsQGBIkCiBN", - "WF9DT01NQU5EX0tJTkRfU1VCU0NSSUJFX0FMQVJNUxAZEiYKIk1YX0NPTU1B", - "TkRfS0lORF9VTlNVQlNDUklCRV9BTEFSTVMQGhIlCiFNWF9DT01NQU5EX0tJ", - "TkRfQUNLTk9XTEVER0VfQUxBUk0QGxInCiNNWF9DT01NQU5EX0tJTkRfUVVF", - "UllfQUNUSVZFX0FMQVJNUxAcEi0KKU1YX0NPTU1BTkRfS0lORF9BQ0tOT1dM", - "RURHRV9BTEFSTV9CWV9OQU1FEB0SHgoaTVhfQ09NTUFORF9LSU5EX1dSSVRF", - "X0JVTEsQHhIfChtNWF9DT01NQU5EX0tJTkRfV1JJVEUyX0JVTEsQHxImCiJN", - "WF9DT01NQU5EX0tJTkRfV1JJVEVfU0VDVVJFRF9CVUxLECASJwojTVhfQ09N", - "TUFORF9LSU5EX1dSSVRFX1NFQ1VSRUQyX0JVTEsQIRIdChlNWF9DT01NQU5E", - "X0tJTkRfUkVBRF9CVUxLECISKwonTVhfQ09NTUFORF9LSU5EX1VQREFURV9B", - "TEFSTV9XQVRDSF9MSVNUECMSGAoUTVhfQ09NTUFORF9LSU5EX1BJTkcQZBIl", - "CiFNWF9DT01NQU5EX0tJTkRfR0VUX1NFU1NJT05fU1RBVEUQZRIjCh9NWF9D", - "T01NQU5EX0tJTkRfR0VUX1dPUktFUl9JTkZPEGYSIAocTVhfQ09NTUFORF9L", - "SU5EX0RSQUlOX0VWRU5UUxBnEiMKH01YX0NPTU1BTkRfS0lORF9TSFVURE9X", - "Tl9XT1JLRVIQaCp6ChFBbGFybVByb3ZpZGVyTW9kZRIjCh9BTEFSTV9QUk9W", - "SURFUl9NT0RFX1VOU1BFQ0lGSUVEEAASIAocQUxBUk1fUFJPVklERVJfTU9E", - "RV9BTEFSTU1HUhABEh4KGkFMQVJNX1BST1ZJREVSX01PREVfU1VCVEFHEAIq", - "rQIKDU14RXZlbnRGYW1pbHkSHwobTVhfRVZFTlRfRkFNSUxZX1VOU1BFQ0lG", - "SUVEEAASIgoeTVhfRVZFTlRfRkFNSUxZX09OX0RBVEFfQ0hBTkdFEAESJQoh", - "TVhfRVZFTlRfRkFNSUxZX09OX1dSSVRFX0NPTVBMRVRFEAISJgoiTVhfRVZF", - "TlRfRkFNSUxZX09QRVJBVElPTl9DT01QTEVURRADEisKJ01YX0VWRU5UX0ZB", - "TUlMWV9PTl9CVUZGRVJFRF9EQVRBX0NIQU5HRRAEEicKI01YX0VWRU5UX0ZB", - "TUlMWV9PTl9BTEFSTV9UUkFOU0lUSU9OEAUSMgouTVhfRVZFTlRfRkFNSUxZ", - "X09OX0FMQVJNX1BST1ZJREVSX01PREVfQ0hBTkdFRBAGKsoBChNBbGFybVRy", - "YW5zaXRpb25LaW5kEiUKIUFMQVJNX1RSQU5TSVRJT05fS0lORF9VTlNQRUNJ", - "RklFRBAAEh8KG0FMQVJNX1RSQU5TSVRJT05fS0lORF9SQUlTRRABEiUKIUFM", - "QVJNX1RSQU5TSVRJT05fS0lORF9BQ0tOT1dMRURHRRACEh8KG0FMQVJNX1RS", - "QU5TSVRJT05fS0lORF9DTEVBUhADEiMKH0FMQVJNX1RSQU5TSVRJT05fS0lO", - "RF9SRVRSSUdHRVIQBCqqAQoTQWxhcm1Db25kaXRpb25TdGF0ZRIlCiFBTEFS", - "TV9DT05ESVRJT05fU1RBVEVfVU5TUEVDSUZJRUQQABIgChxBTEFSTV9DT05E", - "SVRJT05fU1RBVEVfQUNUSVZFEAESJgoiQUxBUk1fQ09ORElUSU9OX1NUQVRF", - "X0FDVElWRV9BQ0tFRBACEiIKHkFMQVJNX0NPTkRJVElPTl9TVEFURV9JTkFD", - "VElWRRADKqUDChBNeFN0YXR1c0NhdGVnb3J5EiIKHk1YX1NUQVRVU19DQVRF", - "R09SWV9VTlNQRUNJRklFRBAAEh4KGk1YX1NUQVRVU19DQVRFR09SWV9VTktO", - "T1dOEAESGQoVTVhfU1RBVFVTX0NBVEVHT1JZX09LEAISHgoaTVhfU1RBVFVT", - "X0NBVEVHT1JZX1BFTkRJTkcQAxIeChpNWF9TVEFUVVNfQ0FURUdPUllfV0FS", - "TklORxAEEioKJk1YX1NUQVRVU19DQVRFR09SWV9DT01NVU5JQ0FUSU9OX0VS", - "Uk9SEAUSKgomTVhfU1RBVFVTX0NBVEVHT1JZX0NPTkZJR1VSQVRJT05fRVJS", - "T1IQBhIoCiRNWF9TVEFUVVNfQ0FURUdPUllfT1BFUkFUSU9OQUxfRVJST1IQ", - "BxIlCiFNWF9TVEFUVVNfQ0FURUdPUllfU0VDVVJJVFlfRVJST1IQCBIlCiFN", - "WF9TVEFUVVNfQ0FURUdPUllfU09GVFdBUkVfRVJST1IQCRIiCh5NWF9TVEFU", - "VVNfQ0FURUdPUllfT1RIRVJfRVJST1IQCirKAgoOTXhTdGF0dXNTb3VyY2US", - "IAocTVhfU1RBVFVTX1NPVVJDRV9VTlNQRUNJRklFRBAAEhwKGE1YX1NUQVRV", - "U19TT1VSQ0VfVU5LTk9XThABEiMKH01YX1NUQVRVU19TT1VSQ0VfUkVRVUVT", - "VElOR19MTVgQAhIjCh9NWF9TVEFUVVNfU09VUkNFX1JFU1BPTkRJTkdfTE1Y", - "EAMSIwofTVhfU1RBVFVTX1NPVVJDRV9SRVFVRVNUSU5HX05NWBAEEiMKH01Y", - "X1NUQVRVU19TT1VSQ0VfUkVTUE9ORElOR19OTVgQBRIxCi1NWF9TVEFUVVNf", - "U09VUkNFX1JFUVVFU1RJTkdfQVVUT01BVElPTl9PQkpFQ1QQBhIxCi1NWF9T", - "VEFUVVNfU09VUkNFX1JFU1BPTkRJTkdfQVVUT01BVElPTl9PQkpFQ1QQByrd", - "BAoKTXhEYXRhVHlwZRIcChhNWF9EQVRBX1RZUEVfVU5TUEVDSUZJRUQQABIY", - "ChRNWF9EQVRBX1RZUEVfVU5LTk9XThABEhgKFE1YX0RBVEFfVFlQRV9OT19E", - "QVRBEAISGAoUTVhfREFUQV9UWVBFX0JPT0xFQU4QAxIYChRNWF9EQVRBX1RZ", - "UEVfSU5URUdFUhAEEhYKEk1YX0RBVEFfVFlQRV9GTE9BVBAFEhcKE01YX0RB", - "VEFfVFlQRV9ET1VCTEUQBhIXChNNWF9EQVRBX1RZUEVfU1RSSU5HEAcSFQoR", - "TVhfREFUQV9UWVBFX1RJTUUQCBIdChlNWF9EQVRBX1RZUEVfRUxBUFNFRF9U", - "SU1FEAkSHwobTVhfREFUQV9UWVBFX1JFRkVSRU5DRV9UWVBFEAoSHAoYTVhf", - "REFUQV9UWVBFX1NUQVRVU19UWVBFEAsSFQoRTVhfREFUQV9UWVBFX0VOVU0Q", - "DBItCilNWF9EQVRBX1RZUEVfU0VDVVJJVFlfQ0xBU1NJRklDQVRJT05fRU5V", - "TRANEiIKHk1YX0RBVEFfVFlQRV9EQVRBX1FVQUxJVFlfVFlQRRAOEh8KG01Y", - "X0RBVEFfVFlQRV9RVUFMSUZJRURfRU5VTRAPEiEKHU1YX0RBVEFfVFlQRV9R", - "VUFMSUZJRURfU1RSVUNUEBASKQolTVhfREFUQV9UWVBFX0lOVEVSTkFUSU9O", - "QUxJWkVEX1NUUklORxAREhsKF01YX0RBVEFfVFlQRV9CSUdfU1RSSU5HEBIS", - "FAoQTVhfREFUQV9UWVBFX0VORBATKqMDChJQcm90b2NvbFN0YXR1c0NvZGUS", - "JAogUFJPVE9DT0xfU1RBVFVTX0NPREVfVU5TUEVDSUZJRUQQABIbChdQUk9U", - "T0NPTF9TVEFUVVNfQ09ERV9PSxABEigKJFBST1RPQ09MX1NUQVRVU19DT0RF", - "X0lOVkFMSURfUkVRVUVTVBACEioKJlBST1RPQ09MX1NUQVRVU19DT0RFX1NF", - "U1NJT05fTk9UX0ZPVU5EEAMSKgomUFJPVE9DT0xfU1RBVFVTX0NPREVfU0VT", - "U0lPTl9OT1RfUkVBRFkQBBIrCidQUk9UT0NPTF9TVEFUVVNfQ09ERV9XT1JL", - "RVJfVU5BVkFJTEFCTEUQBRIgChxQUk9UT0NPTF9TVEFUVVNfQ09ERV9USU1F", - "T1VUEAYSIQodUFJPVE9DT0xfU1RBVFVTX0NPREVfQ0FOQ0VMRUQQBxIrCidQ", - "Uk9UT0NPTF9TVEFUVVNfQ09ERV9QUk9UT0NPTF9WSU9MQVRJT04QCBIpCiVQ", - "Uk9UT0NPTF9TVEFUVVNfQ09ERV9NWEFDQ0VTU19GQUlMVVJFEAkqvwIKDFNl", - "c3Npb25TdGF0ZRIdChlTRVNTSU9OX1NUQVRFX1VOU1BFQ0lGSUVEEAASGgoW", - "U0VTU0lPTl9TVEFURV9DUkVBVElORxABEiEKHVNFU1NJT05fU1RBVEVfU1RB", - "UlRJTkdfV09SS0VSEAISIgoeU0VTU0lPTl9TVEFURV9XQUlUSU5HX0ZPUl9Q", - "SVBFEAMSHQoZU0VTU0lPTl9TVEFURV9IQU5EU0hBS0lORxAEEiUKIVNFU1NJ", - "T05fU1RBVEVfSU5JVElBTElaSU5HX1dPUktFUhAFEhcKE1NFU1NJT05fU1RB", - "VEVfUkVBRFkQBhIZChVTRVNTSU9OX1NUQVRFX0NMT1NJTkcQBxIYChRTRVNT", - "SU9OX1NUQVRFX0NMT1NFRBAIEhkKFVNFU1NJT05fU1RBVEVfRkFVTFRFRBAJ", - "MsMFCg9NeEFjY2Vzc0dhdGV3YXkSXQoLT3BlblNlc3Npb24SJy5teGFjY2Vz", - "c19nYXRld2F5LnYxLk9wZW5TZXNzaW9uUmVxdWVzdBolLm14YWNjZXNzX2dh", - "dGV3YXkudjEuT3BlblNlc3Npb25SZXBseRJgCgxDbG9zZVNlc3Npb24SKC5t", - "eGFjY2Vzc19nYXRld2F5LnYxLkNsb3NlU2Vzc2lvblJlcXVlc3QaJi5teGFj", - "Y2Vzc19nYXRld2F5LnYxLkNsb3NlU2Vzc2lvblJlcGx5ElQKBkludm9rZRIl", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuTXhDb21tYW5kUmVxdWVzdBojLm14YWNj", - "ZXNzX2dhdGV3YXkudjEuTXhDb21tYW5kUmVwbHkSWAoMU3RyZWFtRXZlbnRz", - "EigubXhhY2Nlc3NfZ2F0ZXdheS52MS5TdHJlYW1FdmVudHNSZXF1ZXN0Ghwu", - "bXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEV2ZW50MAESbAoQQWNrbm93bGVkZ2VB", - "bGFybRIsLm14YWNjZXNzX2dhdGV3YXkudjEuQWNrbm93bGVkZ2VBbGFybVJl", - "cXVlc3QaKi5teGFjY2Vzc19nYXRld2F5LnYxLkFja25vd2xlZGdlQWxhcm1S", - "ZXBseRJhCgxTdHJlYW1BbGFybXMSKC5teGFjY2Vzc19nYXRld2F5LnYxLlN0", - "cmVhbUFsYXJtc1JlcXVlc3QaJS5teGFjY2Vzc19nYXRld2F5LnYxLkFsYXJt", - "RmVlZE1lc3NhZ2UwARJuChFRdWVyeUFjdGl2ZUFsYXJtcxItLm14YWNjZXNz", - "X2dhdGV3YXkudjEuUXVlcnlBY3RpdmVBbGFybXNSZXF1ZXN0GigubXhhY2Nl", - "c3NfZ2F0ZXdheS52MS5BY3RpdmVBbGFybVNuYXBzaG90MAFCJqoCI1pCLk1P", - "TS5XVy5NeEdhdGV3YXkuQ29udHJhY3RzLlByb3RvYgZwcm90bzM=")); + "BiABKAkSGQoRb3BlcmF0b3JfcGFzc3dvcmQYByABKAkiNwoYUXVlcnlBY3Rp", + "dmVBbGFybXNDb21tYW5kEhsKE2FsYXJtX2ZpbHRlcl9wcmVmaXgYASABKAki", + "7QEKHUFja25vd2xlZGdlQWxhcm1CeU5hbWVDb21tYW5kEhIKCmFsYXJtX25h", + "bWUYASABKAkSFQoNcHJvdmlkZXJfbmFtZRgCIAEoCRISCgpncm91cF9uYW1l", + "GAMgASgJEg8KB2NvbW1lbnQYBCABKAkSFQoNb3BlcmF0b3JfdXNlchgFIAEo", + "CRIVCg1vcGVyYXRvcl9ub2RlGAYgASgJEhcKD29wZXJhdG9yX2RvbWFpbhgH", + "IAEoCRIaChJvcGVyYXRvcl9mdWxsX25hbWUYCCABKAkSGQoRb3BlcmF0b3Jf", + "cGFzc3dvcmQYCSABKAkiRQoWVW5zdWJzY3JpYmVCdWxrQ29tbWFuZBIVCg1z", + "ZXJ2ZXJfaGFuZGxlGAEgASgFEhQKDGl0ZW1faGFuZGxlcxgCIAMoBSJfChBX", + "cml0ZUJ1bGtDb21tYW5kEhUKDXNlcnZlcl9oYW5kbGUYASABKAUSNAoHZW50", + "cmllcxgCIAMoCzIjLm14YWNjZXNzX2dhdGV3YXkudjEuV3JpdGVCdWxrRW50", + "cnkiYwoOV3JpdGVCdWxrRW50cnkSEwoLaXRlbV9oYW5kbGUYASABKAUSKwoF", + "dmFsdWUYAiABKAsyHC5teGFjY2Vzc19nYXRld2F5LnYxLk14VmFsdWUSDwoH", + "dXNlcl9pZBgDIAEoBSJhChFXcml0ZTJCdWxrQ29tbWFuZBIVCg1zZXJ2ZXJf", + "aGFuZGxlGAEgASgFEjUKB2VudHJpZXMYAiADKAsyJC5teGFjY2Vzc19nYXRl", + "d2F5LnYxLldyaXRlMkJ1bGtFbnRyeSKbAQoPV3JpdGUyQnVsa0VudHJ5EhMK", + "C2l0ZW1faGFuZGxlGAEgASgFEisKBXZhbHVlGAIgASgLMhwubXhhY2Nlc3Nf", + "Z2F0ZXdheS52MS5NeFZhbHVlEjUKD3RpbWVzdGFtcF92YWx1ZRgDIAEoCzIc", + "Lm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIPCgd1c2VyX2lkGAQgASgF", + "Im0KF1dyaXRlU2VjdXJlZEJ1bGtDb21tYW5kEhUKDXNlcnZlcl9oYW5kbGUY", + "ASABKAUSOwoHZW50cmllcxgCIAMoCzIqLm14YWNjZXNzX2dhdGV3YXkudjEu", + "V3JpdGVTZWN1cmVkQnVsa0VudHJ5IowBChVXcml0ZVNlY3VyZWRCdWxrRW50", + "cnkSEwoLaXRlbV9oYW5kbGUYASABKAUSFwoPY3VycmVudF91c2VyX2lkGAIg", + "ASgFEhgKEHZlcmlmaWVyX3VzZXJfaWQYAyABKAUSKwoFdmFsdWUYBCABKAsy", + "HC5teGFjY2Vzc19nYXRld2F5LnYxLk14VmFsdWUibwoYV3JpdGVTZWN1cmVk", + "MkJ1bGtDb21tYW5kEhUKDXNlcnZlcl9oYW5kbGUYASABKAUSPAoHZW50cmll", + "cxgCIAMoCzIrLm14YWNjZXNzX2dhdGV3YXkudjEuV3JpdGVTZWN1cmVkMkJ1", + "bGtFbnRyeSLEAQoWV3JpdGVTZWN1cmVkMkJ1bGtFbnRyeRITCgtpdGVtX2hh", + "bmRsZRgBIAEoBRIXCg9jdXJyZW50X3VzZXJfaWQYAiABKAUSGAoQdmVyaWZp", + "ZXJfdXNlcl9pZBgDIAEoBRIrCgV2YWx1ZRgEIAEoCzIcLm14YWNjZXNzX2dh", + "dGV3YXkudjEuTXhWYWx1ZRI1Cg90aW1lc3RhbXBfdmFsdWUYBSABKAsyHC5t", + "eGFjY2Vzc19nYXRld2F5LnYxLk14VmFsdWUiUwoPUmVhZEJ1bGtDb21tYW5k", + "EhUKDXNlcnZlcl9oYW5kbGUYASABKAUSFQoNdGFnX2FkZHJlc3NlcxgCIAMo", + "CRISCgp0aW1lb3V0X21zGAMgASgNIh4KC1BpbmdDb21tYW5kEg8KB21lc3Nh", + "Z2UYASABKAkiGAoWR2V0U2Vzc2lvblN0YXRlQ29tbWFuZCIWChRHZXRXb3Jr", + "ZXJJbmZvQ29tbWFuZCIoChJEcmFpbkV2ZW50c0NvbW1hbmQSEgoKbWF4X2V2", + "ZW50cxgBIAEoDSJIChVTaHV0ZG93bldvcmtlckNvbW1hbmQSLwoMZ3JhY2Vf", + "cGVyaW9kGAEgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIoYPCg5N", + "eENvbW1hbmRSZXBseRISCgpzZXNzaW9uX2lkGAEgASgJEhYKDmNvcnJlbGF0", + "aW9uX2lkGAIgASgJEjAKBGtpbmQYAyABKA4yIi5teGFjY2Vzc19nYXRld2F5", + "LnYxLk14Q29tbWFuZEtpbmQSPAoPcHJvdG9jb2xfc3RhdHVzGAQgASgLMiMu", + "bXhhY2Nlc3NfZ2F0ZXdheS52MS5Qcm90b2NvbFN0YXR1cxIUCgdocmVzdWx0", + "GAUgASgFSAGIAQESMgoMcmV0dXJuX3ZhbHVlGAYgASgLMhwubXhhY2Nlc3Nf", + "Z2F0ZXdheS52MS5NeFZhbHVlEjQKCHN0YXR1c2VzGAcgAygLMiIubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5NeFN0YXR1c1Byb3h5EhoKEmRpYWdub3N0aWNfbWVz", + "c2FnZRgIIAEoCRI2CghyZWdpc3RlchgUIAEoCzIiLm14YWNjZXNzX2dhdGV3", + "YXkudjEuUmVnaXN0ZXJSZXBseUgAEjUKCGFkZF9pdGVtGBUgASgLMiEubXhh", + "Y2Nlc3NfZ2F0ZXdheS52MS5BZGRJdGVtUmVwbHlIABI3CglhZGRfaXRlbTIY", + "FiABKAsyIi5teGFjY2Vzc19nYXRld2F5LnYxLkFkZEl0ZW0yUmVwbHlIABJG", + "ChFhZGRfYnVmZmVyZWRfaXRlbRgXIAEoCzIpLm14YWNjZXNzX2dhdGV3YXku", + "djEuQWRkQnVmZmVyZWRJdGVtUmVwbHlIABI0CgdzdXNwZW5kGBggASgLMiEu", + "bXhhY2Nlc3NfZ2F0ZXdheS52MS5TdXNwZW5kUmVwbHlIABI2CghhY3RpdmF0", + "ZRgZIAEoCzIiLm14YWNjZXNzX2dhdGV3YXkudjEuQWN0aXZhdGVSZXBseUgA", + "EkcKEWF1dGhlbnRpY2F0ZV91c2VyGBogASgLMioubXhhY2Nlc3NfZ2F0ZXdh", + "eS52MS5BdXRoZW50aWNhdGVVc2VyUmVwbHlIABJLChRhcmNoZXN0cmFfdXNl", + "cl90b19pZBgbIAEoCzIrLm14YWNjZXNzX2dhdGV3YXkudjEuQXJjaGVzdHJB", + "VXNlclRvSWRSZXBseUgAEkAKDWFkZF9pdGVtX2J1bGsYHCABKAsyJy5teGFj", + "Y2Vzc19nYXRld2F5LnYxLkJ1bGtTdWJzY3JpYmVSZXBseUgAEkMKEGFkdmlz", + "ZV9pdGVtX2J1bGsYHSABKAsyJy5teGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtT", + "dWJzY3JpYmVSZXBseUgAEkMKEHJlbW92ZV9pdGVtX2J1bGsYHiABKAsyJy5t", + "eGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtTdWJzY3JpYmVSZXBseUgAEkYKE3Vu", + "X2FkdmlzZV9pdGVtX2J1bGsYHyABKAsyJy5teGFjY2Vzc19nYXRld2F5LnYx", + "LkJ1bGtTdWJzY3JpYmVSZXBseUgAEkEKDnN1YnNjcmliZV9idWxrGCAgASgL", + "MicubXhhY2Nlc3NfZ2F0ZXdheS52MS5CdWxrU3Vic2NyaWJlUmVwbHlIABJD", + "ChB1bnN1YnNjcmliZV9idWxrGCEgASgLMicubXhhY2Nlc3NfZ2F0ZXdheS52", + "MS5CdWxrU3Vic2NyaWJlUmVwbHlIABJOChFhY2tub3dsZWRnZV9hbGFybRgi", + "IAEoCzIxLm14YWNjZXNzX2dhdGV3YXkudjEuQWNrbm93bGVkZ2VBbGFybVJl", + "cGx5UGF5bG9hZEgAElEKE3F1ZXJ5X2FjdGl2ZV9hbGFybXMYIyABKAsyMi5t", + "eGFjY2Vzc19nYXRld2F5LnYxLlF1ZXJ5QWN0aXZlQWxhcm1zUmVwbHlQYXls", + "b2FkSAASOQoKd3JpdGVfYnVsaxgkIAEoCzIjLm14YWNjZXNzX2dhdGV3YXku", + "djEuQnVsa1dyaXRlUmVwbHlIABI6Cgt3cml0ZTJfYnVsaxglIAEoCzIjLm14", + "YWNjZXNzX2dhdGV3YXkudjEuQnVsa1dyaXRlUmVwbHlIABJBChJ3cml0ZV9z", + "ZWN1cmVkX2J1bGsYJiABKAsyIy5teGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtX", + "cml0ZVJlcGx5SAASQgoTd3JpdGVfc2VjdXJlZDJfYnVsaxgnIAEoCzIjLm14", + "YWNjZXNzX2dhdGV3YXkudjEuQnVsa1dyaXRlUmVwbHlIABI3CglyZWFkX2J1", + "bGsYKCABKAsyIi5teGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtSZWFkUmVwbHlI", + "ABI/Cg1zZXNzaW9uX3N0YXRlGGQgASgLMiYubXhhY2Nlc3NfZ2F0ZXdheS52", + "MS5TZXNzaW9uU3RhdGVSZXBseUgAEjsKC3dvcmtlcl9pbmZvGGUgASgLMiQu", + "bXhhY2Nlc3NfZ2F0ZXdheS52MS5Xb3JrZXJJbmZvUmVwbHlIABI9CgxkcmFp", + "bl9ldmVudHMYZiABKAsyJS5teGFjY2Vzc19nYXRld2F5LnYxLkRyYWluRXZl", + "bnRzUmVwbHlIAEIJCgdwYXlsb2FkQgoKCF9ocmVzdWx0IiYKDVJlZ2lzdGVy", + "UmVwbHkSFQoNc2VydmVyX2hhbmRsZRgBIAEoBSIjCgxBZGRJdGVtUmVwbHkS", + "EwoLaXRlbV9oYW5kbGUYASABKAUiJAoNQWRkSXRlbTJSZXBseRITCgtpdGVt", + "X2hhbmRsZRgBIAEoBSIrChRBZGRCdWZmZXJlZEl0ZW1SZXBseRITCgtpdGVt", + "X2hhbmRsZRgBIAEoBSJCCgxTdXNwZW5kUmVwbHkSMgoGc3RhdHVzGAEgASgL", + "MiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1c1Byb3h5IkMKDUFjdGl2", + "YXRlUmVwbHkSMgoGc3RhdHVzGAEgASgLMiIubXhhY2Nlc3NfZ2F0ZXdheS52", + "MS5NeFN0YXR1c1Byb3h5IigKFUF1dGhlbnRpY2F0ZVVzZXJSZXBseRIPCgd1", + "c2VyX2lkGAEgASgFIikKFkFyY2hlc3RyQVVzZXJUb0lkUmVwbHkSDwoHdXNl", + "cl9pZBgBIAEoBSKBAQoPU3Vic2NyaWJlUmVzdWx0EhUKDXNlcnZlcl9oYW5k", + "bGUYASABKAUSEwoLdGFnX2FkZHJlc3MYAiABKAkSEwoLaXRlbV9oYW5kbGUY", + "AyABKAUSFgoOd2FzX3N1Y2Nlc3NmdWwYBCABKAgSFQoNZXJyb3JfbWVzc2Fn", + "ZRgFIAEoCSJLChJCdWxrU3Vic2NyaWJlUmVwbHkSNQoHcmVzdWx0cxgBIAMo", + "CzIkLm14YWNjZXNzX2dhdGV3YXkudjEuU3Vic2NyaWJlUmVzdWx0IsQBCg9C", + "dWxrV3JpdGVSZXN1bHQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRITCgtpdGVt", + "X2hhbmRsZRgCIAEoBRIWCg53YXNfc3VjY2Vzc2Z1bBgDIAEoCBIUCgdocmVz", + "dWx0GAQgASgFSACIAQESNAoIc3RhdHVzZXMYBSADKAsyIi5teGFjY2Vzc19n", + "YXRld2F5LnYxLk14U3RhdHVzUHJveHkSFQoNZXJyb3JfbWVzc2FnZRgGIAEo", + "CUIKCghfaHJlc3VsdCJHCg5CdWxrV3JpdGVSZXBseRI1CgdyZXN1bHRzGAEg", + "AygLMiQubXhhY2Nlc3NfZ2F0ZXdheS52MS5CdWxrV3JpdGVSZXN1bHQivgIK", + "DkJ1bGtSZWFkUmVzdWx0EhUKDXNlcnZlcl9oYW5kbGUYASABKAUSEwoLdGFn", + "X2FkZHJlc3MYAiABKAkSEwoLaXRlbV9oYW5kbGUYAyABKAUSFgoOd2FzX3N1", + "Y2Nlc3NmdWwYBCABKAgSEgoKd2FzX2NhY2hlZBgFIAEoCBIrCgV2YWx1ZRgG", + "IAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIPCgdxdWFsaXR5", + "GAcgASgFEjQKEHNvdXJjZV90aW1lc3RhbXAYCCABKAsyGi5nb29nbGUucHJv", + "dG9idWYuVGltZXN0YW1wEjQKCHN0YXR1c2VzGAkgAygLMiIubXhhY2Nlc3Nf", + "Z2F0ZXdheS52MS5NeFN0YXR1c1Byb3h5EhUKDWVycm9yX21lc3NhZ2UYCiAB", + "KAkiRQoNQnVsa1JlYWRSZXBseRI0CgdyZXN1bHRzGAEgAygLMiMubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5CdWxrUmVhZFJlc3VsdCJFChFTZXNzaW9uU3RhdGVS", + "ZXBseRIwCgVzdGF0ZRgBIAEoDjIhLm14YWNjZXNzX2dhdGV3YXkudjEuU2Vz", + "c2lvblN0YXRlInUKD1dvcmtlckluZm9SZXBseRIZChF3b3JrZXJfcHJvY2Vz", + "c19pZBgBIAEoBRIWCg53b3JrZXJfdmVyc2lvbhgCIAEoCRIXCg9teGFjY2Vz", + "c19wcm9naWQYAyABKAkSFgoObXhhY2Nlc3NfY2xzaWQYBCABKAkiQAoQRHJh", + "aW5FdmVudHNSZXBseRIsCgZldmVudHMYASADKAsyHC5teGFjY2Vzc19nYXRl", + "d2F5LnYxLk14RXZlbnQiNQocQWNrbm93bGVkZ2VBbGFybVJlcGx5UGF5bG9h", + "ZBIVCg1uYXRpdmVfc3RhdHVzGAEgASgFIngKHVF1ZXJ5QWN0aXZlQWxhcm1z", + "UmVwbHlQYXlsb2FkEjsKCXNuYXBzaG90cxgBIAMoCzIoLm14YWNjZXNzX2dh", + "dGV3YXkudjEuQWN0aXZlQWxhcm1TbmFwc2hvdBIaChJzbmFwc2hvdF90cnVu", + "Y2F0ZWQYAiABKAgijwgKB014RXZlbnQSMgoGZmFtaWx5GAEgASgOMiIubXhh", + "Y2Nlc3NfZ2F0ZXdheS52MS5NeEV2ZW50RmFtaWx5EhIKCnNlc3Npb25faWQY", + "AiABKAkSFQoNc2VydmVyX2hhbmRsZRgDIAEoBRITCgtpdGVtX2hhbmRsZRgE", + "IAEoBRIrCgV2YWx1ZRgFIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhW", + "YWx1ZRIPCgdxdWFsaXR5GAYgASgFEjQKEHNvdXJjZV90aW1lc3RhbXAYByAB", + "KAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjQKCHN0YXR1c2VzGAgg", + "AygLMiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1c1Byb3h5EhcKD3dv", + "cmtlcl9zZXF1ZW5jZRgJIAEoBBI0ChB3b3JrZXJfdGltZXN0YW1wGAogASgL", + "MhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI9ChlnYXRld2F5X3JlY2Vp", + "dmVfdGltZXN0YW1wGAsgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFt", + "cBIUCgdocmVzdWx0GAwgASgFSAGIAQESEgoKcmF3X3N0YXR1cxgNIAEoCRI3", + "CgpyZXBsYXlfZ2FwGA4gASgLMh4ubXhhY2Nlc3NfZ2F0ZXdheS52MS5SZXBs", + "YXlHYXBIAogBARJACg5vbl9kYXRhX2NoYW5nZRgUIAEoCzImLm14YWNjZXNz", + "X2dhdGV3YXkudjEuT25EYXRhQ2hhbmdlRXZlbnRIABJGChFvbl93cml0ZV9j", + "b21wbGV0ZRgVIAEoCzIpLm14YWNjZXNzX2dhdGV3YXkudjEuT25Xcml0ZUNv", + "bXBsZXRlRXZlbnRIABJJChJvcGVyYXRpb25fY29tcGxldGUYFiABKAsyKy5t", + "eGFjY2Vzc19nYXRld2F5LnYxLk9wZXJhdGlvbkNvbXBsZXRlRXZlbnRIABJR", + "Chdvbl9idWZmZXJlZF9kYXRhX2NoYW5nZRgXIAEoCzIuLm14YWNjZXNzX2dh", + "dGV3YXkudjEuT25CdWZmZXJlZERhdGFDaGFuZ2VFdmVudEgAEkoKE29uX2Fs", + "YXJtX3RyYW5zaXRpb24YGCABKAsyKy5teGFjY2Vzc19nYXRld2F5LnYxLk9u", + "QWxhcm1UcmFuc2l0aW9uRXZlbnRIABJeCh5vbl9hbGFybV9wcm92aWRlcl9t", + "b2RlX2NoYW5nZWQYGSABKAsyNC5teGFjY2Vzc19nYXRld2F5LnYxLk9uQWxh", + "cm1Qcm92aWRlck1vZGVDaGFuZ2VkRXZlbnRIAEIGCgRib2R5QgoKCF9ocmVz", + "dWx0Qg0KC19yZXBsYXlfZ2FwIlAKCVJlcGxheUdhcBIgChhyZXF1ZXN0ZWRf", + "YWZ0ZXJfc2VxdWVuY2UYASABKAQSIQoZb2xkZXN0X2F2YWlsYWJsZV9zZXF1", + "ZW5jZRgCIAEoBCITChFPbkRhdGFDaGFuZ2VFdmVudCIWChRPbldyaXRlQ29t", + "cGxldGVFdmVudCIYChZPcGVyYXRpb25Db21wbGV0ZUV2ZW50ItQBChlPbkJ1", + "ZmZlcmVkRGF0YUNoYW5nZUV2ZW50EjIKCWRhdGFfdHlwZRgBIAEoDjIfLm14", + "YWNjZXNzX2dhdGV3YXkudjEuTXhEYXRhVHlwZRI0Cg5xdWFsaXR5X3ZhbHVl", + "cxgCIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhBcnJheRI2ChB0aW1l", + "c3RhbXBfdmFsdWVzGAMgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEFy", + "cmF5EhUKDXJhd19kYXRhX3R5cGUYBCABKAUi0AQKFk9uQWxhcm1UcmFuc2l0", + "aW9uRXZlbnQSHAoUYWxhcm1fZnVsbF9yZWZlcmVuY2UYASABKAkSHwoXc291", + "cmNlX29iamVjdF9yZWZlcmVuY2UYAiABKAkSFwoPYWxhcm1fdHlwZV9uYW1l", + "GAMgASgJEkEKD3RyYW5zaXRpb25fa2luZBgEIAEoDjIoLm14YWNjZXNzX2dh", + "dGV3YXkudjEuQWxhcm1UcmFuc2l0aW9uS2luZBIQCghzZXZlcml0eRgFIAEo", + "BRI8ChhvcmlnaW5hbF9yYWlzZV90aW1lc3RhbXAYBiABKAsyGi5nb29nbGUu", + "cHJvdG9idWYuVGltZXN0YW1wEjgKFHRyYW5zaXRpb25fdGltZXN0YW1wGAcg", + "ASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIVCg1vcGVyYXRvcl91", + "c2VyGAggASgJEhgKEG9wZXJhdG9yX2NvbW1lbnQYCSABKAkSEAoIY2F0ZWdv", + "cnkYCiABKAkSEwoLZGVzY3JpcHRpb24YCyABKAkSMwoNY3VycmVudF92YWx1", + "ZRgMIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIxCgtsaW1p", + "dF92YWx1ZRgNIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIQ", + "CghkZWdyYWRlZBgOIAEoCBI/Cg9zb3VyY2VfcHJvdmlkZXIYDyABKA4yJi5t", + "eGFjY2Vzc19nYXRld2F5LnYxLkFsYXJtUHJvdmlkZXJNb2RlIqABCh9PbkFs", + "YXJtUHJvdmlkZXJNb2RlQ2hhbmdlZEV2ZW50EjQKBG1vZGUYASABKA4yJi5t", + "eGFjY2Vzc19nYXRld2F5LnYxLkFsYXJtUHJvdmlkZXJNb2RlEg4KBnJlYXNv", + "bhgCIAEoCRIPCgdocmVzdWx0GAMgASgFEiYKAmF0GAQgASgLMhouZ29vZ2xl", + "LnByb3RvYnVmLlRpbWVzdGFtcCLxBAoTQWN0aXZlQWxhcm1TbmFwc2hvdBIc", + "ChRhbGFybV9mdWxsX3JlZmVyZW5jZRgBIAEoCRIfChdzb3VyY2Vfb2JqZWN0", + "X3JlZmVyZW5jZRgCIAEoCRIXCg9hbGFybV90eXBlX25hbWUYAyABKAkSEAoI", + "c2V2ZXJpdHkYBCABKAUSPAoYb3JpZ2luYWxfcmFpc2VfdGltZXN0YW1wGAUg", + "ASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI/Cg1jdXJyZW50X3N0", + "YXRlGAYgASgOMigubXhhY2Nlc3NfZ2F0ZXdheS52MS5BbGFybUNvbmRpdGlv", + "blN0YXRlEhAKCGNhdGVnb3J5GAcgASgJEhMKC2Rlc2NyaXB0aW9uGAggASgJ", + "Ej0KGWxhc3RfdHJhbnNpdGlvbl90aW1lc3RhbXAYCSABKAsyGi5nb29nbGUu", + "cHJvdG9idWYuVGltZXN0YW1wEhUKDW9wZXJhdG9yX3VzZXIYCiABKAkSGAoQ", + "b3BlcmF0b3JfY29tbWVudBgLIAEoCRIzCg1jdXJyZW50X3ZhbHVlGAwgASgL", + "MhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZhbHVlEjEKC2xpbWl0X3ZhbHVl", + "GA0gASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZhbHVlEhAKCGRlZ3Jh", + "ZGVkGA4gASgIEj8KD3NvdXJjZV9wcm92aWRlchgPIAEoDjImLm14YWNjZXNz", + "X2dhdGV3YXkudjEuQWxhcm1Qcm92aWRlck1vZGUSHwoXZnJvbV90cnVuY2F0", + "ZWRfc25hcHNob3QYECABKAgixAEKF0Fja25vd2xlZGdlQWxhcm1SZXF1ZXN0", + "Eh0KFWNsaWVudF9jb3JyZWxhdGlvbl9pZBgCIAEoCRIcChRhbGFybV9mdWxs", + "X3JlZmVyZW5jZRgDIAEoCRIPCgdjb21tZW50GAQgASgJEhUKDW9wZXJhdG9y", + "X3VzZXIYBSABKAkSGQoRb3BlcmF0b3JfcGFzc3dvcmQYBiABKAkSFwoPb3Bl", + "cmF0b3JfZG9tYWluGAcgASgJSgQIARACUgpzZXNzaW9uX2lkIvEBChVBY2tu", + "b3dsZWRnZUFsYXJtUmVwbHkSFgoOY29ycmVsYXRpb25faWQYAiABKAkSPAoP", + "cHJvdG9jb2xfc3RhdHVzGAMgASgLMiMubXhhY2Nlc3NfZ2F0ZXdheS52MS5Q", + "cm90b2NvbFN0YXR1cxIUCgdocmVzdWx0GAQgASgFSACIAQESMgoGc3RhdHVz", + "GAUgASgLMiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1c1Byb3h5EhoK", + "EmRpYWdub3N0aWNfbWVzc2FnZRgGIAEoCUIKCghfaHJlc3VsdEoECAEQAlIK", + "c2Vzc2lvbl9pZCJRChNTdHJlYW1BbGFybXNSZXF1ZXN0Eh0KFWNsaWVudF9j", + "b3JyZWxhdGlvbl9pZBgBIAEoCRIbChNhbGFybV9maWx0ZXJfcHJlZml4GAIg", + "ASgJIskCChBBbGFybUZlZWRNZXNzYWdlEkAKDGFjdGl2ZV9hbGFybRgBIAEo", + "CzIoLm14YWNjZXNzX2dhdGV3YXkudjEuQWN0aXZlQWxhcm1TbmFwc2hvdEgA", + "EhsKEXNuYXBzaG90X2NvbXBsZXRlGAIgASgISAASQQoKdHJhbnNpdGlvbhgD", + "IAEoCzIrLm14YWNjZXNzX2dhdGV3YXkudjEuT25BbGFybVRyYW5zaXRpb25F", + "dmVudEgAEkMKD3Byb3ZpZGVyX3N0YXR1cxgEIAEoCzIoLm14YWNjZXNzX2dh", + "dGV3YXkudjEuQWxhcm1Qcm92aWRlclN0YXR1c0gAEkMKD3NuYXBzaG90X3N0", + "YXR1cxgFIAEoCzIoLm14YWNjZXNzX2dhdGV3YXkudjEuQWxhcm1TbmFwc2hv", + "dFN0YXR1c0gAQgkKB3BheWxvYWQimAEKE0FsYXJtUHJvdmlkZXJTdGF0dXMS", + "NAoEbW9kZRgBIAEoDjImLm14YWNjZXNzX2dhdGV3YXkudjEuQWxhcm1Qcm92", + "aWRlck1vZGUSEAoIZGVncmFkZWQYAiABKAgSDgoGcmVhc29uGAMgASgJEikK", + "BXNpbmNlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIoChNB", + "bGFybVNuYXBzaG90U3RhdHVzEhEKCXRydW5jYXRlZBgBIAEoCCLrAQoNTXhT", + "dGF0dXNQcm94eRIPCgdzdWNjZXNzGAEgASgFEjcKCGNhdGVnb3J5GAIgASgO", + "MiUubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1c0NhdGVnb3J5EjgKC2Rl", + "dGVjdGVkX2J5GAMgASgOMiMubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1", + "c1NvdXJjZRIOCgZkZXRhaWwYBCABKAUSFAoMcmF3X2NhdGVnb3J5GAUgASgF", + "EhcKD3Jhd19kZXRlY3RlZF9ieRgGIAEoBRIXCg9kaWFnbm9zdGljX3RleHQY", + "ByABKAki6QMKB014VmFsdWUSMgoJZGF0YV90eXBlGAEgASgOMh8ubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5NeERhdGFUeXBlEhQKDHZhcmlhbnRfdHlwZRgCIAEo", + "CRIPCgdpc19udWxsGAMgASgIEhYKDnJhd19kaWFnbm9zdGljGAQgASgJEhUK", + "DXJhd19kYXRhX3R5cGUYBSABKAUSFAoKYm9vbF92YWx1ZRgKIAEoCEgAEhUK", + "C2ludDMyX3ZhbHVlGAsgASgFSAASFQoLaW50NjRfdmFsdWUYDCABKANIABIV", + "CgtmbG9hdF92YWx1ZRgNIAEoAkgAEhYKDGRvdWJsZV92YWx1ZRgOIAEoAUgA", + "EhYKDHN0cmluZ192YWx1ZRgPIAEoCUgAEjUKD3RpbWVzdGFtcF92YWx1ZRgQ", + "IAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIABIzCgthcnJheV92", + "YWx1ZRgRIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhBcnJheUgAEhMK", + "CXJhd192YWx1ZRgSIAEoDEgAEkAKEnNwYXJzZV9hcnJheV92YWx1ZRgTIAEo", + "CzIiLm14YWNjZXNzX2dhdGV3YXkudjEuTXhTcGFyc2VBcnJheUgAQgYKBGtp", + "bmQi/gQKB014QXJyYXkSOgoRZWxlbWVudF9kYXRhX3R5cGUYASABKA4yHy5t", + "eGFjY2Vzc19nYXRld2F5LnYxLk14RGF0YVR5cGUSFAoMdmFyaWFudF90eXBl", + "GAIgASgJEhIKCmRpbWVuc2lvbnMYAyADKA0SFgoOcmF3X2RpYWdub3N0aWMY", + "BCABKAkSHQoVcmF3X2VsZW1lbnRfZGF0YV90eXBlGAUgASgFEjUKC2Jvb2xf", + "dmFsdWVzGAogASgLMh4ubXhhY2Nlc3NfZ2F0ZXdheS52MS5Cb29sQXJyYXlI", + "ABI3CgxpbnQzMl92YWx1ZXMYCyABKAsyHy5teGFjY2Vzc19nYXRld2F5LnYx", + "LkludDMyQXJyYXlIABI3CgxpbnQ2NF92YWx1ZXMYDCABKAsyHy5teGFjY2Vz", + "c19nYXRld2F5LnYxLkludDY0QXJyYXlIABI3CgxmbG9hdF92YWx1ZXMYDSAB", + "KAsyHy5teGFjY2Vzc19nYXRld2F5LnYxLkZsb2F0QXJyYXlIABI5Cg1kb3Vi", + "bGVfdmFsdWVzGA4gASgLMiAubXhhY2Nlc3NfZ2F0ZXdheS52MS5Eb3VibGVB", + "cnJheUgAEjkKDXN0cmluZ192YWx1ZXMYDyABKAsyIC5teGFjY2Vzc19nYXRl", + "d2F5LnYxLlN0cmluZ0FycmF5SAASPwoQdGltZXN0YW1wX3ZhbHVlcxgQIAEo", + "CzIjLm14YWNjZXNzX2dhdGV3YXkudjEuVGltZXN0YW1wQXJyYXlIABIzCgpy", + "YXdfdmFsdWVzGBEgASgLMh0ubXhhY2Nlc3NfZ2F0ZXdheS52MS5SYXdBcnJh", + "eUgAQggKBnZhbHVlcyKZAQoNTXhTcGFyc2VBcnJheRI6ChFlbGVtZW50X2Rh", + "dGFfdHlwZRgBIAEoDjIfLm14YWNjZXNzX2dhdGV3YXkudjEuTXhEYXRhVHlw", + "ZRIUCgx0b3RhbF9sZW5ndGgYAiABKA0SNgoIZWxlbWVudHMYAyADKAsyJC5t", + "eGFjY2Vzc19nYXRld2F5LnYxLk14U3BhcnNlRWxlbWVudCJNCg9NeFNwYXJz", + "ZUVsZW1lbnQSDQoFaW5kZXgYASABKA0SKwoFdmFsdWUYAiABKAsyHC5teGFj", + "Y2Vzc19nYXRld2F5LnYxLk14VmFsdWUiGwoJQm9vbEFycmF5Eg4KBnZhbHVl", + "cxgBIAMoCCIcCgpJbnQzMkFycmF5Eg4KBnZhbHVlcxgBIAMoBSIcCgpJbnQ2", + "NEFycmF5Eg4KBnZhbHVlcxgBIAMoAyIcCgpGbG9hdEFycmF5Eg4KBnZhbHVl", + "cxgBIAMoAiIdCgtEb3VibGVBcnJheRIOCgZ2YWx1ZXMYASADKAEiHQoLU3Ry", + "aW5nQXJyYXkSDgoGdmFsdWVzGAEgAygJIjwKDlRpbWVzdGFtcEFycmF5EioK", + "BnZhbHVlcxgBIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiGgoI", + "UmF3QXJyYXkSDgoGdmFsdWVzGAEgAygMIlgKDlByb3RvY29sU3RhdHVzEjUK", + "BGNvZGUYASABKA4yJy5teGFjY2Vzc19nYXRld2F5LnYxLlByb3RvY29sU3Rh", + "dHVzQ29kZRIPCgdtZXNzYWdlGAIgASgJKswLCg1NeENvbW1hbmRLaW5kEh8K", + "G01YX0NPTU1BTkRfS0lORF9VTlNQRUNJRklFRBAAEhwKGE1YX0NPTU1BTkRf", + "S0lORF9SRUdJU1RFUhABEh4KGk1YX0NPTU1BTkRfS0lORF9VTlJFR0lTVEVS", + "EAISHAoYTVhfQ09NTUFORF9LSU5EX0FERF9JVEVNEAMSHQoZTVhfQ09NTUFO", + "RF9LSU5EX0FERF9JVEVNMhAEEh8KG01YX0NPTU1BTkRfS0lORF9SRU1PVkVf", + "SVRFTRAFEhoKFk1YX0NPTU1BTkRfS0lORF9BRFZJU0UQBhIdChlNWF9DT01N", + "QU5EX0tJTkRfVU5fQURWSVNFEAcSJgoiTVhfQ09NTUFORF9LSU5EX0FEVklT", + "RV9TVVBFUlZJU09SWRAIEiUKIU1YX0NPTU1BTkRfS0lORF9BRERfQlVGRkVS", + "RURfSVRFTRAJEjAKLE1YX0NPTU1BTkRfS0lORF9TRVRfQlVGRkVSRURfVVBE", + "QVRFX0lOVEVSVkFMEAoSGwoXTVhfQ09NTUFORF9LSU5EX1NVU1BFTkQQCxIc", + "ChhNWF9DT01NQU5EX0tJTkRfQUNUSVZBVEUQDBIZChVNWF9DT01NQU5EX0tJ", + "TkRfV1JJVEUQDRIaChZNWF9DT01NQU5EX0tJTkRfV1JJVEUyEA4SIQodTVhf", + "Q09NTUFORF9LSU5EX1dSSVRFX1NFQ1VSRUQQDxIiCh5NWF9DT01NQU5EX0tJ", + "TkRfV1JJVEVfU0VDVVJFRDIQEBIlCiFNWF9DT01NQU5EX0tJTkRfQVVUSEVO", + "VElDQVRFX1VTRVIQERIoCiRNWF9DT01NQU5EX0tJTkRfQVJDSEVTVFJBX1VT", + "RVJfVE9fSUQQEhIhCh1NWF9DT01NQU5EX0tJTkRfQUREX0lURU1fQlVMSxAT", + "EiQKIE1YX0NPTU1BTkRfS0lORF9BRFZJU0VfSVRFTV9CVUxLEBQSJAogTVhf", + "Q09NTUFORF9LSU5EX1JFTU9WRV9JVEVNX0JVTEsQFRInCiNNWF9DT01NQU5E", + "X0tJTkRfVU5fQURWSVNFX0lURU1fQlVMSxAWEiIKHk1YX0NPTU1BTkRfS0lO", + "RF9TVUJTQ1JJQkVfQlVMSxAXEiQKIE1YX0NPTU1BTkRfS0lORF9VTlNVQlND", + "UklCRV9CVUxLEBgSJAogTVhfQ09NTUFORF9LSU5EX1NVQlNDUklCRV9BTEFS", + "TVMQGRImCiJNWF9DT01NQU5EX0tJTkRfVU5TVUJTQ1JJQkVfQUxBUk1TEBoS", + "JQohTVhfQ09NTUFORF9LSU5EX0FDS05PV0xFREdFX0FMQVJNEBsSJwojTVhf", + "Q09NTUFORF9LSU5EX1FVRVJZX0FDVElWRV9BTEFSTVMQHBItCilNWF9DT01N", + "QU5EX0tJTkRfQUNLTk9XTEVER0VfQUxBUk1fQllfTkFNRRAdEh4KGk1YX0NP", + "TU1BTkRfS0lORF9XUklURV9CVUxLEB4SHwobTVhfQ09NTUFORF9LSU5EX1dS", + "SVRFMl9CVUxLEB8SJgoiTVhfQ09NTUFORF9LSU5EX1dSSVRFX1NFQ1VSRURf", + "QlVMSxAgEicKI01YX0NPTU1BTkRfS0lORF9XUklURV9TRUNVUkVEMl9CVUxL", + "ECESHQoZTVhfQ09NTUFORF9LSU5EX1JFQURfQlVMSxAiEisKJ01YX0NPTU1B", + "TkRfS0lORF9VUERBVEVfQUxBUk1fV0FUQ0hfTElTVBAjEhgKFE1YX0NPTU1B", + "TkRfS0lORF9QSU5HEGQSJQohTVhfQ09NTUFORF9LSU5EX0dFVF9TRVNTSU9O", + "X1NUQVRFEGUSIwofTVhfQ09NTUFORF9LSU5EX0dFVF9XT1JLRVJfSU5GTxBm", + "EiAKHE1YX0NPTU1BTkRfS0lORF9EUkFJTl9FVkVOVFMQZxIjCh9NWF9DT01N", + "QU5EX0tJTkRfU0hVVERPV05fV09SS0VSEGgqegoRQWxhcm1Qcm92aWRlck1v", + "ZGUSIwofQUxBUk1fUFJPVklERVJfTU9ERV9VTlNQRUNJRklFRBAAEiAKHEFM", + "QVJNX1BST1ZJREVSX01PREVfQUxBUk1NR1IQARIeChpBTEFSTV9QUk9WSURF", + "Ul9NT0RFX1NVQlRBRxACKq0CCg1NeEV2ZW50RmFtaWx5Eh8KG01YX0VWRU5U", + "X0ZBTUlMWV9VTlNQRUNJRklFRBAAEiIKHk1YX0VWRU5UX0ZBTUlMWV9PTl9E", + "QVRBX0NIQU5HRRABEiUKIU1YX0VWRU5UX0ZBTUlMWV9PTl9XUklURV9DT01Q", + "TEVURRACEiYKIk1YX0VWRU5UX0ZBTUlMWV9PUEVSQVRJT05fQ09NUExFVEUQ", + "AxIrCidNWF9FVkVOVF9GQU1JTFlfT05fQlVGRkVSRURfREFUQV9DSEFOR0UQ", + "BBInCiNNWF9FVkVOVF9GQU1JTFlfT05fQUxBUk1fVFJBTlNJVElPThAFEjIK", + "Lk1YX0VWRU5UX0ZBTUlMWV9PTl9BTEFSTV9QUk9WSURFUl9NT0RFX0NIQU5H", + "RUQQBirKAQoTQWxhcm1UcmFuc2l0aW9uS2luZBIlCiFBTEFSTV9UUkFOU0lU", + "SU9OX0tJTkRfVU5TUEVDSUZJRUQQABIfChtBTEFSTV9UUkFOU0lUSU9OX0tJ", + "TkRfUkFJU0UQARIlCiFBTEFSTV9UUkFOU0lUSU9OX0tJTkRfQUNLTk9XTEVE", + "R0UQAhIfChtBTEFSTV9UUkFOU0lUSU9OX0tJTkRfQ0xFQVIQAxIjCh9BTEFS", + "TV9UUkFOU0lUSU9OX0tJTkRfUkVUUklHR0VSEAQqqgEKE0FsYXJtQ29uZGl0", + "aW9uU3RhdGUSJQohQUxBUk1fQ09ORElUSU9OX1NUQVRFX1VOU1BFQ0lGSUVE", + "EAASIAocQUxBUk1fQ09ORElUSU9OX1NUQVRFX0FDVElWRRABEiYKIkFMQVJN", + "X0NPTkRJVElPTl9TVEFURV9BQ1RJVkVfQUNLRUQQAhIiCh5BTEFSTV9DT05E", + "SVRJT05fU1RBVEVfSU5BQ1RJVkUQAyqlAwoQTXhTdGF0dXNDYXRlZ29yeRIi", + "Ch5NWF9TVEFUVVNfQ0FURUdPUllfVU5TUEVDSUZJRUQQABIeChpNWF9TVEFU", + "VVNfQ0FURUdPUllfVU5LTk9XThABEhkKFU1YX1NUQVRVU19DQVRFR09SWV9P", + "SxACEh4KGk1YX1NUQVRVU19DQVRFR09SWV9QRU5ESU5HEAMSHgoaTVhfU1RB", + "VFVTX0NBVEVHT1JZX1dBUk5JTkcQBBIqCiZNWF9TVEFUVVNfQ0FURUdPUllf", + "Q09NTVVOSUNBVElPTl9FUlJPUhAFEioKJk1YX1NUQVRVU19DQVRFR09SWV9D", + "T05GSUdVUkFUSU9OX0VSUk9SEAYSKAokTVhfU1RBVFVTX0NBVEVHT1JZX09Q", + "RVJBVElPTkFMX0VSUk9SEAcSJQohTVhfU1RBVFVTX0NBVEVHT1JZX1NFQ1VS", + "SVRZX0VSUk9SEAgSJQohTVhfU1RBVFVTX0NBVEVHT1JZX1NPRlRXQVJFX0VS", + "Uk9SEAkSIgoeTVhfU1RBVFVTX0NBVEVHT1JZX09USEVSX0VSUk9SEAoqygIK", + "Dk14U3RhdHVzU291cmNlEiAKHE1YX1NUQVRVU19TT1VSQ0VfVU5TUEVDSUZJ", + "RUQQABIcChhNWF9TVEFUVVNfU09VUkNFX1VOS05PV04QARIjCh9NWF9TVEFU", + "VVNfU09VUkNFX1JFUVVFU1RJTkdfTE1YEAISIwofTVhfU1RBVFVTX1NPVVJD", + "RV9SRVNQT05ESU5HX0xNWBADEiMKH01YX1NUQVRVU19TT1VSQ0VfUkVRVUVT", + "VElOR19OTVgQBBIjCh9NWF9TVEFUVVNfU09VUkNFX1JFU1BPTkRJTkdfTk1Y", + "EAUSMQotTVhfU1RBVFVTX1NPVVJDRV9SRVFVRVNUSU5HX0FVVE9NQVRJT05f", + "T0JKRUNUEAYSMQotTVhfU1RBVFVTX1NPVVJDRV9SRVNQT05ESU5HX0FVVE9N", + "QVRJT05fT0JKRUNUEAcq3QQKCk14RGF0YVR5cGUSHAoYTVhfREFUQV9UWVBF", + "X1VOU1BFQ0lGSUVEEAASGAoUTVhfREFUQV9UWVBFX1VOS05PV04QARIYChRN", + "WF9EQVRBX1RZUEVfTk9fREFUQRACEhgKFE1YX0RBVEFfVFlQRV9CT09MRUFO", + "EAMSGAoUTVhfREFUQV9UWVBFX0lOVEVHRVIQBBIWChJNWF9EQVRBX1RZUEVf", + "RkxPQVQQBRIXChNNWF9EQVRBX1RZUEVfRE9VQkxFEAYSFwoTTVhfREFUQV9U", + "WVBFX1NUUklORxAHEhUKEU1YX0RBVEFfVFlQRV9USU1FEAgSHQoZTVhfREFU", + "QV9UWVBFX0VMQVBTRURfVElNRRAJEh8KG01YX0RBVEFfVFlQRV9SRUZFUkVO", + "Q0VfVFlQRRAKEhwKGE1YX0RBVEFfVFlQRV9TVEFUVVNfVFlQRRALEhUKEU1Y", + "X0RBVEFfVFlQRV9FTlVNEAwSLQopTVhfREFUQV9UWVBFX1NFQ1VSSVRZX0NM", + "QVNTSUZJQ0FUSU9OX0VOVU0QDRIiCh5NWF9EQVRBX1RZUEVfREFUQV9RVUFM", + "SVRZX1RZUEUQDhIfChtNWF9EQVRBX1RZUEVfUVVBTElGSUVEX0VOVU0QDxIh", + "Ch1NWF9EQVRBX1RZUEVfUVVBTElGSUVEX1NUUlVDVBAQEikKJU1YX0RBVEFf", + "VFlQRV9JTlRFUk5BVElPTkFMSVpFRF9TVFJJTkcQERIbChdNWF9EQVRBX1RZ", + "UEVfQklHX1NUUklORxASEhQKEE1YX0RBVEFfVFlQRV9FTkQQEyqjAwoSUHJv", + "dG9jb2xTdGF0dXNDb2RlEiQKIFBST1RPQ09MX1NUQVRVU19DT0RFX1VOU1BF", + "Q0lGSUVEEAASGwoXUFJPVE9DT0xfU1RBVFVTX0NPREVfT0sQARIoCiRQUk9U", + "T0NPTF9TVEFUVVNfQ09ERV9JTlZBTElEX1JFUVVFU1QQAhIqCiZQUk9UT0NP", + "TF9TVEFUVVNfQ09ERV9TRVNTSU9OX05PVF9GT1VORBADEioKJlBST1RPQ09M", + "X1NUQVRVU19DT0RFX1NFU1NJT05fTk9UX1JFQURZEAQSKwonUFJPVE9DT0xf", + "U1RBVFVTX0NPREVfV09SS0VSX1VOQVZBSUxBQkxFEAUSIAocUFJPVE9DT0xf", + "U1RBVFVTX0NPREVfVElNRU9VVBAGEiEKHVBST1RPQ09MX1NUQVRVU19DT0RF", + "X0NBTkNFTEVEEAcSKwonUFJPVE9DT0xfU1RBVFVTX0NPREVfUFJPVE9DT0xf", + "VklPTEFUSU9OEAgSKQolUFJPVE9DT0xfU1RBVFVTX0NPREVfTVhBQ0NFU1Nf", + "RkFJTFVSRRAJKr8CCgxTZXNzaW9uU3RhdGUSHQoZU0VTU0lPTl9TVEFURV9V", + "TlNQRUNJRklFRBAAEhoKFlNFU1NJT05fU1RBVEVfQ1JFQVRJTkcQARIhCh1T", + "RVNTSU9OX1NUQVRFX1NUQVJUSU5HX1dPUktFUhACEiIKHlNFU1NJT05fU1RB", + "VEVfV0FJVElOR19GT1JfUElQRRADEh0KGVNFU1NJT05fU1RBVEVfSEFORFNI", + "QUtJTkcQBBIlCiFTRVNTSU9OX1NUQVRFX0lOSVRJQUxJWklOR19XT1JLRVIQ", + "BRIXChNTRVNTSU9OX1NUQVRFX1JFQURZEAYSGQoVU0VTU0lPTl9TVEFURV9D", + "TE9TSU5HEAcSGAoUU0VTU0lPTl9TVEFURV9DTE9TRUQQCBIZChVTRVNTSU9O", + "X1NUQVRFX0ZBVUxURUQQCTLDBQoPTXhBY2Nlc3NHYXRld2F5El0KC09wZW5T", + "ZXNzaW9uEicubXhhY2Nlc3NfZ2F0ZXdheS52MS5PcGVuU2Vzc2lvblJlcXVl", + "c3QaJS5teGFjY2Vzc19nYXRld2F5LnYxLk9wZW5TZXNzaW9uUmVwbHkSYAoM", + "Q2xvc2VTZXNzaW9uEigubXhhY2Nlc3NfZ2F0ZXdheS52MS5DbG9zZVNlc3Np", + "b25SZXF1ZXN0GiYubXhhY2Nlc3NfZ2F0ZXdheS52MS5DbG9zZVNlc3Npb25S", + "ZXBseRJUCgZJbnZva2USJS5teGFjY2Vzc19nYXRld2F5LnYxLk14Q29tbWFu", + "ZFJlcXVlc3QaIy5teGFjY2Vzc19nYXRld2F5LnYxLk14Q29tbWFuZFJlcGx5", + "ElgKDFN0cmVhbUV2ZW50cxIoLm14YWNjZXNzX2dhdGV3YXkudjEuU3RyZWFt", + "RXZlbnRzUmVxdWVzdBocLm14YWNjZXNzX2dhdGV3YXkudjEuTXhFdmVudDAB", + "EmwKEEFja25vd2xlZGdlQWxhcm0SLC5teGFjY2Vzc19nYXRld2F5LnYxLkFj", + "a25vd2xlZGdlQWxhcm1SZXF1ZXN0GioubXhhY2Nlc3NfZ2F0ZXdheS52MS5B", + "Y2tub3dsZWRnZUFsYXJtUmVwbHkSYQoMU3RyZWFtQWxhcm1zEigubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5TdHJlYW1BbGFybXNSZXF1ZXN0GiUubXhhY2Nlc3Nf", + "Z2F0ZXdheS52MS5BbGFybUZlZWRNZXNzYWdlMAESbgoRUXVlcnlBY3RpdmVB", + "bGFybXMSLS5teGFjY2Vzc19nYXRld2F5LnYxLlF1ZXJ5QWN0aXZlQWxhcm1z", + "UmVxdWVzdBooLm14YWNjZXNzX2dhdGV3YXkudjEuQWN0aXZlQWxhcm1TbmFw", + "c2hvdDABQiaqAiNaQi5NT00uV1cuTXhHYXRld2F5LkNvbnRyYWN0cy5Qcm90", + "b2IGcHJvdG8z")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.MxCommandKind), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmProviderMode), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.MxEventFamily), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmTransitionKind), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmConditionState), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.MxStatusCategory), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.MxStatusSource), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.MxDataType), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.ProtocolStatusCode), typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.SessionState), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -575,9 +578,9 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.UnsubscribeAlarmsCommand), global::ZB.MOM.WW.MxGateway.Contracts.Proto.UnsubscribeAlarmsCommand.Parser, null, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmSubtagTarget), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmSubtagTarget.Parser, new[]{ "AlarmFullReference", "SourceObjectReference", "ActiveSubtag", "AckedSubtag", "AckCommentSubtag", "PrioritySubtag" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmFailoverConfig), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmFailoverConfig.Parser, new[]{ "ConsecutiveFailureThreshold", "FailbackProbeIntervalSeconds", "FailbackStableProbes" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmCommand), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmCommand.Parser, new[]{ "AlarmGuid", "Comment", "OperatorUser", "OperatorNode", "OperatorDomain", "OperatorFullName" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmCommand), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmCommand.Parser, new[]{ "AlarmGuid", "Comment", "OperatorUser", "OperatorNode", "OperatorDomain", "OperatorFullName", "OperatorPassword" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.QueryActiveAlarmsCommand), global::ZB.MOM.WW.MxGateway.Contracts.Proto.QueryActiveAlarmsCommand.Parser, new[]{ "AlarmFilterPrefix" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand.Parser, new[]{ "AlarmName", "ProviderName", "GroupName", "Comment", "OperatorUser", "OperatorNode", "OperatorDomain", "OperatorFullName" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand.Parser, new[]{ "AlarmName", "ProviderName", "GroupName", "Comment", "OperatorUser", "OperatorNode", "OperatorDomain", "OperatorFullName", "OperatorPassword" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.UnsubscribeBulkCommand), global::ZB.MOM.WW.MxGateway.Contracts.Proto.UnsubscribeBulkCommand.Parser, new[]{ "ServerHandle", "ItemHandles" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.WriteBulkCommand), global::ZB.MOM.WW.MxGateway.Contracts.Proto.WriteBulkCommand.Parser, new[]{ "ServerHandle", "Entries" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.WriteBulkEntry), global::ZB.MOM.WW.MxGateway.Contracts.Proto.WriteBulkEntry.Parser, new[]{ "ItemHandle", "Value", "UserId" }, null, null, null, null), @@ -622,7 +625,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.OnAlarmTransitionEvent), global::ZB.MOM.WW.MxGateway.Contracts.Proto.OnAlarmTransitionEvent.Parser, new[]{ "AlarmFullReference", "SourceObjectReference", "AlarmTypeName", "TransitionKind", "Severity", "OriginalRaiseTimestamp", "TransitionTimestamp", "OperatorUser", "OperatorComment", "Category", "Description", "CurrentValue", "LimitValue", "Degraded", "SourceProvider" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.OnAlarmProviderModeChangedEvent), global::ZB.MOM.WW.MxGateway.Contracts.Proto.OnAlarmProviderModeChangedEvent.Parser, new[]{ "Mode", "Reason", "Hresult", "At" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.ActiveAlarmSnapshot), global::ZB.MOM.WW.MxGateway.Contracts.Proto.ActiveAlarmSnapshot.Parser, new[]{ "AlarmFullReference", "SourceObjectReference", "AlarmTypeName", "Severity", "OriginalRaiseTimestamp", "CurrentState", "Category", "Description", "LastTransitionTimestamp", "OperatorUser", "OperatorComment", "CurrentValue", "LimitValue", "Degraded", "SourceProvider", "FromTruncatedSnapshot" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmRequest), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmRequest.Parser, new[]{ "ClientCorrelationId", "AlarmFullReference", "Comment", "OperatorUser" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmRequest), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmRequest.Parser, new[]{ "ClientCorrelationId", "AlarmFullReference", "Comment", "OperatorUser", "OperatorPassword", "OperatorDomain" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmReply), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AcknowledgeAlarmReply.Parser, new[]{ "CorrelationId", "ProtocolStatus", "Hresult", "Status", "DiagnosticMessage" }, new[]{ "Hresult" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.StreamAlarmsRequest), global::ZB.MOM.WW.MxGateway.Contracts.Proto.StreamAlarmsRequest.Parser, new[]{ "ClientCorrelationId", "AlarmFilterPrefix" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmFeedMessage), global::ZB.MOM.WW.MxGateway.Contracts.Proto.AlarmFeedMessage.Parser, new[]{ "ActiveAlarm", "SnapshotComplete", "Transition", "ProviderStatus", "SnapshotStatus" }, new[]{ "Payload" }, null, null, null), @@ -12586,10 +12589,13 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { } /// - /// Acknowledge a single alarm by its GUID. Operator identity fields are - /// recorded atomically with the ack transition in the alarm-history log. - /// The reply's hresult / native_status surfaces AVEVA's - /// AlarmAckByGUID return code. + /// Acknowledge a single alarm by its GUID. The worker resolves the GUID to the + /// alarm's Galaxy reference from its active-alarm snapshot and acknowledges it + /// by writing `comment` to `<TAGNAME>.AckMsg` over MXAccess after + /// AuthenticateUser as the operator, so the alarm history records the real + /// operator. The reply's hresult / native_status is 0 when the write was + /// applied (or sent but unconfirmed), otherwise the AuthenticateUser HRESULT or + /// the OnWriteComplete status detail. /// [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] public sealed partial class AcknowledgeAlarmCommand : pb::IMessage @@ -12632,6 +12638,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { operatorNode_ = other.operatorNode_; operatorDomain_ = other.operatorDomain_; operatorFullName_ = other.operatorFullName_; + operatorPassword_ = other.operatorPassword_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -12716,6 +12723,23 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { } } + /// Field number for the "operator_password" field. + public const int OperatorPasswordFieldNumber = 7; + private string operatorPassword_ = ""; + /// + /// Operator credential used for AuthenticateUser before the AckMsg write. + /// Implementations must keep this field out of logs, metrics labels, command + /// lines, and diagnostics. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorPassword { + get { return operatorPassword_; } + set { + operatorPassword_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -12737,6 +12761,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (OperatorNode != other.OperatorNode) return false; if (OperatorDomain != other.OperatorDomain) return false; if (OperatorFullName != other.OperatorFullName) return false; + if (OperatorPassword != other.OperatorPassword) return false; return Equals(_unknownFields, other._unknownFields); } @@ -12750,6 +12775,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (OperatorNode.Length != 0) hash ^= OperatorNode.GetHashCode(); if (OperatorDomain.Length != 0) hash ^= OperatorDomain.GetHashCode(); if (OperatorFullName.Length != 0) hash ^= OperatorFullName.GetHashCode(); + if (OperatorPassword.Length != 0) hash ^= OperatorPassword.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -12792,6 +12818,10 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { output.WriteRawTag(50); output.WriteString(OperatorFullName); } + if (OperatorPassword.Length != 0) { + output.WriteRawTag(58); + output.WriteString(OperatorPassword); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -12826,6 +12856,10 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { output.WriteRawTag(50); output.WriteString(OperatorFullName); } + if (OperatorPassword.Length != 0) { + output.WriteRawTag(58); + output.WriteString(OperatorPassword); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -12854,6 +12888,9 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (OperatorFullName.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorFullName); } + if (OperatorPassword.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorPassword); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -12884,6 +12921,9 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (other.OperatorFullName.Length != 0) { OperatorFullName = other.OperatorFullName; } + if (other.OperatorPassword.Length != 0) { + OperatorPassword = other.OperatorPassword; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -12927,6 +12967,10 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { OperatorFullName = input.ReadString(); break; } + case 58: { + OperatorPassword = input.ReadString(); + break; + } } } #endif @@ -12970,6 +13014,10 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { OperatorFullName = input.ReadString(); break; } + case 58: { + OperatorPassword = input.ReadString(); + break; + } } } } @@ -13183,9 +13231,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { /// /// Acknowledge a single alarm by its (name, provider, group) tuple. Used /// when the public RPC's AlarmFullReference (Provider!Group.Tag) cannot - /// be resolved to a GUID directly. The worker invokes - /// wwAlarmConsumerClass.AlarmAckByName which reaches the same alarm - /// history path as AlarmAckByGUID. + /// be resolved to a GUID directly. The worker acknowledges by writing `comment` to `<alarm_name>.AckMsg` (Galaxy provider only) after AuthenticateUser as the operator. /// [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] public sealed partial class AcknowledgeAlarmByNameCommand : pb::IMessage @@ -13230,6 +13276,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { operatorNode_ = other.operatorNode_; operatorDomain_ = other.operatorDomain_; operatorFullName_ = other.operatorFullName_; + operatorPassword_ = other.operatorPassword_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -13346,6 +13393,23 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { } } + /// Field number for the "operator_password" field. + public const int OperatorPasswordFieldNumber = 9; + private string operatorPassword_ = ""; + /// + /// Operator credential used for AuthenticateUser before the AckMsg write. + /// Implementations must keep this field out of logs, metrics labels, command + /// lines, and diagnostics. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorPassword { + get { return operatorPassword_; } + set { + operatorPassword_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -13369,6 +13433,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (OperatorNode != other.OperatorNode) return false; if (OperatorDomain != other.OperatorDomain) return false; if (OperatorFullName != other.OperatorFullName) return false; + if (OperatorPassword != other.OperatorPassword) return false; return Equals(_unknownFields, other._unknownFields); } @@ -13384,6 +13449,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (OperatorNode.Length != 0) hash ^= OperatorNode.GetHashCode(); if (OperatorDomain.Length != 0) hash ^= OperatorDomain.GetHashCode(); if (OperatorFullName.Length != 0) hash ^= OperatorFullName.GetHashCode(); + if (OperatorPassword.Length != 0) hash ^= OperatorPassword.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -13434,6 +13500,10 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { output.WriteRawTag(66); output.WriteString(OperatorFullName); } + if (OperatorPassword.Length != 0) { + output.WriteRawTag(74); + output.WriteString(OperatorPassword); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -13476,6 +13546,10 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { output.WriteRawTag(66); output.WriteString(OperatorFullName); } + if (OperatorPassword.Length != 0) { + output.WriteRawTag(74); + output.WriteString(OperatorPassword); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -13510,6 +13584,9 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (OperatorFullName.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorFullName); } + if (OperatorPassword.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorPassword); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -13546,6 +13623,9 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (other.OperatorFullName.Length != 0) { OperatorFullName = other.OperatorFullName; } + if (other.OperatorPassword.Length != 0) { + OperatorPassword = other.OperatorPassword; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -13597,6 +13677,10 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { OperatorFullName = input.ReadString(); break; } + case 74: { + OperatorPassword = input.ReadString(); + break; + } } } #endif @@ -13648,6 +13732,10 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { OperatorFullName = input.ReadString(); break; } + case 74: { + OperatorPassword = input.ReadString(); + break; + } } } } @@ -23278,11 +23366,11 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { /// Reply payload for AcknowledgeAlarmCommand AND /// AcknowledgeAlarmByNameCommand — both ack command kinds reuse this /// payload case (`MxCommandReply.acknowledge_alarm`); there is no - /// dedicated by-name reply case. Surfaces AVEVA's native ack return - /// code (AlarmAckByGUID for the GUID arm, AlarmAckByName for the - /// by-name arm); 0 means success. The MxCommandReply's hresult field + /// dedicated by-name reply case. Surfaces the ack outcome: 0 when the + /// AckMsg write was applied or sent but unconfirmed; otherwise the + /// AuthenticateUser HRESULT or the OnWriteComplete status detail. The MxCommandReply's hresult field /// carries the same value and is preferred for protocol consumers — - /// this payload exists so the gateway-side WorkerAlarmRpcDispatcher + /// this payload exists so GatewayAlarmMonitor /// can echo native_status into AcknowledgeAlarmReply.hresult without /// unpacking the outer envelope. /// @@ -27891,6 +27979,8 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { alarmFullReference_ = other.alarmFullReference_; comment_ = other.comment_; operatorUser_ = other.operatorUser_; + operatorPassword_ = other.operatorPassword_; + operatorDomain_ = other.operatorDomain_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -27958,6 +28048,41 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { } } + /// Field number for the "operator_password" field. + public const int OperatorPasswordFieldNumber = 6; + private string operatorPassword_ = ""; + /// + /// Operator's Galaxy (or OS) password. The gateway authenticates as + /// operator_user with it before writing the acknowledgement so the alarm + /// history records the real operator. May be empty for accounts without a + /// password. Credential-sensitive: implementations must keep this field out + /// of logs, metrics labels, command lines, and diagnostics. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorPassword { + get { return operatorPassword_; } + set { + operatorPassword_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "operator_domain" field. + public const int OperatorDomainFieldNumber = 7; + private string operatorDomain_ = ""; + /// + /// Optional domain for OS-authenticated galaxies. When set the gateway + /// authenticates as "<operator_domain>\<operator_user>". + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorDomain { + get { return operatorDomain_; } + set { + operatorDomain_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -27977,6 +28102,8 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (AlarmFullReference != other.AlarmFullReference) return false; if (Comment != other.Comment) return false; if (OperatorUser != other.OperatorUser) return false; + if (OperatorPassword != other.OperatorPassword) return false; + if (OperatorDomain != other.OperatorDomain) return false; return Equals(_unknownFields, other._unknownFields); } @@ -27988,6 +28115,8 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (AlarmFullReference.Length != 0) hash ^= AlarmFullReference.GetHashCode(); if (Comment.Length != 0) hash ^= Comment.GetHashCode(); if (OperatorUser.Length != 0) hash ^= OperatorUser.GetHashCode(); + if (OperatorPassword.Length != 0) hash ^= OperatorPassword.GetHashCode(); + if (OperatorDomain.Length != 0) hash ^= OperatorDomain.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -28022,6 +28151,14 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { output.WriteRawTag(42); output.WriteString(OperatorUser); } + if (OperatorPassword.Length != 0) { + output.WriteRawTag(50); + output.WriteString(OperatorPassword); + } + if (OperatorDomain.Length != 0) { + output.WriteRawTag(58); + output.WriteString(OperatorDomain); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -28048,6 +28185,14 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { output.WriteRawTag(42); output.WriteString(OperatorUser); } + if (OperatorPassword.Length != 0) { + output.WriteRawTag(50); + output.WriteString(OperatorPassword); + } + if (OperatorDomain.Length != 0) { + output.WriteRawTag(58); + output.WriteString(OperatorDomain); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -28070,6 +28215,12 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (OperatorUser.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorUser); } + if (OperatorPassword.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorPassword); + } + if (OperatorDomain.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorDomain); + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -28094,6 +28245,12 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { if (other.OperatorUser.Length != 0) { OperatorUser = other.OperatorUser; } + if (other.OperatorPassword.Length != 0) { + OperatorPassword = other.OperatorPassword; + } + if (other.OperatorDomain.Length != 0) { + OperatorDomain = other.OperatorDomain; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -28129,6 +28286,14 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { OperatorUser = input.ReadString(); break; } + case 50: { + OperatorPassword = input.ReadString(); + break; + } + case 58: { + OperatorDomain = input.ReadString(); + break; + } } } #endif @@ -28164,6 +28329,14 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { OperatorUser = input.ReadString(); break; } + case 50: { + OperatorPassword = input.ReadString(); + break; + } + case 58: { + OperatorDomain = input.ReadString(); + break; + } } } } @@ -28254,8 +28427,7 @@ namespace ZB.MOM.WW.MxGateway.Contracts.Proto { /// /// Native ack return code echoed from the worker. The worker carries the /// ack outcome as a single int32 (AcknowledgeAlarmReplyPayload.native_status, - /// = AlarmAckByName / AlarmAckByGUID return code; 0 = success); the gateway's - /// WorkerAlarmRpcDispatcher copies that value here. This is the authoritative + /// 0 = applied or sent; otherwise the AuthenticateUser HRESULT or OnWriteComplete detail); GatewayAlarmMonitor copies that value here. This is the authoritative /// ack-outcome field for the public RPC. Absent only when the worker reply /// omitted the value entirely (a protocol violation). /// diff --git a/src/ZB.MOM.WW.MxGateway.Contracts/Protos/mxaccess_gateway.proto b/src/ZB.MOM.WW.MxGateway.Contracts/Protos/mxaccess_gateway.proto index 6b00da9..915b1e8 100644 --- a/src/ZB.MOM.WW.MxGateway.Contracts/Protos/mxaccess_gateway.proto +++ b/src/ZB.MOM.WW.MxGateway.Contracts/Protos/mxaccess_gateway.proto @@ -391,10 +391,13 @@ message AlarmFailoverConfig { int32 failback_stable_probes = 3; // clean probes before switching back (>=1) } -// Acknowledge a single alarm by its GUID. Operator identity fields are -// recorded atomically with the ack transition in the alarm-history log. -// The reply's hresult / native_status surfaces AVEVA's -// AlarmAckByGUID return code. +// Acknowledge a single alarm by its GUID. The worker resolves the GUID to the +// alarm's Galaxy reference from its active-alarm snapshot and acknowledges it +// by writing `comment` to `.AckMsg` over MXAccess after +// AuthenticateUser as the operator, so the alarm history records the real +// operator. The reply's hresult / native_status is 0 when the write was +// applied (or sent but unconfirmed), otherwise the AuthenticateUser HRESULT or +// the OnWriteComplete status detail. message AcknowledgeAlarmCommand { // Canonical 8-4-4-4-12 GUID string (e.g. "BCC47053-9542-4D65-BDAA-BCDEA6A32A73"). string alarm_guid = 1; @@ -403,6 +406,10 @@ message AcknowledgeAlarmCommand { string operator_node = 4; string operator_domain = 5; string operator_full_name = 6; + // Operator credential used for AuthenticateUser before the AckMsg write. + // Implementations must keep this field out of logs, metrics labels, command + // lines, and diagnostics. + string operator_password = 7; } // Snapshot the currently-active alarm set. Optional filter prefix scopes @@ -414,9 +421,7 @@ message QueryActiveAlarmsCommand { // Acknowledge a single alarm by its (name, provider, group) tuple. Used // when the public RPC's AlarmFullReference (Provider!Group.Tag) cannot -// be resolved to a GUID directly. The worker invokes -// wwAlarmConsumerClass.AlarmAckByName which reaches the same alarm -// history path as AlarmAckByGUID. +// be resolved to a GUID directly. The worker acknowledges by writing `comment` to `.AckMsg` (Galaxy provider only) after AuthenticateUser as the operator. message AcknowledgeAlarmByNameCommand { // Tag/alarm name (e.g. "TestMachine_001.TestAlarm001"). Tag itself // may contain dots; the gateway-side parser splits on the first dot @@ -431,6 +436,10 @@ message AcknowledgeAlarmByNameCommand { string operator_node = 6; string operator_domain = 7; string operator_full_name = 8; + // Operator credential used for AuthenticateUser before the AckMsg write. + // Implementations must keep this field out of logs, metrics labels, command + // lines, and diagnostics. + string operator_password = 9; } message UnsubscribeBulkCommand { @@ -725,11 +734,11 @@ message DrainEventsReply { // Reply payload for AcknowledgeAlarmCommand AND // AcknowledgeAlarmByNameCommand — both ack command kinds reuse this // payload case (`MxCommandReply.acknowledge_alarm`); there is no -// dedicated by-name reply case. Surfaces AVEVA's native ack return -// code (AlarmAckByGUID for the GUID arm, AlarmAckByName for the -// by-name arm); 0 means success. The MxCommandReply's hresult field +// dedicated by-name reply case. Surfaces the ack outcome: 0 when the +// AckMsg write was applied or sent but unconfirmed; otherwise the +// AuthenticateUser HRESULT or the OnWriteComplete status detail. The MxCommandReply's hresult field // carries the same value and is preferred for protocol consumers — -// this payload exists so the gateway-side WorkerAlarmRpcDispatcher +// this payload exists so GatewayAlarmMonitor // can echo native_status into AcknowledgeAlarmReply.hresult without // unpacking the outer envelope. message AcknowledgeAlarmReplyPayload { @@ -987,6 +996,15 @@ message AcknowledgeAlarmRequest { // Operator principal performing the acknowledgement. The lmxopcua side // resolves this from the OPC UA session prior to invoking the RPC. string operator_user = 5; + // Operator's Galaxy (or OS) password. The gateway authenticates as + // operator_user with it before writing the acknowledgement so the alarm + // history records the real operator. May be empty for accounts without a + // password. Credential-sensitive: implementations must keep this field out + // of logs, metrics labels, command lines, and diagnostics. + string operator_password = 6; + // Optional domain for OS-authenticated galaxies. When set the gateway + // authenticates as "\". + string operator_domain = 7; } message AcknowledgeAlarmReply { @@ -997,8 +1015,7 @@ message AcknowledgeAlarmReply { ProtocolStatus protocol_status = 3; // Native ack return code echoed from the worker. The worker carries the // ack outcome as a single int32 (AcknowledgeAlarmReplyPayload.native_status, - // = AlarmAckByName / AlarmAckByGUID return code; 0 = success); the gateway's - // WorkerAlarmRpcDispatcher copies that value here. This is the authoritative + // 0 = applied or sent; otherwise the AuthenticateUser HRESULT or OnWriteComplete detail); GatewayAlarmMonitor copies that value here. This is the authoritative // ack-outcome field for the public RPC. Absent only when the worker reply // omitted the value entirely (a protocol violation). optional int32 hresult = 4; diff --git a/src/ZB.MOM.WW.MxGateway.Contracts/WorkerLaunchEnvironment.cs b/src/ZB.MOM.WW.MxGateway.Contracts/WorkerLaunchEnvironment.cs index 47a84e1..0ea7988 100644 --- a/src/ZB.MOM.WW.MxGateway.Contracts/WorkerLaunchEnvironment.cs +++ b/src/ZB.MOM.WW.MxGateway.Contracts/WorkerLaunchEnvironment.cs @@ -22,4 +22,10 @@ public static class WorkerLaunchEnvironment /// Maximum alarm records requested in one current-alarm fetch. public const string MaxAlarmsPerFetch = "MXGATEWAY_ALARM_MAX_ALARMS_PER_FETCH"; + + /// + /// MXAccess client name the worker's alarm-ack writer registers with. The + /// Historian records it as the acknowledgement's OperatorNode. + /// + public const string AlarmAckClientName = "MXGATEWAY_ALARM_ACK_CLIENT_NAME"; } diff --git a/src/ZB.MOM.WW.MxGateway.Tests/Contracts/ProtobufContractRoundTripTests.cs b/src/ZB.MOM.WW.MxGateway.Tests/Contracts/ProtobufContractRoundTripTests.cs index 238ca35..f774476 100644 --- a/src/ZB.MOM.WW.MxGateway.Tests/Contracts/ProtobufContractRoundTripTests.cs +++ b/src/ZB.MOM.WW.MxGateway.Tests/Contracts/ProtobufContractRoundTripTests.cs @@ -310,11 +310,47 @@ public sealed class ProtobufContractRoundTripTests AlarmFullReference = "Tank01.Level.HiHi", Comment = "shift handover", OperatorUser = "operator2", + OperatorPassword = "s3cret", + OperatorDomain = "CORP", }; var parsed = AcknowledgeAlarmRequest.Parser.ParseFrom(original.ToByteArray()); Assert.Equal(original, parsed); + Assert.Equal("s3cret", parsed.OperatorPassword); + Assert.Equal("CORP", parsed.OperatorDomain); + } + + /// Verifies that the worker ack commands round-trip the operator password. + [Fact] + public void AcknowledgeAlarmCommands_RoundTripOperatorPassword() + { + MxCommand byGuid = new() + { + Kind = MxCommandKind.AcknowledgeAlarm, + AcknowledgeAlarmCommand = new AcknowledgeAlarmCommand + { + AlarmGuid = "BCC47053-9542-4D65-BDAA-BCDEA6A32A73", + OperatorUser = "alice", + OperatorDomain = "CORP", + OperatorPassword = "s3cret", + }, + }; + MxCommand byName = new() + { + Kind = MxCommandKind.AcknowledgeAlarmByName, + AcknowledgeAlarmByNameCommand = new AcknowledgeAlarmByNameCommand + { + AlarmName = "TestMachine_001.TestAlarm001", + ProviderName = "Galaxy", + GroupName = "TestArea", + OperatorUser = "alice", + OperatorPassword = "s3cret", + }, + }; + + Assert.Equal("s3cret", MxCommand.Parser.ParseFrom(byGuid.ToByteArray()).AcknowledgeAlarmCommand.OperatorPassword); + Assert.Equal("s3cret", MxCommand.Parser.ParseFrom(byName.ToByteArray()).AcknowledgeAlarmByNameCommand.OperatorPassword); } /// Verifies that AcknowledgeAlarmReply round-trips with status, hresult, and diagnostics.