diff --git a/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go b/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go index beb688aa99..5636129b6e 100644 --- a/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go +++ b/connect-go/gen/proto/wg/cosmo/platform/v1/platform.pb.go @@ -23498,17 +23498,18 @@ func (x *DeleteFeatureFlagResponse) GetCompositionWarnings() []*CompositionWarni } type FeatureFlag struct { - state protoimpl.MessageState `protogen:"open.v1"` - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` - Labels []*Label `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` - IsEnabled bool `protobuf:"varint,5,opt,name=is_enabled,json=isEnabled,proto3" json:"is_enabled,omitempty"` - CreatedBy string `protobuf:"bytes,6,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"` - CreatedAt string `protobuf:"bytes,7,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` - UpdatedAt string `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Namespace string `protobuf:"bytes,3,opt,name=namespace,proto3" json:"namespace,omitempty"` + Labels []*Label `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty"` + IsEnabled bool `protobuf:"varint,5,opt,name=is_enabled,json=isEnabled,proto3" json:"is_enabled,omitempty"` + CreatedBy string `protobuf:"bytes,6,opt,name=created_by,json=createdBy,proto3" json:"created_by,omitempty"` + CreatedAt string `protobuf:"bytes,7,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + UpdatedAt string `protobuf:"bytes,8,opt,name=updated_at,json=updatedAt,proto3" json:"updated_at,omitempty"` + HasFailedLatestComposition *bool `protobuf:"varint,9,opt,name=has_failed_latest_composition,json=hasFailedLatestComposition,proto3,oneof" json:"has_failed_latest_composition,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *FeatureFlag) Reset() { @@ -23597,6 +23598,13 @@ func (x *FeatureFlag) GetUpdatedAt() string { return "" } +func (x *FeatureFlag) GetHasFailedLatestComposition() bool { + if x != nil && x.HasFailedLatestComposition != nil { + return *x.HasFailedLatestComposition + } + return false +} + type GetFeatureFlagsRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Limit int32 `protobuf:"varint,1,opt,name=limit,proto3" json:"limit,omitempty"` @@ -35683,7 +35691,7 @@ const file_wg_cosmo_platform_v1_platform_proto_rawDesc = "" + "\bresponse\x18\x01 \x01(\v2\x1e.wg.cosmo.platform.v1.ResponseR\bresponse\x12U\n" + "\x12composition_errors\x18\x02 \x03(\v2&.wg.cosmo.platform.v1.CompositionErrorR\x11compositionErrors\x12R\n" + "\x11deployment_errors\x18\x03 \x03(\v2%.wg.cosmo.platform.v1.DeploymentErrorR\x10deploymentErrors\x12Z\n" + - "\x13compositionWarnings\x18\x04 \x03(\v2(.wg.cosmo.platform.v1.CompositionWarningR\x13compositionWarnings\"\x80\x02\n" + + "\x13compositionWarnings\x18\x04 \x03(\v2(.wg.cosmo.platform.v1.CompositionWarningR\x13compositionWarnings\"\xea\x02\n" + "\vFeatureFlag\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + "\x04name\x18\x02 \x01(\tR\x04name\x12\x1c\n" + @@ -35696,7 +35704,9 @@ const file_wg_cosmo_platform_v1_platform_proto_rawDesc = "" + "\n" + "created_at\x18\a \x01(\tR\tcreatedAt\x12\x1d\n" + "\n" + - "updated_at\x18\b \x01(\tR\tupdatedAt\"\x89\x01\n" + + "updated_at\x18\b \x01(\tR\tupdatedAt\x12F\n" + + "\x1dhas_failed_latest_composition\x18\t \x01(\bH\x00R\x1ahasFailedLatestComposition\x88\x01\x01B \n" + + "\x1e_has_failed_latest_composition\"\x89\x01\n" + "\x16GetFeatureFlagsRequest\x12\x14\n" + "\x05limit\x18\x01 \x01(\x05R\x05limit\x12\x16\n" + "\x06offset\x18\x02 \x01(\x05R\x06offset\x12\x1c\n" + @@ -38250,6 +38260,7 @@ func file_wg_cosmo_platform_v1_platform_proto_init() { file_wg_cosmo_platform_v1_platform_proto_msgTypes[349].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[350].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[351].OneofWrappers = []any{} + file_wg_cosmo_platform_v1_platform_proto_msgTypes[353].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[354].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[360].OneofWrappers = []any{} file_wg_cosmo_platform_v1_platform_proto_msgTypes[362].OneofWrappers = []any{} diff --git a/connect/src/wg/cosmo/platform/v1/platform_pb.ts b/connect/src/wg/cosmo/platform/v1/platform_pb.ts index 617f459b9d..845f853b37 100644 --- a/connect/src/wg/cosmo/platform/v1/platform_pb.ts +++ b/connect/src/wg/cosmo/platform/v1/platform_pb.ts @@ -16,7 +16,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file wg/cosmo/platform/v1/platform.proto. */ export const file_wg_cosmo_platform_v1_platform: GenFile = /*@__PURE__*/ - fileDesc("CiN3Zy9jb3Ntby9wbGF0Zm9ybS92MS9wbGF0Zm9ybS5wcm90bxIUd2cuY29zbW8ucGxhdGZvcm0udjEiIwoFTGFiZWwSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJIlsKCFJlc3BvbnNlEi0KBGNvZGUYASABKA4yHy53Zy5jb3Ntby5jb21tb24uRW51bVN0YXR1c0NvZGUSFAoHZGV0YWlscxgCIAEoCUgAiAEBQgoKCF9kZXRhaWxzIi8KDlJlc3BvbnNlU3RhdHVzEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSJKChdQdWJsaXNoTW9ub2dyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIOCgZzY2hlbWEYAyABKAkilwIKGFB1Ymxpc2hNb25vZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmciYAoKUHJvdG9JbnB1dBIOCgZzY2hlbWEYASABKAkSEAoIbWFwcGluZ3MYAiABKAkSDAoEbG9jaxgDIAEoCRIRCglwbGF0Zm9ybXMYBCADKAkSDwoHdmVyc2lvbhgFIAEoCSKZBgofUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEg4KBnNjaGVtYRgCIAEoCRIYCgtyb3V0aW5nX3VybBgDIAEoCUgAiAEBEisKBmxhYmVscxgEIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgGIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAYgBARIdChBzdWJzY3JpcHRpb25fdXJsGAcgASgJSAKIAQESEQoJbmFtZXNwYWNlGAggASgJElAKFXdlYnNvY2tldF9zdWJwcm90b2NvbBgJIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMV2Vic29ja2V0U3VicHJvdG9jb2xIA4gBARIgChNpc19mZWF0dXJlX3N1YmdyYXBoGAogASgISASIAQESHwoSYmFzZV9zdWJncmFwaF9uYW1lGAsgASgJSAWIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YDCABKAhIBogBARI1CgR0eXBlGA0gASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlSAeIAQESNAoFcHJvdG8YDiABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm90b0lucHV0SAiIAQESEgoFbGltaXQYDyABKAVICYgBAUIOCgxfcm91dGluZ191cmxCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEITChFfc3Vic2NyaXB0aW9uX3VybEIYChZfd2Vic29ja2V0X3N1YnByb3RvY29sQhYKFF9pc19mZWF0dXJlX3N1YmdyYXBoQhUKE19iYXNlX3N1YmdyYXBoX25hbWVCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQgcKBV90eXBlQggKBl9wcm90b0IICgZfbGltaXQizwMKIFB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISFwoKaGFzQ2hhbmdlZBgEIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYBiABKAlIAYgBARI/CgZjb3VudHMYByABKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaFB1Ymxpc2hTdGF0c0gCiAEBQg0KC19oYXNDaGFuZ2VkQhcKFV9wcm9wb3NhbE1hdGNoTWVzc2FnZUIJCgdfY291bnRzImgKFFN1YmdyYXBoUHVibGlzaFN0YXRzEhkKEWNvbXBvc2l0aW9uRXJyb3JzGAEgASgFEhsKE2NvbXBvc2l0aW9uV2FybmluZ3MYAiABKAUSGAoQZGVwbG95bWVudEVycm9ycxgDIAEoBSIvCg9QdWJsaXNoU3ViZ3JhcGgSDAoEbmFtZRgBIAEoCRIOCgZzY2hlbWEYAiABKAki/wEKIFB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRI4CglzdWJncmFwaHMYAiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoU3ViZ3JhcGgSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YAyABKAhIAIgBARISCgVsaW1pdBgEIAEoBUgBiAEBEhIKBWFzeW5jGAUgASgISAKIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQggKBl9saW1pdEIICgZfYXN5bmMiqAMKIVB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSPwoGY291bnRzGAUgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAIgBARIcChR1cGRhdGVkU3ViZ3JhcGhOYW1lcxgGIAMoCRISCgVqb2JJZBgHIAEoCUgBiAEBQgkKB19jb3VudHNCCAoGX2pvYklkIk4KH0dldEJhdGNoUHVibGlzaEpvYlN0YXR1c1JlcXVlc3QSDQoFam9iSWQYASABKAkSEgoFbGltaXQYAiABKAVIAIgBAUIICgZfbGltaXQihAQKIEdldEJhdGNoUHVibGlzaEpvYlN0YXR1c1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQAoGc3RhdHVzGAIgASgOMisud2cuY29zbW8ucGxhdGZvcm0udjEuQmF0Y2hQdWJsaXNoSm9iU3RhdHVzSACIAQESGgoNZmFpbHVyZVJlYXNvbhgDIAEoCUgBiAEBEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAQgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAUgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBiADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSPwoGY291bnRzGAcgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAogBARIcChR1cGRhdGVkU3ViZ3JhcGhOYW1lcxgIIAMoCUIJCgdfc3RhdHVzQhAKDl9mYWlsdXJlUmVhc29uQgkKB19jb3VudHMiXgoHR2l0SW5mbxISCgpjb21taXRfc2hhGAEgASgJEhIKCmFjY291bnRfaWQYAiABKAkSEgoKb3duZXJfc2x1ZxgDIAEoCRIXCg9yZXBvc2l0b3J5X3NsdWcYBCABKAkiQAoKVkNTQ29udGV4dBIOCgZhdXRob3IYASABKAkSEgoKY29tbWl0X3NoYRgCIAEoCRIOCgZicmFuY2gYAyABKAkixwMKGkNoZWNrU3ViZ3JhcGhTY2hlbWFSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSDgoGc2NoZW1hGAIgASgMEi4KB2dpdEluZm8YAyABKAsyHS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HaXRJbmZvEhMKBmRlbGV0ZRgEIAEoCEgAiAEBEhEKCW5hbWVzcGFjZRgFIAEoCRIfChJza2lwX3RyYWZmaWNfY2hlY2sYBiABKAhIAYgBARI5Cgp2Y3NDb250ZXh0GAcgASgLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuVkNTQ29udGV4dEgCiAEBEisKBmxhYmVscxgIIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAkgASgISAOIAQESEgoFbGltaXQYCiABKAVIBIgBAUIJCgdfZGVsZXRlQhUKE19za2lwX3RyYWZmaWNfY2hlY2tCDQoLX3Zjc0NvbnRleHRCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQggKBl9saW1pdCKoAQoYRml4U3ViZ3JhcGhTY2hlbWFSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCRItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgEIAEoCEgAiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiLqAwoWQ3JlYXRlTW9ub2dyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRITCgtyb3V0aW5nX3VybBgDIAEoCRIRCglncmFwaF91cmwYBCABKAkSHQoQc3Vic2NyaXB0aW9uX3VybBgFIAEoCUgAiAEBElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgGIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAYgBARITCgZyZWFkbWUYByABKAlIAogBARIbChNhZG1pc3Npb25XZWJob29rVVJMGAggASgJElAKFXdlYnNvY2tldF9zdWJwcm90b2NvbBgJIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMV2Vic29ja2V0U3VicHJvdG9jb2xIA4gBARIjChZhZG1pc3Npb25XZWJob29rU2VjcmV0GAogASgJSASIAQFCEwoRX3N1YnNjcmlwdGlvbl91cmxCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEIJCgdfcmVhZG1lQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCGQoXX2FkbWlzc2lvbldlYmhvb2tTZWNyZXQiSwoXQ3JlYXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSK8AgobQ3JlYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLcm91dGluZ191cmwYAiABKAkSFgoObGFiZWxfbWF0Y2hlcnMYAyADKAkSEwoGcmVhZG1lGAQgASgJSACIAQESEQoJbmFtZXNwYWNlGAUgASgJEhsKE2FkbWlzc2lvbldlYmhvb2tVUkwYBiABKAkSIwoWYWRtaXNzaW9uV2ViaG9va1NlY3JldBgHIAEoCUgBiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAggASgISAKIAQFCCQoHX3JlYWRtZUIZChdfYWRtaXNzaW9uV2ViaG9va1NlY3JldEIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ipgUKHkNyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhgKC3JvdXRpbmdfdXJsGAIgASgJSACIAQESKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSUAoVc3Vic2NyaXB0aW9uX3Byb3RvY29sGAUgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxTdWJzY3JpcHRpb25Qcm90b2NvbEgBiAEBEh0KEHN1YnNjcmlwdGlvbl91cmwYBiABKAlIAogBARITCgZyZWFkbWUYByABKAlIA4gBARIRCgluYW1lc3BhY2UYCCABKAkSUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAkgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgEiAEBEiIKFWlzX2V2ZW50X2RyaXZlbl9ncmFwaBgKIAEoCEgFiAEBEiAKE2lzX2ZlYXR1cmVfc3ViZ3JhcGgYCyABKAhIBogBARIfChJiYXNlX3N1YmdyYXBoX25hbWUYDCABKAlIB4gBARIwCgR0eXBlGA0gASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlQg4KDF9yb3V0aW5nX3VybEIYChZfc3Vic2NyaXB0aW9uX3Byb3RvY29sQhMKEV9zdWJzY3JpcHRpb25fdXJsQgkKB19yZWFkbWVCGAoWX3dlYnNvY2tldF9zdWJwcm90b2NvbEIYChZfaXNfZXZlbnRfZHJpdmVuX2dyYXBoQhYKFF9pc19mZWF0dXJlX3N1YmdyYXBoQhUKE19iYXNlX3N1YmdyYXBoX25hbWUiPgobRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIjkKFkRlbGV0ZU1vbm9ncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiSwoXRGVsZXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKeAQoeRGVsZXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAMgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIrkBCgxTY2hlbWFDaGFuZ2USDwoHbWVzc2FnZRgBIAEoCRISCgpjaGFuZ2VUeXBlGAIgASgJEhEKBHBhdGgYAyABKAlIAIgBARISCgppc0JyZWFraW5nGAQgASgIEhgKC2hhc092ZXJyaWRlGAUgASgISAGIAQESGQoMc3ViZ3JhcGhOYW1lGAYgASgJSAKIAQFCBwoFX3BhdGhCDgoMX2hhc092ZXJyaWRlQg8KDV9zdWJncmFwaE5hbWUizAEKGkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlEg8KB21lc3NhZ2UYASABKAkSEgoKY2hhbmdlVHlwZRgCIAEoCRIRCgRwYXRoGAMgASgJSACIAQESEgoKaXNCcmVha2luZxgEIAEoCBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYBSABKAkSGAoLaGFzT3ZlcnJpZGUYBiABKAhIAYgBARITCgtmZWF0dXJlRmxhZxgHIAEoCUIHCgVfcGF0aEIOCgxfaGFzT3ZlcnJpZGUiZwoQQ29tcG9zaXRpb25FcnJvchIPCgdtZXNzYWdlGAEgASgJEhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSEwoLZmVhdHVyZUZsYWcYBCABKAkiaQoSQ29tcG9zaXRpb25XYXJuaW5nEg8KB21lc3NhZ2UYASABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCRITCgtmZWF0dXJlRmxhZxgEIAEoCSJRCg9EZXBsb3ltZW50RXJyb3ISDwoHbWVzc2FnZRgBIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJInQKGENoZWNrT3BlcmF0aW9uVXNhZ2VTdGF0cxIXCg90b3RhbE9wZXJhdGlvbnMYASABKA0SEwoLZmlyc3RTZWVuQXQYAiABKAkSEgoKbGFzdFNlZW5BdBgDIAEoCRIWCg5zYWZlT3BlcmF0aW9ucxgEIAEoDSJgChZDaGVja2VkRmVkZXJhdGVkR3JhcGhzEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhkKEW9yZ2FuaXphdGlvbl9zbHVnGAQgASgJInQKDExpbnRMb2NhdGlvbhIMCgRsaW5lGAEgASgNEg4KBmNvbHVtbhgCIAEoDRIUCgdlbmRMaW5lGAMgASgNSACIAQESFgoJZW5kQ29sdW1uGAQgASgNSAGIAQFCCgoIX2VuZExpbmVCDAoKX2VuZENvbHVtbiLlAQoJTGludElzc3VlEhkKDGxpbnRSdWxlVHlwZRgBIAEoCUgAiAEBEjQKCHNldmVyaXR5GAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5Eg8KB21lc3NhZ2UYAyABKAkSOQoNaXNzdWVMb2NhdGlvbhgEIAEoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRMb2NhdGlvbhIZCgxzdWJncmFwaE5hbWUYBSABKAlIAYgBAUIPCg1fbGludFJ1bGVUeXBlQg8KDV9zdWJncmFwaE5hbWUijgIKEUdyYXBoUHJ1bmluZ0lzc3VlEhwKFGdyYXBoUHJ1bmluZ1J1bGVUeXBlGAEgASgJEjQKCHNldmVyaXR5GAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5EhEKCWZpZWxkUGF0aBgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEjkKDWlzc3VlTG9jYXRpb24YBSABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50TG9jYXRpb24SGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAYgASgJEhkKDHN1YmdyYXBoTmFtZRgHIAEoCUgAiAEBQg8KDV9zdWJncmFwaE5hbWUihwsKG0NoZWNrU3ViZ3JhcGhTY2hlbWFSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjsKD2JyZWFraW5nQ2hhbmdlcxgCIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRI+ChJub25CcmVha2luZ0NoYW5nZXMYAyADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USQQoRY29tcG9zaXRpb25FcnJvcnMYBCADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEksKE29wZXJhdGlvblVzYWdlU3RhdHMYBSABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja09wZXJhdGlvblVzYWdlU3RhdHMSEAoIY2hlY2tfaWQYBiABKAkSTgoYY2hlY2tlZF9mZWRlcmF0ZWRfZ3JhcGhzGAcgAygLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tlZEZlZGVyYXRlZEdyYXBocxI1CgxsaW50V2FybmluZ3MYCCADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSMwoKbGludEVycm9ycxgJIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJDChJncmFwaFBydW5lV2FybmluZ3MYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJBChBncmFwaFBydW5lRXJyb3JzGAsgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nSXNzdWUSKQocY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZBgMIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYDSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYDiABKAlIAYgBARInChppc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZBgPIAEoCEgCiAEBEicKGmlzTGlua2VkUHJ1bmluZ0NoZWNrRmFpbGVkGBAgASgISAOIAQESJAoXaXNDaGVja0V4dGVuc2lvblNraXBwZWQYESABKAhIBIgBARInChpjaGVja0V4dGVuc2lvbkVycm9yTWVzc2FnZRgSIAEoCUgFiAEBEjwKBmNvdW50cxgTIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrQ291bnRzSAaIAQESVwodY29tcG9zZWRTY2hlbWFCcmVha2luZ0NoYW5nZXMYFCADKAsyMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaFNjaGVtYUNoYW5nZRIoChtmZWF0dXJlU3ViZ3JhcGhDaGVja01lc3NhZ2UYFSABKAlIB4gBAUIfCh1fY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZEIXChVfcHJvcG9zYWxNYXRjaE1lc3NhZ2VCHQobX2lzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkQh0KG19pc0xpbmtlZFBydW5pbmdDaGVja0ZhaWxlZEIaChhfaXNDaGVja0V4dGVuc2lvblNraXBwZWRCHQobX2NoZWNrRXh0ZW5zaW9uRXJyb3JNZXNzYWdlQgkKB19jb3VudHNCHgocX2ZlYXR1cmVTdWJncmFwaENoZWNrTWVzc2FnZSKHAgoRU2NoZW1hQ2hlY2tDb3VudHMSFAoMbGludFdhcm5pbmdzGAEgASgFEhIKCmxpbnRFcnJvcnMYAiABKAUSFwoPYnJlYWtpbmdDaGFuZ2VzGAMgASgFEhoKEm5vbkJyZWFraW5nQ2hhbmdlcxgEIAEoBRIZChFjb21wb3NpdGlvbkVycm9ycxgFIAEoBRIbChNjb21wb3NpdGlvbldhcm5pbmdzGAYgASgFEhgKEGdyYXBoUHJ1bmVFcnJvcnMYByABKAUSGgoSZ3JhcGhQcnVuZVdhcm5pbmdzGAggASgFEiUKHWNvbXBvc2VkU2NoZW1hQnJlYWtpbmdDaGFuZ2VzGAkgASgFIm8KGUZpeFN1YmdyYXBoU2NoZW1hUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIQCghtb2RpZmllZBgCIAEoCBIOCgZzY2hlbWEYAyABKAkimwIKHENyZWF0ZUZlZGVyYXRlZEdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJBChFjb21wb3NpdGlvbkVycm9ycxgCIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISPwoQZGVwbG95bWVudEVycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nIlMKH0NyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLaAgofRGVsZXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYBSABKAlIAIgBAUIXChVfcHJvcG9zYWxNYXRjaE1lc3NhZ2UiUAocRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIp8BChlHZXRGZWRlcmF0ZWRHcmFwaHNSZXF1ZXN0Eg0KBWxpbWl0GAEgASgFEg4KBm9mZnNldBgCIAEoBRIWCg5pbmNsdWRlTWV0cmljcxgDIAEoCBIRCgluYW1lc3BhY2UYBCABKAkSIAoTc3VwcG9ydHNfZmVkZXJhdGlvbhgFIAEoCEgAiAEBQhYKFF9zdXBwb3J0c19mZWRlcmF0aW9uImUKCENvbnRyYWN0EgoKAmlkGAEgASgJEiEKGXNvdXJjZV9mZWRlcmF0ZWRfZ3JhcGhfaWQYAiABKAkSFAoMZXhjbHVkZV90YWdzGAMgAygJEhQKDGluY2x1ZGVfdGFncxgEIAMoCSKzBAoORmVkZXJhdGVkR3JhcGgSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRISCgpyb3V0aW5nVVJMGAMgASgJEhYKDmxhYmVsX21hdGNoZXJzGAQgAygJEhUKDWxhc3RVcGRhdGVkQXQYBSABKAkSFAoMaXNDb21wb3NhYmxlGAYgASgIEhkKEWNvbXBvc2l0aW9uRXJyb3JzGAcgASgJEhoKEmNvbm5lY3RlZFN1YmdyYXBocxgIIAEoBRI+Cg1yZXF1ZXN0U2VyaWVzGAkgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuUmVxdWVzdFNlcmllc0l0ZW0SEwoGcmVhZG1lGAogASgJSACIAQESEQoJdGFyZ2V0X2lkGAsgASgJEhEKCW5hbWVzcGFjZRgMIAEoCRIaCg1jb21wb3NpdGlvbklkGA0gASgJSAGIAQESGwoTc3VwcG9ydHNfZmVkZXJhdGlvbhgOIAEoCBI1Cghjb250cmFjdBgPIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbnRyYWN0SAKIAQESIgoVYWRtaXNzaW9uX3dlYmhvb2tfdXJsGBAgASgJSAOIAQESJAoccm91dGVyX2NvbXBhdGliaWxpdHlfdmVyc2lvbhgRIAEoCUIJCgdfcmVhZG1lQhAKDl9jb21wb3NpdGlvbklkQgsKCV9jb250cmFjdEIYChZfYWRtaXNzaW9uX3dlYmhvb2tfdXJsIoQBChpHZXRGZWRlcmF0ZWRHcmFwaHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjQKBmdyYXBocxgCIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoIlQKKUdldEZlZGVyYXRlZEdyYXBoc0J5U3ViZ3JhcGhMYWJlbHNSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkilAEKKkdldEZlZGVyYXRlZEdyYXBoc0J5U3ViZ3JhcGhMYWJlbHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjQKBmdyYXBocxgCIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoIogBChNHZXRTdWJncmFwaHNSZXF1ZXN0Eg0KBWxpbWl0GAEgASgFEg4KBm9mZnNldBgCIAEoBRIRCgluYW1lc3BhY2UYAyABKAkSEgoFcXVlcnkYBCABKAlIAIgBARIhChlleGNsdWRlX2ZlYXR1cmVfc3ViZ3JhcGhzGAUgASgIQggKBl9xdWVyeSK9BQoIU3ViZ3JhcGgSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRISCgpyb3V0aW5nVVJMGAMgASgJEhUKDWxhc3RVcGRhdGVkQXQYBCABKAkSKwoGbGFiZWxzGAUgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSGgoNY3JlYXRvclVzZXJJZBgGIAEoCUgAiAEBEhMKBnJlYWRtZRgHIAEoCUgBiAEBEhcKD3N1YnNjcmlwdGlvblVybBgIIAEoCRIRCgl0YXJnZXRfaWQYCSABKAkSEQoJbmFtZXNwYWNlGAogASgJEhwKFHN1YnNjcmlwdGlvblByb3RvY29sGAsgASgJEhYKCWlzVjJHcmFwaBgMIAEoCEgCiAEBEhoKEmlzRXZlbnREcml2ZW5HcmFwaBgNIAEoCBIcChR3ZWJzb2NrZXRTdWJwcm90b2NvbBgOIAEoCRIZChFpc0ZlYXR1cmVTdWJncmFwaBgPIAEoCBIdChBiYXNlU3ViZ3JhcGhOYW1lGBAgASgJSAOIAQESGwoOYmFzZVN1YmdyYXBoSWQYESABKAlIBIgBARIwCgR0eXBlGBIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlEkIKCnBsdWdpbkRhdGEYEyABKAsyKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaC5QbHVnaW5EYXRhSAWIAQEaMAoKUGx1Z2luRGF0YRIPCgd2ZXJzaW9uGAEgASgJEhEKCXBsYXRmb3JtcxgCIAMoCUIQCg5fY3JlYXRvclVzZXJJZEIJCgdfcmVhZG1lQgwKCl9pc1YyR3JhcGhCEwoRX2Jhc2VTdWJncmFwaE5hbWVCEQoPX2Jhc2VTdWJncmFwaElkQg0KC19wbHVnaW5EYXRhIocBChRHZXRTdWJncmFwaHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEi4KBmdyYXBocxgCIAMoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEg0KBWNvdW50GAMgASgFIlkKHkdldEZlZGVyYXRlZEdyYXBoQnlOYW1lUmVxdWVzdBIMCgRuYW1lGAEgASgJEhYKDmluY2x1ZGVNZXRyaWNzGAIgASgIEhEKCW5hbWVzcGFjZRgDIAEoCSLWAQofR2V0RmVkZXJhdGVkR3JhcGhCeU5hbWVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjMKBWdyYXBoGAIgASgLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuRmVkZXJhdGVkR3JhcGgSMQoJc3ViZ3JhcGhzGAMgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgSGQoRZ3JhcGhSZXF1ZXN0VG9rZW4YBCABKAkiegohR2V0RmVkZXJhdGVkR3JhcGhTRExCeU5hbWVSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEh4KEWZlYXR1cmVfZmxhZ19uYW1lGAMgASgJSACIAQFCFAoSX2ZlYXR1cmVfZmxhZ19uYW1lIsYBCiJHZXRGZWRlcmF0ZWRHcmFwaFNETEJ5TmFtZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoDc2RsGAIgASgJSACIAQESFwoKdmVyc2lvbl9pZBgDIAEoCUgBiAEBEhoKDWNsaWVudF9zY2hlbWEYBCABKAlIAogBAUIGCgRfc2RsQg0KC192ZXJzaW9uX2lkQhAKDl9jbGllbnRfc2NoZW1hIjsKGEdldFN1YmdyYXBoQnlOYW1lUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSLiAgoZR2V0U3ViZ3JhcGhCeU5hbWVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEi0KBWdyYXBoGAIgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgSNQoHbWVtYmVycxgDIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoTWVtYmVyElsKDmxpbmtlZFN1YmdyYXBoGAQgASgLMj4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhCeU5hbWVSZXNwb25zZS5MaW5rZWRTdWJncmFwaEgAiAEBGj0KDkxpbmtlZFN1YmdyYXBoEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJQhEKD19saW5rZWRTdWJncmFwaCJjCipHZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvblJlcXVlc3QSDAoEbmFtZRgBIAEoCRIUCgxmZWRHcmFwaE5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIqEBCitHZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoDc2RsGAIgASgJSACIAQESFwoKdmVyc2lvbl9pZBgDIAEoCUgBiAEBQgYKBF9zZGxCDQoLX3ZlcnNpb25faWQiPgobR2V0TGF0ZXN0U3ViZ3JhcGhTRExSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIpIBChxHZXRMYXRlc3RTdWJncmFwaFNETFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoDc2RsGAIgASgJSACIAQESFwoKdmVyc2lvbl9pZBgDIAEoCUgBiAEBQgYKBF9zZGxCDQoLX3ZlcnNpb25faWQiOQokR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVGaWx0ZXJzEhEKCXN1YmdyYXBocxgBIAMoCSLoAQokR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVSZXF1ZXN0EgwKBG5hbWUYASABKAkSDQoFbGltaXQYAiABKAUSDgoGb2Zmc2V0GAMgASgFEhEKCXN0YXJ0RGF0ZRgEIAEoCRIPCgdlbmREYXRlGAUgASgJEhEKCW5hbWVzcGFjZRgGIAEoCRJQCgdmaWx0ZXJzGAcgASgLMjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVGaWx0ZXJzSACIAQFCCgoIX2ZpbHRlcnMiigwKC1NjaGVtYUNoZWNrEgoKAmlkGAEgASgJEhUKCHRhcmdldElEGAIgASgJSACIAQESGQoMc3ViZ3JhcGhOYW1lGAMgASgJSAGIAQESEQoJdGltZXN0YW1wGAQgASgJEhQKDGlzQ29tcG9zYWJsZRgFIAEoCBISCgppc0JyZWFraW5nGAYgASgIEhgKEGhhc0NsaWVudFRyYWZmaWMYByABKAgSFwoPaXNGb3JjZWRTdWNjZXNzGAggASgIEhEKCWlzRGVsZXRlZBgJIAEoCBJDCglnaERldGFpbHMYCiABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGVjay5HaERldGFpbHNIAogBARIVCg1oYXNMaW50RXJyb3JzGAsgASgIEh0KFWhhc0dyYXBoUHJ1bmluZ0Vycm9ycxgMIAEoCBIkChxjbGllbnRfdHJhZmZpY19jaGVja19za2lwcGVkGA0gASgIEhQKDGxpbnRfc2tpcHBlZBgOIAEoCBIdChVncmFwaF9wcnVuaW5nX3NraXBwZWQYDyABKAgSOQoKdmNzQ29udGV4dBgQIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlZDU0NvbnRleHRIA4gBARJLChBjaGVja2VkU3ViZ3JhcGhzGBEgAygLMjEud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2suQ2hlY2tlZFN1YmdyYXBoEhoKDXByb3Bvc2FsTWF0Y2gYEiABKAlIBIgBARIbChNjb21wb3NpdGlvbl9za2lwcGVkGBMgASgIEiAKGGJyZWFraW5nX2NoYW5nZXNfc2tpcHBlZBgUIAEoCBIZCgxlcnJvck1lc3NhZ2UYFSABKAlIBYgBARJDCgxsaW5rZWRDaGVja3MYFiADKAsyLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGVjay5MaW5rZWRDaGVjaxIoChtjaGVja19leHRlbnNpb25fZGVsaXZlcnlfaWQYFyABKAlIBogBARIqCh1jaGVja19leHRlbnNpb25fZXJyb3JfbWVzc2FnZRgYIAEoCUgHiAEBEh8KF2hhc0ZlYXR1cmVTdWJncmFwaENoZWNrGBkgASgIGkkKCUdoRGV0YWlscxIRCgljb21taXRTaGEYASABKAkSEQoJb3duZXJTbHVnGAIgASgJEhYKDnJlcG9zaXRvcnlTbHVnGAMgASgJGqoBCg9DaGVja2VkU3ViZ3JhcGgSCgoCaWQYASABKAkSFAoMc3ViZ3JhcGhOYW1lGAIgASgJEhcKCnN1YmdyYXBoSWQYAyABKAlIAIgBARIRCglpc0RlbGV0ZWQYBCABKAgSDQoFaXNOZXcYBSABKAgSKwoGbGFiZWxzGAYgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWxCDQoLX3N1YmdyYXBoSWQakQIKC0xpbmtlZENoZWNrEgoKAmlkGAEgASgJEhoKEmFmZmVjdGVkR3JhcGhOYW1lcxgCIAMoCRIZChFpc0NoZWNrU3VjY2Vzc2Z1bBgDIAEoCBIYChBoYXNDbGllbnRUcmFmZmljGAQgASgIEh0KFWhhc0dyYXBoUHJ1bmluZ0Vycm9ycxgFIAEoCBIhChljbGllbnRUcmFmZmljQ2hlY2tTa2lwcGVkGAYgASgIEiAKGGdyYXBoUHJ1bmluZ0NoZWNrU2tpcHBlZBgHIAEoCBIVCg1zdWJncmFwaE5hbWVzGAggAygJEhEKCW5hbWVzcGFjZRgJIAEoCRIXCg9pc0ZvcmNlZFN1Y2Nlc3MYCiABKAhCCwoJX3RhcmdldElEQg8KDV9zdWJncmFwaE5hbWVCDAoKX2doRGV0YWlsc0INCgtfdmNzQ29udGV4dEIQCg5fcHJvcG9zYWxNYXRjaEIPCg1fZXJyb3JNZXNzYWdlQh4KHF9jaGVja19leHRlbnNpb25fZGVsaXZlcnlfaWRCIAoeX2NoZWNrX2V4dGVuc2lvbl9lcnJvcl9tZXNzYWdlIrEBCiVHZXRDaGVja3NCeUZlZGVyYXRlZEdyYXBoTmFtZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMQoGY2hlY2tzGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2sSIwobY2hlY2tzQ291bnRCYXNlZE9uRGF0ZVJhbmdlGAMgASgFIlEKFkdldENoZWNrU3VtbWFyeVJlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiNAoMQ2hhbmdlQ291bnRzEhEKCWFkZGl0aW9ucxgBIAEoBRIRCglkZWxldGlvbnMYAiABKAUiyAkKF0dldENoZWNrU3VtbWFyeVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMAoFY2hlY2sYAiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGVjaxJUCg9hZmZlY3RlZF9ncmFwaHMYAyADKAsyOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja1N1bW1hcnlSZXNwb25zZS5BZmZlY3RlZEdyYXBoEiYKGXByb3Bvc2VkU3ViZ3JhcGhTY2hlbWFTREwYBCABKAlIAIgBARIzCgdjaGFuZ2VzGAYgAygLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hhbmdlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAcgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchIaChJ0cmFmZmljX2NoZWNrX2RheXMYCCABKAUSMwoKbGludElzc3VlcxgJIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJDChJncmFwaFBydW5pbmdJc3N1ZXMYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJFChNjb21wb3NpdGlvbldhcm5pbmdzGAsgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEhcKCnByb3Bvc2FsSWQYDCABKAlIAYgBARIZCgxwcm9wb3NhbE5hbWUYDSABKAlIAogBARJaCg9wcm9wb3NhbE1hdGNoZXMYDiADKAsyQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja1N1bW1hcnlSZXNwb25zZS5Qcm9wb3NhbFNjaGVtYU1hdGNoEhoKEmlzUHJvcG9zYWxzRW5hYmxlZBgPIAEoCBJXCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgQIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlGtoBCg1BZmZlY3RlZEdyYXBoEgoKAmlkGAEgASgJEhoKEnRyYWZmaWNfY2hlY2tfZGF5cxgCIAEoBRIMCgRuYW1lGAMgASgJEhkKEWlzQ2hlY2tTdWNjZXNzZnVsGAQgASgIEhQKDGlzQ29tcG9zYWJsZRgFIAEoCBISCgppc0JyZWFraW5nGAYgASgIEhgKEGhhc0NsaWVudFRyYWZmaWMYByABKAgSFQoNaGFzTGludEVycm9ycxgIIAEoCBIdChVoYXNHcmFwaFBydW5pbmdFcnJvcnMYCSABKAgaVgoTUHJvcG9zYWxTY2hlbWFNYXRjaBISCgpwcm9wb3NhbElkGAEgASgJEhQKDHByb3Bvc2FsTmFtZRgCIAEoCRIVCg1wcm9wb3NhbE1hdGNoGAMgASgIQhwKGl9wcm9wb3NlZFN1YmdyYXBoU2NoZW1hU0RMQg0KC19wcm9wb3NhbElkQg8KDV9wcm9wb3NhbE5hbWUikwEKGUdldENoZWNrT3BlcmF0aW9uc1JlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSDQoFbGltaXQYBCABKAUSDgoGb2Zmc2V0GAUgASgFEhMKBnNlYXJjaBgGIAEoCUgAiAEBQgkKB19zZWFyY2gi0wQKGkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USUwoKb3BlcmF0aW9ucxgCIAMoCzI/LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlLkNoZWNrT3BlcmF0aW9uEhoKEnRyYWZmaWNfY2hlY2tfZGF5cxgDIAEoBRISCgpjcmVhdGVkX2F0GAQgASgJEiQKHGNsaWVudF90cmFmZmljX2NoZWNrX3NraXBwZWQYBSABKAgSHAoUdG90YWxPcGVyYXRpb25zQ291bnQYBiABKAUSLAokZG9BbGxPcGVyYXRpb25zSGF2ZUlnbm9yZUFsbE92ZXJyaWRlGAcgASgIEjQKLGRvQWxsT3BlcmF0aW9uc0hhdmVBbGxUaGVpckNoYW5nZXNNYXJrZWRTYWZlGAggASgIGtUBCg5DaGVja09wZXJhdGlvbhIMCgRoYXNoGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIVCg1maXJzdF9zZWVuX2F0GAQgASgJEhQKDGxhc3Rfc2Vlbl9hdBgFIAEoCRI9ChFpbXBhY3RpbmdfY2hhbmdlcxgGIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRIPCgdpc19zYWZlGAcgASgIEhwKFGhhc0lnbm9yZUFsbE92ZXJyaWRlGAggASgIIncKGkdldE9wZXJhdGlvbkNvbnRlbnRSZXF1ZXN0EgwKBGhhc2gYASABKAkSHAoUZmVkZXJhdGVkX2dyYXBoX25hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhEKBG5hbWUYBCABKAlIAIgBAUIHCgVfbmFtZSJqChtHZXRPcGVyYXRpb25Db250ZW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIZChFvcGVyYXRpb25fY29udGVudBgCIAEoCSKuAQohR2V0RmVkZXJhdGVkR3JhcGhDaGFuZ2Vsb2dSZXF1ZXN0EgwKBG5hbWUYASABKAkSNAoKcGFnaW5hdGlvbhgCIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlBhZ2luYXRpb24SMgoJZGF0ZVJhbmdlGAMgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEhEKCW5hbWVzcGFjZRgEIAEoCSJxChdGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZxIKCgJpZBgBIAEoCRIMCgRwYXRoGAIgASgJEhIKCmNoYW5nZVR5cGUYAyABKAkSFQoNY2hhbmdlTWVzc2FnZRgEIAEoCRIRCgljcmVhdGVkQXQYBSABKAkipQEKHUZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nT3V0cHV0EhEKCWNyZWF0ZWRBdBgBIAEoCRIXCg9zY2hlbWFWZXJzaW9uSWQYAiABKAkSQQoKY2hhbmdlbG9ncxgDIAMoCzItLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nEhUKDWNvbXBvc2l0aW9uSWQYBCABKAkixwEKIkdldEZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJaCh1mZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ091dHB1dBgCIAMoCzIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nT3V0cHV0EhMKC2hhc05leHRQYWdlGAMgASgIImQKFEdldEZlZGVyYXRlZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USGgoSRmVkZXJhdGVkU2NoZW1hU0RMGAIgASgJIswEChVVcGRhdGVTdWJncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIYCgtyb3V0aW5nX3VybBgCIAEoCUgAiAEBEisKBmxhYmVscxgDIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEg8KB2hlYWRlcnMYBCADKAkSUAoVc3Vic2NyaXB0aW9uX3Byb3RvY29sGAUgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxTdWJzY3JpcHRpb25Qcm90b2NvbEgBiAEBEh0KEHN1YnNjcmlwdGlvbl91cmwYBiABKAlIAogBARITCgZyZWFkbWUYByABKAlIA4gBARIRCgluYW1lc3BhY2UYCCABKAkSGQoMdW5zZXRfbGFiZWxzGAkgASgISASIAQESUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAogASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgFiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAsgASgISAaIAQFCDgoMX3JvdXRpbmdfdXJsQhgKFl9zdWJzY3JpcHRpb25fcHJvdG9jb2xCEwoRX3N1YnNjcmlwdGlvbl91cmxCCQoHX3JlYWRtZUIPCg1fdW5zZXRfbGFiZWxzQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpUCChZVcGRhdGVTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyKVAwobVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLcm91dGluZ191cmwYAiABKAkSFgoObGFiZWxfbWF0Y2hlcnMYAyADKAkSEwoGcmVhZG1lGAQgASgJSACIAQESEQoJbmFtZXNwYWNlGAUgASgJEiEKFHVuc2V0X2xhYmVsX21hdGNoZXJzGAYgASgISAGIAQESIAoTYWRtaXNzaW9uV2ViaG9va1VSTBgHIAEoCUgCiAEBEiMKFmFkbWlzc2lvbldlYmhvb2tTZWNyZXQYCCABKAlIA4gBARItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgJIAEoCEgEiAEBQgkKB19yZWFkbWVCFwoVX3Vuc2V0X2xhYmVsX21hdGNoZXJzQhYKFF9hZG1pc3Npb25XZWJob29rVVJMQhkKF19hZG1pc3Npb25XZWJob29rU2VjcmV0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiKbAgocVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihwQKFlVwZGF0ZU1vbm9ncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLcm91dGluZ191cmwYAyABKAkSEQoJZ3JhcGhfdXJsGAQgASgJElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgFIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAIgBARIdChBzdWJzY3JpcHRpb25fdXJsGAYgASgJSAGIAQESEwoGcmVhZG1lGAcgASgJSAKIAQESUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAggASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgDiAEBEiAKE2FkbWlzc2lvbldlYmhvb2tVUkwYCSABKAlIBIgBARIjChZhZG1pc3Npb25XZWJob29rU2VjcmV0GAogASgJSAWIAQFCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEITChFfc3Vic2NyaXB0aW9uX3VybEIJCgdfcmVhZG1lQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCFgoUX2FkbWlzc2lvbldlYmhvb2tVUkxCGQoXX2FkbWlzc2lvbldlYmhvb2tTZWNyZXQiSwoXVXBkYXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLHAQoaQ2hlY2tGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIWCg5sYWJlbF9tYXRjaGVycxgCIAMoCRIRCgluYW1lc3BhY2UYAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBARISCgVsaW1pdBgFIAEoBUgBiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbkIICgZfbGltaXQi1QIKG0NoZWNrRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchIxCglzdWJncmFwaHMYAyADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEjwKBmNvdW50cxgFIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrQ291bnRzSACIAQFCCQoHX2NvdW50cyIrCgpQYWdpbmF0aW9uEg0KBWxpbWl0GAEgASgFEg4KBm9mZnNldBgCIAEoBSIgCgRTb3J0EgoKAmlkGAEgASgJEgwKBGRlc2MYAiABKAgiiQIKD0FuYWx5dGljc0NvbmZpZxIyCglkYXRlUmFuZ2UYASABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USEgoFcmFuZ2UYAiABKAVIAIgBARI2CgdmaWx0ZXJzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzRmlsdGVyEjQKCnBhZ2luYXRpb24YBCABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEi0KBHNvcnQYBSABKAsyGi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Tb3J0SAGIAQFCCAoGX3JhbmdlQgcKBV9zb3J0InQKD0FuYWx5dGljc0ZpbHRlchINCgVmaWVsZBgBIAEoCRINCgV2YWx1ZRgCIAEoCRJDCghvcGVyYXRvchgDIAEoDjIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvciInCglEYXRlUmFuZ2USDQoFc3RhcnQYASABKAkSCwoDZW5kGAIgASgJIrsBChdHZXRBbmFseXRpY3NWaWV3UmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSOgoEbmFtZRgCIAEoDjIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdHcm91cE5hbWUSNQoGY29uZmlnGAMgASgLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzQ29uZmlnEhEKCW5hbWVzcGFjZRgEIAEoCSLYAQoTQW5hbHl0aWNzVmlld1Jlc3VsdBI6Cgdjb2x1bW5zGAEgAygLMikud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld0NvbHVtbhI0CgRyb3dzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1JvdxJACgdmaWx0ZXJzGAMgAygLMi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlchINCgVwYWdlcxgEIAEoBSK+AQoTQW5hbHl0aWNzVmlld0NvbHVtbhIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSLQoEdW5pdBgEIAEoDjIaLndnLmNvc21vLnBsYXRmb3JtLnYxLlVuaXRIAIgBARIWCglpc19oaWRkZW4YBSABKAhIAYgBARITCgZpc19jdGEYBiABKAhIAogBAUIHCgVfdW5pdEIMCgpfaXNfaGlkZGVuQgkKB19pc19jdGEi2wEKGUFuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXISEgoKY29sdW1uTmFtZRgBIAEoCRINCgV0aXRsZRgCIAEoCRJGCgdvcHRpb25zGAMgAygLMjUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlck9wdGlvbhJACg5jdXN0b21fb3B0aW9ucxgEIAEoDjIjLndnLmNvc21vLnBsYXRmb3JtLnYxLkN1c3RvbU9wdGlvbnNIAIgBAUIRCg9fY3VzdG9tX29wdGlvbnMikwEKH0FuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXJPcHRpb24SDQoFbGFiZWwYASABKAkSEgoFdmFsdWUYAiABKAlIAIgBARJDCghvcGVyYXRvchgDIAEoDjIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvckIICgZfdmFsdWUirwEKEEFuYWx5dGljc1ZpZXdSb3cSQAoFdmFsdWUYASADKAsyMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NWaWV3Um93LlZhbHVlRW50cnkaWQoKVmFsdWVFbnRyeRILCgNrZXkYASABKAkSOgoFdmFsdWUYAiABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NWaWV3Um93VmFsdWU6AjgBImUKFUFuYWx5dGljc1ZpZXdSb3dWYWx1ZRIWCgxudW1iZXJfdmFsdWUYASABKAFIABIWCgxzdHJpbmdfdmFsdWUYAiABKAlIABIUCgpib29sX3ZhbHVlGAMgASgISABCBgoEa2luZCKFAQoYR2V0QW5hbHl0aWNzVmlld1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoEdmlldxgCIAEoCzIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdSZXN1bHQihAEKIEdldERhc2hib2FyZEFuYWx5dGljc1ZpZXdSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCglzdGFydERhdGUYAiABKAkSDwoHZW5kRGF0ZRgDIAEoCRINCgVyYW5nZRgEIAEoBRIRCgluYW1lc3BhY2UYBSABKAkiVgoRUmVxdWVzdFNlcmllc0l0ZW0SEQoJdGltZXN0YW1wGAEgASgJEhUKDXRvdGFsUmVxdWVzdHMYAiABKAUSFwoPZXJyb3JlZFJlcXVlc3RzGAMgASgFIlwKFU9wZXJhdGlvblJlcXVlc3RDb3VudBIVCg1vcGVyYXRpb25IYXNoGAEgASgJEhUKDW9wZXJhdGlvbk5hbWUYAiABKAkSFQoNdG90YWxSZXF1ZXN0cxgDIAEoBSJqChVGZWRlcmF0ZWRHcmFwaE1ldHJpY3MSGAoQZmVkZXJhdGVkR3JhcGhJRBgBIAEoCRITCgtyZXF1ZXN0UmF0ZRgCIAEoAhIRCgllcnJvclJhdGUYAyABKAISDwoHbGF0ZW5jeRgEIAEoAiJeCg9TdWJncmFwaE1ldHJpY3MSEgoKc3ViZ3JhcGhJRBgBIAEoCRITCgtyZXF1ZXN0UmF0ZRgCIAEoAhIRCgllcnJvclJhdGUYAyABKAISDwoHbGF0ZW5jeRgEIAEoAiLvAgohR2V0RGFzaGJvYXJkQW5hbHl0aWNzVmlld1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoNcmVxdWVzdFNlcmllcxgCIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlcXVlc3RTZXJpZXNJdGVtEkwKF21vc3RSZXF1ZXN0ZWRPcGVyYXRpb25zGAMgAygLMisud2cuY29zbW8ucGxhdGZvcm0udjEuT3BlcmF0aW9uUmVxdWVzdENvdW50Ej4KD3N1YmdyYXBoTWV0cmljcxgEIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoTWV0cmljcxJKChVmZWRlcmF0ZWRHcmFwaE1ldHJpY3MYBSABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaE1ldHJpY3MiWwogQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlcXVlc3QSEQoJZ3JhcGhOYW1lGAEgASgJEhEKCXRva2VuTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiZAohQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDQoFdG9rZW4YAiABKAkiTAoVT3JnYW5pemF0aW9uR3JvdXBSdWxlEgwKBHJvbGUYASABKAkSEgoKbmFtZXNwYWNlcxgCIAMoCRIRCglyZXNvdXJjZXMYAyADKAki2AEKEU9yZ2FuaXphdGlvbkdyb3VwEg8KB2dyb3VwSWQYASABKAkSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIPCgdidWlsdGluGAQgASgIEhQKDG1lbWJlcnNDb3VudBgFIAEoBRI6CgVydWxlcxgGIAMoCzIrLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkdyb3VwUnVsZRIWCg5oYXNPaWRjTWFwcGVycxgHIAEoCBIUCgxhcGlLZXlzQ291bnQYCCABKAUiQwoeQ3JlYXRlT3JnYW5pemF0aW9uR3JvdXBSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkiiwEKH0NyZWF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI2CgVncm91cBgCIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkdyb3VwIh4KHEdldE9yZ2FuaXphdGlvbkdyb3Vwc1JlcXVlc3QiigEKHUdldE9yZ2FuaXphdGlvbkdyb3Vwc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoGZ3JvdXBzGAIgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuT3JnYW5pemF0aW9uR3JvdXAiNQoiR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVxdWVzdBIPCgdncm91cElkGAEgASgJIoADCiNHZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlElYKB21lbWJlcnMYAiADKAsyRS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZS5Hcm91cE1lbWJlchJWCgdhcGlLZXlzGAMgAygLMkUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVzcG9uc2UuR3JvdXBBcGlLZXkaOwoLR3JvdXBNZW1iZXISCgoCaWQYASABKAkSDQoFZW1haWwYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJGjoKC0dyb3VwQXBpS2V5EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJItcBCh5VcGRhdGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QSDwoHZ3JvdXBJZBgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRJNCgVydWxlcxgDIAMoCzI+LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdC5Hcm91cFJ1bGUaQAoJR3JvdXBSdWxlEgwKBHJvbGUYASABKAkSEgoKbmFtZXNwYWNlcxgCIAMoCRIRCglyZXNvdXJjZXMYAyADKAkiUwofVXBkYXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlcKHkRlbGV0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdBIPCgdncm91cElkGAEgASgJEhYKCXRvR3JvdXBJZBgCIAEoCUgAiAEBQgwKCl90b0dyb3VwSWQiUwofRGVsZXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIsABCglPcmdNZW1iZXISDgoGdXNlcklEGAEgASgJEg0KBWVtYWlsGAIgASgJEhMKC29yZ01lbWJlcklEGAMgASgJEg4KBmFjdGl2ZRgEIAEoCBIQCghqb2luZWRBdBgFIAEoCRI1CgZncm91cHMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PcmdNZW1iZXIuR3JvdXAaJgoFR3JvdXASDwoHZ3JvdXBJZBgBIAEoCRIMCgRuYW1lGAIgASgJIjUKFFBlbmRpbmdPcmdJbnZpdGF0aW9uEg4KBnVzZXJJRBgBIAEoCRINCgVlbWFpbBgCIAEoCSJ8CiRHZXRQZW5kaW5nT3JnYW5pemF0aW9uTWVtYmVyc1JlcXVlc3QSNAoKcGFnaW5hdGlvbhgBIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlBhZ2luYXRpb24SEwoGc2VhcmNoGAIgASgJSACIAQFCCQoHX3NlYXJjaCK2AQolR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkYKEnBlbmRpbmdJbnZpdGF0aW9ucxgCIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLlBlbmRpbmdPcmdJbnZpdGF0aW9uEhMKC3RvdGFsX2NvdW50GAMgASgFInUKHUdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXF1ZXN0EjQKCnBhZ2luYXRpb24YASABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEhMKBnNlYXJjaBgCIAEoCUgAiAEBQgkKB19zZWFyY2gimQEKHkdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKB21lbWJlcnMYAiADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PcmdNZW1iZXISEwoLdG90YWxfY291bnQYAyABKAUiMgoRSW52aXRlVXNlclJlcXVlc3QSDQoFZW1haWwYASABKAkSDgoGZ3JvdXBzGAIgAygJIkYKEkludml0ZVVzZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjQKEkludml0ZVVzZXJzUmVxdWVzdBIOCgZlbWFpbHMYASADKAkSDgoGZ3JvdXBzGAIgAygJIjoKGkludml0ZVVzZXJzSW52aXRhdGlvbkVycm9yEg0KBWVtYWlsGAEgASgJEg0KBWVycm9yGAIgASgJIpMBChNJbnZpdGVVc2Vyc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSgoQaW52aXRhdGlvbkVycm9ycxgCIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkludml0ZVVzZXJzSW52aXRhdGlvbkVycm9yIuYBCgZBUElLZXkSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIRCgljcmVhdGVkQnkYAyABKAkSEQoJY3JlYXRlZEF0GAQgASgJEhIKCmxhc3RVc2VkQXQYBSABKAkSEQoJZXhwaXJlc0F0GAYgASgJEjYKBWdyb3VwGAcgASgLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuQVBJS2V5Lkdyb3VwSACIAQESEAoIZXh0ZXJuYWwYCCABKAgaIQoFR3JvdXASCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCUIICgZfZ3JvdXAiMgoRR2V0QVBJS2V5c1JlcXVlc3QSDQoFbGltaXQYASABKAUSDgoGb2Zmc2V0GAIgASgFIoQBChJHZXRBUElLZXlzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgdhcGlLZXlzGAIgAygLMhwud2cuY29zbW8ucGxhdGZvcm0udjEuQVBJS2V5Eg0KBWNvdW50GAMgASgFIq8BChNDcmVhdGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkSDgoGdXNlcklEGAIgASgJEjAKB2V4cGlyZXMYAyABKA4yHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FeHBpcmVzQXQSDwoHZ3JvdXBJZBgEIAEoCRITCgtwZXJtaXNzaW9ucxgFIAMoCRIVCghleHRlcm5hbBgGIAEoCEgAiAEBQgsKCV9leHRlcm5hbCJYChRDcmVhdGVBUElLZXlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEg4KBmFwaUtleRgCIAEoCSIjChNEZWxldGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkiSAoURGVsZXRlQVBJS2V5UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI0ChNVcGRhdGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkSDwoHZ3JvdXBJZBgCIAEoCSJIChRVcGRhdGVBUElLZXlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjAKH1JlbW92ZU9yZ2FuaXphdGlvbk1lbWJlclJlcXVlc3QSDQoFZW1haWwYASABKAkiVAogUmVtb3ZlT3JnYW5pemF0aW9uTWVtYmVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIoChdSZW1vdmVJbnZpdGF0aW9uUmVxdWVzdBINCgVlbWFpbBgBIAEoCSJMChhSZW1vdmVJbnZpdGF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJSChhNaWdyYXRlRnJvbUFwb2xsb1JlcXVlc3QSDgoGYXBpS2V5GAEgASgJEhMKC3ZhcmlhbnROYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJcChlNaWdyYXRlRnJvbUFwb2xsb1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDQoFdG9rZW4YAiABKAkizAIKBFNwYW4SEQoJdGltZXN0YW1wGAEgASgDEhEKCXNjb3BlTmFtZRgCIAEoCRIPCgd0cmFjZUlEGAMgASgJEg4KBnNwYW5JRBgEIAEoCRIUCgxwYXJlbnRTcGFuSUQYBSABKAkSEAoIc3Bhbk5hbWUYBiABKAkSEAoIc3BhbktpbmQYByABKAkSEAoIZHVyYXRpb24YCCABKAMSEwoLc2VydmljZU5hbWUYCSABKAkSEgoKc3RhdHVzQ29kZRgKIAEoCRIVCg1zdGF0dXNNZXNzYWdlGAsgASgJEj4KCmF0dHJpYnV0ZXMYDCADKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TcGFuLkF0dHJpYnV0ZXNFbnRyeRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJKCg9HZXRUcmFjZVJlcXVlc3QSCgoCaWQYASABKAkSDwoHc3Bhbl9pZBgCIAEoCRIaChJmZWRlcmF0ZWRfZ3JhcGhfaWQYAyABKAkibwoQR2V0VHJhY2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEikKBXNwYW5zGAIgAygLMhoud2cuY29zbW8ucGxhdGZvcm0udjEuU3BhbiIPCg1XaG9BbUlSZXF1ZXN0Iu0BCg5XaG9BbUlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhgKEG9yZ2FuaXphdGlvbk5hbWUYAiABKAkSFgoJdXNlckVtYWlsGAMgASgJSACIAQESGAoQb3JnYW5pemF0aW9uU2x1ZxgEIAEoCRIWCg5vcmdhbml6YXRpb25JZBgFIAEoCRI3Cgxsb2dpbl9tZXRob2QYBiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Mb2dpbk1ldGhvZEIMCgpfdXNlckVtYWlsIs0BCgtMb2dpbk1ldGhvZBIzCgR0eXBlGAEgASgOMiUud2cuY29zbW8ucGxhdGZvcm0udjEuTG9naW5NZXRob2RUeXBlEhcKD3Nzb19wcm92aWRlcl9pZBgCIAEoCRIZChFzc29fcHJvdmlkZXJfbmFtZRgDIAEoCRIRCglzc29fYWxpYXMYBCABKAkSQgoPc29jaWFsX3Byb3ZpZGVyGAUgASgOMikud2cuY29zbW8ucGxhdGZvcm0udjEuU29jaWFsTG9naW5Qcm92aWRlciJQCgtSb3V0ZXJUb2tlbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxjcmVhdG9yRW1haWwYBSABKAkiRQoaR2VuZXJhdGVSb3V0ZXJUb2tlblJlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJeChtHZW5lcmF0ZVJvdXRlclRva2VuUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRINCgV0b2tlbhgCIAEoCSJBChZHZXRSb3V0ZXJUb2tlbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkifgoXR2V0Um91dGVyVG9rZW5zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIxCgZ0b2tlbnMYAiADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Sb3V0ZXJUb2tlbiJWChhEZWxldGVSb3V0ZXJUb2tlblJlcXVlc3QSEQoJdG9rZW5OYW1lGAEgASgJEhQKDGZlZEdyYXBoTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiTQoZRGVsZXRlUm91dGVyVG9rZW5SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjIKElBlcnNpc3RlZE9wZXJhdGlvbhIKCgJpZBgBIAEoCRIQCghjb250ZW50cxgCIAEoCSKeAQohUHVibGlzaFBlcnNpc3RlZE9wZXJhdGlvbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRISCgpjbGllbnROYW1lGAIgASgJEjwKCm9wZXJhdGlvbnMYAyADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QZXJzaXN0ZWRPcGVyYXRpb24SEQoJbmFtZXNwYWNlGAQgASgJIoYBChJQdWJsaXNoZWRPcGVyYXRpb24SCgoCaWQYASABKAkSDAoEaGFzaBgCIAEoCRI+CgZzdGF0dXMYAyABKA4yLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoZWRPcGVyYXRpb25TdGF0dXMSFgoOb3BlcmF0aW9uTmFtZXMYBCADKAkilAEKIlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI8CgpvcGVyYXRpb25zGAIgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaGVkT3BlcmF0aW9uInMKH0RlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRISCgpjbGllbnROYW1lGAMgASgJEhMKC29wZXJhdGlvbklkGAQgASgJIoMCCiBEZWxldGVQZXJzaXN0ZWRPcGVyYXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlElMKCW9wZXJhdGlvbhgCIAEoCzJALndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlc3BvbnNlLk9wZXJhdGlvbhpYCglPcGVyYXRpb24SCgoCaWQYASABKAkSEwoLb3BlcmF0aW9uSWQYAiABKAkSEgoKY2xpZW50TmFtZRgDIAEoCRIWCg5vcGVyYXRpb25OYW1lcxgEIAMoCSJ5CiVDaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLb3BlcmF0aW9uSWQYAyABKAkSEgoKY2xpZW50TmFtZRgEIAEoCSKjAgomQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJZCglvcGVyYXRpb24YAiABKAsyRi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXNwb25zZS5PcGVyYXRpb24abAoJT3BlcmF0aW9uEgoKAmlkGAEgASgJEhMKC29wZXJhdGlvbklkGAIgASgJEhIKCmNsaWVudE5hbWUYAyABKAkSFgoOb3BlcmF0aW9uTmFtZXMYBCADKAkSEgoKaGFzVHJhZmZpYxgFIAEoCCJjCh1HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgljbGllbnRfaWQYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIpcCCh5HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJSCgpvcGVyYXRpb25zGAIgAygLMj4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVyc2lzdGVkT3BlcmF0aW9uc1Jlc3BvbnNlLk9wZXJhdGlvbhpvCglPcGVyYXRpb24SCgoCaWQYASABKAkSEAoIY29udGVudHMYAiABKAkSEgoKY3JlYXRlZF9hdBgDIAEoCRIXCg9sYXN0X3VwZGF0ZWRfYXQYBCABKAkSFwoPb3BlcmF0aW9uX25hbWVzGAUgAygJIiQKBkhlYWRlchILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAkijwEKJkNyZWF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXF1ZXN0EhAKCGVuZHBvaW50GAEgASgJEgsKA2tleRgCIAEoCRIOCgZldmVudHMYAyADKAkSNgoLZXZlbnRzX21ldGEYBCADKAsyIS53Zy5jb3Ntby5ub3RpZmljYXRpb25zLkV2ZW50TWV0YSJ2CidDcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIZChF3ZWJob29rX2NvbmZpZ19pZBgCIAEoCSImCiRHZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlnc1JlcXVlc3Qi5gEKJUdldE9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJTCgdjb25maWdzGAIgAygLMkIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ3NSZXNwb25zZS5Db25maWcaNgoGQ29uZmlnEgoKAmlkGAEgASgJEhAKCGVuZHBvaW50GAIgASgJEg4KBmV2ZW50cxgDIAMoCSIvCiFHZXRPcmdhbml6YXRpb25XZWJob29rTWV0YVJlcXVlc3QSCgoCaWQYASABKAkijgEKIkdldE9yZ2FuaXphdGlvbldlYmhvb2tNZXRhUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI2CgtldmVudHNfbWV0YRgCIAMoCzIhLndnLmNvc21vLm5vdGlmaWNhdGlvbnMuRXZlbnRNZXRhIrYBCiZVcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVxdWVzdBIKCgJpZBgBIAEoCRIQCghlbmRwb2ludBgCIAEoCRILCgNrZXkYAyABKAkSDgoGZXZlbnRzGAQgAygJEjYKC2V2ZW50c19tZXRhGAUgAygLMiEud2cuY29zbW8ubm90aWZpY2F0aW9ucy5FdmVudE1ldGESGQoRc2hvdWxkX3VwZGF0ZV9rZXkYBiABKAgiWwonVXBkYXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiNAomRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QSCgoCaWQYASABKAkiWwonRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiiwEKGENyZWF0ZUludGVncmF0aW9uUmVxdWVzdBIMCgR0eXBlGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEY29kZRgDIAEoCRIOCgZldmVudHMYBCADKAkSNQoKZXZlbnRzTWV0YRgFIAMoCzIhLndnLmNvc21vLm5vdGlmaWNhdGlvbnMuRXZlbnRNZXRhIk0KGUNyZWF0ZUludGVncmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIkCiJHZXRPcmdhbml6YXRpb25JbnRlZ3JhdGlvbnNSZXF1ZXN0IioKFlNsYWNrSW50ZWdyYXRpb25Db25maWcSEAoIZW5kcG9pbnQYASABKAkiogEKEUludGVncmF0aW9uQ29uZmlnEjMKBHR5cGUYASABKA4yJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnRlZ3JhdGlvblR5cGUSTgoWc2xhY2tJbnRlZ3JhdGlvbkNvbmZpZxgCIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLlNsYWNrSW50ZWdyYXRpb25Db25maWdIAEIICgZjb25maWciwAEKC0ludGVncmF0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIOCgZldmVudHMYBCADKAkSQgoRaW50ZWdyYXRpb25Db25maWcYBSABKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnRlZ3JhdGlvbkNvbmZpZxI1CgpldmVudHNNZXRhGAYgAygLMiEud2cuY29zbW8ubm90aWZpY2F0aW9ucy5FdmVudE1ldGEikAEKI0dldE9yZ2FuaXphdGlvbkludGVncmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoMaW50ZWdyYXRpb25zGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuSW50ZWdyYXRpb24ihgEKHlVwZGF0ZUludGVncmF0aW9uQ29uZmlnUmVxdWVzdBIKCgJpZBgBIAEoCRIQCghlbmRwb2ludBgCIAEoCRIOCgZldmVudHMYAyADKAkSNgoLZXZlbnRzX21ldGEYBCADKAsyIS53Zy5jb3Ntby5ub3RpZmljYXRpb25zLkV2ZW50TWV0YSJTCh9VcGRhdGVJbnRlZ3JhdGlvbkNvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiJgoYRGVsZXRlSW50ZWdyYXRpb25SZXF1ZXN0EgoKAmlkGAEgASgJIk0KGURlbGV0ZUludGVncmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIrChlEZWxldGVPcmdhbml6YXRpb25SZXF1ZXN0Eg4KBnVzZXJJRBgBIAEoCSJOChpEZWxldGVPcmdhbml6YXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIhwKGlJlc3RvcmVPcmdhbml6YXRpb25SZXF1ZXN0Ik8KG1Jlc3RvcmVPcmdhbml6YXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIhoKGExlYXZlT3JnYW5pemF0aW9uUmVxdWVzdCJNChlMZWF2ZU9yZ2FuaXphdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiZgogVXBkYXRlT3JnYW5pemF0aW9uRGV0YWlsc1JlcXVlc3QSDgoGdXNlcklEGAEgASgJEhgKEG9yZ2FuaXphdGlvbk5hbWUYAiABKAkSGAoQb3JnYW5pemF0aW9uU2x1ZxgDIAEoCSJVCiFVcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJGChtVcGRhdGVPcmdNZW1iZXJHcm91cFJlcXVlc3QSFwoPb3JnTWVtYmVyVXNlcklEGAEgASgJEg4KBmdyb3VwcxgCIAMoCSJQChxVcGRhdGVPcmdNZW1iZXJHcm91cFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiRQoZQ3JlYXRlT3JnYW5pemF0aW9uUmVxdWVzdBIMCgRuYW1lGAEgASgJEgwKBHNsdWcYAiABKAkSDAoEcGxhbhgDIAEoCSLQAQoaQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9Cgxvcmdhbml6YXRpb24YAiABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25IAIgBARIcCg9zdHJpcGVTZXNzaW9uSWQYAyABKAlIAYgBAUIPCg1fb3JnYW5pemF0aW9uQhIKEF9zdHJpcGVTZXNzaW9uSWQidwoMT3JnYW5pemF0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2x1ZxgDIAEoCRIaCg1jcmVhdG9yVXNlcklkGAQgASgJSACIAQESEQoJY3JlYXRlZEF0GAUgASgJQhAKDl9jcmVhdG9yVXNlcklkIiwKHEdldE9yZ2FuaXphdGlvbkJ5U2x1Z1JlcXVlc3QSDAoEc2x1ZxgBIAEoCSKhAQodR2V0T3JnYW5pemF0aW9uQnlTbHVnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9Cgxvcmdhbml6YXRpb24YAiABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25IAIgBAUIPCg1fb3JnYW5pemF0aW9uIhgKFkdldEJpbGxpbmdQbGFuc1JlcXVlc3Qi9wIKF0dldEJpbGxpbmdQbGFuc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSAoFcGxhbnMYAiADKAsyOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZS5CaWxsaW5nUGxhbhpTChJCaWxsaW5nUGxhbkZlYXR1cmUSCgoCaWQYASABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEgoFbGltaXQYBCABKAVIAIgBAUIICgZfbGltaXQaigEKC0JpbGxpbmdQbGFuEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDQoFcHJpY2UYAyABKAUSUgoIZmVhdHVyZXMYBCADKAsyQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZS5CaWxsaW5nUGxhbkZlYXR1cmUiLAocQ3JlYXRlQ2hlY2tvdXRTZXNzaW9uUmVxdWVzdBIMCgRwbGFuGAEgASgJImQKHUNyZWF0ZUNoZWNrb3V0U2Vzc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEQoJc2Vzc2lvbklkGAIgASgJIiMKIUNyZWF0ZUJpbGxpbmdQb3J0YWxTZXNzaW9uUmVxdWVzdCJ2CiJDcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEQoJc2Vzc2lvbklkGAIgASgJEgsKA3VybBgDIAEoCSIiChJVcGdyYWRlUGxhblJlcXVlc3QSDAoEcGxhbhgBIAEoCSJHChNVcGdyYWRlUGxhblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiwgEKFkdldEdyYXBoTWV0cmljc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEg0KBXJhbmdlGAIgASgFEjIKCWRhdGVSYW5nZRgDIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZRI2CgdmaWx0ZXJzGAQgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzRmlsdGVyEhEKCW5hbWVzcGFjZRgFIAEoCSLyAgoXR2V0R3JhcGhNZXRyaWNzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI+CghyZXF1ZXN0cxgCIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSPQoHbGF0ZW5jeRgDIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSPAoGZXJyb3JzGAQgASgLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuTWV0cmljc0Rhc2hib2FyZE1ldHJpYxJACgdmaWx0ZXJzGAUgAygLMi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlchIXCgpyZXNvbHV0aW9uGAYgASgJSACIAQFCDQoLX3Jlc29sdXRpb24iwQEKFk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSDQoFdmFsdWUYASABKAkSGgoNcHJldmlvdXNWYWx1ZRgCIAEoCUgAiAEBEjEKA3RvcBgDIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NUb3BJdGVtEjcKBnNlcmllcxgEIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NTZXJpZXNJdGVtQhAKDl9wcmV2aW91c1ZhbHVlIlAKDk1ldHJpY3NUb3BJdGVtEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRITCgtpc1BlcnNpc3RlZBgEIAEoCCKxAQoRTWV0cmljc1Nlcmllc0l0ZW0SEQoJdGltZXN0YW1wGAEgASgJEg0KBXZhbHVlGAIgASgJEhoKDXByZXZpb3VzVmFsdWUYAyABKAlIAIgBARIQCgNwNTAYBCABKAlIAYgBARIQCgNwOTAYBSABKAlIAogBARIQCgNwOTkYBiABKAlIA4gBAUIQCg5fcHJldmlvdXNWYWx1ZUIGCgRfcDUwQgYKBF9wOTBCBgoEX3A5OSK7AQoQTWV0cmljc0Rhc2hib2FyZBIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSLQoEdW5pdBgEIAEoDjIaLndnLmNvc21vLnBsYXRmb3JtLnYxLlVuaXRIAIgBARIWCglpc19oaWRkZW4YBSABKAhIAYgBARITCgZpc19jdGEYBiABKAhIAogBAUIHCgVfdW5pdEIMCgpfaXNfaGlkZGVuQgkKB19pc19jdGEixgEKGkdldE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRINCgVyYW5nZRgCIAEoBRIyCglkYXRlUmFuZ2UYAyABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USNgoHZmlsdGVycxgEIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc0ZpbHRlchIRCgluYW1lc3BhY2UYBSABKAkiuQEKG0dldE1ldHJpY3NFcnJvclJhdGVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkAKBnNlcmllcxgCIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NFcnJvclJhdGVTZXJpZXNJdGVtEhcKCnJlc29sdXRpb24YAyABKAlIAIgBAUINCgtfcmVzb2x1dGlvbiJXChpNZXRyaWNzRXJyb3JSYXRlU2VyaWVzSXRlbRIRCgl0aW1lc3RhbXAYASABKAkSEwoLcmVxdWVzdFJhdGUYAiABKAISEQoJZXJyb3JSYXRlGAMgASgCIr8BChlHZXRTdWJncmFwaE1ldHJpY3NSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFcmFuZ2UYBCABKAUSMgoJZGF0ZVJhbmdlGAUgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEjYKB2ZpbHRlcnMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NGaWx0ZXIi9QIKGkdldFN1YmdyYXBoTWV0cmljc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoIcmVxdWVzdHMYAiABKAsyLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NZXRyaWNzRGFzaGJvYXJkTWV0cmljEj0KB2xhdGVuY3kYAyABKAsyLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NZXRyaWNzRGFzaGJvYXJkTWV0cmljEjwKBmVycm9ycxgEIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSQAoHZmlsdGVycxgFIAMoCzIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXISFwoKcmVzb2x1dGlvbhgGIAEoCUgAiAEBQg0KC19yZXNvbHV0aW9uIsgBCiJHZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFcmFuZ2UYBCABKAUSMgoJZGF0ZVJhbmdlGAUgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEjYKB2ZpbHRlcnMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NGaWx0ZXIiwQEKI0dldFN1YmdyYXBoTWV0cmljc0Vycm9yUmF0ZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQAoGc2VyaWVzGAIgAygLMjAud2cuY29zbW8ucGxhdGZvcm0udjEuTWV0cmljc0Vycm9yUmF0ZVNlcmllc0l0ZW0SFwoKcmVzb2x1dGlvbhgDIAEoCUgAiAEBQg0KC19yZXNvbHV0aW9uIlMKGEZvcmNlQ2hlY2tTdWNjZXNzUmVxdWVzdBIQCghjaGVja19pZBgBIAEoCRISCgpncmFwaF9uYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJNChlGb3JjZUNoZWNrU3VjY2Vzc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UimAEKLFRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXF1ZXN0EhAKCGNoZWNrX2lkGAEgASgJEg8KB2lzX3NhZmUYAiABKAgSEgoKZ3JhcGhfbmFtZRgDIAEoCRIRCgluYW1lc3BhY2UYBCABKAkSEwoGc2VhcmNoGAUgASgJSACIAQFCCQoHX3NlYXJjaCJhCi1Ub2dnbGVDaGFuZ2VPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKHAQosQ3JlYXRlSWdub3JlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9uc1JlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSEwoGc2VhcmNoGAQgASgJSACIAQFCCQoHX3NlYXJjaCJhCi1DcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJACg5PdmVycmlkZUNoYW5nZRISCgpjaGFuZ2VUeXBlGAEgASgJEhEKBHBhdGgYAiABKAlIAIgBAUIHCgVfcGF0aCKvAQofQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5vcGVyYXRpb25faGFzaBgDIAEoCRIWCg5vcGVyYXRpb25fbmFtZRgEIAEoCRI1CgdjaGFuZ2VzGAUgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuT3ZlcnJpZGVDaGFuZ2UiVAogQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKAAQonQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXF1ZXN0EhIKCmdyYXBoX25hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhYKDm9wZXJhdGlvbl9oYXNoGAMgASgJEhYKDm9wZXJhdGlvbl9uYW1lGAQgASgJIlwKKENyZWF0ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKXAQofUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5vcGVyYXRpb25faGFzaBgDIAEoCRI1CgdjaGFuZ2VzGAQgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuT3ZlcnJpZGVDaGFuZ2UiVAogUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJoCidSZW1vdmVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZVJlcXVlc3QSEgoKZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFgoOb3BlcmF0aW9uX2hhc2gYAyABKAkiXAooUmVtb3ZlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIl0KHEdldE9wZXJhdGlvbk92ZXJyaWRlc1JlcXVlc3QSEgoKZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFgoOb3BlcmF0aW9uX2hhc2gYAyABKAkinAEKHUdldE9wZXJhdGlvbk92ZXJyaWRlc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNQoHY2hhbmdlcxgCIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLk92ZXJyaWRlQ2hhbmdlEhIKCmlnbm9yZV9hbGwYAyABKAgiXgoWR2V0QWxsT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRINCgVsaW1pdBgDIAEoBRIOCgZvZmZzZXQYBCABKAUiowIKF0dldEFsbE92ZXJyaWRlc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSQoJb3ZlcnJpZGVzGAIgAygLMjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QWxsT3ZlcnJpZGVzUmVzcG9uc2UuT3ZlcnJpZGUSEwoLdG90YWxfY291bnQYAyABKAUadgoIT3ZlcnJpZGUSDAoEaGFzaBgBIAEoCRIMCgRuYW1lGAIgASgJEhwKFGNoYW5nZXNPdmVycmlkZUNvdW50GAMgASgNEhwKFGhhc0lnbm9yZUFsbE92ZXJyaWRlGAQgASgIEhIKCnVwZGF0ZWRfYXQYBSABKAkiTgobSXNHaXRIdWJBcHBJbnN0YWxsZWRSZXF1ZXN0Ei8KCGdpdF9pbmZvGAEgASgLMh0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2l0SW5mbyJmChxJc0dpdEh1YkFwcEluc3RhbGxlZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USFAoMaXNfaW5zdGFsbGVkGAIgASgIIjAKC0dyb3VwTWFwcGVyEg8KB2dyb3VwSWQYASABKAkSEAoIc3NvR3JvdXAYAiABKAkioAEKGUNyZWF0ZU9JRENQcm92aWRlclJlcXVlc3QSDAoEbmFtZRgBIAEoCRIZChFkaXNjb3ZlcnlFbmRwb2ludBgCIAEoCRIQCghjbGllbnRJRBgDIAEoCRIUCgxjbGllbnRTZWNyZXQYBCABKAkSMgoHbWFwcGVycxgFIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyb3VwTWFwcGVyIocBChpDcmVhdGVPSURDUHJvdmlkZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhEKCXNpZ25JblVSTBgCIAEoCRISCgpzaWduT3V0VVJMGAMgASgJEhAKCGxvZ2luVVJMGAQgASgJIqwBCgxPSURDUHJvdmlkZXISCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRINCgVhbGlhcxgDIAEoCRIQCghlbmRwb2ludBgEIAEoCRIRCglsb2dpbl91cmwYBSABKAkSHAoUc2lnbl9pbl9yZWRpcmVjdF91cmwYBiABKAkSHQoVc2lnbl9vdXRfcmVkaXJlY3RfdXJsGAcgASgJEhEKCWNyZWF0ZWRBdBgIIAEoCSIaChhMaXN0T0lEQ1Byb3ZpZGVyc1JlcXVlc3QihAEKGUxpc3RPSURDUHJvdmlkZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI1Cglwcm92aWRlcnMYAiADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PSURDUHJvdmlkZXIiJAoWR2V0T0lEQ1Byb3ZpZGVyUmVxdWVzdBIKCgJpZBgBIAEoCSLoAQoXR2V0T0lEQ1Byb3ZpZGVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIMCgRuYW1lGAIgASgJEhAKCGVuZHBvaW50GAMgASgJEhAKCGxvZ2luVVJMGAQgASgJEhkKEXNpZ25JblJlZGlyZWN0VVJMGAUgASgJEhoKEnNpZ25PdXRSZWRpcmVjdFVSTBgGIAEoCRIyCgdtYXBwZXJzGAcgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuR3JvdXBNYXBwZXIiJwoZRGVsZXRlT0lEQ1Byb3ZpZGVyUmVxdWVzdBIKCgJpZBgBIAEoCSJOChpEZWxldGVPSURDUHJvdmlkZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlkKF1VwZGF0ZUlEUE1hcHBlcnNSZXF1ZXN0EjIKB21hcHBlcnMYASADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Hcm91cE1hcHBlchIKCgJpZBgCIAEoCSJMChhVcGRhdGVJRFBNYXBwZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIlCiNHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVxdWVzdCJnCiRHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRINCgVjb3VudBgCIAEoAyKjAQoST3JnYW5pemF0aW9uSW52aXRlEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2x1ZxgDIAEoCRIaCg1jcmVhdG9yVXNlcklkGAQgASgJSACIAQESEQoJY3JlYXRlZEF0GAUgASgJEhYKCWludml0ZWRCeRgGIAEoCUgBiAEBQhAKDl9jcmVhdG9yVXNlcklkQgwKCl9pbnZpdGVkQnkiWAoTR2V0QXVkaXRMb2dzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJc3RhcnREYXRlGAMgASgJEg8KB2VuZERhdGUYBCABKAkimwIKCEF1ZGl0TG9nEgoKAmlkGAEgASgJEhgKEGFjdG9yRGlzcGxheU5hbWUYAiABKAkSDgoGYWN0aW9uGAMgASgJEhEKCWFjdG9yVHlwZRgEIAEoCRITCgthdWRpdEFjdGlvbhgFIAEoCRIcChRhdWRpdGFibGVEaXNwbGF5TmFtZRgGIAEoCRIZChF0YXJnZXREaXNwbGF5TmFtZRgHIAEoCRISCgp0YXJnZXRUeXBlGAggASgJEhEKCWNyZWF0ZWRBdBgJIAEoCRIZChF0YXJnZXROYW1lc3BhY2VJZBgKIAEoCRIiChp0YXJnZXROYW1lc3BhY2VEaXNwbGF5TmFtZRgLIAEoCRISCgphcGlLZXlOYW1lGAwgASgJIoUBChRHZXRBdWRpdExvZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEiwKBGxvZ3MYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BdWRpdExvZxINCgVjb3VudBgDIAEoBSIXChVHZXRJbnZpdGF0aW9uc1JlcXVlc3QiiQEKFkdldEludml0YXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9CgtpbnZpdGF0aW9ucxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkludml0ZSJKCiBBY2NlcHRPckRlY2xpbmVJbnZpdGF0aW9uUmVxdWVzdBIWCg5vcmdhbml6YXRpb25JZBgBIAEoCRIOCgZhY2NlcHQYAiABKAgiVQohQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiswUKEEdyYXBoQ29tcG9zaXRpb24SCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxpc0NvbXBvc2FibGUYBCABKAgSHgoRY29tcG9zaXRpb25FcnJvcnMYBSABKAlIAIgBARIWCgljcmVhdGVkQnkYBiABKAlIAYgBARIVCg1pc0xhdGVzdFZhbGlkGAcgASgIEiIKFXJvdXRlckNvbmZpZ1NpZ25hdHVyZRgIIAEoCUgCiAEBEhsKDmFkbWlzc2lvbkVycm9yGAkgASgJSAOIAQESHAoPZGVwbG95bWVudEVycm9yGAogASgJSASIAQESKAobaGFzTXVsdGlwbGVDaGFuZ2VkU3ViZ3JhcGhzGAsgASgISAWIAQESJAoXdHJpZ2dlcmVkQnlTdWJncmFwaE5hbWUYDCABKAlIBogBARIgChNjb21wb3NpdGlvbldhcm5pbmdzGA0gASgJSAeIAQESJAoccm91dGVyX2NvbXBhdGliaWxpdHlfdmVyc2lvbhgOIAEoCRIgChhpc0ZlYXR1cmVGbGFnQ29tcG9zaXRpb24YDyABKAgSHAoPZmVhdHVyZUZsYWdOYW1lGBAgASgJSAiIAQFCFAoSX2NvbXBvc2l0aW9uRXJyb3JzQgwKCl9jcmVhdGVkQnlCGAoWX3JvdXRlckNvbmZpZ1NpZ25hdHVyZUIRCg9fYWRtaXNzaW9uRXJyb3JCEgoQX2RlcGxveW1lbnRFcnJvckIeChxfaGFzTXVsdGlwbGVDaGFuZ2VkU3ViZ3JhcGhzQhoKGF90cmlnZ2VyZWRCeVN1YmdyYXBoTmFtZUIWChRfY29tcG9zaXRpb25XYXJuaW5nc0ISChBfZmVhdHVyZUZsYWdOYW1lIskBChhHcmFwaENvbXBvc2l0aW9uU3ViZ3JhcGgSCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEgwKBG5hbWUYAyABKAkSEQoJdGFyZ2V0X2lkGAQgASgJEhkKEWlzRmVhdHVyZVN1YmdyYXBoGAUgASgIEhIKCmNoYW5nZVR5cGUYBiABKAkSOAoMc3ViZ3JhcGhUeXBlGAcgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlIqwBChZHZXRDb21wb3NpdGlvbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRINCgVsaW1pdBgCIAEoBRIOCgZvZmZzZXQYAyABKAUSEQoJc3RhcnREYXRlGAQgASgJEg8KB2VuZERhdGUYBSABKAkSEQoJbmFtZXNwYWNlGAYgASgJEiYKHmV4Y2x1ZGVGZWF0dXJlRmxhZ0NvbXBvc2l0aW9ucxgHIAEoCCKYAQoXR2V0Q29tcG9zaXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI8Cgxjb21wb3NpdGlvbnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaENvbXBvc2l0aW9uEg0KBWNvdW50GAMgASgFIkgKHEdldENvbXBvc2l0aW9uRGV0YWlsc1JlcXVlc3QSFQoNY29tcG9zaXRpb25JZBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkitQMKFkZlYXR1cmVGbGFnQ29tcG9zaXRpb24SCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxpc0NvbXBvc2FibGUYBCABKAgSHgoRY29tcG9zaXRpb25FcnJvcnMYBSABKAlIAIgBARIWCgljcmVhdGVkQnkYBiABKAlIAYgBARIiChVyb3V0ZXJDb25maWdTaWduYXR1cmUYByABKAlIAogBARIbCg5hZG1pc3Npb25FcnJvchgIIAEoCUgDiAEBEhwKD2RlcGxveW1lbnRFcnJvchgJIAEoCUgEiAEBEhcKD2ZlYXR1cmVGbGFnTmFtZRgKIAEoCRIgChNjb21wb3NpdGlvbldhcm5pbmdzGAsgASgJSAWIAQFCFAoSX2NvbXBvc2l0aW9uRXJyb3JzQgwKCl9jcmVhdGVkQnlCGAoWX3JvdXRlckNvbmZpZ1NpZ25hdHVyZUIRCg9fYWRtaXNzaW9uRXJyb3JCEgoQX2RlcGxveW1lbnRFcnJvckIWChRfY29tcG9zaXRpb25XYXJuaW5ncyLlAgodR2V0Q29tcG9zaXRpb25EZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI7Cgtjb21wb3NpdGlvbhgCIAEoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoQ29tcG9zaXRpb24STAoUY29tcG9zaXRpb25TdWJncmFwaHMYAyADKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaENvbXBvc2l0aW9uU3ViZ3JhcGgSOAoMY2hhbmdlQ291bnRzGAQgASgLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hhbmdlQ291bnRzEk0KF2ZlYXR1cmVGbGFnQ29tcG9zaXRpb25zGAUgAygLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZUZsYWdDb21wb3NpdGlvbiJKChxHZXRTZGxCeVNjaGVtYVZlcnNpb25SZXF1ZXN0EhcKD3NjaGVtYVZlcnNpb25JZBgBIAEoCRIRCgl0YXJnZXRfaWQYAiABKAkidQodR2V0U2RsQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRILCgNzZGwYAiABKAkSFQoNY2xpZW50X3NjaGVtYRgDIAEoCSI9CiJHZXRDaGFuZ2Vsb2dCeVNjaGVtYVZlcnNpb25SZXF1ZXN0EhcKD3NjaGVtYVZlcnNpb25JZBgBIAEoCSKfAQojR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJGCgljaGFuZ2Vsb2cYAiABKAsyMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ091dHB1dCIjCiFHZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1JlcXVlc3QiqwQKIkdldFVzZXJBY2Nlc3NpYmxlUmVzb3VyY2VzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJWCgpuYW1lc3BhY2VzGAIgAygLMkIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZS5OYW1lc3BhY2USYAoPZmVkZXJhdGVkR3JhcGhzGAMgAygLMkcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZS5GZWRlcmF0ZWRHcmFwaBJUCglzdWJncmFwaHMYBCADKAsyQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1Jlc3BvbnNlLlN1YkdyYXBoGiUKCU5hbWVzcGFjZRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJGkMKDkZlZGVyYXRlZEdyYXBoEhAKCHRhcmdldElkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJGlcKCFN1YkdyYXBoEhAKCHRhcmdldElkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhgKEGZlZGVyYXRlZEdyYXBoSWQYBCABKAkiYAocVXBkYXRlRmVhdHVyZVNldHRpbmdzUmVxdWVzdBIOCgZlbmFibGUYASABKAgSMAoJZmVhdHVyZUlkGAIgASgOMh0ud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZSJRCh1VcGRhdGVGZWF0dXJlU2V0dGluZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIkQKGUdldFN1YmdyYXBoTWVtYmVyc1JlcXVlc3QSFAoMc3ViZ3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJJCg5TdWJncmFwaE1lbWJlchIOCgZ1c2VySWQYASABKAkSDQoFZW1haWwYAiABKAkSGAoQc3ViZ3JhcGhNZW1iZXJJZBgEIAEoCSKFAQoaR2V0U3ViZ3JhcGhNZW1iZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI1CgdtZW1iZXJzGAIgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhNZW1iZXIiSQoQQWRkUmVhZG1lUmVxdWVzdBISCgp0YXJnZXROYW1lGAEgASgJEg4KBnJlYWRtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiRQoRQWRkUmVhZG1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLjAgoGUm91dGVyEhAKCGhvc3RuYW1lGAEgASgJEhMKC2NsdXN0ZXJOYW1lGAIgASgJEhMKC3NlcnZpY2VOYW1lGAMgASgJEhYKDnNlcnZpY2VWZXJzaW9uGAQgASgJEhkKEXNlcnZpY2VJbnN0YW5jZUlkGAUgASgJEhUKDXVwdGltZVNlY29uZHMYBiABKAkSGwoTc2VydmVyVXB0aW1lU2Vjb25kcxgHIAEoCRIVCg1jb21wb3NpdGlvbklkGAggASgJEhsKE29uTGF0ZXN0Q29tcG9zaXRpb24YCSABKAgSEQoJcHJvY2Vzc0lkGAogASgJEhUKDW1lbW9yeVVzYWdlTWIYCyABKAISIAoYbWVtb3J5VXNhZ2VDaGFuZ2VQZXJjZW50GAwgASgCEhcKD2NwdVVzYWdlUGVyY2VudBgNIAEoAhIdChVjcHVVc2FnZUNoYW5nZVBlcmNlbnQYDiABKAIiPAoRR2V0Um91dGVyc1JlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJ1ChJHZXRSb3V0ZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgdyb3V0ZXJzGAIgAygLMhwud2cuY29zbW8ucGxhdGZvcm0udjEuUm91dGVyIuYBCgpDbGllbnRJbmZvEgwKBG5hbWUYASABKAkSCgoCaWQYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJEhUKDWxhc3RVcGRhdGVkQXQYBCABKAkSEQoJY3JlYXRlZEJ5GAUgASgJEhUKDWxhc3RVcGRhdGVkQnkYBiABKAkSJQoYcGVyc2lzdGVkT3BlcmF0aW9uc0NvdW50GAcgASgFSACIAQESFwoKaGFzVHJhZmZpYxgIIAEoCEgBiAEBQhsKGV9wZXJzaXN0ZWRPcGVyYXRpb25zQ291bnRCDQoLX2hhc1RyYWZmaWMiVAoRR2V0Q2xpZW50c1JlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5pbmNsdWRlVHJhZmZpYxgDIAEoCCJ5ChJHZXRDbGllbnRzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIxCgdjbGllbnRzGAIgAygLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuQ2xpZW50SW5mbyJZChpQcmV2aWV3RGVsZXRlQ2xpZW50UmVxdWVzdBIUCgxmZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhIKCmNsaWVudE5hbWUYAyABKAki0QEKG1ByZXZpZXdEZWxldGVDbGllbnRSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKBmNsaWVudBgCIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLkNsaWVudEluZm8SIAoYcGVyc2lzdGVkT3BlcmF0aW9uc0NvdW50GAMgASgFEhIKCmhhc1RyYWZmaWMYBCABKAgSGAoQb3JnYW5pemF0aW9uU2x1ZxgFIAEoCSJSChNEZWxldGVDbGllbnRSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEgoKY2xpZW50TmFtZRgDIAEoCSLgAQoURGVsZXRlQ2xpZW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIwCgZjbGllbnQYAiABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DbGllbnRJbmZvEh4KFmRlbGV0ZWRPcGVyYXRpb25zQ291bnQYAyABKAUaRAoJT3BlcmF0aW9uEgoKAmlkGAEgASgJEhMKC29wZXJhdGlvbklkGAIgASgJEhYKDm9wZXJhdGlvbk5hbWVzGAMgAygJItQCChRHZXRGaWVsZFVzYWdlUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhYKCW5hbWVkVHlwZRgCIAEoCUgAiAEBEhUKCHR5cGVuYW1lGAMgASgJSAGIAQESEgoFZmllbGQYBCABKAlIAogBARISCgVyYW5nZRgFIAEoBUgDiAEBEjIKCWRhdGVSYW5nZRgGIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZRIRCgluYW1lc3BhY2UYByABKAkSHgoRZmVhdHVyZV9mbGFnX25hbWUYCCABKAlIBIgBARITCgtpc19hcmd1bWVudBgJIAEoCBIQCghpc19pbnB1dBgKIAEoCEIMCgpfbmFtZWRUeXBlQgsKCV90eXBlbmFtZUIICgZfZmllbGRCCAoGX3JhbmdlQhQKEl9mZWF0dXJlX2ZsYWdfbmFtZSK3AQoUQ2xpZW50V2l0aE9wZXJhdGlvbnMSDAoEbmFtZRgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJEkgKCm9wZXJhdGlvbnMYAyADKAsyNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DbGllbnRXaXRoT3BlcmF0aW9ucy5PcGVyYXRpb24aNgoJT3BlcmF0aW9uEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRINCgVjb3VudBgDIAEoBSJfCg5GaWVsZFVzYWdlTWV0YRIUCgxzdWJncmFwaF9pZHMYASADKAkSGgoSZmlyc3RTZWVuVGltZXN0YW1wGAIgASgJEhsKE2xhdGVzdFNlZW5UaW1lc3RhbXAYAyABKAki+wEKFUdldEZpZWxkVXNhZ2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEj8KDnJlcXVlc3Rfc2VyaWVzGAIgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuUmVxdWVzdFNlcmllc0l0ZW0SOwoHY2xpZW50cxgDIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkNsaWVudFdpdGhPcGVyYXRpb25zEjIKBG1ldGEYBCABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaWVsZFVzYWdlTWV0YSImChZDcmVhdGVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXQ3JlYXRlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSImChZEZWxldGVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXRGVsZXRlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI4ChZSZW5hbWVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkSEAoIbmV3X25hbWUYAiABKAkiSwoXUmVuYW1lTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIlCglOYW1lc3BhY2USCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCSIWChRHZXROYW1lc3BhY2VzUmVxdWVzdCJ+ChVHZXROYW1lc3BhY2VzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIzCgpuYW1lc3BhY2VzGAIgAygLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuTmFtZXNwYWNlIp4BChBNb3ZlR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhUKDW5ld19uYW1lc3BhY2UYAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ikAIKEU1vdmVHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyIyCh1HZXROYW1lc3BhY2VMaW50Q29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkinAEKHkdldE5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhUKDWxpbnRlckVuYWJsZWQYAiABKAgSMQoHY29uZmlncxgDIAMoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRDb25maWciOwomR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIpIBCidHZXROYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIXCg90aW1lZnJhbWVJbkRheXMYAiABKAUSHAoUdGltZWZyYW1lTGltaXRJbkRheXMYAyABKAUiVwopVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEhcKD3RpbWVmcmFtZUluRGF5cxgCIAEoBSJeCipVcGRhdGVOYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJPCiNFbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSFQoNZW5hYmxlTGludGluZxgCIAEoCCJYCiRFbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJZCgpMaW50Q29uZmlnEhAKCHJ1bGVOYW1lGAEgASgJEjkKDXNldmVyaXR5TGV2ZWwYAiABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkiawojQ29uZmlndXJlTmFtZXNwYWNlTGludENvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEjEKB2NvbmZpZ3MYAiADKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50Q29uZmlnIlgKJENvbmZpZ3VyZU5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIkoKGUVuYWJsZUdyYXBoUHJ1bmluZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEhoKEmVuYWJsZUdyYXBoUHJ1bmluZxgCIAEoCCJOChpFbmFibGVHcmFwaFBydW5pbmdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIsgBChJHcmFwaFBydW5pbmdDb25maWcSEAoIcnVsZU5hbWUYASABKAkSOQoNc2V2ZXJpdHlMZXZlbBgCIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRTZXZlcml0eRIZChFncmFjZVBlcmlvZEluRGF5cxgDIAEoBRIpChxzY2hlbWFVc2FnZUNoZWNrUGVyaW9kSW5EYXlzGAQgASgFSACIAQFCHwodX3NjaGVtYVVzYWdlQ2hlY2tQZXJpb2RJbkRheXMieworQ29uZmlndXJlTmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSOQoHY29uZmlncxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0NvbmZpZyJgCixDb25maWd1cmVOYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjoKJUdldE5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIrEBCiZHZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhoKEmdyYXBoUHJ1bmVyRW5hYmxlZBgCIAEoCBI5Cgdjb25maWdzGAMgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nQ29uZmlnIjoKF01pZ3JhdGVNb25vZ3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIkwKGE1pZ3JhdGVNb25vZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIiUKI0dldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXF1ZXN0IjAKClBlcm1pc3Npb24SEwoLZGlzcGxheU5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkijwEKJEdldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjUKC3Blcm1pc3Npb25zGAIgAygLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuUGVybWlzc2lvbiLrAgoVQ3JlYXRlQ29udHJhY3RSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhkKEXNvdXJjZV9ncmFwaF9uYW1lGAMgASgJEhMKC3JvdXRpbmdfdXJsGAQgASgJEh0KFWFkbWlzc2lvbl93ZWJob29rX3VybBgFIAEoCRIUCgxleGNsdWRlX3RhZ3MYBiADKAkSEwoGcmVhZG1lGAcgASgJSACIAQESJQoYYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0GAggASgJSAGIAQESFAoMaW5jbHVkZV90YWdzGAkgAygJEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAogASgISAKIAQFCCQoHX3JlYWRtZUIbChlfYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiKVAgoWQ3JlYXRlQ29udHJhY3RSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihAMKFVVwZGF0ZUNvbnRyYWN0UmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIUCgxleGNsdWRlX3RhZ3MYAyADKAkSFAoMaW5jbHVkZV90YWdzGAQgAygJEhgKC3JvdXRpbmdfdXJsGAUgASgJSACIAQESIgoVYWRtaXNzaW9uX3dlYmhvb2tfdXJsGAYgASgJSAGIAQESJQoYYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0GAcgASgJSAKIAQESEwoGcmVhZG1lGAggASgJSAOIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YCSABKAhIBIgBAUIOCgxfcm91dGluZ191cmxCGAoWX2FkbWlzc2lvbl93ZWJob29rX3VybEIbChlfYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0QgkKB19yZWFkbWVCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpUCChZVcGRhdGVDb250cmFjdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyIdChtJc01lbWJlckxpbWl0UmVhY2hlZFJlcXVlc3QifQocSXNNZW1iZXJMaW1pdFJlYWNoZWRSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhUKDWxpbWl0X3JlYWNoZWQYAiABKAgSFAoMbWVtYmVyX2NvdW50GAMgASgFIhMKEURlbGV0ZVVzZXJSZXF1ZXN0IkYKEkRlbGV0ZVVzZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIvABChhDcmVhdGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSHgoWZmVhdHVyZV9zdWJncmFwaF9uYW1lcxgEIAMoCRISCgppc19lbmFibGVkGAUgASgIEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAYgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpoCChlDcmVhdGVGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQgoSY29tcG9zaXRpb25fZXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJAChFkZXBsb3ltZW50X2Vycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nIvIBChhVcGRhdGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSHgoWZmVhdHVyZV9zdWJncmFwaF9uYW1lcxgEIAMoCRIUCgx1bnNldF9sYWJlbHMYBSABKAgSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBiABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ixAIKGVVwZGF0ZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJCChJjb21wb3NpdGlvbl9lcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkAKEWRlcGxveW1lbnRfZXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSGAoLaGFzX2NoYW5nZWQYBSABKAhIAIgBAUIOCgxfaGFzX2NoYW5nZWQioAEKGEVuYWJsZUZlYXR1cmVGbGFnUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIPCgdlbmFibGVkGAMgASgIEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAQgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIsQCChlFbmFibGVGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQgoSY29tcG9zaXRpb25fZXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJAChFkZXBsb3ltZW50X2Vycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchIYCgtoYXNfY2hhbmdlZBgEIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmdCDgoMX2hhc19jaGFuZ2VkIo8BChhEZWxldGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YAyABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24imgIKGURlbGV0ZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJCChJjb21wb3NpdGlvbl9lcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkAKEWRlcGxveW1lbnRfZXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcitwEKC0ZlYXR1cmVGbGFnEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEisKBmxhYmVscxgEIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEhIKCmlzX2VuYWJsZWQYBSABKAgSEgoKY3JlYXRlZF9ieRgGIAEoCRISCgpjcmVhdGVkX2F0GAcgASgJEhIKCnVwZGF0ZWRfYXQYCCABKAkiaAoWR2V0RmVhdHVyZUZsYWdzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJbmFtZXNwYWNlGAMgASgJEhIKBXF1ZXJ5GAQgASgJSACIAQFCCAoGX3F1ZXJ5IpoBChdHZXRGZWF0dXJlRmxhZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjgKDWZlYXR1cmVfZmxhZ3MYAiADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxITCgt0b3RhbF9jb3VudBgDIAEoBSI+ChtHZXRGZWF0dXJlRmxhZ0J5TmFtZVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkijAMKHEdldEZlYXR1cmVGbGFnQnlOYW1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI3CgxmZWF0dXJlX2ZsYWcYAiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxJdChBmZWRlcmF0ZWRfZ3JhcGhzGAMgAygLMkMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdCeU5hbWVSZXNwb25zZS5GZkZlZGVyYXRlZEdyYXBoEjkKEWZlYXR1cmVfc3ViZ3JhcGhzGAQgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgaZwoQRmZGZWRlcmF0ZWRHcmFwaBI9Cg9mZWRlcmF0ZWRfZ3JhcGgYASABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaBIUCgxpc19jb25uZWN0ZWQYAiABKAgiVwonR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWdSZXF1ZXN0EhkKEWZlYXR1cmVfZmxhZ19uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSKXAQooR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjkKEWZlYXR1cmVfc3ViZ3JhcGhzGAIgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgibAoaR2V0RmVhdHVyZVN1YmdyYXBoc1JlcXVlc3QSDQoFbGltaXQYASABKAUSDgoGb2Zmc2V0GAIgASgFEhEKCW5hbWVzcGFjZRgDIAEoCRISCgVxdWVyeRgEIAEoCUgAiAEBQggKBl9xdWVyeSKZAQobR2V0RmVhdHVyZVN1YmdyYXBoc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOQoRZmVhdHVyZV9zdWJncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBINCgVjb3VudBgDIAEoBSKWAQomR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSHAoUZmVkZXJhdGVkX2dyYXBoX25hbWUYASABKAkSDQoFbGltaXQYAiABKAUSDgoGb2Zmc2V0GAMgASgFEhEKCW5hbWVzcGFjZRgEIAEoCRISCgVxdWVyeRgFIAEoCUgAiAEBQggKBl9xdWVyeSKqAQonR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOAoNZmVhdHVyZV9mbGFncxgCIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlYXR1cmVGbGFnEhMKC3RvdGFsX2NvdW50GAMgASgFImwKOUdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiqAEKOkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI4Cg1mZWF0dXJlX2ZsYWdzGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZUZsYWcimgEKKkdldEZlYXR1cmVTdWJncmFwaHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFbGltaXQYAyABKAUSDgoGb2Zmc2V0GAQgASgFEhIKBXF1ZXJ5GAUgASgJSACIAQFCCAoGX3F1ZXJ5Iq8BCitHZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOQoRZmVhdHVyZV9zdWJncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBITCgt0b3RhbF9jb3VudBgDIAEoBSLBAQokR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnlSZXF1ZXN0EjQKCnBhZ2luYXRpb24YASABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEjMKCmRhdGVfcmFuZ2UYAiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USGwoOZmlsdGVyX2J5X3R5cGUYAyABKAlIAIgBAUIRCg9fZmlsdGVyX2J5X3R5cGUi+wMKD1dlYmhvb2tEZWxpdmVyeRIKCgJpZBgBIAEoCRISCgpjcmVhdGVkX2F0GAIgASgJEhcKCmNyZWF0ZWRfYnkYAyABKAlIAIgBARIMCgR0eXBlGAQgASgJEhAKCGVuZHBvaW50GAUgASgJEhIKCmV2ZW50X25hbWUYBiABKAkSDwoHcGF5bG9hZBgHIAEoCRIXCg9yZXF1ZXN0X2hlYWRlcnMYCCABKAkSHQoQcmVzcG9uc2VfaGVhZGVycxgJIAEoCUgBiAEBEiEKFHJlc3BvbnNlX3N0YXR1c19jb2RlGAogASgFSAKIAQESIAoTcmVzcG9uc2VfZXJyb3JfY29kZRgLIAEoCUgDiAEBEhoKDWVycm9yX21lc3NhZ2UYDCABKAlIBIgBARIaCg1yZXNwb25zZV9ib2R5GA0gASgJSAWIAQESEwoLcmV0cnlfY291bnQYDiABKAUSEAoIZHVyYXRpb24YDyABKAISFQoNaXNfcmVkZWxpdmVyeRgQIAEoCEINCgtfY3JlYXRlZF9ieUITChFfcmVzcG9uc2VfaGVhZGVyc0IXChVfcmVzcG9uc2Vfc3RhdHVzX2NvZGVCFgoUX3Jlc3BvbnNlX2Vycm9yX2NvZGVCEAoOX2Vycm9yX21lc3NhZ2VCEAoOX3Jlc3BvbnNlX2JvZHkiqQEKJUdldE9yZ2FuaXphdGlvbldlYmhvb2tIaXN0b3J5UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI5CgpkZWxpdmVyaWVzGAIgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuV2ViaG9va0RlbGl2ZXJ5EhMKC3RvdGFsX2NvdW50GAMgASgFIiUKF1JlZGVsaXZlcldlYmhvb2tSZXF1ZXN0EgoKAmlkGAEgASgJIkwKGFJlZGVsaXZlcldlYmhvb2tSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIi4KIEdldFdlYmhvb2tEZWxpdmVyeURldGFpbHNSZXF1ZXN0EgoKAmlkGAEgASgJIo4BCiFHZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI3CghkZWxpdmVyeRgCIAEoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLldlYmhvb2tEZWxpdmVyeSJNCh1DcmVhdGVQbGF5Z3JvdW5kU2NyaXB0UmVxdWVzdBINCgV0aXRsZRgBIAEoCRIMCgR0eXBlGAIgASgJEg8KB2NvbnRlbnQYAyABKAkiUgoeQ3JlYXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiKwodRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QSCgoCaWQYASABKAkiUgoeRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiSwodVXBkYXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QSCgoCaWQYASABKAkSDQoFdGl0bGUYAiABKAkSDwoHY29udGVudBgDIAEoCSJSCh5VcGRhdGVQbGF5Z3JvdW5kU2NyaXB0UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIrChtHZXRQbGF5Z3JvdW5kU2NyaXB0c1JlcXVlc3QSDAoEdHlwZRgBIAEoCSJMChBQbGF5Z3JvdW5kU2NyaXB0EgoKAmlkGAEgASgJEgwKBHR5cGUYAiABKAkSDQoFdGl0bGUYAyABKAkSDwoHY29udGVudBgEIAEoCSKJAQocR2V0UGxheWdyb3VuZFNjcmlwdHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjcKB3NjcmlwdHMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QbGF5Z3JvdW5kU2NyaXB0IkIKHEdldEZlZGVyYXRlZEdyYXBoQnlJZFJlcXVlc3QSCgoCaWQYASABKAkSFgoOaW5jbHVkZU1ldHJpY3MYAiABKAgi3wIKHUdldEZlZGVyYXRlZEdyYXBoQnlJZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMwoFZ3JhcGgYAiABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaBIxCglzdWJncmFwaHMYAyADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBIZChFncmFwaFJlcXVlc3RUb2tlbhgEIAEoCRJPCiRmZWF0dXJlRmxhZ3NJbkxhdGVzdFZhbGlkQ29tcG9zaXRpb24YBSADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxI4ChBmZWF0dXJlU3ViZ3JhcGhzGAYgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgiJAoWR2V0U3ViZ3JhcGhCeUlkUmVxdWVzdBIKCgJpZBgBIAEoCSKxAQoXR2V0U3ViZ3JhcGhCeUlkUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgVncmFwaBgCIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEjUKB21lbWJlcnMYAyADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaE1lbWJlciIvChNHZXROYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkSCgoCaWQYAiABKAkifAoUR2V0TmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIyCgluYW1lc3BhY2UYAiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5OYW1lc3BhY2UiqQEKEldvcmtzcGFjZU5hbWVzcGFjZRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEj0KBmdyYXBocxgDIAMoCzItLndnLmNvc21vLnBsYXRmb3JtLnYxLldvcmtzcGFjZUZlZGVyYXRlZEdyYXBoEjoKCXN1YmdyYXBocxgEIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLldvcmtzcGFjZVN1YmdyYXBoInQKF1dvcmtzcGFjZUZlZGVyYXRlZEdyYXBoEgoKAmlkGAEgASgJEhAKCHRhcmdldElkGAIgASgJEgwKBG5hbWUYAyABKAkSEgoKaXNDb250cmFjdBgEIAEoCBIZChFzdWJncmFwaFRhcmdldElkcxgFIAMoCSKKAQoRV29ya3NwYWNlU3ViZ3JhcGgSCgoCaWQYASABKAkSEAoIdGFyZ2V0SWQYAiABKAkSDAoEbmFtZRgDIAEoCRIbCg5iYXNlU3ViZ3JhcGhJZBgEIAEoCUgAiAEBEhkKEWlzRmVhdHVyZVN1YmdyYXBoGAUgASgIQhEKD19iYXNlU3ViZ3JhcGhJZCIVChNHZXRXb3Jrc3BhY2VSZXF1ZXN0IoYBChRHZXRXb3Jrc3BhY2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjwKCm5hbWVzcGFjZXMYAiADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Xb3Jrc3BhY2VOYW1lc3BhY2UinwEKH1B1c2hDYWNoZVdhcm1lck9wZXJhdGlvblJlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhgKEG9wZXJhdGlvbkNvbnRlbnQYAiABKAkSFQoNb3BlcmF0aW9uTmFtZRgDIAEoCRIcChRvcGVyYXRpb25QZXJzaXN0ZWRJZBgEIAEoCRIRCgluYW1lc3BhY2UYBSABKAkiVAogUHVzaENhY2hlV2FybWVyT3BlcmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJvCh9HZXRDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFbGltaXQYAyABKAUSDgoGb2Zmc2V0GAQgASgFIogCChRDYWNoZVdhcm1lck9wZXJhdGlvbhIKCgJpZBgBIAEoCRIYChBvcGVyYXRpb25Db250ZW50GAIgASgJEhUKDW9wZXJhdGlvbk5hbWUYAyABKAkSHAoUb3BlcmF0aW9uUGVyc2lzdGVkSWQYBCABKAkSFQoNb3BlcmF0aW9uSGFzaBgFIAEoCRISCgpjbGllbnROYW1lGAYgASgJEhUKDWNsaWVudFZlcnNpb24YByABKAkSFAoMcGxhbm5pbmdUaW1lGAggASgCEhcKD2lzTWFudWFsbHlBZGRlZBgJIAEoCBIRCgljcmVhdGVkQXQYCiABKAkSEQoJY3JlYXRlZEJ5GAsgASgJIscBCiBHZXRDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEj4KCm9wZXJhdGlvbnMYAiADKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DYWNoZVdhcm1lck9wZXJhdGlvbhITCgt0b3RhbF9jb3VudBgDIAEoBRIcChRpc0NhY2hlV2FybWVyRW5hYmxlZBgEIAEoCCJUCiNDb21wdXRlQ2FjaGVXYXJtZXJPcGVyYXRpb25zUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIlgKJENvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlImcKG0NvbmZpZ3VyZUNhY2hlV2FybWVyUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSGQoRZW5hYmxlQ2FjaGVXYXJtZXIYAiABKAgSGgoSbWF4T3BlcmF0aW9uc0NvdW50GAMgASgFIlAKHENvbmZpZ3VyZUNhY2hlV2FybWVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIwChtHZXRDYWNoZVdhcm1lckNvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIooBChxHZXRDYWNoZVdhcm1lckNvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USHAoUaXNDYWNoZVdhcm1lckVuYWJsZWQYAiABKAgSGgoSbWF4T3BlcmF0aW9uc0NvdW50GAMgASgFIjwKJ0dldFN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkilAMKKEdldFN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIdChVpc0VuYWJsZWRGb3JOYW1lc3BhY2UYAiABKAgSJAocaXNMaW50aW5nRW5hYmxlZEZvck5hbWVzcGFjZRgDIAEoCBIpCiFpc0dyYXBoUHJ1bmluZ0VuYWJsZWRGb3JOYW1lc3BhY2UYBCABKAgSEAoIZW5kcG9pbnQYBSABKAkSGwoTaXNTZWNyZXRLZXlBc3NpZ25lZBgGIAEoCBIaChJpbmNsdWRlQ29tcG9zZWRTZGwYByABKAgSHAoUaW5jbHVkZUxpbnRpbmdJc3N1ZXMYCCABKAgSHAoUaW5jbHVkZVBydW5pbmdJc3N1ZXMYCSABKAgSHAoUaW5jbHVkZVNjaGVtYUNoYW5nZXMYCiABKAgSIQoZaW5jbHVkZUFmZmVjdGVkT3BlcmF0aW9ucxgLIAEoCCK0AgonQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRIlCh1lbmFibGVTdWJncmFwaENoZWNrRXh0ZW5zaW9ucxgCIAEoCBIQCghlbmRwb2ludBgDIAEoCRIWCglzZWNyZXRLZXkYBCABKAlIAIgBARIaChJpbmNsdWRlQ29tcG9zZWRTZGwYBSABKAgSHAoUaW5jbHVkZUxpbnRpbmdJc3N1ZXMYBiABKAgSHAoUaW5jbHVkZVBydW5pbmdJc3N1ZXMYByABKAgSHAoUaW5jbHVkZVNjaGVtYUNoYW5nZXMYCCABKAgSIQoZaW5jbHVkZUFmZmVjdGVkT3BlcmF0aW9ucxgJIAEoCEIMCgpfc2VjcmV0S2V5IlwKKENvbmZpZ3VyZVN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJeCiFEZWxldGVDYWNoZVdhcm1lck9wZXJhdGlvblJlcXVlc3QSCgoCaWQYASABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJWCiJEZWxldGVDYWNoZVdhcm1lck9wZXJhdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiKAomTGlzdFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uc1JlcXVlc3QibQonTGlzdFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoIdmVyc2lvbnMYAiADKAkisQEKKVNldEdyYXBoUm91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25SZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24i2AIKKlNldEdyYXBoUm91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhgKEHByZXZpb3VzX3ZlcnNpb24YAiABKAkSEwoLbmV3X3ZlcnNpb24YAyABKAkSQQoRY29tcG9zaXRpb25FcnJvcnMYBCADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYBSADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgGIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyJrCilHZXRQcm9wb3NlZFNjaGVtYU9mQ2hlY2tlZFN1YmdyYXBoUmVxdWVzdBIPCgdjaGVja0lkGAEgASgJEhkKEWNoZWNrZWRTdWJncmFwaElkGAIgASgJEhIKCnN1YmdyYXBoSWQYAyABKAkidgoqR2V0UHJvcG9zZWRTY2hlbWFPZkNoZWNrZWRTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USFgoOcHJvcG9zZWRTY2hlbWEYAiABKAkiuAIKCFByb3Bvc2FsEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJEhYKDmNyZWF0ZWRCeUVtYWlsGAQgASgJEg0KBXN0YXRlGAUgASgJEhgKEGZlZGVyYXRlZEdyYXBoSWQYBiABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAcgASgJEjkKCXN1YmdyYXBocxgIIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsU3ViZ3JhcGgSGgoSbGF0ZXN0Q2hlY2tTdWNjZXNzGAkgASgIEhUKDWxhdGVzdENoZWNrSWQYCiABKAkSNAoGb3JpZ2luGAsgASgOMiQud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWxPcmlnaW4iggEKEFByb3Bvc2FsU3ViZ3JhcGgSDAoEbmFtZRgBIAEoCRIRCglzY2hlbWFTREwYAiABKAkSEQoJaXNEZWxldGVkGAMgASgIEg0KBWlzTmV3GAQgASgIEisKBmxhYmVscxgFIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsIo8CChVDcmVhdGVQcm9wb3NhbFJlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIMCgRuYW1lGAMgASgJEjkKCXN1YmdyYXBocxgEIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsU3ViZ3JhcGgSSAoQbmFtaW5nQ29udmVudGlvbhgFIAEoDjIuLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsTmFtaW5nQ29udmVudGlvbhI0CgZvcmlnaW4YBiABKA4yJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm9wb3NhbE9yaWdpbiLQCAoWQ3JlYXRlUHJvcG9zYWxSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhIKCnByb3Bvc2FsSWQYAiABKAkSDwoHY2hlY2tJZBgDIAEoCRI7Cg9icmVha2luZ0NoYW5nZXMYBCADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USPgoSbm9uQnJlYWtpbmdDaGFuZ2VzGAUgAygLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hhbmdlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAYgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAcgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEjMKCmxpbnRFcnJvcnMYCCADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSNQoMbGludFdhcm5pbmdzGAkgAygLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGludElzc3VlEkEKEGdyYXBoUHJ1bmVFcnJvcnMYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJDChJncmFwaFBydW5lV2FybmluZ3MYCyADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJLChNvcGVyYXRpb25Vc2FnZVN0YXRzGAwgASgLMi4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tPcGVyYXRpb25Vc2FnZVN0YXRzEhYKDmxpbnRpbmdTa2lwcGVkGA0gASgIEhsKE2dyYXBoUHJ1bmluZ1NraXBwZWQYDiABKAgSEAoIY2hlY2tVcmwYDyABKAkSEwoLcHJvcG9zYWxVcmwYECABKAkSFAoMcHJvcG9zYWxOYW1lGBEgASgJEicKGmlzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkGBIgASgISACIAQESJwoaaXNMaW5rZWRQcnVuaW5nQ2hlY2tGYWlsZWQYEyABKAhIAYgBARIiChVoYXNMaW5rZWRTY2hlbWFDaGVja3MYFCABKAhIAogBARJXCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgVIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlQh0KG19pc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZEIdChtfaXNMaW5rZWRQcnVuaW5nQ2hlY2tGYWlsZWRCGAoWX2hhc0xpbmtlZFNjaGVtYUNoZWNrcyIoChJHZXRQcm9wb3NhbFJlcXVlc3QSEgoKcHJvcG9zYWxJZBgBIAEoCSKCAgoTR2V0UHJvcG9zYWxSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKCHByb3Bvc2FsGAIgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWwSUwoQY3VycmVudFN1YmdyYXBocxgDIAMoCzI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2FsUmVzcG9uc2UuQ3VycmVudFN1YmdyYXBoGjIKD0N1cnJlbnRTdWJncmFwaBIMCgRuYW1lGAEgASgJEhEKCXNjaGVtYVNETBgCIAEoCSKXAQojR2V0UHJvcG9zYWxzQnlGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIRCglzdGFydERhdGUYAyABKAkSDwoHZW5kRGF0ZRgEIAEoCRINCgVsaW1pdBgFIAEoBRIOCgZvZmZzZXQYBiABKAUiuwEKJEdldFByb3Bvc2Fsc0J5RmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjEKCXByb3Bvc2FscxgCIAMoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsEhoKEmlzUHJvcG9zYWxzRW5hYmxlZBgDIAEoCBISCgp0b3RhbENvdW50GAQgASgFInEKGEdldFByb3Bvc2FsQ2hlY2tzUmVxdWVzdBISCgpwcm9wb3NhbElkGAEgASgJEg0KBWxpbWl0GAIgASgFEg4KBm9mZnNldBgDIAEoBRIRCglzdGFydERhdGUYBCABKAkSDwoHZW5kRGF0ZRgFIAEoCSKaAQoZR2V0UHJvcG9zYWxDaGVja3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjEKBmNoZWNrcxgCIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrEhgKEHRvdGFsQ2hlY2tzQ291bnQYAyABKAUitQIKFVVwZGF0ZVByb3Bvc2FsUmVxdWVzdBIUCgxwcm9wb3NhbE5hbWUYASABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAIgASgJEg8KBXN0YXRlGAMgASgJSAASXwoQdXBkYXRlZFN1YmdyYXBocxgEIAEoCzJDLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZVByb3Bvc2FsUmVxdWVzdC5VcGRhdGVQcm9wb3NhbFN1YmdyYXBoc0gAEhEKCW5hbWVzcGFjZRgFIAEoCRpUChdVcGRhdGVQcm9wb3NhbFN1YmdyYXBocxI5CglzdWJncmFwaHMYASADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm9wb3NhbFN1YmdyYXBoQg8KDXVwZGF0ZV9hY3Rpb24ikQgKFlVwZGF0ZVByb3Bvc2FsUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIPCgdjaGVja0lkGAIgASgJEjsKD2JyZWFraW5nQ2hhbmdlcxgDIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRI+ChJub25CcmVha2luZ0NoYW5nZXMYBCADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USQQoRY29tcG9zaXRpb25FcnJvcnMYBSADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBiADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSMwoKbGludEVycm9ycxgHIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRI1CgxsaW50V2FybmluZ3MYCCADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSQQoQZ3JhcGhQcnVuZUVycm9ycxgJIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0lzc3VlEkMKEmdyYXBoUHJ1bmVXYXJuaW5ncxgKIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0lzc3VlEksKE29wZXJhdGlvblVzYWdlU3RhdHMYCyABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja09wZXJhdGlvblVzYWdlU3RhdHMSFgoObGludGluZ1NraXBwZWQYDCABKAgSGwoTZ3JhcGhQcnVuaW5nU2tpcHBlZBgNIAEoCBIQCghjaGVja1VybBgOIAEoCRInChppc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZBgPIAEoCEgAiAEBEicKGmlzTGlua2VkUHJ1bmluZ0NoZWNrRmFpbGVkGBAgASgISAGIAQESIgoVaGFzTGlua2VkU2NoZW1hQ2hlY2tzGBEgASgISAKIAQESVwodY29tcG9zZWRTY2hlbWFCcmVha2luZ0NoYW5nZXMYEiADKAsyMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaFNjaGVtYUNoYW5nZUIdChtfaXNMaW5rZWRUcmFmZmljQ2hlY2tGYWlsZWRCHQobX2lzTGlua2VkUHJ1bmluZ0NoZWNrRmFpbGVkQhgKFl9oYXNMaW5rZWRTY2hlbWFDaGVja3MiUAoiRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSFwoPZW5hYmxlUHJvcG9zYWxzGAIgASgIIlcKI0VuYWJsZVByb3Bvc2Fsc0Zvck5hbWVzcGFjZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UivgEKJ0NvbmZpZ3VyZU5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSPgoSY2hlY2tTZXZlcml0eUxldmVsGAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5EkAKFHB1Ymxpc2hTZXZlcml0eUxldmVsGAMgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5IlwKKENvbmZpZ3VyZU5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI2CiFHZXROYW1lc3BhY2VQcm9wb3NhbENvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIukBCiJHZXROYW1lc3BhY2VQcm9wb3NhbENvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDwoHZW5hYmxlZBgCIAEoCBI+ChJjaGVja1NldmVyaXR5TGV2ZWwYAyABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkSQAoUcHVibGlzaFNldmVyaXR5TGV2ZWwYBCABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkiqwEKG05hbWVzcGFjZUxvZ2luTWV0aG9kTWFwcGluZxIUCgxuYW1lc3BhY2VfaWQYASABKAkSIAoYYWxsb3dlZF9zc29fcHJvdmlkZXJfaWRzGAIgAygJEhwKFGFsbG93X3Bhc3N3b3JkX2xvZ2luGAMgASgIEhoKEmFsbG93X2dvb2dsZV9sb2dpbhgEIAEoCBIaChJhbGxvd19naXRodWJfbG9naW4YBSABKAgiaQoiVXBkYXRlTmFtZXNwYWNlTG9naW5NZXRob2RzUmVxdWVzdBJDCghtYXBwaW5ncxgBIAMoCzIxLndnLmNvc21vLnBsYXRmb3JtLnYxLk5hbWVzcGFjZUxvZ2luTWV0aG9kTWFwcGluZyJXCiNVcGRhdGVOYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIiIKIExpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXF1ZXN0IpoBCiFMaXN0TmFtZXNwYWNlTG9naW5NZXRob2RzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJDCghtYXBwaW5ncxgCIAMoCzIxLndnLmNvc21vLnBsYXRmb3JtLnYxLk5hbWVzcGFjZUxvZ2luTWV0aG9kTWFwcGluZyKpAQoYT3JnYW5pemF0aW9uTG9naW5NZXRob2RzEiAKGGFsbG93ZWRfc3NvX3Byb3ZpZGVyX2lkcxgBIAMoCRIcChRhbGxvd19wYXNzd29yZF9sb2dpbhgCIAEoCBIaChJhbGxvd19nb29nbGVfbG9naW4YAyABKAgSGgoSYWxsb3dfZ2l0aHViX2xvZ2luGAQgASgIEhUKDWlzX3Jlc3RyaWN0ZWQYBSABKAgiJAoiR2V0T3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVxdWVzdCKeAQojR2V0T3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJFCg1sb2dpbl9tZXRob2RzGAIgASgLMi4ud2cuY29zbW8ucGxhdGZvcm0udjEuT3JnYW5pemF0aW9uTG9naW5NZXRob2RzIsIBCiVVcGRhdGVPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXF1ZXN0EiAKGGFsbG93ZWRfc3NvX3Byb3ZpZGVyX2lkcxgBIAMoCRIcChRhbGxvd19wYXNzd29yZF9sb2dpbhgCIAEoCBIaChJhbGxvd19nb29nbGVfbG9naW4YAyABKAgSGgoSYWxsb3dfZ2l0aHViX2xvZ2luGAQgASgIEiEKGWNvbmZpcm1fbmFtZXNwYWNlX2NoYW5nZXMYBSABKAgitwEKJlVwZGF0ZU9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USHQoVcmVxdWlyZXNfY29uZmlybWF0aW9uGAIgASgIEjwKE2FmZmVjdGVkX25hbWVzcGFjZXMYAyADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5OYW1lc3BhY2Ui6AUKFEdldE9wZXJhdGlvbnNSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLY2xpZW50TmFtZXMYAyADKAkSEgoFbGltaXQYBCABKAVIAIgBARITCgZvZmZzZXQYBSABKAVIAYgBARInChppbmNsdWRlSGFzRGVwcmVjYXRlZEZpZWxkcxgGIAEoCEgCiAEBEkcKDGZldGNoQmFzZWRPbhgHIAEoDjIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk9wZXJhdGlvbnNGZXRjaEJhc2VkT25IA4gBARIbCg5pbmNsdWRlQ29udGVudBgIIAEoCEgEiAEBEhIKBXJhbmdlGAkgASgFSAWIAQESNwoJZGF0ZVJhbmdlGAogASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlSAaIAQESGAoLc2VhcmNoUXVlcnkYCyABKAlIB4gBARI2CilpbmNsdWRlT3BlcmF0aW9uc1dpdGhEZXByZWNhdGVkRmllbGRzT25seRgMIAEoCEgIiAEBEj8KDXNvcnREaXJlY3Rpb24YDSABKA4yIy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Tb3J0RGlyZWN0aW9uSAmIAQESHgoRaW5jbHVkZVRvdGFsQ291bnQYDiABKAhICogBAUIICgZfbGltaXRCCQoHX29mZnNldEIdChtfaW5jbHVkZUhhc0RlcHJlY2F0ZWRGaWVsZHNCDwoNX2ZldGNoQmFzZWRPbkIRCg9faW5jbHVkZUNvbnRlbnRCCAoGX3JhbmdlQgwKCl9kYXRlUmFuZ2VCDgoMX3NlYXJjaFF1ZXJ5QiwKKl9pbmNsdWRlT3BlcmF0aW9uc1dpdGhEZXByZWNhdGVkRmllbGRzT25seUIQCg5fc29ydERpcmVjdGlvbkIUChJfaW5jbHVkZVRvdGFsQ291bnQilwQKFUdldE9wZXJhdGlvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkkKCm9wZXJhdGlvbnMYAiADKAsyNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25zUmVzcG9uc2UuT3BlcmF0aW9uEhcKCnRvdGFsQ291bnQYAyABKAVIAIgBARqcAgoJT3BlcmF0aW9uEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRIUCgdjb250ZW50GAMgASgJSAGIAQESRwoEdHlwZRgEIAEoDjI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbnNSZXNwb25zZS5PcGVyYXRpb25UeXBlEiAKE2hhc0RlcHJlY2F0ZWRGaWVsZHMYBSABKAhIAogBARIRCgdsYXRlbmN5GAYgASgCSAASFgoMcmVxdWVzdENvdW50GAcgASgDSAASGQoPZXJyb3JQZXJjZW50YWdlGAggASgCSABCCAoGbWV0cmljQgoKCF9jb250ZW50QhYKFF9oYXNEZXByZWNhdGVkRmllbGRzIjoKDU9wZXJhdGlvblR5cGUSCQoFUVVFUlkQABIMCghNVVRBVElPThABEhAKDFNVQlNDUklQVElPThACQg0KC190b3RhbENvdW50Ik8KHkdldENsaWVudHNGcm9tQW5hbHl0aWNzUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIroBCh9HZXRDbGllbnRzRnJvbUFuYWx5dGljc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USTQoHY2xpZW50cxgCIAMoCzI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENsaWVudHNGcm9tQW5hbHl0aWNzUmVzcG9uc2UuQ2xpZW50GhYKBkNsaWVudBIMCgRuYW1lGAEgASgJIt4BChpHZXRPcGVyYXRpb25DbGllbnRzUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhUKDW9wZXJhdGlvbkhhc2gYAyABKAkSFQoNb3BlcmF0aW9uTmFtZRgEIAEoCRISCgVyYW5nZRgFIAEoBUgAiAEBEjcKCWRhdGVSYW5nZRgGIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZUgBiAEBQggKBl9yYW5nZUIMCgpfZGF0ZVJhbmdlIusBChtHZXRPcGVyYXRpb25DbGllbnRzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJJCgdjbGllbnRzGAIgAygLMjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uQ2xpZW50c1Jlc3BvbnNlLkNsaWVudBpPCgZDbGllbnQSDAoEbmFtZRgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJEhQKDHJlcXVlc3RDb3VudBgDIAEoAxIQCghsYXN0VXNlZBgEIAEoCSL+AQojR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIVCg1vcGVyYXRpb25IYXNoGAMgASgJEhoKDW9wZXJhdGlvbk5hbWUYBCABKAlIAIgBARISCgVyYW5nZRgFIAEoBUgBiAEBEjcKCWRhdGVSYW5nZRgGIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZUgCiAEBQhAKDl9vcGVyYXRpb25OYW1lQggKBl9yYW5nZUIMCgpfZGF0ZVJhbmdlIp8CCiRHZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJkChBkZXByZWNhdGVkRmllbGRzGAIgAygLMkoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkc1Jlc3BvbnNlLkRlcHJlY2F0ZWRGaWVsZBpfCg9EZXByZWNhdGVkRmllbGQSEQoJZmllbGROYW1lGAEgASgJEhAKCHR5cGVOYW1lGAIgASgJEgwKBHBhdGgYAyABKAkSGQoRZGVwcmVjYXRpb25SZWFzb24YBCABKAkicQohVmFsaWRhdGVBbmRGZXRjaFBsdWdpbkRhdGFSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEisKBmxhYmVscxgDIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsIpABCiJWYWxpZGF0ZUFuZEZldGNoUGx1Z2luRGF0YVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEgoKbmV3VmVyc2lvbhgCIAEoCRIRCglwdXNoVG9rZW4YAyABKAkSEQoJcmVmZXJlbmNlGAQgASgJIo8BChNMaW5rU3ViZ3JhcGhSZXF1ZXN0EhoKEnNvdXJjZVN1YmdyYXBoTmFtZRgBIAEoCRIfChdzb3VyY2VTdWJncmFwaE5hbWVzcGFjZRgCIAEoCRIaChJ0YXJnZXRTdWJncmFwaE5hbWUYAyABKAkSHwoXdGFyZ2V0U3ViZ3JhcGhOYW1lc3BhY2UYBCABKAkiSAoUTGlua1N1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJUChVVbmxpbmtTdWJncmFwaFJlcXVlc3QSGgoSc291cmNlU3ViZ3JhcGhOYW1lGAEgASgJEh8KF3NvdXJjZVN1YmdyYXBoTmFtZXNwYWNlGAIgASgJIkoKFlVubGlua1N1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI6Ch5WZXJpZnlBUElLZXlHcmFwaEFjY2Vzc1JlcXVlc3QSGAoQZmVkZXJhdGVkR3JhcGhJZBgBIAEoCSKmAQofVmVyaWZ5QVBJS2V5R3JhcGhBY2Nlc3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjIKKmhhc09yZ2FuaXphdGlvbkFkbWluT3JEZXZlbG9wZXJQZXJtaXNzaW9ucxgCIAEoCBIdChVoYXNXcml0ZUFjY2Vzc1RvR3JhcGgYAyABKAgiKwoaSW5pdGlhbGl6ZUNvc21vVXNlclJlcXVlc3QSDQoFdG9rZW4YASABKAkiTwobSW5pdGlhbGl6ZUNvc21vVXNlclJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiGgoYTGlzdE9yZ2FuaXphdGlvbnNSZXF1ZXN0Iv0BChlMaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USXQoNb3JnYW5pemF0aW9ucxgCIAMoCzJGLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2UuT3JnYW5pemF0aW9uTWVtYmVyc2hpcBpPChZPcmdhbml6YXRpb25NZW1iZXJzaGlwEgoKAmlkGAEgASgJEgwKBHNsdWcYAiABKAkSDAoEbmFtZRgDIAEoCRINCgVyb2xlcxgEIAMoCSLAAQoVUmVjb21wb3NlR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhQKDGlzX21vbm9ncmFwaBgDIAEoCBISCgVsaW1pdBgEIAEoBUgAiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAUgASgISAGIAQFCCAoGX2xpbWl0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiLrAgoWUmVjb21wb3NlR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSRAoLZXJyb3JDb3VudHMYBSABKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaFB1Ymxpc2hTdGF0c0gAiAEBQg4KDF9lcnJvckNvdW50cyKwAQobUmVjb21wb3NlRmVhdHVyZUZsYWdSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhIKBWxpbWl0GAMgASgFSACIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBSABKAhIAYgBAUIICgZfbGltaXRCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIvECChxSZWNvbXBvc2VGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZxJECgtlcnJvckNvdW50cxgFIAEoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoUHVibGlzaFN0YXRzSACIAQFCDgoMX2Vycm9yQ291bnRzIhYKFEdldE9uYm9hcmRpbmdSZXF1ZXN0IqABChVHZXRPbmJvYXJkaW5nUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIXCgpmaW5pc2hlZEF0GAMgASgJSACIAQESHAoUZmVkZXJhdGVkR3JhcGhzQ291bnQYBCABKAUSDwoHZW5hYmxlZBgFIAEoCEINCgtfZmluaXNoZWRBdCIZChdDcmVhdGVPbmJvYXJkaW5nUmVxdWVzdCKSAQoYQ3JlYXRlT25ib2FyZGluZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USFwoKZmluaXNoZWRBdBgCIAEoCUgAiAEBEhwKFGZlZGVyYXRlZEdyYXBoc0NvdW50GAMgASgFQg0KC19maW5pc2hlZEF0IhkKF0ZpbmlzaE9uYm9hcmRpbmdSZXF1ZXN0In4KGEZpbmlzaE9uYm9hcmRpbmdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhwKFGZlZGVyYXRlZEdyYXBoc0NvdW50GAIgASgFEhIKCmZpbmlzaGVkQXQYAyABKAkqTwoVQmF0Y2hQdWJsaXNoSm9iU3RhdHVzEgsKB1BFTkRJTkcQABIOCgpQUk9DRVNTSU5HEAESCgoGRkFJTEVEEAISDQoJQ09NUExFVEVEEAMqIwoMTGludFNldmVyaXR5EggKBHdhcm4QABIJCgVlcnJvchABKj8KDFN1YmdyYXBoVHlwZRIMCghTVEFOREFSRBAAEg8KC0dSUENfUExVR0lOEAESEAoMR1JQQ19TRVJWSUNFEAIqVQoWQW5hbHl0aWNzVmlld0dyb3VwTmFtZRIICgROb25lEAASEQoNT3BlcmF0aW9uTmFtZRABEgoKBkNsaWVudBACEhIKDkh0dHBTdGF0dXNDb2RlEAMqMQoNQ3VzdG9tT3B0aW9ucxIICgRUZXh0EAASCQoFUmFuZ2UQARILCgdCb29sZWFuEAIqjgEKBFVuaXQSDwoLVW5zcGVjaWZpZWQQABIPCgtOYW5vc2Vjb25kcxABEhEKDVVuaXhUaW1lc3RhbXAQAhIJCgVCeXRlcxADEg0KCUNvZGVCbG9jaxAEEg4KClN0YXR1c0NvZGUQBRILCgdUcmFjZUlEEAYSCgoGU3BhbklEEAcSDgoKUGVyY2VudGFnZRAIKv0BChtBbmFseXRpY3NWaWV3RmlsdGVyT3BlcmF0b3ISCgoGRVFVQUxTEAASDgoKTk9UX0VRVUFMUxABEhAKDEdSRUFURVJfVEhBThACEg0KCUxFU1NfVEhBThADEhkKFUdSRUFURVJfVEhBTl9PUl9FUVVBTBAEEhYKEkxFU1NfVEhBTl9PUl9FUVVBTBAFEgwKCENPTlRBSU5TEAYSEAoMTk9UX0NPTlRBSU5TEAcSBgoCSU4QCBIKCgZOT1RfSU4QCRILCgdCRVRXRUVOEAoSDwoLTk9UX0JFVFdFRU4QCxILCgdJU19OVUxMEAwSDwoLSVNfTk9UX05VTEwQDSpFCglFeHBpcmVzQXQSCQoFTkVWRVIQABIPCgtUSElSVFlfREFZUxABEg4KClNJWF9NT05USFMQAhIMCghPTkVfWUVBUhADKqwBCg9Mb2dpbk1ldGhvZFR5cGUSIQodTE9HSU5fTUVUSE9EX1RZUEVfVU5TUEVDSUZJRUQQABIZChVMT0dJTl9NRVRIT0RfVFlQRV9TU08QARIeChpMT0dJTl9NRVRIT0RfVFlQRV9QQVNTV09SRBACEh0KGUxPR0lOX01FVEhPRF9UWVBFX0FQSV9LRVkQAxIcChhMT0dJTl9NRVRIT0RfVFlQRV9TT0NJQUwQBCqAAQoTU29jaWFsTG9naW5Qcm92aWRlchIlCiFTT0NJQUxfTE9HSU5fUFJPVklERVJfVU5TUEVDSUZJRUQQABIgChxTT0NJQUxfTE9HSU5fUFJPVklERVJfR09PR0xFEAESIAocU09DSUFMX0xPR0lOX1BST1ZJREVSX0dJVEhVQhACKkUKGFB1Ymxpc2hlZE9wZXJhdGlvblN0YXR1cxIOCgpVUF9UT19EQVRFEAASCwoHQ1JFQVRFRBABEgwKCENPTkZMSUNUEAIqHAoPSW50ZWdyYXRpb25UeXBlEgkKBVNMQUNLEAAqJQoHRmVhdHVyZRIICgRyYmFjEAASBgoCYWkQARIICgRzY2ltEAIqLAoOUHJvcG9zYWxPcmlnaW4SDAoISU5URVJOQUwQABIMCghFWFRFUk5BTBABKjcKGFByb3Bvc2FsTmFtaW5nQ29udmVudGlvbhIKCgZOT1JNQUwQABIPCgtJTkNSRU1FTlRBTBABKj8KFk9wZXJhdGlvbnNGZXRjaEJhc2VkT24SDAoIUkVRVUVTVFMQABILCgdMQVRFTkNZEAESCgoGRVJST1JTEAIqIgoNU29ydERpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAEyvMgBCg9QbGF0Zm9ybVNlcnZpY2UShQEKFkNyZWF0ZVBsYXlncm91bmRTY3JpcHQSMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVQbGF5Z3JvdW5kU2NyaXB0UmVxdWVzdBo0LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZVBsYXlncm91bmRTY3JpcHRSZXNwb25zZSIAEoUBChZEZWxldGVQbGF5Z3JvdW5kU2NyaXB0EjMud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVQbGF5Z3JvdW5kU2NyaXB0UmVzcG9uc2UiABKFAQoWVXBkYXRlUGxheWdyb3VuZFNjcmlwdBIzLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZVBsYXlncm91bmRTY3JpcHRSZXF1ZXN0GjQud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlIgASfwoUR2V0UGxheWdyb3VuZFNjcmlwdHMSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQbGF5Z3JvdW5kU2NyaXB0c1JlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQbGF5Z3JvdW5kU2NyaXB0c1Jlc3BvbnNlIgAScAoPQ3JlYXRlTmFtZXNwYWNlEiwud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlTmFtZXNwYWNlUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU5hbWVzcGFjZVJlc3BvbnNlIgAScAoPRGVsZXRlTmFtZXNwYWNlEiwud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlTmFtZXNwYWNlUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU5hbWVzcGFjZVJlc3BvbnNlIgAScAoPUmVuYW1lTmFtZXNwYWNlEiwud2cuY29zbW8ucGxhdGZvcm0udjEuUmVuYW1lTmFtZXNwYWNlUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbmFtZU5hbWVzcGFjZVJlc3BvbnNlIgASagoNR2V0TmFtZXNwYWNlcxIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZXNSZXF1ZXN0Gisud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlc1Jlc3BvbnNlIgASZwoMR2V0TmFtZXNwYWNlEikud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlUmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZVJlc3BvbnNlIgASZwoMR2V0V29ya3NwYWNlEikud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0V29ya3NwYWNlUmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgASbQoOQ3JlYXRlQ29udHJhY3QSKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVDb250cmFjdFJlcXVlc3QaLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVDb250cmFjdFJlc3BvbnNlIgASbQoOVXBkYXRlQ29udHJhY3QSKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVDb250cmFjdFJlcXVlc3QaLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVDb250cmFjdFJlc3BvbnNlIgASZwoSTW92ZUZlZGVyYXRlZEdyYXBoEiYud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVxdWVzdBonLndnLmNvc21vLnBsYXRmb3JtLnYxLk1vdmVHcmFwaFJlc3BvbnNlIgASYQoMTW92ZVN1YmdyYXBoEiYud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVxdWVzdBonLndnLmNvc21vLnBsYXRmb3JtLnYxLk1vdmVHcmFwaFJlc3BvbnNlIgASYgoNTW92ZU1vbm9ncmFwaBImLndnLmNvc21vLnBsYXRmb3JtLnYxLk1vdmVHcmFwaFJlcXVlc3QaJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Nb3ZlR3JhcGhSZXNwb25zZSIAEnAKD0NyZWF0ZU1vbm9ncmFwaBIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU1vbm9ncmFwaFJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVNb25vZ3JhcGhSZXNwb25zZSIAEnMKEFB1Ymxpc2hNb25vZ3JhcGgSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoTW9ub2dyYXBoUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hNb25vZ3JhcGhSZXNwb25zZSIAEnAKD0RlbGV0ZU1vbm9ncmFwaBIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU1vbm9ncmFwaFJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVNb25vZ3JhcGhSZXNwb25zZSIAEnAKD1VwZGF0ZU1vbm9ncmFwaBIsLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU1vbm9ncmFwaFJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVNb25vZ3JhcGhSZXNwb25zZSIAEnMKEE1pZ3JhdGVNb25vZ3JhcGgSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NaWdyYXRlTW9ub2dyYXBoUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLk1pZ3JhdGVNb25vZ3JhcGhSZXNwb25zZSIAEogBChdDcmVhdGVGZWRlcmF0ZWRTdWJncmFwaBI0LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2UiABKLAQoYUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoEjUud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBo2LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlIgASjgEKGVB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHMSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoRmVkZXJhdGVkU3ViZ3JhcGhzUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXNwb25zZSIAEosBChhHZXRCYXRjaFB1Ymxpc2hKb2JTdGF0dXMSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCYXRjaFB1Ymxpc2hKb2JTdGF0dXNSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QmF0Y2hQdWJsaXNoSm9iU3RhdHVzUmVzcG9uc2UiABJ/ChRDcmVhdGVGZWRlcmF0ZWRHcmFwaBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZEdyYXBoUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZEdyYXBoUmVzcG9uc2UiABJ/ChREZWxldGVGZWRlcmF0ZWRHcmFwaBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlZGVyYXRlZEdyYXBoUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlZGVyYXRlZEdyYXBoUmVzcG9uc2UiABKIAQoXRGVsZXRlRmVkZXJhdGVkU3ViZ3JhcGgSNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVGZWRlcmF0ZWRTdWJncmFwaFJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlIgASfAoTQ2hlY2tTdWJncmFwaFNjaGVtYRIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrU3ViZ3JhcGhTY2hlbWFSZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tTdWJncmFwaFNjaGVtYVJlc3BvbnNlIgASqQEKIkdldFByb3Bvc2VkU2NoZW1hT2ZDaGVja2VkU3ViZ3JhcGgSPy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQcm9wb3NlZFNjaGVtYU9mQ2hlY2tlZFN1YmdyYXBoUmVxdWVzdBpALndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2VkU2NoZW1hT2ZDaGVja2VkU3ViZ3JhcGhSZXNwb25zZSIAEnYKEUZpeFN1YmdyYXBoU2NoZW1hEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuRml4U3ViZ3JhcGhTY2hlbWFSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRml4U3ViZ3JhcGhTY2hlbWFSZXNwb25zZSIAEn8KFFVwZGF0ZUZlZGVyYXRlZEdyYXBoEjEud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEm0KDlVwZGF0ZVN1YmdyYXBoEisud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlU3ViZ3JhcGhSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlU3ViZ3JhcGhSZXNwb25zZSIAEnwKE0NoZWNrRmVkZXJhdGVkR3JhcGgSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja0ZlZGVyYXRlZEdyYXBoUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrRmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAElUKBldob0FtSRIjLndnLmNvc21vLnBsYXRmb3JtLnYxLldob0FtSVJlcXVlc3QaJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5XaG9BbUlSZXNwb25zZSIAEnwKE0dlbmVyYXRlUm91dGVyVG9rZW4SMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZW5lcmF0ZVJvdXRlclRva2VuUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdlbmVyYXRlUm91dGVyVG9rZW5SZXNwb25zZSIAEnAKD0dldFJvdXRlclRva2VucxIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFJvdXRlclRva2Vuc1JlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRSb3V0ZXJUb2tlbnNSZXNwb25zZSIAEnYKEURlbGV0ZVJvdXRlclRva2VuEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlUm91dGVyVG9rZW5SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlUm91dGVyVG9rZW5SZXNwb25zZSIAEpEBChpQdWJsaXNoUGVyc2lzdGVkT3BlcmF0aW9ucxI3LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2UiABKdAQoeQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljEjsud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljUmVxdWVzdBo8LndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrUGVyc2lzdGVkT3BlcmF0aW9uVHJhZmZpY1Jlc3BvbnNlIgASiwEKGERlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvbhI1LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVQZXJzaXN0ZWRPcGVyYXRpb25SZXNwb25zZSIAEoUBChZHZXRQZXJzaXN0ZWRPcGVyYXRpb25zEjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVyc2lzdGVkT3BlcmF0aW9uc1JlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2UiABJnCgxHZXRBdWRpdExvZ3MSKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBdWRpdExvZ3NSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QXVkaXRMb2dzUmVzcG9uc2UiABJ8ChNJbml0aWFsaXplQ29zbW9Vc2VyEjAud2cuY29zbW8ucGxhdGZvcm0udjEuSW5pdGlhbGl6ZUNvc21vVXNlclJlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Jbml0aWFsaXplQ29zbW9Vc2VyUmVzcG9uc2UiABJ2ChFMaXN0T3JnYW5pemF0aW9ucxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2UiABJ5ChJHZXRGZWRlcmF0ZWRHcmFwaHMSLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaHNSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhzUmVzcG9uc2UiABKpAQoiR2V0RmVkZXJhdGVkR3JhcGhzQnlTdWJncmFwaExhYmVscxI/LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoc0J5U3ViZ3JhcGhMYWJlbHNSZXF1ZXN0GkAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhzQnlTdWJncmFwaExhYmVsc1Jlc3BvbnNlIgASiAEKF0dldEZlZGVyYXRlZEdyYXBoQnlOYW1lEjQud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhCeU5hbWVSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhCeU5hbWVSZXNwb25zZSIAEpEBChpHZXRGZWRlcmF0ZWRHcmFwaFNETEJ5TmFtZRI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoU0RMQnlOYW1lUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoU0RMQnlOYW1lUmVzcG9uc2UiABJnCgxHZXRTdWJncmFwaHMSKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaHNSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhzUmVzcG9uc2UiABJ2ChFHZXRTdWJncmFwaEJ5TmFtZRIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlOYW1lUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlOYW1lUmVzcG9uc2UiABKsAQojR2V0U3ViZ3JhcGhTRExGcm9tTGF0ZXN0Q29tcG9zaXRpb24SQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvblJlcXVlc3QaQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvblJlc3BvbnNlIgASfwoUR2V0TGF0ZXN0U3ViZ3JhcGhTREwSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRMYXRlc3RTdWJncmFwaFNETFJlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRMYXRlc3RTdWJncmFwaFNETFJlc3BvbnNlIgASmgEKHUdldENoZWNrc0J5RmVkZXJhdGVkR3JhcGhOYW1lEjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVSZXF1ZXN0Gjsud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVSZXNwb25zZSIAEnAKD0dldENoZWNrU3VtbWFyeRIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrU3VtbWFyeVJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja1N1bW1hcnlSZXNwb25zZSIAEnkKEkdldENoZWNrT3BlcmF0aW9ucxIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrT3BlcmF0aW9uc1JlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja09wZXJhdGlvbnNSZXNwb25zZSIAEnYKEUZvcmNlQ2hlY2tTdWNjZXNzEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuRm9yY2VDaGVja1N1Y2Nlc3NSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRm9yY2VDaGVja1N1Y2Nlc3NSZXNwb25zZSIAEosBChhDcmVhdGVPcGVyYXRpb25PdmVycmlkZXMSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcGVyYXRpb25PdmVycmlkZXNSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2UiABKLAQoYUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzEjUud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBo2LndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZU9wZXJhdGlvbk92ZXJyaWRlc1Jlc3BvbnNlIgASowEKIENyZWF0ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlEj0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXF1ZXN0Gj4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXNwb25zZSIAEqMBCiBSZW1vdmVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZRI9LndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlUmVxdWVzdBo+LndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlUmVzcG9uc2UiABKCAQoVR2V0T3BlcmF0aW9uT3ZlcnJpZGVzEjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBozLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbk92ZXJyaWRlc1Jlc3BvbnNlIgAScAoPR2V0QWxsT3ZlcnJpZGVzEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QWxsT3ZlcnJpZGVzUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEFsbE92ZXJyaWRlc1Jlc3BvbnNlIgASsgEKJVRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnMSQi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Ub2dnbGVDaGFuZ2VPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVxdWVzdBpDLndnLmNvc21vLnBsYXRmb3JtLnYxLlRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXNwb25zZSIAErIBCiVDcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zEkIud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlSWdub3JlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9uc1JlcXVlc3QaQy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2UiABJ8ChNHZXRPcGVyYXRpb25Db250ZW50EjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uQ29udGVudFJlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25Db250ZW50UmVzcG9uc2UiABKRAQoaR2V0RmVkZXJhdGVkR3JhcGhDaGFuZ2Vsb2cSNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ1JlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ1Jlc3BvbnNlIgASjgEKGUNyZWF0ZUZlZGVyYXRlZEdyYXBoVG9rZW4SNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVGZWRlcmF0ZWRHcmFwaFRva2VuUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZEdyYXBoVG9rZW5SZXNwb25zZSIAEoIBChVHZXRPcmdhbml6YXRpb25CeVNsdWcSMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25CeVNsdWdSZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uQnlTbHVnUmVzcG9uc2UiABKFAQoWR2V0T3JnYW5pemF0aW9uTWVtYmVycxIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXF1ZXN0GjQud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uTWVtYmVyc1Jlc3BvbnNlIgASmgEKHUdldFBlbmRpbmdPcmdhbml6YXRpb25NZW1iZXJzEjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnNSZXF1ZXN0Gjsud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZSIAEn8KFElzTWVtYmVyTGltaXRSZWFjaGVkEjEud2cuY29zbW8ucGxhdGZvcm0udjEuSXNNZW1iZXJMaW1pdFJlYWNoZWRSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuSXNNZW1iZXJMaW1pdFJlYWNoZWRSZXNwb25zZSIAEmEKCkludml0ZVVzZXISJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnZpdGVVc2VyUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkludml0ZVVzZXJSZXNwb25zZSIAEmQKC0ludml0ZVVzZXJzEigud2cuY29zbW8ucGxhdGZvcm0udjEuSW52aXRlVXNlcnNSZXF1ZXN0Gikud2cuY29zbW8ucGxhdGZvcm0udjEuSW52aXRlVXNlcnNSZXNwb25zZSIAEmEKCkdldEFQSUtleXMSJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBUElLZXlzUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEFQSUtleXNSZXNwb25zZSIAEmcKDENyZWF0ZUFQSUtleRIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUFQSUtleVJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVBUElLZXlSZXNwb25zZSIAEmcKDFVwZGF0ZUFQSUtleRIpLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUFQSUtleVJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVBUElLZXlSZXNwb25zZSIAEmcKDERlbGV0ZUFQSUtleRIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUFQSUtleVJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVBUElLZXlSZXNwb25zZSIAEosBChhSZW1vdmVPcmdhbml6YXRpb25NZW1iZXISNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVPcmdhbml6YXRpb25NZW1iZXJSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3JnYW5pemF0aW9uTWVtYmVyUmVzcG9uc2UiABJzChBSZW1vdmVJbnZpdGF0aW9uEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlSW52aXRhdGlvblJlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVJbnZpdGF0aW9uUmVzcG9uc2UiABJ2ChFNaWdyYXRlRnJvbUFwb2xsbxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLk1pZ3JhdGVGcm9tQXBvbGxvUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLk1pZ3JhdGVGcm9tQXBvbGxvUmVzcG9uc2UiABKIAQoXQ3JlYXRlT3JnYW5pemF0aW9uR3JvdXASNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25Hcm91cFJlc3BvbnNlIgASggEKFUdldE9yZ2FuaXphdGlvbkdyb3VwcxIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkdyb3Vwc1JlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cHNSZXNwb25zZSIAEpQBChtHZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnMSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVzcG9uc2UiABKIAQoXVXBkYXRlT3JnYW5pemF0aW9uR3JvdXASNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25Hcm91cFJlc3BvbnNlIgASiAEKF0RlbGV0ZU9yZ2FuaXphdGlvbkdyb3VwEjQud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uR3JvdXBSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZSIAEqABCh9DcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnEjwud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QaPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2UiABKaAQodR2V0T3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ3MSOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlnc1JlcXVlc3QaOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlnc1Jlc3BvbnNlIgASkQEKGkdldE9yZ2FuaXphdGlvbldlYmhvb2tNZXRhEjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va01ldGFSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va01ldGFSZXNwb25zZSIAEqABCh9VcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnEjwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QaPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2UiABKgAQofRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZxI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXF1ZXN0Gj0ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlIgASmgEKHUdldE9yZ2FuaXphdGlvbldlYmhvb2tIaXN0b3J5Ejoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnlSZXF1ZXN0Gjsud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnlSZXNwb25zZSIAEo4BChlHZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzEjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0V2ViaG9va0RlbGl2ZXJ5RGV0YWlsc1JlcXVlc3QaNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzUmVzcG9uc2UiABJzChBSZWRlbGl2ZXJXZWJob29rEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVkZWxpdmVyV2ViaG9va1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZWRlbGl2ZXJXZWJob29rUmVzcG9uc2UiABJ2ChFDcmVhdGVJbnRlZ3JhdGlvbhIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUludGVncmF0aW9uUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUludGVncmF0aW9uUmVzcG9uc2UiABKUAQobR2V0T3JnYW5pemF0aW9uSW50ZWdyYXRpb25zEjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uSW50ZWdyYXRpb25zUmVxdWVzdBo5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkludGVncmF0aW9uc1Jlc3BvbnNlIgASiAEKF1VwZGF0ZUludGVncmF0aW9uQ29uZmlnEjQud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlSW50ZWdyYXRpb25Db25maWdSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlSW50ZWdyYXRpb25Db25maWdSZXNwb25zZSIAEnYKEURlbGV0ZUludGVncmF0aW9uEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlSW50ZWdyYXRpb25SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlSW50ZWdyYXRpb25SZXNwb25zZSIAEmEKCkRlbGV0ZVVzZXISJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVVc2VyUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVVzZXJSZXNwb25zZSIAEnkKEkRlbGV0ZU9yZ2FuaXphdGlvbhIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblJlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPcmdhbml6YXRpb25SZXNwb25zZSIAEnwKE1Jlc3RvcmVPcmdhbml6YXRpb24SMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXN0b3JlT3JnYW5pemF0aW9uUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3RvcmVPcmdhbml6YXRpb25SZXNwb25zZSIAEnYKEUxlYXZlT3JnYW5pemF0aW9uEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTGVhdmVPcmdhbml6YXRpb25SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGVhdmVPcmdhbml6YXRpb25SZXNwb25zZSIAEo4BChlVcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzEjYud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnYW5pemF0aW9uRGV0YWlsc1JlcXVlc3QaNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2UiABJ/ChRVcGRhdGVPcmdNZW1iZXJHcm91cBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ01lbWJlckdyb3VwUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ01lbWJlckdyb3VwUmVzcG9uc2UiABJ/ChRJc0dpdEh1YkFwcEluc3RhbGxlZBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLklzR2l0SHViQXBwSW5zdGFsbGVkUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLklzR2l0SHViQXBwSW5zdGFsbGVkUmVzcG9uc2UiABJ5ChJDcmVhdGVPSURDUHJvdmlkZXISLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPSURDUHJvdmlkZXJSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT0lEQ1Byb3ZpZGVyUmVzcG9uc2UiABJwCg9HZXRPSURDUHJvdmlkZXISLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPSURDUHJvdmlkZXJSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T0lEQ1Byb3ZpZGVyUmVzcG9uc2UiABJ2ChFMaXN0T0lEQ1Byb3ZpZGVycxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPSURDUHJvdmlkZXJzUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPSURDUHJvdmlkZXJzUmVzcG9uc2UiABJ5ChJEZWxldGVPSURDUHJvdmlkZXISLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPSURDUHJvdmlkZXJSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT0lEQ1Byb3ZpZGVyUmVzcG9uc2UiABJzChBVcGRhdGVJRFBNYXBwZXJzEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlSURQTWFwcGVyc1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVJRFBNYXBwZXJzUmVzcG9uc2UiABJhCgpHZXRDbGllbnRzEicud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2xpZW50c1JlcXVlc3QaKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDbGllbnRzUmVzcG9uc2UiABJ8ChNQcmV2aWV3RGVsZXRlQ2xpZW50EjAud2cuY29zbW8ucGxhdGZvcm0udjEuUHJldmlld0RlbGV0ZUNsaWVudFJlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QcmV2aWV3RGVsZXRlQ2xpZW50UmVzcG9uc2UiABJnCgxEZWxldGVDbGllbnQSKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVDbGllbnRSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlQ2xpZW50UmVzcG9uc2UiABJhCgpHZXRSb3V0ZXJzEicud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Um91dGVyc1JlcXVlc3QaKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRSb3V0ZXJzUmVzcG9uc2UiABJtCg5HZXRJbnZpdGF0aW9ucxIrLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEludml0YXRpb25zUmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEludml0YXRpb25zUmVzcG9uc2UiABKOAQoZQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvbhI2LndnLmNvc21vLnBsYXRmb3JtLnYxLkFjY2VwdE9yRGVjbGluZUludml0YXRpb25SZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvblJlc3BvbnNlIgAScAoPR2V0Q29tcG9zaXRpb25zEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q29tcG9zaXRpb25zUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENvbXBvc2l0aW9uc1Jlc3BvbnNlIgASggEKFUdldENvbXBvc2l0aW9uRGV0YWlscxIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENvbXBvc2l0aW9uRGV0YWlsc1JlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDb21wb3NpdGlvbkRldGFpbHNSZXNwb25zZSIAEoIBChVHZXRTZGxCeVNjaGVtYVZlcnNpb24SMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTZGxCeVNjaGVtYVZlcnNpb25SZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U2RsQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2UiABKUAQobR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uEjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uUmVxdWVzdBo5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoYW5nZWxvZ0J5U2NoZW1hVmVyc2lvblJlc3BvbnNlIgASkQEKGkdldFVzZXJBY2Nlc3NpYmxlUmVzb3VyY2VzEjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZSIAEoIBChVVcGRhdGVGZWF0dXJlU2V0dGluZ3MSMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWF0dXJlU2V0dGluZ3NSZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlRmVhdHVyZVNldHRpbmdzUmVzcG9uc2UiABJ5ChJHZXRTdWJncmFwaE1lbWJlcnMSLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1lbWJlcnNSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhNZW1iZXJzUmVzcG9uc2UiABJeCglBZGRSZWFkbWUSJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BZGRSZWFkbWVSZXF1ZXN0Gicud2cuY29zbW8ucGxhdGZvcm0udjEuQWRkUmVhZG1lUmVzcG9uc2UiABKXAQocR2V0VXNlckFjY2Vzc2libGVQZXJtaXNzaW9ucxI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVQZXJtaXNzaW9uc1Jlc3BvbnNlIgASdgoRQ3JlYXRlRmVhdHVyZUZsYWcSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVGZWF0dXJlRmxhZ1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASdgoRRGVsZXRlRmVhdHVyZUZsYWcSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVGZWF0dXJlRmxhZ1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASdgoRVXBkYXRlRmVhdHVyZUZsYWcSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWF0dXJlRmxhZ1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASdgoRRW5hYmxlRmVhdHVyZUZsYWcSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVGZWF0dXJlRmxhZ1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASdgoQR2V0QW5hbHl0aWNzVmlldxItLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEFuYWx5dGljc1ZpZXdSZXF1ZXN0Gi4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QW5hbHl0aWNzVmlld1Jlc3BvbnNlIgOQAgESkQEKGUdldERhc2hib2FyZEFuYWx5dGljc1ZpZXcSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXREYXNoYm9hcmRBbmFseXRpY3NWaWV3UmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldERhc2hib2FyZEFuYWx5dGljc1ZpZXdSZXNwb25zZSIDkAIBElsKCEdldFRyYWNlEiUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VHJhY2VSZXF1ZXN0GiYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VHJhY2VSZXNwb25zZSIAEnMKD0dldEdyYXBoTWV0cmljcxIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEdyYXBoTWV0cmljc1JlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRHcmFwaE1ldHJpY3NSZXNwb25zZSIDkAIBEn8KE0dldE1ldHJpY3NFcnJvclJhdGUSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRNZXRyaWNzRXJyb3JSYXRlUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE1ldHJpY3NFcnJvclJhdGVSZXNwb25zZSIDkAIBEnwKEkdldFN1YmdyYXBoTWV0cmljcxIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoTWV0cmljc1JlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1ldHJpY3NSZXNwb25zZSIDkAIBEpcBChtHZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGUSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhNZXRyaWNzRXJyb3JSYXRlUmVzcG9uc2UiA5ACARJtCg1HZXRGaWVsZFVzYWdlEioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmllbGRVc2FnZVJlcXVlc3QaKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGaWVsZFVzYWdlUmVzcG9uc2UiA5ACARKXAQocR2V0T3JnYW5pemF0aW9uUmVxdWVzdHNDb3VudBI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvblJlcXVlc3RzQ291bnRSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdHNDb3VudFJlc3BvbnNlIgASeQoSQ3JlYXRlT3JnYW5pemF0aW9uEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3JnYW5pemF0aW9uUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9yZ2FuaXphdGlvblJlc3BvbnNlIgASlwEKHEVuYWJsZUxpbnRpbmdGb3JUaGVOYW1lc3BhY2USOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVxdWVzdBo6LndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUxpbnRpbmdGb3JUaGVOYW1lc3BhY2VSZXNwb25zZSIAEpcBChxDb25maWd1cmVOYW1lc3BhY2VMaW50Q29uZmlnEjkud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlTmFtZXNwYWNlTGludENvbmZpZ1JlcXVlc3QaOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VMaW50Q29uZmlnUmVzcG9uc2UiABKFAQoWR2V0TmFtZXNwYWNlTGludENvbmZpZxIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZUxpbnRDb25maWdSZXF1ZXN0GjQud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlTGludENvbmZpZ1Jlc3BvbnNlIgASmQEKGEdldE5hbWVzcGFjZUNoZWNrc0NvbmZpZxI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZUNoZWNrc0NvbmZpZ3VyYXRpb25SZXF1ZXN0Gj0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlc3BvbnNlIgASogEKG1VwZGF0ZU5hbWVzcGFjZUNoZWNrc0NvbmZpZxI/LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU5hbWVzcGFjZUNoZWNrc0NvbmZpZ3VyYXRpb25SZXF1ZXN0GkAud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlc3BvbnNlIgASeQoSRW5hYmxlR3JhcGhQcnVuaW5nEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlR3JhcGhQcnVuaW5nUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUdyYXBoUHJ1bmluZ1Jlc3BvbnNlIgASrwEKJENvbmZpZ3VyZU5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZxJBLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbmZpZ3VyZU5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1JlcXVlc3QaQi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZSIAEp0BCh5HZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWcSOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXF1ZXN0Gjwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnUmVzcG9uc2UiABJwCg9HZXRGZWF0dXJlRmxhZ3MSLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlRmxhZ3NSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdzUmVzcG9uc2UiABJ/ChRHZXRGZWF0dXJlRmxhZ0J5TmFtZRIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnQnlOYW1lUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnQnlOYW1lUmVzcG9uc2UiABKjAQogR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWcSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWF0dXJlRmxhZ1JlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASfAoTR2V0RmVhdHVyZVN1YmdyYXBocxIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNSZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZVN1YmdyYXBoc1Jlc3BvbnNlIgASoAEKH0dldEZlYXR1cmVGbGFnc0J5RmVkZXJhdGVkR3JhcGgSPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlRmxhZ3NCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBo9LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc0J5RmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEtkBCjJHZXRGZWF0dXJlRmxhZ3NJbkxhdGVzdENvbXBvc2l0aW9uQnlGZWRlcmF0ZWRHcmFwaBJPLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBpQLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVzcG9uc2UiABKsAQojR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVkZXJhdGVkR3JhcGgSQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaFJlcXVlc3QaQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgASggEKFUdldEZlZGVyYXRlZEdyYXBoQnlJZBIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoQnlJZFJlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaEJ5SWRSZXNwb25zZSIAEnAKD0dldFN1YmdyYXBoQnlJZBIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlJZFJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaEJ5SWRSZXNwb25zZSIAEosBChhQdXNoQ2FjaGVXYXJtZXJPcGVyYXRpb24SNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdXNoQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuUHVzaENhY2hlV2FybWVyT3BlcmF0aW9uUmVzcG9uc2UiABKLAQoYR2V0Q2FjaGVXYXJtZXJPcGVyYXRpb25zEjUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2FjaGVXYXJtZXJPcGVyYXRpb25zUmVxdWVzdBo2LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENhY2hlV2FybWVyT3BlcmF0aW9uc1Jlc3BvbnNlIgASlwEKHENvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnMSOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wdXRlQ2FjaGVXYXJtZXJPcGVyYXRpb25zUmVxdWVzdBo6LndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXNwb25zZSIAEn8KFENvbmZpZ3VyZUNhY2hlV2FybWVyEjEud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlQ2FjaGVXYXJtZXJSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlQ2FjaGVXYXJtZXJSZXNwb25zZSIAEn8KFEdldENhY2hlV2FybWVyQ29uZmlnEjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2FjaGVXYXJtZXJDb25maWdSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2FjaGVXYXJtZXJDb25maWdSZXNwb25zZSIAEpEBChpEZWxldGVDYWNoZVdhcm1lck9wZXJhdGlvbhI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uUmVzcG9uc2UiABKjAQogR2V0U3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNDb25maWcSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaENoZWNrRXh0ZW5zaW9uc0NvbmZpZ1JlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaENoZWNrRXh0ZW5zaW9uc0NvbmZpZ1Jlc3BvbnNlIgASowEKIENvbmZpZ3VyZVN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zEj0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNSZXF1ZXN0Gj4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNSZXNwb25zZSIAEnAKD0dldEJpbGxpbmdQbGFucxIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEJpbGxpbmdQbGFuc1JlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZSIAEoIBChVDcmVhdGVDaGVja291dFNlc3Npb24SMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVDaGVja291dFNlc3Npb25SZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlQ2hlY2tvdXRTZXNzaW9uUmVzcG9uc2UiABKRAQoaQ3JlYXRlQmlsbGluZ1BvcnRhbFNlc3Npb24SNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvblJlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvblJlc3BvbnNlIgASZAoLVXBncmFkZVBsYW4SKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGdyYWRlUGxhblJlcXVlc3QaKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGdyYWRlUGxhblJlc3BvbnNlIgASoAEKH0xpc3RSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvbnMSPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaXN0Um91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25zUmVxdWVzdBo9LndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvbnNSZXNwb25zZSIAEqkBCiJTZXRHcmFwaFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uEj8ud2cuY29zbW8ucGxhdGZvcm0udjEuU2V0R3JhcGhSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvblJlcXVlc3QaQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TZXRHcmFwaFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uUmVzcG9uc2UiABJtCg5DcmVhdGVQcm9wb3NhbBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZVByb3Bvc2FsUmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZVByb3Bvc2FsUmVzcG9uc2UiABJkCgtHZXRQcm9wb3NhbBIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2FsUmVxdWVzdBopLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2FsUmVzcG9uc2UiABJtCg5VcGRhdGVQcm9wb3NhbBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZVByb3Bvc2FsUmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZVByb3Bvc2FsUmVzcG9uc2UiABKUAQobRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlEjgud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlUmVxdWVzdBo5LndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZVByb3Bvc2Fsc0Zvck5hbWVzcGFjZVJlc3BvbnNlIgASowEKIENvbmZpZ3VyZU5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnEj0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXF1ZXN0Gj4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXNwb25zZSIAEpEBChpHZXROYW1lc3BhY2VQcm9wb3NhbENvbmZpZxI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVzcG9uc2UiABKUAQobVXBkYXRlTmFtZXNwYWNlTG9naW5NZXRob2RzEjgud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTmFtZXNwYWNlTG9naW5NZXRob2RzUmVxdWVzdBo5LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU5hbWVzcGFjZUxvZ2luTWV0aG9kc1Jlc3BvbnNlIgASjgEKGUxpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHMSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaXN0TmFtZXNwYWNlTG9naW5NZXRob2RzUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXNwb25zZSIAEpQBChtHZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHMSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVzcG9uc2UiABKdAQoeVXBkYXRlT3JnYW5pemF0aW9uTG9naW5NZXRob2RzEjsud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVxdWVzdBo8LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kc1Jlc3BvbnNlIgASlwEKHEdldFByb3Bvc2Fsc0J5RmVkZXJhdGVkR3JhcGgSOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQcm9wb3NhbHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBo6LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2Fsc0J5RmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEnYKEUdldFByb3Bvc2FsQ2hlY2tzEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxDaGVja3NSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxDaGVja3NSZXNwb25zZSIAEmoKDUdldE9wZXJhdGlvbnMSKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25zUmVxdWVzdBorLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbnNSZXNwb25zZSIAEogBChdHZXRDbGllbnRzRnJvbUFuYWx5dGljcxI0LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENsaWVudHNGcm9tQW5hbHl0aWNzUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENsaWVudHNGcm9tQW5hbHl0aWNzUmVzcG9uc2UiABJ8ChNHZXRPcGVyYXRpb25DbGllbnRzEjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uQ2xpZW50c1JlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25DbGllbnRzUmVzcG9uc2UiABKXAQocR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkcxI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbkRlcHJlY2F0ZWRGaWVsZHNSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkc1Jlc3BvbnNlIgASkQEKGlZhbGlkYXRlQW5kRmV0Y2hQbHVnaW5EYXRhEjcud2cuY29zbW8ucGxhdGZvcm0udjEuVmFsaWRhdGVBbmRGZXRjaFBsdWdpbkRhdGFSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuVmFsaWRhdGVBbmRGZXRjaFBsdWdpbkRhdGFSZXNwb25zZSIAEmcKDExpbmtTdWJncmFwaBIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbmtTdWJncmFwaFJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW5rU3ViZ3JhcGhSZXNwb25zZSIAEm0KDlVubGlua1N1YmdyYXBoEisud2cuY29zbW8ucGxhdGZvcm0udjEuVW5saW5rU3ViZ3JhcGhSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuVW5saW5rU3ViZ3JhcGhSZXNwb25zZSIAEogBChdWZXJpZnlBUElLZXlHcmFwaEFjY2VzcxI0LndnLmNvc21vLnBsYXRmb3JtLnYxLlZlcmlmeUFQSUtleUdyYXBoQWNjZXNzUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLlZlcmlmeUFQSUtleUdyYXBoQWNjZXNzUmVzcG9uc2UiABJtCg5SZWNvbXBvc2VHcmFwaBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlY29tcG9zZUdyYXBoUmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlY29tcG9zZUdyYXBoUmVzcG9uc2UiABJ/ChRSZWNvbXBvc2VGZWF0dXJlRmxhZxIxLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlY29tcG9zZUZlYXR1cmVGbGFnUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlY29tcG9zZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJqCg1HZXRPbmJvYXJkaW5nEioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T25ib2FyZGluZ1JlcXVlc3QaKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPbmJvYXJkaW5nUmVzcG9uc2UiABJzChBDcmVhdGVPbmJvYXJkaW5nEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT25ib2FyZGluZ1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPbmJvYXJkaW5nUmVzcG9uc2UiABJzChBGaW5pc2hPbmJvYXJkaW5nEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuRmluaXNoT25ib2FyZGluZ1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaW5pc2hPbmJvYXJkaW5nUmVzcG9uc2UiAGIGcHJvdG8z", [file_wg_cosmo_common_common, file_wg_cosmo_notifications_events]); + fileDesc("CiN3Zy9jb3Ntby9wbGF0Zm9ybS92MS9wbGF0Zm9ybS5wcm90bxIUd2cuY29zbW8ucGxhdGZvcm0udjEiIwoFTGFiZWwSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJIlsKCFJlc3BvbnNlEi0KBGNvZGUYASABKA4yHy53Zy5jb3Ntby5jb21tb24uRW51bVN0YXR1c0NvZGUSFAoHZGV0YWlscxgCIAEoCUgAiAEBQgoKCF9kZXRhaWxzIi8KDlJlc3BvbnNlU3RhdHVzEgwKBGNvZGUYASABKAUSDwoHbWVzc2FnZRgCIAEoCSJKChdQdWJsaXNoTW9ub2dyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIOCgZzY2hlbWEYAyABKAkilwIKGFB1Ymxpc2hNb25vZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmciYAoKUHJvdG9JbnB1dBIOCgZzY2hlbWEYASABKAkSEAoIbWFwcGluZ3MYAiABKAkSDAoEbG9jaxgDIAEoCRIRCglwbGF0Zm9ybXMYBCADKAkSDwoHdmVyc2lvbhgFIAEoCSKZBgofUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEg4KBnNjaGVtYRgCIAEoCRIYCgtyb3V0aW5nX3VybBgDIAEoCUgAiAEBEisKBmxhYmVscxgEIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgGIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAYgBARIdChBzdWJzY3JpcHRpb25fdXJsGAcgASgJSAKIAQESEQoJbmFtZXNwYWNlGAggASgJElAKFXdlYnNvY2tldF9zdWJwcm90b2NvbBgJIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMV2Vic29ja2V0U3VicHJvdG9jb2xIA4gBARIgChNpc19mZWF0dXJlX3N1YmdyYXBoGAogASgISASIAQESHwoSYmFzZV9zdWJncmFwaF9uYW1lGAsgASgJSAWIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YDCABKAhIBogBARI1CgR0eXBlGA0gASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlSAeIAQESNAoFcHJvdG8YDiABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm90b0lucHV0SAiIAQESEgoFbGltaXQYDyABKAVICYgBAUIOCgxfcm91dGluZ191cmxCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEITChFfc3Vic2NyaXB0aW9uX3VybEIYChZfd2Vic29ja2V0X3N1YnByb3RvY29sQhYKFF9pc19mZWF0dXJlX3N1YmdyYXBoQhUKE19iYXNlX3N1YmdyYXBoX25hbWVCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQgcKBV90eXBlQggKBl9wcm90b0IICgZfbGltaXQizwMKIFB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISFwoKaGFzQ2hhbmdlZBgEIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYBiABKAlIAYgBARI/CgZjb3VudHMYByABKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaFB1Ymxpc2hTdGF0c0gCiAEBQg0KC19oYXNDaGFuZ2VkQhcKFV9wcm9wb3NhbE1hdGNoTWVzc2FnZUIJCgdfY291bnRzImgKFFN1YmdyYXBoUHVibGlzaFN0YXRzEhkKEWNvbXBvc2l0aW9uRXJyb3JzGAEgASgFEhsKE2NvbXBvc2l0aW9uV2FybmluZ3MYAiABKAUSGAoQZGVwbG95bWVudEVycm9ycxgDIAEoBSIvCg9QdWJsaXNoU3ViZ3JhcGgSDAoEbmFtZRgBIAEoCRIOCgZzY2hlbWEYAiABKAki/wEKIFB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRI4CglzdWJncmFwaHMYAiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoU3ViZ3JhcGgSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YAyABKAhIAIgBARISCgVsaW1pdBgEIAEoBUgBiAEBEhIKBWFzeW5jGAUgASgISAKIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQggKBl9saW1pdEIICgZfYXN5bmMiqAMKIVB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSPwoGY291bnRzGAUgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAIgBARIcChR1cGRhdGVkU3ViZ3JhcGhOYW1lcxgGIAMoCRISCgVqb2JJZBgHIAEoCUgBiAEBQgkKB19jb3VudHNCCAoGX2pvYklkIk4KH0dldEJhdGNoUHVibGlzaEpvYlN0YXR1c1JlcXVlc3QSDQoFam9iSWQYASABKAkSEgoFbGltaXQYAiABKAVIAIgBAUIICgZfbGltaXQihAQKIEdldEJhdGNoUHVibGlzaEpvYlN0YXR1c1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQAoGc3RhdHVzGAIgASgOMisud2cuY29zbW8ucGxhdGZvcm0udjEuQmF0Y2hQdWJsaXNoSm9iU3RhdHVzSACIAQESGgoNZmFpbHVyZVJlYXNvbhgDIAEoCUgBiAEBEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAQgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAUgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBiADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSPwoGY291bnRzGAcgASgLMioud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhQdWJsaXNoU3RhdHNIAogBARIcChR1cGRhdGVkU3ViZ3JhcGhOYW1lcxgIIAMoCUIJCgdfc3RhdHVzQhAKDl9mYWlsdXJlUmVhc29uQgkKB19jb3VudHMiXgoHR2l0SW5mbxISCgpjb21taXRfc2hhGAEgASgJEhIKCmFjY291bnRfaWQYAiABKAkSEgoKb3duZXJfc2x1ZxgDIAEoCRIXCg9yZXBvc2l0b3J5X3NsdWcYBCABKAkiQAoKVkNTQ29udGV4dBIOCgZhdXRob3IYASABKAkSEgoKY29tbWl0X3NoYRgCIAEoCRIOCgZicmFuY2gYAyABKAkixwMKGkNoZWNrU3ViZ3JhcGhTY2hlbWFSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSDgoGc2NoZW1hGAIgASgMEi4KB2dpdEluZm8YAyABKAsyHS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HaXRJbmZvEhMKBmRlbGV0ZRgEIAEoCEgAiAEBEhEKCW5hbWVzcGFjZRgFIAEoCRIfChJza2lwX3RyYWZmaWNfY2hlY2sYBiABKAhIAYgBARI5Cgp2Y3NDb250ZXh0GAcgASgLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuVkNTQ29udGV4dEgCiAEBEisKBmxhYmVscxgIIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAkgASgISAOIAQESEgoFbGltaXQYCiABKAVIBIgBAUIJCgdfZGVsZXRlQhUKE19za2lwX3RyYWZmaWNfY2hlY2tCDQoLX3Zjc0NvbnRleHRCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uQggKBl9saW1pdCKoAQoYRml4U3ViZ3JhcGhTY2hlbWFSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSDgoGc2NoZW1hGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCRItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgEIAEoCEgAiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiLqAwoWQ3JlYXRlTW9ub2dyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRITCgtyb3V0aW5nX3VybBgDIAEoCRIRCglncmFwaF91cmwYBCABKAkSHQoQc3Vic2NyaXB0aW9uX3VybBgFIAEoCUgAiAEBElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgGIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAYgBARITCgZyZWFkbWUYByABKAlIAogBARIbChNhZG1pc3Npb25XZWJob29rVVJMGAggASgJElAKFXdlYnNvY2tldF9zdWJwcm90b2NvbBgJIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMV2Vic29ja2V0U3VicHJvdG9jb2xIA4gBARIjChZhZG1pc3Npb25XZWJob29rU2VjcmV0GAogASgJSASIAQFCEwoRX3N1YnNjcmlwdGlvbl91cmxCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEIJCgdfcmVhZG1lQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCGQoXX2FkbWlzc2lvbldlYmhvb2tTZWNyZXQiSwoXQ3JlYXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSK8AgobQ3JlYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLcm91dGluZ191cmwYAiABKAkSFgoObGFiZWxfbWF0Y2hlcnMYAyADKAkSEwoGcmVhZG1lGAQgASgJSACIAQESEQoJbmFtZXNwYWNlGAUgASgJEhsKE2FkbWlzc2lvbldlYmhvb2tVUkwYBiABKAkSIwoWYWRtaXNzaW9uV2ViaG9va1NlY3JldBgHIAEoCUgBiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAggASgISAKIAQFCCQoHX3JlYWRtZUIZChdfYWRtaXNzaW9uV2ViaG9va1NlY3JldEIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ipgUKHkNyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBIMCgRuYW1lGAEgASgJEhgKC3JvdXRpbmdfdXJsGAIgASgJSACIAQESKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSUAoVc3Vic2NyaXB0aW9uX3Byb3RvY29sGAUgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxTdWJzY3JpcHRpb25Qcm90b2NvbEgBiAEBEh0KEHN1YnNjcmlwdGlvbl91cmwYBiABKAlIAogBARITCgZyZWFkbWUYByABKAlIA4gBARIRCgluYW1lc3BhY2UYCCABKAkSUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAkgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgEiAEBEiIKFWlzX2V2ZW50X2RyaXZlbl9ncmFwaBgKIAEoCEgFiAEBEiAKE2lzX2ZlYXR1cmVfc3ViZ3JhcGgYCyABKAhIBogBARIfChJiYXNlX3N1YmdyYXBoX25hbWUYDCABKAlIB4gBARIwCgR0eXBlGA0gASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlQg4KDF9yb3V0aW5nX3VybEIYChZfc3Vic2NyaXB0aW9uX3Byb3RvY29sQhMKEV9zdWJzY3JpcHRpb25fdXJsQgkKB19yZWFkbWVCGAoWX3dlYnNvY2tldF9zdWJwcm90b2NvbEIYChZfaXNfZXZlbnRfZHJpdmVuX2dyYXBoQhYKFF9pc19mZWF0dXJlX3N1YmdyYXBoQhUKE19iYXNlX3N1YmdyYXBoX25hbWUiPgobRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIjkKFkRlbGV0ZU1vbm9ncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiSwoXRGVsZXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKeAQoeRGVsZXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXF1ZXN0EhUKDXN1YmdyYXBoX25hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAMgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIrkBCgxTY2hlbWFDaGFuZ2USDwoHbWVzc2FnZRgBIAEoCRISCgpjaGFuZ2VUeXBlGAIgASgJEhEKBHBhdGgYAyABKAlIAIgBARISCgppc0JyZWFraW5nGAQgASgIEhgKC2hhc092ZXJyaWRlGAUgASgISAGIAQESGQoMc3ViZ3JhcGhOYW1lGAYgASgJSAKIAQFCBwoFX3BhdGhCDgoMX2hhc092ZXJyaWRlQg8KDV9zdWJncmFwaE5hbWUizAEKGkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlEg8KB21lc3NhZ2UYASABKAkSEgoKY2hhbmdlVHlwZRgCIAEoCRIRCgRwYXRoGAMgASgJSACIAQESEgoKaXNCcmVha2luZxgEIAEoCBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYBSABKAkSGAoLaGFzT3ZlcnJpZGUYBiABKAhIAYgBARITCgtmZWF0dXJlRmxhZxgHIAEoCUIHCgVfcGF0aEIOCgxfaGFzT3ZlcnJpZGUiZwoQQ29tcG9zaXRpb25FcnJvchIPCgdtZXNzYWdlGAEgASgJEhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSEwoLZmVhdHVyZUZsYWcYBCABKAkiaQoSQ29tcG9zaXRpb25XYXJuaW5nEg8KB21lc3NhZ2UYASABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCRITCgtmZWF0dXJlRmxhZxgEIAEoCSJRCg9EZXBsb3ltZW50RXJyb3ISDwoHbWVzc2FnZRgBIAEoCRIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJInQKGENoZWNrT3BlcmF0aW9uVXNhZ2VTdGF0cxIXCg90b3RhbE9wZXJhdGlvbnMYASABKA0SEwoLZmlyc3RTZWVuQXQYAiABKAkSEgoKbGFzdFNlZW5BdBgDIAEoCRIWCg5zYWZlT3BlcmF0aW9ucxgEIAEoDSJgChZDaGVja2VkRmVkZXJhdGVkR3JhcGhzEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhkKEW9yZ2FuaXphdGlvbl9zbHVnGAQgASgJInQKDExpbnRMb2NhdGlvbhIMCgRsaW5lGAEgASgNEg4KBmNvbHVtbhgCIAEoDRIUCgdlbmRMaW5lGAMgASgNSACIAQESFgoJZW5kQ29sdW1uGAQgASgNSAGIAQFCCgoIX2VuZExpbmVCDAoKX2VuZENvbHVtbiLlAQoJTGludElzc3VlEhkKDGxpbnRSdWxlVHlwZRgBIAEoCUgAiAEBEjQKCHNldmVyaXR5GAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5Eg8KB21lc3NhZ2UYAyABKAkSOQoNaXNzdWVMb2NhdGlvbhgEIAEoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRMb2NhdGlvbhIZCgxzdWJncmFwaE5hbWUYBSABKAlIAYgBAUIPCg1fbGludFJ1bGVUeXBlQg8KDV9zdWJncmFwaE5hbWUijgIKEUdyYXBoUHJ1bmluZ0lzc3VlEhwKFGdyYXBoUHJ1bmluZ1J1bGVUeXBlGAEgASgJEjQKCHNldmVyaXR5GAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5EhEKCWZpZWxkUGF0aBgDIAEoCRIPCgdtZXNzYWdlGAQgASgJEjkKDWlzc3VlTG9jYXRpb24YBSABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50TG9jYXRpb24SGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAYgASgJEhkKDHN1YmdyYXBoTmFtZRgHIAEoCUgAiAEBQg8KDV9zdWJncmFwaE5hbWUihwsKG0NoZWNrU3ViZ3JhcGhTY2hlbWFSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjsKD2JyZWFraW5nQ2hhbmdlcxgCIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRI+ChJub25CcmVha2luZ0NoYW5nZXMYAyADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USQQoRY29tcG9zaXRpb25FcnJvcnMYBCADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEksKE29wZXJhdGlvblVzYWdlU3RhdHMYBSABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja09wZXJhdGlvblVzYWdlU3RhdHMSEAoIY2hlY2tfaWQYBiABKAkSTgoYY2hlY2tlZF9mZWRlcmF0ZWRfZ3JhcGhzGAcgAygLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tlZEZlZGVyYXRlZEdyYXBocxI1CgxsaW50V2FybmluZ3MYCCADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSMwoKbGludEVycm9ycxgJIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJDChJncmFwaFBydW5lV2FybmluZ3MYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJBChBncmFwaFBydW5lRXJyb3JzGAsgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nSXNzdWUSKQocY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZBgMIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYDSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYDiABKAlIAYgBARInChppc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZBgPIAEoCEgCiAEBEicKGmlzTGlua2VkUHJ1bmluZ0NoZWNrRmFpbGVkGBAgASgISAOIAQESJAoXaXNDaGVja0V4dGVuc2lvblNraXBwZWQYESABKAhIBIgBARInChpjaGVja0V4dGVuc2lvbkVycm9yTWVzc2FnZRgSIAEoCUgFiAEBEjwKBmNvdW50cxgTIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrQ291bnRzSAaIAQESVwodY29tcG9zZWRTY2hlbWFCcmVha2luZ0NoYW5nZXMYFCADKAsyMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaFNjaGVtYUNoYW5nZRIoChtmZWF0dXJlU3ViZ3JhcGhDaGVja01lc3NhZ2UYFSABKAlIB4gBAUIfCh1fY2xpZW50X3RyYWZmaWNfY2hlY2tfc2tpcHBlZEIXChVfcHJvcG9zYWxNYXRjaE1lc3NhZ2VCHQobX2lzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkQh0KG19pc0xpbmtlZFBydW5pbmdDaGVja0ZhaWxlZEIaChhfaXNDaGVja0V4dGVuc2lvblNraXBwZWRCHQobX2NoZWNrRXh0ZW5zaW9uRXJyb3JNZXNzYWdlQgkKB19jb3VudHNCHgocX2ZlYXR1cmVTdWJncmFwaENoZWNrTWVzc2FnZSKHAgoRU2NoZW1hQ2hlY2tDb3VudHMSFAoMbGludFdhcm5pbmdzGAEgASgFEhIKCmxpbnRFcnJvcnMYAiABKAUSFwoPYnJlYWtpbmdDaGFuZ2VzGAMgASgFEhoKEm5vbkJyZWFraW5nQ2hhbmdlcxgEIAEoBRIZChFjb21wb3NpdGlvbkVycm9ycxgFIAEoBRIbChNjb21wb3NpdGlvbldhcm5pbmdzGAYgASgFEhgKEGdyYXBoUHJ1bmVFcnJvcnMYByABKAUSGgoSZ3JhcGhQcnVuZVdhcm5pbmdzGAggASgFEiUKHWNvbXBvc2VkU2NoZW1hQnJlYWtpbmdDaGFuZ2VzGAkgASgFIm8KGUZpeFN1YmdyYXBoU2NoZW1hUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIQCghtb2RpZmllZBgCIAEoCBIOCgZzY2hlbWEYAyABKAkimwIKHENyZWF0ZUZlZGVyYXRlZEdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJBChFjb21wb3NpdGlvbkVycm9ycxgCIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uRXJyb3ISPwoQZGVwbG95bWVudEVycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nIlMKH0NyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLaAgofRGVsZXRlRmVkZXJhdGVkU3ViZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSIQoUcHJvcG9zYWxNYXRjaE1lc3NhZ2UYBSABKAlIAIgBAUIXChVfcHJvcG9zYWxNYXRjaE1lc3NhZ2UiUAocRGVsZXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIp8BChlHZXRGZWRlcmF0ZWRHcmFwaHNSZXF1ZXN0Eg0KBWxpbWl0GAEgASgFEg4KBm9mZnNldBgCIAEoBRIWCg5pbmNsdWRlTWV0cmljcxgDIAEoCBIRCgluYW1lc3BhY2UYBCABKAkSIAoTc3VwcG9ydHNfZmVkZXJhdGlvbhgFIAEoCEgAiAEBQhYKFF9zdXBwb3J0c19mZWRlcmF0aW9uImUKCENvbnRyYWN0EgoKAmlkGAEgASgJEiEKGXNvdXJjZV9mZWRlcmF0ZWRfZ3JhcGhfaWQYAiABKAkSFAoMZXhjbHVkZV90YWdzGAMgAygJEhQKDGluY2x1ZGVfdGFncxgEIAMoCSKzBAoORmVkZXJhdGVkR3JhcGgSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRISCgpyb3V0aW5nVVJMGAMgASgJEhYKDmxhYmVsX21hdGNoZXJzGAQgAygJEhUKDWxhc3RVcGRhdGVkQXQYBSABKAkSFAoMaXNDb21wb3NhYmxlGAYgASgIEhkKEWNvbXBvc2l0aW9uRXJyb3JzGAcgASgJEhoKEmNvbm5lY3RlZFN1YmdyYXBocxgIIAEoBRI+Cg1yZXF1ZXN0U2VyaWVzGAkgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuUmVxdWVzdFNlcmllc0l0ZW0SEwoGcmVhZG1lGAogASgJSACIAQESEQoJdGFyZ2V0X2lkGAsgASgJEhEKCW5hbWVzcGFjZRgMIAEoCRIaCg1jb21wb3NpdGlvbklkGA0gASgJSAGIAQESGwoTc3VwcG9ydHNfZmVkZXJhdGlvbhgOIAEoCBI1Cghjb250cmFjdBgPIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbnRyYWN0SAKIAQESIgoVYWRtaXNzaW9uX3dlYmhvb2tfdXJsGBAgASgJSAOIAQESJAoccm91dGVyX2NvbXBhdGliaWxpdHlfdmVyc2lvbhgRIAEoCUIJCgdfcmVhZG1lQhAKDl9jb21wb3NpdGlvbklkQgsKCV9jb250cmFjdEIYChZfYWRtaXNzaW9uX3dlYmhvb2tfdXJsIoQBChpHZXRGZWRlcmF0ZWRHcmFwaHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjQKBmdyYXBocxgCIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoIlQKKUdldEZlZGVyYXRlZEdyYXBoc0J5U3ViZ3JhcGhMYWJlbHNSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkilAEKKkdldEZlZGVyYXRlZEdyYXBoc0J5U3ViZ3JhcGhMYWJlbHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjQKBmdyYXBocxgCIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoIogBChNHZXRTdWJncmFwaHNSZXF1ZXN0Eg0KBWxpbWl0GAEgASgFEg4KBm9mZnNldBgCIAEoBRIRCgluYW1lc3BhY2UYAyABKAkSEgoFcXVlcnkYBCABKAlIAIgBARIhChlleGNsdWRlX2ZlYXR1cmVfc3ViZ3JhcGhzGAUgASgIQggKBl9xdWVyeSK9BQoIU3ViZ3JhcGgSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRISCgpyb3V0aW5nVVJMGAMgASgJEhUKDWxhc3RVcGRhdGVkQXQYBCABKAkSKwoGbGFiZWxzGAUgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSGgoNY3JlYXRvclVzZXJJZBgGIAEoCUgAiAEBEhMKBnJlYWRtZRgHIAEoCUgBiAEBEhcKD3N1YnNjcmlwdGlvblVybBgIIAEoCRIRCgl0YXJnZXRfaWQYCSABKAkSEQoJbmFtZXNwYWNlGAogASgJEhwKFHN1YnNjcmlwdGlvblByb3RvY29sGAsgASgJEhYKCWlzVjJHcmFwaBgMIAEoCEgCiAEBEhoKEmlzRXZlbnREcml2ZW5HcmFwaBgNIAEoCBIcChR3ZWJzb2NrZXRTdWJwcm90b2NvbBgOIAEoCRIZChFpc0ZlYXR1cmVTdWJncmFwaBgPIAEoCBIdChBiYXNlU3ViZ3JhcGhOYW1lGBAgASgJSAOIAQESGwoOYmFzZVN1YmdyYXBoSWQYESABKAlIBIgBARIwCgR0eXBlGBIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlEkIKCnBsdWdpbkRhdGEYEyABKAsyKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaC5QbHVnaW5EYXRhSAWIAQEaMAoKUGx1Z2luRGF0YRIPCgd2ZXJzaW9uGAEgASgJEhEKCXBsYXRmb3JtcxgCIAMoCUIQCg5fY3JlYXRvclVzZXJJZEIJCgdfcmVhZG1lQgwKCl9pc1YyR3JhcGhCEwoRX2Jhc2VTdWJncmFwaE5hbWVCEQoPX2Jhc2VTdWJncmFwaElkQg0KC19wbHVnaW5EYXRhIocBChRHZXRTdWJncmFwaHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEi4KBmdyYXBocxgCIAMoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEg0KBWNvdW50GAMgASgFIlkKHkdldEZlZGVyYXRlZEdyYXBoQnlOYW1lUmVxdWVzdBIMCgRuYW1lGAEgASgJEhYKDmluY2x1ZGVNZXRyaWNzGAIgASgIEhEKCW5hbWVzcGFjZRgDIAEoCSLWAQofR2V0RmVkZXJhdGVkR3JhcGhCeU5hbWVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjMKBWdyYXBoGAIgASgLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuRmVkZXJhdGVkR3JhcGgSMQoJc3ViZ3JhcGhzGAMgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgSGQoRZ3JhcGhSZXF1ZXN0VG9rZW4YBCABKAkiegohR2V0RmVkZXJhdGVkR3JhcGhTRExCeU5hbWVSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEh4KEWZlYXR1cmVfZmxhZ19uYW1lGAMgASgJSACIAQFCFAoSX2ZlYXR1cmVfZmxhZ19uYW1lIsYBCiJHZXRGZWRlcmF0ZWRHcmFwaFNETEJ5TmFtZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoDc2RsGAIgASgJSACIAQESFwoKdmVyc2lvbl9pZBgDIAEoCUgBiAEBEhoKDWNsaWVudF9zY2hlbWEYBCABKAlIAogBAUIGCgRfc2RsQg0KC192ZXJzaW9uX2lkQhAKDl9jbGllbnRfc2NoZW1hIjsKGEdldFN1YmdyYXBoQnlOYW1lUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSLiAgoZR2V0U3ViZ3JhcGhCeU5hbWVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEi0KBWdyYXBoGAIgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgSNQoHbWVtYmVycxgDIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoTWVtYmVyElsKDmxpbmtlZFN1YmdyYXBoGAQgASgLMj4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhCeU5hbWVSZXNwb25zZS5MaW5rZWRTdWJncmFwaEgAiAEBGj0KDkxpbmtlZFN1YmdyYXBoEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJQhEKD19saW5rZWRTdWJncmFwaCJjCipHZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvblJlcXVlc3QSDAoEbmFtZRgBIAEoCRIUCgxmZWRHcmFwaE5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIqEBCitHZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoDc2RsGAIgASgJSACIAQESFwoKdmVyc2lvbl9pZBgDIAEoCUgBiAEBQgYKBF9zZGxCDQoLX3ZlcnNpb25faWQiPgobR2V0TGF0ZXN0U3ViZ3JhcGhTRExSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIpIBChxHZXRMYXRlc3RTdWJncmFwaFNETFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoDc2RsGAIgASgJSACIAQESFwoKdmVyc2lvbl9pZBgDIAEoCUgBiAEBQgYKBF9zZGxCDQoLX3ZlcnNpb25faWQiOQokR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVGaWx0ZXJzEhEKCXN1YmdyYXBocxgBIAMoCSLoAQokR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVSZXF1ZXN0EgwKBG5hbWUYASABKAkSDQoFbGltaXQYAiABKAUSDgoGb2Zmc2V0GAMgASgFEhEKCXN0YXJ0RGF0ZRgEIAEoCRIPCgdlbmREYXRlGAUgASgJEhEKCW5hbWVzcGFjZRgGIAEoCRJQCgdmaWx0ZXJzGAcgASgLMjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVGaWx0ZXJzSACIAQFCCgoIX2ZpbHRlcnMiigwKC1NjaGVtYUNoZWNrEgoKAmlkGAEgASgJEhUKCHRhcmdldElEGAIgASgJSACIAQESGQoMc3ViZ3JhcGhOYW1lGAMgASgJSAGIAQESEQoJdGltZXN0YW1wGAQgASgJEhQKDGlzQ29tcG9zYWJsZRgFIAEoCBISCgppc0JyZWFraW5nGAYgASgIEhgKEGhhc0NsaWVudFRyYWZmaWMYByABKAgSFwoPaXNGb3JjZWRTdWNjZXNzGAggASgIEhEKCWlzRGVsZXRlZBgJIAEoCBJDCglnaERldGFpbHMYCiABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGVjay5HaERldGFpbHNIAogBARIVCg1oYXNMaW50RXJyb3JzGAsgASgIEh0KFWhhc0dyYXBoUHJ1bmluZ0Vycm9ycxgMIAEoCBIkChxjbGllbnRfdHJhZmZpY19jaGVja19za2lwcGVkGA0gASgIEhQKDGxpbnRfc2tpcHBlZBgOIAEoCBIdChVncmFwaF9wcnVuaW5nX3NraXBwZWQYDyABKAgSOQoKdmNzQ29udGV4dBgQIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlZDU0NvbnRleHRIA4gBARJLChBjaGVja2VkU3ViZ3JhcGhzGBEgAygLMjEud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2suQ2hlY2tlZFN1YmdyYXBoEhoKDXByb3Bvc2FsTWF0Y2gYEiABKAlIBIgBARIbChNjb21wb3NpdGlvbl9za2lwcGVkGBMgASgIEiAKGGJyZWFraW5nX2NoYW5nZXNfc2tpcHBlZBgUIAEoCBIZCgxlcnJvck1lc3NhZ2UYFSABKAlIBYgBARJDCgxsaW5rZWRDaGVja3MYFiADKAsyLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGVjay5MaW5rZWRDaGVjaxIoChtjaGVja19leHRlbnNpb25fZGVsaXZlcnlfaWQYFyABKAlIBogBARIqCh1jaGVja19leHRlbnNpb25fZXJyb3JfbWVzc2FnZRgYIAEoCUgHiAEBEh8KF2hhc0ZlYXR1cmVTdWJncmFwaENoZWNrGBkgASgIGkkKCUdoRGV0YWlscxIRCgljb21taXRTaGEYASABKAkSEQoJb3duZXJTbHVnGAIgASgJEhYKDnJlcG9zaXRvcnlTbHVnGAMgASgJGqoBCg9DaGVja2VkU3ViZ3JhcGgSCgoCaWQYASABKAkSFAoMc3ViZ3JhcGhOYW1lGAIgASgJEhcKCnN1YmdyYXBoSWQYAyABKAlIAIgBARIRCglpc0RlbGV0ZWQYBCABKAgSDQoFaXNOZXcYBSABKAgSKwoGbGFiZWxzGAYgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWxCDQoLX3N1YmdyYXBoSWQakQIKC0xpbmtlZENoZWNrEgoKAmlkGAEgASgJEhoKEmFmZmVjdGVkR3JhcGhOYW1lcxgCIAMoCRIZChFpc0NoZWNrU3VjY2Vzc2Z1bBgDIAEoCBIYChBoYXNDbGllbnRUcmFmZmljGAQgASgIEh0KFWhhc0dyYXBoUHJ1bmluZ0Vycm9ycxgFIAEoCBIhChljbGllbnRUcmFmZmljQ2hlY2tTa2lwcGVkGAYgASgIEiAKGGdyYXBoUHJ1bmluZ0NoZWNrU2tpcHBlZBgHIAEoCBIVCg1zdWJncmFwaE5hbWVzGAggAygJEhEKCW5hbWVzcGFjZRgJIAEoCRIXCg9pc0ZvcmNlZFN1Y2Nlc3MYCiABKAhCCwoJX3RhcmdldElEQg8KDV9zdWJncmFwaE5hbWVCDAoKX2doRGV0YWlsc0INCgtfdmNzQ29udGV4dEIQCg5fcHJvcG9zYWxNYXRjaEIPCg1fZXJyb3JNZXNzYWdlQh4KHF9jaGVja19leHRlbnNpb25fZGVsaXZlcnlfaWRCIAoeX2NoZWNrX2V4dGVuc2lvbl9lcnJvcl9tZXNzYWdlIrEBCiVHZXRDaGVja3NCeUZlZGVyYXRlZEdyYXBoTmFtZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMQoGY2hlY2tzGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hlY2sSIwobY2hlY2tzQ291bnRCYXNlZE9uRGF0ZVJhbmdlGAMgASgFIlEKFkdldENoZWNrU3VtbWFyeVJlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiNAoMQ2hhbmdlQ291bnRzEhEKCWFkZGl0aW9ucxgBIAEoBRIRCglkZWxldGlvbnMYAiABKAUiyAkKF0dldENoZWNrU3VtbWFyeVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMAoFY2hlY2sYAiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGVjaxJUCg9hZmZlY3RlZF9ncmFwaHMYAyADKAsyOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja1N1bW1hcnlSZXNwb25zZS5BZmZlY3RlZEdyYXBoEiYKGXByb3Bvc2VkU3ViZ3JhcGhTY2hlbWFTREwYBCABKAlIAIgBARIzCgdjaGFuZ2VzGAYgAygLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hhbmdlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAcgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchIaChJ0cmFmZmljX2NoZWNrX2RheXMYCCABKAUSMwoKbGludElzc3VlcxgJIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRJDChJncmFwaFBydW5pbmdJc3N1ZXMYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJFChNjb21wb3NpdGlvbldhcm5pbmdzGAsgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEhcKCnByb3Bvc2FsSWQYDCABKAlIAYgBARIZCgxwcm9wb3NhbE5hbWUYDSABKAlIAogBARJaCg9wcm9wb3NhbE1hdGNoZXMYDiADKAsyQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja1N1bW1hcnlSZXNwb25zZS5Qcm9wb3NhbFNjaGVtYU1hdGNoEhoKEmlzUHJvcG9zYWxzRW5hYmxlZBgPIAEoCBJXCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgQIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlGtoBCg1BZmZlY3RlZEdyYXBoEgoKAmlkGAEgASgJEhoKEnRyYWZmaWNfY2hlY2tfZGF5cxgCIAEoBRIMCgRuYW1lGAMgASgJEhkKEWlzQ2hlY2tTdWNjZXNzZnVsGAQgASgIEhQKDGlzQ29tcG9zYWJsZRgFIAEoCBISCgppc0JyZWFraW5nGAYgASgIEhgKEGhhc0NsaWVudFRyYWZmaWMYByABKAgSFQoNaGFzTGludEVycm9ycxgIIAEoCBIdChVoYXNHcmFwaFBydW5pbmdFcnJvcnMYCSABKAgaVgoTUHJvcG9zYWxTY2hlbWFNYXRjaBISCgpwcm9wb3NhbElkGAEgASgJEhQKDHByb3Bvc2FsTmFtZRgCIAEoCRIVCg1wcm9wb3NhbE1hdGNoGAMgASgIQhwKGl9wcm9wb3NlZFN1YmdyYXBoU2NoZW1hU0RMQg0KC19wcm9wb3NhbElkQg8KDV9wcm9wb3NhbE5hbWUikwEKGUdldENoZWNrT3BlcmF0aW9uc1JlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSDQoFbGltaXQYBCABKAUSDgoGb2Zmc2V0GAUgASgFEhMKBnNlYXJjaBgGIAEoCUgAiAEBQgkKB19zZWFyY2gi0wQKGkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USUwoKb3BlcmF0aW9ucxgCIAMoCzI/LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrT3BlcmF0aW9uc1Jlc3BvbnNlLkNoZWNrT3BlcmF0aW9uEhoKEnRyYWZmaWNfY2hlY2tfZGF5cxgDIAEoBRISCgpjcmVhdGVkX2F0GAQgASgJEiQKHGNsaWVudF90cmFmZmljX2NoZWNrX3NraXBwZWQYBSABKAgSHAoUdG90YWxPcGVyYXRpb25zQ291bnQYBiABKAUSLAokZG9BbGxPcGVyYXRpb25zSGF2ZUlnbm9yZUFsbE92ZXJyaWRlGAcgASgIEjQKLGRvQWxsT3BlcmF0aW9uc0hhdmVBbGxUaGVpckNoYW5nZXNNYXJrZWRTYWZlGAggASgIGtUBCg5DaGVja09wZXJhdGlvbhIMCgRoYXNoGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIVCg1maXJzdF9zZWVuX2F0GAQgASgJEhQKDGxhc3Rfc2Vlbl9hdBgFIAEoCRI9ChFpbXBhY3RpbmdfY2hhbmdlcxgGIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRIPCgdpc19zYWZlGAcgASgIEhwKFGhhc0lnbm9yZUFsbE92ZXJyaWRlGAggASgIIncKGkdldE9wZXJhdGlvbkNvbnRlbnRSZXF1ZXN0EgwKBGhhc2gYASABKAkSHAoUZmVkZXJhdGVkX2dyYXBoX25hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhEKBG5hbWUYBCABKAlIAIgBAUIHCgVfbmFtZSJqChtHZXRPcGVyYXRpb25Db250ZW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIZChFvcGVyYXRpb25fY29udGVudBgCIAEoCSKuAQohR2V0RmVkZXJhdGVkR3JhcGhDaGFuZ2Vsb2dSZXF1ZXN0EgwKBG5hbWUYASABKAkSNAoKcGFnaW5hdGlvbhgCIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlBhZ2luYXRpb24SMgoJZGF0ZVJhbmdlGAMgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEhEKCW5hbWVzcGFjZRgEIAEoCSJxChdGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZxIKCgJpZBgBIAEoCRIMCgRwYXRoGAIgASgJEhIKCmNoYW5nZVR5cGUYAyABKAkSFQoNY2hhbmdlTWVzc2FnZRgEIAEoCRIRCgljcmVhdGVkQXQYBSABKAkipQEKHUZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nT3V0cHV0EhEKCWNyZWF0ZWRBdBgBIAEoCRIXCg9zY2hlbWFWZXJzaW9uSWQYAiABKAkSQQoKY2hhbmdlbG9ncxgDIAMoCzItLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nEhUKDWNvbXBvc2l0aW9uSWQYBCABKAkixwEKIkdldEZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJaCh1mZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ091dHB1dBgCIAMoCzIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoQ2hhbmdlbG9nT3V0cHV0EhMKC2hhc05leHRQYWdlGAMgASgIImQKFEdldEZlZGVyYXRlZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USGgoSRmVkZXJhdGVkU2NoZW1hU0RMGAIgASgJIswEChVVcGRhdGVTdWJncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIYCgtyb3V0aW5nX3VybBgCIAEoCUgAiAEBEisKBmxhYmVscxgDIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEg8KB2hlYWRlcnMYBCADKAkSUAoVc3Vic2NyaXB0aW9uX3Byb3RvY29sGAUgASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxTdWJzY3JpcHRpb25Qcm90b2NvbEgBiAEBEh0KEHN1YnNjcmlwdGlvbl91cmwYBiABKAlIAogBARITCgZyZWFkbWUYByABKAlIA4gBARIRCgluYW1lc3BhY2UYCCABKAkSGQoMdW5zZXRfbGFiZWxzGAkgASgISASIAQESUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAogASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgFiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAsgASgISAaIAQFCDgoMX3JvdXRpbmdfdXJsQhgKFl9zdWJzY3JpcHRpb25fcHJvdG9jb2xCEwoRX3N1YnNjcmlwdGlvbl91cmxCCQoHX3JlYWRtZUIPCg1fdW5zZXRfbGFiZWxzQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpUCChZVcGRhdGVTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyKVAwobVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLcm91dGluZ191cmwYAiABKAkSFgoObGFiZWxfbWF0Y2hlcnMYAyADKAkSEwoGcmVhZG1lGAQgASgJSACIAQESEQoJbmFtZXNwYWNlGAUgASgJEiEKFHVuc2V0X2xhYmVsX21hdGNoZXJzGAYgASgISAGIAQESIAoTYWRtaXNzaW9uV2ViaG9va1VSTBgHIAEoCUgCiAEBEiMKFmFkbWlzc2lvbldlYmhvb2tTZWNyZXQYCCABKAlIA4gBARItCiBkaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbhgJIAEoCEgEiAEBQgkKB19yZWFkbWVCFwoVX3Vuc2V0X2xhYmVsX21hdGNoZXJzQhYKFF9hZG1pc3Npb25XZWJob29rVVJMQhkKF19hZG1pc3Npb25XZWJob29rU2VjcmV0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiKbAgocVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihwQKFlVwZGF0ZU1vbm9ncmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLcm91dGluZ191cmwYAyABKAkSEQoJZ3JhcGhfdXJsGAQgASgJElAKFXN1YnNjcmlwdGlvbl9wcm90b2NvbBgFIAEoDjIsLndnLmNvc21vLmNvbW1vbi5HcmFwaFFMU3Vic2NyaXB0aW9uUHJvdG9jb2xIAIgBARIdChBzdWJzY3JpcHRpb25fdXJsGAYgASgJSAGIAQESEwoGcmVhZG1lGAcgASgJSAKIAQESUAoVd2Vic29ja2V0X3N1YnByb3RvY29sGAggASgOMiwud2cuY29zbW8uY29tbW9uLkdyYXBoUUxXZWJzb2NrZXRTdWJwcm90b2NvbEgDiAEBEiAKE2FkbWlzc2lvbldlYmhvb2tVUkwYCSABKAlIBIgBARIjChZhZG1pc3Npb25XZWJob29rU2VjcmV0GAogASgJSAWIAQFCGAoWX3N1YnNjcmlwdGlvbl9wcm90b2NvbEITChFfc3Vic2NyaXB0aW9uX3VybEIJCgdfcmVhZG1lQhgKFl93ZWJzb2NrZXRfc3VicHJvdG9jb2xCFgoUX2FkbWlzc2lvbldlYmhvb2tVUkxCGQoXX2FkbWlzc2lvbldlYmhvb2tTZWNyZXQiSwoXVXBkYXRlTW9ub2dyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLHAQoaQ2hlY2tGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSDAoEbmFtZRgBIAEoCRIWCg5sYWJlbF9tYXRjaGVycxgCIAMoCRIRCgluYW1lc3BhY2UYAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBARISCgVsaW1pdBgFIAEoBUgBiAEBQiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbkIICgZfbGltaXQi1QIKG0NoZWNrRmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchIxCglzdWJncmFwaHMYAyADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEjwKBmNvdW50cxgFIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrQ291bnRzSACIAQFCCQoHX2NvdW50cyIrCgpQYWdpbmF0aW9uEg0KBWxpbWl0GAEgASgFEg4KBm9mZnNldBgCIAEoBSIgCgRTb3J0EgoKAmlkGAEgASgJEgwKBGRlc2MYAiABKAgiiQIKD0FuYWx5dGljc0NvbmZpZxIyCglkYXRlUmFuZ2UYASABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USEgoFcmFuZ2UYAiABKAVIAIgBARI2CgdmaWx0ZXJzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzRmlsdGVyEjQKCnBhZ2luYXRpb24YBCABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEi0KBHNvcnQYBSABKAsyGi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Tb3J0SAGIAQFCCAoGX3JhbmdlQgcKBV9zb3J0InQKD0FuYWx5dGljc0ZpbHRlchINCgVmaWVsZBgBIAEoCRINCgV2YWx1ZRgCIAEoCRJDCghvcGVyYXRvchgDIAEoDjIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvciInCglEYXRlUmFuZ2USDQoFc3RhcnQYASABKAkSCwoDZW5kGAIgASgJIrsBChdHZXRBbmFseXRpY3NWaWV3UmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSOgoEbmFtZRgCIAEoDjIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdHcm91cE5hbWUSNQoGY29uZmlnGAMgASgLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzQ29uZmlnEhEKCW5hbWVzcGFjZRgEIAEoCSLYAQoTQW5hbHl0aWNzVmlld1Jlc3VsdBI6Cgdjb2x1bW5zGAEgAygLMikud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld0NvbHVtbhI0CgRyb3dzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1JvdxJACgdmaWx0ZXJzGAMgAygLMi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlchINCgVwYWdlcxgEIAEoBSK+AQoTQW5hbHl0aWNzVmlld0NvbHVtbhIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSLQoEdW5pdBgEIAEoDjIaLndnLmNvc21vLnBsYXRmb3JtLnYxLlVuaXRIAIgBARIWCglpc19oaWRkZW4YBSABKAhIAYgBARITCgZpc19jdGEYBiABKAhIAogBAUIHCgVfdW5pdEIMCgpfaXNfaGlkZGVuQgkKB19pc19jdGEi2wEKGUFuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXISEgoKY29sdW1uTmFtZRgBIAEoCRINCgV0aXRsZRgCIAEoCRJGCgdvcHRpb25zGAMgAygLMjUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlck9wdGlvbhJACg5jdXN0b21fb3B0aW9ucxgEIAEoDjIjLndnLmNvc21vLnBsYXRmb3JtLnYxLkN1c3RvbU9wdGlvbnNIAIgBAUIRCg9fY3VzdG9tX29wdGlvbnMikwEKH0FuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXJPcHRpb24SDQoFbGFiZWwYASABKAkSEgoFdmFsdWUYAiABKAlIAIgBARJDCghvcGVyYXRvchgDIAEoDjIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdGaWx0ZXJPcGVyYXRvckIICgZfdmFsdWUirwEKEEFuYWx5dGljc1ZpZXdSb3cSQAoFdmFsdWUYASADKAsyMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NWaWV3Um93LlZhbHVlRW50cnkaWQoKVmFsdWVFbnRyeRILCgNrZXkYASABKAkSOgoFdmFsdWUYAiABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NWaWV3Um93VmFsdWU6AjgBImUKFUFuYWx5dGljc1ZpZXdSb3dWYWx1ZRIWCgxudW1iZXJfdmFsdWUYASABKAFIABIWCgxzdHJpbmdfdmFsdWUYAiABKAlIABIUCgpib29sX3ZhbHVlGAMgASgISABCBgoEa2luZCKFAQoYR2V0QW5hbHl0aWNzVmlld1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoEdmlldxgCIAEoCzIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdSZXN1bHQihAEKIEdldERhc2hib2FyZEFuYWx5dGljc1ZpZXdSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCglzdGFydERhdGUYAiABKAkSDwoHZW5kRGF0ZRgDIAEoCRINCgVyYW5nZRgEIAEoBRIRCgluYW1lc3BhY2UYBSABKAkiVgoRUmVxdWVzdFNlcmllc0l0ZW0SEQoJdGltZXN0YW1wGAEgASgJEhUKDXRvdGFsUmVxdWVzdHMYAiABKAUSFwoPZXJyb3JlZFJlcXVlc3RzGAMgASgFIlwKFU9wZXJhdGlvblJlcXVlc3RDb3VudBIVCg1vcGVyYXRpb25IYXNoGAEgASgJEhUKDW9wZXJhdGlvbk5hbWUYAiABKAkSFQoNdG90YWxSZXF1ZXN0cxgDIAEoBSJqChVGZWRlcmF0ZWRHcmFwaE1ldHJpY3MSGAoQZmVkZXJhdGVkR3JhcGhJRBgBIAEoCRITCgtyZXF1ZXN0UmF0ZRgCIAEoAhIRCgllcnJvclJhdGUYAyABKAISDwoHbGF0ZW5jeRgEIAEoAiJeCg9TdWJncmFwaE1ldHJpY3MSEgoKc3ViZ3JhcGhJRBgBIAEoCRITCgtyZXF1ZXN0UmF0ZRgCIAEoAhIRCgllcnJvclJhdGUYAyABKAISDwoHbGF0ZW5jeRgEIAEoAiLvAgohR2V0RGFzaGJvYXJkQW5hbHl0aWNzVmlld1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoNcmVxdWVzdFNlcmllcxgCIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlcXVlc3RTZXJpZXNJdGVtEkwKF21vc3RSZXF1ZXN0ZWRPcGVyYXRpb25zGAMgAygLMisud2cuY29zbW8ucGxhdGZvcm0udjEuT3BlcmF0aW9uUmVxdWVzdENvdW50Ej4KD3N1YmdyYXBoTWV0cmljcxgEIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoTWV0cmljcxJKChVmZWRlcmF0ZWRHcmFwaE1ldHJpY3MYBSABKAsyKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaE1ldHJpY3MiWwogQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlcXVlc3QSEQoJZ3JhcGhOYW1lGAEgASgJEhEKCXRva2VuTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiZAohQ3JlYXRlRmVkZXJhdGVkR3JhcGhUb2tlblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDQoFdG9rZW4YAiABKAkiTAoVT3JnYW5pemF0aW9uR3JvdXBSdWxlEgwKBHJvbGUYASABKAkSEgoKbmFtZXNwYWNlcxgCIAMoCRIRCglyZXNvdXJjZXMYAyADKAki2AEKEU9yZ2FuaXphdGlvbkdyb3VwEg8KB2dyb3VwSWQYASABKAkSDAoEbmFtZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIPCgdidWlsdGluGAQgASgIEhQKDG1lbWJlcnNDb3VudBgFIAEoBRI6CgVydWxlcxgGIAMoCzIrLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkdyb3VwUnVsZRIWCg5oYXNPaWRjTWFwcGVycxgHIAEoCBIUCgxhcGlLZXlzQ291bnQYCCABKAUiQwoeQ3JlYXRlT3JnYW5pemF0aW9uR3JvdXBSZXF1ZXN0EgwKBG5hbWUYASABKAkSEwoLZGVzY3JpcHRpb24YAiABKAkiiwEKH0NyZWF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI2CgVncm91cBgCIAEoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkdyb3VwIh4KHEdldE9yZ2FuaXphdGlvbkdyb3Vwc1JlcXVlc3QiigEKHUdldE9yZ2FuaXphdGlvbkdyb3Vwc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoGZ3JvdXBzGAIgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuT3JnYW5pemF0aW9uR3JvdXAiNQoiR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVxdWVzdBIPCgdncm91cElkGAEgASgJIoADCiNHZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlElYKB21lbWJlcnMYAiADKAsyRS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXNwb25zZS5Hcm91cE1lbWJlchJWCgdhcGlLZXlzGAMgAygLMkUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVzcG9uc2UuR3JvdXBBcGlLZXkaOwoLR3JvdXBNZW1iZXISCgoCaWQYASABKAkSDQoFZW1haWwYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJGjoKC0dyb3VwQXBpS2V5EgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJItcBCh5VcGRhdGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QSDwoHZ3JvdXBJZBgBIAEoCRITCgtkZXNjcmlwdGlvbhgCIAEoCRJNCgVydWxlcxgDIAMoCzI+LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdC5Hcm91cFJ1bGUaQAoJR3JvdXBSdWxlEgwKBHJvbGUYASABKAkSEgoKbmFtZXNwYWNlcxgCIAMoCRIRCglyZXNvdXJjZXMYAyADKAkiUwofVXBkYXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlcKHkRlbGV0ZU9yZ2FuaXphdGlvbkdyb3VwUmVxdWVzdBIPCgdncm91cElkGAEgASgJEhYKCXRvR3JvdXBJZBgCIAEoCUgAiAEBQgwKCl90b0dyb3VwSWQiUwofRGVsZXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIsABCglPcmdNZW1iZXISDgoGdXNlcklEGAEgASgJEg0KBWVtYWlsGAIgASgJEhMKC29yZ01lbWJlcklEGAMgASgJEg4KBmFjdGl2ZRgEIAEoCBIQCghqb2luZWRBdBgFIAEoCRI1CgZncm91cHMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PcmdNZW1iZXIuR3JvdXAaJgoFR3JvdXASDwoHZ3JvdXBJZBgBIAEoCRIMCgRuYW1lGAIgASgJIjUKFFBlbmRpbmdPcmdJbnZpdGF0aW9uEg4KBnVzZXJJRBgBIAEoCRINCgVlbWFpbBgCIAEoCSJ8CiRHZXRQZW5kaW5nT3JnYW5pemF0aW9uTWVtYmVyc1JlcXVlc3QSNAoKcGFnaW5hdGlvbhgBIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLlBhZ2luYXRpb24SEwoGc2VhcmNoGAIgASgJSACIAQFCCQoHX3NlYXJjaCK2AQolR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkYKEnBlbmRpbmdJbnZpdGF0aW9ucxgCIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLlBlbmRpbmdPcmdJbnZpdGF0aW9uEhMKC3RvdGFsX2NvdW50GAMgASgFInUKHUdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXF1ZXN0EjQKCnBhZ2luYXRpb24YASABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEhMKBnNlYXJjaBgCIAEoCUgAiAEBQgkKB19zZWFyY2gimQEKHkdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKB21lbWJlcnMYAiADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PcmdNZW1iZXISEwoLdG90YWxfY291bnQYAyABKAUiMgoRSW52aXRlVXNlclJlcXVlc3QSDQoFZW1haWwYASABKAkSDgoGZ3JvdXBzGAIgAygJIkYKEkludml0ZVVzZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjQKEkludml0ZVVzZXJzUmVxdWVzdBIOCgZlbWFpbHMYASADKAkSDgoGZ3JvdXBzGAIgAygJIjoKGkludml0ZVVzZXJzSW52aXRhdGlvbkVycm9yEg0KBWVtYWlsGAEgASgJEg0KBWVycm9yGAIgASgJIpMBChNJbnZpdGVVc2Vyc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSgoQaW52aXRhdGlvbkVycm9ycxgCIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkludml0ZVVzZXJzSW52aXRhdGlvbkVycm9yIuYBCgZBUElLZXkSCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRIRCgljcmVhdGVkQnkYAyABKAkSEQoJY3JlYXRlZEF0GAQgASgJEhIKCmxhc3RVc2VkQXQYBSABKAkSEQoJZXhwaXJlc0F0GAYgASgJEjYKBWdyb3VwGAcgASgLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuQVBJS2V5Lkdyb3VwSACIAQESEAoIZXh0ZXJuYWwYCCABKAgaIQoFR3JvdXASCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCUIICgZfZ3JvdXAiMgoRR2V0QVBJS2V5c1JlcXVlc3QSDQoFbGltaXQYASABKAUSDgoGb2Zmc2V0GAIgASgFIoQBChJHZXRBUElLZXlzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgdhcGlLZXlzGAIgAygLMhwud2cuY29zbW8ucGxhdGZvcm0udjEuQVBJS2V5Eg0KBWNvdW50GAMgASgFIq8BChNDcmVhdGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkSDgoGdXNlcklEGAIgASgJEjAKB2V4cGlyZXMYAyABKA4yHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FeHBpcmVzQXQSDwoHZ3JvdXBJZBgEIAEoCRITCgtwZXJtaXNzaW9ucxgFIAMoCRIVCghleHRlcm5hbBgGIAEoCEgAiAEBQgsKCV9leHRlcm5hbCJYChRDcmVhdGVBUElLZXlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEg4KBmFwaUtleRgCIAEoCSIjChNEZWxldGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkiSAoURGVsZXRlQVBJS2V5UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI0ChNVcGRhdGVBUElLZXlSZXF1ZXN0EgwKBG5hbWUYASABKAkSDwoHZ3JvdXBJZBgCIAEoCSJIChRVcGRhdGVBUElLZXlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjAKH1JlbW92ZU9yZ2FuaXphdGlvbk1lbWJlclJlcXVlc3QSDQoFZW1haWwYASABKAkiVAogUmVtb3ZlT3JnYW5pemF0aW9uTWVtYmVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIoChdSZW1vdmVJbnZpdGF0aW9uUmVxdWVzdBINCgVlbWFpbBgBIAEoCSJMChhSZW1vdmVJbnZpdGF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJSChhNaWdyYXRlRnJvbUFwb2xsb1JlcXVlc3QSDgoGYXBpS2V5GAEgASgJEhMKC3ZhcmlhbnROYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJcChlNaWdyYXRlRnJvbUFwb2xsb1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDQoFdG9rZW4YAiABKAkizAIKBFNwYW4SEQoJdGltZXN0YW1wGAEgASgDEhEKCXNjb3BlTmFtZRgCIAEoCRIPCgd0cmFjZUlEGAMgASgJEg4KBnNwYW5JRBgEIAEoCRIUCgxwYXJlbnRTcGFuSUQYBSABKAkSEAoIc3Bhbk5hbWUYBiABKAkSEAoIc3BhbktpbmQYByABKAkSEAoIZHVyYXRpb24YCCABKAMSEwoLc2VydmljZU5hbWUYCSABKAkSEgoKc3RhdHVzQ29kZRgKIAEoCRIVCg1zdGF0dXNNZXNzYWdlGAsgASgJEj4KCmF0dHJpYnV0ZXMYDCADKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TcGFuLkF0dHJpYnV0ZXNFbnRyeRoxCg9BdHRyaWJ1dGVzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJKCg9HZXRUcmFjZVJlcXVlc3QSCgoCaWQYASABKAkSDwoHc3Bhbl9pZBgCIAEoCRIaChJmZWRlcmF0ZWRfZ3JhcGhfaWQYAyABKAkibwoQR2V0VHJhY2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEikKBXNwYW5zGAIgAygLMhoud2cuY29zbW8ucGxhdGZvcm0udjEuU3BhbiIPCg1XaG9BbUlSZXF1ZXN0Iu0BCg5XaG9BbUlSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhgKEG9yZ2FuaXphdGlvbk5hbWUYAiABKAkSFgoJdXNlckVtYWlsGAMgASgJSACIAQESGAoQb3JnYW5pemF0aW9uU2x1ZxgEIAEoCRIWCg5vcmdhbml6YXRpb25JZBgFIAEoCRI3Cgxsb2dpbl9tZXRob2QYBiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Mb2dpbk1ldGhvZEIMCgpfdXNlckVtYWlsIs0BCgtMb2dpbk1ldGhvZBIzCgR0eXBlGAEgASgOMiUud2cuY29zbW8ucGxhdGZvcm0udjEuTG9naW5NZXRob2RUeXBlEhcKD3Nzb19wcm92aWRlcl9pZBgCIAEoCRIZChFzc29fcHJvdmlkZXJfbmFtZRgDIAEoCRIRCglzc29fYWxpYXMYBCABKAkSQgoPc29jaWFsX3Byb3ZpZGVyGAUgASgOMikud2cuY29zbW8ucGxhdGZvcm0udjEuU29jaWFsTG9naW5Qcm92aWRlciJQCgtSb3V0ZXJUb2tlbhIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxjcmVhdG9yRW1haWwYBSABKAkiRQoaR2VuZXJhdGVSb3V0ZXJUb2tlblJlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJeChtHZW5lcmF0ZVJvdXRlclRva2VuUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRINCgV0b2tlbhgCIAEoCSJBChZHZXRSb3V0ZXJUb2tlbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkifgoXR2V0Um91dGVyVG9rZW5zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIxCgZ0b2tlbnMYAiADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Sb3V0ZXJUb2tlbiJWChhEZWxldGVSb3V0ZXJUb2tlblJlcXVlc3QSEQoJdG9rZW5OYW1lGAEgASgJEhQKDGZlZEdyYXBoTmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiTQoZRGVsZXRlUm91dGVyVG9rZW5SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjIKElBlcnNpc3RlZE9wZXJhdGlvbhIKCgJpZBgBIAEoCRIQCghjb250ZW50cxgCIAEoCSKeAQohUHVibGlzaFBlcnNpc3RlZE9wZXJhdGlvbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRISCgpjbGllbnROYW1lGAIgASgJEjwKCm9wZXJhdGlvbnMYAyADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QZXJzaXN0ZWRPcGVyYXRpb24SEQoJbmFtZXNwYWNlGAQgASgJIoYBChJQdWJsaXNoZWRPcGVyYXRpb24SCgoCaWQYASABKAkSDAoEaGFzaBgCIAEoCRI+CgZzdGF0dXMYAyABKA4yLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoZWRPcGVyYXRpb25TdGF0dXMSFgoOb3BlcmF0aW9uTmFtZXMYBCADKAkilAEKIlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI8CgpvcGVyYXRpb25zGAIgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaGVkT3BlcmF0aW9uInMKH0RlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRISCgpjbGllbnROYW1lGAMgASgJEhMKC29wZXJhdGlvbklkGAQgASgJIoMCCiBEZWxldGVQZXJzaXN0ZWRPcGVyYXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlElMKCW9wZXJhdGlvbhgCIAEoCzJALndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlc3BvbnNlLk9wZXJhdGlvbhpYCglPcGVyYXRpb24SCgoCaWQYASABKAkSEwoLb3BlcmF0aW9uSWQYAiABKAkSEgoKY2xpZW50TmFtZRgDIAEoCRIWCg5vcGVyYXRpb25OYW1lcxgEIAMoCSJ5CiVDaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLb3BlcmF0aW9uSWQYAyABKAkSEgoKY2xpZW50TmFtZRgEIAEoCSKjAgomQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJZCglvcGVyYXRpb24YAiABKAsyRi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja1BlcnNpc3RlZE9wZXJhdGlvblRyYWZmaWNSZXNwb25zZS5PcGVyYXRpb24abAoJT3BlcmF0aW9uEgoKAmlkGAEgASgJEhMKC29wZXJhdGlvbklkGAIgASgJEhIKCmNsaWVudE5hbWUYAyABKAkSFgoOb3BlcmF0aW9uTmFtZXMYBCADKAkSEgoKaGFzVHJhZmZpYxgFIAEoCCJjCh1HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgljbGllbnRfaWQYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJIpcCCh5HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJSCgpvcGVyYXRpb25zGAIgAygLMj4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVyc2lzdGVkT3BlcmF0aW9uc1Jlc3BvbnNlLk9wZXJhdGlvbhpvCglPcGVyYXRpb24SCgoCaWQYASABKAkSEAoIY29udGVudHMYAiABKAkSEgoKY3JlYXRlZF9hdBgDIAEoCRIXCg9sYXN0X3VwZGF0ZWRfYXQYBCABKAkSFwoPb3BlcmF0aW9uX25hbWVzGAUgAygJIiQKBkhlYWRlchILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAkijwEKJkNyZWF0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXF1ZXN0EhAKCGVuZHBvaW50GAEgASgJEgsKA2tleRgCIAEoCRIOCgZldmVudHMYAyADKAkSNgoLZXZlbnRzX21ldGEYBCADKAsyIS53Zy5jb3Ntby5ub3RpZmljYXRpb25zLkV2ZW50TWV0YSJ2CidDcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIZChF3ZWJob29rX2NvbmZpZ19pZBgCIAEoCSImCiRHZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlnc1JlcXVlc3Qi5gEKJUdldE9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJTCgdjb25maWdzGAIgAygLMkIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ3NSZXNwb25zZS5Db25maWcaNgoGQ29uZmlnEgoKAmlkGAEgASgJEhAKCGVuZHBvaW50GAIgASgJEg4KBmV2ZW50cxgDIAMoCSIvCiFHZXRPcmdhbml6YXRpb25XZWJob29rTWV0YVJlcXVlc3QSCgoCaWQYASABKAkijgEKIkdldE9yZ2FuaXphdGlvbldlYmhvb2tNZXRhUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI2CgtldmVudHNfbWV0YRgCIAMoCzIhLndnLmNvc21vLm5vdGlmaWNhdGlvbnMuRXZlbnRNZXRhIrYBCiZVcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVxdWVzdBIKCgJpZBgBIAEoCRIQCghlbmRwb2ludBgCIAEoCRILCgNrZXkYAyABKAkSDgoGZXZlbnRzGAQgAygJEjYKC2V2ZW50c19tZXRhGAUgAygLMiEud2cuY29zbW8ubm90aWZpY2F0aW9ucy5FdmVudE1ldGESGQoRc2hvdWxkX3VwZGF0ZV9rZXkYBiABKAgiWwonVXBkYXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiNAomRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QSCgoCaWQYASABKAkiWwonRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiiwEKGENyZWF0ZUludGVncmF0aW9uUmVxdWVzdBIMCgR0eXBlGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEY29kZRgDIAEoCRIOCgZldmVudHMYBCADKAkSNQoKZXZlbnRzTWV0YRgFIAMoCzIhLndnLmNvc21vLm5vdGlmaWNhdGlvbnMuRXZlbnRNZXRhIk0KGUNyZWF0ZUludGVncmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIkCiJHZXRPcmdhbml6YXRpb25JbnRlZ3JhdGlvbnNSZXF1ZXN0IioKFlNsYWNrSW50ZWdyYXRpb25Db25maWcSEAoIZW5kcG9pbnQYASABKAkiogEKEUludGVncmF0aW9uQ29uZmlnEjMKBHR5cGUYASABKA4yJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnRlZ3JhdGlvblR5cGUSTgoWc2xhY2tJbnRlZ3JhdGlvbkNvbmZpZxgCIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLlNsYWNrSW50ZWdyYXRpb25Db25maWdIAEIICgZjb25maWciwAEKC0ludGVncmF0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEdHlwZRgDIAEoCRIOCgZldmVudHMYBCADKAkSQgoRaW50ZWdyYXRpb25Db25maWcYBSABKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnRlZ3JhdGlvbkNvbmZpZxI1CgpldmVudHNNZXRhGAYgAygLMiEud2cuY29zbW8ubm90aWZpY2F0aW9ucy5FdmVudE1ldGEikAEKI0dldE9yZ2FuaXphdGlvbkludGVncmF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNwoMaW50ZWdyYXRpb25zGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuSW50ZWdyYXRpb24ihgEKHlVwZGF0ZUludGVncmF0aW9uQ29uZmlnUmVxdWVzdBIKCgJpZBgBIAEoCRIQCghlbmRwb2ludBgCIAEoCRIOCgZldmVudHMYAyADKAkSNgoLZXZlbnRzX21ldGEYBCADKAsyIS53Zy5jb3Ntby5ub3RpZmljYXRpb25zLkV2ZW50TWV0YSJTCh9VcGRhdGVJbnRlZ3JhdGlvbkNvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiJgoYRGVsZXRlSW50ZWdyYXRpb25SZXF1ZXN0EgoKAmlkGAEgASgJIk0KGURlbGV0ZUludGVncmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIrChlEZWxldGVPcmdhbml6YXRpb25SZXF1ZXN0Eg4KBnVzZXJJRBgBIAEoCSJOChpEZWxldGVPcmdhbml6YXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIhwKGlJlc3RvcmVPcmdhbml6YXRpb25SZXF1ZXN0Ik8KG1Jlc3RvcmVPcmdhbml6YXRpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIhoKGExlYXZlT3JnYW5pemF0aW9uUmVxdWVzdCJNChlMZWF2ZU9yZ2FuaXphdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiZgogVXBkYXRlT3JnYW5pemF0aW9uRGV0YWlsc1JlcXVlc3QSDgoGdXNlcklEGAEgASgJEhgKEG9yZ2FuaXphdGlvbk5hbWUYAiABKAkSGAoQb3JnYW5pemF0aW9uU2x1ZxgDIAEoCSJVCiFVcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJGChtVcGRhdGVPcmdNZW1iZXJHcm91cFJlcXVlc3QSFwoPb3JnTWVtYmVyVXNlcklEGAEgASgJEg4KBmdyb3VwcxgCIAMoCSJQChxVcGRhdGVPcmdNZW1iZXJHcm91cFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiRQoZQ3JlYXRlT3JnYW5pemF0aW9uUmVxdWVzdBIMCgRuYW1lGAEgASgJEgwKBHNsdWcYAiABKAkSDAoEcGxhbhgDIAEoCSLQAQoaQ3JlYXRlT3JnYW5pemF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9Cgxvcmdhbml6YXRpb24YAiABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25IAIgBARIcCg9zdHJpcGVTZXNzaW9uSWQYAyABKAlIAYgBAUIPCg1fb3JnYW5pemF0aW9uQhIKEF9zdHJpcGVTZXNzaW9uSWQidwoMT3JnYW5pemF0aW9uEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2x1ZxgDIAEoCRIaCg1jcmVhdG9yVXNlcklkGAQgASgJSACIAQESEQoJY3JlYXRlZEF0GAUgASgJQhAKDl9jcmVhdG9yVXNlcklkIiwKHEdldE9yZ2FuaXphdGlvbkJ5U2x1Z1JlcXVlc3QSDAoEc2x1ZxgBIAEoCSKhAQodR2V0T3JnYW5pemF0aW9uQnlTbHVnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9Cgxvcmdhbml6YXRpb24YAiABKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Pcmdhbml6YXRpb25IAIgBAUIPCg1fb3JnYW5pemF0aW9uIhgKFkdldEJpbGxpbmdQbGFuc1JlcXVlc3Qi9wIKF0dldEJpbGxpbmdQbGFuc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSAoFcGxhbnMYAiADKAsyOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZS5CaWxsaW5nUGxhbhpTChJCaWxsaW5nUGxhbkZlYXR1cmUSCgoCaWQYASABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEgoFbGltaXQYBCABKAVIAIgBAUIICgZfbGltaXQaigEKC0JpbGxpbmdQbGFuEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDQoFcHJpY2UYAyABKAUSUgoIZmVhdHVyZXMYBCADKAsyQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZS5CaWxsaW5nUGxhbkZlYXR1cmUiLAocQ3JlYXRlQ2hlY2tvdXRTZXNzaW9uUmVxdWVzdBIMCgRwbGFuGAEgASgJImQKHUNyZWF0ZUNoZWNrb3V0U2Vzc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEQoJc2Vzc2lvbklkGAIgASgJIiMKIUNyZWF0ZUJpbGxpbmdQb3J0YWxTZXNzaW9uUmVxdWVzdCJ2CiJDcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEQoJc2Vzc2lvbklkGAIgASgJEgsKA3VybBgDIAEoCSIiChJVcGdyYWRlUGxhblJlcXVlc3QSDAoEcGxhbhgBIAEoCSJHChNVcGdyYWRlUGxhblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiwgEKFkdldEdyYXBoTWV0cmljc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEg0KBXJhbmdlGAIgASgFEjIKCWRhdGVSYW5nZRgDIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZRI2CgdmaWx0ZXJzGAQgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzRmlsdGVyEhEKCW5hbWVzcGFjZRgFIAEoCSLyAgoXR2V0R3JhcGhNZXRyaWNzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI+CghyZXF1ZXN0cxgCIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSPQoHbGF0ZW5jeRgDIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSPAoGZXJyb3JzGAQgASgLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuTWV0cmljc0Rhc2hib2FyZE1ldHJpYxJACgdmaWx0ZXJzGAUgAygLMi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQW5hbHl0aWNzVmlld1Jlc3VsdEZpbHRlchIXCgpyZXNvbHV0aW9uGAYgASgJSACIAQFCDQoLX3Jlc29sdXRpb24iwQEKFk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSDQoFdmFsdWUYASABKAkSGgoNcHJldmlvdXNWYWx1ZRgCIAEoCUgAiAEBEjEKA3RvcBgDIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NUb3BJdGVtEjcKBnNlcmllcxgEIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NTZXJpZXNJdGVtQhAKDl9wcmV2aW91c1ZhbHVlIlAKDk1ldHJpY3NUb3BJdGVtEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRINCgV2YWx1ZRgDIAEoCRITCgtpc1BlcnNpc3RlZBgEIAEoCCKxAQoRTWV0cmljc1Nlcmllc0l0ZW0SEQoJdGltZXN0YW1wGAEgASgJEg0KBXZhbHVlGAIgASgJEhoKDXByZXZpb3VzVmFsdWUYAyABKAlIAIgBARIQCgNwNTAYBCABKAlIAYgBARIQCgNwOTAYBSABKAlIAogBARIQCgNwOTkYBiABKAlIA4gBAUIQCg5fcHJldmlvdXNWYWx1ZUIGCgRfcDUwQgYKBF9wOTBCBgoEX3A5OSK7AQoQTWV0cmljc0Rhc2hib2FyZBIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEgwKBHR5cGUYAyABKAkSLQoEdW5pdBgEIAEoDjIaLndnLmNvc21vLnBsYXRmb3JtLnYxLlVuaXRIAIgBARIWCglpc19oaWRkZW4YBSABKAhIAYgBARITCgZpc19jdGEYBiABKAhIAogBAUIHCgVfdW5pdEIMCgpfaXNfaGlkZGVuQgkKB19pc19jdGEixgEKGkdldE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRINCgVyYW5nZRgCIAEoBRIyCglkYXRlUmFuZ2UYAyABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USNgoHZmlsdGVycxgEIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc0ZpbHRlchIRCgluYW1lc3BhY2UYBSABKAkiuQEKG0dldE1ldHJpY3NFcnJvclJhdGVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkAKBnNlcmllcxgCIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NFcnJvclJhdGVTZXJpZXNJdGVtEhcKCnJlc29sdXRpb24YAyABKAlIAIgBAUINCgtfcmVzb2x1dGlvbiJXChpNZXRyaWNzRXJyb3JSYXRlU2VyaWVzSXRlbRIRCgl0aW1lc3RhbXAYASABKAkSEwoLcmVxdWVzdFJhdGUYAiABKAISEQoJZXJyb3JSYXRlGAMgASgCIr8BChlHZXRTdWJncmFwaE1ldHJpY3NSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFcmFuZ2UYBCABKAUSMgoJZGF0ZVJhbmdlGAUgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEjYKB2ZpbHRlcnMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NGaWx0ZXIi9QIKGkdldFN1YmdyYXBoTWV0cmljc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USPgoIcmVxdWVzdHMYAiABKAsyLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NZXRyaWNzRGFzaGJvYXJkTWV0cmljEj0KB2xhdGVuY3kYAyABKAsyLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NZXRyaWNzRGFzaGJvYXJkTWV0cmljEjwKBmVycm9ycxgEIAEoCzIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk1ldHJpY3NEYXNoYm9hcmRNZXRyaWMSQAoHZmlsdGVycxgFIAMoCzIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkFuYWx5dGljc1ZpZXdSZXN1bHRGaWx0ZXISFwoKcmVzb2x1dGlvbhgGIAEoCUgAiAEBQg0KC19yZXNvbHV0aW9uIsgBCiJHZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0EhQKDHN1YmdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFcmFuZ2UYBCABKAUSMgoJZGF0ZVJhbmdlGAUgASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlEjYKB2ZpbHRlcnMYBiADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BbmFseXRpY3NGaWx0ZXIiwQEKI0dldFN1YmdyYXBoTWV0cmljc0Vycm9yUmF0ZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQAoGc2VyaWVzGAIgAygLMjAud2cuY29zbW8ucGxhdGZvcm0udjEuTWV0cmljc0Vycm9yUmF0ZVNlcmllc0l0ZW0SFwoKcmVzb2x1dGlvbhgDIAEoCUgAiAEBQg0KC19yZXNvbHV0aW9uIlMKGEZvcmNlQ2hlY2tTdWNjZXNzUmVxdWVzdBIQCghjaGVja19pZBgBIAEoCRISCgpncmFwaF9uYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJNChlGb3JjZUNoZWNrU3VjY2Vzc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UimAEKLFRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXF1ZXN0EhAKCGNoZWNrX2lkGAEgASgJEg8KB2lzX3NhZmUYAiABKAgSEgoKZ3JhcGhfbmFtZRgDIAEoCRIRCgluYW1lc3BhY2UYBCABKAkSEwoGc2VhcmNoGAUgASgJSACIAQFCCQoHX3NlYXJjaCJhCi1Ub2dnbGVDaGFuZ2VPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKHAQosQ3JlYXRlSWdub3JlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9uc1JlcXVlc3QSEAoIY2hlY2tfaWQYASABKAkSEgoKZ3JhcGhfbmFtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkSEwoGc2VhcmNoGAQgASgJSACIAQFCCQoHX3NlYXJjaCJhCi1DcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJACg5PdmVycmlkZUNoYW5nZRISCgpjaGFuZ2VUeXBlGAEgASgJEhEKBHBhdGgYAiABKAlIAIgBAUIHCgVfcGF0aCKvAQofQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5vcGVyYXRpb25faGFzaBgDIAEoCRIWCg5vcGVyYXRpb25fbmFtZRgEIAEoCRI1CgdjaGFuZ2VzGAUgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuT3ZlcnJpZGVDaGFuZ2UiVAogQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKAAQonQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXF1ZXN0EhIKCmdyYXBoX25hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhYKDm9wZXJhdGlvbl9oYXNoGAMgASgJEhYKDm9wZXJhdGlvbl9uYW1lGAQgASgJIlwKKENyZWF0ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSKXAQofUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5vcGVyYXRpb25faGFzaBgDIAEoCRI1CgdjaGFuZ2VzGAQgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuT3ZlcnJpZGVDaGFuZ2UiVAogUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJoCidSZW1vdmVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZVJlcXVlc3QSEgoKZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFgoOb3BlcmF0aW9uX2hhc2gYAyABKAkiXAooUmVtb3ZlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIl0KHEdldE9wZXJhdGlvbk92ZXJyaWRlc1JlcXVlc3QSEgoKZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSFgoOb3BlcmF0aW9uX2hhc2gYAyABKAkinAEKHUdldE9wZXJhdGlvbk92ZXJyaWRlc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USNQoHY2hhbmdlcxgCIAMoCzIkLndnLmNvc21vLnBsYXRmb3JtLnYxLk92ZXJyaWRlQ2hhbmdlEhIKCmlnbm9yZV9hbGwYAyABKAgiXgoWR2V0QWxsT3ZlcnJpZGVzUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRINCgVsaW1pdBgDIAEoBRIOCgZvZmZzZXQYBCABKAUiowIKF0dldEFsbE92ZXJyaWRlc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USSQoJb3ZlcnJpZGVzGAIgAygLMjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QWxsT3ZlcnJpZGVzUmVzcG9uc2UuT3ZlcnJpZGUSEwoLdG90YWxfY291bnQYAyABKAUadgoIT3ZlcnJpZGUSDAoEaGFzaBgBIAEoCRIMCgRuYW1lGAIgASgJEhwKFGNoYW5nZXNPdmVycmlkZUNvdW50GAMgASgNEhwKFGhhc0lnbm9yZUFsbE92ZXJyaWRlGAQgASgIEhIKCnVwZGF0ZWRfYXQYBSABKAkiTgobSXNHaXRIdWJBcHBJbnN0YWxsZWRSZXF1ZXN0Ei8KCGdpdF9pbmZvGAEgASgLMh0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2l0SW5mbyJmChxJc0dpdEh1YkFwcEluc3RhbGxlZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USFAoMaXNfaW5zdGFsbGVkGAIgASgIIjAKC0dyb3VwTWFwcGVyEg8KB2dyb3VwSWQYASABKAkSEAoIc3NvR3JvdXAYAiABKAkioAEKGUNyZWF0ZU9JRENQcm92aWRlclJlcXVlc3QSDAoEbmFtZRgBIAEoCRIZChFkaXNjb3ZlcnlFbmRwb2ludBgCIAEoCRIQCghjbGllbnRJRBgDIAEoCRIUCgxjbGllbnRTZWNyZXQYBCABKAkSMgoHbWFwcGVycxgFIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyb3VwTWFwcGVyIocBChpDcmVhdGVPSURDUHJvdmlkZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhEKCXNpZ25JblVSTBgCIAEoCRISCgpzaWduT3V0VVJMGAMgASgJEhAKCGxvZ2luVVJMGAQgASgJIqwBCgxPSURDUHJvdmlkZXISCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCRINCgVhbGlhcxgDIAEoCRIQCghlbmRwb2ludBgEIAEoCRIRCglsb2dpbl91cmwYBSABKAkSHAoUc2lnbl9pbl9yZWRpcmVjdF91cmwYBiABKAkSHQoVc2lnbl9vdXRfcmVkaXJlY3RfdXJsGAcgASgJEhEKCWNyZWF0ZWRBdBgIIAEoCSIaChhMaXN0T0lEQ1Byb3ZpZGVyc1JlcXVlc3QihAEKGUxpc3RPSURDUHJvdmlkZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI1Cglwcm92aWRlcnMYAiADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5PSURDUHJvdmlkZXIiJAoWR2V0T0lEQ1Byb3ZpZGVyUmVxdWVzdBIKCgJpZBgBIAEoCSLoAQoXR2V0T0lEQ1Byb3ZpZGVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIMCgRuYW1lGAIgASgJEhAKCGVuZHBvaW50GAMgASgJEhAKCGxvZ2luVVJMGAQgASgJEhkKEXNpZ25JblJlZGlyZWN0VVJMGAUgASgJEhoKEnNpZ25PdXRSZWRpcmVjdFVSTBgGIAEoCRIyCgdtYXBwZXJzGAcgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuR3JvdXBNYXBwZXIiJwoZRGVsZXRlT0lEQ1Byb3ZpZGVyUmVxdWVzdBIKCgJpZBgBIAEoCSJOChpEZWxldGVPSURDUHJvdmlkZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIlkKF1VwZGF0ZUlEUE1hcHBlcnNSZXF1ZXN0EjIKB21hcHBlcnMYASADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Hcm91cE1hcHBlchIKCgJpZBgCIAEoCSJMChhVcGRhdGVJRFBNYXBwZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIlCiNHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVxdWVzdCJnCiRHZXRPcmdhbml6YXRpb25SZXF1ZXN0c0NvdW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRINCgVjb3VudBgCIAEoAyKjAQoST3JnYW5pemF0aW9uSW52aXRlEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSDAoEc2x1ZxgDIAEoCRIaCg1jcmVhdG9yVXNlcklkGAQgASgJSACIAQESEQoJY3JlYXRlZEF0GAUgASgJEhYKCWludml0ZWRCeRgGIAEoCUgBiAEBQhAKDl9jcmVhdG9yVXNlcklkQgwKCl9pbnZpdGVkQnkiWAoTR2V0QXVkaXRMb2dzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJc3RhcnREYXRlGAMgASgJEg8KB2VuZERhdGUYBCABKAkimwIKCEF1ZGl0TG9nEgoKAmlkGAEgASgJEhgKEGFjdG9yRGlzcGxheU5hbWUYAiABKAkSDgoGYWN0aW9uGAMgASgJEhEKCWFjdG9yVHlwZRgEIAEoCRITCgthdWRpdEFjdGlvbhgFIAEoCRIcChRhdWRpdGFibGVEaXNwbGF5TmFtZRgGIAEoCRIZChF0YXJnZXREaXNwbGF5TmFtZRgHIAEoCRISCgp0YXJnZXRUeXBlGAggASgJEhEKCWNyZWF0ZWRBdBgJIAEoCRIZChF0YXJnZXROYW1lc3BhY2VJZBgKIAEoCRIiChp0YXJnZXROYW1lc3BhY2VEaXNwbGF5TmFtZRgLIAEoCRISCgphcGlLZXlOYW1lGAwgASgJIoUBChRHZXRBdWRpdExvZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEiwKBGxvZ3MYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BdWRpdExvZxINCgVjb3VudBgDIAEoBSIXChVHZXRJbnZpdGF0aW9uc1JlcXVlc3QiiQEKFkdldEludml0YXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI9CgtpbnZpdGF0aW9ucxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLk9yZ2FuaXphdGlvbkludml0ZSJKCiBBY2NlcHRPckRlY2xpbmVJbnZpdGF0aW9uUmVxdWVzdBIWCg5vcmdhbml6YXRpb25JZBgBIAEoCRIOCgZhY2NlcHQYAiABKAgiVQohQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiswUKEEdyYXBoQ29tcG9zaXRpb24SCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxpc0NvbXBvc2FibGUYBCABKAgSHgoRY29tcG9zaXRpb25FcnJvcnMYBSABKAlIAIgBARIWCgljcmVhdGVkQnkYBiABKAlIAYgBARIVCg1pc0xhdGVzdFZhbGlkGAcgASgIEiIKFXJvdXRlckNvbmZpZ1NpZ25hdHVyZRgIIAEoCUgCiAEBEhsKDmFkbWlzc2lvbkVycm9yGAkgASgJSAOIAQESHAoPZGVwbG95bWVudEVycm9yGAogASgJSASIAQESKAobaGFzTXVsdGlwbGVDaGFuZ2VkU3ViZ3JhcGhzGAsgASgISAWIAQESJAoXdHJpZ2dlcmVkQnlTdWJncmFwaE5hbWUYDCABKAlIBogBARIgChNjb21wb3NpdGlvbldhcm5pbmdzGA0gASgJSAeIAQESJAoccm91dGVyX2NvbXBhdGliaWxpdHlfdmVyc2lvbhgOIAEoCRIgChhpc0ZlYXR1cmVGbGFnQ29tcG9zaXRpb24YDyABKAgSHAoPZmVhdHVyZUZsYWdOYW1lGBAgASgJSAiIAQFCFAoSX2NvbXBvc2l0aW9uRXJyb3JzQgwKCl9jcmVhdGVkQnlCGAoWX3JvdXRlckNvbmZpZ1NpZ25hdHVyZUIRCg9fYWRtaXNzaW9uRXJyb3JCEgoQX2RlcGxveW1lbnRFcnJvckIeChxfaGFzTXVsdGlwbGVDaGFuZ2VkU3ViZ3JhcGhzQhoKGF90cmlnZ2VyZWRCeVN1YmdyYXBoTmFtZUIWChRfY29tcG9zaXRpb25XYXJuaW5nc0ISChBfZmVhdHVyZUZsYWdOYW1lIskBChhHcmFwaENvbXBvc2l0aW9uU3ViZ3JhcGgSCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEgwKBG5hbWUYAyABKAkSEQoJdGFyZ2V0X2lkGAQgASgJEhkKEWlzRmVhdHVyZVN1YmdyYXBoGAUgASgIEhIKCmNoYW5nZVR5cGUYBiABKAkSOAoMc3ViZ3JhcGhUeXBlGAcgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhUeXBlIqwBChZHZXRDb21wb3NpdGlvbnNSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRINCgVsaW1pdBgCIAEoBRIOCgZvZmZzZXQYAyABKAUSEQoJc3RhcnREYXRlGAQgASgJEg8KB2VuZERhdGUYBSABKAkSEQoJbmFtZXNwYWNlGAYgASgJEiYKHmV4Y2x1ZGVGZWF0dXJlRmxhZ0NvbXBvc2l0aW9ucxgHIAEoCCKYAQoXR2V0Q29tcG9zaXRpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI8Cgxjb21wb3NpdGlvbnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaENvbXBvc2l0aW9uEg0KBWNvdW50GAMgASgFIkgKHEdldENvbXBvc2l0aW9uRGV0YWlsc1JlcXVlc3QSFQoNY29tcG9zaXRpb25JZBgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkitQMKFkZlYXR1cmVGbGFnQ29tcG9zaXRpb24SCgoCaWQYASABKAkSFwoPc2NoZW1hVmVyc2lvbklkGAIgASgJEhEKCWNyZWF0ZWRBdBgDIAEoCRIUCgxpc0NvbXBvc2FibGUYBCABKAgSHgoRY29tcG9zaXRpb25FcnJvcnMYBSABKAlIAIgBARIWCgljcmVhdGVkQnkYBiABKAlIAYgBARIiChVyb3V0ZXJDb25maWdTaWduYXR1cmUYByABKAlIAogBARIbCg5hZG1pc3Npb25FcnJvchgIIAEoCUgDiAEBEhwKD2RlcGxveW1lbnRFcnJvchgJIAEoCUgEiAEBEhcKD2ZlYXR1cmVGbGFnTmFtZRgKIAEoCRIgChNjb21wb3NpdGlvbldhcm5pbmdzGAsgASgJSAWIAQFCFAoSX2NvbXBvc2l0aW9uRXJyb3JzQgwKCl9jcmVhdGVkQnlCGAoWX3JvdXRlckNvbmZpZ1NpZ25hdHVyZUIRCg9fYWRtaXNzaW9uRXJyb3JCEgoQX2RlcGxveW1lbnRFcnJvckIWChRfY29tcG9zaXRpb25XYXJuaW5ncyLlAgodR2V0Q29tcG9zaXRpb25EZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI7Cgtjb21wb3NpdGlvbhgCIAEoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoQ29tcG9zaXRpb24STAoUY29tcG9zaXRpb25TdWJncmFwaHMYAyADKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaENvbXBvc2l0aW9uU3ViZ3JhcGgSOAoMY2hhbmdlQ291bnRzGAQgASgLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hhbmdlQ291bnRzEk0KF2ZlYXR1cmVGbGFnQ29tcG9zaXRpb25zGAUgAygLMiwud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZUZsYWdDb21wb3NpdGlvbiJKChxHZXRTZGxCeVNjaGVtYVZlcnNpb25SZXF1ZXN0EhcKD3NjaGVtYVZlcnNpb25JZBgBIAEoCRIRCgl0YXJnZXRfaWQYAiABKAkidQodR2V0U2RsQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRILCgNzZGwYAiABKAkSFQoNY2xpZW50X3NjaGVtYRgDIAEoCSI9CiJHZXRDaGFuZ2Vsb2dCeVNjaGVtYVZlcnNpb25SZXF1ZXN0EhcKD3NjaGVtYVZlcnNpb25JZBgBIAEoCSKfAQojR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJGCgljaGFuZ2Vsb2cYAiABKAsyMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ091dHB1dCIjCiFHZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1JlcXVlc3QiqwQKIkdldFVzZXJBY2Nlc3NpYmxlUmVzb3VyY2VzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJWCgpuYW1lc3BhY2VzGAIgAygLMkIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZS5OYW1lc3BhY2USYAoPZmVkZXJhdGVkR3JhcGhzGAMgAygLMkcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZS5GZWRlcmF0ZWRHcmFwaBJUCglzdWJncmFwaHMYBCADKAsyQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRVc2VyQWNjZXNzaWJsZVJlc291cmNlc1Jlc3BvbnNlLlN1YkdyYXBoGiUKCU5hbWVzcGFjZRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJGkMKDkZlZGVyYXRlZEdyYXBoEhAKCHRhcmdldElkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJGlcKCFN1YkdyYXBoEhAKCHRhcmdldElkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEhgKEGZlZGVyYXRlZEdyYXBoSWQYBCABKAkiYAocVXBkYXRlRmVhdHVyZVNldHRpbmdzUmVxdWVzdBIOCgZlbmFibGUYASABKAgSMAoJZmVhdHVyZUlkGAIgASgOMh0ud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZSJRCh1VcGRhdGVGZWF0dXJlU2V0dGluZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIkQKGUdldFN1YmdyYXBoTWVtYmVyc1JlcXVlc3QSFAoMc3ViZ3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJJCg5TdWJncmFwaE1lbWJlchIOCgZ1c2VySWQYASABKAkSDQoFZW1haWwYAiABKAkSGAoQc3ViZ3JhcGhNZW1iZXJJZBgEIAEoCSKFAQoaR2V0U3ViZ3JhcGhNZW1iZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI1CgdtZW1iZXJzGAIgAygLMiQud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGhNZW1iZXIiSQoQQWRkUmVhZG1lUmVxdWVzdBISCgp0YXJnZXROYW1lGAEgASgJEg4KBnJlYWRtZRgCIAEoCRIRCgluYW1lc3BhY2UYAyABKAkiRQoRQWRkUmVhZG1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSLjAgoGUm91dGVyEhAKCGhvc3RuYW1lGAEgASgJEhMKC2NsdXN0ZXJOYW1lGAIgASgJEhMKC3NlcnZpY2VOYW1lGAMgASgJEhYKDnNlcnZpY2VWZXJzaW9uGAQgASgJEhkKEXNlcnZpY2VJbnN0YW5jZUlkGAUgASgJEhUKDXVwdGltZVNlY29uZHMYBiABKAkSGwoTc2VydmVyVXB0aW1lU2Vjb25kcxgHIAEoCRIVCg1jb21wb3NpdGlvbklkGAggASgJEhsKE29uTGF0ZXN0Q29tcG9zaXRpb24YCSABKAgSEQoJcHJvY2Vzc0lkGAogASgJEhUKDW1lbW9yeVVzYWdlTWIYCyABKAISIAoYbWVtb3J5VXNhZ2VDaGFuZ2VQZXJjZW50GAwgASgCEhcKD2NwdVVzYWdlUGVyY2VudBgNIAEoAhIdChVjcHVVc2FnZUNoYW5nZVBlcmNlbnQYDiABKAIiPAoRR2V0Um91dGVyc1JlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSJ1ChJHZXRSb3V0ZXJzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgdyb3V0ZXJzGAIgAygLMhwud2cuY29zbW8ucGxhdGZvcm0udjEuUm91dGVyIuYBCgpDbGllbnRJbmZvEgwKBG5hbWUYASABKAkSCgoCaWQYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJEhUKDWxhc3RVcGRhdGVkQXQYBCABKAkSEQoJY3JlYXRlZEJ5GAUgASgJEhUKDWxhc3RVcGRhdGVkQnkYBiABKAkSJQoYcGVyc2lzdGVkT3BlcmF0aW9uc0NvdW50GAcgASgFSACIAQESFwoKaGFzVHJhZmZpYxgIIAEoCEgBiAEBQhsKGV9wZXJzaXN0ZWRPcGVyYXRpb25zQ291bnRCDQoLX2hhc1RyYWZmaWMiVAoRR2V0Q2xpZW50c1JlcXVlc3QSFAoMZmVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIWCg5pbmNsdWRlVHJhZmZpYxgDIAEoCCJ5ChJHZXRDbGllbnRzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIxCgdjbGllbnRzGAIgAygLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuQ2xpZW50SW5mbyJZChpQcmV2aWV3RGVsZXRlQ2xpZW50UmVxdWVzdBIUCgxmZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhIKCmNsaWVudE5hbWUYAyABKAki0QEKG1ByZXZpZXdEZWxldGVDbGllbnRSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKBmNsaWVudBgCIAEoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLkNsaWVudEluZm8SIAoYcGVyc2lzdGVkT3BlcmF0aW9uc0NvdW50GAMgASgFEhIKCmhhc1RyYWZmaWMYBCABKAgSGAoQb3JnYW5pemF0aW9uU2x1ZxgFIAEoCSJSChNEZWxldGVDbGllbnRSZXF1ZXN0EhQKDGZlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEgoKY2xpZW50TmFtZRgDIAEoCSLgAQoURGVsZXRlQ2xpZW50UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIwCgZjbGllbnQYAiABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DbGllbnRJbmZvEh4KFmRlbGV0ZWRPcGVyYXRpb25zQ291bnQYAyABKAUaRAoJT3BlcmF0aW9uEgoKAmlkGAEgASgJEhMKC29wZXJhdGlvbklkGAIgASgJEhYKDm9wZXJhdGlvbk5hbWVzGAMgAygJItQCChRHZXRGaWVsZFVzYWdlUmVxdWVzdBISCgpncmFwaF9uYW1lGAEgASgJEhYKCW5hbWVkVHlwZRgCIAEoCUgAiAEBEhUKCHR5cGVuYW1lGAMgASgJSAGIAQESEgoFZmllbGQYBCABKAlIAogBARISCgVyYW5nZRgFIAEoBUgDiAEBEjIKCWRhdGVSYW5nZRgGIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZRIRCgluYW1lc3BhY2UYByABKAkSHgoRZmVhdHVyZV9mbGFnX25hbWUYCCABKAlIBIgBARITCgtpc19hcmd1bWVudBgJIAEoCBIQCghpc19pbnB1dBgKIAEoCEIMCgpfbmFtZWRUeXBlQgsKCV90eXBlbmFtZUIICgZfZmllbGRCCAoGX3JhbmdlQhQKEl9mZWF0dXJlX2ZsYWdfbmFtZSK3AQoUQ2xpZW50V2l0aE9wZXJhdGlvbnMSDAoEbmFtZRgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJEkgKCm9wZXJhdGlvbnMYAyADKAsyNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DbGllbnRXaXRoT3BlcmF0aW9ucy5PcGVyYXRpb24aNgoJT3BlcmF0aW9uEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRINCgVjb3VudBgDIAEoBSJfCg5GaWVsZFVzYWdlTWV0YRIUCgxzdWJncmFwaF9pZHMYASADKAkSGgoSZmlyc3RTZWVuVGltZXN0YW1wGAIgASgJEhsKE2xhdGVzdFNlZW5UaW1lc3RhbXAYAyABKAki+wEKFUdldEZpZWxkVXNhZ2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEj8KDnJlcXVlc3Rfc2VyaWVzGAIgAygLMicud2cuY29zbW8ucGxhdGZvcm0udjEuUmVxdWVzdFNlcmllc0l0ZW0SOwoHY2xpZW50cxgDIAMoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkNsaWVudFdpdGhPcGVyYXRpb25zEjIKBG1ldGEYBCABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaWVsZFVzYWdlTWV0YSImChZDcmVhdGVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXQ3JlYXRlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSImChZEZWxldGVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkiSwoXRGVsZXRlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI4ChZSZW5hbWVOYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkSEAoIbmV3X25hbWUYAiABKAkiSwoXUmVuYW1lTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIlCglOYW1lc3BhY2USCgoCaWQYASABKAkSDAoEbmFtZRgCIAEoCSIWChRHZXROYW1lc3BhY2VzUmVxdWVzdCJ+ChVHZXROYW1lc3BhY2VzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIzCgpuYW1lc3BhY2VzGAIgAygLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuTmFtZXNwYWNlIp4BChBNb3ZlR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhUKDW5ld19uYW1lc3BhY2UYAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ikAIKEU1vdmVHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyIyCh1HZXROYW1lc3BhY2VMaW50Q29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkinAEKHkdldE5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhUKDWxpbnRlckVuYWJsZWQYAiABKAgSMQoHY29uZmlncxgDIAMoCzIgLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRDb25maWciOwomR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIpIBCidHZXROYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIXCg90aW1lZnJhbWVJbkRheXMYAiABKAUSHAoUdGltZWZyYW1lTGltaXRJbkRheXMYAyABKAUiVwopVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEhcKD3RpbWVmcmFtZUluRGF5cxgCIAEoBSJeCipVcGRhdGVOYW1lc3BhY2VDaGVja3NDb25maWd1cmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJPCiNFbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSFQoNZW5hYmxlTGludGluZxgCIAEoCCJYCiRFbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJZCgpMaW50Q29uZmlnEhAKCHJ1bGVOYW1lGAEgASgJEjkKDXNldmVyaXR5TGV2ZWwYAiABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkiawojQ29uZmlndXJlTmFtZXNwYWNlTGludENvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEjEKB2NvbmZpZ3MYAiADKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50Q29uZmlnIlgKJENvbmZpZ3VyZU5hbWVzcGFjZUxpbnRDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIkoKGUVuYWJsZUdyYXBoUHJ1bmluZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJEhoKEmVuYWJsZUdyYXBoUHJ1bmluZxgCIAEoCCJOChpFbmFibGVHcmFwaFBydW5pbmdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIsgBChJHcmFwaFBydW5pbmdDb25maWcSEAoIcnVsZU5hbWUYASABKAkSOQoNc2V2ZXJpdHlMZXZlbBgCIAEoDjIiLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRTZXZlcml0eRIZChFncmFjZVBlcmlvZEluRGF5cxgDIAEoBRIpChxzY2hlbWFVc2FnZUNoZWNrUGVyaW9kSW5EYXlzGAQgASgFSACIAQFCHwodX3NjaGVtYVVzYWdlQ2hlY2tQZXJpb2RJbkRheXMieworQ29uZmlndXJlTmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSOQoHY29uZmlncxgCIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0NvbmZpZyJgCixDb25maWd1cmVOYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIjoKJUdldE5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIrEBCiZHZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhoKEmdyYXBoUHJ1bmVyRW5hYmxlZBgCIAEoCBI5Cgdjb25maWdzGAMgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuR3JhcGhQcnVuaW5nQ29uZmlnIjoKF01pZ3JhdGVNb25vZ3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIkwKGE1pZ3JhdGVNb25vZ3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIiUKI0dldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXF1ZXN0IjAKClBlcm1pc3Npb24SEwoLZGlzcGxheU5hbWUYASABKAkSDQoFdmFsdWUYAiABKAkijwEKJEdldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjUKC3Blcm1pc3Npb25zGAIgAygLMiAud2cuY29zbW8ucGxhdGZvcm0udjEuUGVybWlzc2lvbiLrAgoVQ3JlYXRlQ29udHJhY3RSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhkKEXNvdXJjZV9ncmFwaF9uYW1lGAMgASgJEhMKC3JvdXRpbmdfdXJsGAQgASgJEh0KFWFkbWlzc2lvbl93ZWJob29rX3VybBgFIAEoCRIUCgxleGNsdWRlX3RhZ3MYBiADKAkSEwoGcmVhZG1lGAcgASgJSACIAQESJQoYYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0GAggASgJSAGIAQESFAoMaW5jbHVkZV90YWdzGAkgAygJEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAogASgISAKIAQFCCQoHX3JlYWRtZUIbChlfYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiKVAgoWQ3JlYXRlQ29udHJhY3RSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihAMKFVVwZGF0ZUNvbnRyYWN0UmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIUCgxleGNsdWRlX3RhZ3MYAyADKAkSFAoMaW5jbHVkZV90YWdzGAQgAygJEhgKC3JvdXRpbmdfdXJsGAUgASgJSACIAQESIgoVYWRtaXNzaW9uX3dlYmhvb2tfdXJsGAYgASgJSAGIAQESJQoYYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0GAcgASgJSAKIAQESEwoGcmVhZG1lGAggASgJSAOIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YCSABKAhIBIgBAUIOCgxfcm91dGluZ191cmxCGAoWX2FkbWlzc2lvbl93ZWJob29rX3VybEIbChlfYWRtaXNzaW9uX3dlYmhvb2tfc2VjcmV0QgkKB19yZWFkbWVCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpUCChZVcGRhdGVDb250cmFjdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyIdChtJc01lbWJlckxpbWl0UmVhY2hlZFJlcXVlc3QifQocSXNNZW1iZXJMaW1pdFJlYWNoZWRSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhUKDWxpbWl0X3JlYWNoZWQYAiABKAgSFAoMbWVtYmVyX2NvdW50GAMgASgFIhMKEURlbGV0ZVVzZXJSZXF1ZXN0IkYKEkRlbGV0ZVVzZXJSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIvABChhDcmVhdGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSHgoWZmVhdHVyZV9zdWJncmFwaF9uYW1lcxgEIAMoCRISCgppc19lbmFibGVkGAUgASgIEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAYgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIpoCChlDcmVhdGVGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQgoSY29tcG9zaXRpb25fZXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJAChFkZXBsb3ltZW50X2Vycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAQgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nIvIBChhVcGRhdGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSKwoGbGFiZWxzGAMgAygLMhsud2cuY29zbW8ucGxhdGZvcm0udjEuTGFiZWwSHgoWZmVhdHVyZV9zdWJncmFwaF9uYW1lcxgEIAMoCRIUCgx1bnNldF9sYWJlbHMYBSABKAgSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBiABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24ixAIKGVVwZGF0ZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJCChJjb21wb3NpdGlvbl9lcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkAKEWRlcGxveW1lbnRfZXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSGAoLaGFzX2NoYW5nZWQYBSABKAhIAIgBAUIOCgxfaGFzX2NoYW5nZWQioAEKGEVuYWJsZUZlYXR1cmVGbGFnUmVxdWVzdBIMCgRuYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIPCgdlbmFibGVkGAMgASgIEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAQgASgISACIAQFCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIsQCChlFbmFibGVGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQgoSY29tcG9zaXRpb25fZXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJAChFkZXBsb3ltZW50X2Vycm9ycxgDIAMoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlcGxveW1lbnRFcnJvchIYCgtoYXNfY2hhbmdlZBgEIAEoCEgAiAEBEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBSADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmdCDgoMX2hhc19jaGFuZ2VkIo8BChhEZWxldGVGZWF0dXJlRmxhZ1JlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YAyABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24imgIKGURlbGV0ZUZlYXR1cmVGbGFnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJCChJjb21wb3NpdGlvbl9lcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkAKEWRlcGxveW1lbnRfZXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcihQIKC0ZlYXR1cmVGbGFnEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJbmFtZXNwYWNlGAMgASgJEisKBmxhYmVscxgEIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsEhIKCmlzX2VuYWJsZWQYBSABKAgSEgoKY3JlYXRlZF9ieRgGIAEoCRISCgpjcmVhdGVkX2F0GAcgASgJEhIKCnVwZGF0ZWRfYXQYCCABKAkSKgodaGFzX2ZhaWxlZF9sYXRlc3RfY29tcG9zaXRpb24YCSABKAhIAIgBAUIgCh5faGFzX2ZhaWxlZF9sYXRlc3RfY29tcG9zaXRpb24iaAoWR2V0RmVhdHVyZUZsYWdzUmVxdWVzdBINCgVsaW1pdBgBIAEoBRIOCgZvZmZzZXQYAiABKAUSEQoJbmFtZXNwYWNlGAMgASgJEhIKBXF1ZXJ5GAQgASgJSACIAQFCCAoGX3F1ZXJ5IpoBChdHZXRGZWF0dXJlRmxhZ3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjgKDWZlYXR1cmVfZmxhZ3MYAiADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxITCgt0b3RhbF9jb3VudBgDIAEoBSI+ChtHZXRGZWF0dXJlRmxhZ0J5TmFtZVJlcXVlc3QSDAoEbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkijAMKHEdldEZlYXR1cmVGbGFnQnlOYW1lUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI3CgxmZWF0dXJlX2ZsYWcYAiABKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxJdChBmZWRlcmF0ZWRfZ3JhcGhzGAMgAygLMkMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdCeU5hbWVSZXNwb25zZS5GZkZlZGVyYXRlZEdyYXBoEjkKEWZlYXR1cmVfc3ViZ3JhcGhzGAQgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgaZwoQRmZGZWRlcmF0ZWRHcmFwaBI9Cg9mZWRlcmF0ZWRfZ3JhcGgYASABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaBIUCgxpc19jb25uZWN0ZWQYAiABKAgiVwonR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWdSZXF1ZXN0EhkKEWZlYXR1cmVfZmxhZ19uYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCSKXAQooR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjkKEWZlYXR1cmVfc3ViZ3JhcGhzGAIgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgibAoaR2V0RmVhdHVyZVN1YmdyYXBoc1JlcXVlc3QSDQoFbGltaXQYASABKAUSDgoGb2Zmc2V0GAIgASgFEhEKCW5hbWVzcGFjZRgDIAEoCRISCgVxdWVyeRgEIAEoCUgAiAEBQggKBl9xdWVyeSKZAQobR2V0RmVhdHVyZVN1YmdyYXBoc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOQoRZmVhdHVyZV9zdWJncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBINCgVjb3VudBgDIAEoBSKWAQomR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSHAoUZmVkZXJhdGVkX2dyYXBoX25hbWUYASABKAkSDQoFbGltaXQYAiABKAUSDgoGb2Zmc2V0GAMgASgFEhEKCW5hbWVzcGFjZRgEIAEoCRISCgVxdWVyeRgFIAEoCUgAiAEBQggKBl9xdWVyeSKqAQonR2V0RmVhdHVyZUZsYWdzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOAoNZmVhdHVyZV9mbGFncxgCIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlYXR1cmVGbGFnEhMKC3RvdGFsX2NvdW50GAMgASgFImwKOUdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkiqAEKOkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI4Cg1mZWF0dXJlX2ZsYWdzGAIgAygLMiEud2cuY29zbW8ucGxhdGZvcm0udjEuRmVhdHVyZUZsYWcimgEKKkdldEZlYXR1cmVTdWJncmFwaHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBIcChRmZWRlcmF0ZWRfZ3JhcGhfbmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFbGltaXQYAyABKAUSDgoGb2Zmc2V0GAQgASgFEhIKBXF1ZXJ5GAUgASgJSACIAQFCCAoGX3F1ZXJ5Iq8BCitHZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USOQoRZmVhdHVyZV9zdWJncmFwaHMYAiADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBITCgt0b3RhbF9jb3VudBgDIAEoBSLBAQokR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnlSZXF1ZXN0EjQKCnBhZ2luYXRpb24YASABKAsyIC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QYWdpbmF0aW9uEjMKCmRhdGVfcmFuZ2UYAiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EYXRlUmFuZ2USGwoOZmlsdGVyX2J5X3R5cGUYAyABKAlIAIgBAUIRCg9fZmlsdGVyX2J5X3R5cGUi+wMKD1dlYmhvb2tEZWxpdmVyeRIKCgJpZBgBIAEoCRISCgpjcmVhdGVkX2F0GAIgASgJEhcKCmNyZWF0ZWRfYnkYAyABKAlIAIgBARIMCgR0eXBlGAQgASgJEhAKCGVuZHBvaW50GAUgASgJEhIKCmV2ZW50X25hbWUYBiABKAkSDwoHcGF5bG9hZBgHIAEoCRIXCg9yZXF1ZXN0X2hlYWRlcnMYCCABKAkSHQoQcmVzcG9uc2VfaGVhZGVycxgJIAEoCUgBiAEBEiEKFHJlc3BvbnNlX3N0YXR1c19jb2RlGAogASgFSAKIAQESIAoTcmVzcG9uc2VfZXJyb3JfY29kZRgLIAEoCUgDiAEBEhoKDWVycm9yX21lc3NhZ2UYDCABKAlIBIgBARIaCg1yZXNwb25zZV9ib2R5GA0gASgJSAWIAQESEwoLcmV0cnlfY291bnQYDiABKAUSEAoIZHVyYXRpb24YDyABKAISFQoNaXNfcmVkZWxpdmVyeRgQIAEoCEINCgtfY3JlYXRlZF9ieUITChFfcmVzcG9uc2VfaGVhZGVyc0IXChVfcmVzcG9uc2Vfc3RhdHVzX2NvZGVCFgoUX3Jlc3BvbnNlX2Vycm9yX2NvZGVCEAoOX2Vycm9yX21lc3NhZ2VCEAoOX3Jlc3BvbnNlX2JvZHkiqQEKJUdldE9yZ2FuaXphdGlvbldlYmhvb2tIaXN0b3J5UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI5CgpkZWxpdmVyaWVzGAIgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuV2ViaG9va0RlbGl2ZXJ5EhMKC3RvdGFsX2NvdW50GAMgASgFIiUKF1JlZGVsaXZlcldlYmhvb2tSZXF1ZXN0EgoKAmlkGAEgASgJIkwKGFJlZGVsaXZlcldlYmhvb2tSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIi4KIEdldFdlYmhvb2tEZWxpdmVyeURldGFpbHNSZXF1ZXN0EgoKAmlkGAEgASgJIo4BCiFHZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRI3CghkZWxpdmVyeRgCIAEoCzIlLndnLmNvc21vLnBsYXRmb3JtLnYxLldlYmhvb2tEZWxpdmVyeSJNCh1DcmVhdGVQbGF5Z3JvdW5kU2NyaXB0UmVxdWVzdBINCgV0aXRsZRgBIAEoCRIMCgR0eXBlGAIgASgJEg8KB2NvbnRlbnQYAyABKAkiUgoeQ3JlYXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiKwodRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QSCgoCaWQYASABKAkiUgoeRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiSwodVXBkYXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QSCgoCaWQYASABKAkSDQoFdGl0bGUYAiABKAkSDwoHY29udGVudBgDIAEoCSJSCh5VcGRhdGVQbGF5Z3JvdW5kU2NyaXB0UmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIrChtHZXRQbGF5Z3JvdW5kU2NyaXB0c1JlcXVlc3QSDAoEdHlwZRgBIAEoCSJMChBQbGF5Z3JvdW5kU2NyaXB0EgoKAmlkGAEgASgJEgwKBHR5cGUYAiABKAkSDQoFdGl0bGUYAyABKAkSDwoHY29udGVudBgEIAEoCSKJAQocR2V0UGxheWdyb3VuZFNjcmlwdHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjcKB3NjcmlwdHMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QbGF5Z3JvdW5kU2NyaXB0IkIKHEdldEZlZGVyYXRlZEdyYXBoQnlJZFJlcXVlc3QSCgoCaWQYASABKAkSFgoOaW5jbHVkZU1ldHJpY3MYAiABKAgi3wIKHUdldEZlZGVyYXRlZEdyYXBoQnlJZFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USMwoFZ3JhcGgYAiABKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaBIxCglzdWJncmFwaHMYAyADKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaBIZChFncmFwaFJlcXVlc3RUb2tlbhgEIAEoCRJPCiRmZWF0dXJlRmxhZ3NJbkxhdGVzdFZhbGlkQ29tcG9zaXRpb24YBSADKAsyIS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWF0dXJlRmxhZxI4ChBmZWF0dXJlU3ViZ3JhcGhzGAYgAygLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuU3ViZ3JhcGgiJAoWR2V0U3ViZ3JhcGhCeUlkUmVxdWVzdBIKCgJpZBgBIAEoCSKxAQoXR2V0U3ViZ3JhcGhCeUlkUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRItCgVncmFwaBgCIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoEjUKB21lbWJlcnMYAyADKAsyJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaE1lbWJlciIvChNHZXROYW1lc3BhY2VSZXF1ZXN0EgwKBG5hbWUYASABKAkSCgoCaWQYAiABKAkifAoUR2V0TmFtZXNwYWNlUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIyCgluYW1lc3BhY2UYAiABKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5OYW1lc3BhY2UiqQEKEldvcmtzcGFjZU5hbWVzcGFjZRIKCgJpZBgBIAEoCRIMCgRuYW1lGAIgASgJEj0KBmdyYXBocxgDIAMoCzItLndnLmNvc21vLnBsYXRmb3JtLnYxLldvcmtzcGFjZUZlZGVyYXRlZEdyYXBoEjoKCXN1YmdyYXBocxgEIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLldvcmtzcGFjZVN1YmdyYXBoInQKF1dvcmtzcGFjZUZlZGVyYXRlZEdyYXBoEgoKAmlkGAEgASgJEhAKCHRhcmdldElkGAIgASgJEgwKBG5hbWUYAyABKAkSEgoKaXNDb250cmFjdBgEIAEoCBIZChFzdWJncmFwaFRhcmdldElkcxgFIAMoCSKKAQoRV29ya3NwYWNlU3ViZ3JhcGgSCgoCaWQYASABKAkSEAoIdGFyZ2V0SWQYAiABKAkSDAoEbmFtZRgDIAEoCRIbCg5iYXNlU3ViZ3JhcGhJZBgEIAEoCUgAiAEBEhkKEWlzRmVhdHVyZVN1YmdyYXBoGAUgASgIQhEKD19iYXNlU3ViZ3JhcGhJZCIVChNHZXRXb3Jrc3BhY2VSZXF1ZXN0IoYBChRHZXRXb3Jrc3BhY2VSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjwKCm5hbWVzcGFjZXMYAiADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Xb3Jrc3BhY2VOYW1lc3BhY2UinwEKH1B1c2hDYWNoZVdhcm1lck9wZXJhdGlvblJlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhgKEG9wZXJhdGlvbkNvbnRlbnQYAiABKAkSFQoNb3BlcmF0aW9uTmFtZRgDIAEoCRIcChRvcGVyYXRpb25QZXJzaXN0ZWRJZBgEIAEoCRIRCgluYW1lc3BhY2UYBSABKAkiVAogUHVzaENhY2hlV2FybWVyT3BlcmF0aW9uUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJvCh9HZXRDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSDQoFbGltaXQYAyABKAUSDgoGb2Zmc2V0GAQgASgFIogCChRDYWNoZVdhcm1lck9wZXJhdGlvbhIKCgJpZBgBIAEoCRIYChBvcGVyYXRpb25Db250ZW50GAIgASgJEhUKDW9wZXJhdGlvbk5hbWUYAyABKAkSHAoUb3BlcmF0aW9uUGVyc2lzdGVkSWQYBCABKAkSFQoNb3BlcmF0aW9uSGFzaBgFIAEoCRISCgpjbGllbnROYW1lGAYgASgJEhUKDWNsaWVudFZlcnNpb24YByABKAkSFAoMcGxhbm5pbmdUaW1lGAggASgCEhcKD2lzTWFudWFsbHlBZGRlZBgJIAEoCBIRCgljcmVhdGVkQXQYCiABKAkSEQoJY3JlYXRlZEJ5GAsgASgJIscBCiBHZXRDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEj4KCm9wZXJhdGlvbnMYAiADKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DYWNoZVdhcm1lck9wZXJhdGlvbhITCgt0b3RhbF9jb3VudBgDIAEoBRIcChRpc0NhY2hlV2FybWVyRW5hYmxlZBgEIAEoCCJUCiNDb21wdXRlQ2FjaGVXYXJtZXJPcGVyYXRpb25zUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIlgKJENvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlImcKG0NvbmZpZ3VyZUNhY2hlV2FybWVyUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSGQoRZW5hYmxlQ2FjaGVXYXJtZXIYAiABKAgSGgoSbWF4T3BlcmF0aW9uc0NvdW50GAMgASgFIlAKHENvbmZpZ3VyZUNhY2hlV2FybWVyUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSIwChtHZXRDYWNoZVdhcm1lckNvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIooBChxHZXRDYWNoZVdhcm1lckNvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USHAoUaXNDYWNoZVdhcm1lckVuYWJsZWQYAiABKAgSGgoSbWF4T3BlcmF0aW9uc0NvdW50GAMgASgFIjwKJ0dldFN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkilAMKKEdldFN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIdChVpc0VuYWJsZWRGb3JOYW1lc3BhY2UYAiABKAgSJAocaXNMaW50aW5nRW5hYmxlZEZvck5hbWVzcGFjZRgDIAEoCBIpCiFpc0dyYXBoUHJ1bmluZ0VuYWJsZWRGb3JOYW1lc3BhY2UYBCABKAgSEAoIZW5kcG9pbnQYBSABKAkSGwoTaXNTZWNyZXRLZXlBc3NpZ25lZBgGIAEoCBIaChJpbmNsdWRlQ29tcG9zZWRTZGwYByABKAgSHAoUaW5jbHVkZUxpbnRpbmdJc3N1ZXMYCCABKAgSHAoUaW5jbHVkZVBydW5pbmdJc3N1ZXMYCSABKAgSHAoUaW5jbHVkZVNjaGVtYUNoYW5nZXMYCiABKAgSIQoZaW5jbHVkZUFmZmVjdGVkT3BlcmF0aW9ucxgLIAEoCCK0AgonQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNSZXF1ZXN0EhEKCW5hbWVzcGFjZRgBIAEoCRIlCh1lbmFibGVTdWJncmFwaENoZWNrRXh0ZW5zaW9ucxgCIAEoCBIQCghlbmRwb2ludBgDIAEoCRIWCglzZWNyZXRLZXkYBCABKAlIAIgBARIaChJpbmNsdWRlQ29tcG9zZWRTZGwYBSABKAgSHAoUaW5jbHVkZUxpbnRpbmdJc3N1ZXMYBiABKAgSHAoUaW5jbHVkZVBydW5pbmdJc3N1ZXMYByABKAgSHAoUaW5jbHVkZVNjaGVtYUNoYW5nZXMYCCABKAgSIQoZaW5jbHVkZUFmZmVjdGVkT3BlcmF0aW9ucxgJIAEoCEIMCgpfc2VjcmV0S2V5IlwKKENvbmZpZ3VyZVN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJeCiFEZWxldGVDYWNoZVdhcm1lck9wZXJhdGlvblJlcXVlc3QSCgoCaWQYASABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAIgASgJEhEKCW5hbWVzcGFjZRgDIAEoCSJWCiJEZWxldGVDYWNoZVdhcm1lck9wZXJhdGlvblJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiKAomTGlzdFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uc1JlcXVlc3QibQonTGlzdFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEAoIdmVyc2lvbnMYAiADKAkisQEKKVNldEdyYXBoUm91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25SZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEg8KB3ZlcnNpb24YAyABKAkSLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBCABKAhIAIgBAUIjCiFfZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24i2AIKKlNldEdyYXBoUm91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25SZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhgKEHByZXZpb3VzX3ZlcnNpb24YAiABKAkSEwoLbmV3X3ZlcnNpb24YAyABKAkSQQoRY29tcG9zaXRpb25FcnJvcnMYBCADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYBSADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgGIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZyJrCilHZXRQcm9wb3NlZFNjaGVtYU9mQ2hlY2tlZFN1YmdyYXBoUmVxdWVzdBIPCgdjaGVja0lkGAEgASgJEhkKEWNoZWNrZWRTdWJncmFwaElkGAIgASgJEhIKCnN1YmdyYXBoSWQYAyABKAkidgoqR2V0UHJvcG9zZWRTY2hlbWFPZkNoZWNrZWRTdWJncmFwaFJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USFgoOcHJvcG9zZWRTY2hlbWEYAiABKAkiuAIKCFByb3Bvc2FsEgoKAmlkGAEgASgJEgwKBG5hbWUYAiABKAkSEQoJY3JlYXRlZEF0GAMgASgJEhYKDmNyZWF0ZWRCeUVtYWlsGAQgASgJEg0KBXN0YXRlGAUgASgJEhgKEGZlZGVyYXRlZEdyYXBoSWQYBiABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAcgASgJEjkKCXN1YmdyYXBocxgIIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsU3ViZ3JhcGgSGgoSbGF0ZXN0Q2hlY2tTdWNjZXNzGAkgASgIEhUKDWxhdGVzdENoZWNrSWQYCiABKAkSNAoGb3JpZ2luGAsgASgOMiQud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWxPcmlnaW4iggEKEFByb3Bvc2FsU3ViZ3JhcGgSDAoEbmFtZRgBIAEoCRIRCglzY2hlbWFTREwYAiABKAkSEQoJaXNEZWxldGVkGAMgASgIEg0KBWlzTmV3GAQgASgIEisKBmxhYmVscxgFIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsIo8CChVDcmVhdGVQcm9wb3NhbFJlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIMCgRuYW1lGAMgASgJEjkKCXN1YmdyYXBocxgEIAMoCzImLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsU3ViZ3JhcGgSSAoQbmFtaW5nQ29udmVudGlvbhgFIAEoDjIuLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsTmFtaW5nQ29udmVudGlvbhI0CgZvcmlnaW4YBiABKA4yJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm9wb3NhbE9yaWdpbiLQCAoWQ3JlYXRlUHJvcG9zYWxSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhIKCnByb3Bvc2FsSWQYAiABKAkSDwoHY2hlY2tJZBgDIAEoCRI7Cg9icmVha2luZ0NoYW5nZXMYBCADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USPgoSbm9uQnJlYWtpbmdDaGFuZ2VzGAUgAygLMiIud2cuY29zbW8ucGxhdGZvcm0udjEuU2NoZW1hQ2hhbmdlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAYgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchJFChNjb21wb3NpdGlvbldhcm5pbmdzGAcgAygLMigud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25XYXJuaW5nEjMKCmxpbnRFcnJvcnMYCCADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSNQoMbGludFdhcm5pbmdzGAkgAygLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGludElzc3VlEkEKEGdyYXBoUHJ1bmVFcnJvcnMYCiADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJDChJncmFwaFBydW5lV2FybmluZ3MYCyADKAsyJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HcmFwaFBydW5pbmdJc3N1ZRJLChNvcGVyYXRpb25Vc2FnZVN0YXRzGAwgASgLMi4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tPcGVyYXRpb25Vc2FnZVN0YXRzEhYKDmxpbnRpbmdTa2lwcGVkGA0gASgIEhsKE2dyYXBoUHJ1bmluZ1NraXBwZWQYDiABKAgSEAoIY2hlY2tVcmwYDyABKAkSEwoLcHJvcG9zYWxVcmwYECABKAkSFAoMcHJvcG9zYWxOYW1lGBEgASgJEicKGmlzTGlua2VkVHJhZmZpY0NoZWNrRmFpbGVkGBIgASgISACIAQESJwoaaXNMaW5rZWRQcnVuaW5nQ2hlY2tGYWlsZWQYEyABKAhIAYgBARIiChVoYXNMaW5rZWRTY2hlbWFDaGVja3MYFCABKAhIAogBARJXCh1jb21wb3NlZFNjaGVtYUJyZWFraW5nQ2hhbmdlcxgVIAMoCzIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkZlZGVyYXRlZEdyYXBoU2NoZW1hQ2hhbmdlQh0KG19pc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZEIdChtfaXNMaW5rZWRQcnVuaW5nQ2hlY2tGYWlsZWRCGAoWX2hhc0xpbmtlZFNjaGVtYUNoZWNrcyIoChJHZXRQcm9wb3NhbFJlcXVlc3QSEgoKcHJvcG9zYWxJZBgBIAEoCSKCAgoTR2V0UHJvcG9zYWxSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjAKCHByb3Bvc2FsGAIgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUHJvcG9zYWwSUwoQY3VycmVudFN1YmdyYXBocxgDIAMoCzI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2FsUmVzcG9uc2UuQ3VycmVudFN1YmdyYXBoGjIKD0N1cnJlbnRTdWJncmFwaBIMCgRuYW1lGAEgASgJEhEKCXNjaGVtYVNETBgCIAEoCSKXAQojR2V0UHJvcG9zYWxzQnlGZWRlcmF0ZWRHcmFwaFJlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIRCglzdGFydERhdGUYAyABKAkSDwoHZW5kRGF0ZRgEIAEoCRINCgVsaW1pdBgFIAEoBRIOCgZvZmZzZXQYBiABKAUiuwEKJEdldFByb3Bvc2Fsc0J5RmVkZXJhdGVkR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjEKCXByb3Bvc2FscxgCIAMoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlByb3Bvc2FsEhoKEmlzUHJvcG9zYWxzRW5hYmxlZBgDIAEoCBISCgp0b3RhbENvdW50GAQgASgFInEKGEdldFByb3Bvc2FsQ2hlY2tzUmVxdWVzdBISCgpwcm9wb3NhbElkGAEgASgJEg0KBWxpbWl0GAIgASgFEg4KBm9mZnNldBgDIAEoBRIRCglzdGFydERhdGUYBCABKAkSDwoHZW5kRGF0ZRgFIAEoCSKaAQoZR2V0UHJvcG9zYWxDaGVja3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjEKBmNoZWNrcxgCIAMoCzIhLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoZWNrEhgKEHRvdGFsQ2hlY2tzQ291bnQYAyABKAUitQIKFVVwZGF0ZVByb3Bvc2FsUmVxdWVzdBIUCgxwcm9wb3NhbE5hbWUYASABKAkSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAIgASgJEg8KBXN0YXRlGAMgASgJSAASXwoQdXBkYXRlZFN1YmdyYXBocxgEIAEoCzJDLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZVByb3Bvc2FsUmVxdWVzdC5VcGRhdGVQcm9wb3NhbFN1YmdyYXBoc0gAEhEKCW5hbWVzcGFjZRgFIAEoCRpUChdVcGRhdGVQcm9wb3NhbFN1YmdyYXBocxI5CglzdWJncmFwaHMYASADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Qcm9wb3NhbFN1YmdyYXBoQg8KDXVwZGF0ZV9hY3Rpb24ikQgKFlVwZGF0ZVByb3Bvc2FsUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIPCgdjaGVja0lkGAIgASgJEjsKD2JyZWFraW5nQ2hhbmdlcxgDIAMoCzIiLndnLmNvc21vLnBsYXRmb3JtLnYxLlNjaGVtYUNoYW5nZRI+ChJub25CcmVha2luZ0NoYW5nZXMYBCADKAsyIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TY2hlbWFDaGFuZ2USQQoRY29tcG9zaXRpb25FcnJvcnMYBSADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBiADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSMwoKbGludEVycm9ycxgHIAMoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbnRJc3N1ZRI1CgxsaW50V2FybmluZ3MYCCADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50SXNzdWUSQQoQZ3JhcGhQcnVuZUVycm9ycxgJIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0lzc3VlEkMKEmdyYXBoUHJ1bmVXYXJuaW5ncxgKIAMoCzInLndnLmNvc21vLnBsYXRmb3JtLnYxLkdyYXBoUHJ1bmluZ0lzc3VlEksKE29wZXJhdGlvblVzYWdlU3RhdHMYCyABKAsyLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja09wZXJhdGlvblVzYWdlU3RhdHMSFgoObGludGluZ1NraXBwZWQYDCABKAgSGwoTZ3JhcGhQcnVuaW5nU2tpcHBlZBgNIAEoCBIQCghjaGVja1VybBgOIAEoCRInChppc0xpbmtlZFRyYWZmaWNDaGVja0ZhaWxlZBgPIAEoCEgAiAEBEicKGmlzTGlua2VkUHJ1bmluZ0NoZWNrRmFpbGVkGBAgASgISAGIAQESIgoVaGFzTGlua2VkU2NoZW1hQ2hlY2tzGBEgASgISAKIAQESVwodY29tcG9zZWRTY2hlbWFCcmVha2luZ0NoYW5nZXMYEiADKAsyMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GZWRlcmF0ZWRHcmFwaFNjaGVtYUNoYW5nZUIdChtfaXNMaW5rZWRUcmFmZmljQ2hlY2tGYWlsZWRCHQobX2lzTGlua2VkUHJ1bmluZ0NoZWNrRmFpbGVkQhgKFl9oYXNMaW5rZWRTY2hlbWFDaGVja3MiUAoiRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSFwoPZW5hYmxlUHJvcG9zYWxzGAIgASgIIlcKI0VuYWJsZVByb3Bvc2Fsc0Zvck5hbWVzcGFjZVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UivgEKJ0NvbmZpZ3VyZU5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVxdWVzdBIRCgluYW1lc3BhY2UYASABKAkSPgoSY2hlY2tTZXZlcml0eUxldmVsGAIgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5EkAKFHB1Ymxpc2hTZXZlcml0eUxldmVsGAMgASgOMiIud2cuY29zbW8ucGxhdGZvcm0udjEuTGludFNldmVyaXR5IlwKKENvbmZpZ3VyZU5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI2CiFHZXROYW1lc3BhY2VQcm9wb3NhbENvbmZpZ1JlcXVlc3QSEQoJbmFtZXNwYWNlGAEgASgJIukBCiJHZXROYW1lc3BhY2VQcm9wb3NhbENvbmZpZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USDwoHZW5hYmxlZBgCIAEoCBI+ChJjaGVja1NldmVyaXR5TGV2ZWwYAyABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkSQAoUcHVibGlzaFNldmVyaXR5TGV2ZWwYBCABKA4yIi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW50U2V2ZXJpdHkiqwEKG05hbWVzcGFjZUxvZ2luTWV0aG9kTWFwcGluZxIUCgxuYW1lc3BhY2VfaWQYASABKAkSIAoYYWxsb3dlZF9zc29fcHJvdmlkZXJfaWRzGAIgAygJEhwKFGFsbG93X3Bhc3N3b3JkX2xvZ2luGAMgASgIEhoKEmFsbG93X2dvb2dsZV9sb2dpbhgEIAEoCBIaChJhbGxvd19naXRodWJfbG9naW4YBSABKAgiaQoiVXBkYXRlTmFtZXNwYWNlTG9naW5NZXRob2RzUmVxdWVzdBJDCghtYXBwaW5ncxgBIAMoCzIxLndnLmNvc21vLnBsYXRmb3JtLnYxLk5hbWVzcGFjZUxvZ2luTWV0aG9kTWFwcGluZyJXCiNVcGRhdGVOYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlIiIKIExpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXF1ZXN0IpoBCiFMaXN0TmFtZXNwYWNlTG9naW5NZXRob2RzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJDCghtYXBwaW5ncxgCIAMoCzIxLndnLmNvc21vLnBsYXRmb3JtLnYxLk5hbWVzcGFjZUxvZ2luTWV0aG9kTWFwcGluZyKpAQoYT3JnYW5pemF0aW9uTG9naW5NZXRob2RzEiAKGGFsbG93ZWRfc3NvX3Byb3ZpZGVyX2lkcxgBIAMoCRIcChRhbGxvd19wYXNzd29yZF9sb2dpbhgCIAEoCBIaChJhbGxvd19nb29nbGVfbG9naW4YAyABKAgSGgoSYWxsb3dfZ2l0aHViX2xvZ2luGAQgASgIEhUKDWlzX3Jlc3RyaWN0ZWQYBSABKAgiJAoiR2V0T3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVxdWVzdCKeAQojR2V0T3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJFCg1sb2dpbl9tZXRob2RzGAIgASgLMi4ud2cuY29zbW8ucGxhdGZvcm0udjEuT3JnYW5pemF0aW9uTG9naW5NZXRob2RzIsIBCiVVcGRhdGVPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXF1ZXN0EiAKGGFsbG93ZWRfc3NvX3Byb3ZpZGVyX2lkcxgBIAMoCRIcChRhbGxvd19wYXNzd29yZF9sb2dpbhgCIAEoCBIaChJhbGxvd19nb29nbGVfbG9naW4YAyABKAgSGgoSYWxsb3dfZ2l0aHViX2xvZ2luGAQgASgIEiEKGWNvbmZpcm1fbmFtZXNwYWNlX2NoYW5nZXMYBSABKAgitwEKJlVwZGF0ZU9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USHQoVcmVxdWlyZXNfY29uZmlybWF0aW9uGAIgASgIEjwKE2FmZmVjdGVkX25hbWVzcGFjZXMYAyADKAsyHy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5OYW1lc3BhY2Ui6AUKFEdldE9wZXJhdGlvbnNSZXF1ZXN0EhoKEmZlZGVyYXRlZEdyYXBoTmFtZRgBIAEoCRIRCgluYW1lc3BhY2UYAiABKAkSEwoLY2xpZW50TmFtZXMYAyADKAkSEgoFbGltaXQYBCABKAVIAIgBARITCgZvZmZzZXQYBSABKAVIAYgBARInChppbmNsdWRlSGFzRGVwcmVjYXRlZEZpZWxkcxgGIAEoCEgCiAEBEkcKDGZldGNoQmFzZWRPbhgHIAEoDjIsLndnLmNvc21vLnBsYXRmb3JtLnYxLk9wZXJhdGlvbnNGZXRjaEJhc2VkT25IA4gBARIbCg5pbmNsdWRlQ29udGVudBgIIAEoCEgEiAEBEhIKBXJhbmdlGAkgASgFSAWIAQESNwoJZGF0ZVJhbmdlGAogASgLMh8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGF0ZVJhbmdlSAaIAQESGAoLc2VhcmNoUXVlcnkYCyABKAlIB4gBARI2CilpbmNsdWRlT3BlcmF0aW9uc1dpdGhEZXByZWNhdGVkRmllbGRzT25seRgMIAEoCEgIiAEBEj8KDXNvcnREaXJlY3Rpb24YDSABKA4yIy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Tb3J0RGlyZWN0aW9uSAmIAQESHgoRaW5jbHVkZVRvdGFsQ291bnQYDiABKAhICogBAUIICgZfbGltaXRCCQoHX29mZnNldEIdChtfaW5jbHVkZUhhc0RlcHJlY2F0ZWRGaWVsZHNCDwoNX2ZldGNoQmFzZWRPbkIRCg9faW5jbHVkZUNvbnRlbnRCCAoGX3JhbmdlQgwKCl9kYXRlUmFuZ2VCDgoMX3NlYXJjaFF1ZXJ5QiwKKl9pbmNsdWRlT3BlcmF0aW9uc1dpdGhEZXByZWNhdGVkRmllbGRzT25seUIQCg5fc29ydERpcmVjdGlvbkIUChJfaW5jbHVkZVRvdGFsQ291bnQilwQKFUdldE9wZXJhdGlvbnNSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkkKCm9wZXJhdGlvbnMYAiADKAsyNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25zUmVzcG9uc2UuT3BlcmF0aW9uEhcKCnRvdGFsQ291bnQYAyABKAVIAIgBARqcAgoJT3BlcmF0aW9uEgwKBGhhc2gYASABKAkSDAoEbmFtZRgCIAEoCRIUCgdjb250ZW50GAMgASgJSAGIAQESRwoEdHlwZRgEIAEoDjI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbnNSZXNwb25zZS5PcGVyYXRpb25UeXBlEiAKE2hhc0RlcHJlY2F0ZWRGaWVsZHMYBSABKAhIAogBARIRCgdsYXRlbmN5GAYgASgCSAASFgoMcmVxdWVzdENvdW50GAcgASgDSAASGQoPZXJyb3JQZXJjZW50YWdlGAggASgCSABCCAoGbWV0cmljQgoKCF9jb250ZW50QhYKFF9oYXNEZXByZWNhdGVkRmllbGRzIjoKDU9wZXJhdGlvblR5cGUSCQoFUVVFUlkQABIMCghNVVRBVElPThABEhAKDFNVQlNDUklQVElPThACQg0KC190b3RhbENvdW50Ik8KHkdldENsaWVudHNGcm9tQW5hbHl0aWNzUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJIroBCh9HZXRDbGllbnRzRnJvbUFuYWx5dGljc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USTQoHY2xpZW50cxgCIAMoCzI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENsaWVudHNGcm9tQW5hbHl0aWNzUmVzcG9uc2UuQ2xpZW50GhYKBkNsaWVudBIMCgRuYW1lGAEgASgJIt4BChpHZXRPcGVyYXRpb25DbGllbnRzUmVxdWVzdBIaChJmZWRlcmF0ZWRHcmFwaE5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhUKDW9wZXJhdGlvbkhhc2gYAyABKAkSFQoNb3BlcmF0aW9uTmFtZRgEIAEoCRISCgVyYW5nZRgFIAEoBUgAiAEBEjcKCWRhdGVSYW5nZRgGIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZUgBiAEBQggKBl9yYW5nZUIMCgpfZGF0ZVJhbmdlIusBChtHZXRPcGVyYXRpb25DbGllbnRzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJJCgdjbGllbnRzGAIgAygLMjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uQ2xpZW50c1Jlc3BvbnNlLkNsaWVudBpPCgZDbGllbnQSDAoEbmFtZRgBIAEoCRIPCgd2ZXJzaW9uGAIgASgJEhQKDHJlcXVlc3RDb3VudBgDIAEoAxIQCghsYXN0VXNlZBgEIAEoCSL+AQojR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkc1JlcXVlc3QSGgoSZmVkZXJhdGVkR3JhcGhOYW1lGAEgASgJEhEKCW5hbWVzcGFjZRgCIAEoCRIVCg1vcGVyYXRpb25IYXNoGAMgASgJEhoKDW9wZXJhdGlvbk5hbWUYBCABKAlIAIgBARISCgVyYW5nZRgFIAEoBUgBiAEBEjcKCWRhdGVSYW5nZRgGIAEoCzIfLndnLmNvc21vLnBsYXRmb3JtLnYxLkRhdGVSYW5nZUgCiAEBQhAKDl9vcGVyYXRpb25OYW1lQggKBl9yYW5nZUIMCgpfZGF0ZVJhbmdlIp8CCiRHZXRPcGVyYXRpb25EZXByZWNhdGVkRmllbGRzUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRJkChBkZXByZWNhdGVkRmllbGRzGAIgAygLMkoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkc1Jlc3BvbnNlLkRlcHJlY2F0ZWRGaWVsZBpfCg9EZXByZWNhdGVkRmllbGQSEQoJZmllbGROYW1lGAEgASgJEhAKCHR5cGVOYW1lGAIgASgJEgwKBHBhdGgYAyABKAkSGQoRZGVwcmVjYXRpb25SZWFzb24YBCABKAkicQohVmFsaWRhdGVBbmRGZXRjaFBsdWdpbkRhdGFSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEisKBmxhYmVscxgDIAMoCzIbLndnLmNvc21vLnBsYXRmb3JtLnYxLkxhYmVsIpABCiJWYWxpZGF0ZUFuZEZldGNoUGx1Z2luRGF0YVJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USEgoKbmV3VmVyc2lvbhgCIAEoCRIRCglwdXNoVG9rZW4YAyABKAkSEQoJcmVmZXJlbmNlGAQgASgJIo8BChNMaW5rU3ViZ3JhcGhSZXF1ZXN0EhoKEnNvdXJjZVN1YmdyYXBoTmFtZRgBIAEoCRIfChdzb3VyY2VTdWJncmFwaE5hbWVzcGFjZRgCIAEoCRIaChJ0YXJnZXRTdWJncmFwaE5hbWUYAyABKAkSHwoXdGFyZ2V0U3ViZ3JhcGhOYW1lc3BhY2UYBCABKAkiSAoUTGlua1N1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSJUChVVbmxpbmtTdWJncmFwaFJlcXVlc3QSGgoSc291cmNlU3ViZ3JhcGhOYW1lGAEgASgJEh8KF3NvdXJjZVN1YmdyYXBoTmFtZXNwYWNlGAIgASgJIkoKFlVubGlua1N1YmdyYXBoUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZSI6Ch5WZXJpZnlBUElLZXlHcmFwaEFjY2Vzc1JlcXVlc3QSGAoQZmVkZXJhdGVkR3JhcGhJZBgBIAEoCSKmAQofVmVyaWZ5QVBJS2V5R3JhcGhBY2Nlc3NSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEjIKKmhhc09yZ2FuaXphdGlvbkFkbWluT3JEZXZlbG9wZXJQZXJtaXNzaW9ucxgCIAEoCBIdChVoYXNXcml0ZUFjY2Vzc1RvR3JhcGgYAyABKAgiKwoaSW5pdGlhbGl6ZUNvc21vVXNlclJlcXVlc3QSDQoFdG9rZW4YASABKAkiTwobSW5pdGlhbGl6ZUNvc21vVXNlclJlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2UiGgoYTGlzdE9yZ2FuaXphdGlvbnNSZXF1ZXN0Iv0BChlMaXN0T3JnYW5pemF0aW9uc1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USXQoNb3JnYW5pemF0aW9ucxgCIAMoCzJGLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2UuT3JnYW5pemF0aW9uTWVtYmVyc2hpcBpPChZPcmdhbml6YXRpb25NZW1iZXJzaGlwEgoKAmlkGAEgASgJEgwKBHNsdWcYAiABKAkSDAoEbmFtZRgDIAEoCRINCgVyb2xlcxgEIAMoCSLAAQoVUmVjb21wb3NlR3JhcGhSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhQKDGlzX21vbm9ncmFwaBgDIAEoCBISCgVsaW1pdBgEIAEoBUgAiAEBEi0KIGRpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uGAUgASgISAGIAQFCCAoGX2xpbWl0QiMKIV9kaXNhYmxlX3Jlc29sdmFiaWxpdHlfdmFsaWRhdGlvbiLrAgoWUmVjb21wb3NlR3JhcGhSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEkEKEWNvbXBvc2l0aW9uRXJyb3JzGAIgAygLMiYud2cuY29zbW8ucGxhdGZvcm0udjEuQ29tcG9zaXRpb25FcnJvchI/ChBkZXBsb3ltZW50RXJyb3JzGAMgAygLMiUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVwbG95bWVudEVycm9yEkUKE2NvbXBvc2l0aW9uV2FybmluZ3MYBCADKAsyKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbldhcm5pbmcSRAoLZXJyb3JDb3VudHMYBSABKAsyKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TdWJncmFwaFB1Ymxpc2hTdGF0c0gAiAEBQg4KDF9lcnJvckNvdW50cyKwAQobUmVjb21wb3NlRmVhdHVyZUZsYWdSZXF1ZXN0EgwKBG5hbWUYASABKAkSEQoJbmFtZXNwYWNlGAIgASgJEhIKBWxpbWl0GAMgASgFSACIAQESLQogZGlzYWJsZV9yZXNvbHZhYmlsaXR5X3ZhbGlkYXRpb24YBSABKAhIAYgBAUIICgZfbGltaXRCIwohX2Rpc2FibGVfcmVzb2x2YWJpbGl0eV92YWxpZGF0aW9uIvECChxSZWNvbXBvc2VGZWF0dXJlRmxhZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USQQoRY29tcG9zaXRpb25FcnJvcnMYAiADKAsyJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wb3NpdGlvbkVycm9yEj8KEGRlcGxveW1lbnRFcnJvcnMYAyADKAsyJS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZXBsb3ltZW50RXJyb3ISRQoTY29tcG9zaXRpb25XYXJuaW5ncxgEIAMoCzIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXBvc2l0aW9uV2FybmluZxJECgtlcnJvckNvdW50cxgFIAEoCzIqLndnLmNvc21vLnBsYXRmb3JtLnYxLlN1YmdyYXBoUHVibGlzaFN0YXRzSACIAQFCDgoMX2Vycm9yQ291bnRzIhYKFEdldE9uYm9hcmRpbmdSZXF1ZXN0IqABChVHZXRPbmJvYXJkaW5nUmVzcG9uc2USMAoIcmVzcG9uc2UYASABKAsyHi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXNwb25zZRIXCgpmaW5pc2hlZEF0GAMgASgJSACIAQESHAoUZmVkZXJhdGVkR3JhcGhzQ291bnQYBCABKAUSDwoHZW5hYmxlZBgFIAEoCEINCgtfZmluaXNoZWRBdCIZChdDcmVhdGVPbmJvYXJkaW5nUmVxdWVzdCKSAQoYQ3JlYXRlT25ib2FyZGluZ1Jlc3BvbnNlEjAKCHJlc3BvbnNlGAEgASgLMh4ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVzcG9uc2USFwoKZmluaXNoZWRBdBgCIAEoCUgAiAEBEhwKFGZlZGVyYXRlZEdyYXBoc0NvdW50GAMgASgFQg0KC19maW5pc2hlZEF0IhkKF0ZpbmlzaE9uYm9hcmRpbmdSZXF1ZXN0In4KGEZpbmlzaE9uYm9hcmRpbmdSZXNwb25zZRIwCghyZXNwb25zZRgBIAEoCzIeLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3BvbnNlEhwKFGZlZGVyYXRlZEdyYXBoc0NvdW50GAIgASgFEhIKCmZpbmlzaGVkQXQYAyABKAkqTwoVQmF0Y2hQdWJsaXNoSm9iU3RhdHVzEgsKB1BFTkRJTkcQABIOCgpQUk9DRVNTSU5HEAESCgoGRkFJTEVEEAISDQoJQ09NUExFVEVEEAMqIwoMTGludFNldmVyaXR5EggKBHdhcm4QABIJCgVlcnJvchABKj8KDFN1YmdyYXBoVHlwZRIMCghTVEFOREFSRBAAEg8KC0dSUENfUExVR0lOEAESEAoMR1JQQ19TRVJWSUNFEAIqVQoWQW5hbHl0aWNzVmlld0dyb3VwTmFtZRIICgROb25lEAASEQoNT3BlcmF0aW9uTmFtZRABEgoKBkNsaWVudBACEhIKDkh0dHBTdGF0dXNDb2RlEAMqMQoNQ3VzdG9tT3B0aW9ucxIICgRUZXh0EAASCQoFUmFuZ2UQARILCgdCb29sZWFuEAIqjgEKBFVuaXQSDwoLVW5zcGVjaWZpZWQQABIPCgtOYW5vc2Vjb25kcxABEhEKDVVuaXhUaW1lc3RhbXAQAhIJCgVCeXRlcxADEg0KCUNvZGVCbG9jaxAEEg4KClN0YXR1c0NvZGUQBRILCgdUcmFjZUlEEAYSCgoGU3BhbklEEAcSDgoKUGVyY2VudGFnZRAIKv0BChtBbmFseXRpY3NWaWV3RmlsdGVyT3BlcmF0b3ISCgoGRVFVQUxTEAASDgoKTk9UX0VRVUFMUxABEhAKDEdSRUFURVJfVEhBThACEg0KCUxFU1NfVEhBThADEhkKFUdSRUFURVJfVEhBTl9PUl9FUVVBTBAEEhYKEkxFU1NfVEhBTl9PUl9FUVVBTBAFEgwKCENPTlRBSU5TEAYSEAoMTk9UX0NPTlRBSU5TEAcSBgoCSU4QCBIKCgZOT1RfSU4QCRILCgdCRVRXRUVOEAoSDwoLTk9UX0JFVFdFRU4QCxILCgdJU19OVUxMEAwSDwoLSVNfTk9UX05VTEwQDSpFCglFeHBpcmVzQXQSCQoFTkVWRVIQABIPCgtUSElSVFlfREFZUxABEg4KClNJWF9NT05USFMQAhIMCghPTkVfWUVBUhADKqwBCg9Mb2dpbk1ldGhvZFR5cGUSIQodTE9HSU5fTUVUSE9EX1RZUEVfVU5TUEVDSUZJRUQQABIZChVMT0dJTl9NRVRIT0RfVFlQRV9TU08QARIeChpMT0dJTl9NRVRIT0RfVFlQRV9QQVNTV09SRBACEh0KGUxPR0lOX01FVEhPRF9UWVBFX0FQSV9LRVkQAxIcChhMT0dJTl9NRVRIT0RfVFlQRV9TT0NJQUwQBCqAAQoTU29jaWFsTG9naW5Qcm92aWRlchIlCiFTT0NJQUxfTE9HSU5fUFJPVklERVJfVU5TUEVDSUZJRUQQABIgChxTT0NJQUxfTE9HSU5fUFJPVklERVJfR09PR0xFEAESIAocU09DSUFMX0xPR0lOX1BST1ZJREVSX0dJVEhVQhACKkUKGFB1Ymxpc2hlZE9wZXJhdGlvblN0YXR1cxIOCgpVUF9UT19EQVRFEAASCwoHQ1JFQVRFRBABEgwKCENPTkZMSUNUEAIqHAoPSW50ZWdyYXRpb25UeXBlEgkKBVNMQUNLEAAqJQoHRmVhdHVyZRIICgRyYmFjEAASBgoCYWkQARIICgRzY2ltEAIqLAoOUHJvcG9zYWxPcmlnaW4SDAoISU5URVJOQUwQABIMCghFWFRFUk5BTBABKjcKGFByb3Bvc2FsTmFtaW5nQ29udmVudGlvbhIKCgZOT1JNQUwQABIPCgtJTkNSRU1FTlRBTBABKj8KFk9wZXJhdGlvbnNGZXRjaEJhc2VkT24SDAoIUkVRVUVTVFMQABILCgdMQVRFTkNZEAESCgoGRVJST1JTEAIqIgoNU29ydERpcmVjdGlvbhIHCgNBU0MQABIICgRERVNDEAEyvMgBCg9QbGF0Zm9ybVNlcnZpY2UShQEKFkNyZWF0ZVBsYXlncm91bmRTY3JpcHQSMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVQbGF5Z3JvdW5kU2NyaXB0UmVxdWVzdBo0LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZVBsYXlncm91bmRTY3JpcHRSZXNwb25zZSIAEoUBChZEZWxldGVQbGF5Z3JvdW5kU2NyaXB0EjMud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlUGxheWdyb3VuZFNjcmlwdFJlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVQbGF5Z3JvdW5kU2NyaXB0UmVzcG9uc2UiABKFAQoWVXBkYXRlUGxheWdyb3VuZFNjcmlwdBIzLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZVBsYXlncm91bmRTY3JpcHRSZXF1ZXN0GjQud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlUGxheWdyb3VuZFNjcmlwdFJlc3BvbnNlIgASfwoUR2V0UGxheWdyb3VuZFNjcmlwdHMSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQbGF5Z3JvdW5kU2NyaXB0c1JlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQbGF5Z3JvdW5kU2NyaXB0c1Jlc3BvbnNlIgAScAoPQ3JlYXRlTmFtZXNwYWNlEiwud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlTmFtZXNwYWNlUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU5hbWVzcGFjZVJlc3BvbnNlIgAScAoPRGVsZXRlTmFtZXNwYWNlEiwud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlTmFtZXNwYWNlUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU5hbWVzcGFjZVJlc3BvbnNlIgAScAoPUmVuYW1lTmFtZXNwYWNlEiwud2cuY29zbW8ucGxhdGZvcm0udjEuUmVuYW1lTmFtZXNwYWNlUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbmFtZU5hbWVzcGFjZVJlc3BvbnNlIgASagoNR2V0TmFtZXNwYWNlcxIqLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZXNSZXF1ZXN0Gisud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlc1Jlc3BvbnNlIgASZwoMR2V0TmFtZXNwYWNlEikud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlUmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZVJlc3BvbnNlIgASZwoMR2V0V29ya3NwYWNlEikud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0V29ya3NwYWNlUmVxdWVzdBoqLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFdvcmtzcGFjZVJlc3BvbnNlIgASbQoOQ3JlYXRlQ29udHJhY3QSKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVDb250cmFjdFJlcXVlc3QaLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVDb250cmFjdFJlc3BvbnNlIgASbQoOVXBkYXRlQ29udHJhY3QSKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVDb250cmFjdFJlcXVlc3QaLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVDb250cmFjdFJlc3BvbnNlIgASZwoSTW92ZUZlZGVyYXRlZEdyYXBoEiYud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVxdWVzdBonLndnLmNvc21vLnBsYXRmb3JtLnYxLk1vdmVHcmFwaFJlc3BvbnNlIgASYQoMTW92ZVN1YmdyYXBoEiYud2cuY29zbW8ucGxhdGZvcm0udjEuTW92ZUdyYXBoUmVxdWVzdBonLndnLmNvc21vLnBsYXRmb3JtLnYxLk1vdmVHcmFwaFJlc3BvbnNlIgASYgoNTW92ZU1vbm9ncmFwaBImLndnLmNvc21vLnBsYXRmb3JtLnYxLk1vdmVHcmFwaFJlcXVlc3QaJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Nb3ZlR3JhcGhSZXNwb25zZSIAEnAKD0NyZWF0ZU1vbm9ncmFwaBIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU1vbm9ncmFwaFJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVNb25vZ3JhcGhSZXNwb25zZSIAEnMKEFB1Ymxpc2hNb25vZ3JhcGgSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoTW9ub2dyYXBoUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hNb25vZ3JhcGhSZXNwb25zZSIAEnAKD0RlbGV0ZU1vbm9ncmFwaBIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU1vbm9ncmFwaFJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVNb25vZ3JhcGhSZXNwb25zZSIAEnAKD1VwZGF0ZU1vbm9ncmFwaBIsLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU1vbm9ncmFwaFJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVNb25vZ3JhcGhSZXNwb25zZSIAEnMKEE1pZ3JhdGVNb25vZ3JhcGgSLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5NaWdyYXRlTW9ub2dyYXBoUmVxdWVzdBouLndnLmNvc21vLnBsYXRmb3JtLnYxLk1pZ3JhdGVNb25vZ3JhcGhSZXNwb25zZSIAEogBChdDcmVhdGVGZWRlcmF0ZWRTdWJncmFwaBI0LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZFN1YmdyYXBoUmVzcG9uc2UiABKLAQoYUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoEjUud2cuY29zbW8ucGxhdGZvcm0udjEuUHVibGlzaEZlZGVyYXRlZFN1YmdyYXBoUmVxdWVzdBo2LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlIgASjgEKGVB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHMSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdWJsaXNoRmVkZXJhdGVkU3ViZ3JhcGhzUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hGZWRlcmF0ZWRTdWJncmFwaHNSZXNwb25zZSIAEosBChhHZXRCYXRjaFB1Ymxpc2hKb2JTdGF0dXMSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCYXRjaFB1Ymxpc2hKb2JTdGF0dXNSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QmF0Y2hQdWJsaXNoSm9iU3RhdHVzUmVzcG9uc2UiABJ/ChRDcmVhdGVGZWRlcmF0ZWRHcmFwaBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZEdyYXBoUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZEdyYXBoUmVzcG9uc2UiABJ/ChREZWxldGVGZWRlcmF0ZWRHcmFwaBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlZGVyYXRlZEdyYXBoUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUZlZGVyYXRlZEdyYXBoUmVzcG9uc2UiABKIAQoXRGVsZXRlRmVkZXJhdGVkU3ViZ3JhcGgSNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVGZWRlcmF0ZWRTdWJncmFwaFJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVGZWRlcmF0ZWRTdWJncmFwaFJlc3BvbnNlIgASfAoTQ2hlY2tTdWJncmFwaFNjaGVtYRIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrU3ViZ3JhcGhTY2hlbWFSZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tTdWJncmFwaFNjaGVtYVJlc3BvbnNlIgASqQEKIkdldFByb3Bvc2VkU2NoZW1hT2ZDaGVja2VkU3ViZ3JhcGgSPy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQcm9wb3NlZFNjaGVtYU9mQ2hlY2tlZFN1YmdyYXBoUmVxdWVzdBpALndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2VkU2NoZW1hT2ZDaGVja2VkU3ViZ3JhcGhSZXNwb25zZSIAEnYKEUZpeFN1YmdyYXBoU2NoZW1hEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuRml4U3ViZ3JhcGhTY2hlbWFSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRml4U3ViZ3JhcGhTY2hlbWFSZXNwb25zZSIAEn8KFFVwZGF0ZUZlZGVyYXRlZEdyYXBoEjEud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlRmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEm0KDlVwZGF0ZVN1YmdyYXBoEisud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlU3ViZ3JhcGhSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlU3ViZ3JhcGhSZXNwb25zZSIAEnwKE0NoZWNrRmVkZXJhdGVkR3JhcGgSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DaGVja0ZlZGVyYXRlZEdyYXBoUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrRmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAElUKBldob0FtSRIjLndnLmNvc21vLnBsYXRmb3JtLnYxLldob0FtSVJlcXVlc3QaJC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5XaG9BbUlSZXNwb25zZSIAEnwKE0dlbmVyYXRlUm91dGVyVG9rZW4SMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZW5lcmF0ZVJvdXRlclRva2VuUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdlbmVyYXRlUm91dGVyVG9rZW5SZXNwb25zZSIAEnAKD0dldFJvdXRlclRva2VucxIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFJvdXRlclRva2Vuc1JlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRSb3V0ZXJUb2tlbnNSZXNwb25zZSIAEnYKEURlbGV0ZVJvdXRlclRva2VuEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlUm91dGVyVG9rZW5SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlUm91dGVyVG9rZW5SZXNwb25zZSIAEpEBChpQdWJsaXNoUGVyc2lzdGVkT3BlcmF0aW9ucxI3LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLlB1Ymxpc2hQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2UiABKdAQoeQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljEjsud2cuY29zbW8ucGxhdGZvcm0udjEuQ2hlY2tQZXJzaXN0ZWRPcGVyYXRpb25UcmFmZmljUmVxdWVzdBo8LndnLmNvc21vLnBsYXRmb3JtLnYxLkNoZWNrUGVyc2lzdGVkT3BlcmF0aW9uVHJhZmZpY1Jlc3BvbnNlIgASiwEKGERlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvbhI1LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVBlcnNpc3RlZE9wZXJhdGlvblJlcXVlc3QaNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVQZXJzaXN0ZWRPcGVyYXRpb25SZXNwb25zZSIAEoUBChZHZXRQZXJzaXN0ZWRPcGVyYXRpb25zEjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVyc2lzdGVkT3BlcmF0aW9uc1JlcXVlc3QaNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQZXJzaXN0ZWRPcGVyYXRpb25zUmVzcG9uc2UiABJnCgxHZXRBdWRpdExvZ3MSKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBdWRpdExvZ3NSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QXVkaXRMb2dzUmVzcG9uc2UiABJ8ChNJbml0aWFsaXplQ29zbW9Vc2VyEjAud2cuY29zbW8ucGxhdGZvcm0udjEuSW5pdGlhbGl6ZUNvc21vVXNlclJlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Jbml0aWFsaXplQ29zbW9Vc2VyUmVzcG9uc2UiABJ2ChFMaXN0T3JnYW5pemF0aW9ucxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPcmdhbml6YXRpb25zUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPcmdhbml6YXRpb25zUmVzcG9uc2UiABJ5ChJHZXRGZWRlcmF0ZWRHcmFwaHMSLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaHNSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhzUmVzcG9uc2UiABKpAQoiR2V0RmVkZXJhdGVkR3JhcGhzQnlTdWJncmFwaExhYmVscxI/LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoc0J5U3ViZ3JhcGhMYWJlbHNSZXF1ZXN0GkAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhzQnlTdWJncmFwaExhYmVsc1Jlc3BvbnNlIgASiAEKF0dldEZlZGVyYXRlZEdyYXBoQnlOYW1lEjQud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhCeU5hbWVSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVkZXJhdGVkR3JhcGhCeU5hbWVSZXNwb25zZSIAEpEBChpHZXRGZWRlcmF0ZWRHcmFwaFNETEJ5TmFtZRI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoU0RMQnlOYW1lUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoU0RMQnlOYW1lUmVzcG9uc2UiABJnCgxHZXRTdWJncmFwaHMSKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaHNSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhzUmVzcG9uc2UiABJ2ChFHZXRTdWJncmFwaEJ5TmFtZRIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlOYW1lUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlOYW1lUmVzcG9uc2UiABKsAQojR2V0U3ViZ3JhcGhTRExGcm9tTGF0ZXN0Q29tcG9zaXRpb24SQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvblJlcXVlc3QaQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaFNETEZyb21MYXRlc3RDb21wb3NpdGlvblJlc3BvbnNlIgASfwoUR2V0TGF0ZXN0U3ViZ3JhcGhTREwSMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRMYXRlc3RTdWJncmFwaFNETFJlcXVlc3QaMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRMYXRlc3RTdWJncmFwaFNETFJlc3BvbnNlIgASmgEKHUdldENoZWNrc0J5RmVkZXJhdGVkR3JhcGhOYW1lEjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVSZXF1ZXN0Gjsud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hlY2tzQnlGZWRlcmF0ZWRHcmFwaE5hbWVSZXNwb25zZSIAEnAKD0dldENoZWNrU3VtbWFyeRIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrU3VtbWFyeVJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja1N1bW1hcnlSZXNwb25zZSIAEnkKEkdldENoZWNrT3BlcmF0aW9ucxIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoZWNrT3BlcmF0aW9uc1JlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDaGVja09wZXJhdGlvbnNSZXNwb25zZSIAEnYKEUZvcmNlQ2hlY2tTdWNjZXNzEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuRm9yY2VDaGVja1N1Y2Nlc3NSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRm9yY2VDaGVja1N1Y2Nlc3NSZXNwb25zZSIAEosBChhDcmVhdGVPcGVyYXRpb25PdmVycmlkZXMSNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcGVyYXRpb25PdmVycmlkZXNSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3BlcmF0aW9uT3ZlcnJpZGVzUmVzcG9uc2UiABKLAQoYUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzEjUud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBo2LndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZU9wZXJhdGlvbk92ZXJyaWRlc1Jlc3BvbnNlIgASowEKIENyZWF0ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlEj0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXF1ZXN0Gj4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3BlcmF0aW9uSWdub3JlQWxsT3ZlcnJpZGVSZXNwb25zZSIAEqMBCiBSZW1vdmVPcGVyYXRpb25JZ25vcmVBbGxPdmVycmlkZRI9LndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlUmVxdWVzdBo+LndnLmNvc21vLnBsYXRmb3JtLnYxLlJlbW92ZU9wZXJhdGlvbklnbm9yZUFsbE92ZXJyaWRlUmVzcG9uc2UiABKCAQoVR2V0T3BlcmF0aW9uT3ZlcnJpZGVzEjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uT3ZlcnJpZGVzUmVxdWVzdBozLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbk92ZXJyaWRlc1Jlc3BvbnNlIgAScAoPR2V0QWxsT3ZlcnJpZGVzEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QWxsT3ZlcnJpZGVzUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEFsbE92ZXJyaWRlc1Jlc3BvbnNlIgASsgEKJVRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnMSQi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Ub2dnbGVDaGFuZ2VPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVxdWVzdBpDLndnLmNvc21vLnBsYXRmb3JtLnYxLlRvZ2dsZUNoYW5nZU92ZXJyaWRlc0ZvckFsbE9wZXJhdGlvbnNSZXNwb25zZSIAErIBCiVDcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zEkIud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlSWdub3JlT3ZlcnJpZGVzRm9yQWxsT3BlcmF0aW9uc1JlcXVlc3QaQy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVJZ25vcmVPdmVycmlkZXNGb3JBbGxPcGVyYXRpb25zUmVzcG9uc2UiABJ8ChNHZXRPcGVyYXRpb25Db250ZW50EjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uQ29udGVudFJlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25Db250ZW50UmVzcG9uc2UiABKRAQoaR2V0RmVkZXJhdGVkR3JhcGhDaGFuZ2Vsb2cSNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ1JlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaENoYW5nZWxvZ1Jlc3BvbnNlIgASjgEKGUNyZWF0ZUZlZGVyYXRlZEdyYXBoVG9rZW4SNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVGZWRlcmF0ZWRHcmFwaFRva2VuUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUZlZGVyYXRlZEdyYXBoVG9rZW5SZXNwb25zZSIAEoIBChVHZXRPcmdhbml6YXRpb25CeVNsdWcSMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25CeVNsdWdSZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uQnlTbHVnUmVzcG9uc2UiABKFAQoWR2V0T3JnYW5pemF0aW9uTWVtYmVycxIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbk1lbWJlcnNSZXF1ZXN0GjQud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uTWVtYmVyc1Jlc3BvbnNlIgASmgEKHUdldFBlbmRpbmdPcmdhbml6YXRpb25NZW1iZXJzEjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnNSZXF1ZXN0Gjsud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UGVuZGluZ09yZ2FuaXphdGlvbk1lbWJlcnNSZXNwb25zZSIAEn8KFElzTWVtYmVyTGltaXRSZWFjaGVkEjEud2cuY29zbW8ucGxhdGZvcm0udjEuSXNNZW1iZXJMaW1pdFJlYWNoZWRSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuSXNNZW1iZXJMaW1pdFJlYWNoZWRSZXNwb25zZSIAEmEKCkludml0ZVVzZXISJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5JbnZpdGVVc2VyUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkludml0ZVVzZXJSZXNwb25zZSIAEmQKC0ludml0ZVVzZXJzEigud2cuY29zbW8ucGxhdGZvcm0udjEuSW52aXRlVXNlcnNSZXF1ZXN0Gikud2cuY29zbW8ucGxhdGZvcm0udjEuSW52aXRlVXNlcnNSZXNwb25zZSIAEmEKCkdldEFQSUtleXMSJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRBUElLZXlzUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEFQSUtleXNSZXNwb25zZSIAEmcKDENyZWF0ZUFQSUtleRIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUFQSUtleVJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVBUElLZXlSZXNwb25zZSIAEmcKDFVwZGF0ZUFQSUtleRIpLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZUFQSUtleVJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVBUElLZXlSZXNwb25zZSIAEmcKDERlbGV0ZUFQSUtleRIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUFQSUtleVJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVBUElLZXlSZXNwb25zZSIAEosBChhSZW1vdmVPcmdhbml6YXRpb25NZW1iZXISNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVPcmdhbml6YXRpb25NZW1iZXJSZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlT3JnYW5pemF0aW9uTWVtYmVyUmVzcG9uc2UiABJzChBSZW1vdmVJbnZpdGF0aW9uEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVtb3ZlSW52aXRhdGlvblJlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZW1vdmVJbnZpdGF0aW9uUmVzcG9uc2UiABJ2ChFNaWdyYXRlRnJvbUFwb2xsbxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLk1pZ3JhdGVGcm9tQXBvbGxvUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLk1pZ3JhdGVGcm9tQXBvbGxvUmVzcG9uc2UiABKIAQoXQ3JlYXRlT3JnYW5pemF0aW9uR3JvdXASNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25Hcm91cFJlc3BvbnNlIgASggEKFUdldE9yZ2FuaXphdGlvbkdyb3VwcxIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkdyb3Vwc1JlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cHNSZXNwb25zZSIAEpQBChtHZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnMSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Hcm91cE1lbWJlcnNSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uR3JvdXBNZW1iZXJzUmVzcG9uc2UiABKIAQoXVXBkYXRlT3JnYW5pemF0aW9uR3JvdXASNC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25Hcm91cFJlcXVlc3QaNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25Hcm91cFJlc3BvbnNlIgASiAEKF0RlbGV0ZU9yZ2FuaXphdGlvbkdyb3VwEjQud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uR3JvdXBSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uR3JvdXBSZXNwb25zZSIAEqABCh9DcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnEjwud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QaPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2UiABKaAQodR2V0T3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ3MSOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlnc1JlcXVlc3QaOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25XZWJob29rQ29uZmlnc1Jlc3BvbnNlIgASkQEKGkdldE9yZ2FuaXphdGlvbldlYmhvb2tNZXRhEjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va01ldGFSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va01ldGFSZXNwb25zZSIAEqABCh9VcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnEjwud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1JlcXVlc3QaPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25XZWJob29rQ29uZmlnUmVzcG9uc2UiABKgAQofRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZxI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU9yZ2FuaXphdGlvbldlYmhvb2tDb25maWdSZXF1ZXN0Gj0ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT3JnYW5pemF0aW9uV2ViaG9va0NvbmZpZ1Jlc3BvbnNlIgASmgEKHUdldE9yZ2FuaXphdGlvbldlYmhvb2tIaXN0b3J5Ejoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnlSZXF1ZXN0Gjsud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uV2ViaG9va0hpc3RvcnlSZXNwb25zZSIAEo4BChlHZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzEjYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0V2ViaG9va0RlbGl2ZXJ5RGV0YWlsc1JlcXVlc3QaNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRXZWJob29rRGVsaXZlcnlEZXRhaWxzUmVzcG9uc2UiABJzChBSZWRlbGl2ZXJXZWJob29rEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuUmVkZWxpdmVyV2ViaG9va1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZWRlbGl2ZXJXZWJob29rUmVzcG9uc2UiABJ2ChFDcmVhdGVJbnRlZ3JhdGlvbhIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUludGVncmF0aW9uUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZUludGVncmF0aW9uUmVzcG9uc2UiABKUAQobR2V0T3JnYW5pemF0aW9uSW50ZWdyYXRpb25zEjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uSW50ZWdyYXRpb25zUmVxdWVzdBo5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvbkludGVncmF0aW9uc1Jlc3BvbnNlIgASiAEKF1VwZGF0ZUludGVncmF0aW9uQ29uZmlnEjQud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlSW50ZWdyYXRpb25Db25maWdSZXF1ZXN0GjUud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlSW50ZWdyYXRpb25Db25maWdSZXNwb25zZSIAEnYKEURlbGV0ZUludGVncmF0aW9uEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlSW50ZWdyYXRpb25SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlSW50ZWdyYXRpb25SZXNwb25zZSIAEmEKCkRlbGV0ZVVzZXISJy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVVc2VyUmVxdWVzdBooLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZVVzZXJSZXNwb25zZSIAEnkKEkRlbGV0ZU9yZ2FuaXphdGlvbhIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZU9yZ2FuaXphdGlvblJlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPcmdhbml6YXRpb25SZXNwb25zZSIAEnwKE1Jlc3RvcmVPcmdhbml6YXRpb24SMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5SZXN0b3JlT3JnYW5pemF0aW9uUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlc3RvcmVPcmdhbml6YXRpb25SZXNwb25zZSIAEnYKEUxlYXZlT3JnYW5pemF0aW9uEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuTGVhdmVPcmdhbml6YXRpb25SZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuTGVhdmVPcmdhbml6YXRpb25SZXNwb25zZSIAEo4BChlVcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzEjYud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnYW5pemF0aW9uRGV0YWlsc1JlcXVlc3QaNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVPcmdhbml6YXRpb25EZXRhaWxzUmVzcG9uc2UiABJ/ChRVcGRhdGVPcmdNZW1iZXJHcm91cBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ01lbWJlckdyb3VwUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ01lbWJlckdyb3VwUmVzcG9uc2UiABJ/ChRJc0dpdEh1YkFwcEluc3RhbGxlZBIxLndnLmNvc21vLnBsYXRmb3JtLnYxLklzR2l0SHViQXBwSW5zdGFsbGVkUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLklzR2l0SHViQXBwSW5zdGFsbGVkUmVzcG9uc2UiABJ5ChJDcmVhdGVPSURDUHJvdmlkZXISLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPSURDUHJvdmlkZXJSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT0lEQ1Byb3ZpZGVyUmVzcG9uc2UiABJwCg9HZXRPSURDUHJvdmlkZXISLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPSURDUHJvdmlkZXJSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T0lEQ1Byb3ZpZGVyUmVzcG9uc2UiABJ2ChFMaXN0T0lEQ1Byb3ZpZGVycxIuLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPSURDUHJvdmlkZXJzUmVxdWVzdBovLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RPSURDUHJvdmlkZXJzUmVzcG9uc2UiABJ5ChJEZWxldGVPSURDUHJvdmlkZXISLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVPSURDUHJvdmlkZXJSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlT0lEQ1Byb3ZpZGVyUmVzcG9uc2UiABJzChBVcGRhdGVJRFBNYXBwZXJzEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlSURQTWFwcGVyc1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVJRFBNYXBwZXJzUmVzcG9uc2UiABJhCgpHZXRDbGllbnRzEicud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2xpZW50c1JlcXVlc3QaKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDbGllbnRzUmVzcG9uc2UiABJ8ChNQcmV2aWV3RGVsZXRlQ2xpZW50EjAud2cuY29zbW8ucGxhdGZvcm0udjEuUHJldmlld0RlbGV0ZUNsaWVudFJlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QcmV2aWV3RGVsZXRlQ2xpZW50UmVzcG9uc2UiABJnCgxEZWxldGVDbGllbnQSKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVDbGllbnRSZXF1ZXN0Gioud2cuY29zbW8ucGxhdGZvcm0udjEuRGVsZXRlQ2xpZW50UmVzcG9uc2UiABJhCgpHZXRSb3V0ZXJzEicud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Um91dGVyc1JlcXVlc3QaKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRSb3V0ZXJzUmVzcG9uc2UiABJtCg5HZXRJbnZpdGF0aW9ucxIrLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEludml0YXRpb25zUmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEludml0YXRpb25zUmVzcG9uc2UiABKOAQoZQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvbhI2LndnLmNvc21vLnBsYXRmb3JtLnYxLkFjY2VwdE9yRGVjbGluZUludml0YXRpb25SZXF1ZXN0Gjcud2cuY29zbW8ucGxhdGZvcm0udjEuQWNjZXB0T3JEZWNsaW5lSW52aXRhdGlvblJlc3BvbnNlIgAScAoPR2V0Q29tcG9zaXRpb25zEiwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q29tcG9zaXRpb25zUmVxdWVzdBotLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENvbXBvc2l0aW9uc1Jlc3BvbnNlIgASggEKFUdldENvbXBvc2l0aW9uRGV0YWlscxIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENvbXBvc2l0aW9uRGV0YWlsc1JlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRDb21wb3NpdGlvbkRldGFpbHNSZXNwb25zZSIAEoIBChVHZXRTZGxCeVNjaGVtYVZlcnNpb24SMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTZGxCeVNjaGVtYVZlcnNpb25SZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U2RsQnlTY2hlbWFWZXJzaW9uUmVzcG9uc2UiABKUAQobR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uEjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2hhbmdlbG9nQnlTY2hlbWFWZXJzaW9uUmVxdWVzdBo5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENoYW5nZWxvZ0J5U2NoZW1hVmVyc2lvblJlc3BvbnNlIgASkQEKGkdldFVzZXJBY2Nlc3NpYmxlUmVzb3VyY2VzEjcud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVSZXNvdXJjZXNSZXNwb25zZSIAEoIBChVVcGRhdGVGZWF0dXJlU2V0dGluZ3MSMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWF0dXJlU2V0dGluZ3NSZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlRmVhdHVyZVNldHRpbmdzUmVzcG9uc2UiABJ5ChJHZXRTdWJncmFwaE1lbWJlcnMSLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1lbWJlcnNSZXF1ZXN0GjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhNZW1iZXJzUmVzcG9uc2UiABJeCglBZGRSZWFkbWUSJi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5BZGRSZWFkbWVSZXF1ZXN0Gicud2cuY29zbW8ucGxhdGZvcm0udjEuQWRkUmVhZG1lUmVzcG9uc2UiABKXAQocR2V0VXNlckFjY2Vzc2libGVQZXJtaXNzaW9ucxI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFVzZXJBY2Nlc3NpYmxlUGVybWlzc2lvbnNSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VXNlckFjY2Vzc2libGVQZXJtaXNzaW9uc1Jlc3BvbnNlIgASdgoRQ3JlYXRlRmVhdHVyZUZsYWcSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVGZWF0dXJlRmxhZ1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASdgoRRGVsZXRlRmVhdHVyZUZsYWcSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVGZWF0dXJlRmxhZ1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5EZWxldGVGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASdgoRVXBkYXRlRmVhdHVyZUZsYWcSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWF0dXJlRmxhZ1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGRhdGVGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASdgoRRW5hYmxlRmVhdHVyZUZsYWcSLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVGZWF0dXJlRmxhZ1JlcXVlc3QaLy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASdgoQR2V0QW5hbHl0aWNzVmlldxItLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEFuYWx5dGljc1ZpZXdSZXF1ZXN0Gi4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0QW5hbHl0aWNzVmlld1Jlc3BvbnNlIgOQAgESkQEKGUdldERhc2hib2FyZEFuYWx5dGljc1ZpZXcSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXREYXNoYm9hcmRBbmFseXRpY3NWaWV3UmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldERhc2hib2FyZEFuYWx5dGljc1ZpZXdSZXNwb25zZSIDkAIBElsKCEdldFRyYWNlEiUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VHJhY2VSZXF1ZXN0GiYud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0VHJhY2VSZXNwb25zZSIAEnMKD0dldEdyYXBoTWV0cmljcxIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEdyYXBoTWV0cmljc1JlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRHcmFwaE1ldHJpY3NSZXNwb25zZSIDkAIBEn8KE0dldE1ldHJpY3NFcnJvclJhdGUSMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRNZXRyaWNzRXJyb3JSYXRlUmVxdWVzdBoxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE1ldHJpY3NFcnJvclJhdGVSZXNwb25zZSIDkAIBEnwKEkdldFN1YmdyYXBoTWV0cmljcxIvLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoTWV0cmljc1JlcXVlc3QaMC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1ldHJpY3NSZXNwb25zZSIDkAIBEpcBChtHZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGUSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaE1ldHJpY3NFcnJvclJhdGVSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0U3ViZ3JhcGhNZXRyaWNzRXJyb3JSYXRlUmVzcG9uc2UiA5ACARJtCg1HZXRGaWVsZFVzYWdlEioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmllbGRVc2FnZVJlcXVlc3QaKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGaWVsZFVzYWdlUmVzcG9uc2UiA5ACARKXAQocR2V0T3JnYW5pemF0aW9uUmVxdWVzdHNDb3VudBI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9yZ2FuaXphdGlvblJlcXVlc3RzQ291bnRSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uUmVxdWVzdHNDb3VudFJlc3BvbnNlIgASeQoSQ3JlYXRlT3JnYW5pemF0aW9uEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT3JnYW5pemF0aW9uUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZU9yZ2FuaXphdGlvblJlc3BvbnNlIgASlwEKHEVuYWJsZUxpbnRpbmdGb3JUaGVOYW1lc3BhY2USOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5FbmFibGVMaW50aW5nRm9yVGhlTmFtZXNwYWNlUmVxdWVzdBo6LndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUxpbnRpbmdGb3JUaGVOYW1lc3BhY2VSZXNwb25zZSIAEpcBChxDb25maWd1cmVOYW1lc3BhY2VMaW50Q29uZmlnEjkud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlTmFtZXNwYWNlTGludENvbmZpZ1JlcXVlc3QaOi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VMaW50Q29uZmlnUmVzcG9uc2UiABKFAQoWR2V0TmFtZXNwYWNlTGludENvbmZpZxIzLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZUxpbnRDb25maWdSZXF1ZXN0GjQud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlTGludENvbmZpZ1Jlc3BvbnNlIgASmQEKGEdldE5hbWVzcGFjZUNoZWNrc0NvbmZpZxI8LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZUNoZWNrc0NvbmZpZ3VyYXRpb25SZXF1ZXN0Gj0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlc3BvbnNlIgASogEKG1VwZGF0ZU5hbWVzcGFjZUNoZWNrc0NvbmZpZxI/LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU5hbWVzcGFjZUNoZWNrc0NvbmZpZ3VyYXRpb25SZXF1ZXN0GkAud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTmFtZXNwYWNlQ2hlY2tzQ29uZmlndXJhdGlvblJlc3BvbnNlIgASeQoSRW5hYmxlR3JhcGhQcnVuaW5nEi8ud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlR3JhcGhQcnVuaW5nUmVxdWVzdBowLndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZUdyYXBoUHJ1bmluZ1Jlc3BvbnNlIgASrwEKJENvbmZpZ3VyZU5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZxJBLndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbmZpZ3VyZU5hbWVzcGFjZUdyYXBoUHJ1bmluZ0NvbmZpZ1JlcXVlc3QaQi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db25maWd1cmVOYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXNwb25zZSIAEp0BCh5HZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWcSOy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXROYW1lc3BhY2VHcmFwaFBydW5pbmdDb25maWdSZXF1ZXN0Gjwud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0TmFtZXNwYWNlR3JhcGhQcnVuaW5nQ29uZmlnUmVzcG9uc2UiABJwCg9HZXRGZWF0dXJlRmxhZ3MSLC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlRmxhZ3NSZXF1ZXN0Gi0ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZUZsYWdzUmVzcG9uc2UiABJ/ChRHZXRGZWF0dXJlRmxhZ0J5TmFtZRIxLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnQnlOYW1lUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnQnlOYW1lUmVzcG9uc2UiABKjAQogR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVhdHVyZUZsYWcSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWF0dXJlRmxhZ1JlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWF0dXJlRmxhZ1Jlc3BvbnNlIgASfAoTR2V0RmVhdHVyZVN1YmdyYXBocxIwLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVTdWJncmFwaHNSZXF1ZXN0GjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0RmVhdHVyZVN1YmdyYXBoc1Jlc3BvbnNlIgASoAEKH0dldEZlYXR1cmVGbGFnc0J5RmVkZXJhdGVkR3JhcGgSPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlRmxhZ3NCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBo9LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc0J5RmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEtkBCjJHZXRGZWF0dXJlRmxhZ3NJbkxhdGVzdENvbXBvc2l0aW9uQnlGZWRlcmF0ZWRHcmFwaBJPLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBpQLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlYXR1cmVGbGFnc0luTGF0ZXN0Q29tcG9zaXRpb25CeUZlZGVyYXRlZEdyYXBoUmVzcG9uc2UiABKsAQojR2V0RmVhdHVyZVN1YmdyYXBoc0J5RmVkZXJhdGVkR3JhcGgSQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaFJlcXVlc3QaQS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWF0dXJlU3ViZ3JhcGhzQnlGZWRlcmF0ZWRHcmFwaFJlc3BvbnNlIgASggEKFUdldEZlZGVyYXRlZEdyYXBoQnlJZBIyLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEZlZGVyYXRlZEdyYXBoQnlJZFJlcXVlc3QaMy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRGZWRlcmF0ZWRHcmFwaEJ5SWRSZXNwb25zZSIAEnAKD0dldFN1YmdyYXBoQnlJZBIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFN1YmdyYXBoQnlJZFJlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaEJ5SWRSZXNwb25zZSIAEosBChhQdXNoQ2FjaGVXYXJtZXJPcGVyYXRpb24SNS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5QdXNoQ2FjaGVXYXJtZXJPcGVyYXRpb25SZXF1ZXN0GjYud2cuY29zbW8ucGxhdGZvcm0udjEuUHVzaENhY2hlV2FybWVyT3BlcmF0aW9uUmVzcG9uc2UiABKLAQoYR2V0Q2FjaGVXYXJtZXJPcGVyYXRpb25zEjUud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2FjaGVXYXJtZXJPcGVyYXRpb25zUmVxdWVzdBo2LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENhY2hlV2FybWVyT3BlcmF0aW9uc1Jlc3BvbnNlIgASlwEKHENvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnMSOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5Db21wdXRlQ2FjaGVXYXJtZXJPcGVyYXRpb25zUmVxdWVzdBo6LndnLmNvc21vLnBsYXRmb3JtLnYxLkNvbXB1dGVDYWNoZVdhcm1lck9wZXJhdGlvbnNSZXNwb25zZSIAEn8KFENvbmZpZ3VyZUNhY2hlV2FybWVyEjEud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlQ2FjaGVXYXJtZXJSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlQ2FjaGVXYXJtZXJSZXNwb25zZSIAEn8KFEdldENhY2hlV2FybWVyQ29uZmlnEjEud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2FjaGVXYXJtZXJDb25maWdSZXF1ZXN0GjIud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0Q2FjaGVXYXJtZXJDb25maWdSZXNwb25zZSIAEpEBChpEZWxldGVDYWNoZVdhcm1lck9wZXJhdGlvbhI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkRlbGV0ZUNhY2hlV2FybWVyT3BlcmF0aW9uUmVzcG9uc2UiABKjAQogR2V0U3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNDb25maWcSPS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaENoZWNrRXh0ZW5zaW9uc0NvbmZpZ1JlcXVlc3QaPi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRTdWJncmFwaENoZWNrRXh0ZW5zaW9uc0NvbmZpZ1Jlc3BvbnNlIgASowEKIENvbmZpZ3VyZVN1YmdyYXBoQ2hlY2tFeHRlbnNpb25zEj0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNSZXF1ZXN0Gj4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlU3ViZ3JhcGhDaGVja0V4dGVuc2lvbnNSZXNwb25zZSIAEnAKD0dldEJpbGxpbmdQbGFucxIsLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldEJpbGxpbmdQbGFuc1JlcXVlc3QaLS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRCaWxsaW5nUGxhbnNSZXNwb25zZSIAEoIBChVDcmVhdGVDaGVja291dFNlc3Npb24SMi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVDaGVja291dFNlc3Npb25SZXF1ZXN0GjMud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlQ2hlY2tvdXRTZXNzaW9uUmVzcG9uc2UiABKRAQoaQ3JlYXRlQmlsbGluZ1BvcnRhbFNlc3Npb24SNy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvblJlcXVlc3QaOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVCaWxsaW5nUG9ydGFsU2Vzc2lvblJlc3BvbnNlIgASZAoLVXBncmFkZVBsYW4SKC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGdyYWRlUGxhblJlcXVlc3QaKS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5VcGdyYWRlUGxhblJlc3BvbnNlIgASoAEKH0xpc3RSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvbnMSPC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaXN0Um91dGVyQ29tcGF0aWJpbGl0eVZlcnNpb25zUmVxdWVzdBo9LndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3RSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvbnNSZXNwb25zZSIAEqkBCiJTZXRHcmFwaFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uEj8ud2cuY29zbW8ucGxhdGZvcm0udjEuU2V0R3JhcGhSb3V0ZXJDb21wYXRpYmlsaXR5VmVyc2lvblJlcXVlc3QaQC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5TZXRHcmFwaFJvdXRlckNvbXBhdGliaWxpdHlWZXJzaW9uUmVzcG9uc2UiABJtCg5DcmVhdGVQcm9wb3NhbBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZVByb3Bvc2FsUmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLkNyZWF0ZVByb3Bvc2FsUmVzcG9uc2UiABJkCgtHZXRQcm9wb3NhbBIoLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2FsUmVxdWVzdBopLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2FsUmVzcG9uc2UiABJtCg5VcGRhdGVQcm9wb3NhbBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZVByb3Bvc2FsUmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZVByb3Bvc2FsUmVzcG9uc2UiABKUAQobRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlEjgud2cuY29zbW8ucGxhdGZvcm0udjEuRW5hYmxlUHJvcG9zYWxzRm9yTmFtZXNwYWNlUmVxdWVzdBo5LndnLmNvc21vLnBsYXRmb3JtLnYxLkVuYWJsZVByb3Bvc2Fsc0Zvck5hbWVzcGFjZVJlc3BvbnNlIgASowEKIENvbmZpZ3VyZU5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnEj0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXF1ZXN0Gj4ud2cuY29zbW8ucGxhdGZvcm0udjEuQ29uZmlndXJlTmFtZXNwYWNlUHJvcG9zYWxDb25maWdSZXNwb25zZSIAEpEBChpHZXROYW1lc3BhY2VQcm9wb3NhbENvbmZpZxI3LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVxdWVzdBo4LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE5hbWVzcGFjZVByb3Bvc2FsQ29uZmlnUmVzcG9uc2UiABKUAQobVXBkYXRlTmFtZXNwYWNlTG9naW5NZXRob2RzEjgud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlTmFtZXNwYWNlTG9naW5NZXRob2RzUmVxdWVzdBo5LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU5hbWVzcGFjZUxvZ2luTWV0aG9kc1Jlc3BvbnNlIgASjgEKGUxpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHMSNi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaXN0TmFtZXNwYWNlTG9naW5NZXRob2RzUmVxdWVzdBo3LndnLmNvc21vLnBsYXRmb3JtLnYxLkxpc3ROYW1lc3BhY2VMb2dpbk1ldGhvZHNSZXNwb25zZSIAEpQBChtHZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHMSOC53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcmdhbml6YXRpb25Mb2dpbk1ldGhvZHNSZXF1ZXN0Gjkud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVzcG9uc2UiABKdAQoeVXBkYXRlT3JnYW5pemF0aW9uTG9naW5NZXRob2RzEjsud2cuY29zbW8ucGxhdGZvcm0udjEuVXBkYXRlT3JnYW5pemF0aW9uTG9naW5NZXRob2RzUmVxdWVzdBo8LndnLmNvc21vLnBsYXRmb3JtLnYxLlVwZGF0ZU9yZ2FuaXphdGlvbkxvZ2luTWV0aG9kc1Jlc3BvbnNlIgASlwEKHEdldFByb3Bvc2Fsc0J5RmVkZXJhdGVkR3JhcGgSOS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRQcm9wb3NhbHNCeUZlZGVyYXRlZEdyYXBoUmVxdWVzdBo6LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldFByb3Bvc2Fsc0J5RmVkZXJhdGVkR3JhcGhSZXNwb25zZSIAEnYKEUdldFByb3Bvc2FsQ2hlY2tzEi4ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxDaGVja3NSZXF1ZXN0Gi8ud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0UHJvcG9zYWxDaGVja3NSZXNwb25zZSIAEmoKDUdldE9wZXJhdGlvbnMSKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25zUmVxdWVzdBorLndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbnNSZXNwb25zZSIAEogBChdHZXRDbGllbnRzRnJvbUFuYWx5dGljcxI0LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENsaWVudHNGcm9tQW5hbHl0aWNzUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldENsaWVudHNGcm9tQW5hbHl0aWNzUmVzcG9uc2UiABJ8ChNHZXRPcGVyYXRpb25DbGllbnRzEjAud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uQ2xpZW50c1JlcXVlc3QaMS53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPcGVyYXRpb25DbGllbnRzUmVzcG9uc2UiABKXAQocR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkcxI5LndnLmNvc21vLnBsYXRmb3JtLnYxLkdldE9wZXJhdGlvbkRlcHJlY2F0ZWRGaWVsZHNSZXF1ZXN0Gjoud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T3BlcmF0aW9uRGVwcmVjYXRlZEZpZWxkc1Jlc3BvbnNlIgASkQEKGlZhbGlkYXRlQW5kRmV0Y2hQbHVnaW5EYXRhEjcud2cuY29zbW8ucGxhdGZvcm0udjEuVmFsaWRhdGVBbmRGZXRjaFBsdWdpbkRhdGFSZXF1ZXN0Gjgud2cuY29zbW8ucGxhdGZvcm0udjEuVmFsaWRhdGVBbmRGZXRjaFBsdWdpbkRhdGFSZXNwb25zZSIAEmcKDExpbmtTdWJncmFwaBIpLndnLmNvc21vLnBsYXRmb3JtLnYxLkxpbmtTdWJncmFwaFJlcXVlc3QaKi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5MaW5rU3ViZ3JhcGhSZXNwb25zZSIAEm0KDlVubGlua1N1YmdyYXBoEisud2cuY29zbW8ucGxhdGZvcm0udjEuVW5saW5rU3ViZ3JhcGhSZXF1ZXN0Giwud2cuY29zbW8ucGxhdGZvcm0udjEuVW5saW5rU3ViZ3JhcGhSZXNwb25zZSIAEogBChdWZXJpZnlBUElLZXlHcmFwaEFjY2VzcxI0LndnLmNvc21vLnBsYXRmb3JtLnYxLlZlcmlmeUFQSUtleUdyYXBoQWNjZXNzUmVxdWVzdBo1LndnLmNvc21vLnBsYXRmb3JtLnYxLlZlcmlmeUFQSUtleUdyYXBoQWNjZXNzUmVzcG9uc2UiABJtCg5SZWNvbXBvc2VHcmFwaBIrLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlY29tcG9zZUdyYXBoUmVxdWVzdBosLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlY29tcG9zZUdyYXBoUmVzcG9uc2UiABJ/ChRSZWNvbXBvc2VGZWF0dXJlRmxhZxIxLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlY29tcG9zZUZlYXR1cmVGbGFnUmVxdWVzdBoyLndnLmNvc21vLnBsYXRmb3JtLnYxLlJlY29tcG9zZUZlYXR1cmVGbGFnUmVzcG9uc2UiABJqCg1HZXRPbmJvYXJkaW5nEioud2cuY29zbW8ucGxhdGZvcm0udjEuR2V0T25ib2FyZGluZ1JlcXVlc3QaKy53Zy5jb3Ntby5wbGF0Zm9ybS52MS5HZXRPbmJvYXJkaW5nUmVzcG9uc2UiABJzChBDcmVhdGVPbmJvYXJkaW5nEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuQ3JlYXRlT25ib2FyZGluZ1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5DcmVhdGVPbmJvYXJkaW5nUmVzcG9uc2UiABJzChBGaW5pc2hPbmJvYXJkaW5nEi0ud2cuY29zbW8ucGxhdGZvcm0udjEuRmluaXNoT25ib2FyZGluZ1JlcXVlc3QaLi53Zy5jb3Ntby5wbGF0Zm9ybS52MS5GaW5pc2hPbmJvYXJkaW5nUmVzcG9uc2UiAGIGcHJvdG8z", [file_wg_cosmo_common_common, file_wg_cosmo_notifications_events]); /** * @generated from message wg.cosmo.platform.v1.Label @@ -11325,6 +11325,11 @@ export type FeatureFlag = Message<"wg.cosmo.platform.v1.FeatureFlag"> & { * @generated from field: string updated_at = 8; */ updatedAt: string; + + /** + * @generated from field: optional bool has_failed_latest_composition = 9; + */ + hasFailedLatestComposition?: boolean | undefined; }; /** diff --git a/controlplane/src/core/bufservices/feature-flag/getFeatureFlagsInLatestCompositionByFederatedGraph.ts b/controlplane/src/core/bufservices/feature-flag/getFeatureFlagsInLatestCompositionByFederatedGraph.ts index e814f1b3ef..e6270e840c 100644 --- a/controlplane/src/core/bufservices/feature-flag/getFeatureFlagsInLatestCompositionByFederatedGraph.ts +++ b/controlplane/src/core/bufservices/feature-flag/getFeatureFlagsInLatestCompositionByFederatedGraph.ts @@ -55,18 +55,10 @@ export function getFeatureFlagsInLatestCompositionByFederatedGraph( throw new UnauthorizedError(); } - if (!federatedGraph.schemaVersionId) { - return { - response: { - code: EnumStatusCode.OK, - }, - featureFlags: [], - }; - } - // Get feature flag IDs from the latest valid composition - const ffsInLatestValidComposition = await featureFlagRepo.getFeatureFlagSchemaVersionsByBaseSchemaVersion({ - baseSchemaVersionId: federatedGraph.schemaVersionId, + const ffsInLatestValidComposition = await featureFlagRepo.getFeatureFlagSchemaVersionsInLatestComposition({ + federatedGraphId: federatedGraph.id, + federatedGraphTargetId: federatedGraph.targetId, }); const featureFlags: FeatureFlagDTO[] = []; @@ -83,7 +75,8 @@ export function getFeatureFlagsInLatestCompositionByFederatedGraph( // A disabled feature flag is no longer served in the latest composition (its router config is // removed without recomposing), so exclude it even though its schema version rows still exist. if (flag && flag.isEnabled) { - featureFlags.push(flag); + // True means the composition reported for this flag is its last successful one, not its latest. + featureFlags.push({ ...flag, hasFailedLatestComposition: ff.hasFailedLatestComposition }); } } } diff --git a/controlplane/src/core/bufservices/federated-graph/getCompositionDetails.ts b/controlplane/src/core/bufservices/federated-graph/getCompositionDetails.ts index 0df570fcb2..c9fe72a381 100644 --- a/controlplane/src/core/bufservices/federated-graph/getCompositionDetails.ts +++ b/controlplane/src/core/bufservices/federated-graph/getCompositionDetails.ts @@ -58,11 +58,22 @@ export function getCompositionDetails( }; } - if (composition.targetId) { - const graph = await fedRepo.byTargetId(composition.targetId); - if (graph && !authContext.rbac.hasFederatedGraphReadAccess(graph)) { - throw new UnauthorizedError(); - } + // A composition is always tied to a federated graph (its target is only nulled once the graph is deleted), so an + // unresolvable graph means the composition is orphaned — treat it as not found rather than serving it without an + // authorization check. + const graph = composition.targetId ? await fedRepo.byTargetId(composition.targetId) : undefined; + if (!graph) { + return { + response: { + code: EnumStatusCode.ERR_NOT_FOUND, + details: `Federated graph for composition '${req.compositionId}' not found`, + }, + compositionSubgraphs: [], + featureFlagCompositions: [], + }; + } + if (!authContext.rbac.hasFederatedGraphReadAccess(graph)) { + throw new UnauthorizedError(); } const compositionSubgraphs = await compositionRepo.getCompositionSubgraphs({ diff --git a/controlplane/src/core/bufservices/federated-graph/getFederatedGraphById.ts b/controlplane/src/core/bufservices/federated-graph/getFederatedGraphById.ts index de4b44b2f9..a045c9bda5 100644 --- a/controlplane/src/core/bufservices/federated-graph/getFederatedGraphById.ts +++ b/controlplane/src/core/bufservices/federated-graph/getFederatedGraphById.ts @@ -73,16 +73,15 @@ export function getFederatedGraphById( const featureFlagsInLatestValidComposition: FeatureFlagDTO[] = []; - if (federatedGraph.schemaVersionId) { - const ffsInLatestValidComposition = await featureFlagRepo.getFeatureFlagSchemaVersionsByBaseSchemaVersion({ - baseSchemaVersionId: federatedGraph.schemaVersionId, - }); - if (ffsInLatestValidComposition) { - for (const ff of ffsInLatestValidComposition) { - const flag = featureFlags.find((f) => f.id === ff.featureFlagId); - if (flag) { - featureFlagsInLatestValidComposition.push(flag); - } + const ffsInLatestValidComposition = await featureFlagRepo.getFeatureFlagSchemaVersionsInLatestComposition({ + federatedGraphId: federatedGraph.id, + federatedGraphTargetId: federatedGraph.targetId, + }); + if (ffsInLatestValidComposition) { + for (const ff of ffsInLatestValidComposition) { + const flag = featureFlags.find((f) => f.id === ff.featureFlagId); + if (flag) { + featureFlagsInLatestValidComposition.push(flag); } } } diff --git a/controlplane/src/core/bufservices/federated-graph/getFederatedGraphSDLByName.ts b/controlplane/src/core/bufservices/federated-graph/getFederatedGraphSDLByName.ts index 1a6b8b2663..faea78d21b 100644 --- a/controlplane/src/core/bufservices/federated-graph/getFederatedGraphSDLByName.ts +++ b/controlplane/src/core/bufservices/federated-graph/getFederatedGraphSDLByName.ts @@ -77,6 +77,15 @@ export function getFederatedGraphSDLByName( }; } + if (!featureFlag.isEnabled) { + return { + response: { + code: EnumStatusCode.ERR_NOT_FOUND, + details: `Feature flag ${req.featureFlagName} is disabled`, + }, + }; + } + const ffSchemaVersion = await featureFlagRepo.getFeatureFlagSchemaVersionByBaseSchemaVersion({ baseSchemaVersionId: schemaVersion.schemaVersionId, federatedGraphId: federatedGraph.id, diff --git a/controlplane/src/core/repositories/FeatureFlagRepository.ts b/controlplane/src/core/repositories/FeatureFlagRepository.ts index 330fdd7edf..2184f0bdd6 100644 --- a/controlplane/src/core/repositories/FeatureFlagRepository.ts +++ b/controlplane/src/core/repositories/FeatureFlagRepository.ts @@ -1,6 +1,6 @@ import { Subgraph } from '@wundergraph/composition'; import { joinLabel, splitLabel } from '@wundergraph/cosmo-shared'; -import { SQL, and, asc, count, desc, eq, inArray, like, or, sql, arrayOverlaps, isNull } from 'drizzle-orm'; +import { SQL, and, asc, count, desc, eq, inArray, like, or, sql, arrayOverlaps, isNull, isNotNull } from 'drizzle-orm'; import { PostgresJsDatabase } from 'drizzle-orm/postgres-js'; import { FastifyBaseLogger } from 'fastify'; import { validate as isValidUuid } from 'uuid'; @@ -1483,17 +1483,44 @@ export class FeatureFlagRepository { return featureFlagCompositions; } - // return all the feature flag schema versions associated with the base schema version - // input: base schema version id - public async getFeatureFlagSchemaVersionsByBaseSchemaVersion({ - baseSchemaVersionId, + public async getFeatureFlagSchemaVersionsInLatestComposition({ + federatedGraphId, + federatedGraphTargetId, }: { - baseSchemaVersionId: string; + federatedGraphId: string; + federatedGraphTargetId: string; }) { - // A feature flag can have multiple composed schema versions against the same base schema version - // (e.g. recomposing the feature flag recomposes it against the unchanged base, so rows accumulate). - // Deduplicate by feature flag, keeping the latest composed version, so callers get one entry per flag. - const ffSchemaVersions = await this.db + const orgRepo = new OrganizationRepository(this.logger, this.db); + const splitConfigFeature = await orgRepo.getFeature({ + organizationId: this.organizationId, + featureId: 'split-config-loading', + }); + + let baseLinkageCondition; + if (splitConfigFeature?.enabled) { + // Flag compositions are decoupled from the base composition, so the base schema version is irrelevant here. + baseLinkageCondition = and( + isNull(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId), + eq(federatedGraphsToFeatureFlagSchemaVersions.federatedGraphId, federatedGraphId), + ); + } else { + const federatedGraphRepo = new FederatedGraphRepository(this.logger, this.db, this.organizationId); + const latestValidBaseSchemaVersion = await federatedGraphRepo.getLatestValidSchemaVersion({ + targetId: federatedGraphTargetId, + }); + + if (!latestValidBaseSchemaVersion) { + return; + } + + baseLinkageCondition = eq( + federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, + latestValidBaseSchemaVersion.schemaVersionId, + ); + } + + // The latest composition per flag that actually succeeded and deployed; this is what we return. + const validSchemaVersions = await this.db .selectDistinctOn([federatedGraphsToFeatureFlagSchemaVersions.featureFlagId], { id: federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId, featureFlagId: federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, @@ -1503,15 +1530,51 @@ export class FeatureFlagRepository { schemaVersion, eq(schemaVersion.id, federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId), ) - .where(eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, baseSchemaVersionId)) + .innerJoin(graphCompositions, eq(graphCompositions.schemaVersionId, schemaVersion.id)) + .where( + and( + baseLinkageCondition, + isNotNull(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId), + eq(graphCompositions.isComposable, true), + or(isNull(graphCompositions.deploymentError), eq(graphCompositions.deploymentError, '')), + or(isNull(graphCompositions.admissionError), eq(graphCompositions.admissionError, '')), + ), + ) .orderBy(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, desc(schemaVersion.createdAt)) .execute(); - if (ffSchemaVersions.length === 0) { + if (validSchemaVersions.length === 0) { return; } - return ffSchemaVersions; + if (!splitConfigFeature?.enabled) { + return validSchemaVersions.map((version) => ({ + ...version, + hasFailedLatestComposition: false, + })); + } + + // The latest composition per flag regardless of status, used only to detect a newer failed composition. + const latestSchemaVersions = await this.db + .selectDistinctOn([federatedGraphsToFeatureFlagSchemaVersions.featureFlagId], { + id: federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId, + featureFlagId: federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, + }) + .from(federatedGraphsToFeatureFlagSchemaVersions) + .innerJoin( + schemaVersion, + eq(schemaVersion.id, federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId), + ) + .where(and(baseLinkageCondition, isNotNull(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId))) + .orderBy(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, desc(schemaVersion.createdAt)) + .execute(); + + const latestIdByFeatureFlagId = new Map(latestSchemaVersions.map((version) => [version.featureFlagId, version.id])); + + return validSchemaVersions.map((version) => ({ + ...version, + hasFailedLatestComposition: latestIdByFeatureFlagId.get(version.featureFlagId) !== version.id, + })); } /* @@ -1588,16 +1651,22 @@ export class FeatureFlagRepository { schemaVersion, eq(schemaVersion.id, federatedGraphsToFeatureFlagSchemaVersions.composedSchemaVersionId), ) + .innerJoin(graphCompositions, eq(graphCompositions.schemaVersionId, schemaVersion.id)) .where( /** * When split config is enabled, the feature flag composition will not be tied to the base schema version, so - * we need to check that the baseCompositionSchemaVersionId is null + * we need to check that the baseCompositionSchemaVersionId is null. We also require the composition to have + * succeeded, otherwise a failed latest composition resolves to a null SDL and the caller 404s instead of + * serving the last valid schema. */ splitConfigFeature?.enabled ? and( isNull(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId), eq(federatedGraphsToFeatureFlagSchemaVersions.featureFlagId, featureFlagId), eq(federatedGraphsToFeatureFlagSchemaVersions.federatedGraphId, federatedGraphId), + eq(graphCompositions.isComposable, true), + or(isNull(graphCompositions.deploymentError), eq(graphCompositions.deploymentError, '')), + or(isNull(graphCompositions.admissionError), eq(graphCompositions.admissionError, '')), ) : and( eq(federatedGraphsToFeatureFlagSchemaVersions.baseCompositionSchemaVersionId, baseSchemaVersionId), diff --git a/controlplane/src/types/index.ts b/controlplane/src/types/index.ts index 97ee03d2c9..22b271eb19 100644 --- a/controlplane/src/types/index.ts +++ b/controlplane/src/types/index.ts @@ -194,6 +194,7 @@ export interface FeatureFlagDTO { createdAt: string; updatedAt: string; featureSubgraphs: FeatureSubgraphDTO[]; + hasFailedLatestComposition?: boolean; } export interface MigrationSubgraph { diff --git a/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts b/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts index 1f69621d50..8298cfa107 100644 --- a/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts +++ b/controlplane/test/feature-flag/get-feature-flags-in-latest-composition-by-federated-graph.test.ts @@ -2,7 +2,7 @@ import fs from 'node:fs'; import { join } from 'node:path'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { addMinutes, formatISO, subDays } from 'date-fns'; -import { afterAll, beforeAll, describe, expect, test } from 'vitest'; +import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vitest'; import { afterAllSetup, beforeAllSetup, genID, genUniqueLabel } from '../../src/core/test-util.js'; import { createAndPublishSubgraph, @@ -68,7 +68,7 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { expect(resp.featureFlags.some((f) => f.name === flagName)).toBe(true); }); - test('that feature flag compositions are decoupled when split config loading is enabled', async (testContext) => { + test('that feature flags in the latest composition are returned when split config loading is enabled', async (testContext) => { const { client, server } = await SetupTest({ dbname, enabledFeatures: ['split-config-loading'] }); testContext.onTestFinished(() => server.close()); @@ -118,7 +118,8 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { }); expect(resp.response?.code).toBe(EnumStatusCode.OK); - expect(resp.featureFlags).toHaveLength(0); + expect(resp.featureFlags).toHaveLength(1); + expect(resp.featureFlags.some((f) => f.name === flagName)).toBe(true); // Create a second, enabled feature flag const secondFlagName = genID('flag'); @@ -129,7 +130,9 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { namespace, }); expect(withSecondFlag.response?.code).toBe(EnumStatusCode.OK); - expect(withSecondFlag.featureFlags).toHaveLength(0); + expect(withSecondFlag.featureFlags).toHaveLength(2); + expect(withSecondFlag.featureFlags.some((f) => f.name === flagName)).toBe(true); + expect(withSecondFlag.featureFlags.some((f) => f.name === secondFlagName)).toBe(true); // Only the base graph composition should show up when excluding feature flag compositions let compositionsResp = await client.getCompositions({ @@ -194,6 +197,375 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { expect(resp.featureFlags).toHaveLength(0); }); + test.each([true, false])( + 'that a feature flag whose latest composition failed is kept only under split config (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels = [genUniqueLabel()]; + const federatedGraphName = genID('fedGraph'); + + await createNamespace(client, namespace); + + await createAndPublishSubgraph( + client, + 'users', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users.graphql')).toString(), + labels, + DEFAULT_SUBGRAPH_URL_ONE, + ); + + await createAndPublishSubgraph( + client, + 'products-standalone', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-standalone.graphql')).toString(), + labels, + 'http://localhost:4002', + ); + + // A feature subgraph for `users` that mirrors the base schema plus one extra field, so it composes on its own + await createThenPublishFeatureSubgraph( + client, + 'users-ff', + 'users', + namespace, + ` + type User @key(fields: "id") { + id: ID! + name: String! + email: String! + isPremium: Boolean! @tag(name: "exclude") + nickname: String! + } + + type Query { + user(id: ID!): User + users: [User!]! + } + `, + labels, + 'http://localhost:4101', + ); + + await createThenPublishFeatureSubgraph( + client, + 'products-standalone-feature', + 'products-standalone', + namespace, + fs + .readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-standalone-feature.graphql')) + .toString(), + labels, + 'http://localhost:4102', + ); + + const federatedGraphLabels = labels.map(({ key, value }) => `${key}=${value}`); + await createFederatedGraph(client, federatedGraphName, namespace, federatedGraphLabels, DEFAULT_ROUTER_URL); + + // Two enabled flags, each built on its own feature subgraph, both composing successfully + const successfulFlagName = genID('flag'); + await createFeatureFlag(client, successfulFlagName, labels, ['products-standalone-feature'], namespace, true); + + const failingFlagName = genID('flag'); + await createFeatureFlag(client, failingFlagName, labels, ['users-ff'], namespace, true); + + let resp = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + + expect(resp.response?.code).toBe(EnumStatusCode.OK); + expect(resp.featureFlags).toHaveLength(2); + + /** + * Break the composition of only the second flag by declaring `Product.details` with a type that conflicts with the + * `products-standalone` subgraph (`String!` there, `Int!` here). This is published to a feature subgraph, so the + * base composition itself does not fail, and the other flag still composes. Note this does not mean the base + * schema version is unchanged: in legacy every flag event runs `legacyComposeAndDeploy`, which recomposes the base + * graph and bumps `federatedGraphs.composedSchemaVersionId` regardless. + */ + const publishResp = await client.publishFederatedSubgraph({ + name: 'users-ff', + namespace, + schema: ` + type User @key(fields: "id") { + id: ID! + name: String! + email: String! + isPremium: Boolean! @tag(name: "exclude") + } + + type Product @key(fields: "upc sku") { + upc: Int! + sku: String! + details: Int! + } + + type Query { + user(id: ID!): User + users: [User!]! + } + `, + }); + expect(publishResp.response?.code).toBe(EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED); + expect(publishResp.compositionErrors.length).toBeGreaterThan(0); + + resp = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + + expect(resp.response?.code).toBe(EnumStatusCode.OK); + if (splitConfigEnabled) { + /** + * Split config scopes the lookup by federated graph, so the flag falls back to its last valid composition and + * stays listed. + */ + expect(new Set(resp.featureFlags.map((f) => f.name))).toStrictEqual( + new Set([successfulFlagName, failingFlagName]), + ); + } else { + /** + * Legacy anchors the lookup to the base schema version, and every flag event bumps that version, so the flag's + * earlier valid composition is not reachable from the current base. The flag is dropped rather than falling back. + */ + expect(new Set(resp.featureFlags.map((f) => f.name))).toStrictEqual(new Set([successfulFlagName])); + } + }, + ); + + test.each([true, false])( + 'that only the flag whose latest composition failed is reported as stale (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels = [genUniqueLabel()]; + const federatedGraphName = genID('fedGraph'); + + await createNamespace(client, namespace); + + await createAndPublishSubgraph( + client, + 'users', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users.graphql')).toString(), + labels, + DEFAULT_SUBGRAPH_URL_ONE, + ); + + await createAndPublishSubgraph( + client, + 'products-standalone', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-standalone.graphql')).toString(), + labels, + 'http://localhost:4002', + ); + + await createThenPublishFeatureSubgraph( + client, + 'users-ff', + 'users', + namespace, + ` + type User @key(fields: "id") { + id: ID! + name: String! + email: String! + isPremium: Boolean! @tag(name: "exclude") + nickname: String! + } + + type Query { + user(id: ID!): User + users: [User!]! + } + `, + labels, + 'http://localhost:4101', + ); + + await createThenPublishFeatureSubgraph( + client, + 'products-standalone-feature', + 'products-standalone', + namespace, + fs + .readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-standalone-feature.graphql')) + .toString(), + labels, + 'http://localhost:4102', + ); + + const federatedGraphLabels = labels.map(({ key, value }) => `${key}=${value}`); + await createFederatedGraph(client, federatedGraphName, namespace, federatedGraphLabels, DEFAULT_ROUTER_URL); + + const healthyFlagName = genID('flag'); + await createFeatureFlag(client, healthyFlagName, labels, ['products-standalone-feature'], namespace, true); + + const staleFlagName = genID('flag'); + await createFeatureFlag(client, staleFlagName, labels, ['users-ff'], namespace, true); + + // Nothing has failed yet, so nothing is stale + let resp = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + expect(resp.response?.code).toBe(EnumStatusCode.OK); + expect(resp.featureFlags.every((f) => f.hasFailedLatestComposition === false)).toBe(true); + + // Break only the second flag: `Product.details` is `String!` in products-standalone, `Int!` here + const publishResp = await client.publishFederatedSubgraph({ + name: 'users-ff', + namespace, + schema: ` + type User @key(fields: "id") { + id: ID! + name: String! + email: String! + isPremium: Boolean! @tag(name: "exclude") + } + + type Product @key(fields: "upc sku") { + upc: Int! + sku: String! + details: Int! + } + + type Query { + user(id: ID!): User + users: [User!]! + } + `, + }); + expect(publishResp.response?.code).toBe(EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED); + + resp = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + expect(resp.response?.code).toBe(EnumStatusCode.OK); + + if (splitConfigEnabled) { + // The flag falls back to its last valid composition, so it is listed and reported stale + expect(resp.featureFlags).toHaveLength(2); + expect(resp.featureFlags.find((f) => f.name === staleFlagName)?.hasFailedLatestComposition).toBe(true); + // Only the broken flag is stale — the healthy one must not be tarred with it + expect(resp.featureFlags.find((f) => f.name === healthyFlagName)?.hasFailedLatestComposition).toBe(false); + } else { + /** + * Legacy drops the flag entirely rather than falling back (see Global Constraints), so there is nothing to + * report as stale. + */ + expect(resp.featureFlags.map((f) => f.name)).toStrictEqual([healthyFlagName]); + expect(resp.featureFlags.every((f) => f.hasFailedLatestComposition === false)).toBe(true); + } + }, + ); + + test.each([true, false])( + 'that a feature flag with no valid composition is not returned (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels = [genUniqueLabel()]; + const federatedGraphName = genID('fedGraph'); + + await createNamespace(client, namespace); + + await createAndPublishSubgraph( + client, + 'users', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users.graphql')).toString(), + labels, + DEFAULT_SUBGRAPH_URL_ONE, + ); + + await createAndPublishSubgraph( + client, + 'products-standalone', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-standalone.graphql')).toString(), + labels, + 'http://localhost:4002', + ); + + /** + * Publish a feature subgraph that already conflicts with `products-standalone` (`Product.details` is `String!` + * there, `Int!` here). A feature subgraph is not composed until a flag attaches it, so this publish succeeds and + * the flag's very first composition is the one that fails. + */ + await createThenPublishFeatureSubgraph( + client, + 'users-ff', + 'users', + namespace, + ` + type User @key(fields: "id") { + id: ID! + name: String! + email: String! + isPremium: Boolean! @tag(name: "exclude") + } + + type Product @key(fields: "upc sku") { + upc: Int! + sku: String! + details: Int! + } + + type Query { + user(id: ID!): User + users: [User!]! + } + `, + labels, + 'http://localhost:4101', + ); + + const federatedGraphLabels = labels.map(({ key, value }) => `${key}=${value}`); + await createFederatedGraph(client, federatedGraphName, namespace, federatedGraphLabels, DEFAULT_ROUTER_URL); + + // Created directly rather than via the createFeatureFlag helper, which asserts an OK response + const neverValidFlagName = genID('flag'); + const createResp = await client.createFeatureFlag({ + name: neverValidFlagName, + featureSubgraphNames: ['users-ff'], + labels, + namespace, + isEnabled: true, + }); + expect(createResp.response?.code).toBe(EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED); + + // The flag exists but has never composed successfully, so it must not be reported + const resp = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + + expect(resp.response?.code).toBe(EnumStatusCode.OK); + expect(resp.featureFlags).toHaveLength(0); + }, + ); + test('Should return ERR_NOT_FOUND for non-existent federated graph', async (testContext) => { const { client, server } = await SetupTest({ dbname }); testContext.onTestFinished(() => server.close()); @@ -205,4 +577,196 @@ describe('GetFeatureFlagsInLatestCompositionByFederatedGraph', () => { expect(resp.response?.code).toBe(EnumStatusCode.ERR_NOT_FOUND); }); + + test.each([true, false])( + 'that feature flags survive a failed base composition (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels = [genUniqueLabel()]; + const federatedGraphName = genID('fedGraph'); + + await createNamespace(client, namespace); + + await createAndPublishSubgraph( + client, + 'users', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users.graphql')).toString(), + labels, + DEFAULT_SUBGRAPH_URL_ONE, + ); + + await createAndPublishSubgraph( + client, + 'products', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products.graphql')).toString(), + labels, + 'http://localhost:4002', + ); + + await createThenPublishFeatureSubgraph( + client, + 'users-ff', + 'users', + namespace, + ` + type User @key(fields: "id") { + id: ID! + email: String! + isPremium: Boolean! @tag(name: "exclude") + nickname: String! + } + + type Query { + user(id: ID!): User + users: [User!]! + } + `, + labels, + 'http://localhost:4101', + ); + + const federatedGraphLabels = labels.map(({ key, value }) => `${key}=${value}`); + await createFederatedGraph(client, federatedGraphName, namespace, federatedGraphLabels, DEFAULT_ROUTER_URL); + + const flagName = genID('flag'); + await createFeatureFlag(client, flagName, labels, ['users-ff'], namespace, true); + + const before = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + expect(before.featureFlags.map((f) => f.name)).toStrictEqual([flagName]); + + /** + * Break the BASE composition by publishing a schema that redeclares the non-shareable `User.email` already owned + * by the `users` subgraph. + */ + const publishResp = await client.publishFederatedSubgraph({ + name: 'products', + namespace, + schema: fs + .readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-failing.graphql')) + .toString(), + }); + expect(publishResp.response?.code).toBe(EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED); + + /** + * The flag must still be reported. A failed base composition still advances the graph's + * `composedSchemaVersionId`, and that failed version has no feature flag rows at all, so anchoring to it would + * wrongly report zero flags while the router keeps serving the last valid base composition and its flags. Both + * callers therefore anchor on the latest *valid* base schema version. + */ + const after = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + expect(after.response?.code).toBe(EnumStatusCode.OK); + expect(after.featureFlags.map((f) => f.name)).toStrictEqual([flagName]); + }, + ); + + test.each([true, false])( + 'that a disabled feature flag is not reported (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels = [genUniqueLabel()]; + const federatedGraphName = genID('fedGraph'); + + await createNamespace(client, namespace); + + await createAndPublishSubgraph( + client, + 'users', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users.graphql')).toString(), + labels, + DEFAULT_SUBGRAPH_URL_ONE, + ); + + await createAndPublishSubgraph( + client, + 'products-standalone', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-standalone.graphql')).toString(), + labels, + 'http://localhost:4002', + ); + + await createThenPublishFeatureSubgraph( + client, + 'users-ff', + 'users', + namespace, + ` + type User @key(fields: "id") { + id: ID! + name: String! + email: String! + isPremium: Boolean! @tag(name: "exclude") + nickname: String! + } + + type Query { + user(id: ID!): User + users: [User!]! + } + `, + labels, + 'http://localhost:4101', + ); + + await createThenPublishFeatureSubgraph( + client, + 'products-standalone-feature', + 'products-standalone', + namespace, + fs + .readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-standalone-feature.graphql')) + .toString(), + labels, + 'http://localhost:4102', + ); + + const federatedGraphLabels = labels.map(({ key, value }) => `${key}=${value}`); + await createFederatedGraph(client, federatedGraphName, namespace, federatedGraphLabels, DEFAULT_ROUTER_URL); + + const enabledFlagName = genID('flag'); + await createFeatureFlag(client, enabledFlagName, labels, ['products-standalone-feature'], namespace, true); + + const disabledFlagName = genID('flag'); + await createFeatureFlag(client, disabledFlagName, labels, ['users-ff'], namespace, true); + + // Both compose successfully, so both are reported to begin with + let resp = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + expect(resp.response?.code).toBe(EnumStatusCode.OK); + expect(new Set(resp.featureFlags.map((f) => f.name))).toStrictEqual(new Set([enabledFlagName, disabledFlagName])); + + const disableResp = await client.enableFeatureFlag({ name: disabledFlagName, namespace, enabled: false }); + expect(disableResp.response?.code).toBe(EnumStatusCode.OK); + + resp = await client.getFeatureFlagsInLatestCompositionByFederatedGraph({ + federatedGraphName, + namespace, + }); + expect(resp.response?.code).toBe(EnumStatusCode.OK); + expect(resp.featureFlags.map((f) => f.name)).toStrictEqual([enabledFlagName]); + }, + ); }); diff --git a/controlplane/test/feature-flag/get-federated-graph-sdl-by-name.test.ts b/controlplane/test/feature-flag/get-federated-graph-sdl-by-name.test.ts new file mode 100644 index 0000000000..e8993327a7 --- /dev/null +++ b/controlplane/test/feature-flag/get-federated-graph-sdl-by-name.test.ts @@ -0,0 +1,402 @@ +import fs from 'node:fs'; +import { join } from 'node:path'; +import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; +import { Client } from '@connectrpc/connect'; +import { PlatformService } from '@wundergraph/cosmo-connect/dist/platform/v1/platform_pb'; +import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vitest'; +import { afterAllSetup, beforeAllSetup, genID, genUniqueLabel } from '../../src/core/test-util.js'; +import { + createAndPublishSubgraph, + createFeatureFlag, + createFederatedGraph, + createNamespace, + createThenPublishFeatureSubgraph, + DEFAULT_ROUTER_URL, + DEFAULT_SUBGRAPH_URL_ONE, + SetupTest, +} from '../test-util.js'; + +let dbname = ''; + +/** + * A feature subgraph for `users` that composes cleanly against the base graph. `nickname` exists only here, so its + * presence in a returned SDL proves the flag's composition was served rather than the base one. + */ +const FEATURE_SUBGRAPH_VALID = ` + type User @key(fields: "id") { + id: ID! + name: String! + email: String! + isPremium: Boolean! @tag(name: "exclude") + nickname: String! + } + + type Query { + user(id: ID!): User + users: [User!]! + } +`; + +/** + * Same, but omitting `email`, so a later `User.email` conflict introduced into a base subgraph breaks the BASE + * composition while leaving this flag's composition intact. + */ +const FEATURE_SUBGRAPH_VALID_WITHOUT_EMAIL = ` + type User @key(fields: "id") { + id: ID! + name: String! + isPremium: Boolean! @tag(name: "exclude") + nickname: String! + } + + type Query { + user(id: ID!): User + users: [User!]! + } +`; + +/** + * Declares `Product.details` as `Int!` where the `products-standalone` subgraph declares it `String!`, so composing any + * flag built on this feature subgraph fails while the base graph is untouched. + */ +const FEATURE_SUBGRAPH_BROKEN = ` + type User @key(fields: "id") { + id: ID! + name: String! + email: String! + isPremium: Boolean! @tag(name: "exclude") + } + + type Product @key(fields: "upc sku") { + upc: Int! + sku: String! + details: Int! + } + + type Query { + user(id: ID!): User + users: [User!]! + } +`; + +/** + * Sets up a federated graph with two base subgraphs (`users`, `products-standalone`) and one feature subgraph + * (`users-ff`) built on `users`. Returns the identifiers the tests need. + */ +async function setUpGraphWithFeatureSubgraph( + client: Client, + featureSubgraphSchema: string = FEATURE_SUBGRAPH_VALID, +) { + const namespace = genID('namespace').toLowerCase(); + const labels = [genUniqueLabel()]; + const federatedGraphName = genID('fedGraph'); + + await createNamespace(client, namespace); + + await createAndPublishSubgraph( + client, + 'users', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users.graphql')).toString(), + labels, + DEFAULT_SUBGRAPH_URL_ONE, + ); + + await createAndPublishSubgraph( + client, + 'products-standalone', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/products-standalone.graphql')).toString(), + labels, + 'http://localhost:4002', + ); + + await createThenPublishFeatureSubgraph( + client, + 'users-ff', + 'users', + namespace, + featureSubgraphSchema, + labels, + 'http://localhost:4101', + ); + + const federatedGraphLabels = labels.map(({ key, value }) => `${key}=${value}`); + await createFederatedGraph(client, federatedGraphName, namespace, federatedGraphLabels, DEFAULT_ROUTER_URL); + + return { namespace, labels, federatedGraphName }; +} + +/** Publishes a schema to `products-standalone` that duplicates the non-shareable `User.email` owned by `users`. */ +function breakBaseComposition(client: Client, namespace: string) { + return client.publishFederatedSubgraph({ + name: 'products-standalone', + namespace, + schema: ` + type Product @key(fields: "upc sku") { + upc: Int! + sku: String! + details: String! + isPremium: Boolean! @tag(name: "exclude") + } + + type User @key(fields: "id") { + id: ID! @shareable + email: String! + } + + type Query { + products: [Product!]! + } + `, + }); +} + +/** Publishes a schema to the `users-ff` feature subgraph that conflicts with `products-standalone`. */ +function breakFeatureFlagComposition(client: Client, namespace: string) { + return client.publishFederatedSubgraph({ + name: 'users-ff', + namespace, + schema: FEATURE_SUBGRAPH_BROKEN, + }); +} + +/** + * Covers how `getFederatedGraphSDLByName` resolves the SDL of a *feature flag* rather than of the base graph. + * + * The handler resolves the base anchor with `getLatestValidSchemaVersion` and then asks + * `FeatureFlagRepository.getFeatureFlagSchemaVersionByBaseSchemaVersion` for the flag's composition against it. That + * singular lookup filters for a valid composition **only under split config** — a deliberate decision to limit blast + * radius on the legacy path — which is why several cases below expect different outcomes per mode. + */ +describe('GetFederatedGraphSDLByName with a feature flag', () => { + beforeAll(async () => { + dbname = await beforeAllSetup(); + }); + + afterAll(async () => { + await afterAllSetup(dbname); + }); + + test.each([true, false])( + 'that a flag whose composition succeeded serves the flag SDL (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const { namespace, labels, federatedGraphName } = await setUpGraphWithFeatureSubgraph(client); + + const flagName = genID('flag'); + await createFeatureFlag(client, flagName, labels, ['users-ff'], namespace, true); + + const flagSdl = await client.getFederatedGraphSDLByName({ + name: federatedGraphName, + namespace, + featureFlagName: flagName, + }); + + expect(flagSdl.response?.code).toBe(EnumStatusCode.OK); + // `nickname` exists only in the feature subgraph, so this proves the flag's composition was served + expect(flagSdl.sdl).toContain('nickname'); + expect(flagSdl.clientSchema).toBeTruthy(); + + // The base graph's own SDL must be unaffected by the flag + const baseSdl = await client.getFederatedGraphSDLByName({ name: federatedGraphName, namespace }); + expect(baseSdl.response?.code).toBe(EnumStatusCode.OK); + expect(baseSdl.sdl).not.toContain('nickname'); + }, + ); + + test.each([true, false])( + 'that a flag whose latest composition failed serves its last valid SDL under split config but not in legacy (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const { namespace, labels, federatedGraphName } = await setUpGraphWithFeatureSubgraph(client); + + const flagName = genID('flag'); + await createFeatureFlag(client, flagName, labels, ['users-ff'], namespace, true); + + const beforeResp = await client.getFederatedGraphSDLByName({ + name: federatedGraphName, + namespace, + featureFlagName: flagName, + }); + expect(beforeResp.response?.code).toBe(EnumStatusCode.OK); + expect(beforeResp.sdl).toBeTruthy(); + + const publishResp = await breakFeatureFlagComposition(client, namespace); + expect(publishResp.response?.code).toBe(EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED); + + const afterResp = await client.getFederatedGraphSDLByName({ + name: federatedGraphName, + namespace, + featureFlagName: flagName, + }); + + if (splitConfigEnabled) { + // The failed composition has a null SDL; we must fall back to the last valid composition + expect(afterResp.response?.code).toBe(EnumStatusCode.OK); + expect(afterResp.sdl).toBe(beforeResp.sdl); + } else { + /** + * Legacy is deliberately left unfixed: the failed flag composition is anchored to the base schema version + * created by this very publish (legacy recomposes the base graph on every flag event, moving the anchor), and + * that lookup has no validity filter, so its null SDL surfaces as ERR_NOT_FOUND. Asserted so the gap stays + * visible rather than looking like an oversight. + */ + expect(afterResp.response?.code).toBe(EnumStatusCode.ERR_NOT_FOUND); + } + }, + ); + + test.each([true, false])( + 'that a flag which never composed successfully has no SDL (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + // The feature subgraph already conflicts with `products-standalone`, so the flag's first composition fails + const { namespace, labels, federatedGraphName } = await setUpGraphWithFeatureSubgraph( + client, + FEATURE_SUBGRAPH_BROKEN, + ); + + const flagName = genID('flag'); + const createResp = await client.createFeatureFlag({ + name: flagName, + featureSubgraphNames: ['users-ff'], + labels, + namespace, + isEnabled: true, + }); + expect(createResp.response?.code).toBe(EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED); + + // There is no valid composition to serve, in either mode + const flagSdl = await client.getFederatedGraphSDLByName({ + name: federatedGraphName, + namespace, + featureFlagName: flagName, + }); + expect(flagSdl.response?.code).toBe(EnumStatusCode.ERR_NOT_FOUND); + expect(flagSdl.sdl).toBeFalsy(); + }, + ); + + test.each([true, false])( + 'that a flag still serves its SDL when the base composition failed (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + // The feature subgraph omits `email`, so the `User.email` conflict below breaks only the base composition + const { namespace, labels, federatedGraphName } = await setUpGraphWithFeatureSubgraph( + client, + FEATURE_SUBGRAPH_VALID_WITHOUT_EMAIL, + ); + + const flagName = genID('flag'); + await createFeatureFlag(client, flagName, labels, ['users-ff'], namespace, true); + + const beforeResp = await client.getFederatedGraphSDLByName({ + name: federatedGraphName, + namespace, + featureFlagName: flagName, + }); + expect(beforeResp.response?.code).toBe(EnumStatusCode.OK); + + const publishResp = await breakBaseComposition(client, namespace); + expect(publishResp.response?.code).toBe(EnumStatusCode.ERR_SUBGRAPH_COMPOSITION_FAILED); + + /** + * The handler anchors on the latest *valid* base schema version, not on the graph's `composedSchemaVersionId` + * which has advanced to the failed one, so the flag's composition is still reachable and served in both modes. + */ + const afterResp = await client.getFederatedGraphSDLByName({ + name: federatedGraphName, + namespace, + featureFlagName: flagName, + }); + expect(afterResp.response?.code).toBe(EnumStatusCode.OK); + expect(afterResp.sdl).toContain('nickname'); + + /** + * Which composition gets served differs by mode, because the publish above targeted `products-standalone` — a + * subgraph the flag's own composition also includes: + * - split config composes flags independently of the base, so the flag recomposed successfully against the + * updated subgraph and its SDL moved on. + * - legacy composes base and flags in one pass and writes no flag composition when the base fails, so the flag + * keeps serving the composition it had before. + */ + if (splitConfigEnabled) { + expect(afterResp.sdl).not.toBe(beforeResp.sdl); + } else { + expect(afterResp.sdl).toBe(beforeResp.sdl); + } + }, + ); + + test.each([true, false])( + 'that an unknown feature flag name is reported as not found (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const { namespace, federatedGraphName } = await setUpGraphWithFeatureSubgraph(client); + + const flagSdl = await client.getFederatedGraphSDLByName({ + name: federatedGraphName, + namespace, + featureFlagName: 'does-not-exist', + }); + + expect(flagSdl.response?.code).toBe(EnumStatusCode.ERR_NOT_FOUND); + expect(flagSdl.response?.details).toBe('Feature flag does-not-exist not found'); + }, + ); + + test.each([true, false])( + 'that a disabled flag does not serve its SDL (split config: %s)', + async (splitConfigEnabled) => { + const { client, server } = await SetupTest({ + dbname, + enabledFeatures: splitConfigEnabled ? ['split-config-loading'] : [], + }); + onTestFinished(() => server.close()); + + const { namespace, labels, federatedGraphName } = await setUpGraphWithFeatureSubgraph(client); + + const flagName = genID('flag'); + await createFeatureFlag(client, flagName, labels, ['users-ff'], namespace, true); + + const disableResp = await client.enableFeatureFlag({ name: flagName, namespace, enabled: false }); + expect(disableResp.response?.code).toBe(EnumStatusCode.OK); + + const flagSdl = await client.getFederatedGraphSDLByName({ + name: federatedGraphName, + namespace, + featureFlagName: flagName, + }); + + expect(flagSdl.response?.code).toBe(EnumStatusCode.ERR_NOT_FOUND); + expect(flagSdl.response?.details).toBe(`Feature flag ${flagName} is disabled`); + expect(flagSdl.sdl).toBeFalsy(); + }, + ); +}); diff --git a/controlplane/test/federated-graph/get-federated-graph-by-id.test.ts b/controlplane/test/federated-graph/get-federated-graph-by-id.test.ts index 444c7c7a2a..eb71a0a980 100644 --- a/controlplane/test/federated-graph/get-federated-graph-by-id.test.ts +++ b/controlplane/test/federated-graph/get-federated-graph-by-id.test.ts @@ -1,3 +1,5 @@ +import fs from 'node:fs'; +import { join } from 'node:path'; import { EnumStatusCode } from '@wundergraph/cosmo-connect/dist/common/common_pb'; import { afterAll, beforeAll, describe, expect, onTestFinished, test } from 'vitest'; import { @@ -6,8 +8,20 @@ import { createTestGroup, createTestRBACEvaluator, genID, + genUniqueLabel, } from '../../src/core/test-util.js'; -import { createFederatedGraph, createThenPublishSubgraph, DEFAULT_NAMESPACE, SetupTest } from '../test-util.js'; +import { + createAndPublishSubgraph, + createFeatureFlag, + createFederatedGraph, + createNamespace, + createThenPublishFeatureSubgraph, + createThenPublishSubgraph, + DEFAULT_NAMESPACE, + DEFAULT_ROUTER_URL, + DEFAULT_SUBGRAPH_URL_ONE, + SetupTest, +} from '../test-util.js'; let dbname = ''; @@ -177,4 +191,57 @@ describe('GetFederatedGraphById', () => { expect(response.response?.code).toBe(EnumStatusCode.ERROR_NOT_AUTHORIZED); }, ); + + test('Should return the feature flags in the latest composition when split config loading is enabled', async (testContext) => { + const { client, server } = await SetupTest({ dbname, enabledFeatures: ['split-config-loading'] }); + testContext.onTestFinished(() => server.close()); + + const namespace = genID('namespace').toLowerCase(); + const labels = [genUniqueLabel()]; + const federatedGraphName = genID('fedGraph'); + + await createNamespace(client, namespace); + + await createAndPublishSubgraph( + client, + 'users', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users.graphql')).toString(), + labels, + DEFAULT_SUBGRAPH_URL_ONE, + ); + + await createThenPublishFeatureSubgraph( + client, + 'users-feature', + 'users', + namespace, + fs.readFileSync(join(process.cwd(), 'test/test-data/feature-flags/users-feature.graphql')).toString(), + labels, + 'http://localhost:4101', + ); + + const federatedGraphLabels = labels.map(({ key, value }) => `${key}=${value}`); + await createFederatedGraph(client, federatedGraphName, namespace, federatedGraphLabels, DEFAULT_ROUTER_URL); + + const flagName = genID('flag'); + await createFeatureFlag(client, flagName, labels, ['users-feature'], namespace, true); + + const graphByName = await client.getFederatedGraphByName({ + name: federatedGraphName, + namespace, + }); + expect(graphByName.response?.code).toBe(EnumStatusCode.OK); + + // Under split config the feature flag composition rows have a null base linkage; getFederatedGraphById must still + // resolve them via the federated graph so the flag shows up in the latest composition (COSMO-315). + const response = await client.getFederatedGraphById({ + id: graphByName.graph!.id, + includeMetrics: false, + }); + + expect(response.response?.code).toBe(EnumStatusCode.OK); + expect(response.featureFlagsInLatestValidComposition).toHaveLength(1); + expect(response.featureFlagsInLatestValidComposition.some((f) => f.name === flagName)).toBe(true); + }); }); diff --git a/proto/wg/cosmo/platform/v1/platform.proto b/proto/wg/cosmo/platform/v1/platform.proto index fb954960a7..3a76a59fad 100644 --- a/proto/wg/cosmo/platform/v1/platform.proto +++ b/proto/wg/cosmo/platform/v1/platform.proto @@ -2618,6 +2618,7 @@ message FeatureFlag { string created_by = 6; string created_at = 7; string updated_at = 8; + optional bool has_failed_latest_composition = 9; } message GetFeatureFlagsRequest { diff --git a/studio/src/components/composition-errors-banner.tsx b/studio/src/components/composition-errors-banner.tsx index 360becee3f..48406df30b 100644 --- a/studio/src/components/composition-errors-banner.tsx +++ b/studio/src/components/composition-errors-banner.tsx @@ -2,8 +2,18 @@ import { BoltSlashIcon } from '@heroicons/react/24/outline'; import { CompositionErrorsDialog } from '@/components/composition-errors-dialog'; import React from 'react'; import { cn } from '@/lib/utils'; +import { Button } from '@/components/ui/button'; +import Link from 'next/link'; -export const CompositionErrorsBanner = ({ errors, className }: { errors?: string; className?: string }) => { +export const CompositionErrorsBanner = ({ + errors, + className, + viewCompositionsHref, +}: { + errors?: string; + className?: string; + viewCompositionsHref?: string; +}) => { return (
{errors && } + {viewCompositionsHref && ( + + )} ); }; diff --git a/studio/src/components/schema/stale-composition-warning.tsx b/studio/src/components/schema/stale-composition-warning.tsx new file mode 100644 index 0000000000..47b4600a98 --- /dev/null +++ b/studio/src/components/schema/stale-composition-warning.tsx @@ -0,0 +1,15 @@ +import Link from 'next/link'; +import { ExclamationTriangleIcon } from '@heroicons/react/24/outline'; +import { Alert } from '@/components/ui/alert'; +import { Tooltip, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; + +export const StaleCompositionIcon = () => { + return ( + + + + + Latest composition failed — showing the last successful composition. + + ); +}; diff --git a/studio/src/components/ui/button.tsx b/studio/src/components/ui/button.tsx index f7eda80372..a9719f60f4 100644 --- a/studio/src/components/ui/button.tsx +++ b/studio/src/components/ui/button.tsx @@ -23,6 +23,7 @@ const buttonVariants = cva( lg: 'h-10 rounded-md px-8', icon: 'h-9 w-9', 'icon-sm': 'h-8 w-8', + xs: 'h-6 rounded-md px-2 text-xs', }, }, defaultVariants: { diff --git a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/schema/index.tsx b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/schema/index.tsx index 3d01af2a31..7dde99c5f2 100644 --- a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/schema/index.tsx +++ b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/schema/index.tsx @@ -5,6 +5,7 @@ import { DatePickerWithRange, DateRangePickerChangeHandler } from '@/components/ import { EmptyState } from '@/components/empty-state'; import { GraphContext, GraphPageLayout, getGraphLayout } from '@/components/layout/graph-layout'; import { EmptySchema } from '@/components/schema/empty-schema-state'; +import { StaleCompositionIcon } from '@/components/schema/stale-composition-warning'; import { SchemaToolbar } from '@/components/schema/toolbar'; import { Badge, badgeVariants } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; @@ -92,6 +93,7 @@ import { Line, LineChart, ResponsiveContainer } from 'recharts'; import { useDebounce } from 'use-debounce'; import { useWorkspace } from '@/hooks/use-workspace'; import { buildUrl } from '@/lib/build-url'; +import { CompositionErrorsBanner } from '@/components/composition-errors-banner'; const fallback = buildASTSchema(parse(`type Query { dummy: String! }`)); @@ -897,6 +899,7 @@ export const GraphSelector = () => { return { name: each.name, query: `?featureFlag=${each.name}`, + hasFailedLatestComposition: !!each.hasFailedLatestComposition, }; }) ?? []; @@ -964,11 +967,16 @@ export const GraphSelector = () => { Feature Flags - {featureFlags.map(({ name, query }) => { + {featureFlags.map(({ name, query, hasFailedLatestComposition }) => { return ( <> - {name} + + + {name} + {hasFailedLatestComposition && } + + { featureFlagName: featureFlagName, }); + const { data: compositionFlagsData } = useQuery( + getFeatureFlagsInLatestCompositionByFederatedGraph, + { + federatedGraphName: graphName, + namespace, + }, + { + enabled: !!graphName, + }, + ); + + // The active flag is identified by name in the URL, so resolve staleness by name for the banner + const activeFeatureFlagIsStale = (compositionFlagsData?.featureFlags ?? []).some( + (flag) => flag.name === featureFlagName && flag.hasFailedLatestComposition, + ); + const schemaType = router.query.schemaType as string; const schema = schemaType === 'router' ? data?.sdl : data?.clientSchema || data?.sdl; @@ -1314,6 +1338,12 @@ const SchemaExplorerPage: NextPageWithLayout = () => { } noPadding > + {activeFeatureFlagIsStale && ( + + )}
diff --git a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/schema/sdl.tsx b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/schema/sdl.tsx index a4ee790bee..e18e0d2137 100644 --- a/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/schema/sdl.tsx +++ b/studio/src/pages/[organizationSlug]/[namespace]/graph/[slug]/schema/sdl.tsx @@ -5,6 +5,7 @@ import { EmptySchema } from '@/components/schema/empty-schema-state'; import { SDLViewerActions } from '@/components/schema/sdl-viewer'; import { SDLViewerMonaco } from '@/components/schema/sdl-viewer-monaco'; import { SchemaToolbar } from '@/components/schema/toolbar'; +import { StaleCompositionIcon } from '@/components/schema/stale-composition-warning'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { @@ -49,6 +50,7 @@ const SDLPage: NextPageWithLayout = () => { namespace: { name: namespace }, } = useWorkspace(); const graphName = router.query.slug as string; + const organizationSlug = router.query.organizationSlug as string; const schemaType = router.query.schemaType as string; const fullPath = router.asPath; @@ -103,9 +105,15 @@ const SDLPage: NextPageWithLayout = () => { return { name: each.name, query: `?featureFlag=${each.name}`, + hasFailedLatestComposition: !!each.hasFailedLatestComposition, }; }) ?? []; + // The active flag is identified by name in the URL, so resolve staleness by name for the banner + const activeFeatureFlagIsStale = featureFlags.some( + (flag) => flag.name === activeFeatureFlag && flag.hasFailedLatestComposition, + ); + const activeSubgraphObject = graphData?.subgraphs.find((each) => { return each.name === activeSubgraph; }); @@ -241,11 +249,16 @@ const SDLPage: NextPageWithLayout = () => { Feature Flags - {featureFlags.map(({ name, query }) => { + {featureFlags.map(({ name, query, hasFailedLatestComposition }) => { return ( <> - {name} + + + {name} + {hasFailedLatestComposition && } + + { } > - {!validGraph && } + {!validGraph && !activeFeatureFlag && ( + + )} + {activeFeatureFlagIsStale && activeFeatureFlag && ( + + )} {content}