From f15d0db0ad93b2e7cf76bc730060a472199a279c Mon Sep 17 00:00:00 2001 From: Joseph Doherty Date: Sat, 5 Sep 2026 23:52:50 -0400 Subject: [PATCH] feat(wire): route_to_call trace flag + child_execution_id + trace_events; route_to_set_attributes trace (additive proto + mapper) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Flow Debugger (design 2026-09-05 §5.2/§5.4): site_command.proto gains trace=7 on RouteToCallRequestDto, child_execution_id=6 + repeated sitestream.AuditEventDto trace_events=7 on RouteToCallResponseDto, trace=6 on RouteToSetAttributesRequestDto (imports Protos/sitestream.proto the way central_control.proto does). Mapper round-trips them; an empty trace_events list maps to null so an untraced/older site reads as 'not traced'. Vendored C# regenerated via docker/regen-proto.sh (csproj untouched); golden samples extended. Claude-Session: https://claude.ai/code/session_01GSLkkHKz9JrAtmJjmQK3cP --- .../Grpc/SiteCommandDtoMapper.cs | 32 +- .../Protos/site_command.proto | 14 + .../SiteCommandGrpc/SiteCommand.cs | 1101 ++++++++++------- .../SiteCommandDtoMapperTraceTests.cs | 95 ++ .../SiteCommandSamples.cs | 33 +- 5 files changed, 792 insertions(+), 483 deletions(-) create mode 100644 tests/ZB.MOM.WW.ScadaBridge.Communication.Tests/SiteCommandDtoMapperTraceTests.cs diff --git a/src/ZB.MOM.WW.ScadaBridge.Communication/Grpc/SiteCommandDtoMapper.cs b/src/ZB.MOM.WW.ScadaBridge.Communication/Grpc/SiteCommandDtoMapper.cs index 357fe918..e15492e2 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Communication/Grpc/SiteCommandDtoMapper.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Communication/Grpc/SiteCommandDtoMapper.cs @@ -2420,7 +2420,8 @@ public static class SiteCommandDtoMapper ScriptName = request.ScriptName, Parameters = LooseValueCodec.ToProtoMapOrNull(request.Parameters), Timestamp = Ts(request.Timestamp), - ParentExecutionId = GuidToWire(request.ParentExecutionId) + ParentExecutionId = GuidToWire(request.ParentExecutionId), + Trace = request.Trace }; } @@ -2437,7 +2438,8 @@ public static class SiteCommandDtoMapper dto.ScriptName, LooseValueCodec.FromProtoMapOrNull(dto.Parameters), Dto(dto.Timestamp), - GuidFromWire(dto.ParentExecutionId)); + GuidFromWire(dto.ParentExecutionId), + dto.Trace); } /// Projects a onto the wire. @@ -2485,7 +2487,8 @@ public static class SiteCommandDtoMapper CorrelationId = request.CorrelationId, InstanceUniqueName = request.InstanceUniqueName, Timestamp = Ts(request.Timestamp), - ParentExecutionId = GuidToWire(request.ParentExecutionId) + ParentExecutionId = GuidToWire(request.ParentExecutionId), + Trace = request.Trace }; foreach (var (key, value) in request.AttributeValues) @@ -2508,7 +2511,8 @@ public static class SiteCommandDtoMapper dto.InstanceUniqueName, dto.AttributeValues.ToDictionary(kv => kv.Key, kv => kv.Value), Dto(dto.Timestamp), - GuidFromWire(dto.ParentExecutionId)); + GuidFromWire(dto.ParentExecutionId), + dto.Trace); } /// Projects a onto the wire. @@ -2564,14 +2568,24 @@ public static class SiteCommandDtoMapper { ArgumentNullException.ThrowIfNull(response); - return new RouteToCallResponseDto + var dto = new RouteToCallResponseDto { CorrelationId = response.CorrelationId, Success = response.Success, ReturnValue = LooseValueCodec.ToProtoOrNull(response.ReturnValue), ErrorMessage = OrEmpty(response.ErrorMessage), - Timestamp = Ts(response.Timestamp) + Timestamp = Ts(response.Timestamp), + // Flow Debugger (design 2026-09-05 §5.4): additive fields 6/7. + ChildExecutionId = GuidToWire(response.ChildExecutionId) }; + if (response.TraceEvents is { Count: > 0 } traceEvents) + { + foreach (var evt in traceEvents) + { + dto.TraceEvents.Add(AuditEventDtoMapper.ToDto(evt)); + } + } + return dto; } /// Rehydrates a from the wire. @@ -2586,7 +2600,11 @@ public static class SiteCommandDtoMapper dto.Success, LooseValueCodec.FromProto(dto.ReturnValue), NullIfEmpty(dto.ErrorMessage), - Dto(dto.Timestamp)); + Dto(dto.Timestamp), + GuidFromWire(dto.ChildExecutionId), + // An untraced run — or an older site that never sets the field — sends no + // events, which maps to null so the UI can label the lane "site not traced". + dto.TraceEvents.Count == 0 ? null : dto.TraceEvents.Select(AuditEventDtoMapper.FromDto).ToList()); } /// Projects a onto the wire. diff --git a/src/ZB.MOM.WW.ScadaBridge.Communication/Protos/site_command.proto b/src/ZB.MOM.WW.ScadaBridge.Communication/Protos/site_command.proto index 813a09ad..a8a22d1d 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Communication/Protos/site_command.proto +++ b/src/ZB.MOM.WW.ScadaBridge.Communication/Protos/site_command.proto @@ -5,6 +5,9 @@ package scadabridge.sitecommand.v1; import "google/protobuf/timestamp.proto"; import "google/protobuf/duration.proto"; import "google/protobuf/wrappers.proto"; +// Flow Debugger (design 2026-09-05 §5.4): RouteToCallResponseDto carries the site's +// ScriptTrace rows inline as the AuditEventDto sitestream.proto already defines. +import "Protos/sitestream.proto"; // ───────────────────────────────────────────────────────────────────────────── // Site command plane (central → site) — the gRPC replacement for the per-site @@ -765,6 +768,9 @@ message RouteToCallRequestDto { LooseValueMap parameters = 4; // absent => null (distinct from empty) google.protobuf.Timestamp timestamp = 5; string parent_execution_id = 6; // empty string represents null + // Flow Debugger trace flag (design 2026-09-05 §5.2). proto3 default false = untraced, + // which is what an older central sends and what an older site reads. + bool trace = 7; } message RouteToCallResponseDto { @@ -773,6 +779,12 @@ message RouteToCallResponseDto { LooseValue return_value = 3; // absent => null string error_message = 4; // empty string represents null google.protobuf.Timestamp timestamp = 5; + // Flow Debugger (design §5.4): the routed site run's ExecutionId ("D" GUID form; + // empty represents null — an older site never sets it). + string child_execution_id = 6; + // Flow Debugger (design §5.4): the site's ScriptTrace audit events for a traced run, + // in emission order. Empty from an untraced run or an older site (mapper => null). + repeated sitestream.AuditEventDto trace_events = 7; } message RouteToGetAttributesRequestDto { @@ -797,6 +809,8 @@ message RouteToSetAttributesRequestDto { map attribute_values = 3; google.protobuf.Timestamp timestamp = 4; string parent_execution_id = 5; // empty string represents null + // Flow Debugger trace flag (design 2026-09-05 §5.2/§5.3): arms the echo stamp. + bool trace = 6; } message RouteToSetAttributesResponseDto { diff --git a/src/ZB.MOM.WW.ScadaBridge.Communication/SiteCommandGrpc/SiteCommand.cs b/src/ZB.MOM.WW.ScadaBridge.Communication/SiteCommandGrpc/SiteCommand.cs index fa79f645..86f49cfd 100644 --- a/src/ZB.MOM.WW.ScadaBridge.Communication/SiteCommandGrpc/SiteCommand.cs +++ b/src/ZB.MOM.WW.ScadaBridge.Communication/SiteCommandGrpc/SiteCommand.cs @@ -27,478 +27,481 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { "ChlQcm90b3Mvc2l0ZV9jb21tYW5kLnByb3RvEhpzY2FkYWJyaWRnZS5zaXRl", "Y29tbWFuZC52MRofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxoe", "Z29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvGh5nb29nbGUvcHJvdG9i", - "dWYvd3JhcHBlcnMucHJvdG8iCwoJTG9vc2VOdWxsIkcKDkxvb3NlVmFsdWVM", - "aXN0EjUKBWl0ZW1zGAEgAygLMiYuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQu", - "djEuTG9vc2VWYWx1ZSKwAQoNTG9vc2VWYWx1ZU1hcBJHCgdlbnRyaWVzGAEg", - "AygLMjYuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuTG9vc2VWYWx1ZU1h", - "cC5FbnRyaWVzRW50cnkaVgoMRW50cmllc0VudHJ5EgsKA2tleRgBIAEoCRI1", - "CgV2YWx1ZRgCIAEoCzImLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkxv", - "b3NlVmFsdWU6AjgBIpIECgpMb29zZVZhbHVlEjsKCm51bGxfdmFsdWUYASAB", - "KAsyJS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5Mb29zZU51bGxIABIU", - "Cgpib29sX3ZhbHVlGAIgASgISAASFQoLaW50MzJfdmFsdWUYAyABKAVIABIV", - "CgtpbnQ2NF92YWx1ZRgEIAEoA0gAEhYKDGRvdWJsZV92YWx1ZRgFIAEoAUgA", - "EhUKC2Zsb2F0X3ZhbHVlGAYgASgCSAASFgoMc3RyaW5nX3ZhbHVlGAcgASgJ", - "SAASFwoNZGVjaW1hbF92YWx1ZRgIIAEoCUgAEhkKD2RhdGVfdGltZV92YWx1", - "ZRgJIAEoCUgAEiAKFmRhdGVfdGltZV9vZmZzZXRfdmFsdWUYCiABKAlIABIU", - "CgpndWlkX3ZhbHVlGAsgASgJSAASGQoPdGltZV9zcGFuX3ZhbHVlGAwgASgJ", - "SAASFQoLYnl0ZXNfdmFsdWUYDSABKAxIABJACgpsaXN0X3ZhbHVlGA4gASgL", - "Miouc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuTG9vc2VWYWx1ZUxpc3RI", - "ABI+CgltYXBfdmFsdWUYDyABKAsyKS5zY2FkYWJyaWRnZS5zaXRlY29tbWFu", - "ZC52MS5Mb29zZVZhbHVlTWFwSAASFAoKanNvbl92YWx1ZRgQIAEoCUgAQgYK", - "BGtpbmQi4gEKG1JlZnJlc2hEZXBsb3ltZW50Q29tbWFuZER0bxIVCg1kZXBs", - "b3ltZW50X2lkGAEgASgJEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJ", - "EhUKDXJldmlzaW9uX2hhc2gYAyABKAkSEwoLZGVwbG95ZWRfYnkYBCABKAkS", - "LQoJdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFt", - "cBIeChZjZW50cmFsX2ZldGNoX2Jhc2VfdXJsGAYgASgJEhMKC2ZldGNoX3Rv", - "a2VuGAcgASgJInsKGEVuYWJsZUluc3RhbmNlQ29tbWFuZER0bxISCgpjb21t", - "YW5kX2lkGAEgASgJEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEi0K", - "CXRpbWVzdGFtcBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAi", - "fAoZRGlzYWJsZUluc3RhbmNlQ29tbWFuZER0bxISCgpjb21tYW5kX2lkGAEg", - "ASgJEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEi0KCXRpbWVzdGFt", - "cBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiewoYRGVsZXRl", - "SW5zdGFuY2VDb21tYW5kRHRvEhIKCmNvbW1hbmRfaWQYASABKAkSHAoUaW5z", - "dGFuY2VfdW5pcXVlX25hbWUYAiABKAkSLQoJdGltZXN0YW1wGAMgASgLMhou", - "Z29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKFAQoeRGVwbG95bWVudFN0YXRl", - "UXVlcnlSZXF1ZXN0RHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJEhwKFGlu", - "c3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEi0KCXRpbWVzdGFtcBgDIAEoCzIa", - "Lmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAibwoXU2hhcmVkU2NyaXB0QXJ0", - "aWZhY3REdG8SDAoEbmFtZRgBIAEoCRIMCgRjb2RlGAIgASgJEh0KFXBhcmFt", - "ZXRlcl9kZWZpbml0aW9ucxgDIAEoCRIZChFyZXR1cm5fZGVmaW5pdGlvbhgE", - "IAEoCSLtAQoZRXh0ZXJuYWxTeXN0ZW1BcnRpZmFjdER0bxIMCgRuYW1lGAEg", - "ASgJEhQKDGVuZHBvaW50X3VybBgCIAEoCRIRCglhdXRoX3R5cGUYAyABKAkS", - "GgoSYXV0aF9jb25maWd1cmF0aW9uGAQgASgJEh8KF21ldGhvZF9kZWZpbml0", - "aW9uc19qc29uGAUgASgJEhcKD3RpbWVvdXRfc2Vjb25kcxgGIAEoBRITCgtt", - "YXhfcmV0cmllcxgHIAEoBRIuCgtyZXRyeV9kZWxheRgIIAEoCzIZLmdvb2ds", - "ZS5wcm90b2J1Zi5EdXJhdGlvbiKNAQodRGF0YWJhc2VDb25uZWN0aW9uQXJ0", - "aWZhY3REdG8SDAoEbmFtZRgBIAEoCRIZChFjb25uZWN0aW9uX3N0cmluZxgC", - "IAEoCRITCgttYXhfcmV0cmllcxgDIAEoBRIuCgtyZXRyeV9kZWxheRgEIAEo", - "CzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiJFChtOb3RpZmljYXRpb25M", - "aXN0QXJ0aWZhY3REdG8SDAoEbmFtZRgBIAEoCRIYChByZWNpcGllbnRfZW1h", - "aWxzGAIgAygJIqABChlEYXRhQ29ubmVjdGlvbkFydGlmYWN0RHRvEgwKBG5h", - "bWUYASABKAkSEAoIcHJvdG9jb2wYAiABKAkSIgoacHJpbWFyeV9jb25maWd1", - "cmF0aW9uX2pzb24YAyABKAkSIQoZYmFja3VwX2NvbmZpZ3VyYXRpb25fanNv", - "bhgEIAEoCRIcChRmYWlsb3Zlcl9yZXRyeV9jb3VudBgFIAEoBSKtAQocU210", - "cENvbmZpZ3VyYXRpb25BcnRpZmFjdER0bxIMCgRuYW1lGAEgASgJEg4KBnNl", - "cnZlchgCIAEoCRIMCgRwb3J0GAMgASgFEhEKCWF1dGhfbW9kZRgEIAEoCRIU", - "Cgxmcm9tX2FkZHJlc3MYBSABKAkSEAoIdXNlcm5hbWUYBiABKAkSEAoIcGFz", - "c3dvcmQYByABKAkSFAoMb2F1dGhfY29uZmlnGAggASgJImEKG1NoYXJlZFNj", - "cmlwdEFydGlmYWN0TGlzdER0bxJCCgVpdGVtcxgBIAMoCzIzLnNjYWRhYnJp", - "ZGdlLnNpdGVjb21tYW5kLnYxLlNoYXJlZFNjcmlwdEFydGlmYWN0RHRvImUK", - "HUV4dGVybmFsU3lzdGVtQXJ0aWZhY3RMaXN0RHRvEkQKBWl0ZW1zGAEgAygL", - "MjUuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRXh0ZXJuYWxTeXN0ZW1B", - "cnRpZmFjdER0byJtCiFEYXRhYmFzZUNvbm5lY3Rpb25BcnRpZmFjdExpc3RE", - "dG8SSAoFaXRlbXMYASADKAsyOS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52", - "MS5EYXRhYmFzZUNvbm5lY3Rpb25BcnRpZmFjdER0byJpCh9Ob3RpZmljYXRp", - "b25MaXN0QXJ0aWZhY3RMaXN0RHRvEkYKBWl0ZW1zGAEgAygLMjcuc2NhZGFi", - "cmlkZ2Uuc2l0ZWNvbW1hbmQudjEuTm90aWZpY2F0aW9uTGlzdEFydGlmYWN0", - "RHRvImUKHURhdGFDb25uZWN0aW9uQXJ0aWZhY3RMaXN0RHRvEkQKBWl0ZW1z", - "GAEgAygLMjUuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGF0YUNvbm5l", - "Y3Rpb25BcnRpZmFjdER0byJrCiBTbXRwQ29uZmlndXJhdGlvbkFydGlmYWN0", - "TGlzdER0bxJHCgVpdGVtcxgBIAMoCzI4LnNjYWRhYnJpZGdlLnNpdGVjb21t", - "YW5kLnYxLlNtdHBDb25maWd1cmF0aW9uQXJ0aWZhY3REdG8i7QQKGURlcGxv", - "eUFydGlmYWN0c0NvbW1hbmREdG8SFQoNZGVwbG95bWVudF9pZBgBIAEoCRJP", - "Cg5zaGFyZWRfc2NyaXB0cxgCIAEoCzI3LnNjYWRhYnJpZGdlLnNpdGVjb21t", - "YW5kLnYxLlNoYXJlZFNjcmlwdEFydGlmYWN0TGlzdER0bxJTChBleHRlcm5h", - "bF9zeXN0ZW1zGAMgASgLMjkuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEu", - "RXh0ZXJuYWxTeXN0ZW1BcnRpZmFjdExpc3REdG8SWwoUZGF0YWJhc2VfY29u", - "bmVjdGlvbnMYBCABKAsyPS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5E", - "YXRhYmFzZUNvbm5lY3Rpb25BcnRpZmFjdExpc3REdG8SVwoSbm90aWZpY2F0", - "aW9uX2xpc3RzGAUgASgLMjsuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEu", - "Tm90aWZpY2F0aW9uTGlzdEFydGlmYWN0TGlzdER0bxJTChBkYXRhX2Nvbm5l", - "Y3Rpb25zGAYgASgLMjkuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGF0", - "YUNvbm5lY3Rpb25BcnRpZmFjdExpc3REdG8SWQoTc210cF9jb25maWd1cmF0", - "aW9ucxgHIAEoCzI8LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlNtdHBD", - "b25maWd1cmF0aW9uQXJ0aWZhY3RMaXN0RHRvEi0KCXRpbWVzdGFtcBgIIAEo", - "CzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAi2QEKG0RlcGxveW1lbnRT", - "dGF0dXNSZXNwb25zZUR0bxIVCg1kZXBsb3ltZW50X2lkGAEgASgJEhwKFGlu", - "c3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEj8KBnN0YXR1cxgDIAEoDjIvLnNj", - "YWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkRlcGxveW1lbnRTdGF0dXNEdG8S", - "FQoNZXJyb3JfbWVzc2FnZRgEIAEoCRItCgl0aW1lc3RhbXAYBSABKAsyGi5n", - "b29nbGUucHJvdG9idWYuVGltZXN0YW1wIqcBChxJbnN0YW5jZUxpZmVjeWNs", - "ZVJlc3BvbnNlRHRvEhIKCmNvbW1hbmRfaWQYASABKAkSHAoUaW5zdGFuY2Vf", - "dW5pcXVlX25hbWUYAiABKAkSDwoHc3VjY2VzcxgDIAEoCBIVCg1lcnJvcl9t", - "ZXNzYWdlGAQgASgJEi0KCXRpbWVzdGFtcBgFIAEoCzIaLmdvb2dsZS5wcm90", - "b2J1Zi5UaW1lc3RhbXAi2QEKH0RlcGxveW1lbnRTdGF0ZVF1ZXJ5UmVzcG9u", - "c2VEdG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSHAoUaW5zdGFuY2VfdW5p", - "cXVlX25hbWUYAiABKAkSEwoLaXNfZGVwbG95ZWQYAyABKAgSHQoVYXBwbGll", - "ZF9kZXBsb3ltZW50X2lkGAQgASgJEh0KFWFwcGxpZWRfcmV2aXNpb25faGFz", - "aBgFIAEoCRItCgl0aW1lc3RhbXAYBiABKAsyGi5nb29nbGUucHJvdG9idWYu", - "VGltZXN0YW1wIp4BCh1BcnRpZmFjdERlcGxveW1lbnRSZXNwb25zZUR0bxIV", - "Cg1kZXBsb3ltZW50X2lkGAEgASgJEg8KB3NpdGVfaWQYAiABKAkSDwoHc3Vj", - "Y2VzcxgDIAEoCBIVCg1lcnJvcl9tZXNzYWdlGAQgASgJEi0KCXRpbWVzdGFt", - "cBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAimgQKEExpZmVj", - "eWNsZVJlcXVlc3QSVQoScmVmcmVzaF9kZXBsb3ltZW50GAEgASgLMjcuc2Nh", - "ZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUmVmcmVzaERlcGxveW1lbnRDb21t", - "YW5kRHRvSAASTwoPZW5hYmxlX2luc3RhbmNlGAIgASgLMjQuc2NhZGFicmlk", - "Z2Uuc2l0ZWNvbW1hbmQudjEuRW5hYmxlSW5zdGFuY2VDb21tYW5kRHRvSAAS", - "UQoQZGlzYWJsZV9pbnN0YW5jZRgDIAEoCzI1LnNjYWRhYnJpZGdlLnNpdGVj", - "b21tYW5kLnYxLkRpc2FibGVJbnN0YW5jZUNvbW1hbmREdG9IABJPCg9kZWxl", - "dGVfaW5zdGFuY2UYBCABKAsyNC5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52", - "MS5EZWxldGVJbnN0YW5jZUNvbW1hbmREdG9IABJcChZkZXBsb3ltZW50X3N0", - "YXRlX3F1ZXJ5GAUgASgLMjouc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEu", - "RGVwbG95bWVudFN0YXRlUXVlcnlSZXF1ZXN0RHRvSAASUQoQZGVwbG95X2Fy", - "dGlmYWN0cxgGIAEoCzI1LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkRl", - "cGxveUFydGlmYWN0c0NvbW1hbmREdG9IAEIJCgdjb21tYW5kIoADCg5MaWZl", - "Y3ljbGVSZXBseRJUChFkZXBsb3ltZW50X3N0YXR1cxgBIAEoCzI3LnNjYWRh", - "YnJpZGdlLnNpdGVjb21tYW5kLnYxLkRlcGxveW1lbnRTdGF0dXNSZXNwb25z", - "ZUR0b0gAElYKEmluc3RhbmNlX2xpZmVjeWNsZRgCIAEoCzI4LnNjYWRhYnJp", - "ZGdlLnNpdGVjb21tYW5kLnYxLkluc3RhbmNlTGlmZWN5Y2xlUmVzcG9uc2VE", - "dG9IABJdChZkZXBsb3ltZW50X3N0YXRlX3F1ZXJ5GAMgASgLMjsuc2NhZGFi", - "cmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGVwbG95bWVudFN0YXRlUXVlcnlSZXNw", - "b25zZUR0b0gAElgKE2FydGlmYWN0X2RlcGxveW1lbnQYBCABKAsyOS5zY2Fk", - "YWJyaWRnZS5zaXRlY29tbWFuZC52MS5BcnRpZmFjdERlcGxveW1lbnRSZXNw", - "b25zZUR0b0gAQgcKBXJlcGx5InwKFEJyb3dzZU5vZGVDb21tYW5kRHRvEhcK", - "D2Nvbm5lY3Rpb25fbmFtZRgBIAEoCRIWCg5wYXJlbnRfbm9kZV9pZBgCIAEo", - "CRIaChJjb250aW51YXRpb25fdG9rZW4YAyABKAkSFwoPc2l0ZV9pZGVudGlm", - "aWVyGAQgASgJIoICCg1Ccm93c2VOb2RlRHRvEg8KB25vZGVfaWQYASABKAkS", - "FAoMZGlzcGxheV9uYW1lGAIgASgJEkIKCm5vZGVfY2xhc3MYAyABKA4yLi5z", - "Y2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5Ccm93c2VOb2RlQ2xhc3NEdG8S", - "FAoMaGFzX2NoaWxkcmVuGAQgASgIEhEKCWRhdGFfdHlwZRgFIAEoCRIvCgp2", - "YWx1ZV9yYW5rGAYgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUS", - "LAoId3JpdGFibGUYByABKAsyGi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVl", - "ImMKEEJyb3dzZUZhaWx1cmVEdG8SPgoEa2luZBgBIAEoDjIwLnNjYWRhYnJp", - "ZGdlLnNpdGVjb21tYW5kLnYxLkJyb3dzZUZhaWx1cmVLaW5kRHRvEg8KB21l", - "c3NhZ2UYAiABKAkiwAEKE0Jyb3dzZU5vZGVSZXN1bHREdG8SOwoIY2hpbGRy", - "ZW4YASADKAsyKS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5Ccm93c2VO", - "b2RlRHRvEhEKCXRydW5jYXRlZBgCIAEoCBI9CgdmYWlsdXJlGAMgASgLMiwu", - "c2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuQnJvd3NlRmFpbHVyZUR0bxIa", - "ChJjb250aW51YXRpb25fdG9rZW4YBCABKAkihwEKHFNlYXJjaEFkZHJlc3NT", - "cGFjZUNvbW1hbmREdG8SFwoPY29ubmVjdGlvbl9uYW1lGAEgASgJEg0KBXF1", - "ZXJ5GAIgASgJEhEKCW1heF9kZXB0aBgDIAEoBRITCgttYXhfcmVzdWx0cxgE", - "IAEoBRIXCg9zaXRlX2lkZW50aWZpZXIYBSABKAkiXQoUQWRkcmVzc1NwYWNl", - "TWF0Y2hEdG8SNwoEbm9kZRgBIAEoCzIpLnNjYWRhYnJpZGdlLnNpdGVjb21t", - "YW5kLnYxLkJyb3dzZU5vZGVEdG8SDAoEcGF0aBgCIAEoCSK0AQobU2VhcmNo", - "QWRkcmVzc1NwYWNlUmVzdWx0RHRvEkEKB21hdGNoZXMYASADKAsyMC5zY2Fk", - "YWJyaWRnZS5zaXRlY29tbWFuZC52MS5BZGRyZXNzU3BhY2VNYXRjaER0bxIT", - "CgtjYXBfcmVhY2hlZBgCIAEoCBI9CgdmYWlsdXJlGAMgASgLMiwuc2NhZGFi", - "cmlkZ2Uuc2l0ZWNvbW1hbmQudjEuQnJvd3NlRmFpbHVyZUR0byJFChdSZWFk", - "VGFnVmFsdWVzQ29tbWFuZER0bxIXCg9jb25uZWN0aW9uX25hbWUYASABKAkS", - "EQoJdGFnX3BhdGhzGAIgAygJIsQBChFUYWdSZWFkT3V0Y29tZUR0bxIQCgh0", - "YWdfcGF0aBgBIAEoCRIPCgdzdWNjZXNzGAIgASgIEjUKBXZhbHVlGAMgASgL", - "MiYuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuTG9vc2VWYWx1ZRIPCgdx", - "dWFsaXR5GAQgASgJEi0KCXRpbWVzdGFtcBgFIAEoCzIaLmdvb2dsZS5wcm90", - "b2J1Zi5UaW1lc3RhbXASFQoNZXJyb3JfbWVzc2FnZRgGIAEoCSJxChdSZWFk", - "VGFnVmFsdWVzRmFpbHVyZUR0bxJFCgRraW5kGAEgASgOMjcuc2NhZGFicmlk", - "Z2Uuc2l0ZWNvbW1hbmQudjEuUmVhZFRhZ1ZhbHVlc0ZhaWx1cmVLaW5kRHRv", - "Eg8KB21lc3NhZ2UYAiABKAkinwEKFlJlYWRUYWdWYWx1ZXNSZXN1bHREdG8S", - "PwoIb3V0Y29tZXMYASADKAsyLS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52", - "MS5UYWdSZWFkT3V0Y29tZUR0bxJECgdmYWlsdXJlGAIgASgLMjMuc2NhZGFi", - "cmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUmVhZFRhZ1ZhbHVlc0ZhaWx1cmVEdG8i", - "cwoYVmVyaWZ5RW5kcG9pbnRDb21tYW5kRHRvEhcKD2Nvbm5lY3Rpb25fbmFt", - "ZRgBIAEoCRIQCghwcm90b2NvbBgCIAEoCRITCgtjb25maWdfanNvbhgDIAEo", - "CRIXCg9zaXRlX2lkZW50aWZpZXIYBCABKAkiwwEKEVNlcnZlckNlcnRJbmZv", - "RHRvEhIKCnRodW1icHJpbnQYASABKAkSDwoHc3ViamVjdBgCIAEoCRIOCgZp", - "c3N1ZXIYAyABKAkSMgoObm90X2JlZm9yZV91dGMYBCABKAsyGi5nb29nbGUu", - "cHJvdG9idWYuVGltZXN0YW1wEjEKDW5vdF9hZnRlcl91dGMYBSABKAsyGi5n", - "b29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCmRlcl9iYXNlNjQYBiABKAki", - "WQoWVmVyaWZ5RmFpbHVyZUtpbmRWYWx1ZRI/CgV2YWx1ZRgBIAEoDjIwLnNj", - "YWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlZlcmlmeUZhaWx1cmVLaW5kRHRv", - "IsABChdWZXJpZnlFbmRwb2ludFJlc3VsdER0bxIPCgdzdWNjZXNzGAEgASgI", - "EkgKDGZhaWx1cmVfa2luZBgCIAEoCzIyLnNjYWRhYnJpZGdlLnNpdGVjb21t", - "YW5kLnYxLlZlcmlmeUZhaWx1cmVLaW5kVmFsdWUSDQoFZXJyb3IYAyABKAkS", - "OwoEY2VydBgEIAEoCzItLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlNl", - "cnZlckNlcnRJbmZvRHRvInUKGVRydXN0U2VydmVyQ2VydENvbW1hbmREdG8S", - "FwoPY29ubmVjdGlvbl9uYW1lGAEgASgJEhIKCmRlcl9iYXNlNjQYAiABKAkS", - "EgoKdGh1bWJwcmludBgDIAEoCRIXCg9zaXRlX2lkZW50aWZpZXIYBCABKAki", - "NAoZTGlzdFNlcnZlckNlcnRzQ29tbWFuZER0bxIXCg9zaXRlX2lkZW50aWZp", - "ZXIYASABKAkiSQoaUmVtb3ZlU2VydmVyQ2VydENvbW1hbmREdG8SEgoKdGh1", - "bWJwcmludBgBIAEoCRIXCg9zaXRlX2lkZW50aWZpZXIYAiABKAkiwgEKElRy", - "dXN0ZWRDZXJ0SW5mb0R0bxISCgp0aHVtYnByaW50GAEgASgJEg8KB3N1Ympl", - "Y3QYAiABKAkSDgoGaXNzdWVyGAMgASgJEjIKDm5vdF9iZWZvcmVfdXRjGAQg", - "ASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIxCg1ub3RfYWZ0ZXJf", - "dXRjGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIQCghyZWpl", - "Y3RlZBgGIAEoCCJXChZUcnVzdGVkQ2VydEluZm9MaXN0RHRvEj0KBWl0ZW1z", - "GAEgAygLMi4uc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuVHJ1c3RlZENl", - "cnRJbmZvRHRvIncKEkNlcnRUcnVzdFJlc3VsdER0bxIPCgdzdWNjZXNzGAEg", - "ASgIEg0KBWVycm9yGAIgASgJEkEKBWNlcnRzGAMgASgLMjIuc2NhZGFicmlk", - "Z2Uuc2l0ZWNvbW1hbmQudjEuVHJ1c3RlZENlcnRJbmZvTGlzdER0byK9AQoS", - "V3JpdGVUYWdSZXF1ZXN0RHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJEhcK", - "D2Nvbm5lY3Rpb25fbmFtZRgCIAEoCRIQCgh0YWdfcGF0aBgDIAEoCRI1CgV2", - "YWx1ZRgEIAEoCzImLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkxvb3Nl", - "VmFsdWUSLQoJdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRp", - "bWVzdGFtcCKEAQoTV3JpdGVUYWdSZXNwb25zZUR0bxIWCg5jb3JyZWxhdGlv", - "bl9pZBgBIAEoCRIPCgdzdWNjZXNzGAIgASgIEhUKDWVycm9yX21lc3NhZ2UY", - "AyABKAkSLQoJdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRp", - "bWVzdGFtcCKgBQoMT3BjVWFSZXF1ZXN0EkcKC2Jyb3dzZV9ub2RlGAEgASgL", - "MjAuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuQnJvd3NlTm9kZUNvbW1h", - "bmREdG9IABJYChRzZWFyY2hfYWRkcmVzc19zcGFjZRgCIAEoCzI4LnNjYWRh", - "YnJpZGdlLnNpdGVjb21tYW5kLnYxLlNlYXJjaEFkZHJlc3NTcGFjZUNvbW1h", - "bmREdG9IABJOCg9yZWFkX3RhZ192YWx1ZXMYAyABKAsyMy5zY2FkYWJyaWRn", - "ZS5zaXRlY29tbWFuZC52MS5SZWFkVGFnVmFsdWVzQ29tbWFuZER0b0gAEk8K", - "D3ZlcmlmeV9lbmRwb2ludBgEIAEoCzI0LnNjYWRhYnJpZGdlLnNpdGVjb21t", - "YW5kLnYxLlZlcmlmeUVuZHBvaW50Q29tbWFuZER0b0gAElIKEXRydXN0X3Nl", - "cnZlcl9jZXJ0GAUgASgLMjUuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEu", - "VHJ1c3RTZXJ2ZXJDZXJ0Q29tbWFuZER0b0gAElIKEWxpc3Rfc2VydmVyX2Nl", - "cnRzGAYgASgLMjUuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuTGlzdFNl", - "cnZlckNlcnRzQ29tbWFuZER0b0gAElQKEnJlbW92ZV9zZXJ2ZXJfY2VydBgH", - "IAEoCzI2LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlJlbW92ZVNlcnZl", - "ckNlcnRDb21tYW5kRHRvSAASQwoJd3JpdGVfdGFnGAggASgLMi4uc2NhZGFi", - "cmlkZ2Uuc2l0ZWNvbW1hbmQudjEuV3JpdGVUYWdSZXF1ZXN0RHRvSABCCQoH", - "Y29tbWFuZCLhAwoKT3BjVWFSZXBseRJGCgticm93c2Vfbm9kZRgBIAEoCzIv", - "LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkJyb3dzZU5vZGVSZXN1bHRE", - "dG9IABJXChRzZWFyY2hfYWRkcmVzc19zcGFjZRgCIAEoCzI3LnNjYWRhYnJp", - "ZGdlLnNpdGVjb21tYW5kLnYxLlNlYXJjaEFkZHJlc3NTcGFjZVJlc3VsdER0", - "b0gAEk0KD3JlYWRfdGFnX3ZhbHVlcxgDIAEoCzIyLnNjYWRhYnJpZGdlLnNp", - "dGVjb21tYW5kLnYxLlJlYWRUYWdWYWx1ZXNSZXN1bHREdG9IABJOCg92ZXJp", - "ZnlfZW5kcG9pbnQYBCABKAsyMy5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52", - "MS5WZXJpZnlFbmRwb2ludFJlc3VsdER0b0gAEkQKCmNlcnRfdHJ1c3QYBSAB", - "KAsyLi5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5DZXJ0VHJ1c3RSZXN1", - "bHREdG9IABJECgl3cml0ZV90YWcYBiABKAsyLy5zY2FkYWJyaWRnZS5zaXRl", - "Y29tbWFuZC52MS5Xcml0ZVRhZ1Jlc3BvbnNlRHRvSABCBwoFcmVwbHkixQIK", - "F0V2ZW50TG9nUXVlcnlSZXF1ZXN0RHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEg", - "ASgJEg8KB3NpdGVfaWQYAiABKAkSKAoEZnJvbRgDIAEoCzIaLmdvb2dsZS5w", - "cm90b2J1Zi5UaW1lc3RhbXASJgoCdG8YBCABKAsyGi5nb29nbGUucHJvdG9i", - "dWYuVGltZXN0YW1wEhIKCmV2ZW50X3R5cGUYBSABKAkSEAoIc2V2ZXJpdHkY", - "BiABKAkSEwoLaW5zdGFuY2VfaWQYByABKAkSFgoOa2V5d29yZF9maWx0ZXIY", - "CCABKAkSGgoSY29udGludWF0aW9uX3Rva2VuGAkgASgJEhEKCXBhZ2Vfc2l6", - "ZRgKIAEoBRItCgl0aW1lc3RhbXAYCyABKAsyGi5nb29nbGUucHJvdG9idWYu", - "VGltZXN0YW1wIroBChBFdmVudExvZ0VudHJ5RHRvEgoKAmlkGAEgASgJEi0K", - "CXRpbWVzdGFtcBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAS", - "EgoKZXZlbnRfdHlwZRgDIAEoCRIQCghzZXZlcml0eRgEIAEoCRITCgtpbnN0", - "YW5jZV9pZBgFIAEoCRIOCgZzb3VyY2UYBiABKAkSDwoHbWVzc2FnZRgHIAEo", - "CRIPCgdkZXRhaWxzGAggASgJIocCChhFdmVudExvZ1F1ZXJ5UmVzcG9uc2VE", - "dG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSDwoHc2l0ZV9pZBgCIAEoCRI9", - "CgdlbnRyaWVzGAMgAygLMiwuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEu", - "RXZlbnRMb2dFbnRyeUR0bxIaChJjb250aW51YXRpb25fdG9rZW4YBCABKAkS", - "EAoIaGFzX21vcmUYBSABKAgSDwoHc3VjY2VzcxgGIAEoCBIVCg1lcnJvcl9t", - "ZXNzYWdlGAcgASgJEi0KCXRpbWVzdGFtcBgIIAEoCzIaLmdvb2dsZS5wcm90", - "b2J1Zi5UaW1lc3RhbXAiZAoXRGVidWdTbmFwc2hvdFJlcXVlc3REdG8SHAoU", - "aW5zdGFuY2VfdW5pcXVlX25hbWUYASABKAkSFgoOY29ycmVsYXRpb25faWQY", - "AiABKAkSEwoLYWxhcm1zX29ubHkYAyABKAgiVAocU3Vic2NyaWJlRGVidWdW", - "aWV3UmVxdWVzdER0bxIcChRpbnN0YW5jZV91bmlxdWVfbmFtZRgBIAEoCRIW", - "Cg5jb3JyZWxhdGlvbl9pZBgCIAEoCSJWCh5VbnN1YnNjcmliZURlYnVnVmll", - "d1JlcXVlc3REdG8SHAoUaW5zdGFuY2VfdW5pcXVlX25hbWUYASABKAkSFgoO", - "Y29ycmVsYXRpb25faWQYAiABKAkiHAoaVW5zdWJzY3JpYmVEZWJ1Z1ZpZXdB", - "Y2tEdG8i1AEKFkFsYXJtQ29uZGl0aW9uU3RhdGVEdG8SDgoGYWN0aXZlGAEg", - "ASgIEhQKDGFja25vd2xlZGdlZBgCIAEoCBItCgljb25maXJtZWQYAyABKAsy", - "Gi5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlEj8KBnNoZWx2ZRgEIAEoDjIv", - "LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkFsYXJtU2hlbHZlU3RhdGVE", - "dG8SEgoKc3VwcHJlc3NlZBgFIAEoCBIQCghzZXZlcml0eRgGIAEoBSLdAQoW", - "RGVidWdBdHRyaWJ1dGVWYWx1ZUR0bxIcChRpbnN0YW5jZV91bmlxdWVfbmFt", - "ZRgBIAEoCRIWCg5hdHRyaWJ1dGVfcGF0aBgCIAEoCRIWCg5hdHRyaWJ1dGVf", - "bmFtZRgDIAEoCRI1CgV2YWx1ZRgEIAEoCzImLnNjYWRhYnJpZGdlLnNpdGVj", - "b21tYW5kLnYxLkxvb3NlVmFsdWUSDwoHcXVhbGl0eRgFIAEoCRItCgl0aW1l", - "c3RhbXAYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIq8FChJE", - "ZWJ1Z0FsYXJtU3RhdGVEdG8SHAoUaW5zdGFuY2VfdW5pcXVlX25hbWUYASAB", - "KAkSEgoKYWxhcm1fbmFtZRgCIAEoCRI4CgVzdGF0ZRgDIAEoDjIpLnNjYWRh", - "YnJpZGdlLnNpdGVjb21tYW5kLnYxLkFsYXJtU3RhdGVEdG8SEAoIcHJpb3Jp", - "dHkYBCABKAUSLQoJdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVm", - "LlRpbWVzdGFtcBI4CgVsZXZlbBgGIAEoDjIpLnNjYWRhYnJpZGdlLnNpdGVj", - "b21tYW5kLnYxLkFsYXJtTGV2ZWxEdG8SDwoHbWVzc2FnZRgHIAEoCRI2CgRr", - "aW5kGAggASgOMiguc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuQWxhcm1L", - "aW5kRHRvEkUKCWNvbmRpdGlvbhgJIAEoCzIyLnNjYWRhYnJpZGdlLnNpdGVj", - "b21tYW5kLnYxLkFsYXJtQ29uZGl0aW9uU3RhdGVEdG8SGAoQc291cmNlX3Jl", - "ZmVyZW5jZRgKIAEoCRIXCg9hbGFybV90eXBlX25hbWUYCyABKAkSEAoIY2F0", - "ZWdvcnkYDCABKAkSFQoNb3BlcmF0b3JfdXNlchgNIAEoCRIYChBvcGVyYXRv", - "cl9jb21tZW50GA4gASgJEjcKE29yaWdpbmFsX3JhaXNlX3RpbWUYDyABKAsy", - "Gi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDWN1cnJlbnRfdmFsdWUY", - "ECABKAkSEwoLbGltaXRfdmFsdWUYESABKAkSJAocbmF0aXZlX3NvdXJjZV9j", - "YW5vbmljYWxfbmFtZRgSIAEoCRIhChlpc19jb25maWd1cmVkX3BsYWNlaG9s", - "ZGVyGBMgASgIIpwCChREZWJ1Z1ZpZXdTbmFwc2hvdER0bxIcChRpbnN0YW5j", - "ZV91bmlxdWVfbmFtZRgBIAEoCRJMChBhdHRyaWJ1dGVfdmFsdWVzGAIgAygL", - "MjIuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGVidWdBdHRyaWJ1dGVW", - "YWx1ZUR0bxJECgxhbGFybV9zdGF0ZXMYAyADKAsyLi5zY2FkYWJyaWRnZS5z", - "aXRlY29tbWFuZC52MS5EZWJ1Z0FsYXJtU3RhdGVEdG8SNgoSc25hcHNob3Rf", - "dGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIa", - "ChJpbnN0YW5jZV9ub3RfZm91bmQYBSABKAgi8AIKDFF1ZXJ5UmVxdWVzdBJO", - "Cg9ldmVudF9sb2dfcXVlcnkYASABKAsyMy5zY2FkYWJyaWRnZS5zaXRlY29t", - "bWFuZC52MS5FdmVudExvZ1F1ZXJ5UmVxdWVzdER0b0gAEk0KDmRlYnVnX3Nu", - "YXBzaG90GAIgASgLMjMuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGVi", - "dWdTbmFwc2hvdFJlcXVlc3REdG9IABJYChRzdWJzY3JpYmVfZGVidWdfdmll", - "dxgDIAEoCzI4LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlN1YnNjcmli", - "ZURlYnVnVmlld1JlcXVlc3REdG9IABJcChZ1bnN1YnNjcmliZV9kZWJ1Z192", - "aWV3GAQgASgLMjouc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuVW5zdWJz", - "Y3JpYmVEZWJ1Z1ZpZXdSZXF1ZXN0RHRvSABCCQoHY29tbWFuZCKRAgoKUXVl", - "cnlSZXBseRJPCg9ldmVudF9sb2dfcXVlcnkYASABKAsyNC5zY2FkYWJyaWRn", - "ZS5zaXRlY29tbWFuZC52MS5FdmVudExvZ1F1ZXJ5UmVzcG9uc2VEdG9IABJP", - "ChNkZWJ1Z192aWV3X3NuYXBzaG90GAIgASgLMjAuc2NhZGFicmlkZ2Uuc2l0", - "ZWNvbW1hbmQudjEuRGVidWdWaWV3U25hcHNob3REdG9IABJYChZ1bnN1YnNj", - "cmliZV9kZWJ1Z192aWV3GAMgASgLMjYuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1h", - "bmQudjEuVW5zdWJzY3JpYmVEZWJ1Z1ZpZXdBY2tEdG9IAEIHCgVyZXBseSKe", - "AQocUGFya2VkTWVzc2FnZVF1ZXJ5UmVxdWVzdER0bxIWCg5jb3JyZWxhdGlv", - "bl9pZBgBIAEoCRIPCgdzaXRlX2lkGAIgASgJEhMKC3BhZ2VfbnVtYmVyGAMg", - "ASgFEhEKCXBhZ2Vfc2l6ZRgEIAEoBRItCgl0aW1lc3RhbXAYBSABKAsyGi5n", - "b29nbGUucHJvdG9idWYuVGltZXN0YW1wIvICChVQYXJrZWRNZXNzYWdlRW50", - "cnlEdG8SEgoKbWVzc2FnZV9pZBgBIAEoCRIVCg10YXJnZXRfc3lzdGVtGAIg", - "ASgJEhMKC21ldGhvZF9uYW1lGAMgASgJEhUKDWVycm9yX21lc3NhZ2UYBCAB", - "KAkSFQoNYXR0ZW1wdF9jb3VudBgFIAEoBRI2ChJvcmlnaW5hbF90aW1lc3Rh", - "bXAYBiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjoKFmxhc3Rf", - "YXR0ZW1wdF90aW1lc3RhbXAYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGlt", - "ZXN0YW1wEhQKDG1heF9hdHRlbXB0cxgIIAEoBRJICghjYXRlZ29yeRgJIAEo", - "DjI2LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlN0b3JlQW5kRm9yd2Fy", - "ZENhdGVnb3J5RHRvEhcKD29yaWdpbl9pbnN0YW5jZRgKIAEoCSKhAgodUGFy", - "a2VkTWVzc2FnZVF1ZXJ5UmVzcG9uc2VEdG8SFgoOY29ycmVsYXRpb25faWQY", - "ASABKAkSDwoHc2l0ZV9pZBgCIAEoCRJDCghtZXNzYWdlcxgDIAMoCzIxLnNj", - "YWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlBhcmtlZE1lc3NhZ2VFbnRyeUR0", - "bxITCgt0b3RhbF9jb3VudBgEIAEoBRITCgtwYWdlX251bWJlchgFIAEoBRIR", - "CglwYWdlX3NpemUYBiABKAUSDwoHc3VjY2VzcxgHIAEoCBIVCg1lcnJvcl9t", - "ZXNzYWdlGAggASgJEi0KCXRpbWVzdGFtcBgJIAEoCzIaLmdvb2dsZS5wcm90", - "b2J1Zi5UaW1lc3RhbXAiigEKHFBhcmtlZE1lc3NhZ2VSZXRyeVJlcXVlc3RE", - "dG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSDwoHc2l0ZV9pZBgCIAEoCRIS", - "CgptZXNzYWdlX2lkGAMgASgJEi0KCXRpbWVzdGFtcBgEIAEoCzIaLmdvb2ds", - "ZS5wcm90b2J1Zi5UaW1lc3RhbXAiXwodUGFya2VkTWVzc2FnZVJldHJ5UmVz", - "cG9uc2VEdG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSDwoHc3VjY2VzcxgC", - "IAEoCBIVCg1lcnJvcl9tZXNzYWdlGAMgASgJIowBCh5QYXJrZWRNZXNzYWdl", - "RGlzY2FyZFJlcXVlc3REdG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSDwoH", - "c2l0ZV9pZBgCIAEoCRISCgptZXNzYWdlX2lkGAMgASgJEi0KCXRpbWVzdGFt", - "cBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiYQofUGFya2Vk", - "TWVzc2FnZURpc2NhcmRSZXNwb25zZUR0bxIWCg5jb3JyZWxhdGlvbl9pZBgB", - "IAEoCRIPCgdzdWNjZXNzGAIgASgIEhUKDWVycm9yX21lc3NhZ2UYAyABKAki", - "TwoXUmV0cnlQYXJrZWRPcGVyYXRpb25EdG8SFgoOY29ycmVsYXRpb25faWQY", - "ASABKAkSHAoUdHJhY2tlZF9vcGVyYXRpb25faWQYAiABKAkiUQoZRGlzY2Fy", - "ZFBhcmtlZE9wZXJhdGlvbkR0bxIWCg5jb3JyZWxhdGlvbl9pZBgBIAEoCRIc", - "ChR0cmFja2VkX29wZXJhdGlvbl9pZBgCIAEoCSJdChtQYXJrZWRPcGVyYXRp", - "b25BY3Rpb25BY2tEdG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSDwoHYXBw", - "bGllZBgCIAEoCBIVCg1lcnJvcl9tZXNzYWdlGAMgASgJIt4DCg1QYXJrZWRS", - "ZXF1ZXN0ElgKFHBhcmtlZF9tZXNzYWdlX3F1ZXJ5GAEgASgLMjguc2NhZGFi", - "cmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUGFya2VkTWVzc2FnZVF1ZXJ5UmVxdWVz", - "dER0b0gAElgKFHBhcmtlZF9tZXNzYWdlX3JldHJ5GAIgASgLMjguc2NhZGFi", - "cmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUGFya2VkTWVzc2FnZVJldHJ5UmVxdWVz", - "dER0b0gAElwKFnBhcmtlZF9tZXNzYWdlX2Rpc2NhcmQYAyABKAsyOi5zY2Fk", - "YWJyaWRnZS5zaXRlY29tbWFuZC52MS5QYXJrZWRNZXNzYWdlRGlzY2FyZFJl", - "cXVlc3REdG9IABJVChZyZXRyeV9wYXJrZWRfb3BlcmF0aW9uGAQgASgLMjMu", - "c2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUmV0cnlQYXJrZWRPcGVyYXRp", - "b25EdG9IABJZChhkaXNjYXJkX3BhcmtlZF9vcGVyYXRpb24YBSABKAsyNS5z", - "Y2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5EaXNjYXJkUGFya2VkT3BlcmF0", - "aW9uRHRvSABCCQoHY29tbWFuZCKHAwoLUGFya2VkUmVwbHkSWQoUcGFya2Vk", - "X21lc3NhZ2VfcXVlcnkYASABKAsyOS5zY2FkYWJyaWRnZS5zaXRlY29tbWFu", - "ZC52MS5QYXJrZWRNZXNzYWdlUXVlcnlSZXNwb25zZUR0b0gAElkKFHBhcmtl", - "ZF9tZXNzYWdlX3JldHJ5GAIgASgLMjkuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1h", - "bmQudjEuUGFya2VkTWVzc2FnZVJldHJ5UmVzcG9uc2VEdG9IABJdChZwYXJr", - "ZWRfbWVzc2FnZV9kaXNjYXJkGAMgASgLMjsuc2NhZGFicmlkZ2Uuc2l0ZWNv", - "bW1hbmQudjEuUGFya2VkTWVzc2FnZURpc2NhcmRSZXNwb25zZUR0b0gAEloK", - "F3BhcmtlZF9vcGVyYXRpb25fYWN0aW9uGAQgASgLMjcuc2NhZGFicmlkZ2Uu", - "c2l0ZWNvbW1hbmQudjEuUGFya2VkT3BlcmF0aW9uQWN0aW9uQWNrRHRvSABC", - "BwoFcmVwbHki7QEKFVJvdXRlVG9DYWxsUmVxdWVzdER0bxIWCg5jb3JyZWxh", - "dGlvbl9pZBgBIAEoCRIcChRpbnN0YW5jZV91bmlxdWVfbmFtZRgCIAEoCRIT", - "CgtzY3JpcHRfbmFtZRgDIAEoCRI9CgpwYXJhbWV0ZXJzGAQgASgLMikuc2Nh", - "ZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuTG9vc2VWYWx1ZU1hcBItCgl0aW1l", - "c3RhbXAYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhsKE3Bh", - "cmVudF9leGVjdXRpb25faWQYBiABKAkixQEKFlJvdXRlVG9DYWxsUmVzcG9u", + "dWYvd3JhcHBlcnMucHJvdG8aF1Byb3Rvcy9zaXRlc3RyZWFtLnByb3RvIgsK", + "CUxvb3NlTnVsbCJHCg5Mb29zZVZhbHVlTGlzdBI1CgVpdGVtcxgBIAMoCzIm", + "LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkxvb3NlVmFsdWUisAEKDUxv", + "b3NlVmFsdWVNYXASRwoHZW50cmllcxgBIAMoCzI2LnNjYWRhYnJpZGdlLnNp", + "dGVjb21tYW5kLnYxLkxvb3NlVmFsdWVNYXAuRW50cmllc0VudHJ5GlYKDEVu", + "dHJpZXNFbnRyeRILCgNrZXkYASABKAkSNQoFdmFsdWUYAiABKAsyJi5zY2Fk", + "YWJyaWRnZS5zaXRlY29tbWFuZC52MS5Mb29zZVZhbHVlOgI4ASKSBAoKTG9v", + "c2VWYWx1ZRI7CgpudWxsX3ZhbHVlGAEgASgLMiUuc2NhZGFicmlkZ2Uuc2l0", + "ZWNvbW1hbmQudjEuTG9vc2VOdWxsSAASFAoKYm9vbF92YWx1ZRgCIAEoCEgA", + "EhUKC2ludDMyX3ZhbHVlGAMgASgFSAASFQoLaW50NjRfdmFsdWUYBCABKANI", + "ABIWCgxkb3VibGVfdmFsdWUYBSABKAFIABIVCgtmbG9hdF92YWx1ZRgGIAEo", + "AkgAEhYKDHN0cmluZ192YWx1ZRgHIAEoCUgAEhcKDWRlY2ltYWxfdmFsdWUY", + "CCABKAlIABIZCg9kYXRlX3RpbWVfdmFsdWUYCSABKAlIABIgChZkYXRlX3Rp", + "bWVfb2Zmc2V0X3ZhbHVlGAogASgJSAASFAoKZ3VpZF92YWx1ZRgLIAEoCUgA", + "EhkKD3RpbWVfc3Bhbl92YWx1ZRgMIAEoCUgAEhUKC2J5dGVzX3ZhbHVlGA0g", + "ASgMSAASQAoKbGlzdF92YWx1ZRgOIAEoCzIqLnNjYWRhYnJpZGdlLnNpdGVj", + "b21tYW5kLnYxLkxvb3NlVmFsdWVMaXN0SAASPgoJbWFwX3ZhbHVlGA8gASgL", + "Mikuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuTG9vc2VWYWx1ZU1hcEgA", + "EhQKCmpzb25fdmFsdWUYECABKAlIAEIGCgRraW5kIuIBChtSZWZyZXNoRGVw", + "bG95bWVudENvbW1hbmREdG8SFQoNZGVwbG95bWVudF9pZBgBIAEoCRIcChRp", + "bnN0YW5jZV91bmlxdWVfbmFtZRgCIAEoCRIVCg1yZXZpc2lvbl9oYXNoGAMg", + "ASgJEhMKC2RlcGxveWVkX2J5GAQgASgJEi0KCXRpbWVzdGFtcBgFIAEoCzIa", + "Lmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASHgoWY2VudHJhbF9mZXRjaF9i", + "YXNlX3VybBgGIAEoCRITCgtmZXRjaF90b2tlbhgHIAEoCSJ7ChhFbmFibGVJ", + "bnN0YW5jZUNvbW1hbmREdG8SEgoKY29tbWFuZF9pZBgBIAEoCRIcChRpbnN0", + "YW5jZV91bmlxdWVfbmFtZRgCIAEoCRItCgl0aW1lc3RhbXAYAyABKAsyGi5n", + "b29nbGUucHJvdG9idWYuVGltZXN0YW1wInwKGURpc2FibGVJbnN0YW5jZUNv", + "bW1hbmREdG8SEgoKY29tbWFuZF9pZBgBIAEoCRIcChRpbnN0YW5jZV91bmlx", + "dWVfbmFtZRgCIAEoCRItCgl0aW1lc3RhbXAYAyABKAsyGi5nb29nbGUucHJv", + "dG9idWYuVGltZXN0YW1wInsKGERlbGV0ZUluc3RhbmNlQ29tbWFuZER0bxIS", + "Cgpjb21tYW5kX2lkGAEgASgJEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1lGAIg", + "ASgJEi0KCXRpbWVzdGFtcBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1l", + "c3RhbXAihQEKHkRlcGxveW1lbnRTdGF0ZVF1ZXJ5UmVxdWVzdER0bxIWCg5j", + "b3JyZWxhdGlvbl9pZBgBIAEoCRIcChRpbnN0YW5jZV91bmlxdWVfbmFtZRgC", + "IAEoCRItCgl0aW1lc3RhbXAYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGlt", + "ZXN0YW1wIm8KF1NoYXJlZFNjcmlwdEFydGlmYWN0RHRvEgwKBG5hbWUYASAB", + "KAkSDAoEY29kZRgCIAEoCRIdChVwYXJhbWV0ZXJfZGVmaW5pdGlvbnMYAyAB", + "KAkSGQoRcmV0dXJuX2RlZmluaXRpb24YBCABKAki7QEKGUV4dGVybmFsU3lz", + "dGVtQXJ0aWZhY3REdG8SDAoEbmFtZRgBIAEoCRIUCgxlbmRwb2ludF91cmwY", + "AiABKAkSEQoJYXV0aF90eXBlGAMgASgJEhoKEmF1dGhfY29uZmlndXJhdGlv", + "bhgEIAEoCRIfChdtZXRob2RfZGVmaW5pdGlvbnNfanNvbhgFIAEoCRIXCg90", + "aW1lb3V0X3NlY29uZHMYBiABKAUSEwoLbWF4X3JldHJpZXMYByABKAUSLgoL", + "cmV0cnlfZGVsYXkYCCABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb24i", + "jQEKHURhdGFiYXNlQ29ubmVjdGlvbkFydGlmYWN0RHRvEgwKBG5hbWUYASAB", + "KAkSGQoRY29ubmVjdGlvbl9zdHJpbmcYAiABKAkSEwoLbWF4X3JldHJpZXMY", + "AyABKAUSLgoLcmV0cnlfZGVsYXkYBCABKAsyGS5nb29nbGUucHJvdG9idWYu", + "RHVyYXRpb24iRQobTm90aWZpY2F0aW9uTGlzdEFydGlmYWN0RHRvEgwKBG5h", + "bWUYASABKAkSGAoQcmVjaXBpZW50X2VtYWlscxgCIAMoCSKgAQoZRGF0YUNv", + "bm5lY3Rpb25BcnRpZmFjdER0bxIMCgRuYW1lGAEgASgJEhAKCHByb3RvY29s", + "GAIgASgJEiIKGnByaW1hcnlfY29uZmlndXJhdGlvbl9qc29uGAMgASgJEiEK", + "GWJhY2t1cF9jb25maWd1cmF0aW9uX2pzb24YBCABKAkSHAoUZmFpbG92ZXJf", + "cmV0cnlfY291bnQYBSABKAUirQEKHFNtdHBDb25maWd1cmF0aW9uQXJ0aWZh", + "Y3REdG8SDAoEbmFtZRgBIAEoCRIOCgZzZXJ2ZXIYAiABKAkSDAoEcG9ydBgD", + "IAEoBRIRCglhdXRoX21vZGUYBCABKAkSFAoMZnJvbV9hZGRyZXNzGAUgASgJ", + "EhAKCHVzZXJuYW1lGAYgASgJEhAKCHBhc3N3b3JkGAcgASgJEhQKDG9hdXRo", + "X2NvbmZpZxgIIAEoCSJhChtTaGFyZWRTY3JpcHRBcnRpZmFjdExpc3REdG8S", + "QgoFaXRlbXMYASADKAsyMy5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5T", + "aGFyZWRTY3JpcHRBcnRpZmFjdER0byJlCh1FeHRlcm5hbFN5c3RlbUFydGlm", + "YWN0TGlzdER0bxJECgVpdGVtcxgBIAMoCzI1LnNjYWRhYnJpZGdlLnNpdGVj", + "b21tYW5kLnYxLkV4dGVybmFsU3lzdGVtQXJ0aWZhY3REdG8ibQohRGF0YWJh", + "c2VDb25uZWN0aW9uQXJ0aWZhY3RMaXN0RHRvEkgKBWl0ZW1zGAEgAygLMjku", + "c2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGF0YWJhc2VDb25uZWN0aW9u", + "QXJ0aWZhY3REdG8iaQofTm90aWZpY2F0aW9uTGlzdEFydGlmYWN0TGlzdER0", + "bxJGCgVpdGVtcxgBIAMoCzI3LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYx", + "Lk5vdGlmaWNhdGlvbkxpc3RBcnRpZmFjdER0byJlCh1EYXRhQ29ubmVjdGlv", + "bkFydGlmYWN0TGlzdER0bxJECgVpdGVtcxgBIAMoCzI1LnNjYWRhYnJpZGdl", + "LnNpdGVjb21tYW5kLnYxLkRhdGFDb25uZWN0aW9uQXJ0aWZhY3REdG8iawog", + "U210cENvbmZpZ3VyYXRpb25BcnRpZmFjdExpc3REdG8SRwoFaXRlbXMYASAD", + "KAsyOC5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5TbXRwQ29uZmlndXJh", + "dGlvbkFydGlmYWN0RHRvIu0EChlEZXBsb3lBcnRpZmFjdHNDb21tYW5kRHRv", + "EhUKDWRlcGxveW1lbnRfaWQYASABKAkSTwoOc2hhcmVkX3NjcmlwdHMYAiAB", + "KAsyNy5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5TaGFyZWRTY3JpcHRB", + "cnRpZmFjdExpc3REdG8SUwoQZXh0ZXJuYWxfc3lzdGVtcxgDIAEoCzI5LnNj", + "YWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkV4dGVybmFsU3lzdGVtQXJ0aWZh", + "Y3RMaXN0RHRvElsKFGRhdGFiYXNlX2Nvbm5lY3Rpb25zGAQgASgLMj0uc2Nh", + "ZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGF0YWJhc2VDb25uZWN0aW9uQXJ0", + "aWZhY3RMaXN0RHRvElcKEm5vdGlmaWNhdGlvbl9saXN0cxgFIAEoCzI7LnNj", + "YWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLk5vdGlmaWNhdGlvbkxpc3RBcnRp", + "ZmFjdExpc3REdG8SUwoQZGF0YV9jb25uZWN0aW9ucxgGIAEoCzI5LnNjYWRh", + "YnJpZGdlLnNpdGVjb21tYW5kLnYxLkRhdGFDb25uZWN0aW9uQXJ0aWZhY3RM", + "aXN0RHRvElkKE3NtdHBfY29uZmlndXJhdGlvbnMYByABKAsyPC5zY2FkYWJy", + "aWRnZS5zaXRlY29tbWFuZC52MS5TbXRwQ29uZmlndXJhdGlvbkFydGlmYWN0", + "TGlzdER0bxItCgl0aW1lc3RhbXAYCCABKAsyGi5nb29nbGUucHJvdG9idWYu", + "VGltZXN0YW1wItkBChtEZXBsb3ltZW50U3RhdHVzUmVzcG9uc2VEdG8SFQoN", + "ZGVwbG95bWVudF9pZBgBIAEoCRIcChRpbnN0YW5jZV91bmlxdWVfbmFtZRgC", + "IAEoCRI/CgZzdGF0dXMYAyABKA4yLy5zY2FkYWJyaWRnZS5zaXRlY29tbWFu", + "ZC52MS5EZXBsb3ltZW50U3RhdHVzRHRvEhUKDWVycm9yX21lc3NhZ2UYBCAB", + "KAkSLQoJdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVz", + "dGFtcCKnAQocSW5zdGFuY2VMaWZlY3ljbGVSZXNwb25zZUR0bxISCgpjb21t", + "YW5kX2lkGAEgASgJEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEg8K", + "B3N1Y2Nlc3MYAyABKAgSFQoNZXJyb3JfbWVzc2FnZRgEIAEoCRItCgl0aW1l", + "c3RhbXAYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wItkBCh9E", + "ZXBsb3ltZW50U3RhdGVRdWVyeVJlc3BvbnNlRHRvEhYKDmNvcnJlbGF0aW9u", + "X2lkGAEgASgJEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEhMKC2lz", + "X2RlcGxveWVkGAMgASgIEh0KFWFwcGxpZWRfZGVwbG95bWVudF9pZBgEIAEo", + "CRIdChVhcHBsaWVkX3JldmlzaW9uX2hhc2gYBSABKAkSLQoJdGltZXN0YW1w", + "GAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKeAQodQXJ0aWZh", + "Y3REZXBsb3ltZW50UmVzcG9uc2VEdG8SFQoNZGVwbG95bWVudF9pZBgBIAEo", + "CRIPCgdzaXRlX2lkGAIgASgJEg8KB3N1Y2Nlc3MYAyABKAgSFQoNZXJyb3Jf", + "bWVzc2FnZRgEIAEoCRItCgl0aW1lc3RhbXAYBSABKAsyGi5nb29nbGUucHJv", + "dG9idWYuVGltZXN0YW1wIpoEChBMaWZlY3ljbGVSZXF1ZXN0ElUKEnJlZnJl", + "c2hfZGVwbG95bWVudBgBIAEoCzI3LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5k", + "LnYxLlJlZnJlc2hEZXBsb3ltZW50Q29tbWFuZER0b0gAEk8KD2VuYWJsZV9p", + "bnN0YW5jZRgCIAEoCzI0LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkVu", + "YWJsZUluc3RhbmNlQ29tbWFuZER0b0gAElEKEGRpc2FibGVfaW5zdGFuY2UY", + "AyABKAsyNS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5EaXNhYmxlSW5z", + "dGFuY2VDb21tYW5kRHRvSAASTwoPZGVsZXRlX2luc3RhbmNlGAQgASgLMjQu", + "c2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGVsZXRlSW5zdGFuY2VDb21t", + "YW5kRHRvSAASXAoWZGVwbG95bWVudF9zdGF0ZV9xdWVyeRgFIAEoCzI6LnNj", + "YWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkRlcGxveW1lbnRTdGF0ZVF1ZXJ5", + "UmVxdWVzdER0b0gAElEKEGRlcGxveV9hcnRpZmFjdHMYBiABKAsyNS5zY2Fk", + "YWJyaWRnZS5zaXRlY29tbWFuZC52MS5EZXBsb3lBcnRpZmFjdHNDb21tYW5k", + "RHRvSABCCQoHY29tbWFuZCKAAwoOTGlmZWN5Y2xlUmVwbHkSVAoRZGVwbG95", + "bWVudF9zdGF0dXMYASABKAsyNy5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52", + "MS5EZXBsb3ltZW50U3RhdHVzUmVzcG9uc2VEdG9IABJWChJpbnN0YW5jZV9s", + "aWZlY3ljbGUYAiABKAsyOC5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5J", + "bnN0YW5jZUxpZmVjeWNsZVJlc3BvbnNlRHRvSAASXQoWZGVwbG95bWVudF9z", + "dGF0ZV9xdWVyeRgDIAEoCzI7LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYx", + "LkRlcGxveW1lbnRTdGF0ZVF1ZXJ5UmVzcG9uc2VEdG9IABJYChNhcnRpZmFj", + "dF9kZXBsb3ltZW50GAQgASgLMjkuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQu", + "djEuQXJ0aWZhY3REZXBsb3ltZW50UmVzcG9uc2VEdG9IAEIHCgVyZXBseSJ8", + "ChRCcm93c2VOb2RlQ29tbWFuZER0bxIXCg9jb25uZWN0aW9uX25hbWUYASAB", + "KAkSFgoOcGFyZW50X25vZGVfaWQYAiABKAkSGgoSY29udGludWF0aW9uX3Rv", + "a2VuGAMgASgJEhcKD3NpdGVfaWRlbnRpZmllchgEIAEoCSKCAgoNQnJvd3Nl", + "Tm9kZUR0bxIPCgdub2RlX2lkGAEgASgJEhQKDGRpc3BsYXlfbmFtZRgCIAEo", + "CRJCCgpub2RlX2NsYXNzGAMgASgOMi4uc2NhZGFicmlkZ2Uuc2l0ZWNvbW1h", + "bmQudjEuQnJvd3NlTm9kZUNsYXNzRHRvEhQKDGhhc19jaGlsZHJlbhgEIAEo", + "CBIRCglkYXRhX3R5cGUYBSABKAkSLwoKdmFsdWVfcmFuaxgGIAEoCzIbLmdv", + "b2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlEiwKCHdyaXRhYmxlGAcgASgLMhou", + "Z29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSJjChBCcm93c2VGYWlsdXJlRHRv", + "Ej4KBGtpbmQYASABKA4yMC5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5C", + "cm93c2VGYWlsdXJlS2luZER0bxIPCgdtZXNzYWdlGAIgASgJIsABChNCcm93", + "c2VOb2RlUmVzdWx0RHRvEjsKCGNoaWxkcmVuGAEgAygLMikuc2NhZGFicmlk", + "Z2Uuc2l0ZWNvbW1hbmQudjEuQnJvd3NlTm9kZUR0bxIRCgl0cnVuY2F0ZWQY", + "AiABKAgSPQoHZmFpbHVyZRgDIAEoCzIsLnNjYWRhYnJpZGdlLnNpdGVjb21t", + "YW5kLnYxLkJyb3dzZUZhaWx1cmVEdG8SGgoSY29udGludWF0aW9uX3Rva2Vu", + "GAQgASgJIocBChxTZWFyY2hBZGRyZXNzU3BhY2VDb21tYW5kRHRvEhcKD2Nv", + "bm5lY3Rpb25fbmFtZRgBIAEoCRINCgVxdWVyeRgCIAEoCRIRCgltYXhfZGVw", + "dGgYAyABKAUSEwoLbWF4X3Jlc3VsdHMYBCABKAUSFwoPc2l0ZV9pZGVudGlm", + "aWVyGAUgASgJIl0KFEFkZHJlc3NTcGFjZU1hdGNoRHRvEjcKBG5vZGUYASAB", + "KAsyKS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5Ccm93c2VOb2RlRHRv", + "EgwKBHBhdGgYAiABKAkitAEKG1NlYXJjaEFkZHJlc3NTcGFjZVJlc3VsdER0", + "bxJBCgdtYXRjaGVzGAEgAygLMjAuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQu", + "djEuQWRkcmVzc1NwYWNlTWF0Y2hEdG8SEwoLY2FwX3JlYWNoZWQYAiABKAgS", + "PQoHZmFpbHVyZRgDIAEoCzIsLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYx", + "LkJyb3dzZUZhaWx1cmVEdG8iRQoXUmVhZFRhZ1ZhbHVlc0NvbW1hbmREdG8S", + "FwoPY29ubmVjdGlvbl9uYW1lGAEgASgJEhEKCXRhZ19wYXRocxgCIAMoCSLE", + "AQoRVGFnUmVhZE91dGNvbWVEdG8SEAoIdGFnX3BhdGgYASABKAkSDwoHc3Vj", + "Y2VzcxgCIAEoCBI1CgV2YWx1ZRgDIAEoCzImLnNjYWRhYnJpZGdlLnNpdGVj", + "b21tYW5kLnYxLkxvb3NlVmFsdWUSDwoHcXVhbGl0eRgEIAEoCRItCgl0aW1l", + "c3RhbXAYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhUKDWVy", + "cm9yX21lc3NhZ2UYBiABKAkicQoXUmVhZFRhZ1ZhbHVlc0ZhaWx1cmVEdG8S", + "RQoEa2luZBgBIAEoDjI3LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlJl", + "YWRUYWdWYWx1ZXNGYWlsdXJlS2luZER0bxIPCgdtZXNzYWdlGAIgASgJIp8B", + "ChZSZWFkVGFnVmFsdWVzUmVzdWx0RHRvEj8KCG91dGNvbWVzGAEgAygLMi0u", + "c2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuVGFnUmVhZE91dGNvbWVEdG8S", + "RAoHZmFpbHVyZRgCIAEoCzIzLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYx", + "LlJlYWRUYWdWYWx1ZXNGYWlsdXJlRHRvInMKGFZlcmlmeUVuZHBvaW50Q29t", + "bWFuZER0bxIXCg9jb25uZWN0aW9uX25hbWUYASABKAkSEAoIcHJvdG9jb2wY", + "AiABKAkSEwoLY29uZmlnX2pzb24YAyABKAkSFwoPc2l0ZV9pZGVudGlmaWVy", + "GAQgASgJIsMBChFTZXJ2ZXJDZXJ0SW5mb0R0bxISCgp0aHVtYnByaW50GAEg", + "ASgJEg8KB3N1YmplY3QYAiABKAkSDgoGaXNzdWVyGAMgASgJEjIKDm5vdF9i", + "ZWZvcmVfdXRjGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIx", + "Cg1ub3RfYWZ0ZXJfdXRjGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVz", + "dGFtcBISCgpkZXJfYmFzZTY0GAYgASgJIlkKFlZlcmlmeUZhaWx1cmVLaW5k", + "VmFsdWUSPwoFdmFsdWUYASABKA4yMC5zY2FkYWJyaWRnZS5zaXRlY29tbWFu", + "ZC52MS5WZXJpZnlGYWlsdXJlS2luZER0byLAAQoXVmVyaWZ5RW5kcG9pbnRS", + "ZXN1bHREdG8SDwoHc3VjY2VzcxgBIAEoCBJICgxmYWlsdXJlX2tpbmQYAiAB", + "KAsyMi5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5WZXJpZnlGYWlsdXJl", + "S2luZFZhbHVlEg0KBWVycm9yGAMgASgJEjsKBGNlcnQYBCABKAsyLS5zY2Fk", + "YWJyaWRnZS5zaXRlY29tbWFuZC52MS5TZXJ2ZXJDZXJ0SW5mb0R0byJ1ChlU", + "cnVzdFNlcnZlckNlcnRDb21tYW5kRHRvEhcKD2Nvbm5lY3Rpb25fbmFtZRgB", + "IAEoCRISCgpkZXJfYmFzZTY0GAIgASgJEhIKCnRodW1icHJpbnQYAyABKAkS", + "FwoPc2l0ZV9pZGVudGlmaWVyGAQgASgJIjQKGUxpc3RTZXJ2ZXJDZXJ0c0Nv", + "bW1hbmREdG8SFwoPc2l0ZV9pZGVudGlmaWVyGAEgASgJIkkKGlJlbW92ZVNl", + "cnZlckNlcnRDb21tYW5kRHRvEhIKCnRodW1icHJpbnQYASABKAkSFwoPc2l0", + "ZV9pZGVudGlmaWVyGAIgASgJIsIBChJUcnVzdGVkQ2VydEluZm9EdG8SEgoK", + "dGh1bWJwcmludBgBIAEoCRIPCgdzdWJqZWN0GAIgASgJEg4KBmlzc3VlchgD", + "IAEoCRIyCg5ub3RfYmVmb3JlX3V0YxgEIAEoCzIaLmdvb2dsZS5wcm90b2J1", + "Zi5UaW1lc3RhbXASMQoNbm90X2FmdGVyX3V0YxgFIAEoCzIaLmdvb2dsZS5w", + "cm90b2J1Zi5UaW1lc3RhbXASEAoIcmVqZWN0ZWQYBiABKAgiVwoWVHJ1c3Rl", + "ZENlcnRJbmZvTGlzdER0bxI9CgVpdGVtcxgBIAMoCzIuLnNjYWRhYnJpZGdl", + "LnNpdGVjb21tYW5kLnYxLlRydXN0ZWRDZXJ0SW5mb0R0byJ3ChJDZXJ0VHJ1", + "c3RSZXN1bHREdG8SDwoHc3VjY2VzcxgBIAEoCBINCgVlcnJvchgCIAEoCRJB", + "CgVjZXJ0cxgDIAEoCzIyLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlRy", + "dXN0ZWRDZXJ0SW5mb0xpc3REdG8ivQEKEldyaXRlVGFnUmVxdWVzdER0bxIW", + "Cg5jb3JyZWxhdGlvbl9pZBgBIAEoCRIXCg9jb25uZWN0aW9uX25hbWUYAiAB", + "KAkSEAoIdGFnX3BhdGgYAyABKAkSNQoFdmFsdWUYBCABKAsyJi5zY2FkYWJy", + "aWRnZS5zaXRlY29tbWFuZC52MS5Mb29zZVZhbHVlEi0KCXRpbWVzdGFtcBgF", + "IAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAihAEKE1dyaXRlVGFn", + "UmVzcG9uc2VEdG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSDwoHc3VjY2Vz", + "cxgCIAEoCBIVCg1lcnJvcl9tZXNzYWdlGAMgASgJEi0KCXRpbWVzdGFtcBgE", + "IAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAioAUKDE9wY1VhUmVx", + "dWVzdBJHCgticm93c2Vfbm9kZRgBIAEoCzIwLnNjYWRhYnJpZGdlLnNpdGVj", + "b21tYW5kLnYxLkJyb3dzZU5vZGVDb21tYW5kRHRvSAASWAoUc2VhcmNoX2Fk", + "ZHJlc3Nfc3BhY2UYAiABKAsyOC5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52", + "MS5TZWFyY2hBZGRyZXNzU3BhY2VDb21tYW5kRHRvSAASTgoPcmVhZF90YWdf", + "dmFsdWVzGAMgASgLMjMuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUmVh", + "ZFRhZ1ZhbHVlc0NvbW1hbmREdG9IABJPCg92ZXJpZnlfZW5kcG9pbnQYBCAB", + "KAsyNC5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5WZXJpZnlFbmRwb2lu", + "dENvbW1hbmREdG9IABJSChF0cnVzdF9zZXJ2ZXJfY2VydBgFIAEoCzI1LnNj", + "YWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlRydXN0U2VydmVyQ2VydENvbW1h", + "bmREdG9IABJSChFsaXN0X3NlcnZlcl9jZXJ0cxgGIAEoCzI1LnNjYWRhYnJp", + "ZGdlLnNpdGVjb21tYW5kLnYxLkxpc3RTZXJ2ZXJDZXJ0c0NvbW1hbmREdG9I", + "ABJUChJyZW1vdmVfc2VydmVyX2NlcnQYByABKAsyNi5zY2FkYWJyaWRnZS5z", + "aXRlY29tbWFuZC52MS5SZW1vdmVTZXJ2ZXJDZXJ0Q29tbWFuZER0b0gAEkMK", + "CXdyaXRlX3RhZxgIIAEoCzIuLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYx", + "LldyaXRlVGFnUmVxdWVzdER0b0gAQgkKB2NvbW1hbmQi4QMKCk9wY1VhUmVw", + "bHkSRgoLYnJvd3NlX25vZGUYASABKAsyLy5zY2FkYWJyaWRnZS5zaXRlY29t", + "bWFuZC52MS5Ccm93c2VOb2RlUmVzdWx0RHRvSAASVwoUc2VhcmNoX2FkZHJl", + "c3Nfc3BhY2UYAiABKAsyNy5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5T", + "ZWFyY2hBZGRyZXNzU3BhY2VSZXN1bHREdG9IABJNCg9yZWFkX3RhZ192YWx1", + "ZXMYAyABKAsyMi5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5SZWFkVGFn", + "VmFsdWVzUmVzdWx0RHRvSAASTgoPdmVyaWZ5X2VuZHBvaW50GAQgASgLMjMu", + "c2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuVmVyaWZ5RW5kcG9pbnRSZXN1", + "bHREdG9IABJECgpjZXJ0X3RydXN0GAUgASgLMi4uc2NhZGFicmlkZ2Uuc2l0", + "ZWNvbW1hbmQudjEuQ2VydFRydXN0UmVzdWx0RHRvSAASRAoJd3JpdGVfdGFn", + "GAYgASgLMi8uc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuV3JpdGVUYWdS", + "ZXNwb25zZUR0b0gAQgcKBXJlcGx5IsUCChdFdmVudExvZ1F1ZXJ5UmVxdWVz", + "dER0bxIWCg5jb3JyZWxhdGlvbl9pZBgBIAEoCRIPCgdzaXRlX2lkGAIgASgJ", + "EigKBGZyb20YAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEiYK", + "AnRvGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBISCgpldmVu", + "dF90eXBlGAUgASgJEhAKCHNldmVyaXR5GAYgASgJEhMKC2luc3RhbmNlX2lk", + "GAcgASgJEhYKDmtleXdvcmRfZmlsdGVyGAggASgJEhoKEmNvbnRpbnVhdGlv", + "bl90b2tlbhgJIAEoCRIRCglwYWdlX3NpemUYCiABKAUSLQoJdGltZXN0YW1w", + "GAsgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCK6AQoQRXZlbnRM", + "b2dFbnRyeUR0bxIKCgJpZBgBIAEoCRItCgl0aW1lc3RhbXAYAiABKAsyGi5n", + "b29nbGUucHJvdG9idWYuVGltZXN0YW1wEhIKCmV2ZW50X3R5cGUYAyABKAkS", + "EAoIc2V2ZXJpdHkYBCABKAkSEwoLaW5zdGFuY2VfaWQYBSABKAkSDgoGc291", + "cmNlGAYgASgJEg8KB21lc3NhZ2UYByABKAkSDwoHZGV0YWlscxgIIAEoCSKH", + "AgoYRXZlbnRMb2dRdWVyeVJlc3BvbnNlRHRvEhYKDmNvcnJlbGF0aW9uX2lk", + "GAEgASgJEg8KB3NpdGVfaWQYAiABKAkSPQoHZW50cmllcxgDIAMoCzIsLnNj", + "YWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkV2ZW50TG9nRW50cnlEdG8SGgoS", + "Y29udGludWF0aW9uX3Rva2VuGAQgASgJEhAKCGhhc19tb3JlGAUgASgIEg8K", + "B3N1Y2Nlc3MYBiABKAgSFQoNZXJyb3JfbWVzc2FnZRgHIAEoCRItCgl0aW1l", + "c3RhbXAYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wImQKF0Rl", + "YnVnU25hcHNob3RSZXF1ZXN0RHRvEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1l", + "GAEgASgJEhYKDmNvcnJlbGF0aW9uX2lkGAIgASgJEhMKC2FsYXJtc19vbmx5", + "GAMgASgIIlQKHFN1YnNjcmliZURlYnVnVmlld1JlcXVlc3REdG8SHAoUaW5z", + "dGFuY2VfdW5pcXVlX25hbWUYASABKAkSFgoOY29ycmVsYXRpb25faWQYAiAB", + "KAkiVgoeVW5zdWJzY3JpYmVEZWJ1Z1ZpZXdSZXF1ZXN0RHRvEhwKFGluc3Rh", + "bmNlX3VuaXF1ZV9uYW1lGAEgASgJEhYKDmNvcnJlbGF0aW9uX2lkGAIgASgJ", + "IhwKGlVuc3Vic2NyaWJlRGVidWdWaWV3QWNrRHRvItQBChZBbGFybUNvbmRp", + "dGlvblN0YXRlRHRvEg4KBmFjdGl2ZRgBIAEoCBIUCgxhY2tub3dsZWRnZWQY", + "AiABKAgSLQoJY29uZmlybWVkGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLkJv", + "b2xWYWx1ZRI/CgZzaGVsdmUYBCABKA4yLy5zY2FkYWJyaWRnZS5zaXRlY29t", + "bWFuZC52MS5BbGFybVNoZWx2ZVN0YXRlRHRvEhIKCnN1cHByZXNzZWQYBSAB", + "KAgSEAoIc2V2ZXJpdHkYBiABKAUi3QEKFkRlYnVnQXR0cmlidXRlVmFsdWVE", + "dG8SHAoUaW5zdGFuY2VfdW5pcXVlX25hbWUYASABKAkSFgoOYXR0cmlidXRl", + "X3BhdGgYAiABKAkSFgoOYXR0cmlidXRlX25hbWUYAyABKAkSNQoFdmFsdWUY", + "BCABKAsyJi5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5Mb29zZVZhbHVl", + "Eg8KB3F1YWxpdHkYBSABKAkSLQoJdGltZXN0YW1wGAYgASgLMhouZ29vZ2xl", + "LnByb3RvYnVmLlRpbWVzdGFtcCKvBQoSRGVidWdBbGFybVN0YXRlRHRvEhwK", + "FGluc3RhbmNlX3VuaXF1ZV9uYW1lGAEgASgJEhIKCmFsYXJtX25hbWUYAiAB", + "KAkSOAoFc3RhdGUYAyABKA4yKS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52", + "MS5BbGFybVN0YXRlRHRvEhAKCHByaW9yaXR5GAQgASgFEi0KCXRpbWVzdGFt", + "cBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASOAoFbGV2ZWwY", + "BiABKA4yKS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5BbGFybUxldmVs", + "RHRvEg8KB21lc3NhZ2UYByABKAkSNgoEa2luZBgIIAEoDjIoLnNjYWRhYnJp", + "ZGdlLnNpdGVjb21tYW5kLnYxLkFsYXJtS2luZER0bxJFCgljb25kaXRpb24Y", + "CSABKAsyMi5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5BbGFybUNvbmRp", + "dGlvblN0YXRlRHRvEhgKEHNvdXJjZV9yZWZlcmVuY2UYCiABKAkSFwoPYWxh", + "cm1fdHlwZV9uYW1lGAsgASgJEhAKCGNhdGVnb3J5GAwgASgJEhUKDW9wZXJh", + "dG9yX3VzZXIYDSABKAkSGAoQb3BlcmF0b3JfY29tbWVudBgOIAEoCRI3ChNv", + "cmlnaW5hbF9yYWlzZV90aW1lGA8gASgLMhouZ29vZ2xlLnByb3RvYnVmLlRp", + "bWVzdGFtcBIVCg1jdXJyZW50X3ZhbHVlGBAgASgJEhMKC2xpbWl0X3ZhbHVl", + "GBEgASgJEiQKHG5hdGl2ZV9zb3VyY2VfY2Fub25pY2FsX25hbWUYEiABKAkS", + "IQoZaXNfY29uZmlndXJlZF9wbGFjZWhvbGRlchgTIAEoCCKcAgoURGVidWdW", + "aWV3U25hcHNob3REdG8SHAoUaW5zdGFuY2VfdW5pcXVlX25hbWUYASABKAkS", + "TAoQYXR0cmlidXRlX3ZhbHVlcxgCIAMoCzIyLnNjYWRhYnJpZGdlLnNpdGVj", + "b21tYW5kLnYxLkRlYnVnQXR0cmlidXRlVmFsdWVEdG8SRAoMYWxhcm1fc3Rh", + "dGVzGAMgAygLMi4uc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRGVidWdB", + "bGFybVN0YXRlRHRvEjYKEnNuYXBzaG90X3RpbWVzdGFtcBgEIAEoCzIaLmdv", + "b2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGgoSaW5zdGFuY2Vfbm90X2ZvdW5k", + "GAUgASgIIvACCgxRdWVyeVJlcXVlc3QSTgoPZXZlbnRfbG9nX3F1ZXJ5GAEg", + "ASgLMjMuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRXZlbnRMb2dRdWVy", + "eVJlcXVlc3REdG9IABJNCg5kZWJ1Z19zbmFwc2hvdBgCIAEoCzIzLnNjYWRh", + "YnJpZGdlLnNpdGVjb21tYW5kLnYxLkRlYnVnU25hcHNob3RSZXF1ZXN0RHRv", + "SAASWAoUc3Vic2NyaWJlX2RlYnVnX3ZpZXcYAyABKAsyOC5zY2FkYWJyaWRn", + "ZS5zaXRlY29tbWFuZC52MS5TdWJzY3JpYmVEZWJ1Z1ZpZXdSZXF1ZXN0RHRv", + "SAASXAoWdW5zdWJzY3JpYmVfZGVidWdfdmlldxgEIAEoCzI6LnNjYWRhYnJp", + "ZGdlLnNpdGVjb21tYW5kLnYxLlVuc3Vic2NyaWJlRGVidWdWaWV3UmVxdWVz", + "dER0b0gAQgkKB2NvbW1hbmQikQIKClF1ZXJ5UmVwbHkSTwoPZXZlbnRfbG9n", + "X3F1ZXJ5GAEgASgLMjQuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuRXZl", + "bnRMb2dRdWVyeVJlc3BvbnNlRHRvSAASTwoTZGVidWdfdmlld19zbmFwc2hv", + "dBgCIAEoCzIwLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLkRlYnVnVmll", + "d1NuYXBzaG90RHRvSAASWAoWdW5zdWJzY3JpYmVfZGVidWdfdmlldxgDIAEo", + "CzI2LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlVuc3Vic2NyaWJlRGVi", + "dWdWaWV3QWNrRHRvSABCBwoFcmVwbHkingEKHFBhcmtlZE1lc3NhZ2VRdWVy", + "eVJlcXVlc3REdG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSDwoHc2l0ZV9p", + "ZBgCIAEoCRITCgtwYWdlX251bWJlchgDIAEoBRIRCglwYWdlX3NpemUYBCAB", + "KAUSLQoJdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVz", + "dGFtcCLyAgoVUGFya2VkTWVzc2FnZUVudHJ5RHRvEhIKCm1lc3NhZ2VfaWQY", + "ASABKAkSFQoNdGFyZ2V0X3N5c3RlbRgCIAEoCRITCgttZXRob2RfbmFtZRgD", + "IAEoCRIVCg1lcnJvcl9tZXNzYWdlGAQgASgJEhUKDWF0dGVtcHRfY291bnQY", + "BSABKAUSNgoSb3JpZ2luYWxfdGltZXN0YW1wGAYgASgLMhouZ29vZ2xlLnBy", + "b3RvYnVmLlRpbWVzdGFtcBI6ChZsYXN0X2F0dGVtcHRfdGltZXN0YW1wGAcg", + "ASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIUCgxtYXhfYXR0ZW1w", + "dHMYCCABKAUSSAoIY2F0ZWdvcnkYCSABKA4yNi5zY2FkYWJyaWRnZS5zaXRl", + "Y29tbWFuZC52MS5TdG9yZUFuZEZvcndhcmRDYXRlZ29yeUR0bxIXCg9vcmln", + "aW5faW5zdGFuY2UYCiABKAkioQIKHVBhcmtlZE1lc3NhZ2VRdWVyeVJlc3Bv", + "bnNlRHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJEg8KB3NpdGVfaWQYAiAB", + "KAkSQwoIbWVzc2FnZXMYAyADKAsyMS5zY2FkYWJyaWRnZS5zaXRlY29tbWFu", + "ZC52MS5QYXJrZWRNZXNzYWdlRW50cnlEdG8SEwoLdG90YWxfY291bnQYBCAB", + "KAUSEwoLcGFnZV9udW1iZXIYBSABKAUSEQoJcGFnZV9zaXplGAYgASgFEg8K", + "B3N1Y2Nlc3MYByABKAgSFQoNZXJyb3JfbWVzc2FnZRgIIAEoCRItCgl0aW1l", + "c3RhbXAYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIooBChxQ", + "YXJrZWRNZXNzYWdlUmV0cnlSZXF1ZXN0RHRvEhYKDmNvcnJlbGF0aW9uX2lk", + "GAEgASgJEg8KB3NpdGVfaWQYAiABKAkSEgoKbWVzc2FnZV9pZBgDIAEoCRIt", + "Cgl0aW1lc3RhbXAYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1w", + "Il8KHVBhcmtlZE1lc3NhZ2VSZXRyeVJlc3BvbnNlRHRvEhYKDmNvcnJlbGF0", + "aW9uX2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSFQoNZXJyb3JfbWVzc2Fn", + "ZRgDIAEoCSKMAQoeUGFya2VkTWVzc2FnZURpc2NhcmRSZXF1ZXN0RHRvEhYK", + "DmNvcnJlbGF0aW9uX2lkGAEgASgJEg8KB3NpdGVfaWQYAiABKAkSEgoKbWVz", + "c2FnZV9pZBgDIAEoCRItCgl0aW1lc3RhbXAYBCABKAsyGi5nb29nbGUucHJv", + "dG9idWYuVGltZXN0YW1wImEKH1BhcmtlZE1lc3NhZ2VEaXNjYXJkUmVzcG9u", "c2VEdG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSDwoHc3VjY2VzcxgCIAEo", - "CBI8CgxyZXR1cm5fdmFsdWUYAyABKAsyJi5zY2FkYWJyaWRnZS5zaXRlY29t", - "bWFuZC52MS5Mb29zZVZhbHVlEhUKDWVycm9yX21lc3NhZ2UYBCABKAkSLQoJ", - "dGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCK7", - "AQoeUm91dGVUb0dldEF0dHJpYnV0ZXNSZXF1ZXN0RHRvEhYKDmNvcnJlbGF0", - "aW9uX2lkGAEgASgJEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEhcK", - "D2F0dHJpYnV0ZV9uYW1lcxgDIAMoCRItCgl0aW1lc3RhbXAYBCABKAsyGi5n", - "b29nbGUucHJvdG9idWYuVGltZXN0YW1wEhsKE3BhcmVudF9leGVjdXRpb25f", - "aWQYBSABKAkiywEKH1JvdXRlVG9HZXRBdHRyaWJ1dGVzUmVzcG9uc2VEdG8S", - "FgoOY29ycmVsYXRpb25faWQYASABKAkSOQoGdmFsdWVzGAIgASgLMikuc2Nh", - "ZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuTG9vc2VWYWx1ZU1hcBIPCgdzdWNj", - "ZXNzGAMgASgIEhUKDWVycm9yX21lc3NhZ2UYBCABKAkSLQoJdGltZXN0YW1w", - "GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCLFAgoeUm91dGVU", - "b1NldEF0dHJpYnV0ZXNSZXF1ZXN0RHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEg", - "ASgJEhwKFGluc3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEmkKEGF0dHJpYnV0", - "ZV92YWx1ZXMYAyADKAsyTy5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5S", - "b3V0ZVRvU2V0QXR0cmlidXRlc1JlcXVlc3REdG8uQXR0cmlidXRlVmFsdWVz", - "RW50cnkSLQoJdGltZXN0YW1wGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRp", - "bWVzdGFtcBIbChNwYXJlbnRfZXhlY3V0aW9uX2lkGAUgASgJGjYKFEF0dHJp", - "YnV0ZVZhbHVlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToC", - "OAEikAEKH1JvdXRlVG9TZXRBdHRyaWJ1dGVzUmVzcG9uc2VEdG8SFgoOY29y", - "cmVsYXRpb25faWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIVCg1lcnJvcl9t", - "ZXNzYWdlGAMgASgJEi0KCXRpbWVzdGFtcBgEIAEoCzIaLmdvb2dsZS5wcm90", - "b2J1Zi5UaW1lc3RhbXAiwwIKIVJvdXRlVG9XYWl0Rm9yQXR0cmlidXRlUmVx", - "dWVzdER0bxIWCg5jb3JyZWxhdGlvbl9pZBgBIAEoCRIcChRpbnN0YW5jZV91", - "bmlxdWVfbmFtZRgCIAEoCRIWCg5hdHRyaWJ1dGVfbmFtZRgDIAEoCRI6ChR0", - "YXJnZXRfdmFsdWVfZW5jb2RlZBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5T", - "dHJpbmdWYWx1ZRIqCgd0aW1lb3V0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVm", - "LkR1cmF0aW9uEi0KCXRpbWVzdGFtcBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1", - "Zi5UaW1lc3RhbXASGwoTcGFyZW50X2V4ZWN1dGlvbl9pZBgHIAEoCRIcChRy", - "ZXF1aXJlX2dvb2RfcXVhbGl0eRgIIAEoCCL/AQoiUm91dGVUb1dhaXRGb3JB", - "dHRyaWJ1dGVSZXNwb25zZUR0bxIWCg5jb3JyZWxhdGlvbl9pZBgBIAEoCRIP", - "CgdtYXRjaGVkGAIgASgIEjUKBXZhbHVlGAMgASgLMiYuc2NhZGFicmlkZ2Uu", - "c2l0ZWNvbW1hbmQudjEuTG9vc2VWYWx1ZRIPCgdxdWFsaXR5GAQgASgJEhEK", - "CXRpbWVkX291dBgFIAEoCBIPCgdzdWNjZXNzGAYgASgIEhUKDWVycm9yX21l", - "c3NhZ2UYByABKAkSLQoJdGltZXN0YW1wGAggASgLMhouZ29vZ2xlLnByb3Rv", - "YnVmLlRpbWVzdGFtcCKJAwoMUm91dGVSZXF1ZXN0EkoKDXJvdXRlX3RvX2Nh", - "bGwYASABKAsyMS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5Sb3V0ZVRv", - "Q2FsbFJlcXVlc3REdG9IABJdChdyb3V0ZV90b19nZXRfYXR0cmlidXRlcxgC", - "IAEoCzI6LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlJvdXRlVG9HZXRB", - "dHRyaWJ1dGVzUmVxdWVzdER0b0gAEl0KF3JvdXRlX3RvX3NldF9hdHRyaWJ1", - "dGVzGAMgASgLMjouc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVU", - "b1NldEF0dHJpYnV0ZXNSZXF1ZXN0RHRvSAASZAobcm91dGVfdG9fd2FpdF9m", - "b3JfYXR0cmlidXRlGAQgASgLMj0uc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQu", - "djEuUm91dGVUb1dhaXRGb3JBdHRyaWJ1dGVSZXF1ZXN0RHRvSABCCQoHY29t", - "bWFuZCKJAwoKUm91dGVSZXBseRJLCg1yb3V0ZV90b19jYWxsGAEgASgLMjIu", - "c2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVUb0NhbGxSZXNwb25z", - "ZUR0b0gAEl4KF3JvdXRlX3RvX2dldF9hdHRyaWJ1dGVzGAIgASgLMjsuc2Nh", - "ZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVUb0dldEF0dHJpYnV0ZXNS", - "ZXNwb25zZUR0b0gAEl4KF3JvdXRlX3RvX3NldF9hdHRyaWJ1dGVzGAMgASgL", - "Mjsuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVUb1NldEF0dHJp", - "YnV0ZXNSZXNwb25zZUR0b0gAEmUKG3JvdXRlX3RvX3dhaXRfZm9yX2F0dHJp", - "YnV0ZRgEIAEoCzI+LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlJvdXRl", - "VG9XYWl0Rm9yQXR0cmlidXRlUmVzcG9uc2VEdG9IAEIHCgVyZXBseSJBChZU", - "cmlnZ2VyU2l0ZUZhaWxvdmVyRHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJ", - "Eg8KB3NpdGVfaWQYAiABKAkibQoSU2l0ZUZhaWxvdmVyQWNrRHRvEhYKDmNv", - "cnJlbGF0aW9uX2lkGAEgASgJEhAKCGFjY2VwdGVkGAIgASgIEhYKDnRhcmdl", - "dF9hZGRyZXNzGAMgASgJEhUKDWVycm9yX21lc3NhZ2UYBCABKAkqywEKE0Rl", - "cGxveW1lbnRTdGF0dXNEdG8SJQohREVQTE9ZTUVOVF9TVEFUVVNfRFRPX1VO", - "U1BFQ0lGSUVEEAASIQodREVQTE9ZTUVOVF9TVEFUVVNfRFRPX1BFTkRJTkcQ", - "ARIlCiFERVBMT1lNRU5UX1NUQVRVU19EVE9fSU5fUFJPR1JFU1MQAhIhCh1E", - "RVBMT1lNRU5UX1NUQVRVU19EVE9fU1VDQ0VTUxADEiAKHERFUExPWU1FTlRf", - "U1RBVFVTX0RUT19GQUlMRUQQBCrEAQoSQnJvd3NlTm9kZUNsYXNzRHRvEiUK", - "IUJST1dTRV9OT0RFX0NMQVNTX0RUT19VTlNQRUNJRklFRBAAEiAKHEJST1dT", - "RV9OT0RFX0NMQVNTX0RUT19PQkpFQ1QQARIiCh5CUk9XU0VfTk9ERV9DTEFT", - "U19EVE9fVkFSSUFCTEUQAhIgChxCUk9XU0VfTk9ERV9DTEFTU19EVE9fTUVU", - "SE9EEAMSHwobQlJPV1NFX05PREVfQ0xBU1NfRFRPX09USEVSEAQqoQIKFEJy", - "b3dzZUZhaWx1cmVLaW5kRHRvEicKI0JST1dTRV9GQUlMVVJFX0tJTkRfRFRP", - "X1VOU1BFQ0lGSUVEEAASMAosQlJPV1NFX0ZBSUxVUkVfS0lORF9EVE9fQ09O", - "TkVDVElPTl9OT1RfRk9VTkQQARI0CjBCUk9XU0VfRkFJTFVSRV9LSU5EX0RU", - "T19DT05ORUNUSU9OX05PVF9DT05ORUNURUQQAhIpCiVCUk9XU0VfRkFJTFVS", - "RV9LSU5EX0RUT19OT1RfQlJPV1NBQkxFEAMSIwofQlJPV1NFX0ZBSUxVUkVf", - "S0lORF9EVE9fVElNRU9VVBAEEigKJEJST1dTRV9GQUlMVVJFX0tJTkRfRFRP", - "X1NFUlZFUl9FUlJPUhAFKqoCChtSZWFkVGFnVmFsdWVzRmFpbHVyZUtpbmRE", - "dG8SMAosUkVBRF9UQUdfVkFMVUVTX0ZBSUxVUkVfS0lORF9EVE9fVU5TUEVD", - "SUZJRUQQABI5CjVSRUFEX1RBR19WQUxVRVNfRkFJTFVSRV9LSU5EX0RUT19D", - "T05ORUNUSU9OX05PVF9GT1VORBABEj0KOVJFQURfVEFHX1ZBTFVFU19GQUlM", - "VVJFX0tJTkRfRFRPX0NPTk5FQ1RJT05fTk9UX0NPTk5FQ1RFRBACEiwKKFJF", - "QURfVEFHX1ZBTFVFU19GQUlMVVJFX0tJTkRfRFRPX1RJTUVPVVQQAxIxCi1S", - "RUFEX1RBR19WQUxVRVNfRkFJTFVSRV9LSU5EX0RUT19TRVJWRVJfRVJST1IQ", - "BCqTAgoUVmVyaWZ5RmFpbHVyZUtpbmREdG8SJwojVkVSSUZZX0ZBSUxVUkVf", - "S0lORF9EVE9fVU5TUEVDSUZJRUQQABInCiNWRVJJRllfRkFJTFVSRV9LSU5E", - "X0RUT19VTlJFQUNIQUJMRRABEicKI1ZFUklGWV9GQUlMVVJFX0tJTkRfRFRP", - "X0FVVEhfRkFJTEVEEAISMQotVkVSSUZZX0ZBSUxVUkVfS0lORF9EVE9fVU5U", - "UlVTVEVEX0NFUlRJRklDQVRFEAMSIwofVkVSSUZZX0ZBSUxVUkVfS0lORF9E", - "VE9fVElNRU9VVBAEEigKJFZFUklGWV9GQUlMVVJFX0tJTkRfRFRPX1NFUlZF", - "Ul9FUlJPUhAFKuUBChpTdG9yZUFuZEZvcndhcmRDYXRlZ29yeUR0bxIuCipT", - "VE9SRV9BTkRfRk9SV0FSRF9DQVRFR09SWV9EVE9fVU5TUEVDSUZJRUQQABIy", - "Ci5TVE9SRV9BTkRfRk9SV0FSRF9DQVRFR09SWV9EVE9fRVhURVJOQUxfU1lT", - "VEVNEAESLworU1RPUkVfQU5EX0ZPUldBUkRfQ0FURUdPUllfRFRPX05PVElG", - "SUNBVElPThACEjIKLlNUT1JFX0FORF9GT1JXQVJEX0NBVEVHT1JZX0RUT19D", - "QUNIRURfREJfV1JJVEUQAypoCg1BbGFybVN0YXRlRHRvEh8KG0FMQVJNX1NU", - "QVRFX0RUT19VTlNQRUNJRklFRBAAEhoKFkFMQVJNX1NUQVRFX0RUT19BQ1RJ", - "VkUQARIaChZBTEFSTV9TVEFURV9EVE9fTk9STUFMEAIquQEKDUFsYXJtTGV2", - "ZWxEdG8SHwobQUxBUk1fTEVWRUxfRFRPX1VOU1BFQ0lGSUVEEAASGAoUQUxB", - "Uk1fTEVWRUxfRFRPX05PTkUQARIXChNBTEFSTV9MRVZFTF9EVE9fTE9XEAIS", - "GwoXQUxBUk1fTEVWRUxfRFRPX0xPV19MT1cQAxIYChRBTEFSTV9MRVZFTF9E", - "VE9fSElHSBAEEh0KGUFMQVJNX0xFVkVMX0RUT19ISUdIX0hJR0gQBSqSAQoM", - "QWxhcm1LaW5kRHRvEh4KGkFMQVJNX0tJTkRfRFRPX1VOU1BFQ0lGSUVEEAAS", - "GwoXQUxBUk1fS0lORF9EVE9fQ09NUFVURUQQARIgChxBTEFSTV9LSU5EX0RU", - "T19OQVRJVkVfT1BDX1VBEAISIwofQUxBUk1fS0lORF9EVE9fTkFUSVZFX01Y", - "X0FDQ0VTUxADKugBChNBbGFybVNoZWx2ZVN0YXRlRHRvEiYKIkFMQVJNX1NI", - "RUxWRV9TVEFURV9EVE9fVU5TUEVDSUZJRUQQABIkCiBBTEFSTV9TSEVMVkVf", - "U1RBVEVfRFRPX1VOU0hFTFZFRBABEisKJ0FMQVJNX1NIRUxWRV9TVEFURV9E", - "VE9fT05FX1NIT1RfU0hFTFZFRBACEigKJEFMQVJNX1NIRUxWRV9TVEFURV9E", - "VE9fVElNRURfU0hFTFZFRBADEiwKKEFMQVJNX1NIRUxWRV9TVEFURV9EVE9f", - "UEVSTUFORU5UX1NIRUxWRUQQBDKEBQoSU2l0ZUNvbW1hbmRTZXJ2aWNlEmwK", - "EEV4ZWN1dGVMaWZlY3ljbGUSLC5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52", - "MS5MaWZlY3ljbGVSZXF1ZXN0Giouc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQu", - "djEuTGlmZWN5Y2xlUmVwbHkSYAoMRXhlY3V0ZU9wY1VhEiguc2NhZGFicmlk", - "Z2Uuc2l0ZWNvbW1hbmQudjEuT3BjVWFSZXF1ZXN0GiYuc2NhZGFicmlkZ2Uu", - "c2l0ZWNvbW1hbmQudjEuT3BjVWFSZXBseRJgCgxFeGVjdXRlUXVlcnkSKC5z", - "Y2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5RdWVyeVJlcXVlc3QaJi5zY2Fk", - "YWJyaWRnZS5zaXRlY29tbWFuZC52MS5RdWVyeVJlcGx5EmMKDUV4ZWN1dGVQ", - "YXJrZWQSKS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5QYXJrZWRSZXF1", - "ZXN0Gicuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUGFya2VkUmVwbHkS", - "YAoMRXhlY3V0ZVJvdXRlEiguc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEu", - "Um91dGVSZXF1ZXN0GiYuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91", - "dGVSZXBseRJ1Cg9UcmlnZ2VyRmFpbG92ZXISMi5zY2FkYWJyaWRnZS5zaXRl", - "Y29tbWFuZC52MS5UcmlnZ2VyU2l0ZUZhaWxvdmVyRHRvGi4uc2NhZGFicmlk", - "Z2Uuc2l0ZWNvbW1hbmQudjEuU2l0ZUZhaWxvdmVyQWNrRHRvQiuqAihaQi5N", - "T00uV1cuU2NhZGFCcmlkZ2UuQ29tbXVuaWNhdGlvbi5HcnBjYgZwcm90bzM=")); + "CBIVCg1lcnJvcl9tZXNzYWdlGAMgASgJIk8KF1JldHJ5UGFya2VkT3BlcmF0", + "aW9uRHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJEhwKFHRyYWNrZWRfb3Bl", + "cmF0aW9uX2lkGAIgASgJIlEKGURpc2NhcmRQYXJrZWRPcGVyYXRpb25EdG8S", + "FgoOY29ycmVsYXRpb25faWQYASABKAkSHAoUdHJhY2tlZF9vcGVyYXRpb25f", + "aWQYAiABKAkiXQobUGFya2VkT3BlcmF0aW9uQWN0aW9uQWNrRHRvEhYKDmNv", + "cnJlbGF0aW9uX2lkGAEgASgJEg8KB2FwcGxpZWQYAiABKAgSFQoNZXJyb3Jf", + "bWVzc2FnZRgDIAEoCSLeAwoNUGFya2VkUmVxdWVzdBJYChRwYXJrZWRfbWVz", + "c2FnZV9xdWVyeRgBIAEoCzI4LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYx", + "LlBhcmtlZE1lc3NhZ2VRdWVyeVJlcXVlc3REdG9IABJYChRwYXJrZWRfbWVz", + "c2FnZV9yZXRyeRgCIAEoCzI4LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYx", + "LlBhcmtlZE1lc3NhZ2VSZXRyeVJlcXVlc3REdG9IABJcChZwYXJrZWRfbWVz", + "c2FnZV9kaXNjYXJkGAMgASgLMjouc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQu", + "djEuUGFya2VkTWVzc2FnZURpc2NhcmRSZXF1ZXN0RHRvSAASVQoWcmV0cnlf", + "cGFya2VkX29wZXJhdGlvbhgEIAEoCzIzLnNjYWRhYnJpZGdlLnNpdGVjb21t", + "YW5kLnYxLlJldHJ5UGFya2VkT3BlcmF0aW9uRHRvSAASWQoYZGlzY2FyZF9w", + "YXJrZWRfb3BlcmF0aW9uGAUgASgLMjUuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1h", + "bmQudjEuRGlzY2FyZFBhcmtlZE9wZXJhdGlvbkR0b0gAQgkKB2NvbW1hbmQi", + "hwMKC1BhcmtlZFJlcGx5ElkKFHBhcmtlZF9tZXNzYWdlX3F1ZXJ5GAEgASgL", + "Mjkuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUGFya2VkTWVzc2FnZVF1", + "ZXJ5UmVzcG9uc2VEdG9IABJZChRwYXJrZWRfbWVzc2FnZV9yZXRyeRgCIAEo", + "CzI5LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlBhcmtlZE1lc3NhZ2VS", + "ZXRyeVJlc3BvbnNlRHRvSAASXQoWcGFya2VkX21lc3NhZ2VfZGlzY2FyZBgD", + "IAEoCzI7LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlBhcmtlZE1lc3Nh", + "Z2VEaXNjYXJkUmVzcG9uc2VEdG9IABJaChdwYXJrZWRfb3BlcmF0aW9uX2Fj", + "dGlvbhgEIAEoCzI3LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlBhcmtl", + "ZE9wZXJhdGlvbkFjdGlvbkFja0R0b0gAQgcKBXJlcGx5IvwBChVSb3V0ZVRv", + "Q2FsbFJlcXVlc3REdG8SFgoOY29ycmVsYXRpb25faWQYASABKAkSHAoUaW5z", + "dGFuY2VfdW5pcXVlX25hbWUYAiABKAkSEwoLc2NyaXB0X25hbWUYAyABKAkS", + "PQoKcGFyYW1ldGVycxgEIAEoCzIpLnNjYWRhYnJpZGdlLnNpdGVjb21tYW5k", + "LnYxLkxvb3NlVmFsdWVNYXASLQoJdGltZXN0YW1wGAUgASgLMhouZ29vZ2xl", + "LnByb3RvYnVmLlRpbWVzdGFtcBIbChNwYXJlbnRfZXhlY3V0aW9uX2lkGAYg", + "ASgJEg0KBXRyYWNlGAcgASgIIpICChZSb3V0ZVRvQ2FsbFJlc3BvbnNlRHRv", + "EhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJEg8KB3N1Y2Nlc3MYAiABKAgSPAoM", + "cmV0dXJuX3ZhbHVlGAMgASgLMiYuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQu", + "djEuTG9vc2VWYWx1ZRIVCg1lcnJvcl9tZXNzYWdlGAQgASgJEi0KCXRpbWVz", + "dGFtcBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASGgoSY2hp", + "bGRfZXhlY3V0aW9uX2lkGAYgASgJEi8KDHRyYWNlX2V2ZW50cxgHIAMoCzIZ", + "LnNpdGVzdHJlYW0uQXVkaXRFdmVudER0byK7AQoeUm91dGVUb0dldEF0dHJp", + "YnV0ZXNSZXF1ZXN0RHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJEhwKFGlu", + "c3RhbmNlX3VuaXF1ZV9uYW1lGAIgASgJEhcKD2F0dHJpYnV0ZV9uYW1lcxgD", + "IAMoCRItCgl0aW1lc3RhbXAYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGlt", + "ZXN0YW1wEhsKE3BhcmVudF9leGVjdXRpb25faWQYBSABKAkiywEKH1JvdXRl", + "VG9HZXRBdHRyaWJ1dGVzUmVzcG9uc2VEdG8SFgoOY29ycmVsYXRpb25faWQY", + "ASABKAkSOQoGdmFsdWVzGAIgASgLMikuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1h", + "bmQudjEuTG9vc2VWYWx1ZU1hcBIPCgdzdWNjZXNzGAMgASgIEhUKDWVycm9y", + "X21lc3NhZ2UYBCABKAkSLQoJdGltZXN0YW1wGAUgASgLMhouZ29vZ2xlLnBy", + "b3RvYnVmLlRpbWVzdGFtcCLUAgoeUm91dGVUb1NldEF0dHJpYnV0ZXNSZXF1", + "ZXN0RHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJEhwKFGluc3RhbmNlX3Vu", + "aXF1ZV9uYW1lGAIgASgJEmkKEGF0dHJpYnV0ZV92YWx1ZXMYAyADKAsyTy5z", + "Y2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5Sb3V0ZVRvU2V0QXR0cmlidXRl", + "c1JlcXVlc3REdG8uQXR0cmlidXRlVmFsdWVzRW50cnkSLQoJdGltZXN0YW1w", + "GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIbChNwYXJlbnRf", + "ZXhlY3V0aW9uX2lkGAUgASgJEg0KBXRyYWNlGAYgASgIGjYKFEF0dHJpYnV0", + "ZVZhbHVlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEi", + "kAEKH1JvdXRlVG9TZXRBdHRyaWJ1dGVzUmVzcG9uc2VEdG8SFgoOY29ycmVs", + "YXRpb25faWQYASABKAkSDwoHc3VjY2VzcxgCIAEoCBIVCg1lcnJvcl9tZXNz", + "YWdlGAMgASgJEi0KCXRpbWVzdGFtcBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1", + "Zi5UaW1lc3RhbXAiwwIKIVJvdXRlVG9XYWl0Rm9yQXR0cmlidXRlUmVxdWVz", + "dER0bxIWCg5jb3JyZWxhdGlvbl9pZBgBIAEoCRIcChRpbnN0YW5jZV91bmlx", + "dWVfbmFtZRgCIAEoCRIWCg5hdHRyaWJ1dGVfbmFtZRgDIAEoCRI6ChR0YXJn", + "ZXRfdmFsdWVfZW5jb2RlZBgEIAEoCzIcLmdvb2dsZS5wcm90b2J1Zi5TdHJp", + "bmdWYWx1ZRIqCgd0aW1lb3V0GAUgASgLMhkuZ29vZ2xlLnByb3RvYnVmLkR1", + "cmF0aW9uEi0KCXRpbWVzdGFtcBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5U", + "aW1lc3RhbXASGwoTcGFyZW50X2V4ZWN1dGlvbl9pZBgHIAEoCRIcChRyZXF1", + "aXJlX2dvb2RfcXVhbGl0eRgIIAEoCCL/AQoiUm91dGVUb1dhaXRGb3JBdHRy", + "aWJ1dGVSZXNwb25zZUR0bxIWCg5jb3JyZWxhdGlvbl9pZBgBIAEoCRIPCgdt", + "YXRjaGVkGAIgASgIEjUKBXZhbHVlGAMgASgLMiYuc2NhZGFicmlkZ2Uuc2l0", + "ZWNvbW1hbmQudjEuTG9vc2VWYWx1ZRIPCgdxdWFsaXR5GAQgASgJEhEKCXRp", + "bWVkX291dBgFIAEoCBIPCgdzdWNjZXNzGAYgASgIEhUKDWVycm9yX21lc3Nh", + "Z2UYByABKAkSLQoJdGltZXN0YW1wGAggASgLMhouZ29vZ2xlLnByb3RvYnVm", + "LlRpbWVzdGFtcCKJAwoMUm91dGVSZXF1ZXN0EkoKDXJvdXRlX3RvX2NhbGwY", + "ASABKAsyMS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5Sb3V0ZVRvQ2Fs", + "bFJlcXVlc3REdG9IABJdChdyb3V0ZV90b19nZXRfYXR0cmlidXRlcxgCIAEo", + "CzI6LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlJvdXRlVG9HZXRBdHRy", + "aWJ1dGVzUmVxdWVzdER0b0gAEl0KF3JvdXRlX3RvX3NldF9hdHRyaWJ1dGVz", + "GAMgASgLMjouc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVUb1Nl", + "dEF0dHJpYnV0ZXNSZXF1ZXN0RHRvSAASZAobcm91dGVfdG9fd2FpdF9mb3Jf", + "YXR0cmlidXRlGAQgASgLMj0uc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEu", + "Um91dGVUb1dhaXRGb3JBdHRyaWJ1dGVSZXF1ZXN0RHRvSABCCQoHY29tbWFu", + "ZCKJAwoKUm91dGVSZXBseRJLCg1yb3V0ZV90b19jYWxsGAEgASgLMjIuc2Nh", + "ZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVUb0NhbGxSZXNwb25zZUR0", + "b0gAEl4KF3JvdXRlX3RvX2dldF9hdHRyaWJ1dGVzGAIgASgLMjsuc2NhZGFi", + "cmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVUb0dldEF0dHJpYnV0ZXNSZXNw", + "b25zZUR0b0gAEl4KF3JvdXRlX3RvX3NldF9hdHRyaWJ1dGVzGAMgASgLMjsu", + "c2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVUb1NldEF0dHJpYnV0", + "ZXNSZXNwb25zZUR0b0gAEmUKG3JvdXRlX3RvX3dhaXRfZm9yX2F0dHJpYnV0", + "ZRgEIAEoCzI+LnNjYWRhYnJpZGdlLnNpdGVjb21tYW5kLnYxLlJvdXRlVG9X", + "YWl0Rm9yQXR0cmlidXRlUmVzcG9uc2VEdG9IAEIHCgVyZXBseSJBChZUcmln", + "Z2VyU2l0ZUZhaWxvdmVyRHRvEhYKDmNvcnJlbGF0aW9uX2lkGAEgASgJEg8K", + "B3NpdGVfaWQYAiABKAkibQoSU2l0ZUZhaWxvdmVyQWNrRHRvEhYKDmNvcnJl", + "bGF0aW9uX2lkGAEgASgJEhAKCGFjY2VwdGVkGAIgASgIEhYKDnRhcmdldF9h", + "ZGRyZXNzGAMgASgJEhUKDWVycm9yX21lc3NhZ2UYBCABKAkqywEKE0RlcGxv", + "eW1lbnRTdGF0dXNEdG8SJQohREVQTE9ZTUVOVF9TVEFUVVNfRFRPX1VOU1BF", + "Q0lGSUVEEAASIQodREVQTE9ZTUVOVF9TVEFUVVNfRFRPX1BFTkRJTkcQARIl", + "CiFERVBMT1lNRU5UX1NUQVRVU19EVE9fSU5fUFJPR1JFU1MQAhIhCh1ERVBM", + "T1lNRU5UX1NUQVRVU19EVE9fU1VDQ0VTUxADEiAKHERFUExPWU1FTlRfU1RB", + "VFVTX0RUT19GQUlMRUQQBCrEAQoSQnJvd3NlTm9kZUNsYXNzRHRvEiUKIUJS", + "T1dTRV9OT0RFX0NMQVNTX0RUT19VTlNQRUNJRklFRBAAEiAKHEJST1dTRV9O", + "T0RFX0NMQVNTX0RUT19PQkpFQ1QQARIiCh5CUk9XU0VfTk9ERV9DTEFTU19E", + "VE9fVkFSSUFCTEUQAhIgChxCUk9XU0VfTk9ERV9DTEFTU19EVE9fTUVUSE9E", + "EAMSHwobQlJPV1NFX05PREVfQ0xBU1NfRFRPX09USEVSEAQqoQIKFEJyb3dz", + "ZUZhaWx1cmVLaW5kRHRvEicKI0JST1dTRV9GQUlMVVJFX0tJTkRfRFRPX1VO", + "U1BFQ0lGSUVEEAASMAosQlJPV1NFX0ZBSUxVUkVfS0lORF9EVE9fQ09OTkVD", + "VElPTl9OT1RfRk9VTkQQARI0CjBCUk9XU0VfRkFJTFVSRV9LSU5EX0RUT19D", + "T05ORUNUSU9OX05PVF9DT05ORUNURUQQAhIpCiVCUk9XU0VfRkFJTFVSRV9L", + "SU5EX0RUT19OT1RfQlJPV1NBQkxFEAMSIwofQlJPV1NFX0ZBSUxVUkVfS0lO", + "RF9EVE9fVElNRU9VVBAEEigKJEJST1dTRV9GQUlMVVJFX0tJTkRfRFRPX1NF", + "UlZFUl9FUlJPUhAFKqoCChtSZWFkVGFnVmFsdWVzRmFpbHVyZUtpbmREdG8S", + "MAosUkVBRF9UQUdfVkFMVUVTX0ZBSUxVUkVfS0lORF9EVE9fVU5TUEVDSUZJ", + "RUQQABI5CjVSRUFEX1RBR19WQUxVRVNfRkFJTFVSRV9LSU5EX0RUT19DT05O", + "RUNUSU9OX05PVF9GT1VORBABEj0KOVJFQURfVEFHX1ZBTFVFU19GQUlMVVJF", + "X0tJTkRfRFRPX0NPTk5FQ1RJT05fTk9UX0NPTk5FQ1RFRBACEiwKKFJFQURf", + "VEFHX1ZBTFVFU19GQUlMVVJFX0tJTkRfRFRPX1RJTUVPVVQQAxIxCi1SRUFE", + "X1RBR19WQUxVRVNfRkFJTFVSRV9LSU5EX0RUT19TRVJWRVJfRVJST1IQBCqT", + "AgoUVmVyaWZ5RmFpbHVyZUtpbmREdG8SJwojVkVSSUZZX0ZBSUxVUkVfS0lO", + "RF9EVE9fVU5TUEVDSUZJRUQQABInCiNWRVJJRllfRkFJTFVSRV9LSU5EX0RU", + "T19VTlJFQUNIQUJMRRABEicKI1ZFUklGWV9GQUlMVVJFX0tJTkRfRFRPX0FV", + "VEhfRkFJTEVEEAISMQotVkVSSUZZX0ZBSUxVUkVfS0lORF9EVE9fVU5UUlVT", + "VEVEX0NFUlRJRklDQVRFEAMSIwofVkVSSUZZX0ZBSUxVUkVfS0lORF9EVE9f", + "VElNRU9VVBAEEigKJFZFUklGWV9GQUlMVVJFX0tJTkRfRFRPX1NFUlZFUl9F", + "UlJPUhAFKuUBChpTdG9yZUFuZEZvcndhcmRDYXRlZ29yeUR0bxIuCipTVE9S", + "RV9BTkRfRk9SV0FSRF9DQVRFR09SWV9EVE9fVU5TUEVDSUZJRUQQABIyCi5T", + "VE9SRV9BTkRfRk9SV0FSRF9DQVRFR09SWV9EVE9fRVhURVJOQUxfU1lTVEVN", + "EAESLworU1RPUkVfQU5EX0ZPUldBUkRfQ0FURUdPUllfRFRPX05PVElGSUNB", + "VElPThACEjIKLlNUT1JFX0FORF9GT1JXQVJEX0NBVEVHT1JZX0RUT19DQUNI", + "RURfREJfV1JJVEUQAypoCg1BbGFybVN0YXRlRHRvEh8KG0FMQVJNX1NUQVRF", + "X0RUT19VTlNQRUNJRklFRBAAEhoKFkFMQVJNX1NUQVRFX0RUT19BQ1RJVkUQ", + "ARIaChZBTEFSTV9TVEFURV9EVE9fTk9STUFMEAIquQEKDUFsYXJtTGV2ZWxE", + "dG8SHwobQUxBUk1fTEVWRUxfRFRPX1VOU1BFQ0lGSUVEEAASGAoUQUxBUk1f", + "TEVWRUxfRFRPX05PTkUQARIXChNBTEFSTV9MRVZFTF9EVE9fTE9XEAISGwoX", + "QUxBUk1fTEVWRUxfRFRPX0xPV19MT1cQAxIYChRBTEFSTV9MRVZFTF9EVE9f", + "SElHSBAEEh0KGUFMQVJNX0xFVkVMX0RUT19ISUdIX0hJR0gQBSqSAQoMQWxh", + "cm1LaW5kRHRvEh4KGkFMQVJNX0tJTkRfRFRPX1VOU1BFQ0lGSUVEEAASGwoX", + "QUxBUk1fS0lORF9EVE9fQ09NUFVURUQQARIgChxBTEFSTV9LSU5EX0RUT19O", + "QVRJVkVfT1BDX1VBEAISIwofQUxBUk1fS0lORF9EVE9fTkFUSVZFX01YX0FD", + "Q0VTUxADKugBChNBbGFybVNoZWx2ZVN0YXRlRHRvEiYKIkFMQVJNX1NIRUxW", + "RV9TVEFURV9EVE9fVU5TUEVDSUZJRUQQABIkCiBBTEFSTV9TSEVMVkVfU1RB", + "VEVfRFRPX1VOU0hFTFZFRBABEisKJ0FMQVJNX1NIRUxWRV9TVEFURV9EVE9f", + "T05FX1NIT1RfU0hFTFZFRBACEigKJEFMQVJNX1NIRUxWRV9TVEFURV9EVE9f", + "VElNRURfU0hFTFZFRBADEiwKKEFMQVJNX1NIRUxWRV9TVEFURV9EVE9fUEVS", + "TUFORU5UX1NIRUxWRUQQBDKEBQoSU2l0ZUNvbW1hbmRTZXJ2aWNlEmwKEEV4", + "ZWN1dGVMaWZlY3ljbGUSLC5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5M", + "aWZlY3ljbGVSZXF1ZXN0Giouc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEu", + "TGlmZWN5Y2xlUmVwbHkSYAoMRXhlY3V0ZU9wY1VhEiguc2NhZGFicmlkZ2Uu", + "c2l0ZWNvbW1hbmQudjEuT3BjVWFSZXF1ZXN0GiYuc2NhZGFicmlkZ2Uuc2l0", + "ZWNvbW1hbmQudjEuT3BjVWFSZXBseRJgCgxFeGVjdXRlUXVlcnkSKC5zY2Fk", + "YWJyaWRnZS5zaXRlY29tbWFuZC52MS5RdWVyeVJlcXVlc3QaJi5zY2FkYWJy", + "aWRnZS5zaXRlY29tbWFuZC52MS5RdWVyeVJlcGx5EmMKDUV4ZWN1dGVQYXJr", + "ZWQSKS5zY2FkYWJyaWRnZS5zaXRlY29tbWFuZC52MS5QYXJrZWRSZXF1ZXN0", + "Gicuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUGFya2VkUmVwbHkSYAoM", + "RXhlY3V0ZVJvdXRlEiguc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91", + "dGVSZXF1ZXN0GiYuc2NhZGFicmlkZ2Uuc2l0ZWNvbW1hbmQudjEuUm91dGVS", + "ZXBseRJ1Cg9UcmlnZ2VyRmFpbG92ZXISMi5zY2FkYWJyaWRnZS5zaXRlY29t", + "bWFuZC52MS5UcmlnZ2VyU2l0ZUZhaWxvdmVyRHRvGi4uc2NhZGFicmlkZ2Uu", + "c2l0ZWNvbW1hbmQudjEuU2l0ZUZhaWxvdmVyQWNrRHRvQiuqAihaQi5NT00u", + "V1cuU2NhZGFCcmlkZ2UuQ29tbXVuaWNhdGlvbi5HcnBjYgZwcm90bzM=")); descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData, - new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, }, + new pbr::FileDescriptor[] { global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.DurationReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.WrappersReflection.Descriptor, global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.SitestreamReflection.Descriptor, }, new pbr::GeneratedClrTypeInfo(new[] {typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.DeploymentStatusDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.BrowseNodeClassDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.BrowseFailureKindDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.ReadTagValuesFailureKindDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.VerifyFailureKindDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.StoreAndForwardCategoryDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.AlarmStateDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.AlarmLevelDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.AlarmKindDto), typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.AlarmShelveStateDto), }, null, new pbr::GeneratedClrTypeInfo[] { new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.LooseNull), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.LooseNull.Parser, null, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.LooseValueList), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.LooseValueList.Parser, new[]{ "Items" }, null, null, null, null), @@ -578,11 +581,11 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.ParkedOperationActionAckDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.ParkedOperationActionAckDto.Parser, new[]{ "CorrelationId", "Applied", "ErrorMessage" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.ParkedRequest), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.ParkedRequest.Parser, new[]{ "ParkedMessageQuery", "ParkedMessageRetry", "ParkedMessageDiscard", "RetryParkedOperation", "DiscardParkedOperation" }, new[]{ "Command" }, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.ParkedReply), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.ParkedReply.Parser, new[]{ "ParkedMessageQuery", "ParkedMessageRetry", "ParkedMessageDiscard", "ParkedOperationAction" }, new[]{ "Reply" }, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToCallRequestDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToCallRequestDto.Parser, new[]{ "CorrelationId", "InstanceUniqueName", "ScriptName", "Parameters", "Timestamp", "ParentExecutionId" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToCallResponseDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToCallResponseDto.Parser, new[]{ "CorrelationId", "Success", "ReturnValue", "ErrorMessage", "Timestamp" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToCallRequestDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToCallRequestDto.Parser, new[]{ "CorrelationId", "InstanceUniqueName", "ScriptName", "Parameters", "Timestamp", "ParentExecutionId", "Trace" }, null, null, null, null), + new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToCallResponseDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToCallResponseDto.Parser, new[]{ "CorrelationId", "Success", "ReturnValue", "ErrorMessage", "Timestamp", "ChildExecutionId", "TraceEvents" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToGetAttributesRequestDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToGetAttributesRequestDto.Parser, new[]{ "CorrelationId", "InstanceUniqueName", "AttributeNames", "Timestamp", "ParentExecutionId" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToGetAttributesResponseDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToGetAttributesResponseDto.Parser, new[]{ "CorrelationId", "Values", "Success", "ErrorMessage", "Timestamp" }, null, null, null, null), - new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToSetAttributesRequestDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToSetAttributesRequestDto.Parser, new[]{ "CorrelationId", "InstanceUniqueName", "AttributeValues", "Timestamp", "ParentExecutionId" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, }), + new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToSetAttributesRequestDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToSetAttributesRequestDto.Parser, new[]{ "CorrelationId", "InstanceUniqueName", "AttributeValues", "Timestamp", "ParentExecutionId", "Trace" }, null, null, null, new pbr::GeneratedClrTypeInfo[] { null, }), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToSetAttributesResponseDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToSetAttributesResponseDto.Parser, new[]{ "CorrelationId", "Success", "ErrorMessage", "Timestamp" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToWaitForAttributeRequestDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToWaitForAttributeRequestDto.Parser, new[]{ "CorrelationId", "InstanceUniqueName", "AttributeName", "TargetValueEncoded", "Timeout", "Timestamp", "ParentExecutionId", "RequireGoodQuality" }, null, null, null, null), new pbr::GeneratedClrTypeInfo(typeof(global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToWaitForAttributeResponseDto), global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.RouteToWaitForAttributeResponseDto.Parser, new[]{ "CorrelationId", "Matched", "Value", "Quality", "TimedOut", "Success", "ErrorMessage", "Timestamp" }, null, null, null, null), @@ -27496,6 +27499,7 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { parameters_ = other.parameters_ != null ? other.parameters_.Clone() : null; timestamp_ = other.timestamp_ != null ? other.timestamp_.Clone() : null; parentExecutionId_ = other.parentExecutionId_; + trace_ = other.trace_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -27583,6 +27587,22 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { } } + /// Field number for the "trace" field. + public const int TraceFieldNumber = 7; + private bool trace_; + /// + /// Flow Debugger trace flag (design 2026-09-05 §5.2). proto3 default false = untraced, + /// which is what an older central sends and what an older site reads. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Trace { + get { return trace_; } + set { + trace_ = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -27604,6 +27624,7 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (!object.Equals(Parameters, other.Parameters)) return false; if (!object.Equals(Timestamp, other.Timestamp)) return false; if (ParentExecutionId != other.ParentExecutionId) return false; + if (Trace != other.Trace) return false; return Equals(_unknownFields, other._unknownFields); } @@ -27617,6 +27638,7 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (parameters_ != null) hash ^= Parameters.GetHashCode(); if (timestamp_ != null) hash ^= Timestamp.GetHashCode(); if (ParentExecutionId.Length != 0) hash ^= ParentExecutionId.GetHashCode(); + if (Trace != false) hash ^= Trace.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -27659,6 +27681,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { output.WriteRawTag(50); output.WriteString(ParentExecutionId); } + if (Trace != false) { + output.WriteRawTag(56); + output.WriteBool(Trace); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -27693,6 +27719,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { output.WriteRawTag(50); output.WriteString(ParentExecutionId); } + if (Trace != false) { + output.WriteRawTag(56); + output.WriteBool(Trace); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -27721,6 +27751,9 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (ParentExecutionId.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(ParentExecutionId); } + if (Trace != false) { + size += 1 + 1; + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -27757,6 +27790,9 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (other.ParentExecutionId.Length != 0) { ParentExecutionId = other.ParentExecutionId; } + if (other.Trace != false) { + Trace = other.Trace; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -27806,6 +27842,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { ParentExecutionId = input.ReadString(); break; } + case 56: { + Trace = input.ReadBool(); + break; + } } } #endif @@ -27855,6 +27895,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { ParentExecutionId = input.ReadString(); break; } + case 56: { + Trace = input.ReadBool(); + break; + } } } } @@ -27902,6 +27946,8 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { returnValue_ = other.returnValue_ != null ? other.returnValue_.Clone() : null; errorMessage_ = other.errorMessage_; timestamp_ = other.timestamp_ != null ? other.timestamp_.Clone() : null; + childExecutionId_ = other.childExecutionId_; + traceEvents_ = other.traceEvents_.Clone(); _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -27977,6 +28023,37 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { } } + /// Field number for the "child_execution_id" field. + public const int ChildExecutionIdFieldNumber = 6; + private string childExecutionId_ = ""; + /// + /// Flow Debugger (design §5.4): the routed site run's ExecutionId ("D" GUID form; + /// empty represents null — an older site never sets it). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public string ChildExecutionId { + get { return childExecutionId_; } + set { + childExecutionId_ = pb::ProtoPreconditions.CheckNotNull(value, "value"); + } + } + + /// Field number for the "trace_events" field. + public const int TraceEventsFieldNumber = 7; + private static readonly pb::FieldCodec _repeated_traceEvents_codec + = pb::FieldCodec.ForMessage(58, global::ZB.MOM.WW.ScadaBridge.Communication.Grpc.AuditEventDto.Parser); + private readonly pbc::RepeatedField traceEvents_ = new pbc::RepeatedField(); + /// + /// Flow Debugger (design §5.4): the site's ScriptTrace audit events for a traced run, + /// in emission order. Empty from an untraced run or an older site (mapper => null). + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public pbc::RepeatedField TraceEvents { + get { return traceEvents_; } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -27997,6 +28074,8 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (!object.Equals(ReturnValue, other.ReturnValue)) return false; if (ErrorMessage != other.ErrorMessage) return false; if (!object.Equals(Timestamp, other.Timestamp)) return false; + if (ChildExecutionId != other.ChildExecutionId) return false; + if(!traceEvents_.Equals(other.traceEvents_)) return false; return Equals(_unknownFields, other._unknownFields); } @@ -28009,6 +28088,8 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (returnValue_ != null) hash ^= ReturnValue.GetHashCode(); if (ErrorMessage.Length != 0) hash ^= ErrorMessage.GetHashCode(); if (timestamp_ != null) hash ^= Timestamp.GetHashCode(); + if (ChildExecutionId.Length != 0) hash ^= ChildExecutionId.GetHashCode(); + hash ^= traceEvents_.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -28047,6 +28128,11 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { output.WriteRawTag(42); output.WriteMessage(Timestamp); } + if (ChildExecutionId.Length != 0) { + output.WriteRawTag(50); + output.WriteString(ChildExecutionId); + } + traceEvents_.WriteTo(output, _repeated_traceEvents_codec); if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -28077,6 +28163,11 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { output.WriteRawTag(42); output.WriteMessage(Timestamp); } + if (ChildExecutionId.Length != 0) { + output.WriteRawTag(50); + output.WriteString(ChildExecutionId); + } + traceEvents_.WriteTo(ref output, _repeated_traceEvents_codec); if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -28102,6 +28193,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (timestamp_ != null) { size += 1 + pb::CodedOutputStream.ComputeMessageSize(Timestamp); } + if (ChildExecutionId.Length != 0) { + size += 1 + pb::CodedOutputStream.ComputeStringSize(ChildExecutionId); + } + size += traceEvents_.CalculateSize(_repeated_traceEvents_codec); if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -28135,6 +28230,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { } Timestamp.MergeFrom(other.Timestamp); } + if (other.ChildExecutionId.Length != 0) { + ChildExecutionId = other.ChildExecutionId; + } + traceEvents_.Add(other.traceEvents_); _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -28180,6 +28279,14 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { input.ReadMessage(Timestamp); break; } + case 50: { + ChildExecutionId = input.ReadString(); + break; + } + case 58: { + traceEvents_.AddEntriesFrom(input, _repeated_traceEvents_codec); + break; + } } } #endif @@ -28225,6 +28332,14 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { input.ReadMessage(Timestamp); break; } + case 50: { + ChildExecutionId = input.ReadString(); + break; + } + case 58: { + traceEvents_.AddEntriesFrom(ref input, _repeated_traceEvents_codec); + break; + } } } } @@ -28989,6 +29104,7 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { attributeValues_ = other.attributeValues_.Clone(); timestamp_ = other.timestamp_ != null ? other.timestamp_.Clone() : null; parentExecutionId_ = other.parentExecutionId_; + trace_ = other.trace_; _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields); } @@ -29060,6 +29176,21 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { } } + /// Field number for the "trace" field. + public const int TraceFieldNumber = 6; + private bool trace_; + /// + /// Flow Debugger trace flag (design 2026-09-05 §5.2/§5.3): arms the echo stamp. + /// + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] + [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] + public bool Trace { + get { return trace_; } + set { + trace_ = value; + } + } + [global::System.Diagnostics.DebuggerNonUserCodeAttribute] [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)] public override bool Equals(object other) { @@ -29080,6 +29211,7 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (!AttributeValues.Equals(other.AttributeValues)) return false; if (!object.Equals(Timestamp, other.Timestamp)) return false; if (ParentExecutionId != other.ParentExecutionId) return false; + if (Trace != other.Trace) return false; return Equals(_unknownFields, other._unknownFields); } @@ -29092,6 +29224,7 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { hash ^= AttributeValues.GetHashCode(); if (timestamp_ != null) hash ^= Timestamp.GetHashCode(); if (ParentExecutionId.Length != 0) hash ^= ParentExecutionId.GetHashCode(); + if (Trace != false) hash ^= Trace.GetHashCode(); if (_unknownFields != null) { hash ^= _unknownFields.GetHashCode(); } @@ -29127,6 +29260,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { output.WriteRawTag(42); output.WriteString(ParentExecutionId); } + if (Trace != false) { + output.WriteRawTag(48); + output.WriteBool(Trace); + } if (_unknownFields != null) { _unknownFields.WriteTo(output); } @@ -29154,6 +29291,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { output.WriteRawTag(42); output.WriteString(ParentExecutionId); } + if (Trace != false) { + output.WriteRawTag(48); + output.WriteBool(Trace); + } if (_unknownFields != null) { _unknownFields.WriteTo(ref output); } @@ -29177,6 +29318,9 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (ParentExecutionId.Length != 0) { size += 1 + pb::CodedOutputStream.ComputeStringSize(ParentExecutionId); } + if (Trace != false) { + size += 1 + 1; + } if (_unknownFields != null) { size += _unknownFields.CalculateSize(); } @@ -29205,6 +29349,9 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { if (other.ParentExecutionId.Length != 0) { ParentExecutionId = other.ParentExecutionId; } + if (other.Trace != false) { + Trace = other.Trace; + } _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields); } @@ -29247,6 +29394,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { ParentExecutionId = input.ReadString(); break; } + case 48: { + Trace = input.ReadBool(); + break; + } } } #endif @@ -29289,6 +29440,10 @@ namespace ZB.MOM.WW.ScadaBridge.Communication.Grpc { ParentExecutionId = input.ReadString(); break; } + case 48: { + Trace = input.ReadBool(); + break; + } } } } diff --git a/tests/ZB.MOM.WW.ScadaBridge.Communication.Tests/SiteCommandDtoMapperTraceTests.cs b/tests/ZB.MOM.WW.ScadaBridge.Communication.Tests/SiteCommandDtoMapperTraceTests.cs new file mode 100644 index 00000000..55725b41 --- /dev/null +++ b/tests/ZB.MOM.WW.ScadaBridge.Communication.Tests/SiteCommandDtoMapperTraceTests.cs @@ -0,0 +1,95 @@ +using ZB.MOM.WW.ScadaBridge.Commons.Messages.InboundApi; +using ZB.MOM.WW.ScadaBridge.Commons.Types.Audit; +using ZB.MOM.WW.ScadaBridge.Commons.Types.Debugging; +using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums; +using ZB.MOM.WW.ScadaBridge.Communication.Grpc; + +namespace ZB.MOM.WW.ScadaBridge.Communication.Tests; + +/// +/// Flow Debugger (design 2026-09-05 §5.2/§5.4): the site_command.proto trace fields — the +/// trace flag on both route requests, and child_execution_id + +/// trace_events on the call response — round-trip through +/// , and an old-shape DTO (no fields set) maps to the +/// untraced defaults. +/// +public class SiteCommandDtoMapperTraceTests +{ + private static readonly DateTimeOffset T = new(2026, 9, 5, 12, 0, 0, TimeSpan.Zero); + + [Fact] + public void RouteToCallResponse_RoundTrips_ChildExecutionId_AndTraceEvents() + { + var child = Guid.NewGuid(); + var run = ScadaBridgeAuditEventFactory.Create(AuditChannel.ScriptTrace, AuditKind.ScriptRun, AuditStatus.Delivered, + occurredAtUtc: T.UtcDateTime, actor: "ScriptActor:S", target: "S", sourceNode: "node-b", + executionId: child, parentExecutionId: Guid.NewGuid(), sourceSiteId: "site-a", durationMs: 40, + requestSummary: "{\"x\":1}", responseSummary: "\"ok\"", + extra: new ScriptTraceExtra { TriggerKind = "call" }.ToJson()); + var write = ScadaBridgeAuditEventFactory.Create(AuditChannel.ScriptTrace, AuditKind.AttributeWrite, AuditStatus.Delivered, + occurredAtUtc: T.UtcDateTime.AddMilliseconds(5), actor: "ScriptActor:S", target: "A", executionId: child, + extra: new ScriptTraceExtra { Writes = [new AttributeWriteDetail("A", "1", true, null)] }.ToJson()); + var original = new RouteToCallResponse("c", true, 7L, null, T, child, [run, write]); + + var restored = SiteCommandDtoMapper.FromProto(SiteCommandDtoMapper.ToProto(original)); + + Assert.Equal(child, restored.ChildExecutionId); + Assert.NotNull(restored.TraceEvents); + Assert.Equal(2, restored.TraceEvents!.Count); + Assert.Equal(run.Action, restored.TraceEvents[0].Action); + Assert.Equal(run.DetailsJson, restored.TraceEvents[0].DetailsJson); + Assert.Equal(write.EventId, restored.TraceEvents[1].EventId); + Assert.Equal(original, restored with { TraceEvents = original.TraceEvents }); + Assert.Equal(run, restored.TraceEvents[0]); + } + + [Fact] + public void OldShapeDtos_MapToUntracedDefaults() + { + // A DTO from a site/central that predates the fields: proto3 defaults everywhere. + var call = SiteCommandDtoMapper.FromProto(new RouteToCallRequestDto + { + CorrelationId = "c", InstanceUniqueName = "i", ScriptName = "s", + Timestamp = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTimeOffset(T), + }); + Assert.False(call.Trace); + + var set = SiteCommandDtoMapper.FromProto(new RouteToSetAttributesRequestDto + { + CorrelationId = "c", InstanceUniqueName = "i", + Timestamp = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTimeOffset(T), + }); + Assert.False(set.Trace); + + var reply = SiteCommandDtoMapper.FromProto(new RouteToCallResponseDto + { + CorrelationId = "c", Success = true, + Timestamp = Google.Protobuf.WellKnownTypes.Timestamp.FromDateTimeOffset(T), + }); + Assert.Null(reply.ChildExecutionId); + Assert.Null(reply.TraceEvents); + } + + [Fact] + public void TraceFlag_PropagatesOnBothRequests() + { + var call = new RouteToCallRequest("c", "i", "s", null, T, Guid.NewGuid(), Trace: true); + Assert.True(SiteCommandDtoMapper.ToProto(call).Trace); + Assert.True(SiteCommandDtoMapper.FromProto(SiteCommandDtoMapper.ToProto(call)).Trace); + + var set = new RouteToSetAttributesRequest("c", "i", new Dictionary { ["a"] = "1" }, T, Guid.NewGuid(), Trace: true); + Assert.True(SiteCommandDtoMapper.ToProto(set).Trace); + Assert.True(SiteCommandDtoMapper.FromProto(SiteCommandDtoMapper.ToProto(set)).Trace); + } + + [Fact] + public void EmptyTraceEventsList_MapsToNull_NotEmpty() + { + // An untraced run sends none; the CLR side distinguishes "none" (null) so the UI can + // label the site lane — an empty list would read as "traced, did nothing". + var original = new RouteToCallResponse("c", true, null, null, T, Guid.NewGuid(), Array.Empty()); + var restored = SiteCommandDtoMapper.FromProto(SiteCommandDtoMapper.ToProto(original)); + Assert.Null(restored.TraceEvents); + Assert.Equal(original.ChildExecutionId, restored.ChildExecutionId); + } +} diff --git a/tests/ZB.MOM.WW.ScadaBridge.Communication.Tests/SiteCommandSamples.cs b/tests/ZB.MOM.WW.ScadaBridge.Communication.Tests/SiteCommandSamples.cs index ab67bfbf..0a79ef18 100644 --- a/tests/ZB.MOM.WW.ScadaBridge.Communication.Tests/SiteCommandSamples.cs +++ b/tests/ZB.MOM.WW.ScadaBridge.Communication.Tests/SiteCommandSamples.cs @@ -1,3 +1,4 @@ +using ZB.MOM.WW.Audit; using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Protocol; using ZB.MOM.WW.ScadaBridge.Commons.Messages.Artifacts; using ZB.MOM.WW.ScadaBridge.Commons.Messages.DataConnection; @@ -10,6 +11,8 @@ using ZB.MOM.WW.ScadaBridge.Commons.Messages.RemoteQuery; using ZB.MOM.WW.ScadaBridge.Commons.Messages.Streaming; using ZB.MOM.WW.ScadaBridge.Commons.Types; using ZB.MOM.WW.ScadaBridge.Commons.Types.Alarms; +using ZB.MOM.WW.ScadaBridge.Commons.Types.Audit; +using ZB.MOM.WW.ScadaBridge.Commons.Types.Debugging; using ZB.MOM.WW.ScadaBridge.Commons.Types.Enums; namespace ZB.MOM.WW.ScadaBridge.Communication.Tests; @@ -180,13 +183,13 @@ internal static class SiteCommandSamples new ParkedOperationActionAck("corr-10", false, "handler missing")); // ── Route commands ── - Add(new RouteToCallRequest("corr-12", "Site1.Pump1", "Start", Parameters(), T1, G1), + Add(new RouteToCallRequest("corr-12", "Site1.Pump1", "Start", Parameters(), T1, G1, Trace: true), new RouteToCallRequest("corr-12", "Site1.Pump1", "Start", null, T2), new RouteToCallRequest("corr-12", "Site1.Pump1", "Start", new Dictionary(), T1)); Add(new RouteToGetAttributesRequest("corr-13", "Site1.Pump1", ["Speed", "Flow"], T1, G1), new RouteToGetAttributesRequest("corr-13", "Site1.Pump1", [], T2)); Add(new RouteToSetAttributesRequest( - "corr-14", "Site1.Pump1", new Dictionary { ["Speed"] = "10" }, T1, G1), + "corr-14", "Site1.Pump1", new Dictionary { ["Speed"] = "10" }, T1, G1, Trace: true), new RouteToSetAttributesRequest("corr-14", "Site1.Pump1", new Dictionary(), T2)); Add(new RouteToWaitForAttributeRequest( "corr-15", "Site1.Pump1", "Speed", "10", TimeSpan.FromSeconds(30), T1, G1, true), @@ -197,7 +200,7 @@ internal static class SiteCommandSamples "corr-15", "Site1.Pump1", "Speed", "", TimeSpan.FromMinutes(1), T1)); // ── Route replies ── - Add(new RouteToCallResponse("corr-12", true, 17L, null, T1), + Add(new RouteToCallResponse("corr-12", true, 17L, null, T1, G1, TraceSamples()), new RouteToCallResponse("corr-12", false, null, "script faulted", T2)); Add(new RouteToGetAttributesResponse("corr-13", Parameters(), true, null, T1), new RouteToGetAttributesResponse("corr-13", new Dictionary(), false, "no instance", T2)); @@ -293,6 +296,30 @@ internal static class SiteCommandSamples IsConfiguredPlaceholder = true }; + /// + /// Flow Debugger (design 2026-09-05 §5.4): two ScriptTrace rows for the maximal + /// RouteToCallResponse sample — a ScriptRun and an AttributeWrite with a populated Extra. + /// Fixed EventIds/timestamps so the golden is deterministic. + /// + private static IReadOnlyList TraceSamples() => + [ + ScadaBridgeAuditEventFactory.Create( + AuditChannel.ScriptTrace, AuditKind.ScriptRun, AuditStatus.Delivered, + eventId: Guid.Parse("aaaaaaaa-0000-0000-0000-000000000001"), occurredAtUtc: D1, + actor: "ScriptActor:DoWork", target: "DoWork", sourceNode: "node-a", + executionId: G1, parentExecutionId: Guid.Parse("bbbbbbbb-0000-0000-0000-000000000002"), + sourceSiteId: "site-1", sourceInstanceId: "Site1.Pump1", sourceScript: "ScriptActor:DoWork", + durationMs: 12, requestSummary: "{\"count\":3}", responseSummary: "7", + extra: new ScriptTraceExtra { TriggerKind = "call" }.ToJson()), + ScadaBridgeAuditEventFactory.Create( + AuditChannel.ScriptTrace, AuditKind.AttributeWrite, AuditStatus.Failed, + eventId: Guid.Parse("aaaaaaaa-0000-0000-0000-000000000003"), occurredAtUtc: D2, + actor: "ScriptActor:DoWork", target: "Speed", sourceNode: "node-a", + executionId: G1, sourceSiteId: "site-1", sourceInstanceId: "Site1.Pump1", + durationMs: 3, errorMessage: "device rejected", + extra: new ScriptTraceExtra { Writes = [new AttributeWriteDetail("Speed", "10", false, "device rejected")] }.ToJson()), + ]; + private static Dictionary Parameters() => new() { ["count"] = 3,