From 4e02927f019b0c03a12a5a588c87fe112f25bcb7 Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Fri, 1 May 2026 11:17:15 -0400 Subject: [PATCH] A.3 (alarm-ack-by-name): public AcknowledgeAlarm now accepts Provider!Group.Tag references MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes the gap where the public AcknowledgeAlarm RPC required canonical GUIDs but OnAlarmTransitionEvent.AlarmFullReference is "Provider!Group.Tag". Adds an AVEVA AlarmAckByName path that wraps wwAlarmConsumerClass.AlarmAckByName so callers can ack with the natural reference. Proto: - New MxCommandKind.AcknowledgeAlarmByName (=29). - New AcknowledgeAlarmByNameCommand(alarm_name, provider_name, group_name, comment, operator_user/node/domain/full_name) on MxCommand oneof. - AcknowledgeAlarmReplyPayload (existing) carries the AVEVA native status; reused for the by-name path. Worker: - IMxAccessAlarmConsumer + WnWrapAlarmConsumer + AlarmDispatcher + AlarmCommandHandler all gain an AcknowledgeByName(name, provider, group, comment, operator-identity) overload that maps to wwAlarmConsumerClass.AlarmAckByName. - MxAccessCommandExecutor: new switch arm routes MxCommandKind.AcknowledgeAlarmByName to the handler. Empty alarm_name yields InvalidRequest; handler exceptions surface as MxaccessFailure. Gateway: - WorkerAlarmRpcDispatcher.TryParseAlarmReference: parses "Provider!Group.Tag" with the convention that the FIRST '!' separates provider, the FIRST '.' after '!' separates group; tag may contain more dots. - AcknowledgeAsync now branches: GUID input → AcknowledgeAlarm command (existing path); reference input → AcknowledgeAlarmByName command (new path); neither parses → InvalidRequest with a clear diagnostic. Tests: 13 new unit tests cover each layer end-to-end: - WorkerAlarmRpcDispatcher.TryParseAlarmReference (3 valid + 8 invalid forms) including the realistic 4-component "Galaxy!TestArea. TestMachine_001.TestAlarm001" reference. - WorkerAlarmRpcDispatcher.AcknowledgeAsync routes references through AcknowledgeAlarmByName + propagates the full operator tuple. - Executor switch arm carries the by-name tuple and rejects empty alarm_name. - AlarmDispatcher.AcknowledgeByName forwards to consumer. - Existing fakes extended for the new overload. Counts: server 308/0, worker 195/3 skip / 1 pre-existing structure-fail (untouched). Solution builds clean. End-to-end alarms-over-gateway now serves the full lmxopcua flow: client.AcknowledgeAlarm(reference="Galaxy!TestArea.TestMachine_001.TestAlarm001", operator_user="alice") → gateway parses → IPC AcknowledgeAlarmByName → worker AlarmAckByName → AVEVA history. The remaining piece for full parity is a live dev-rig smoke test. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../Generated/MxaccessGateway.cs | 1272 ++++++++++++----- .../Protos/mxaccess_gateway.proto | 23 + .../Sessions/WorkerAlarmRpcDispatcher.cs | 113 +- .../Sessions/WorkerAlarmRpcDispatcherTests.cs | 128 +- .../MxAccess/AlarmCommandExecutorTests.cs | 68 + .../MxAccess/AlarmCommandHandlerTests.cs | 12 + .../MxAccess/AlarmDispatcherTests.cs | 38 + .../MxAccess/AlarmCommandHandler.cs | 37 + .../MxAccess/AlarmDispatcher.cs | 27 + .../MxAccess/IMxAccessAlarmConsumer.cs | 17 + .../MxAccess/MxAccessCommandExecutor.cs | 49 + .../MxAccess/WnWrapAlarmConsumer.cs | 27 + 12 files changed, 1390 insertions(+), 421 deletions(-) diff --git a/src/MxGateway.Contracts/Generated/MxaccessGateway.cs b/src/MxGateway.Contracts/Generated/MxaccessGateway.cs index d49b977..ed8b018 100644 --- a/src/MxGateway.Contracts/Generated/MxaccessGateway.cs +++ b/src/MxGateway.Contracts/Generated/MxaccessGateway.cs @@ -46,7 +46,7 @@ namespace MxGateway.Contracts.Proto { "ZnRlcl93b3JrZXJfc2VxdWVuY2UYAiABKAQidgoQTXhDb21tYW5kUmVxdWVz", "dBISCgpzZXNzaW9uX2lkGAEgASgJEh0KFWNsaWVudF9jb3JyZWxhdGlvbl9p", "ZBgCIAEoCRIvCgdjb21tYW5kGAMgASgLMh4ubXhhY2Nlc3NfZ2F0ZXdheS52", - "MS5NeENvbW1hbmQijhIKCU14Q29tbWFuZBIwCgRraW5kGAEgASgOMiIubXhh", + "MS5NeENvbW1hbmQi7xIKCU14Q29tbWFuZBIwCgRraW5kGAEgASgOMiIubXhh", "Y2Nlc3NfZ2F0ZXdheS52MS5NeENvbW1hbmRLaW5kEjgKCHJlZ2lzdGVyGAog", "ASgLMiQubXhhY2Nlc3NfZ2F0ZXdheS52MS5SZWdpc3RlckNvbW1hbmRIABI8", "Cgp1bnJlZ2lzdGVyGAsgASgLMiYubXhhY2Nlc3NfZ2F0ZXdheS52MS5VbnJl", @@ -90,329 +90,337 @@ namespace MxGateway.Contracts.Proto { "b21tYW5kGCQgASgLMiwubXhhY2Nlc3NfZ2F0ZXdheS52MS5BY2tub3dsZWRn", "ZUFsYXJtQ29tbWFuZEgAElQKG3F1ZXJ5X2FjdGl2ZV9hbGFybXNfY29tbWFu", "ZBglIAEoCzItLm14YWNjZXNzX2dhdGV3YXkudjEuUXVlcnlBY3RpdmVBbGFy", - "bXNDb21tYW5kSAASMAoEcGluZxhkIAEoCzIgLm14YWNjZXNzX2dhdGV3YXku", - "djEuUGluZ0NvbW1hbmRIABJIChFnZXRfc2Vzc2lvbl9zdGF0ZRhlIAEoCzIr", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuR2V0U2Vzc2lvblN0YXRlQ29tbWFuZEgA", - "EkQKD2dldF93b3JrZXJfaW5mbxhmIAEoCzIpLm14YWNjZXNzX2dhdGV3YXku", - "djEuR2V0V29ya2VySW5mb0NvbW1hbmRIABI/CgxkcmFpbl9ldmVudHMYZyAB", - "KAsyJy5teGFjY2Vzc19nYXRld2F5LnYxLkRyYWluRXZlbnRzQ29tbWFuZEgA", - "EkUKD3NodXRkb3duX3dvcmtlchhoIAEoCzIqLm14YWNjZXNzX2dhdGV3YXku", - "djEuU2h1dGRvd25Xb3JrZXJDb21tYW5kSABCCQoHcGF5bG9hZCImCg9SZWdp", - "c3RlckNvbW1hbmQSEwoLY2xpZW50X25hbWUYASABKAkiKgoRVW5yZWdpc3Rl", - "ckNvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBSJACg5BZGRJdGVtQ29t", - "bWFuZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhcKD2l0ZW1fZGVmaW5pdGlv", - "bhgCIAEoCSJXCg9BZGRJdGVtMkNvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgB", - "IAEoBRIXCg9pdGVtX2RlZmluaXRpb24YAiABKAkSFAoMaXRlbV9jb250ZXh0", - "GAMgASgJIj8KEVJlbW92ZUl0ZW1Db21tYW5kEhUKDXNlcnZlcl9oYW5kbGUY", - "ASABKAUSEwoLaXRlbV9oYW5kbGUYAiABKAUiOwoNQWR2aXNlQ29tbWFuZBIV", - "Cg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhMKC2l0ZW1faGFuZGxlGAIgASgFIj0K", - "D1VuQWR2aXNlQ29tbWFuZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhMKC2l0", - "ZW1faGFuZGxlGAIgASgFIkYKGEFkdmlzZVN1cGVydmlzb3J5Q29tbWFuZBIV", - "Cg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhMKC2l0ZW1faGFuZGxlGAIgASgFIl4K", - "FkFkZEJ1ZmZlcmVkSXRlbUNvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEo", - "BRIXCg9pdGVtX2RlZmluaXRpb24YAiABKAkSFAoMaXRlbV9jb250ZXh0GAMg", - "ASgJIl8KIFNldEJ1ZmZlcmVkVXBkYXRlSW50ZXJ2YWxDb21tYW5kEhUKDXNl", - "cnZlcl9oYW5kbGUYASABKAUSJAocdXBkYXRlX2ludGVydmFsX21pbGxpc2Vj", - "b25kcxgCIAEoBSI8Cg5TdXNwZW5kQ29tbWFuZBIVCg1zZXJ2ZXJfaGFuZGxl", - "GAEgASgFEhMKC2l0ZW1faGFuZGxlGAIgASgFIj0KD0FjdGl2YXRlQ29tbWFu", - "ZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhMKC2l0ZW1faGFuZGxlGAIgASgF", - "IngKDFdyaXRlQ29tbWFuZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhMKC2l0", - "ZW1faGFuZGxlGAIgASgFEisKBXZhbHVlGAMgASgLMhwubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5NeFZhbHVlEg8KB3VzZXJfaWQYBCABKAUisAEKDVdyaXRlMkNv", + "bXNDb21tYW5kSAASXwohYWNrbm93bGVkZ2VfYWxhcm1fYnlfbmFtZV9jb21t", + "YW5kGCYgASgLMjIubXhhY2Nlc3NfZ2F0ZXdheS52MS5BY2tub3dsZWRnZUFs", + "YXJtQnlOYW1lQ29tbWFuZEgAEjAKBHBpbmcYZCABKAsyIC5teGFjY2Vzc19n", + "YXRld2F5LnYxLlBpbmdDb21tYW5kSAASSAoRZ2V0X3Nlc3Npb25fc3RhdGUY", + "ZSABKAsyKy5teGFjY2Vzc19nYXRld2F5LnYxLkdldFNlc3Npb25TdGF0ZUNv", + "bW1hbmRIABJECg9nZXRfd29ya2VyX2luZm8YZiABKAsyKS5teGFjY2Vzc19n", + "YXRld2F5LnYxLkdldFdvcmtlckluZm9Db21tYW5kSAASPwoMZHJhaW5fZXZl", + "bnRzGGcgASgLMicubXhhY2Nlc3NfZ2F0ZXdheS52MS5EcmFpbkV2ZW50c0Nv", + "bW1hbmRIABJFCg9zaHV0ZG93bl93b3JrZXIYaCABKAsyKi5teGFjY2Vzc19n", + "YXRld2F5LnYxLlNodXRkb3duV29ya2VyQ29tbWFuZEgAQgkKB3BheWxvYWQi", + "JgoPUmVnaXN0ZXJDb21tYW5kEhMKC2NsaWVudF9uYW1lGAEgASgJIioKEVVu", + "cmVnaXN0ZXJDb21tYW5kEhUKDXNlcnZlcl9oYW5kbGUYASABKAUiQAoOQWRk", + "SXRlbUNvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRIXCg9pdGVtX2Rl", + "ZmluaXRpb24YAiABKAkiVwoPQWRkSXRlbTJDb21tYW5kEhUKDXNlcnZlcl9o", + "YW5kbGUYASABKAUSFwoPaXRlbV9kZWZpbml0aW9uGAIgASgJEhQKDGl0ZW1f", + "Y29udGV4dBgDIAEoCSI/ChFSZW1vdmVJdGVtQ29tbWFuZBIVCg1zZXJ2ZXJf", + "aGFuZGxlGAEgASgFEhMKC2l0ZW1faGFuZGxlGAIgASgFIjsKDUFkdmlzZUNv", "bW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRITCgtpdGVtX2hhbmRsZRgC", - "IAEoBRIrCgV2YWx1ZRgDIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhW", - "YWx1ZRI1Cg90aW1lc3RhbXBfdmFsdWUYBCABKAsyHC5teGFjY2Vzc19nYXRl", - "d2F5LnYxLk14VmFsdWUSDwoHdXNlcl9pZBgFIAEoBSKhAQoTV3JpdGVTZWN1", - "cmVkQ29tbWFuZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhMKC2l0ZW1faGFu", - "ZGxlGAIgASgFEhcKD2N1cnJlbnRfdXNlcl9pZBgDIAEoBRIYChB2ZXJpZmll", - "cl91c2VyX2lkGAQgASgFEisKBXZhbHVlGAUgASgLMhwubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5NeFZhbHVlItkBChRXcml0ZVNlY3VyZWQyQ29tbWFuZBIVCg1z", - "ZXJ2ZXJfaGFuZGxlGAEgASgFEhMKC2l0ZW1faGFuZGxlGAIgASgFEhcKD2N1", - "cnJlbnRfdXNlcl9pZBgDIAEoBRIYChB2ZXJpZmllcl91c2VyX2lkGAQgASgF", - "EisKBXZhbHVlGAUgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZhbHVl", - "EjUKD3RpbWVzdGFtcF92YWx1ZRgGIAEoCzIcLm14YWNjZXNzX2dhdGV3YXku", - "djEuTXhWYWx1ZSJjChdBdXRoZW50aWNhdGVVc2VyQ29tbWFuZBIVCg1zZXJ2", - "ZXJfaGFuZGxlGAEgASgFEhMKC3ZlcmlmeV91c2VyGAIgASgJEhwKFHZlcmlm", - "eV91c2VyX3Bhc3N3b3JkGAMgASgJIkcKGEFyY2hlc3RyQVVzZXJUb0lkQ29t", - "bWFuZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhQKDHVzZXJfaWRfZ3VpZBgC", - "IAEoCSJCChJBZGRJdGVtQnVsa0NvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgB", - "IAEoBRIVCg10YWdfYWRkcmVzc2VzGAIgAygJIkQKFUFkdmlzZUl0ZW1CdWxr", - "Q29tbWFuZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhQKDGl0ZW1faGFuZGxl", - "cxgCIAMoBSJEChVSZW1vdmVJdGVtQnVsa0NvbW1hbmQSFQoNc2VydmVyX2hh", - "bmRsZRgBIAEoBRIUCgxpdGVtX2hhbmRsZXMYAiADKAUiRgoXVW5BZHZpc2VJ", + "IAEoBSI9Cg9VbkFkdmlzZUNvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEo", + "BRITCgtpdGVtX2hhbmRsZRgCIAEoBSJGChhBZHZpc2VTdXBlcnZpc29yeUNv", + "bW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRITCgtpdGVtX2hhbmRsZRgC", + "IAEoBSJeChZBZGRCdWZmZXJlZEl0ZW1Db21tYW5kEhUKDXNlcnZlcl9oYW5k", + "bGUYASABKAUSFwoPaXRlbV9kZWZpbml0aW9uGAIgASgJEhQKDGl0ZW1fY29u", + "dGV4dBgDIAEoCSJfCiBTZXRCdWZmZXJlZFVwZGF0ZUludGVydmFsQ29tbWFu", + "ZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEiQKHHVwZGF0ZV9pbnRlcnZhbF9t", + "aWxsaXNlY29uZHMYAiABKAUiPAoOU3VzcGVuZENvbW1hbmQSFQoNc2VydmVy", + "X2hhbmRsZRgBIAEoBRITCgtpdGVtX2hhbmRsZRgCIAEoBSI9Cg9BY3RpdmF0", + "ZUNvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRITCgtpdGVtX2hhbmRs", + "ZRgCIAEoBSJ4CgxXcml0ZUNvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEo", + "BRITCgtpdGVtX2hhbmRsZRgCIAEoBRIrCgV2YWx1ZRgDIAEoCzIcLm14YWNj", + "ZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIPCgd1c2VyX2lkGAQgASgFIrABCg1X", + "cml0ZTJDb21tYW5kEhUKDXNlcnZlcl9oYW5kbGUYASABKAUSEwoLaXRlbV9o", + "YW5kbGUYAiABKAUSKwoFdmFsdWUYAyABKAsyHC5teGFjY2Vzc19nYXRld2F5", + "LnYxLk14VmFsdWUSNQoPdGltZXN0YW1wX3ZhbHVlGAQgASgLMhwubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5NeFZhbHVlEg8KB3VzZXJfaWQYBSABKAUioQEKE1dy", + "aXRlU2VjdXJlZENvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRITCgtp", + "dGVtX2hhbmRsZRgCIAEoBRIXCg9jdXJyZW50X3VzZXJfaWQYAyABKAUSGAoQ", + "dmVyaWZpZXJfdXNlcl9pZBgEIAEoBRIrCgV2YWx1ZRgFIAEoCzIcLm14YWNj", + "ZXNzX2dhdGV3YXkudjEuTXhWYWx1ZSLZAQoUV3JpdGVTZWN1cmVkMkNvbW1h", + "bmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRITCgtpdGVtX2hhbmRsZRgCIAEo", + "BRIXCg9jdXJyZW50X3VzZXJfaWQYAyABKAUSGAoQdmVyaWZpZXJfdXNlcl9p", + "ZBgEIAEoBRIrCgV2YWx1ZRgFIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEu", + "TXhWYWx1ZRI1Cg90aW1lc3RhbXBfdmFsdWUYBiABKAsyHC5teGFjY2Vzc19n", + "YXRld2F5LnYxLk14VmFsdWUiYwoXQXV0aGVudGljYXRlVXNlckNvbW1hbmQS", + "FQoNc2VydmVyX2hhbmRsZRgBIAEoBRITCgt2ZXJpZnlfdXNlchgCIAEoCRIc", + "ChR2ZXJpZnlfdXNlcl9wYXNzd29yZBgDIAEoCSJHChhBcmNoZXN0ckFVc2Vy", + "VG9JZENvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRIUCgx1c2VyX2lk", + "X2d1aWQYAiABKAkiQgoSQWRkSXRlbUJ1bGtDb21tYW5kEhUKDXNlcnZlcl9o", + "YW5kbGUYASABKAUSFQoNdGFnX2FkZHJlc3NlcxgCIAMoCSJEChVBZHZpc2VJ", "dGVtQnVsa0NvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRIUCgxpdGVt", - "X2hhbmRsZXMYAiADKAUiRAoUU3Vic2NyaWJlQnVsa0NvbW1hbmQSFQoNc2Vy", - "dmVyX2hhbmRsZRgBIAEoBRIVCg10YWdfYWRkcmVzc2VzGAIgAygJIjkKFlN1", - "YnNjcmliZUFsYXJtc0NvbW1hbmQSHwoXc3Vic2NyaXB0aW9uX2V4cHJlc3Np", - "b24YASABKAkiGgoYVW5zdWJzY3JpYmVBbGFybXNDb21tYW5kIqEBChdBY2tu", - "b3dsZWRnZUFsYXJtQ29tbWFuZBISCgphbGFybV9ndWlkGAEgASgJEg8KB2Nv", - "bW1lbnQYAiABKAkSFQoNb3BlcmF0b3JfdXNlchgDIAEoCRIVCg1vcGVyYXRv", - "cl9ub2RlGAQgASgJEhcKD29wZXJhdG9yX2RvbWFpbhgFIAEoCRIaChJvcGVy", - "YXRvcl9mdWxsX25hbWUYBiABKAkiNwoYUXVlcnlBY3RpdmVBbGFybXNDb21t", - "YW5kEhsKE2FsYXJtX2ZpbHRlcl9wcmVmaXgYASABKAkiRQoWVW5zdWJzY3Jp", - "YmVCdWxrQ29tbWFuZBIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFEhQKDGl0ZW1f", - "aGFuZGxlcxgCIAMoBSIeCgtQaW5nQ29tbWFuZBIPCgdtZXNzYWdlGAEgASgJ", - "IhgKFkdldFNlc3Npb25TdGF0ZUNvbW1hbmQiFgoUR2V0V29ya2VySW5mb0Nv", - "bW1hbmQiKAoSRHJhaW5FdmVudHNDb21tYW5kEhIKCm1heF9ldmVudHMYASAB", - "KA0iSAoVU2h1dGRvd25Xb3JrZXJDb21tYW5kEi8KDGdyYWNlX3BlcmlvZBgB", - "IAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiLPDAoOTXhDb21tYW5k", - "UmVwbHkSEgoKc2Vzc2lvbl9pZBgBIAEoCRIWCg5jb3JyZWxhdGlvbl9pZBgC", - "IAEoCRIwCgRraW5kGAMgASgOMiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeENv", - "bW1hbmRLaW5kEjwKD3Byb3RvY29sX3N0YXR1cxgEIAEoCzIjLm14YWNjZXNz", - "X2dhdGV3YXkudjEuUHJvdG9jb2xTdGF0dXMSFAoHaHJlc3VsdBgFIAEoBUgB", - "iAEBEjIKDHJldHVybl92YWx1ZRgGIAEoCzIcLm14YWNjZXNzX2dhdGV3YXku", - "djEuTXhWYWx1ZRI0CghzdGF0dXNlcxgHIAMoCzIiLm14YWNjZXNzX2dhdGV3", - "YXkudjEuTXhTdGF0dXNQcm94eRIaChJkaWFnbm9zdGljX21lc3NhZ2UYCCAB", - "KAkSNgoIcmVnaXN0ZXIYFCABKAsyIi5teGFjY2Vzc19nYXRld2F5LnYxLlJl", - "Z2lzdGVyUmVwbHlIABI1CghhZGRfaXRlbRgVIAEoCzIhLm14YWNjZXNzX2dh", - "dGV3YXkudjEuQWRkSXRlbVJlcGx5SAASNwoJYWRkX2l0ZW0yGBYgASgLMiIu", - "bXhhY2Nlc3NfZ2F0ZXdheS52MS5BZGRJdGVtMlJlcGx5SAASRgoRYWRkX2J1", - "ZmZlcmVkX2l0ZW0YFyABKAsyKS5teGFjY2Vzc19nYXRld2F5LnYxLkFkZEJ1", - "ZmZlcmVkSXRlbVJlcGx5SAASNAoHc3VzcGVuZBgYIAEoCzIhLm14YWNjZXNz", - "X2dhdGV3YXkudjEuU3VzcGVuZFJlcGx5SAASNgoIYWN0aXZhdGUYGSABKAsy", - "Ii5teGFjY2Vzc19nYXRld2F5LnYxLkFjdGl2YXRlUmVwbHlIABJHChFhdXRo", - "ZW50aWNhdGVfdXNlchgaIAEoCzIqLm14YWNjZXNzX2dhdGV3YXkudjEuQXV0", - "aGVudGljYXRlVXNlclJlcGx5SAASSwoUYXJjaGVzdHJhX3VzZXJfdG9faWQY", - "GyABKAsyKy5teGFjY2Vzc19nYXRld2F5LnYxLkFyY2hlc3RyQVVzZXJUb0lk", - "UmVwbHlIABJACg1hZGRfaXRlbV9idWxrGBwgASgLMicubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5CdWxrU3Vic2NyaWJlUmVwbHlIABJDChBhZHZpc2VfaXRlbV9i", - "dWxrGB0gASgLMicubXhhY2Nlc3NfZ2F0ZXdheS52MS5CdWxrU3Vic2NyaWJl", - "UmVwbHlIABJDChByZW1vdmVfaXRlbV9idWxrGB4gASgLMicubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5CdWxrU3Vic2NyaWJlUmVwbHlIABJGChN1bl9hZHZpc2Vf", - "aXRlbV9idWxrGB8gASgLMicubXhhY2Nlc3NfZ2F0ZXdheS52MS5CdWxrU3Vi", - "c2NyaWJlUmVwbHlIABJBCg5zdWJzY3JpYmVfYnVsaxggIAEoCzInLm14YWNj", - "ZXNzX2dhdGV3YXkudjEuQnVsa1N1YnNjcmliZVJlcGx5SAASQwoQdW5zdWJz", - "Y3JpYmVfYnVsaxghIAEoCzInLm14YWNjZXNzX2dhdGV3YXkudjEuQnVsa1N1", - "YnNjcmliZVJlcGx5SAASTgoRYWNrbm93bGVkZ2VfYWxhcm0YIiABKAsyMS5t", - "eGFjY2Vzc19nYXRld2F5LnYxLkFja25vd2xlZGdlQWxhcm1SZXBseVBheWxv", - "YWRIABJRChNxdWVyeV9hY3RpdmVfYWxhcm1zGCMgASgLMjIubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5RdWVyeUFjdGl2ZUFsYXJtc1JlcGx5UGF5bG9hZEgAEj8K", - "DXNlc3Npb25fc3RhdGUYZCABKAsyJi5teGFjY2Vzc19nYXRld2F5LnYxLlNl", - "c3Npb25TdGF0ZVJlcGx5SAASOwoLd29ya2VyX2luZm8YZSABKAsyJC5teGFj", - "Y2Vzc19nYXRld2F5LnYxLldvcmtlckluZm9SZXBseUgAEj0KDGRyYWluX2V2", - "ZW50cxhmIAEoCzIlLm14YWNjZXNzX2dhdGV3YXkudjEuRHJhaW5FdmVudHNS", - "ZXBseUgAQgkKB3BheWxvYWRCCgoIX2hyZXN1bHQiJgoNUmVnaXN0ZXJSZXBs", - "eRIVCg1zZXJ2ZXJfaGFuZGxlGAEgASgFIiMKDEFkZEl0ZW1SZXBseRITCgtp", - "dGVtX2hhbmRsZRgBIAEoBSIkCg1BZGRJdGVtMlJlcGx5EhMKC2l0ZW1faGFu", - "ZGxlGAEgASgFIisKFEFkZEJ1ZmZlcmVkSXRlbVJlcGx5EhMKC2l0ZW1faGFu", - "ZGxlGAEgASgFIkIKDFN1c3BlbmRSZXBseRIyCgZzdGF0dXMYASABKAsyIi5t", - "eGFjY2Vzc19nYXRld2F5LnYxLk14U3RhdHVzUHJveHkiQwoNQWN0aXZhdGVS", - "ZXBseRIyCgZzdGF0dXMYASABKAsyIi5teGFjY2Vzc19nYXRld2F5LnYxLk14", - "U3RhdHVzUHJveHkiKAoVQXV0aGVudGljYXRlVXNlclJlcGx5Eg8KB3VzZXJf", - "aWQYASABKAUiKQoWQXJjaGVzdHJBVXNlclRvSWRSZXBseRIPCgd1c2VyX2lk", - "GAEgASgFIoEBCg9TdWJzY3JpYmVSZXN1bHQSFQoNc2VydmVyX2hhbmRsZRgB", - "IAEoBRITCgt0YWdfYWRkcmVzcxgCIAEoCRITCgtpdGVtX2hhbmRsZRgDIAEo", - "BRIWCg53YXNfc3VjY2Vzc2Z1bBgEIAEoCBIVCg1lcnJvcl9tZXNzYWdlGAUg", - "ASgJIksKEkJ1bGtTdWJzY3JpYmVSZXBseRI1CgdyZXN1bHRzGAEgAygLMiQu", - "bXhhY2Nlc3NfZ2F0ZXdheS52MS5TdWJzY3JpYmVSZXN1bHQiRQoRU2Vzc2lv", - "blN0YXRlUmVwbHkSMAoFc3RhdGUYASABKA4yIS5teGFjY2Vzc19nYXRld2F5", - "LnYxLlNlc3Npb25TdGF0ZSJ1Cg9Xb3JrZXJJbmZvUmVwbHkSGQoRd29ya2Vy", - "X3Byb2Nlc3NfaWQYASABKAUSFgoOd29ya2VyX3ZlcnNpb24YAiABKAkSFwoP", - "bXhhY2Nlc3NfcHJvZ2lkGAMgASgJEhYKDm14YWNjZXNzX2Nsc2lkGAQgASgJ", - "IkAKEERyYWluRXZlbnRzUmVwbHkSLAoGZXZlbnRzGAEgAygLMhwubXhhY2Nl", - "c3NfZ2F0ZXdheS52MS5NeEV2ZW50IjUKHEFja25vd2xlZGdlQWxhcm1SZXBs", - "eVBheWxvYWQSFQoNbmF0aXZlX3N0YXR1cxgBIAEoBSJcCh1RdWVyeUFjdGl2", - "ZUFsYXJtc1JlcGx5UGF5bG9hZBI7CglzbmFwc2hvdHMYASADKAsyKC5teGFj", - "Y2Vzc19nYXRld2F5LnYxLkFjdGl2ZUFsYXJtU25hcHNob3Qi5wYKB014RXZl", - "bnQSMgoGZmFtaWx5GAEgASgOMiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEV2", - "ZW50RmFtaWx5EhIKCnNlc3Npb25faWQYAiABKAkSFQoNc2VydmVyX2hhbmRs", - "ZRgDIAEoBRITCgtpdGVtX2hhbmRsZRgEIAEoBRIrCgV2YWx1ZRgFIAEoCzIc", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIPCgdxdWFsaXR5GAYgASgF", - "EjQKEHNvdXJjZV90aW1lc3RhbXAYByABKAsyGi5nb29nbGUucHJvdG9idWYu", - "VGltZXN0YW1wEjQKCHN0YXR1c2VzGAggAygLMiIubXhhY2Nlc3NfZ2F0ZXdh", - "eS52MS5NeFN0YXR1c1Byb3h5EhcKD3dvcmtlcl9zZXF1ZW5jZRgJIAEoBBI0", - "ChB3b3JrZXJfdGltZXN0YW1wGAogASgLMhouZ29vZ2xlLnByb3RvYnVmLlRp", - "bWVzdGFtcBI9ChlnYXRld2F5X3JlY2VpdmVfdGltZXN0YW1wGAsgASgLMhou", - "Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIUCgdocmVzdWx0GAwgASgFSAGI", - "AQESEgoKcmF3X3N0YXR1cxgNIAEoCRJACg5vbl9kYXRhX2NoYW5nZRgUIAEo", - "CzImLm14YWNjZXNzX2dhdGV3YXkudjEuT25EYXRhQ2hhbmdlRXZlbnRIABJG", - "ChFvbl93cml0ZV9jb21wbGV0ZRgVIAEoCzIpLm14YWNjZXNzX2dhdGV3YXku", - "djEuT25Xcml0ZUNvbXBsZXRlRXZlbnRIABJJChJvcGVyYXRpb25fY29tcGxl", - "dGUYFiABKAsyKy5teGFjY2Vzc19nYXRld2F5LnYxLk9wZXJhdGlvbkNvbXBs", - "ZXRlRXZlbnRIABJRChdvbl9idWZmZXJlZF9kYXRhX2NoYW5nZRgXIAEoCzIu", - "Lm14YWNjZXNzX2dhdGV3YXkudjEuT25CdWZmZXJlZERhdGFDaGFuZ2VFdmVu", - "dEgAEkoKE29uX2FsYXJtX3RyYW5zaXRpb24YGCABKAsyKy5teGFjY2Vzc19n", - "YXRld2F5LnYxLk9uQWxhcm1UcmFuc2l0aW9uRXZlbnRIAEIGCgRib2R5QgoK", - "CF9ocmVzdWx0IhMKEU9uRGF0YUNoYW5nZUV2ZW50IhYKFE9uV3JpdGVDb21w", - "bGV0ZUV2ZW50IhgKFk9wZXJhdGlvbkNvbXBsZXRlRXZlbnQi1AEKGU9uQnVm", - "ZmVyZWREYXRhQ2hhbmdlRXZlbnQSMgoJZGF0YV90eXBlGAEgASgOMh8ubXhh", - "Y2Nlc3NfZ2F0ZXdheS52MS5NeERhdGFUeXBlEjQKDnF1YWxpdHlfdmFsdWVz", - "GAIgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEFycmF5EjYKEHRpbWVz", - "dGFtcF92YWx1ZXMYAyABKAsyHC5teGFjY2Vzc19nYXRld2F5LnYxLk14QXJy", - "YXkSFQoNcmF3X2RhdGFfdHlwZRgEIAEoBSL9AwoWT25BbGFybVRyYW5zaXRp", - "b25FdmVudBIcChRhbGFybV9mdWxsX3JlZmVyZW5jZRgBIAEoCRIfChdzb3Vy", - "Y2Vfb2JqZWN0X3JlZmVyZW5jZRgCIAEoCRIXCg9hbGFybV90eXBlX25hbWUY", - "AyABKAkSQQoPdHJhbnNpdGlvbl9raW5kGAQgASgOMigubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5BbGFybVRyYW5zaXRpb25LaW5kEhAKCHNldmVyaXR5GAUgASgF", - "EjwKGG9yaWdpbmFsX3JhaXNlX3RpbWVzdGFtcBgGIAEoCzIaLmdvb2dsZS5w", - "cm90b2J1Zi5UaW1lc3RhbXASOAoUdHJhbnNpdGlvbl90aW1lc3RhbXAYByAB", - "KAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDW9wZXJhdG9yX3Vz", - "ZXIYCCABKAkSGAoQb3BlcmF0b3JfY29tbWVudBgJIAEoCRIQCghjYXRlZ29y", - "eRgKIAEoCRITCgtkZXNjcmlwdGlvbhgLIAEoCRIzCg1jdXJyZW50X3ZhbHVl", - "GAwgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZhbHVlEjEKC2xpbWl0", - "X3ZhbHVlGA0gASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZhbHVlIv0D", - "ChNBY3RpdmVBbGFybVNuYXBzaG90EhwKFGFsYXJtX2Z1bGxfcmVmZXJlbmNl", - "GAEgASgJEh8KF3NvdXJjZV9vYmplY3RfcmVmZXJlbmNlGAIgASgJEhcKD2Fs", - "YXJtX3R5cGVfbmFtZRgDIAEoCRIQCghzZXZlcml0eRgEIAEoBRI8Chhvcmln", - "aW5hbF9yYWlzZV90aW1lc3RhbXAYBSABKAsyGi5nb29nbGUucHJvdG9idWYu", - "VGltZXN0YW1wEj8KDWN1cnJlbnRfc3RhdGUYBiABKA4yKC5teGFjY2Vzc19n", - "YXRld2F5LnYxLkFsYXJtQ29uZGl0aW9uU3RhdGUSEAoIY2F0ZWdvcnkYByAB", - "KAkSEwoLZGVzY3JpcHRpb24YCCABKAkSPQoZbGFzdF90cmFuc2l0aW9uX3Rp", - "bWVzdGFtcBgJIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASFQoN", - "b3BlcmF0b3JfdXNlchgKIAEoCRIYChBvcGVyYXRvcl9jb21tZW50GAsgASgJ", - "EjMKDWN1cnJlbnRfdmFsdWUYDCABKAsyHC5teGFjY2Vzc19nYXRld2F5LnYx", - "Lk14VmFsdWUSMQoLbGltaXRfdmFsdWUYDSABKAsyHC5teGFjY2Vzc19nYXRl", - "d2F5LnYxLk14VmFsdWUikgEKF0Fja25vd2xlZGdlQWxhcm1SZXF1ZXN0EhIK", - "CnNlc3Npb25faWQYASABKAkSHQoVY2xpZW50X2NvcnJlbGF0aW9uX2lkGAIg", - "ASgJEhwKFGFsYXJtX2Z1bGxfcmVmZXJlbmNlGAMgASgJEg8KB2NvbW1lbnQY", - "BCABKAkSFQoNb3BlcmF0b3JfdXNlchgFIAEoCSLzAQoVQWNrbm93bGVkZ2VB", - "bGFybVJlcGx5EhIKCnNlc3Npb25faWQYASABKAkSFgoOY29ycmVsYXRpb25f", - "aWQYAiABKAkSPAoPcHJvdG9jb2xfc3RhdHVzGAMgASgLMiMubXhhY2Nlc3Nf", - "Z2F0ZXdheS52MS5Qcm90b2NvbFN0YXR1cxIUCgdocmVzdWx0GAQgASgFSACI", - "AQESMgoGc3RhdHVzGAUgASgLMiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0", - "YXR1c1Byb3h5EhoKEmRpYWdub3N0aWNfbWVzc2FnZRgGIAEoCUIKCghfaHJl", - "c3VsdCJqChhRdWVyeUFjdGl2ZUFsYXJtc1JlcXVlc3QSEgoKc2Vzc2lvbl9p", - "ZBgBIAEoCRIdChVjbGllbnRfY29ycmVsYXRpb25faWQYAiABKAkSGwoTYWxh", - "cm1fZmlsdGVyX3ByZWZpeBgDIAEoCSLrAQoNTXhTdGF0dXNQcm94eRIPCgdz", - "dWNjZXNzGAEgASgFEjcKCGNhdGVnb3J5GAIgASgOMiUubXhhY2Nlc3NfZ2F0", - "ZXdheS52MS5NeFN0YXR1c0NhdGVnb3J5EjgKC2RldGVjdGVkX2J5GAMgASgO", - "MiMubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1c1NvdXJjZRIOCgZkZXRh", - "aWwYBCABKAUSFAoMcmF3X2NhdGVnb3J5GAUgASgFEhcKD3Jhd19kZXRlY3Rl", - "ZF9ieRgGIAEoBRIXCg9kaWFnbm9zdGljX3RleHQYByABKAkipwMKB014VmFs", - "dWUSMgoJZGF0YV90eXBlGAEgASgOMh8ubXhhY2Nlc3NfZ2F0ZXdheS52MS5N", - "eERhdGFUeXBlEhQKDHZhcmlhbnRfdHlwZRgCIAEoCRIPCgdpc19udWxsGAMg", - "ASgIEhYKDnJhd19kaWFnbm9zdGljGAQgASgJEhUKDXJhd19kYXRhX3R5cGUY", - "BSABKAUSFAoKYm9vbF92YWx1ZRgKIAEoCEgAEhUKC2ludDMyX3ZhbHVlGAsg", - "ASgFSAASFQoLaW50NjRfdmFsdWUYDCABKANIABIVCgtmbG9hdF92YWx1ZRgN", - "IAEoAkgAEhYKDGRvdWJsZV92YWx1ZRgOIAEoAUgAEhYKDHN0cmluZ192YWx1", - "ZRgPIAEoCUgAEjUKD3RpbWVzdGFtcF92YWx1ZRgQIAEoCzIaLmdvb2dsZS5w", - "cm90b2J1Zi5UaW1lc3RhbXBIABIzCgthcnJheV92YWx1ZRgRIAEoCzIcLm14", - "YWNjZXNzX2dhdGV3YXkudjEuTXhBcnJheUgAEhMKCXJhd192YWx1ZRgSIAEo", - "DEgAQgYKBGtpbmQi/gQKB014QXJyYXkSOgoRZWxlbWVudF9kYXRhX3R5cGUY", - "ASABKA4yHy5teGFjY2Vzc19nYXRld2F5LnYxLk14RGF0YVR5cGUSFAoMdmFy", - "aWFudF90eXBlGAIgASgJEhIKCmRpbWVuc2lvbnMYAyADKA0SFgoOcmF3X2Rp", - "YWdub3N0aWMYBCABKAkSHQoVcmF3X2VsZW1lbnRfZGF0YV90eXBlGAUgASgF", - "EjUKC2Jvb2xfdmFsdWVzGAogASgLMh4ubXhhY2Nlc3NfZ2F0ZXdheS52MS5C", - "b29sQXJyYXlIABI3CgxpbnQzMl92YWx1ZXMYCyABKAsyHy5teGFjY2Vzc19n", - "YXRld2F5LnYxLkludDMyQXJyYXlIABI3CgxpbnQ2NF92YWx1ZXMYDCABKAsy", - "Hy5teGFjY2Vzc19nYXRld2F5LnYxLkludDY0QXJyYXlIABI3CgxmbG9hdF92", - "YWx1ZXMYDSABKAsyHy5teGFjY2Vzc19nYXRld2F5LnYxLkZsb2F0QXJyYXlI", - "ABI5Cg1kb3VibGVfdmFsdWVzGA4gASgLMiAubXhhY2Nlc3NfZ2F0ZXdheS52", - "MS5Eb3VibGVBcnJheUgAEjkKDXN0cmluZ192YWx1ZXMYDyABKAsyIC5teGFj", - "Y2Vzc19nYXRld2F5LnYxLlN0cmluZ0FycmF5SAASPwoQdGltZXN0YW1wX3Zh", - "bHVlcxgQIAEoCzIjLm14YWNjZXNzX2dhdGV3YXkudjEuVGltZXN0YW1wQXJy", - "YXlIABIzCgpyYXdfdmFsdWVzGBEgASgLMh0ubXhhY2Nlc3NfZ2F0ZXdheS52", - "MS5SYXdBcnJheUgAQggKBnZhbHVlcyIbCglCb29sQXJyYXkSDgoGdmFsdWVz", - "GAEgAygIIhwKCkludDMyQXJyYXkSDgoGdmFsdWVzGAEgAygFIhwKCkludDY0", - "QXJyYXkSDgoGdmFsdWVzGAEgAygDIhwKCkZsb2F0QXJyYXkSDgoGdmFsdWVz", - "GAEgAygCIh0KC0RvdWJsZUFycmF5Eg4KBnZhbHVlcxgBIAMoASIdCgtTdHJp", - "bmdBcnJheRIOCgZ2YWx1ZXMYASADKAkiPAoOVGltZXN0YW1wQXJyYXkSKgoG", - "dmFsdWVzGAEgAygLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCIaCghS", - "YXdBcnJheRIOCgZ2YWx1ZXMYASADKAwiWAoOUHJvdG9jb2xTdGF0dXMSNQoE", - "Y29kZRgBIAEoDjInLm14YWNjZXNzX2dhdGV3YXkudjEuUHJvdG9jb2xTdGF0", - "dXNDb2RlEg8KB21lc3NhZ2UYAiABKAkqvwkKDU14Q29tbWFuZEtpbmQSHwob", - "TVhfQ09NTUFORF9LSU5EX1VOU1BFQ0lGSUVEEAASHAoYTVhfQ09NTUFORF9L", - "SU5EX1JFR0lTVEVSEAESHgoaTVhfQ09NTUFORF9LSU5EX1VOUkVHSVNURVIQ", - "AhIcChhNWF9DT01NQU5EX0tJTkRfQUREX0lURU0QAxIdChlNWF9DT01NQU5E", - "X0tJTkRfQUREX0lURU0yEAQSHwobTVhfQ09NTUFORF9LSU5EX1JFTU9WRV9J", - "VEVNEAUSGgoWTVhfQ09NTUFORF9LSU5EX0FEVklTRRAGEh0KGU1YX0NPTU1B", - "TkRfS0lORF9VTl9BRFZJU0UQBxImCiJNWF9DT01NQU5EX0tJTkRfQURWSVNF", - "X1NVUEVSVklTT1JZEAgSJQohTVhfQ09NTUFORF9LSU5EX0FERF9CVUZGRVJF", - "RF9JVEVNEAkSMAosTVhfQ09NTUFORF9LSU5EX1NFVF9CVUZGRVJFRF9VUERB", - "VEVfSU5URVJWQUwQChIbChdNWF9DT01NQU5EX0tJTkRfU1VTUEVORBALEhwK", - "GE1YX0NPTU1BTkRfS0lORF9BQ1RJVkFURRAMEhkKFU1YX0NPTU1BTkRfS0lO", - "RF9XUklURRANEhoKFk1YX0NPTU1BTkRfS0lORF9XUklURTIQDhIhCh1NWF9D", - "T01NQU5EX0tJTkRfV1JJVEVfU0VDVVJFRBAPEiIKHk1YX0NPTU1BTkRfS0lO", - "RF9XUklURV9TRUNVUkVEMhAQEiUKIU1YX0NPTU1BTkRfS0lORF9BVVRIRU5U", - "SUNBVEVfVVNFUhAREigKJE1YX0NPTU1BTkRfS0lORF9BUkNIRVNUUkFfVVNF", - "Ul9UT19JRBASEiEKHU1YX0NPTU1BTkRfS0lORF9BRERfSVRFTV9CVUxLEBMS", - "JAogTVhfQ09NTUFORF9LSU5EX0FEVklTRV9JVEVNX0JVTEsQFBIkCiBNWF9D", - "T01NQU5EX0tJTkRfUkVNT1ZFX0lURU1fQlVMSxAVEicKI01YX0NPTU1BTkRf", - "S0lORF9VTl9BRFZJU0VfSVRFTV9CVUxLEBYSIgoeTVhfQ09NTUFORF9LSU5E", - "X1NVQlNDUklCRV9CVUxLEBcSJAogTVhfQ09NTUFORF9LSU5EX1VOU1VCU0NS", - "SUJFX0JVTEsQGBIkCiBNWF9DT01NQU5EX0tJTkRfU1VCU0NSSUJFX0FMQVJN", - "UxAZEiYKIk1YX0NPTU1BTkRfS0lORF9VTlNVQlNDUklCRV9BTEFSTVMQGhIl", - "CiFNWF9DT01NQU5EX0tJTkRfQUNLTk9XTEVER0VfQUxBUk0QGxInCiNNWF9D", - "T01NQU5EX0tJTkRfUVVFUllfQUNUSVZFX0FMQVJNUxAcEhgKFE1YX0NPTU1B", - "TkRfS0lORF9QSU5HEGQSJQohTVhfQ09NTUFORF9LSU5EX0dFVF9TRVNTSU9O", - "X1NUQVRFEGUSIwofTVhfQ09NTUFORF9LSU5EX0dFVF9XT1JLRVJfSU5GTxBm", - "EiAKHE1YX0NPTU1BTkRfS0lORF9EUkFJTl9FVkVOVFMQZxIjCh9NWF9DT01N", - "QU5EX0tJTkRfU0hVVERPV05fV09SS0VSEGgq+QEKDU14RXZlbnRGYW1pbHkS", - "HwobTVhfRVZFTlRfRkFNSUxZX1VOU1BFQ0lGSUVEEAASIgoeTVhfRVZFTlRf", - "RkFNSUxZX09OX0RBVEFfQ0hBTkdFEAESJQohTVhfRVZFTlRfRkFNSUxZX09O", - "X1dSSVRFX0NPTVBMRVRFEAISJgoiTVhfRVZFTlRfRkFNSUxZX09QRVJBVElP", - "Tl9DT01QTEVURRADEisKJ01YX0VWRU5UX0ZBTUlMWV9PTl9CVUZGRVJFRF9E", - "QVRBX0NIQU5HRRAEEicKI01YX0VWRU5UX0ZBTUlMWV9PTl9BTEFSTV9UUkFO", - "U0lUSU9OEAUqygEKE0FsYXJtVHJhbnNpdGlvbktpbmQSJQohQUxBUk1fVFJB", - "TlNJVElPTl9LSU5EX1VOU1BFQ0lGSUVEEAASHwobQUxBUk1fVFJBTlNJVElP", - "Tl9LSU5EX1JBSVNFEAESJQohQUxBUk1fVFJBTlNJVElPTl9LSU5EX0FDS05P", - "V0xFREdFEAISHwobQUxBUk1fVFJBTlNJVElPTl9LSU5EX0NMRUFSEAMSIwof", - "QUxBUk1fVFJBTlNJVElPTl9LSU5EX1JFVFJJR0dFUhAEKqoBChNBbGFybUNv", - "bmRpdGlvblN0YXRlEiUKIUFMQVJNX0NPTkRJVElPTl9TVEFURV9VTlNQRUNJ", - "RklFRBAAEiAKHEFMQVJNX0NPTkRJVElPTl9TVEFURV9BQ1RJVkUQARImCiJB", - "TEFSTV9DT05ESVRJT05fU1RBVEVfQUNUSVZFX0FDS0VEEAISIgoeQUxBUk1f", - "Q09ORElUSU9OX1NUQVRFX0lOQUNUSVZFEAMqpQMKEE14U3RhdHVzQ2F0ZWdv", - "cnkSIgoeTVhfU1RBVFVTX0NBVEVHT1JZX1VOU1BFQ0lGSUVEEAASHgoaTVhf", - "U1RBVFVTX0NBVEVHT1JZX1VOS05PV04QARIZChVNWF9TVEFUVVNfQ0FURUdP", - "UllfT0sQAhIeChpNWF9TVEFUVVNfQ0FURUdPUllfUEVORElORxADEh4KGk1Y", - "X1NUQVRVU19DQVRFR09SWV9XQVJOSU5HEAQSKgomTVhfU1RBVFVTX0NBVEVH", - "T1JZX0NPTU1VTklDQVRJT05fRVJST1IQBRIqCiZNWF9TVEFUVVNfQ0FURUdP", - "UllfQ09ORklHVVJBVElPTl9FUlJPUhAGEigKJE1YX1NUQVRVU19DQVRFR09S", - "WV9PUEVSQVRJT05BTF9FUlJPUhAHEiUKIU1YX1NUQVRVU19DQVRFR09SWV9T", - "RUNVUklUWV9FUlJPUhAIEiUKIU1YX1NUQVRVU19DQVRFR09SWV9TT0ZUV0FS", - "RV9FUlJPUhAJEiIKHk1YX1NUQVRVU19DQVRFR09SWV9PVEhFUl9FUlJPUhAK", - "KsoCCg5NeFN0YXR1c1NvdXJjZRIgChxNWF9TVEFUVVNfU09VUkNFX1VOU1BF", - "Q0lGSUVEEAASHAoYTVhfU1RBVFVTX1NPVVJDRV9VTktOT1dOEAESIwofTVhf", - "U1RBVFVTX1NPVVJDRV9SRVFVRVNUSU5HX0xNWBACEiMKH01YX1NUQVRVU19T", - "T1VSQ0VfUkVTUE9ORElOR19MTVgQAxIjCh9NWF9TVEFUVVNfU09VUkNFX1JF", - "UVVFU1RJTkdfTk1YEAQSIwofTVhfU1RBVFVTX1NPVVJDRV9SRVNQT05ESU5H", - "X05NWBAFEjEKLU1YX1NUQVRVU19TT1VSQ0VfUkVRVUVTVElOR19BVVRPTUFU", - "SU9OX09CSkVDVBAGEjEKLU1YX1NUQVRVU19TT1VSQ0VfUkVTUE9ORElOR19B", - "VVRPTUFUSU9OX09CSkVDVBAHKt0ECgpNeERhdGFUeXBlEhwKGE1YX0RBVEFf", - "VFlQRV9VTlNQRUNJRklFRBAAEhgKFE1YX0RBVEFfVFlQRV9VTktOT1dOEAES", - "GAoUTVhfREFUQV9UWVBFX05PX0RBVEEQAhIYChRNWF9EQVRBX1RZUEVfQk9P", - "TEVBThADEhgKFE1YX0RBVEFfVFlQRV9JTlRFR0VSEAQSFgoSTVhfREFUQV9U", - "WVBFX0ZMT0FUEAUSFwoTTVhfREFUQV9UWVBFX0RPVUJMRRAGEhcKE01YX0RB", - "VEFfVFlQRV9TVFJJTkcQBxIVChFNWF9EQVRBX1RZUEVfVElNRRAIEh0KGU1Y", - "X0RBVEFfVFlQRV9FTEFQU0VEX1RJTUUQCRIfChtNWF9EQVRBX1RZUEVfUkVG", - "RVJFTkNFX1RZUEUQChIcChhNWF9EQVRBX1RZUEVfU1RBVFVTX1RZUEUQCxIV", - "ChFNWF9EQVRBX1RZUEVfRU5VTRAMEi0KKU1YX0RBVEFfVFlQRV9TRUNVUklU", - "WV9DTEFTU0lGSUNBVElPTl9FTlVNEA0SIgoeTVhfREFUQV9UWVBFX0RBVEFf", - "UVVBTElUWV9UWVBFEA4SHwobTVhfREFUQV9UWVBFX1FVQUxJRklFRF9FTlVN", - "EA8SIQodTVhfREFUQV9UWVBFX1FVQUxJRklFRF9TVFJVQ1QQEBIpCiVNWF9E", - "QVRBX1RZUEVfSU5URVJOQVRJT05BTElaRURfU1RSSU5HEBESGwoXTVhfREFU", - "QV9UWVBFX0JJR19TVFJJTkcQEhIUChBNWF9EQVRBX1RZUEVfRU5EEBMqowMK", - "ElByb3RvY29sU3RhdHVzQ29kZRIkCiBQUk9UT0NPTF9TVEFUVVNfQ09ERV9V", - "TlNQRUNJRklFRBAAEhsKF1BST1RPQ09MX1NUQVRVU19DT0RFX09LEAESKAok", - "UFJPVE9DT0xfU1RBVFVTX0NPREVfSU5WQUxJRF9SRVFVRVNUEAISKgomUFJP", - "VE9DT0xfU1RBVFVTX0NPREVfU0VTU0lPTl9OT1RfRk9VTkQQAxIqCiZQUk9U", - "T0NPTF9TVEFUVVNfQ09ERV9TRVNTSU9OX05PVF9SRUFEWRAEEisKJ1BST1RP", - "Q09MX1NUQVRVU19DT0RFX1dPUktFUl9VTkFWQUlMQUJMRRAFEiAKHFBST1RP", - "Q09MX1NUQVRVU19DT0RFX1RJTUVPVVQQBhIhCh1QUk9UT0NPTF9TVEFUVVNf", - "Q09ERV9DQU5DRUxFRBAHEisKJ1BST1RPQ09MX1NUQVRVU19DT0RFX1BST1RP", - "Q09MX1ZJT0xBVElPThAIEikKJVBST1RPQ09MX1NUQVRVU19DT0RFX01YQUND", - "RVNTX0ZBSUxVUkUQCSq/AgoMU2Vzc2lvblN0YXRlEh0KGVNFU1NJT05fU1RB", - "VEVfVU5TUEVDSUZJRUQQABIaChZTRVNTSU9OX1NUQVRFX0NSRUFUSU5HEAES", - "IQodU0VTU0lPTl9TVEFURV9TVEFSVElOR19XT1JLRVIQAhIiCh5TRVNTSU9O", - "X1NUQVRFX1dBSVRJTkdfRk9SX1BJUEUQAxIdChlTRVNTSU9OX1NUQVRFX0hB", - "TkRTSEFLSU5HEAQSJQohU0VTU0lPTl9TVEFURV9JTklUSUFMSVpJTkdfV09S", - "S0VSEAUSFwoTU0VTU0lPTl9TVEFURV9SRUFEWRAGEhkKFVNFU1NJT05fU1RB", - "VEVfQ0xPU0lORxAHEhgKFFNFU1NJT05fU1RBVEVfQ0xPU0VEEAgSGQoVU0VT", - "U0lPTl9TVEFURV9GQVVMVEVEEAky4AQKD014QWNjZXNzR2F0ZXdheRJdCgtP", - "cGVuU2Vzc2lvbhInLm14YWNjZXNzX2dhdGV3YXkudjEuT3BlblNlc3Npb25S", - "ZXF1ZXN0GiUubXhhY2Nlc3NfZ2F0ZXdheS52MS5PcGVuU2Vzc2lvblJlcGx5", - "EmAKDENsb3NlU2Vzc2lvbhIoLm14YWNjZXNzX2dhdGV3YXkudjEuQ2xvc2VT", - "ZXNzaW9uUmVxdWVzdBomLm14YWNjZXNzX2dhdGV3YXkudjEuQ2xvc2VTZXNz", - "aW9uUmVwbHkSVAoGSW52b2tlEiUubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeENv", - "bW1hbmRSZXF1ZXN0GiMubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeENvbW1hbmRS", - "ZXBseRJYCgxTdHJlYW1FdmVudHMSKC5teGFjY2Vzc19nYXRld2F5LnYxLlN0", - "cmVhbUV2ZW50c1JlcXVlc3QaHC5teGFjY2Vzc19nYXRld2F5LnYxLk14RXZl", - "bnQwARJsChBBY2tub3dsZWRnZUFsYXJtEiwubXhhY2Nlc3NfZ2F0ZXdheS52", - "MS5BY2tub3dsZWRnZUFsYXJtUmVxdWVzdBoqLm14YWNjZXNzX2dhdGV3YXku", - "djEuQWNrbm93bGVkZ2VBbGFybVJlcGx5Em4KEVF1ZXJ5QWN0aXZlQWxhcm1z", - "Ei0ubXhhY2Nlc3NfZ2F0ZXdheS52MS5RdWVyeUFjdGl2ZUFsYXJtc1JlcXVl", - "c3QaKC5teGFjY2Vzc19nYXRld2F5LnYxLkFjdGl2ZUFsYXJtU25hcHNob3Qw", - "AUIcqgIZTXhHYXRld2F5LkNvbnRyYWN0cy5Qcm90b2IGcHJvdG8z")); + "X2hhbmRsZXMYAiADKAUiRAoVUmVtb3ZlSXRlbUJ1bGtDb21tYW5kEhUKDXNl", + "cnZlcl9oYW5kbGUYASABKAUSFAoMaXRlbV9oYW5kbGVzGAIgAygFIkYKF1Vu", + "QWR2aXNlSXRlbUJ1bGtDb21tYW5kEhUKDXNlcnZlcl9oYW5kbGUYASABKAUS", + "FAoMaXRlbV9oYW5kbGVzGAIgAygFIkQKFFN1YnNjcmliZUJ1bGtDb21tYW5k", + "EhUKDXNlcnZlcl9oYW5kbGUYASABKAUSFQoNdGFnX2FkZHJlc3NlcxgCIAMo", + "CSI5ChZTdWJzY3JpYmVBbGFybXNDb21tYW5kEh8KF3N1YnNjcmlwdGlvbl9l", + "eHByZXNzaW9uGAEgASgJIhoKGFVuc3Vic2NyaWJlQWxhcm1zQ29tbWFuZCKh", + "AQoXQWNrbm93bGVkZ2VBbGFybUNvbW1hbmQSEgoKYWxhcm1fZ3VpZBgBIAEo", + "CRIPCgdjb21tZW50GAIgASgJEhUKDW9wZXJhdG9yX3VzZXIYAyABKAkSFQoN", + "b3BlcmF0b3Jfbm9kZRgEIAEoCRIXCg9vcGVyYXRvcl9kb21haW4YBSABKAkS", + "GgoSb3BlcmF0b3JfZnVsbF9uYW1lGAYgASgJIjcKGFF1ZXJ5QWN0aXZlQWxh", + "cm1zQ29tbWFuZBIbChNhbGFybV9maWx0ZXJfcHJlZml4GAEgASgJItIBCh1B", + "Y2tub3dsZWRnZUFsYXJtQnlOYW1lQ29tbWFuZBISCgphbGFybV9uYW1lGAEg", + "ASgJEhUKDXByb3ZpZGVyX25hbWUYAiABKAkSEgoKZ3JvdXBfbmFtZRgDIAEo", + "CRIPCgdjb21tZW50GAQgASgJEhUKDW9wZXJhdG9yX3VzZXIYBSABKAkSFQoN", + "b3BlcmF0b3Jfbm9kZRgGIAEoCRIXCg9vcGVyYXRvcl9kb21haW4YByABKAkS", + "GgoSb3BlcmF0b3JfZnVsbF9uYW1lGAggASgJIkUKFlVuc3Vic2NyaWJlQnVs", + "a0NvbW1hbmQSFQoNc2VydmVyX2hhbmRsZRgBIAEoBRIUCgxpdGVtX2hhbmRs", + "ZXMYAiADKAUiHgoLUGluZ0NvbW1hbmQSDwoHbWVzc2FnZRgBIAEoCSIYChZH", + "ZXRTZXNzaW9uU3RhdGVDb21tYW5kIhYKFEdldFdvcmtlckluZm9Db21tYW5k", + "IigKEkRyYWluRXZlbnRzQ29tbWFuZBISCgptYXhfZXZlbnRzGAEgASgNIkgK", + "FVNodXRkb3duV29ya2VyQ29tbWFuZBIvCgxncmFjZV9wZXJpb2QYASABKAsy", + "GS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24izwwKDk14Q29tbWFuZFJlcGx5", + "EhIKCnNlc3Npb25faWQYASABKAkSFgoOY29ycmVsYXRpb25faWQYAiABKAkS", + "MAoEa2luZBgDIAEoDjIiLm14YWNjZXNzX2dhdGV3YXkudjEuTXhDb21tYW5k", + "S2luZBI8Cg9wcm90b2NvbF9zdGF0dXMYBCABKAsyIy5teGFjY2Vzc19nYXRl", + "d2F5LnYxLlByb3RvY29sU3RhdHVzEhQKB2hyZXN1bHQYBSABKAVIAYgBARIy", + "CgxyZXR1cm5fdmFsdWUYBiABKAsyHC5teGFjY2Vzc19nYXRld2F5LnYxLk14", + "VmFsdWUSNAoIc3RhdHVzZXMYByADKAsyIi5teGFjY2Vzc19nYXRld2F5LnYx", + "Lk14U3RhdHVzUHJveHkSGgoSZGlhZ25vc3RpY19tZXNzYWdlGAggASgJEjYK", + "CHJlZ2lzdGVyGBQgASgLMiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5SZWdpc3Rl", + "clJlcGx5SAASNQoIYWRkX2l0ZW0YFSABKAsyIS5teGFjY2Vzc19nYXRld2F5", + "LnYxLkFkZEl0ZW1SZXBseUgAEjcKCWFkZF9pdGVtMhgWIAEoCzIiLm14YWNj", + "ZXNzX2dhdGV3YXkudjEuQWRkSXRlbTJSZXBseUgAEkYKEWFkZF9idWZmZXJl", + "ZF9pdGVtGBcgASgLMikubXhhY2Nlc3NfZ2F0ZXdheS52MS5BZGRCdWZmZXJl", + "ZEl0ZW1SZXBseUgAEjQKB3N1c3BlbmQYGCABKAsyIS5teGFjY2Vzc19nYXRl", + "d2F5LnYxLlN1c3BlbmRSZXBseUgAEjYKCGFjdGl2YXRlGBkgASgLMiIubXhh", + "Y2Nlc3NfZ2F0ZXdheS52MS5BY3RpdmF0ZVJlcGx5SAASRwoRYXV0aGVudGlj", + "YXRlX3VzZXIYGiABKAsyKi5teGFjY2Vzc19nYXRld2F5LnYxLkF1dGhlbnRp", + "Y2F0ZVVzZXJSZXBseUgAEksKFGFyY2hlc3RyYV91c2VyX3RvX2lkGBsgASgL", + "MisubXhhY2Nlc3NfZ2F0ZXdheS52MS5BcmNoZXN0ckFVc2VyVG9JZFJlcGx5", + "SAASQAoNYWRkX2l0ZW1fYnVsaxgcIAEoCzInLm14YWNjZXNzX2dhdGV3YXku", + "djEuQnVsa1N1YnNjcmliZVJlcGx5SAASQwoQYWR2aXNlX2l0ZW1fYnVsaxgd", + "IAEoCzInLm14YWNjZXNzX2dhdGV3YXkudjEuQnVsa1N1YnNjcmliZVJlcGx5", + "SAASQwoQcmVtb3ZlX2l0ZW1fYnVsaxgeIAEoCzInLm14YWNjZXNzX2dhdGV3", + "YXkudjEuQnVsa1N1YnNjcmliZVJlcGx5SAASRgoTdW5fYWR2aXNlX2l0ZW1f", + "YnVsaxgfIAEoCzInLm14YWNjZXNzX2dhdGV3YXkudjEuQnVsa1N1YnNjcmli", + "ZVJlcGx5SAASQQoOc3Vic2NyaWJlX2J1bGsYICABKAsyJy5teGFjY2Vzc19n", + "YXRld2F5LnYxLkJ1bGtTdWJzY3JpYmVSZXBseUgAEkMKEHVuc3Vic2NyaWJl", + "X2J1bGsYISABKAsyJy5teGFjY2Vzc19nYXRld2F5LnYxLkJ1bGtTdWJzY3Jp", + "YmVSZXBseUgAEk4KEWFja25vd2xlZGdlX2FsYXJtGCIgASgLMjEubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5BY2tub3dsZWRnZUFsYXJtUmVwbHlQYXlsb2FkSAAS", + "UQoTcXVlcnlfYWN0aXZlX2FsYXJtcxgjIAEoCzIyLm14YWNjZXNzX2dhdGV3", + "YXkudjEuUXVlcnlBY3RpdmVBbGFybXNSZXBseVBheWxvYWRIABI/Cg1zZXNz", + "aW9uX3N0YXRlGGQgASgLMiYubXhhY2Nlc3NfZ2F0ZXdheS52MS5TZXNzaW9u", + "U3RhdGVSZXBseUgAEjsKC3dvcmtlcl9pbmZvGGUgASgLMiQubXhhY2Nlc3Nf", + "Z2F0ZXdheS52MS5Xb3JrZXJJbmZvUmVwbHlIABI9CgxkcmFpbl9ldmVudHMY", + "ZiABKAsyJS5teGFjY2Vzc19nYXRld2F5LnYxLkRyYWluRXZlbnRzUmVwbHlI", + "AEIJCgdwYXlsb2FkQgoKCF9ocmVzdWx0IiYKDVJlZ2lzdGVyUmVwbHkSFQoN", + "c2VydmVyX2hhbmRsZRgBIAEoBSIjCgxBZGRJdGVtUmVwbHkSEwoLaXRlbV9o", + "YW5kbGUYASABKAUiJAoNQWRkSXRlbTJSZXBseRITCgtpdGVtX2hhbmRsZRgB", + "IAEoBSIrChRBZGRCdWZmZXJlZEl0ZW1SZXBseRITCgtpdGVtX2hhbmRsZRgB", + "IAEoBSJCCgxTdXNwZW5kUmVwbHkSMgoGc3RhdHVzGAEgASgLMiIubXhhY2Nl", + "c3NfZ2F0ZXdheS52MS5NeFN0YXR1c1Byb3h5IkMKDUFjdGl2YXRlUmVwbHkS", + "MgoGc3RhdHVzGAEgASgLMiIubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFN0YXR1", + "c1Byb3h5IigKFUF1dGhlbnRpY2F0ZVVzZXJSZXBseRIPCgd1c2VyX2lkGAEg", + "ASgFIikKFkFyY2hlc3RyQVVzZXJUb0lkUmVwbHkSDwoHdXNlcl9pZBgBIAEo", + "BSKBAQoPU3Vic2NyaWJlUmVzdWx0EhUKDXNlcnZlcl9oYW5kbGUYASABKAUS", + "EwoLdGFnX2FkZHJlc3MYAiABKAkSEwoLaXRlbV9oYW5kbGUYAyABKAUSFgoO", + "d2FzX3N1Y2Nlc3NmdWwYBCABKAgSFQoNZXJyb3JfbWVzc2FnZRgFIAEoCSJL", + "ChJCdWxrU3Vic2NyaWJlUmVwbHkSNQoHcmVzdWx0cxgBIAMoCzIkLm14YWNj", + "ZXNzX2dhdGV3YXkudjEuU3Vic2NyaWJlUmVzdWx0IkUKEVNlc3Npb25TdGF0", + "ZVJlcGx5EjAKBXN0YXRlGAEgASgOMiEubXhhY2Nlc3NfZ2F0ZXdheS52MS5T", + "ZXNzaW9uU3RhdGUidQoPV29ya2VySW5mb1JlcGx5EhkKEXdvcmtlcl9wcm9j", + "ZXNzX2lkGAEgASgFEhYKDndvcmtlcl92ZXJzaW9uGAIgASgJEhcKD214YWNj", + "ZXNzX3Byb2dpZBgDIAEoCRIWCg5teGFjY2Vzc19jbHNpZBgEIAEoCSJAChBE", + "cmFpbkV2ZW50c1JlcGx5EiwKBmV2ZW50cxgBIAMoCzIcLm14YWNjZXNzX2dh", + "dGV3YXkudjEuTXhFdmVudCI1ChxBY2tub3dsZWRnZUFsYXJtUmVwbHlQYXls", + "b2FkEhUKDW5hdGl2ZV9zdGF0dXMYASABKAUiXAodUXVlcnlBY3RpdmVBbGFy", + "bXNSZXBseVBheWxvYWQSOwoJc25hcHNob3RzGAEgAygLMigubXhhY2Nlc3Nf", + "Z2F0ZXdheS52MS5BY3RpdmVBbGFybVNuYXBzaG90IucGCgdNeEV2ZW50EjIK", + "BmZhbWlseRgBIAEoDjIiLm14YWNjZXNzX2dhdGV3YXkudjEuTXhFdmVudEZh", + "bWlseRISCgpzZXNzaW9uX2lkGAIgASgJEhUKDXNlcnZlcl9oYW5kbGUYAyAB", + "KAUSEwoLaXRlbV9oYW5kbGUYBCABKAUSKwoFdmFsdWUYBSABKAsyHC5teGFj", + "Y2Vzc19nYXRld2F5LnYxLk14VmFsdWUSDwoHcXVhbGl0eRgGIAEoBRI0ChBz", + "b3VyY2VfdGltZXN0YW1wGAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVz", + "dGFtcBI0CghzdGF0dXNlcxgIIAMoCzIiLm14YWNjZXNzX2dhdGV3YXkudjEu", + "TXhTdGF0dXNQcm94eRIXCg93b3JrZXJfc2VxdWVuY2UYCSABKAQSNAoQd29y", + "a2VyX3RpbWVzdGFtcBgKIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3Rh", + "bXASPQoZZ2F0ZXdheV9yZWNlaXZlX3RpbWVzdGFtcBgLIAEoCzIaLmdvb2ds", + "ZS5wcm90b2J1Zi5UaW1lc3RhbXASFAoHaHJlc3VsdBgMIAEoBUgBiAEBEhIK", + "CnJhd19zdGF0dXMYDSABKAkSQAoOb25fZGF0YV9jaGFuZ2UYFCABKAsyJi5t", + "eGFjY2Vzc19nYXRld2F5LnYxLk9uRGF0YUNoYW5nZUV2ZW50SAASRgoRb25f", + "d3JpdGVfY29tcGxldGUYFSABKAsyKS5teGFjY2Vzc19nYXRld2F5LnYxLk9u", + "V3JpdGVDb21wbGV0ZUV2ZW50SAASSQoSb3BlcmF0aW9uX2NvbXBsZXRlGBYg", + "ASgLMisubXhhY2Nlc3NfZ2F0ZXdheS52MS5PcGVyYXRpb25Db21wbGV0ZUV2", + "ZW50SAASUQoXb25fYnVmZmVyZWRfZGF0YV9jaGFuZ2UYFyABKAsyLi5teGFj", + "Y2Vzc19nYXRld2F5LnYxLk9uQnVmZmVyZWREYXRhQ2hhbmdlRXZlbnRIABJK", + "ChNvbl9hbGFybV90cmFuc2l0aW9uGBggASgLMisubXhhY2Nlc3NfZ2F0ZXdh", + "eS52MS5PbkFsYXJtVHJhbnNpdGlvbkV2ZW50SABCBgoEYm9keUIKCghfaHJl", + "c3VsdCITChFPbkRhdGFDaGFuZ2VFdmVudCIWChRPbldyaXRlQ29tcGxldGVF", + "dmVudCIYChZPcGVyYXRpb25Db21wbGV0ZUV2ZW50ItQBChlPbkJ1ZmZlcmVk", + "RGF0YUNoYW5nZUV2ZW50EjIKCWRhdGFfdHlwZRgBIAEoDjIfLm14YWNjZXNz", + "X2dhdGV3YXkudjEuTXhEYXRhVHlwZRI0Cg5xdWFsaXR5X3ZhbHVlcxgCIAEo", + "CzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhBcnJheRI2ChB0aW1lc3RhbXBf", + "dmFsdWVzGAMgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeEFycmF5EhUK", + "DXJhd19kYXRhX3R5cGUYBCABKAUi/QMKFk9uQWxhcm1UcmFuc2l0aW9uRXZl", + "bnQSHAoUYWxhcm1fZnVsbF9yZWZlcmVuY2UYASABKAkSHwoXc291cmNlX29i", + "amVjdF9yZWZlcmVuY2UYAiABKAkSFwoPYWxhcm1fdHlwZV9uYW1lGAMgASgJ", + "EkEKD3RyYW5zaXRpb25fa2luZBgEIAEoDjIoLm14YWNjZXNzX2dhdGV3YXku", + "djEuQWxhcm1UcmFuc2l0aW9uS2luZBIQCghzZXZlcml0eRgFIAEoBRI8Chhv", + "cmlnaW5hbF9yYWlzZV90aW1lc3RhbXAYBiABKAsyGi5nb29nbGUucHJvdG9i", + "dWYuVGltZXN0YW1wEjgKFHRyYW5zaXRpb25fdGltZXN0YW1wGAcgASgLMhou", + "Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIVCg1vcGVyYXRvcl91c2VyGAgg", + "ASgJEhgKEG9wZXJhdG9yX2NvbW1lbnQYCSABKAkSEAoIY2F0ZWdvcnkYCiAB", + "KAkSEwoLZGVzY3JpcHRpb24YCyABKAkSMwoNY3VycmVudF92YWx1ZRgMIAEo", + "CzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZRIxCgtsaW1pdF92YWx1", + "ZRgNIAEoCzIcLm14YWNjZXNzX2dhdGV3YXkudjEuTXhWYWx1ZSL9AwoTQWN0", + "aXZlQWxhcm1TbmFwc2hvdBIcChRhbGFybV9mdWxsX3JlZmVyZW5jZRgBIAEo", + "CRIfChdzb3VyY2Vfb2JqZWN0X3JlZmVyZW5jZRgCIAEoCRIXCg9hbGFybV90", + "eXBlX25hbWUYAyABKAkSEAoIc2V2ZXJpdHkYBCABKAUSPAoYb3JpZ2luYWxf", + "cmFpc2VfdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVz", + "dGFtcBI/Cg1jdXJyZW50X3N0YXRlGAYgASgOMigubXhhY2Nlc3NfZ2F0ZXdh", + "eS52MS5BbGFybUNvbmRpdGlvblN0YXRlEhAKCGNhdGVnb3J5GAcgASgJEhMK", + "C2Rlc2NyaXB0aW9uGAggASgJEj0KGWxhc3RfdHJhbnNpdGlvbl90aW1lc3Rh", + "bXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDW9wZXJh", + "dG9yX3VzZXIYCiABKAkSGAoQb3BlcmF0b3JfY29tbWVudBgLIAEoCRIzCg1j", + "dXJyZW50X3ZhbHVlGAwgASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeFZh", + "bHVlEjEKC2xpbWl0X3ZhbHVlGA0gASgLMhwubXhhY2Nlc3NfZ2F0ZXdheS52", + "MS5NeFZhbHVlIpIBChdBY2tub3dsZWRnZUFsYXJtUmVxdWVzdBISCgpzZXNz", + "aW9uX2lkGAEgASgJEh0KFWNsaWVudF9jb3JyZWxhdGlvbl9pZBgCIAEoCRIc", + "ChRhbGFybV9mdWxsX3JlZmVyZW5jZRgDIAEoCRIPCgdjb21tZW50GAQgASgJ", + "EhUKDW9wZXJhdG9yX3VzZXIYBSABKAki8wEKFUFja25vd2xlZGdlQWxhcm1S", + "ZXBseRISCgpzZXNzaW9uX2lkGAEgASgJEhYKDmNvcnJlbGF0aW9uX2lkGAIg", + "ASgJEjwKD3Byb3RvY29sX3N0YXR1cxgDIAEoCzIjLm14YWNjZXNzX2dhdGV3", + "YXkudjEuUHJvdG9jb2xTdGF0dXMSFAoHaHJlc3VsdBgEIAEoBUgAiAEBEjIK", + "BnN0YXR1cxgFIAEoCzIiLm14YWNjZXNzX2dhdGV3YXkudjEuTXhTdGF0dXNQ", + "cm94eRIaChJkaWFnbm9zdGljX21lc3NhZ2UYBiABKAlCCgoIX2hyZXN1bHQi", + "agoYUXVlcnlBY3RpdmVBbGFybXNSZXF1ZXN0EhIKCnNlc3Npb25faWQYASAB", + "KAkSHQoVY2xpZW50X2NvcnJlbGF0aW9uX2lkGAIgASgJEhsKE2FsYXJtX2Zp", + "bHRlcl9wcmVmaXgYAyABKAki6wEKDU14U3RhdHVzUHJveHkSDwoHc3VjY2Vz", + "cxgBIAEoBRI3CghjYXRlZ29yeRgCIAEoDjIlLm14YWNjZXNzX2dhdGV3YXku", + "djEuTXhTdGF0dXNDYXRlZ29yeRI4CgtkZXRlY3RlZF9ieRgDIAEoDjIjLm14", + "YWNjZXNzX2dhdGV3YXkudjEuTXhTdGF0dXNTb3VyY2USDgoGZGV0YWlsGAQg", + "ASgFEhQKDHJhd19jYXRlZ29yeRgFIAEoBRIXCg9yYXdfZGV0ZWN0ZWRfYnkY", + "BiABKAUSFwoPZGlhZ25vc3RpY190ZXh0GAcgASgJIqcDCgdNeFZhbHVlEjIK", + "CWRhdGFfdHlwZRgBIAEoDjIfLm14YWNjZXNzX2dhdGV3YXkudjEuTXhEYXRh", + "VHlwZRIUCgx2YXJpYW50X3R5cGUYAiABKAkSDwoHaXNfbnVsbBgDIAEoCBIW", + "Cg5yYXdfZGlhZ25vc3RpYxgEIAEoCRIVCg1yYXdfZGF0YV90eXBlGAUgASgF", + "EhQKCmJvb2xfdmFsdWUYCiABKAhIABIVCgtpbnQzMl92YWx1ZRgLIAEoBUgA", + "EhUKC2ludDY0X3ZhbHVlGAwgASgDSAASFQoLZmxvYXRfdmFsdWUYDSABKAJI", + "ABIWCgxkb3VibGVfdmFsdWUYDiABKAFIABIWCgxzdHJpbmdfdmFsdWUYDyAB", + "KAlIABI1Cg90aW1lc3RhbXBfdmFsdWUYECABKAsyGi5nb29nbGUucHJvdG9i", + "dWYuVGltZXN0YW1wSAASMwoLYXJyYXlfdmFsdWUYESABKAsyHC5teGFjY2Vz", + "c19nYXRld2F5LnYxLk14QXJyYXlIABITCglyYXdfdmFsdWUYEiABKAxIAEIG", + "CgRraW5kIv4ECgdNeEFycmF5EjoKEWVsZW1lbnRfZGF0YV90eXBlGAEgASgO", + "Mh8ubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeERhdGFUeXBlEhQKDHZhcmlhbnRf", + "dHlwZRgCIAEoCRISCgpkaW1lbnNpb25zGAMgAygNEhYKDnJhd19kaWFnbm9z", + "dGljGAQgASgJEh0KFXJhd19lbGVtZW50X2RhdGFfdHlwZRgFIAEoBRI1Cgti", + "b29sX3ZhbHVlcxgKIAEoCzIeLm14YWNjZXNzX2dhdGV3YXkudjEuQm9vbEFy", + "cmF5SAASNwoMaW50MzJfdmFsdWVzGAsgASgLMh8ubXhhY2Nlc3NfZ2F0ZXdh", + "eS52MS5JbnQzMkFycmF5SAASNwoMaW50NjRfdmFsdWVzGAwgASgLMh8ubXhh", + "Y2Nlc3NfZ2F0ZXdheS52MS5JbnQ2NEFycmF5SAASNwoMZmxvYXRfdmFsdWVz", + "GA0gASgLMh8ubXhhY2Nlc3NfZ2F0ZXdheS52MS5GbG9hdEFycmF5SAASOQoN", + "ZG91YmxlX3ZhbHVlcxgOIAEoCzIgLm14YWNjZXNzX2dhdGV3YXkudjEuRG91", + "YmxlQXJyYXlIABI5Cg1zdHJpbmdfdmFsdWVzGA8gASgLMiAubXhhY2Nlc3Nf", + "Z2F0ZXdheS52MS5TdHJpbmdBcnJheUgAEj8KEHRpbWVzdGFtcF92YWx1ZXMY", + "ECABKAsyIy5teGFjY2Vzc19nYXRld2F5LnYxLlRpbWVzdGFtcEFycmF5SAAS", + "MwoKcmF3X3ZhbHVlcxgRIAEoCzIdLm14YWNjZXNzX2dhdGV3YXkudjEuUmF3", + "QXJyYXlIAEIICgZ2YWx1ZXMiGwoJQm9vbEFycmF5Eg4KBnZhbHVlcxgBIAMo", + "CCIcCgpJbnQzMkFycmF5Eg4KBnZhbHVlcxgBIAMoBSIcCgpJbnQ2NEFycmF5", + "Eg4KBnZhbHVlcxgBIAMoAyIcCgpGbG9hdEFycmF5Eg4KBnZhbHVlcxgBIAMo", + "AiIdCgtEb3VibGVBcnJheRIOCgZ2YWx1ZXMYASADKAEiHQoLU3RyaW5nQXJy", + "YXkSDgoGdmFsdWVzGAEgAygJIjwKDlRpbWVzdGFtcEFycmF5EioKBnZhbHVl", + "cxgBIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiGgoIUmF3QXJy", + "YXkSDgoGdmFsdWVzGAEgAygMIlgKDlByb3RvY29sU3RhdHVzEjUKBGNvZGUY", + "ASABKA4yJy5teGFjY2Vzc19nYXRld2F5LnYxLlByb3RvY29sU3RhdHVzQ29k", + "ZRIPCgdtZXNzYWdlGAIgASgJKu4JCg1NeENvbW1hbmRLaW5kEh8KG01YX0NP", + "TU1BTkRfS0lORF9VTlNQRUNJRklFRBAAEhwKGE1YX0NPTU1BTkRfS0lORF9S", + "RUdJU1RFUhABEh4KGk1YX0NPTU1BTkRfS0lORF9VTlJFR0lTVEVSEAISHAoY", + "TVhfQ09NTUFORF9LSU5EX0FERF9JVEVNEAMSHQoZTVhfQ09NTUFORF9LSU5E", + "X0FERF9JVEVNMhAEEh8KG01YX0NPTU1BTkRfS0lORF9SRU1PVkVfSVRFTRAF", + "EhoKFk1YX0NPTU1BTkRfS0lORF9BRFZJU0UQBhIdChlNWF9DT01NQU5EX0tJ", + "TkRfVU5fQURWSVNFEAcSJgoiTVhfQ09NTUFORF9LSU5EX0FEVklTRV9TVVBF", + "UlZJU09SWRAIEiUKIU1YX0NPTU1BTkRfS0lORF9BRERfQlVGRkVSRURfSVRF", + "TRAJEjAKLE1YX0NPTU1BTkRfS0lORF9TRVRfQlVGRkVSRURfVVBEQVRFX0lO", + "VEVSVkFMEAoSGwoXTVhfQ09NTUFORF9LSU5EX1NVU1BFTkQQCxIcChhNWF9D", + "T01NQU5EX0tJTkRfQUNUSVZBVEUQDBIZChVNWF9DT01NQU5EX0tJTkRfV1JJ", + "VEUQDRIaChZNWF9DT01NQU5EX0tJTkRfV1JJVEUyEA4SIQodTVhfQ09NTUFO", + "RF9LSU5EX1dSSVRFX1NFQ1VSRUQQDxIiCh5NWF9DT01NQU5EX0tJTkRfV1JJ", + "VEVfU0VDVVJFRDIQEBIlCiFNWF9DT01NQU5EX0tJTkRfQVVUSEVOVElDQVRF", + "X1VTRVIQERIoCiRNWF9DT01NQU5EX0tJTkRfQVJDSEVTVFJBX1VTRVJfVE9f", + "SUQQEhIhCh1NWF9DT01NQU5EX0tJTkRfQUREX0lURU1fQlVMSxATEiQKIE1Y", + "X0NPTU1BTkRfS0lORF9BRFZJU0VfSVRFTV9CVUxLEBQSJAogTVhfQ09NTUFO", + "RF9LSU5EX1JFTU9WRV9JVEVNX0JVTEsQFRInCiNNWF9DT01NQU5EX0tJTkRf", + "VU5fQURWSVNFX0lURU1fQlVMSxAWEiIKHk1YX0NPTU1BTkRfS0lORF9TVUJT", + "Q1JJQkVfQlVMSxAXEiQKIE1YX0NPTU1BTkRfS0lORF9VTlNVQlNDUklCRV9C", + "VUxLEBgSJAogTVhfQ09NTUFORF9LSU5EX1NVQlNDUklCRV9BTEFSTVMQGRIm", + "CiJNWF9DT01NQU5EX0tJTkRfVU5TVUJTQ1JJQkVfQUxBUk1TEBoSJQohTVhf", + "Q09NTUFORF9LSU5EX0FDS05PV0xFREdFX0FMQVJNEBsSJwojTVhfQ09NTUFO", + "RF9LSU5EX1FVRVJZX0FDVElWRV9BTEFSTVMQHBItCilNWF9DT01NQU5EX0tJ", + "TkRfQUNLTk9XTEVER0VfQUxBUk1fQllfTkFNRRAdEhgKFE1YX0NPTU1BTkRf", + "S0lORF9QSU5HEGQSJQohTVhfQ09NTUFORF9LSU5EX0dFVF9TRVNTSU9OX1NU", + "QVRFEGUSIwofTVhfQ09NTUFORF9LSU5EX0dFVF9XT1JLRVJfSU5GTxBmEiAK", + "HE1YX0NPTU1BTkRfS0lORF9EUkFJTl9FVkVOVFMQZxIjCh9NWF9DT01NQU5E", + "X0tJTkRfU0hVVERPV05fV09SS0VSEGgq+QEKDU14RXZlbnRGYW1pbHkSHwob", + "TVhfRVZFTlRfRkFNSUxZX1VOU1BFQ0lGSUVEEAASIgoeTVhfRVZFTlRfRkFN", + "SUxZX09OX0RBVEFfQ0hBTkdFEAESJQohTVhfRVZFTlRfRkFNSUxZX09OX1dS", + "SVRFX0NPTVBMRVRFEAISJgoiTVhfRVZFTlRfRkFNSUxZX09QRVJBVElPTl9D", + "T01QTEVURRADEisKJ01YX0VWRU5UX0ZBTUlMWV9PTl9CVUZGRVJFRF9EQVRB", + "X0NIQU5HRRAEEicKI01YX0VWRU5UX0ZBTUlMWV9PTl9BTEFSTV9UUkFOU0lU", + "SU9OEAUqygEKE0FsYXJtVHJhbnNpdGlvbktpbmQSJQohQUxBUk1fVFJBTlNJ", + "VElPTl9LSU5EX1VOU1BFQ0lGSUVEEAASHwobQUxBUk1fVFJBTlNJVElPTl9L", + "SU5EX1JBSVNFEAESJQohQUxBUk1fVFJBTlNJVElPTl9LSU5EX0FDS05PV0xF", + "REdFEAISHwobQUxBUk1fVFJBTlNJVElPTl9LSU5EX0NMRUFSEAMSIwofQUxB", + "Uk1fVFJBTlNJVElPTl9LSU5EX1JFVFJJR0dFUhAEKqoBChNBbGFybUNvbmRp", + "dGlvblN0YXRlEiUKIUFMQVJNX0NPTkRJVElPTl9TVEFURV9VTlNQRUNJRklF", + "RBAAEiAKHEFMQVJNX0NPTkRJVElPTl9TVEFURV9BQ1RJVkUQARImCiJBTEFS", + "TV9DT05ESVRJT05fU1RBVEVfQUNUSVZFX0FDS0VEEAISIgoeQUxBUk1fQ09O", + "RElUSU9OX1NUQVRFX0lOQUNUSVZFEAMqpQMKEE14U3RhdHVzQ2F0ZWdvcnkS", + "IgoeTVhfU1RBVFVTX0NBVEVHT1JZX1VOU1BFQ0lGSUVEEAASHgoaTVhfU1RB", + "VFVTX0NBVEVHT1JZX1VOS05PV04QARIZChVNWF9TVEFUVVNfQ0FURUdPUllf", + "T0sQAhIeChpNWF9TVEFUVVNfQ0FURUdPUllfUEVORElORxADEh4KGk1YX1NU", + "QVRVU19DQVRFR09SWV9XQVJOSU5HEAQSKgomTVhfU1RBVFVTX0NBVEVHT1JZ", + "X0NPTU1VTklDQVRJT05fRVJST1IQBRIqCiZNWF9TVEFUVVNfQ0FURUdPUllf", + "Q09ORklHVVJBVElPTl9FUlJPUhAGEigKJE1YX1NUQVRVU19DQVRFR09SWV9P", + "UEVSQVRJT05BTF9FUlJPUhAHEiUKIU1YX1NUQVRVU19DQVRFR09SWV9TRUNV", + "UklUWV9FUlJPUhAIEiUKIU1YX1NUQVRVU19DQVRFR09SWV9TT0ZUV0FSRV9F", + "UlJPUhAJEiIKHk1YX1NUQVRVU19DQVRFR09SWV9PVEhFUl9FUlJPUhAKKsoC", + "Cg5NeFN0YXR1c1NvdXJjZRIgChxNWF9TVEFUVVNfU09VUkNFX1VOU1BFQ0lG", + "SUVEEAASHAoYTVhfU1RBVFVTX1NPVVJDRV9VTktOT1dOEAESIwofTVhfU1RB", + "VFVTX1NPVVJDRV9SRVFVRVNUSU5HX0xNWBACEiMKH01YX1NUQVRVU19TT1VS", + "Q0VfUkVTUE9ORElOR19MTVgQAxIjCh9NWF9TVEFUVVNfU09VUkNFX1JFUVVF", + "U1RJTkdfTk1YEAQSIwofTVhfU1RBVFVTX1NPVVJDRV9SRVNQT05ESU5HX05N", + "WBAFEjEKLU1YX1NUQVRVU19TT1VSQ0VfUkVRVUVTVElOR19BVVRPTUFUSU9O", + "X09CSkVDVBAGEjEKLU1YX1NUQVRVU19TT1VSQ0VfUkVTUE9ORElOR19BVVRP", + "TUFUSU9OX09CSkVDVBAHKt0ECgpNeERhdGFUeXBlEhwKGE1YX0RBVEFfVFlQ", + "RV9VTlNQRUNJRklFRBAAEhgKFE1YX0RBVEFfVFlQRV9VTktOT1dOEAESGAoU", + "TVhfREFUQV9UWVBFX05PX0RBVEEQAhIYChRNWF9EQVRBX1RZUEVfQk9PTEVB", + "ThADEhgKFE1YX0RBVEFfVFlQRV9JTlRFR0VSEAQSFgoSTVhfREFUQV9UWVBF", + "X0ZMT0FUEAUSFwoTTVhfREFUQV9UWVBFX0RPVUJMRRAGEhcKE01YX0RBVEFf", + "VFlQRV9TVFJJTkcQBxIVChFNWF9EQVRBX1RZUEVfVElNRRAIEh0KGU1YX0RB", + "VEFfVFlQRV9FTEFQU0VEX1RJTUUQCRIfChtNWF9EQVRBX1RZUEVfUkVGRVJF", + "TkNFX1RZUEUQChIcChhNWF9EQVRBX1RZUEVfU1RBVFVTX1RZUEUQCxIVChFN", + "WF9EQVRBX1RZUEVfRU5VTRAMEi0KKU1YX0RBVEFfVFlQRV9TRUNVUklUWV9D", + "TEFTU0lGSUNBVElPTl9FTlVNEA0SIgoeTVhfREFUQV9UWVBFX0RBVEFfUVVB", + "TElUWV9UWVBFEA4SHwobTVhfREFUQV9UWVBFX1FVQUxJRklFRF9FTlVNEA8S", + "IQodTVhfREFUQV9UWVBFX1FVQUxJRklFRF9TVFJVQ1QQEBIpCiVNWF9EQVRB", + "X1RZUEVfSU5URVJOQVRJT05BTElaRURfU1RSSU5HEBESGwoXTVhfREFUQV9U", + "WVBFX0JJR19TVFJJTkcQEhIUChBNWF9EQVRBX1RZUEVfRU5EEBMqowMKElBy", + "b3RvY29sU3RhdHVzQ29kZRIkCiBQUk9UT0NPTF9TVEFUVVNfQ09ERV9VTlNQ", + "RUNJRklFRBAAEhsKF1BST1RPQ09MX1NUQVRVU19DT0RFX09LEAESKAokUFJP", + "VE9DT0xfU1RBVFVTX0NPREVfSU5WQUxJRF9SRVFVRVNUEAISKgomUFJPVE9D", + "T0xfU1RBVFVTX0NPREVfU0VTU0lPTl9OT1RfRk9VTkQQAxIqCiZQUk9UT0NP", + "TF9TVEFUVVNfQ09ERV9TRVNTSU9OX05PVF9SRUFEWRAEEisKJ1BST1RPQ09M", + "X1NUQVRVU19DT0RFX1dPUktFUl9VTkFWQUlMQUJMRRAFEiAKHFBST1RPQ09M", + "X1NUQVRVU19DT0RFX1RJTUVPVVQQBhIhCh1QUk9UT0NPTF9TVEFUVVNfQ09E", + "RV9DQU5DRUxFRBAHEisKJ1BST1RPQ09MX1NUQVRVU19DT0RFX1BST1RPQ09M", + "X1ZJT0xBVElPThAIEikKJVBST1RPQ09MX1NUQVRVU19DT0RFX01YQUNDRVNT", + "X0ZBSUxVUkUQCSq/AgoMU2Vzc2lvblN0YXRlEh0KGVNFU1NJT05fU1RBVEVf", + "VU5TUEVDSUZJRUQQABIaChZTRVNTSU9OX1NUQVRFX0NSRUFUSU5HEAESIQod", + "U0VTU0lPTl9TVEFURV9TVEFSVElOR19XT1JLRVIQAhIiCh5TRVNTSU9OX1NU", + "QVRFX1dBSVRJTkdfRk9SX1BJUEUQAxIdChlTRVNTSU9OX1NUQVRFX0hBTkRT", + "SEFLSU5HEAQSJQohU0VTU0lPTl9TVEFURV9JTklUSUFMSVpJTkdfV09SS0VS", + "EAUSFwoTU0VTU0lPTl9TVEFURV9SRUFEWRAGEhkKFVNFU1NJT05fU1RBVEVf", + "Q0xPU0lORxAHEhgKFFNFU1NJT05fU1RBVEVfQ0xPU0VEEAgSGQoVU0VTU0lP", + "Tl9TVEFURV9GQVVMVEVEEAky4AQKD014QWNjZXNzR2F0ZXdheRJdCgtPcGVu", + "U2Vzc2lvbhInLm14YWNjZXNzX2dhdGV3YXkudjEuT3BlblNlc3Npb25SZXF1", + "ZXN0GiUubXhhY2Nlc3NfZ2F0ZXdheS52MS5PcGVuU2Vzc2lvblJlcGx5EmAK", + "DENsb3NlU2Vzc2lvbhIoLm14YWNjZXNzX2dhdGV3YXkudjEuQ2xvc2VTZXNz", + "aW9uUmVxdWVzdBomLm14YWNjZXNzX2dhdGV3YXkudjEuQ2xvc2VTZXNzaW9u", + "UmVwbHkSVAoGSW52b2tlEiUubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeENvbW1h", + "bmRSZXF1ZXN0GiMubXhhY2Nlc3NfZ2F0ZXdheS52MS5NeENvbW1hbmRSZXBs", + "eRJYCgxTdHJlYW1FdmVudHMSKC5teGFjY2Vzc19nYXRld2F5LnYxLlN0cmVh", + "bUV2ZW50c1JlcXVlc3QaHC5teGFjY2Vzc19nYXRld2F5LnYxLk14RXZlbnQw", + "ARJsChBBY2tub3dsZWRnZUFsYXJtEiwubXhhY2Nlc3NfZ2F0ZXdheS52MS5B", + "Y2tub3dsZWRnZUFsYXJtUmVxdWVzdBoqLm14YWNjZXNzX2dhdGV3YXkudjEu", + "QWNrbm93bGVkZ2VBbGFybVJlcGx5Em4KEVF1ZXJ5QWN0aXZlQWxhcm1zEi0u", + "bXhhY2Nlc3NfZ2F0ZXdheS52MS5RdWVyeUFjdGl2ZUFsYXJtc1JlcXVlc3Qa", + "KC5teGFjY2Vzc19nYXRld2F5LnYxLkFjdGl2ZUFsYXJtU25hcHNob3QwAUIc", + "qgIZTXhHYXRld2F5LkNvbnRyYWN0cy5Qcm90b2IGcHJvdG8z")); 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::MxGateway.Contracts.Proto.MxCommandKind), typeof(global::MxGateway.Contracts.Proto.MxEventFamily), typeof(global::MxGateway.Contracts.Proto.AlarmTransitionKind), typeof(global::MxGateway.Contracts.Proto.AlarmConditionState), typeof(global::MxGateway.Contracts.Proto.MxStatusCategory), typeof(global::MxGateway.Contracts.Proto.MxStatusSource), typeof(global::MxGateway.Contracts.Proto.MxDataType), typeof(global::MxGateway.Contracts.Proto.ProtocolStatusCode), typeof(global::MxGateway.Contracts.Proto.SessionState), }, null, new pbr::GeneratedClrTypeInfo[] { @@ -422,7 +430,7 @@ namespace MxGateway.Contracts.Proto { new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.CloseSessionReply), global::MxGateway.Contracts.Proto.CloseSessionReply.Parser, new[]{ "SessionId", "FinalState", "ProtocolStatus" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.StreamEventsRequest), global::MxGateway.Contracts.Proto.StreamEventsRequest.Parser, new[]{ "SessionId", "AfterWorkerSequence" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.MxCommandRequest), global::MxGateway.Contracts.Proto.MxCommandRequest.Parser, new[]{ "SessionId", "ClientCorrelationId", "Command" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.MxCommand), global::MxGateway.Contracts.Proto.MxCommand.Parser, new[]{ "Kind", "Register", "Unregister", "AddItem", "AddItem2", "RemoveItem", "Advise", "UnAdvise", "AdviseSupervisory", "AddBufferedItem", "SetBufferedUpdateInterval", "Suspend", "Activate", "Write", "Write2", "WriteSecured", "WriteSecured2", "AuthenticateUser", "ArchestraUserToId", "AddItemBulk", "AdviseItemBulk", "RemoveItemBulk", "UnAdviseItemBulk", "SubscribeBulk", "UnsubscribeBulk", "SubscribeAlarms", "UnsubscribeAlarms", "AcknowledgeAlarmCommand", "QueryActiveAlarmsCommand", "Ping", "GetSessionState", "GetWorkerInfo", "DrainEvents", "ShutdownWorker" }, new[]{ "Payload" }, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.MxCommand), global::MxGateway.Contracts.Proto.MxCommand.Parser, new[]{ "Kind", "Register", "Unregister", "AddItem", "AddItem2", "RemoveItem", "Advise", "UnAdvise", "AdviseSupervisory", "AddBufferedItem", "SetBufferedUpdateInterval", "Suspend", "Activate", "Write", "Write2", "WriteSecured", "WriteSecured2", "AuthenticateUser", "ArchestraUserToId", "AddItemBulk", "AdviseItemBulk", "RemoveItemBulk", "UnAdviseItemBulk", "SubscribeBulk", "UnsubscribeBulk", "SubscribeAlarms", "UnsubscribeAlarms", "AcknowledgeAlarmCommand", "QueryActiveAlarmsCommand", "AcknowledgeAlarmByNameCommand", "Ping", "GetSessionState", "GetWorkerInfo", "DrainEvents", "ShutdownWorker" }, new[]{ "Payload" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.RegisterCommand), global::MxGateway.Contracts.Proto.RegisterCommand.Parser, new[]{ "ClientName" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.UnregisterCommand), global::MxGateway.Contracts.Proto.UnregisterCommand.Parser, new[]{ "ServerHandle" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.AddItemCommand), global::MxGateway.Contracts.Proto.AddItemCommand.Parser, new[]{ "ServerHandle", "ItemDefinition" }, null, null, null, null), @@ -450,6 +458,7 @@ namespace MxGateway.Contracts.Proto { new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.UnsubscribeAlarmsCommand), global::MxGateway.Contracts.Proto.UnsubscribeAlarmsCommand.Parser, null, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.AcknowledgeAlarmCommand), global::MxGateway.Contracts.Proto.AcknowledgeAlarmCommand.Parser, new[]{ "AlarmGuid", "Comment", "OperatorUser", "OperatorNode", "OperatorDomain", "OperatorFullName" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.QueryActiveAlarmsCommand), global::MxGateway.Contracts.Proto.QueryActiveAlarmsCommand.Parser, new[]{ "AlarmFilterPrefix" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand), global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand.Parser, new[]{ "AlarmName", "ProviderName", "GroupName", "Comment", "OperatorUser", "OperatorNode", "OperatorDomain", "OperatorFullName" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.UnsubscribeBulkCommand), global::MxGateway.Contracts.Proto.UnsubscribeBulkCommand.Parser, new[]{ "ServerHandle", "ItemHandles" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.PingCommand), global::MxGateway.Contracts.Proto.PingCommand.Parser, new[]{ "Message" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::MxGateway.Contracts.Proto.GetSessionStateCommand), global::MxGateway.Contracts.Proto.GetSessionStateCommand.Parser, null, null, null, null, null), @@ -530,6 +539,7 @@ namespace MxGateway.Contracts.Proto { [pbr::OriginalName("MX_COMMAND_KIND_UNSUBSCRIBE_ALARMS")] UnsubscribeAlarms = 26, [pbr::OriginalName("MX_COMMAND_KIND_ACKNOWLEDGE_ALARM")] AcknowledgeAlarm = 27, [pbr::OriginalName("MX_COMMAND_KIND_QUERY_ACTIVE_ALARMS")] QueryActiveAlarms = 28, + [pbr::OriginalName("MX_COMMAND_KIND_ACKNOWLEDGE_ALARM_BY_NAME")] AcknowledgeAlarmByName = 29, [pbr::OriginalName("MX_COMMAND_KIND_PING")] Ping = 100, [pbr::OriginalName("MX_COMMAND_KIND_GET_SESSION_STATE")] GetSessionState = 101, [pbr::OriginalName("MX_COMMAND_KIND_GET_WORKER_INFO")] GetWorkerInfo = 102, @@ -2578,6 +2588,9 @@ namespace MxGateway.Contracts.Proto { case PayloadOneofCase.QueryActiveAlarmsCommand: QueryActiveAlarmsCommand = other.QueryActiveAlarmsCommand.Clone(); break; + case PayloadOneofCase.AcknowledgeAlarmByNameCommand: + AcknowledgeAlarmByNameCommand = other.AcknowledgeAlarmByNameCommand.Clone(); + break; case PayloadOneofCase.Ping: Ping = other.Ping.Clone(); break; @@ -2952,6 +2965,18 @@ namespace MxGateway.Contracts.Proto { } } + /// Field number for the "acknowledge_alarm_by_name_command" field. + public const int AcknowledgeAlarmByNameCommandFieldNumber = 38; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand AcknowledgeAlarmByNameCommand { + get { return payloadCase_ == PayloadOneofCase.AcknowledgeAlarmByNameCommand ? (global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand) payload_ : null; } + set { + payload_ = value; + payloadCase_ = value == null ? PayloadOneofCase.None : PayloadOneofCase.AcknowledgeAlarmByNameCommand; + } + } + /// Field number for the "ping" field. public const int PingFieldNumber = 100; [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -3044,6 +3069,7 @@ namespace MxGateway.Contracts.Proto { UnsubscribeAlarms = 35, AcknowledgeAlarmCommand = 36, QueryActiveAlarmsCommand = 37, + AcknowledgeAlarmByNameCommand = 38, Ping = 100, GetSessionState = 101, GetWorkerInfo = 102, @@ -3108,6 +3134,7 @@ namespace MxGateway.Contracts.Proto { if (!object.Equals(UnsubscribeAlarms, other.UnsubscribeAlarms)) return false; if (!object.Equals(AcknowledgeAlarmCommand, other.AcknowledgeAlarmCommand)) return false; if (!object.Equals(QueryActiveAlarmsCommand, other.QueryActiveAlarmsCommand)) return false; + if (!object.Equals(AcknowledgeAlarmByNameCommand, other.AcknowledgeAlarmByNameCommand)) return false; if (!object.Equals(Ping, other.Ping)) return false; if (!object.Equals(GetSessionState, other.GetSessionState)) return false; if (!object.Equals(GetWorkerInfo, other.GetWorkerInfo)) return false; @@ -3150,6 +3177,7 @@ namespace MxGateway.Contracts.Proto { if (payloadCase_ == PayloadOneofCase.UnsubscribeAlarms) hash ^= UnsubscribeAlarms.GetHashCode(); if (payloadCase_ == PayloadOneofCase.AcknowledgeAlarmCommand) hash ^= AcknowledgeAlarmCommand.GetHashCode(); if (payloadCase_ == PayloadOneofCase.QueryActiveAlarmsCommand) hash ^= QueryActiveAlarmsCommand.GetHashCode(); + if (payloadCase_ == PayloadOneofCase.AcknowledgeAlarmByNameCommand) hash ^= AcknowledgeAlarmByNameCommand.GetHashCode(); if (payloadCase_ == PayloadOneofCase.Ping) hash ^= Ping.GetHashCode(); if (payloadCase_ == PayloadOneofCase.GetSessionState) hash ^= GetSessionState.GetHashCode(); if (payloadCase_ == PayloadOneofCase.GetWorkerInfo) hash ^= GetWorkerInfo.GetHashCode(); @@ -3290,6 +3318,10 @@ namespace MxGateway.Contracts.Proto { output.WriteRawTag(170, 2); output.WriteMessage(QueryActiveAlarmsCommand); } + if (payloadCase_ == PayloadOneofCase.AcknowledgeAlarmByNameCommand) { + output.WriteRawTag(178, 2); + output.WriteMessage(AcknowledgeAlarmByNameCommand); + } if (payloadCase_ == PayloadOneofCase.Ping) { output.WriteRawTag(162, 6); output.WriteMessage(Ping); @@ -3436,6 +3468,10 @@ namespace MxGateway.Contracts.Proto { output.WriteRawTag(170, 2); output.WriteMessage(QueryActiveAlarmsCommand); } + if (payloadCase_ == PayloadOneofCase.AcknowledgeAlarmByNameCommand) { + output.WriteRawTag(178, 2); + output.WriteMessage(AcknowledgeAlarmByNameCommand); + } if (payloadCase_ == PayloadOneofCase.Ping) { output.WriteRawTag(162, 6); output.WriteMessage(Ping); @@ -3553,6 +3589,9 @@ namespace MxGateway.Contracts.Proto { if (payloadCase_ == PayloadOneofCase.QueryActiveAlarmsCommand) { size += 2 + pb::CodedOutputStream.ComputeMessageSize(QueryActiveAlarmsCommand); } + if (payloadCase_ == PayloadOneofCase.AcknowledgeAlarmByNameCommand) { + size += 2 + pb::CodedOutputStream.ComputeMessageSize(AcknowledgeAlarmByNameCommand); + } if (payloadCase_ == PayloadOneofCase.Ping) { size += 2 + pb::CodedOutputStream.ComputeMessageSize(Ping); } @@ -3752,6 +3791,12 @@ namespace MxGateway.Contracts.Proto { } QueryActiveAlarmsCommand.MergeFrom(other.QueryActiveAlarmsCommand); break; + case PayloadOneofCase.AcknowledgeAlarmByNameCommand: + if (AcknowledgeAlarmByNameCommand == null) { + AcknowledgeAlarmByNameCommand = new global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand(); + } + AcknowledgeAlarmByNameCommand.MergeFrom(other.AcknowledgeAlarmByNameCommand); + break; case PayloadOneofCase.Ping: if (Ping == null) { Ping = new global::MxGateway.Contracts.Proto.PingCommand(); @@ -4059,6 +4104,15 @@ namespace MxGateway.Contracts.Proto { QueryActiveAlarmsCommand = subBuilder; break; } + case 306: { + global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand subBuilder = new global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand(); + if (payloadCase_ == PayloadOneofCase.AcknowledgeAlarmByNameCommand) { + subBuilder.MergeFrom(AcknowledgeAlarmByNameCommand); + } + input.ReadMessage(subBuilder); + AcknowledgeAlarmByNameCommand = subBuilder; + break; + } case 802: { global::MxGateway.Contracts.Proto.PingCommand subBuilder = new global::MxGateway.Contracts.Proto.PingCommand(); if (payloadCase_ == PayloadOneofCase.Ping) { @@ -4379,6 +4433,15 @@ namespace MxGateway.Contracts.Proto { QueryActiveAlarmsCommand = subBuilder; break; } + case 306: { + global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand subBuilder = new global::MxGateway.Contracts.Proto.AcknowledgeAlarmByNameCommand(); + if (payloadCase_ == PayloadOneofCase.AcknowledgeAlarmByNameCommand) { + subBuilder.MergeFrom(AcknowledgeAlarmByNameCommand); + } + input.ReadMessage(subBuilder); + AcknowledgeAlarmByNameCommand = subBuilder; + break; + } case 802: { global::MxGateway.Contracts.Proto.PingCommand subBuilder = new global::MxGateway.Contracts.Proto.PingCommand(); if (payloadCase_ == PayloadOneofCase.Ping) { @@ -11300,6 +11363,481 @@ namespace 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. + /// + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] + public sealed partial class AcknowledgeAlarmByNameCommand : pb::IMessage + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + , pb::IBufferMessage + #endif + { + private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AcknowledgeAlarmByNameCommand()); + private pb::UnknownFieldSet _unknownFields; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pb::MessageParser Parser { get { return _parser; } } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public static pbr::MessageDescriptor Descriptor { + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[34]; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + pbr::MessageDescriptor pb::IMessage.Descriptor { + get { return Descriptor; } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmByNameCommand() { + OnConstruction(); + } + + partial void OnConstruction(); + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmByNameCommand(AcknowledgeAlarmByNameCommand other) : this() { + alarmName_ = other.alarmName_; + providerName_ = other.providerName_; + groupName_ = other.groupName_; + comment_ = other.comment_; + operatorUser_ = other.operatorUser_; + operatorNode_ = other.operatorNode_; + operatorDomain_ = other.operatorDomain_; + operatorFullName_ = other.operatorFullName_; + _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public AcknowledgeAlarmByNameCommand Clone() { + return new AcknowledgeAlarmByNameCommand(this); + } + + /// Field number for the "alarm_name" field. + public const int AlarmNameFieldNumber = 1; + private string alarmName_ = ""; + /// + /// Tag/alarm name (e.g. "TestMachine_001.TestAlarm001"). Tag itself + /// may contain dots; the gateway-side parser splits on the first dot + /// after the '!' separator. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string AlarmName { + get { return alarmName_; } + set { + alarmName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "provider_name" field. + public const int ProviderNameFieldNumber = 2; + private string providerName_ = ""; + /// + /// AVEVA alarm-provider name (literal "Galaxy" for ArchestrA Galaxies). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string ProviderName { + get { return providerName_; } + set { + providerName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "group_name" field. + public const int GroupNameFieldNumber = 3; + private string groupName_ = ""; + /// + /// Area/group name (e.g. "TestArea"). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string GroupName { + get { return groupName_; } + set { + groupName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "comment" field. + public const int CommentFieldNumber = 4; + private string comment_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string Comment { + get { return comment_; } + set { + comment_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "operator_user" field. + public const int OperatorUserFieldNumber = 5; + private string operatorUser_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorUser { + get { return operatorUser_; } + set { + operatorUser_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "operator_node" field. + public const int OperatorNodeFieldNumber = 6; + private string operatorNode_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorNode { + get { return operatorNode_; } + set { + operatorNode_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "operator_domain" field. + public const int OperatorDomainFieldNumber = 7; + private string operatorDomain_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorDomain { + get { return operatorDomain_; } + set { + operatorDomain_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "operator_full_name" field. + public const int OperatorFullNameFieldNumber = 8; + private string operatorFullName_ = ""; + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string OperatorFullName { + get { return operatorFullName_; } + set { + operatorFullName_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override bool Equals(object other) { + return Equals(other as AcknowledgeAlarmByNameCommand); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Equals(AcknowledgeAlarmByNameCommand other) { + if (ReferenceEquals(other, null)) { + return false; + } + if (ReferenceEquals(other, this)) { + return true; + } + if (AlarmName != other.AlarmName) return false; + if (ProviderName != other.ProviderName) return false; + if (GroupName != other.GroupName) return false; + if (Comment != other.Comment) return false; + if (OperatorUser != other.OperatorUser) return false; + if (OperatorNode != other.OperatorNode) return false; + if (OperatorDomain != other.OperatorDomain) return false; + if (OperatorFullName != other.OperatorFullName) return false; + return Equals(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override int GetHashCode() { + int hash = 1; + if (AlarmName.Length != 0) hash ^= AlarmName.GetHashCode(); + if (ProviderName.Length != 0) hash ^= ProviderName.GetHashCode(); + if (GroupName.Length != 0) hash ^= GroupName.GetHashCode(); + if (Comment.Length != 0) hash ^= Comment.GetHashCode(); + if (OperatorUser.Length != 0) hash ^= OperatorUser.GetHashCode(); + if (OperatorNode.Length != 0) hash ^= OperatorNode.GetHashCode(); + if (OperatorDomain.Length != 0) hash ^= OperatorDomain.GetHashCode(); + if (OperatorFullName.Length != 0) hash ^= OperatorFullName.GetHashCode(); + if (_unknownFields != null) { + hash ^= _unknownFields.GetHashCode(); + } + return hash; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public override string ToString() { + return pb::JsonFormatter.ToDiagnosticString(this); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void WriteTo(pb::CodedOutputStream output) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + output.WriteRawMessage(this); + #else + if (AlarmName.Length != 0) { + output.WriteRawTag(10); + output.WriteString(AlarmName); + } + if (ProviderName.Length != 0) { + output.WriteRawTag(18); + output.WriteString(ProviderName); + } + if (GroupName.Length != 0) { + output.WriteRawTag(26); + output.WriteString(GroupName); + } + if (Comment.Length != 0) { + output.WriteRawTag(34); + output.WriteString(Comment); + } + if (OperatorUser.Length != 0) { + output.WriteRawTag(42); + output.WriteString(OperatorUser); + } + if (OperatorNode.Length != 0) { + output.WriteRawTag(50); + output.WriteString(OperatorNode); + } + if (OperatorDomain.Length != 0) { + output.WriteRawTag(58); + output.WriteString(OperatorDomain); + } + if (OperatorFullName.Length != 0) { + output.WriteRawTag(66); + output.WriteString(OperatorFullName); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(output); + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) { + if (AlarmName.Length != 0) { + output.WriteRawTag(10); + output.WriteString(AlarmName); + } + if (ProviderName.Length != 0) { + output.WriteRawTag(18); + output.WriteString(ProviderName); + } + if (GroupName.Length != 0) { + output.WriteRawTag(26); + output.WriteString(GroupName); + } + if (Comment.Length != 0) { + output.WriteRawTag(34); + output.WriteString(Comment); + } + if (OperatorUser.Length != 0) { + output.WriteRawTag(42); + output.WriteString(OperatorUser); + } + if (OperatorNode.Length != 0) { + output.WriteRawTag(50); + output.WriteString(OperatorNode); + } + if (OperatorDomain.Length != 0) { + output.WriteRawTag(58); + output.WriteString(OperatorDomain); + } + if (OperatorFullName.Length != 0) { + output.WriteRawTag(66); + output.WriteString(OperatorFullName); + } + if (_unknownFields != null) { + _unknownFields.WriteTo(ref output); + } + } + #endif + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public int CalculateSize() { + int size = 0; + if (AlarmName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(AlarmName); + } + if (ProviderName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(ProviderName); + } + if (GroupName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(GroupName); + } + if (Comment.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(Comment); + } + if (OperatorUser.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorUser); + } + if (OperatorNode.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorNode); + } + if (OperatorDomain.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorDomain); + } + if (OperatorFullName.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(OperatorFullName); + } + if (_unknownFields != null) { + size += _unknownFields.CalculateSize(); + } + return size; + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(AcknowledgeAlarmByNameCommand other) { + if (other == null) { + return; + } + if (other.AlarmName.Length != 0) { + AlarmName = other.AlarmName; + } + if (other.ProviderName.Length != 0) { + ProviderName = other.ProviderName; + } + if (other.GroupName.Length != 0) { + GroupName = other.GroupName; + } + if (other.Comment.Length != 0) { + Comment = other.Comment; + } + if (other.OperatorUser.Length != 0) { + OperatorUser = other.OperatorUser; + } + if (other.OperatorNode.Length != 0) { + OperatorNode = other.OperatorNode; + } + if (other.OperatorDomain.Length != 0) { + OperatorDomain = other.OperatorDomain; + } + if (other.OperatorFullName.Length != 0) { + OperatorFullName = other.OperatorFullName; + } + _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); + } + + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public void MergeFrom(pb::CodedInputStream input) { + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + input.ReadRawMessage(this); + #else + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input); + break; + case 10: { + AlarmName = input.ReadString(); + break; + } + case 18: { + ProviderName = input.ReadString(); + break; + } + case 26: { + GroupName = input.ReadString(); + break; + } + case 34: { + Comment = input.ReadString(); + break; + } + case 42: { + OperatorUser = input.ReadString(); + break; + } + case 50: { + OperatorNode = input.ReadString(); + break; + } + case 58: { + OperatorDomain = input.ReadString(); + break; + } + case 66: { + OperatorFullName = input.ReadString(); + break; + } + } + } + #endif + } + + #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) { + uint tag; + while ((tag = input.ReadTag()) != 0) { + if ((tag & 7) == 4) { + // Abort on any end group tag. + return; + } + switch(tag) { + default: + _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input); + break; + case 10: { + AlarmName = input.ReadString(); + break; + } + case 18: { + ProviderName = input.ReadString(); + break; + } + case 26: { + GroupName = input.ReadString(); + break; + } + case 34: { + Comment = input.ReadString(); + break; + } + case 42: { + OperatorUser = input.ReadString(); + break; + } + case 50: { + OperatorNode = input.ReadString(); + break; + } + case 58: { + OperatorDomain = input.ReadString(); + break; + } + case 66: { + OperatorFullName = input.ReadString(); + break; + } + } + } + } + #endif + + } + [global::System.Diagnostics.DebuggerDisplayAttribute("{ToString(),nq}")] public sealed partial class UnsubscribeBulkCommand : pb::IMessage #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE @@ -11315,7 +11853,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[34]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[35]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -11541,7 +12079,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[35]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[36]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -11739,7 +12277,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[36]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[37]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -11900,7 +12438,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[37]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[38]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -12061,7 +12599,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[38]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[39]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -12259,7 +12797,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[39]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[40]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -12467,7 +13005,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[40]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[41]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -13986,7 +14524,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[41]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[42]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -14184,7 +14722,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[42]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[43]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -14382,7 +14920,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[43]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[44]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -14580,7 +15118,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[44]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[45]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -14778,7 +15316,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[45]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[46]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -14985,7 +15523,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[46]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[47]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -15192,7 +15730,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[47]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[48]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -15390,7 +15928,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[48]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[49]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -15588,7 +16126,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[49]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[50]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -15934,7 +16472,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[50]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[51]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -16121,7 +16659,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[51]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[52]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -16319,7 +16857,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[52]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[53]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -16628,7 +17166,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[53]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[54]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -16823,7 +17361,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[54]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[55]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -17027,7 +17565,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[55]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[56]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -17215,7 +17753,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[56]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[57]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -18190,7 +18728,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[57]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[58]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -18351,7 +18889,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[58]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[59]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -18512,7 +19050,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[59]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[60]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -18673,7 +19211,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[60]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[61]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -19006,7 +19544,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[61]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[62]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -19740,7 +20278,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[62]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[63]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -20430,7 +20968,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[63]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[64]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -20787,7 +21325,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[64]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[65]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -21210,7 +21748,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[65]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[66]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -21486,7 +22024,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[66]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[67]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -21906,7 +22444,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[67]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[68]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -22763,7 +23301,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[68]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[69]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -23551,7 +24089,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[69]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[70]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -23740,7 +24278,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[70]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[71]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -23929,7 +24467,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[71]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[72]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -24118,7 +24656,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[72]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[73]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -24307,7 +24845,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[73]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[74]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -24496,7 +25034,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[74]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[75]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -24683,7 +25221,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[75]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[76]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -24870,7 +25408,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[76]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[77]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] @@ -25057,7 +25595,7 @@ namespace MxGateway.Contracts.Proto { [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public static pbr::MessageDescriptor Descriptor { - get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[77]; } + get { return global::MxGateway.Contracts.Proto.MxaccessGatewayReflection.Descriptor.MessageTypes[78]; } } [global::System.Diagnostics.DebuggerNonUserCodeAttribute] diff --git a/src/MxGateway.Contracts/Protos/mxaccess_gateway.proto b/src/MxGateway.Contracts/Protos/mxaccess_gateway.proto index 0bbf2ab..fa71b6b 100644 --- a/src/MxGateway.Contracts/Protos/mxaccess_gateway.proto +++ b/src/MxGateway.Contracts/Protos/mxaccess_gateway.proto @@ -92,6 +92,7 @@ message MxCommand { UnsubscribeAlarmsCommand unsubscribe_alarms = 35; AcknowledgeAlarmCommand acknowledge_alarm_command = 36; QueryActiveAlarmsCommand query_active_alarms_command = 37; + AcknowledgeAlarmByNameCommand acknowledge_alarm_by_name_command = 38; PingCommand ping = 100; GetSessionStateCommand get_session_state = 101; GetWorkerInfoCommand get_worker_info = 102; @@ -130,6 +131,7 @@ enum MxCommandKind { MX_COMMAND_KIND_UNSUBSCRIBE_ALARMS = 26; MX_COMMAND_KIND_ACKNOWLEDGE_ALARM = 27; MX_COMMAND_KIND_QUERY_ACTIVE_ALARMS = 28; + MX_COMMAND_KIND_ACKNOWLEDGE_ALARM_BY_NAME = 29; MX_COMMAND_KIND_PING = 100; MX_COMMAND_KIND_GET_SESSION_STATE = 101; MX_COMMAND_KIND_GET_WORKER_INFO = 102; @@ -307,6 +309,27 @@ message QueryActiveAlarmsCommand { string alarm_filter_prefix = 1; } +// 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. +message AcknowledgeAlarmByNameCommand { + // Tag/alarm name (e.g. "TestMachine_001.TestAlarm001"). Tag itself + // may contain dots; the gateway-side parser splits on the first dot + // after the '!' separator. + string alarm_name = 1; + // AVEVA alarm-provider name (literal "Galaxy" for ArchestrA Galaxies). + string provider_name = 2; + // Area/group name (e.g. "TestArea"). + string group_name = 3; + string comment = 4; + string operator_user = 5; + string operator_node = 6; + string operator_domain = 7; + string operator_full_name = 8; +} + message UnsubscribeBulkCommand { int32 server_handle = 1; repeated int32 item_handles = 2; diff --git a/src/MxGateway.Server/Sessions/WorkerAlarmRpcDispatcher.cs b/src/MxGateway.Server/Sessions/WorkerAlarmRpcDispatcher.cs index 89e6382..81b1561 100644 --- a/src/MxGateway.Server/Sessions/WorkerAlarmRpcDispatcher.cs +++ b/src/MxGateway.Server/Sessions/WorkerAlarmRpcDispatcher.cs @@ -45,6 +45,39 @@ public sealed class WorkerAlarmRpcDispatcher : IAlarmRpcDispatcher this.timeProvider = timeProvider ?? TimeProvider.System; } + /// + /// Parse a full alarm reference of the form Provider!Group.Tag + /// into its components. Convention: the first ! separates + /// provider from Group.Tag; the first . after the + /// ! separates group from tag (the tag itself may contain + /// more dots — e.g. TestMachine_001.TestAlarm001). + /// + /// true on a well-formed reference; false otherwise. + public static bool TryParseAlarmReference( + string? reference, + out string providerName, + out string groupName, + out string alarmName) + { + providerName = string.Empty; + groupName = string.Empty; + alarmName = string.Empty; + if (string.IsNullOrWhiteSpace(reference)) return false; + + int bang = reference!.IndexOf('!'); + if (bang <= 0 || bang == reference.Length - 1) return false; + + string left = reference[..bang]; + string right = reference[(bang + 1)..]; + int dot = right.IndexOf('.'); + if (dot <= 0 || dot == right.Length - 1) return false; + + providerName = left; + groupName = right[..dot]; + alarmName = right[(dot + 1)..]; + return true; + } + /// public async Task AcknowledgeAsync( AcknowledgeAlarmRequest request, @@ -64,11 +97,58 @@ public sealed class WorkerAlarmRpcDispatcher : IAlarmRpcDispatcher }; } - if (!System.Guid.TryParse(request.AlarmFullReference, out System.Guid guid)) + WorkerCommand workerCommand; + if (System.Guid.TryParse(request.AlarmFullReference, out System.Guid guid)) + { + workerCommand = new WorkerCommand + { + Command = new MxCommand + { + Kind = MxCommandKind.AcknowledgeAlarm, + AcknowledgeAlarmCommand = new AcknowledgeAlarmCommand + { + AlarmGuid = guid.ToString(), + Comment = request.Comment ?? string.Empty, + OperatorUser = request.OperatorUser ?? string.Empty, + // Operator node/domain/full-name are not on the public + // RPC surface today; pass empty strings so the worker + // honours the existing AcknowledgeAlarmCommand schema. + OperatorNode = string.Empty, + OperatorDomain = string.Empty, + OperatorFullName = string.Empty, + }, + }, + EnqueueTimestamp = Timestamp.FromDateTimeOffset(timeProvider.GetUtcNow()), + }; + } + else if (TryParseAlarmReference( + request.AlarmFullReference, + out string providerName, + out string groupName, + out string alarmName)) + { + workerCommand = new WorkerCommand + { + Command = new MxCommand + { + Kind = MxCommandKind.AcknowledgeAlarmByName, + AcknowledgeAlarmByNameCommand = new AcknowledgeAlarmByNameCommand + { + AlarmName = alarmName, + ProviderName = providerName, + GroupName = groupName, + Comment = request.Comment ?? string.Empty, + OperatorUser = request.OperatorUser ?? string.Empty, + OperatorNode = string.Empty, + OperatorDomain = string.Empty, + OperatorFullName = string.Empty, + }, + }, + EnqueueTimestamp = Timestamp.FromDateTimeOffset(timeProvider.GetUtcNow()), + }; + } + else { - // Reference→GUID lookup not yet implemented. Surface a clear - // diagnostic so client teams can plumb the reference parser - // when the worker AlarmAckByName command lands. return new AcknowledgeAlarmReply { SessionId = request.SessionId, @@ -76,33 +156,12 @@ public sealed class WorkerAlarmRpcDispatcher : IAlarmRpcDispatcher ProtocolStatus = new ProtocolStatus { Code = ProtocolStatusCode.InvalidRequest, - Message = "AlarmFullReference must currently be a canonical GUID; reference→GUID lookup is pending the AlarmAckByName worker command.", + Message = "AlarmFullReference must be a canonical GUID or 'Provider!Group.Tag' format.", }, - DiagnosticMessage = $"AcknowledgeAlarm received non-GUID reference '{request.AlarmFullReference}'.", + DiagnosticMessage = $"AcknowledgeAlarm received unrecognized reference '{request.AlarmFullReference}'.", }; } - WorkerCommand workerCommand = new WorkerCommand - { - Command = new MxCommand - { - Kind = MxCommandKind.AcknowledgeAlarm, - AcknowledgeAlarmCommand = new AcknowledgeAlarmCommand - { - AlarmGuid = guid.ToString(), - Comment = request.Comment ?? string.Empty, - OperatorUser = request.OperatorUser ?? string.Empty, - // Operator node/domain/full-name are not on the public - // RPC surface today; pass empty strings so the worker - // honours the existing AcknowledgeAlarmCommand schema. - OperatorNode = string.Empty, - OperatorDomain = string.Empty, - OperatorFullName = string.Empty, - }, - }, - EnqueueTimestamp = Timestamp.FromDateTimeOffset(timeProvider.GetUtcNow()), - }; - WorkerCommandReply workerReply = await session.InvokeAsync(workerCommand, cancellationToken) .ConfigureAwait(false); diff --git a/src/MxGateway.Tests/Gateway/Sessions/WorkerAlarmRpcDispatcherTests.cs b/src/MxGateway.Tests/Gateway/Sessions/WorkerAlarmRpcDispatcherTests.cs index ae56f0b..dce9148 100644 --- a/src/MxGateway.Tests/Gateway/Sessions/WorkerAlarmRpcDispatcherTests.cs +++ b/src/MxGateway.Tests/Gateway/Sessions/WorkerAlarmRpcDispatcherTests.cs @@ -36,33 +36,6 @@ public sealed class WorkerAlarmRpcDispatcherTests Assert.Equal(ProtocolStatusCode.SessionNotFound, reply.ProtocolStatus.Code); } - [Fact] - public async Task AcknowledgeAsync_returns_invalid_request_when_reference_is_not_a_guid() - { - SessionRegistry registry = new SessionRegistry(); - FakeAlarmWorkerClient worker = new FakeAlarmWorkerClient(); - GatewaySession session = NewSession("s1"); - session.AttachWorkerClient(worker); - session.MarkReady(); - registry.TryAdd(session); - - WorkerAlarmRpcDispatcher dispatcher = new WorkerAlarmRpcDispatcher(registry); - - AcknowledgeAlarmReply reply = await dispatcher.AcknowledgeAsync( - new AcknowledgeAlarmRequest - { - SessionId = "s1", - ClientCorrelationId = "c1", - AlarmFullReference = "Galaxy!Area.Tag", // not a GUID - Comment = "x", - OperatorUser = "u", - }, - CancellationToken.None); - - Assert.Equal(ProtocolStatusCode.InvalidRequest, reply.ProtocolStatus.Code); - Assert.Equal(0, worker.InvokeCount); // dispatcher short-circuits before the IPC. - } - [Fact] public async Task AcknowledgeAsync_forwards_guid_and_returns_native_status() { @@ -148,6 +121,107 @@ public sealed class WorkerAlarmRpcDispatcherTests Assert.Contains("-123", reply.DiagnosticMessage); } + [Theory] + [InlineData("Galaxy!TestArea.TestMachine_001.TestAlarm001", "Galaxy", "TestArea", "TestMachine_001.TestAlarm001")] + [InlineData("Galaxy!Area.Tag", "Galaxy", "Area", "Tag")] + [InlineData("Provider!Group.Tag.With.Dots", "Provider", "Group", "Tag.With.Dots")] + public void TryParseAlarmReference_decomposes_provider_group_tag( + string reference, string expectedProvider, string expectedGroup, string expectedName) + { + Assert.True(WorkerAlarmRpcDispatcher.TryParseAlarmReference( + reference, out string provider, out string group, out string name)); + Assert.Equal(expectedProvider, provider); + Assert.Equal(expectedGroup, group); + Assert.Equal(expectedName, name); + } + + [Theory] + [InlineData("")] + [InlineData(" ")] + [InlineData(null)] + [InlineData("no-bang-here")] + [InlineData("!Group.Tag")] // empty provider + [InlineData("Galaxy!")] // bang at end + [InlineData("Galaxy!Group")] // missing dot + [InlineData("Galaxy!.Tag")] // empty group + [InlineData("Galaxy!Group.")] // empty tag + public void TryParseAlarmReference_rejects_malformed_references(string? reference) + { + Assert.False(WorkerAlarmRpcDispatcher.TryParseAlarmReference( + reference, out _, out _, out _)); + } + + [Fact] + public async Task AcknowledgeAsync_routes_provider_group_tag_via_AckByName() + { + SessionRegistry registry = new SessionRegistry(); + AcknowledgeAlarmByNameCommand? observed = null; + FakeAlarmWorkerClient worker = new FakeAlarmWorkerClient + { + ReplyFactory = command => + { + Assert.Equal(MxCommandKind.AcknowledgeAlarmByName, command.Command.Kind); + observed = command.Command.AcknowledgeAlarmByNameCommand; + return new MxCommandReply + { + Kind = MxCommandKind.AcknowledgeAlarmByName, + ProtocolStatus = new ProtocolStatus { Code = ProtocolStatusCode.Ok, Message = "OK" }, + Hresult = 0, + AcknowledgeAlarm = new AcknowledgeAlarmReplyPayload { NativeStatus = 0 }, + }; + }, + }; + GatewaySession session = NewSession("s1"); + session.AttachWorkerClient(worker); + session.MarkReady(); + registry.TryAdd(session); + + WorkerAlarmRpcDispatcher dispatcher = new WorkerAlarmRpcDispatcher(registry); + + AcknowledgeAlarmReply reply = await dispatcher.AcknowledgeAsync( + new AcknowledgeAlarmRequest + { + SessionId = "s1", + ClientCorrelationId = "c1", + AlarmFullReference = "Galaxy!TestArea.TestMachine_001.TestAlarm001", + Comment = "ack-by-name", + OperatorUser = "bob", + }, + CancellationToken.None); + + Assert.Equal(ProtocolStatusCode.Ok, reply.ProtocolStatus.Code); + Assert.NotNull(observed); + Assert.Equal("TestMachine_001.TestAlarm001", observed!.AlarmName); + Assert.Equal("Galaxy", observed.ProviderName); + Assert.Equal("TestArea", observed.GroupName); + Assert.Equal("bob", observed.OperatorUser); + Assert.Equal("ack-by-name", observed.Comment); + } + + [Fact] + public async Task AcknowledgeAsync_returns_invalid_request_for_unparseable_reference() + { + SessionRegistry registry = new SessionRegistry(); + FakeAlarmWorkerClient worker = new FakeAlarmWorkerClient(); + GatewaySession session = NewSession("s1"); + session.AttachWorkerClient(worker); + session.MarkReady(); + registry.TryAdd(session); + + WorkerAlarmRpcDispatcher dispatcher = new WorkerAlarmRpcDispatcher(registry); + + AcknowledgeAlarmReply reply = await dispatcher.AcknowledgeAsync( + new AcknowledgeAlarmRequest + { + SessionId = "s1", + AlarmFullReference = "no-bang-no-dot", + }, + CancellationToken.None); + + Assert.Equal(ProtocolStatusCode.InvalidRequest, reply.ProtocolStatus.Code); + Assert.Equal(0, worker.InvokeCount); + } + [Fact] public async Task QueryActiveAlarmsAsync_yields_each_snapshot_from_payload() { diff --git a/src/MxGateway.Worker.Tests/MxAccess/AlarmCommandExecutorTests.cs b/src/MxGateway.Worker.Tests/MxAccess/AlarmCommandExecutorTests.cs index c04dd3e..cd54467 100644 --- a/src/MxGateway.Worker.Tests/MxAccess/AlarmCommandExecutorTests.cs +++ b/src/MxGateway.Worker.Tests/MxAccess/AlarmCommandExecutorTests.cs @@ -164,6 +164,62 @@ public sealed class AlarmCommandExecutorTests Assert.Contains("-123", reply.DiagnosticMessage); } + [Fact] + public void AcknowledgeAlarmByName_routes_tuple_to_handler() + { + FakeAlarmHandler handler = new FakeAlarmHandler { AcknowledgeReturn = 0 }; + MxAccessCommandExecutor executor = NewExecutor(handler); + + StaCommand command = new StaCommand( + SessionId, CorrelationId, + new MxCommand + { + Kind = MxCommandKind.AcknowledgeAlarmByName, + AcknowledgeAlarmByNameCommand = new AcknowledgeAlarmByNameCommand + { + AlarmName = "TestMachine_001.TestAlarm001", + ProviderName = "Galaxy", + GroupName = "TestArea", + Comment = "ack", + OperatorUser = "alice", + }, + }); + + MxCommandReply reply = executor.Execute(command); + + Assert.Equal(ProtocolStatusCode.Ok, reply.ProtocolStatus.Code); + Assert.NotNull(reply.AcknowledgeAlarm); + Assert.Equal(0, reply.AcknowledgeAlarm.NativeStatus); + Assert.NotNull(handler.LastAckByNameTuple); + Assert.Equal("TestMachine_001.TestAlarm001", handler.LastAckByNameTuple!.Value.Name); + Assert.Equal("Galaxy", handler.LastAckByNameTuple!.Value.Provider); + Assert.Equal("TestArea", handler.LastAckByNameTuple!.Value.Group); + Assert.Equal("alice", handler.LastAckOperatorName); + } + + [Fact] + public void AcknowledgeAlarmByName_with_empty_name_returns_invalid_request() + { + MxAccessCommandExecutor executor = NewExecutor(new FakeAlarmHandler()); + + StaCommand command = new StaCommand( + SessionId, CorrelationId, + new MxCommand + { + Kind = MxCommandKind.AcknowledgeAlarmByName, + AcknowledgeAlarmByNameCommand = new AcknowledgeAlarmByNameCommand + { + AlarmName = " ", + ProviderName = "Galaxy", + GroupName = "TestArea", + }, + }); + + MxCommandReply reply = executor.Execute(command); + + Assert.Equal(ProtocolStatusCode.InvalidRequest, reply.ProtocolStatus.Code); + } + [Fact] public void QueryActiveAlarms_returns_payload_with_snapshots() { @@ -373,6 +429,18 @@ public sealed class AlarmCommandExecutorTests return AcknowledgeReturn; } + public int AcknowledgeByName( + string alarmName, string providerName, string groupName, + string comment, string operatorUser, string operatorNode, + string operatorDomain, string operatorFullName) + { + LastAckByNameTuple = (alarmName, providerName, groupName); + LastAckOperatorName = operatorUser; + return AcknowledgeReturn; + } + + public (string Name, string Provider, string Group)? LastAckByNameTuple { get; private set; } + public IReadOnlyList QueryActive(string? alarmFilterPrefix) { LastFilterPrefix = alarmFilterPrefix; diff --git a/src/MxGateway.Worker.Tests/MxAccess/AlarmCommandHandlerTests.cs b/src/MxGateway.Worker.Tests/MxAccess/AlarmCommandHandlerTests.cs index 10e34a0..decd4b8 100644 --- a/src/MxGateway.Worker.Tests/MxAccess/AlarmCommandHandlerTests.cs +++ b/src/MxGateway.Worker.Tests/MxAccess/AlarmCommandHandlerTests.cs @@ -222,6 +222,18 @@ public sealed class AlarmCommandHandlerTests return AcknowledgeReturn; } + public int AcknowledgeByName( + string alarmName, string providerName, string groupName, + string ackComment, string ackOperatorName, string ackOperatorNode, + string ackOperatorDomain, string ackOperatorFullName) + { + LastAckByNameTuple = (alarmName, providerName, groupName); + LastAckOperatorName = ackOperatorName; + return AcknowledgeReturn; + } + + public (string Name, string Provider, string Group)? LastAckByNameTuple { get; private set; } + public IReadOnlyList SnapshotActiveAlarms() => SnapshotResult; public void Dispose() diff --git a/src/MxGateway.Worker.Tests/MxAccess/AlarmDispatcherTests.cs b/src/MxGateway.Worker.Tests/MxAccess/AlarmDispatcherTests.cs index 5816d64..6b3e03d 100644 --- a/src/MxGateway.Worker.Tests/MxAccess/AlarmDispatcherTests.cs +++ b/src/MxGateway.Worker.Tests/MxAccess/AlarmDispatcherTests.cs @@ -158,6 +158,32 @@ public sealed class AlarmDispatcherTests Assert.Equal("Alice Smith", consumer.LastAckOperatorFullName); } + [Fact] + public void AcknowledgeByName_forwards_to_consumer_with_full_tuple() + { + FakeAlarmConsumer consumer = new FakeAlarmConsumer { AcknowledgeReturn = 0 }; + using AlarmDispatcher dispatcher = new AlarmDispatcher( + consumer, + new MxAccessAlarmEventSink(new MxAccessEventQueue(), new MxAccessEventMapper()), + SessionId); + + int rc = dispatcher.AcknowledgeByName( + alarmName: "TestMachine_001.TestAlarm001", + providerName: "Galaxy", + groupName: "TestArea", + ackComment: "ack", + ackOperatorName: "alice", + ackOperatorNode: "WS", + ackOperatorDomain: "CORP", + ackOperatorFullName: "Alice Smith"); + + Assert.Equal(0, rc); + Assert.NotNull(consumer.LastAckByNameTuple); + Assert.Equal("TestMachine_001.TestAlarm001", consumer.LastAckByNameTuple!.Value.Name); + Assert.Equal("Galaxy", consumer.LastAckByNameTuple!.Value.Provider); + Assert.Equal("TestArea", consumer.LastAckByNameTuple!.Value.Group); + } + [Fact] public void SnapshotActiveAlarms_maps_records_to_protos() { @@ -275,6 +301,18 @@ public sealed class AlarmDispatcherTests return AcknowledgeReturn; } + public int AcknowledgeByName( + string alarmName, string providerName, string groupName, + string ackComment, string ackOperatorName, string ackOperatorNode, + string ackOperatorDomain, string ackOperatorFullName) + { + LastAckByNameTuple = (alarmName, providerName, groupName); + LastAckOperatorName = ackOperatorName; + return AcknowledgeReturn; + } + + public (string Name, string Provider, string Group)? LastAckByNameTuple { get; private set; } + public IReadOnlyList SnapshotActiveAlarms() { return SnapshotResult; diff --git a/src/MxGateway.Worker/MxAccess/AlarmCommandHandler.cs b/src/MxGateway.Worker/MxAccess/AlarmCommandHandler.cs index 1ac5744..7867de8 100644 --- a/src/MxGateway.Worker/MxAccess/AlarmCommandHandler.cs +++ b/src/MxGateway.Worker/MxAccess/AlarmCommandHandler.cs @@ -120,6 +120,29 @@ public sealed class AlarmCommandHandler : IAlarmCommandHandler operatorFullName ?? string.Empty); } + /// + public int AcknowledgeByName( + string alarmName, + string providerName, + string groupName, + string comment, + string operatorUser, + string operatorNode, + string operatorDomain, + string operatorFullName) + { + AlarmDispatcher? d = GetDispatcherOrThrow(); + return d.AcknowledgeByName( + alarmName ?? string.Empty, + providerName ?? string.Empty, + groupName ?? string.Empty, + comment ?? string.Empty, + operatorUser ?? string.Empty, + operatorNode ?? string.Empty, + operatorDomain ?? string.Empty, + operatorFullName ?? string.Empty); + } + /// public IReadOnlyList QueryActive(string? alarmFilterPrefix) { @@ -184,6 +207,20 @@ public interface IAlarmCommandHandler : IDisposable string operatorDomain, string operatorFullName); + /// + /// Acknowledge a single alarm by (name, provider, group) — used when + /// the caller has the human-readable reference but not the GUID. + /// + int AcknowledgeByName( + string alarmName, + string providerName, + string groupName, + string comment, + string operatorUser, + string operatorNode, + string operatorDomain, + string operatorFullName); + /// /// Snapshot the currently-active alarm set, optionally scoped to a /// prefix matched against AlarmFullReference. diff --git a/src/MxGateway.Worker/MxAccess/AlarmDispatcher.cs b/src/MxGateway.Worker/MxAccess/AlarmDispatcher.cs index 0614531..cc4e617 100644 --- a/src/MxGateway.Worker/MxAccess/AlarmDispatcher.cs +++ b/src/MxGateway.Worker/MxAccess/AlarmDispatcher.cs @@ -92,6 +92,33 @@ public sealed class AlarmDispatcher : IDisposable ackOperatorFullName); } + /// + /// Acknowledge an alarm by its (name, provider, group) tuple. + /// Routes to the consumer's AcknowledgeByName path which + /// maps to wwAlarmConsumerClass.AlarmAckByName. + /// + public int AcknowledgeByName( + string alarmName, + string providerName, + string groupName, + string ackComment, + string ackOperatorName, + string ackOperatorNode, + string ackOperatorDomain, + string ackOperatorFullName) + { + if (disposed) throw new ObjectDisposedException(nameof(AlarmDispatcher)); + return consumer.AcknowledgeByName( + alarmName, + providerName, + groupName, + ackComment, + ackOperatorName, + ackOperatorNode, + ackOperatorDomain, + ackOperatorFullName); + } + /// /// Snapshot the currently-active alarm set as /// protos for the diff --git a/src/MxGateway.Worker/MxAccess/IMxAccessAlarmConsumer.cs b/src/MxGateway.Worker/MxAccess/IMxAccessAlarmConsumer.cs index b7ae357..c2973bd 100644 --- a/src/MxGateway.Worker/MxAccess/IMxAccessAlarmConsumer.cs +++ b/src/MxGateway.Worker/MxAccess/IMxAccessAlarmConsumer.cs @@ -61,6 +61,23 @@ public interface IMxAccessAlarmConsumer : IDisposable string ackOperatorDomain, string ackOperatorFullName); + /// + /// Acknowledge a single alarm by its (name, provider, group) tuple. + /// Reaches AVEVA's AlarmAckByName on + /// wwAlarmConsumerClass; same alarm-history outcome as + /// , used when the caller has the + /// human-readable reference but not the canonical GUID. + /// + int AcknowledgeByName( + string alarmName, + string providerName, + string groupName, + string ackComment, + string ackOperatorName, + string ackOperatorNode, + string ackOperatorDomain, + string ackOperatorFullName); + /// /// Returns the consumer's most recently parsed snapshot of currently /// active alarms. Used by the gateway's QueryActiveAlarms (PR A.7) diff --git a/src/MxGateway.Worker/MxAccess/MxAccessCommandExecutor.cs b/src/MxGateway.Worker/MxAccess/MxAccessCommandExecutor.cs index bc37d7e..da49ffa 100644 --- a/src/MxGateway.Worker/MxAccess/MxAccessCommandExecutor.cs +++ b/src/MxGateway.Worker/MxAccess/MxAccessCommandExecutor.cs @@ -83,6 +83,7 @@ public sealed class MxAccessCommandExecutor : IStaCommandExecutor MxCommandKind.SubscribeAlarms => ExecuteSubscribeAlarms(command), MxCommandKind.UnsubscribeAlarms => ExecuteUnsubscribeAlarms(command), MxCommandKind.AcknowledgeAlarm => ExecuteAcknowledgeAlarm(command), + MxCommandKind.AcknowledgeAlarmByName => ExecuteAcknowledgeAlarmByName(command), MxCommandKind.QueryActiveAlarms => ExecuteQueryActiveAlarms(command), _ => CreateInvalidRequestReply(command, $"Unsupported MXAccess command kind {command.Kind}."), }; @@ -402,6 +403,54 @@ public sealed class MxAccessCommandExecutor : IStaCommandExecutor } } + private MxCommandReply ExecuteAcknowledgeAlarmByName(StaCommand command) + { + if (command.Command.PayloadCase != MxCommand.PayloadOneofCase.AcknowledgeAlarmByNameCommand) + { + return CreateInvalidRequestReply(command, "AcknowledgeAlarmByName command payload is required."); + } + if (alarmCommandHandler is null) + { + return CreateInvalidRequestReply( + command, + "AcknowledgeAlarmByName requires an alarm command handler; the worker was constructed without one."); + } + + AcknowledgeAlarmByNameCommand payload = command.Command.AcknowledgeAlarmByNameCommand; + if (string.IsNullOrWhiteSpace(payload.AlarmName)) + { + return CreateInvalidRequestReply(command, "AcknowledgeAlarmByName.alarm_name is required."); + } + + try + { + int rc = alarmCommandHandler.AcknowledgeByName( + payload.AlarmName, + payload.ProviderName, + payload.GroupName, + payload.Comment, + payload.OperatorUser, + payload.OperatorNode, + payload.OperatorDomain, + payload.OperatorFullName); + MxCommandReply reply = CreateOkReply(command); + reply.Hresult = rc; + reply.AcknowledgeAlarm = new AcknowledgeAlarmReplyPayload + { + NativeStatus = rc, + }; + if (rc != 0) + { + reply.DiagnosticMessage = $"AVEVA AlarmAckByName returned non-zero status {rc}."; + } + return reply; + } + catch (Exception ex) + { + return CreateAlarmFailureReply(command, ex); + } + } + private MxCommandReply ExecuteQueryActiveAlarms(StaCommand command) { if (command.Command.PayloadCase != MxCommand.PayloadOneofCase.QueryActiveAlarmsCommand) diff --git a/src/MxGateway.Worker/MxAccess/WnWrapAlarmConsumer.cs b/src/MxGateway.Worker/MxAccess/WnWrapAlarmConsumer.cs index 04421af..a99cf9a 100644 --- a/src/MxGateway.Worker/MxAccess/WnWrapAlarmConsumer.cs +++ b/src/MxGateway.Worker/MxAccess/WnWrapAlarmConsumer.cs @@ -172,6 +172,33 @@ public sealed class WnWrapAlarmConsumer : IMxAccessAlarmConsumer szOprFullName: ackOperatorFullName ?? string.Empty); } + /// + public int AcknowledgeByName( + string alarmName, + string providerName, + string groupName, + string ackComment, + string ackOperatorName, + string ackOperatorNode, + string ackOperatorDomain, + string ackOperatorFullName) + { + if (disposed) throw new ObjectDisposedException(nameof(WnWrapAlarmConsumer)); + + wwAlarmConsumerClass com = client + ?? throw new ObjectDisposedException(nameof(WnWrapAlarmConsumer)); + + return com.AlarmAckByName( + szAlarmName: alarmName ?? string.Empty, + szProviderName: providerName ?? string.Empty, + szGroupName: groupName ?? string.Empty, + szComment: ackComment ?? string.Empty, + szOprName: ackOperatorName ?? string.Empty, + szNode: ackOperatorNode ?? string.Empty, + szDomainName: ackOperatorDomain ?? string.Empty, + szOprFullName: ackOperatorFullName ?? string.Empty); + } + /// public IReadOnlyList SnapshotActiveAlarms() {