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()
{