service-bridge 1.6.0-dev.33 → 1.7.0-dev.50

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -5,12 +5,238 @@ var __require = /* @__PURE__ */ createRequire(import.meta.url);
5
5
  import { AsyncLocalStorage } from "node:async_hooks";
6
6
  import * as crypto from "node:crypto";
7
7
  import { createSocket } from "node:dgram";
8
- import * as grpc from "@grpc/grpc-js";
8
+ import * as grpc2 from "@grpc/grpc-js";
9
9
  import * as protoLoader from "@grpc/proto-loader";
10
10
  import * as protobuf from "protobufjs";
11
11
 
12
12
  // sdk/src/generated/servicebridge-package-definition.ts
13
- var DESCRIPTOR_SET_BASE64 = "ConaBAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiLKAQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlKnsIgOzK/wEQgezK/wEabRJrCIDsyv8BEjQuYnVmLmRlc2NyaXB0b3IudjEuYnVmX2ZpbGVfZGVzY3JpcHRvcl9zZXRfZXh0ZW5zaW9uGi0uYnVmLmRlc2NyaXB0b3IudjEuRmlsZURlc2NyaXB0b3JTZXRFeHRlbnNpb24ixQUKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRIrChFvcHRpb25fZGVwZW5kZW5jeRgPIAMoCVIQb3B0aW9uRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgSMgoHZWRpdGlvbhgOIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUgdlZGl0aW9uIvwGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUSQQoKdmlzaWJpbGl0eRgLIAEoDjIhLmdvb2dsZS5wcm90b2J1Zi5TeW1ib2xWaXNpYmlsaXR5Ugp2aXNpYmlsaXR5GnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCLMBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhI3CghmZWF0dXJlcxgyIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxJtCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEQgOIAQJSDHZlcmlmaWNhdGlvbhqUAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWRKBAgEEAUiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVQRUFURUQQAxISCg5MQUJFTF9SRVFVSVJFRBACImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMipgMKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUSQQoKdmlzaWJpbGl0eRgGIAEoDjIhLmdvb2dsZS5wcm90b2J1Zi5TeW1ib2xWaXNpYmlsaXR5Ugp2aXNpYmlsaXR5GjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiK5EAoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQSqwEKFGVuZm9yY2VfbmFtaW5nX3N0eWxlGAcgASgOMi4uZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW5mb3JjZU5hbWluZ1N0eWxlQkmIAQKYAQGYAQKYAQOYAQSYAQWYAQaYAQeYAQiYAQmiARESDFNUWUxFX0xFR0FDWRiEB6IBDhIJU1RZTEUyMDI0GOkHsgEDCOkHUhJlbmZvcmNlTmFtaW5nU3R5bGUSuQEKGWRlZmF1bHRfc3ltYm9sX3Zpc2liaWxpdHkYCCABKA4yRS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5WaXNpYmlsaXR5RmVhdHVyZS5EZWZhdWx0U3ltYm9sVmlzaWJpbGl0eUI2iAECmAEBogEPEgpFWFBPUlRfQUxMGIQHogEVEhBFWFBPUlRfVE9QX0xFVkVMGOkHsgEDCOkHUhdkZWZhdWx0U3ltYm9sVmlzaWJpbGl0eRqhAQoRVmlzaWJpbGl0eUZlYXR1cmUigQEKF0RlZmF1bHRTeW1ib2xWaXNpYmlsaXR5EiUKIURFRkFVTFRfU1lNQk9MX1ZJU0lCSUxJVFlfVU5LTk9XThAAEg4KCkVYUE9SVF9BTEwQARIUChBFWFBPUlRfVE9QX0xFVkVMEAISDQoJTE9DQUxfQUxMEAMSCgoGU1RSSUNUEARKCAgBEICAgIACIlwKDUZpZWxkUHJlc2VuY2USGgoWRklFTERfUFJFU0VOQ0VfVU5LTk9XThAAEgwKCEVYUExJQ0lUEAESDAoISU1QTElDSVQQAhITCg9MRUdBQ1lfUkVRVUlSRUQQAyI3CghFbnVtVHlwZRIVChFFTlVNX1RZUEVfVU5LTk9XThAAEggKBE9QRU4QARIKCgZDTE9TRUQQAiJWChVSZXBlYXRlZEZpZWxkRW5jb2RpbmcSIwofUkVQRUFURURfRklFTERfRU5DT0RJTkdfVU5LTk9XThAAEgoKBlBBQ0tFRBABEgwKCEVYUEFOREVEEAIiSQoOVXRmOFZhbGlkYXRpb24SGwoXVVRGOF9WQUxJREFUSU9OX1VOS05PV04QABIKCgZWRVJJRlkQAhIICgROT05FEAMiBAgBEAEiUwoPTWVzc2FnZUVuY29kaW5nEhwKGE1FU1NBR0VfRU5DT0RJTkdfVU5LTk9XThAAEhMKD0xFTkdUSF9QUkVGSVhFRBABEg0KCURFTElNSVRFRBACIkgKCkpzb25Gb3JtYXQSFwoTSlNPTl9GT1JNQVRfVU5LTk9XThAAEgkKBUFMTE9XEAESFgoSTEVHQUNZX0JFU1RfRUZGT1JUEAIiVwoSRW5mb3JjZU5hbWluZ1N0eWxlEiAKHEVORk9SQ0VfTkFNSU5HX1NUWUxFX1VOS05PV04QABINCglTVFlMRTIwMjQQARIQCgxTVFlMRV9MRUdBQ1kQAiqwAQjoBxCLThqnARIdCOgHEgcucGIuY3BwGg8ucGIuQ3BwRmVhdHVyZXMSHwjpBxIILnBiLmphdmEaEC5wYi5KYXZhRmVhdHVyZXMSGwjqBxIGLnBiLmdvGg4ucGIuR29GZWF0dXJlcxIjCOsHEgoucGIucHl0aG9uGhIucGIuUHl0aG9uRmVhdHVyZXMSIwiGThIKLnBiLnByb3RvMRoSLnBiLlByb3RvMUZlYXR1cmVzKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIp4DCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyp1CIDsyv8BEIHsyv8BGmcSZQiA7Mr/ARIxLmJ1Zi5kZXNjcmlwdG9yLnYxLmJ1Zl9zb3VyY2VfY29kZV9pbmZvX2V4dGVuc2lvbhoqLmJ1Zi5kZXNjcmlwdG9yLnYxLlNvdXJjZUNvZGVJbmZvRXh0ZW5zaW9uItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////BypVChBTeW1ib2xWaXNpYmlsaXR5EhQKEFZJU0lCSUxJVFlfVU5TRVQQABIUChBWSVNJQklMSVRZX0xPQ0FMEAESFQoRVklTSUJJTElUWV9FWFBPUlQQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uSojwAwoHEgUmAIgLAQqqDwoBDBIDJgASMsEMIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoy2wIgQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQogIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCgogVGhlIG1lc3NhZ2VzIGluIHRoaXMgZmlsZSBkZXNjcmliZSB0aGUgZGVmaW5pdGlvbnMgZm91bmQgaW4gLnByb3RvIGZpbGVzLgogQSB2YWxpZCAucHJvdG8gZmlsZSBjYW4gYmUgdHJhbnNsYXRlZCBkaXJlY3RseSB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8KIHdpdGhvdXQgYW55IG90aGVyIGluZm9ybWF0aW9uIChlLmcuIHdpdGhvdXQgcmVhZGluZyBpdHMgaW1wb3J0cykuCgoICgECEgMoABgKCAoBCBIDKgBECgkKAggLEgMqAEQKCAoBCBIDKwAsCgkKAggBEgMrACwKCAoBCBIDLAAxCgkKAggIEgMsADEKCAoBCBIDLQA3CgkKAgglEgMtADcKCAoBCBIDLgAhCgkKAggkEgMuACEKCAoBCBIDLwAfCgkKAggfEgMvAB8KCAoBCBIDMwAcCn8KAggJEgMzABwadCBkZXNjcmlwdG9yLnByb3RvIG11c3QgYmUgb3B0aW1pemVkIGZvciBzcGVlZCBiZWNhdXNlIHJlZmxlY3Rpb24tYmFzZWQKIGFsZ29yaXRobXMgZG9uJ3Qgd29yayBkdXJpbmcgYm9vdHN0cmFwcGluZy4KCmoKAgQAEgQ3AEABGl4gVGhlIHByb3RvY29sIGNvbXBpbGVyIGNhbiBvdXRwdXQgYSBGaWxlRGVzY3JpcHRvclNldCBjb250YWluaW5nIHRoZSAucHJvdG8KIGZpbGVzIGl0IHBhcnNlcy4KCgoKAwQAARIDNwgZCgsKBAQAAgASAzgCKAoMCgUEAAIABBIDOAIKCgwKBQQAAgAGEgM4Cx4KDAoFBAACAAESAzgfIwoMCgUEAAIAAxIDOCYnCiYKAwQABRIEOwI/BRoZIEV4dGVuc2lvbnMgZm9yIHRvb2xpbmcuCgoLCgQEAAUAEgM7DRYKDAoFBAAFAAESAzsNFgoMCgUEAAUAAhIDOw0WCg0KBQQABQADEgQ7Fz8ECg8KBwQABQADAgASBDsYPwMKDwoIBAAFAAMCAAESAzwEFQoPCggEAAUAAwIAAxIDPQQ5Cg8KCAQABQADAgACEgM+BEUKLQoCBQASBEMAZAEaISBUaGUgZnVsbCBzZXQgb2Yga25vd24gZWRpdGlvbnMuCgoKCgMFAAESA0MFDAo6CgQFAAIAEgNFAhYaLSBBIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIGVkaXRpb24gdmFsdWUuCgoMCgUFAAIAARIDRQIRCgwKBQUAAgACEgNFFBUKmQEKBAUAAgESA0kCFxqLASBBIHBsYWNlaG9sZGVyIGVkaXRpb24gZm9yIHNwZWNpZnlpbmcgZGVmYXVsdCBiZWhhdmlvcnMgKmJlZm9yZSogYSBmZWF0dXJlCiB3YXMgZmlyc3QgaW50cm9kdWNlZC4gIFRoaXMgaXMgZWZmZWN0aXZlbHkgYW4gImluZmluaXRlIHBhc3QiLgoKDAoFBQACAQESA0kCEAoMCgUFAAIBAhIDSRMWCoICCgQFAAICEgNPAhca9AEgTGVnYWN5IHN5bnRheCAiZWRpdGlvbnMiLiAgVGhlc2UgcHJlLWRhdGUgZWRpdGlvbnMsIGJ1dCBiZWhhdmUgbXVjaCBsaWtlCiBkaXN0aW5jdCBlZGl0aW9ucy4gIFRoZXNlIGNhbid0IGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZWRpdGlvbiBvZiBwcm90bwogZmlsZXMsIGJ1dCBmZWF0dXJlIGRlZmluaXRpb25zIG11c3Qgc3VwcGx5IHByb3RvMi9wcm90bzMgZGVmYXVsdHMgZm9yCiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KCgwKBQUAAgIBEgNPAhAKDAoFBQACAgISA08TFgoLCgQFAAIDEgNQAhcKDAoFBQACAwESA1ACEAoMCgUFAAIDAhIDUBMWCq8BCgQFAAIEEgNVAhYaoQEgRWRpdGlvbnMgdGhhdCBoYXZlIGJlZW4gcmVsZWFzZWQuICBUaGUgc3BlY2lmaWMgdmFsdWVzIGFyZSBhcmJpdHJhcnkgYW5kCiBzaG91bGQgbm90IGJlIGRlcGVuZGVkIG9uLCBidXQgdGhleSB3aWxsIGFsd2F5cyBiZSB0aW1lLW9yZGVyZWQgZm9yIGVhc3kKIGNvbXBhcmlzb24uCgoMCgUFAAIEARIDVQIOCgwKBQUAAgQCEgNVERUKCwoEBQACBRIDVgIWCgwKBQUAAgUBEgNWAg4KDAoFBQACBQISA1YRFQp9CgQFAAIGEgNaAhoacCBQbGFjZWhvbGRlciBlZGl0aW9ucyBmb3IgdGVzdGluZyBmZWF0dXJlIHJlc29sdXRpb24uICBUaGVzZSBzaG91bGQgbm90IGJlCiB1c2VkIG9yIHJlbGllZCBvbiBvdXRzaWRlIG9mIHRlc3RzLgoKDAoFBQACBgESA1oCFQoMCgUFAAIGAhIDWhgZCgsKBAUAAgcSA1sCGgoMCgUFAAIHARIDWwIVCgwKBQUAAgcCEgNbGBkKCwoEBQACCBIDXAIiCgwKBQUAAggBEgNcAhkKDAoFBQACCAISA1wcIQoLCgQFAAIJEgNdAiIKDAoFBQACCQESA10CGQoMCgUFAAIJAhIDXRwhCgsKBAUAAgoSA14CIgoMCgUFAAIKARIDXgIZCgwKBQUAAgoCEgNeHCEKuAEKBAUAAgsSA2MCGxqqASBQbGFjZWhvbGRlciBmb3Igc3BlY2lmeWluZyB1bmJvdW5kZWQgZWRpdGlvbiBzdXBwb3J0LiAgVGhpcyBzaG91bGQgb25seQogZXZlciBiZSB1c2VkIGJ5IHBsdWdpbnMgdGhhdCBjYW4gZXhwZWN0IHRvIG5ldmVyIHJlcXVpcmUgYW55IGNoYW5nZXMgdG8KIHN1cHBvcnQgYSBuZXcgZWRpdGlvbi4KCgwKBQUAAgsBEgNjAg0KDAoFBQACCwISA2MQGgowCgIEARIFZwCTAQEaIyBEZXNjcmliZXMgYSBjb21wbGV0ZSAucHJvdG8gZmlsZS4KCgoKAwQBARIDZwgbCjkKBAQBAgASA2gCGyIsIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZQoKDAoFBAECAAQSA2gCCgoMCgUEAQIABRIDaAsRCgwKBQQBAgABEgNoEhYKDAoFBAECAAMSA2gZGgoqCgQEAQIBEgNpAh4iHSBlLmcuICJmb28iLCAiZm9vLmJhciIsIGV0Yy4KCgwKBQQBAgEEEgNpAgoKDAoFBAECAQUSA2kLEQoMCgUEAQIBARIDaRIZCgwKBQQBAgEDEgNpHB0KNAoEBAECAhIDbAIhGicgTmFtZXMgb2YgZmlsZXMgaW1wb3J0ZWQgYnkgdGhpcyBmaWxlLgoKDAoFBAECAgQSA2wCCgoMCgUEAQICBRIDbAsRCgwKBQQBAgIBEgNsEhwKDAoFBAECAgMSA2wfIApRCgQEAQIDEgNuAigaRCBJbmRleGVzIG9mIHRoZSBwdWJsaWMgaW1wb3J0ZWQgZmlsZXMgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdCBhYm92ZS4KCgwKBQQBAgMEEgNuAgoKDAoFBAECAwUSA24LEAoMCgUEAQIDARIDbhEiCgwKBQQBAgMDEgNuJScKegoEBAECBBIDcQImGm0gSW5kZXhlcyBvZiB0aGUgd2VhayBpbXBvcnRlZCBmaWxlcyBpbiB0aGUgZGVwZW5kZW5jeSBsaXN0LgogRm9yIEdvb2dsZS1pbnRlcm5hbCBtaWdyYXRpb24gb25seS4gRG8gbm90IHVzZS4KCgwKBQQBAgQEEgNxAgoKDAoFBAECBAUSA3ELEAoMCgUEAQIEARIDcREgCgwKBQQBAgQDEgNxIyUKnwEKBAQBAgUSA3UCKRqRASBOYW1lcyBvZiBmaWxlcyBpbXBvcnRlZCBieSB0aGlzIGZpbGUgcHVyZWx5IGZvciB0aGUgcHVycG9zZSBvZiBwcm92aWRpbmcKIG9wdGlvbiBleHRlbnNpb25zLiBUaGVzZSBhcmUgZXhjbHVkZWQgZnJvbSB0aGUgZGVwZW5kZW5jeSBsaXN0IGFib3ZlLgoKDAoFBAECBQQSA3UCCgoMCgUEAQIFBRIDdQsRCgwKBQQBAgUBEgN1EiMKDAoFBAECBQMSA3UmKAo2CgQEAQIGEgN4AiwaKSBBbGwgdG9wLWxldmVsIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZS4KCgwKBQQBAgYEEgN4AgoKDAoFBAECBgYSA3gLGgoMCgUEAQIGARIDeBsnCgwKBQQBAgYDEgN4KisKCwoEBAECBxIDeQItCgwKBQQBAgcEEgN5AgoKDAoFBAECBwYSA3kLHgoMCgUEAQIHARIDeR8oCgwKBQQBAgcDEgN5KywKCwoEBAECCBIDegIuCgwKBQQBAggEEgN6AgoKDAoFBAECCAYSA3oLIQoMCgUEAQIIARIDeiIpCgwKBQQBAggDEgN6LC0KCwoEBAECCRIDewIuCgwKBQQBAgkEEgN7AgoKDAoFBAECCQYSA3sLHwoMCgUEAQIJARIDeyApCgwKBQQBAgkDEgN7LC0KCwoEBAECChIDfQIjCgwKBQQBAgoEEgN9AgoKDAoFBAECCgYSA30LFgoMCgUEAQIKARIDfRceCgwKBQQBAgoDEgN9ISIK9QEKBAQBAgsSBIMBAi8a5gEgVGhpcyBmaWVsZCBjb250YWlucyBvcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuCiBZb3UgbWF5IHNhZmVseSByZW1vdmUgdGhpcyBlbnRpcmUgZmllbGQgd2l0aG91dCBoYXJtaW5nIHJ1bnRpbWUKIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRlc2NyaXB0b3JzIC0tIHRoZSBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgb25seSBieQogZGV2ZWxvcG1lbnQgdG9vbHMuCgoNCgUEAQILBBIEgwECCgoNCgUEAQILBhIEgwELGQoNCgUEAQILARIEgwEaKgoNCgUEAQILAxIEgwEtLgr5AgoEBAECDBIEjAECHhrqAiBUaGUgc3ludGF4IG9mIHRoZSBwcm90byBmaWxlLgogVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlICJwcm90bzIiLCAicHJvdG8zIiwgYW5kICJlZGl0aW9ucyIuCgogSWYgYGVkaXRpb25gIGlzIHByZXNlbnQsIHRoaXMgdmFsdWUgbXVzdCBiZSAiZWRpdGlvbnMiLgogV0FSTklORzogVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmIHBsdWdpbnMgb3Igc3BlY2lhbAogY2FzZXMgbGlrZSB0aGUgcHJvdG8gY29tcGlsZXIuIE90aGVyIHVzZXMgYXJlIGRpc2NvdXJhZ2VkIGFuZAogZGV2ZWxvcGVycyBzaG91bGQgcmVseSBvbiB0aGUgcHJvdG9yZWZsZWN0IEFQSXMgZm9yIHRoZWlyIGNsaWVudCBsYW5ndWFnZS4KCg0KBQQBAgwEEgSMAQIKCg0KBQQBAgwFEgSMAQsRCg0KBQQBAgwBEgSMARIYCg0KBQQBAgwDEgSMARsdCoICCgQEAQINEgSSAQIgGvMBIFRoZSBlZGl0aW9uIG9mIHRoZSBwcm90byBmaWxlLgogV0FSTklORzogVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmIHBsdWdpbnMgb3Igc3BlY2lhbAog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ZXJ3aXNlLCBpdCdzIGRlZHVjZWQgZnJvbSB0aGUgZmllbGQncyBuYW1lIGJ5IGNvbnZlcnRpbmcKIGl0IHRvIGNhbWVsQ2FzZS4KCg0KBQQEAggEEgTAAgIKCg0KBQQEAggFEgTAAgsRCg0KBQQEAggBEgTAAhIbCg0KBQQEAggDEgTAAh4gCgwKBAQEAgkSBMICAiQKDQoFBAQCCQQSBMICAgoKDQoFBAQCCQYSBMICCxcKDQoFBAQCCQESBMICGB8KDQoFBAQCCQMSBMICIiMKsAkKBAQEAgoSBNkCAiUaoQkgSWYgdHJ1ZSwgdGhpcyBpcyBhIHByb3RvMyAib3B0aW9uYWwiLiBXaGVuIGEgcHJvdG8zIGZpZWxkIGlzIG9wdGlvbmFsLCBpdAogdHJhY2tzIHByZXNlbmNlIHJlZ2FyZGxlc3Mgb2YgZmllbGQgdHlwZS4KCiBXaGVuIHByb3RvM19vcHRpb25hbCBpcyB0cnVlLCB0aGlzIGZpZWxkIG11c3QgYmVsb25nIHRvIGEgb25lb2YgdG8gc2lnbmFsCiB0byBvbGQgcHJvdG8zIGNsaWVudHMgdGhhdCBwcmVzZW5jZSBpcyB0cmFja2VkIGZvciB0aGlzIGZpZWxkLiBUaGlzIG9uZW9mCiBpcyBrbm93biBhcyBhICJzeW50aGV0aWMiIG9uZW9mLCBhbmQgdGhpcyBmaWVsZCBtdXN0IGJlIGl0cyBzb2xlIG1lbWJlcgogKGVhY2ggcHJvdG8zIG9wdGlvbmFsIGZpZWxkIGdldHMgaXRzIG93biBzeW50aGV0aWMgb25lb2YpLiBTeW50aGV0aWMgb25lb2ZzCiBleGlzdCBpbiB0aGUgZGVzY3JpcHRvciBvbmx5LCBhbmQgZG8gbm90IGdlbmVyYXRlIGFueSBBUEkuIFN5bnRoZXRpYyBvbmVvZnMKIG11c3QgYmUgb3JkZXJlZCBhZnRlciBhbGwgInJlYWwiIG9uZW9mcy4KCiBGb3IgbWVzc2FnZSBmaWVsZHMsIHByb3RvM19vcHRpb25hbCBkb2Vzbid0IGNyZWF0ZSBhbnkgc2VtYW50aWMgY2hhbmdlLAogc2luY2Ugbm9uLXJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFsd2F5cyB0cmFjayBwcmVzZW5jZS4gSG93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dmUgbWF5IGhhdmUgIm9wdGlvbnMiIGF0dGFjaGVkLiAgVGhlc2UgYXJlCiBqdXN0IGFubm90YXRpb25zIHdoaWNoIG1heSBjYXVzZSBjb2RlIHRvIGJlIGdlbmVyYXRlZCBzbGlnaHRseSBkaWZmZXJlbnRseQogb3IgbWF5IGNvbnRhaW4gaGludHMgZm9yIGNvZGUgdGhhdCBtYW5pcHVsYXRlcyBwcm90b2NvbCBtZXNzYWdlcy4KCiBDbGllbnRzIG1heSBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgYXMgZXh0ZW5zaW9ucyBvZiB0aGUgKk9wdGlvbnMgbWVzc2FnZXMuCiBUaGVzZSBleHRlbnNpb25zIG1heSBub3QgeWV0IGJlIGtub3duIGF0IHBhcnNpbmcgdGltZSwgc28gdGhlIHBhcnNlciBjYW5ub3QKIHN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlbS4gIEluc3RlYWQgaXQgc3RvcmVzIHRoZW0gaW4gYSBmaWVsZCBpbiB0aGUgKk9wdGlvbnMKIG1lc3NhZ2UgY2FsbGVkIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLiBUaGlzIGZpZWxkIG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lCiBhY3Jvc3MgYWxsICpPcHRpb25zIG1lc3NhZ2VzLiBXZSB0aGVuIHVzZSB0aGlzIGZpZWxkIHRvIHBvcHVsYXRlIHRoZQogZXh0ZW5zaW9ucyB3aGVuIHdlIGJ1aWxkIGEgZGVzY3JpcHRvciwgYXQgd2hpY2ggcG9pbnQgYWxsIHByb3RvcyBoYXZlIGJlZW4KIHBhcnNlZCBhbmQgc28gYWxsIGV4dGVuc2lvbnMgYXJlIGtub3duLgoKIEV4dGVuc2lvbiBudW1iZXJzIGZvciBjdXN0b20gb3B0aW9ucyBtYXkgYmUgY2hvc2VuIGFzIGZvbGxvd3M6CiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiBvcgogICBvcmdhbml6YXRpb24sIG9yIGZvciBleHBlcmltZW50YWwgb3B0aW9ucywgdXNlIGZpZWxkIG51bWJlcnMgNTAwMDAKICAgdGhyb3VnaCA5OTk5OS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCB5b3UgZG8gbm90IHVzZSB0aGUKICAgc2FtZSBudW1iZXIgZm9yIG11bHRpcGxlIG9wdGlvbnMuCiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgYmUgcHVibGlzaGVkIGFuZCB1c2VkIHB1YmxpY2x5IGJ5IG11bHRpcGxlCiAgIGluZGVwZW5kZW50IGVudGl0aWVzLCBlLW1haWwgcHJvdG9idWYtZ2xvYmFsLWV4dGVuc2lvbi1yZWdpc3RyeUBnb29nbGUuY29tCiAgIHRvIHJlc2VydmUgZXh0ZW5zaW9uIG51bWJlcnMuIFNpbXBseSBwcm92aWRlIHlvdXIgcHJvamVjdCBuYW1lIChlLmcuCiAgIE9iamVjdGl2ZS1DIHBsdWdpbikgYW5kIHlvdXIgcHJvamVjdCB3ZWJzaXRlIChpZiBhdmFpbGFibGUpIC0tIHRoZXJlJ3Mgbm8KICAgbmVlZCB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvIHVzZSB0aGVtLiBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgb25lCiAgIGV4dGVuc2lvbiBudW1iZXIuIFlvdSBjYW4gZGVjbGFyZSBtdWx0aXBsZSBvcHRpb25zIHdpdGggb25seSBvbmUgZXh0ZW5zaW9uCiAgIG51bWJlciBieSBwdXR0aW5nIHRoZW0gaW4gYSBzdWItbWVzc2FnZS4gU2VlIHRoZSBDdXN0b20gT3B0aW9ucyBzZWN0aW9uIG9mCiAgIHRoZSBkb2NzIGZvciBleGFtcGxlczoKICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvI29wdGlvbnMKICAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgcG9wdWxhciwgYSB3ZWIgc2VydmljZSB3aWxsIGJlIHNldCB1cAogICB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBvcHRpb24gbnVtYmVycy4KCgsKAwQKARIEwwMIEwr0AQoEBAoCABIEyQMCIxrlASBTZXRzIHRoZSBKYXZhIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCiBwbGFjZWQuICBCeSBkZWZhdWx0LCB0aGUgcHJvdG8gcGFja2FnZSBpcyB1c2VkLCBidXQgdGhpcyBpcyBvZnRlbgogaW5hcHByb3ByaWF0ZSBiZWNhdXNlIHByb3RvIHBhY2thZ2VzIGRvIG5vdCBub3JtYWxseSBzdGFydCB3aXRoIGJhY2t3YXJkcwogZG9tYWluIG5hbWVzLgoKDQoFBAoCAAQSBMkDAgoKDQoFBAoCAAUSBMkDCxEKDQoFBAoCAAESBMkDEh4KDQoFBAoCAAMSBMkDISIK8QIKBAQKAgESBNADAisa4gIgQ29udHJvbHMgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgSmF2YSBjbGFzcyBnZW5lcmF0ZWQgZm9yIHRoZSAucHJvdG8gZmlsZS4KIFRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgLnByb3RvIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzCiB3ZWxsIGFzIGFueSB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KIElmIGphdmFfbXVsdGlwbGVfZmlsZXMgaXMgZGlzYWJsZWQsIHRoZW4gYWxsIHRoZSBvdGhlciBjbGFzc2VzIGZyb20gdGhlCiAucHJvdG8gZmlsZSB3aWxsIGJlIG5lc3RlZCBpbnNpZGUgdGhlIHNpbmdsZSB3cmFwcGVyIG91dGVyIGNsYXNzLgoKDQoFBAoCAQQSBNADAgoKDQoFBAoCAQUSBNADCxEKDQoFBAoCAQESBNADEiYKDQoFBAoCAQMSBNADKSoKpgMKBAQKAgISBNgDAjsalwMgSWYgZW5hYmxlZCwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgc2VwYXJhdGUgLmphdmEKIGZpbGUgZm9yIGVhY2ggdG9wLWxldmVsIG1lc3NhZ2UsIGVudW0sIGFuZCBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIC5wcm90bwogZmlsZS4gIFRodXMsIHRoZXNlIHR5cGVzIHdpbGwgKm5vdCogYmUgbmVzdGVkIGluc2lkZSB0aGUgd3JhcHBlciBj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bWVudGF0aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKIGlmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQuCgogTk9URTogRG8gbm90IHNldCB0aGUgb3B0aW9uIGluIC5wcm90byBmaWxlcy4gQWx3YXlzIHVzZSB0aGUgbWFwcyBzeW50YXgKIGluc3RlYWQuIFRoZSBvcHRpb24gc2hvdWxkIG9ubHkgYmUgaW1wbGljaXRseSBzZXQgYnkgdGhlIHByb3RvIGNvbXBpbGVyCiBwYXJzZXIuCgoNCgUECwIDBBIE+wQCCgoNCgUECwIDBRIE+wQLDwoNCgUECwIDARIE+wQQGQoNCgUECwIDAxIE+wQcHQokCgMECwkSBP0EAg0iFyBqYXZhbGl0ZV9zZXJpYWxpemFibGUKCgwKBAQLCQMSBP0ECwwKDQoFBAsJAwESBP0ECwwKDQoFBAsJAwISBP0ECwwKHwoDBAsJEgT+BAINIhIgamF2YW5hbm9fYXNfbGl0ZQoKDAoEBAsJBBIE/gQLDAoNCgUECwkEARIE/gQLDAoNCgUECwkEAhIE/gQLDArdAwoEBAsCBBIEigUCUBrOAyBFbmFibGUgdGhlIGxlZ2FjeSBoYW5kbGluZyBvZiBKU09OIGZpZWxkIG5hbWUgY29uZmxpY3RzLiAgVGhpcyBsb3dlcmNhc2VzCiBhbmQgc3RyaXBzIHVuZGVyc2NvcmVkIGZyb20gdGhlIGZpZWxkcyBiZWZvcmUgY29tcGFyaXNvbiBpbiBwcm90bzMgb25seS4KIFRoZSBuZXcgYmVoYXZpb3IgdGFrZXMgYGpzb25fbmFtZWAgaW50byBhY2NvdW50IGFuZCBhcHBsaWVzIHRvIHByb3RvMiBhcwogd2VsbC4KCiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgbWVhc3VyZSBhZ2FpbnN0IGJyb2tlbiBidWlsZHMgZHVlCiB0byB0aGUgY2hhbmdlIGluIGJlaGF2aW9yIGZvciBKU09OIGZpZWxkIG5hbWUgY29uZmxpY3RzLgoKIFRPRE8gVGhpcyBpcyBsZWdhY3kgYmVoYXZpb3Igd2UgcGxhbiB0byByZW1vdmUgb25jZSBkb3duc3RyZWFtCiB0ZWFtcyBoYXZlIGhhZCB0aW1lIHRvIG1pZ3JhdGUuCgoNCgUECwIEBBIEigUCCgoNCgUECwIEBRIEigULDwoNCgUECwIEARIEigUQNgoNCgUECwIEAxIEigU5OwoNCgUECwIECBIEigU8TwoOCgYECwIECAMSBIoFPU4KkQIKBAQLAgUSBJAFAiQaggIgQW55IGZlYXR1cmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljIGVkaXRpb24uCiBXQVJOSU5HOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9idWYgcGx1Z2lucyBvciBzcGVjaWFsCiBjYXNlcyBsaWtlIHRoZSBwcm90byBjb21waWxlci4gT3RoZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBAsCBQQSBJAFAgoKDQoFBAsCBQYSBJAFCxUKDQoFBAsCBQESBJAFFh4KDQoFBAsCBQMSBJAFISMKTwoEBAsCBhIEkwUCOhpBIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgoKDQoFBAsCBgQSBJMFAgoKDQoFBAsCBgYSBJMFCx4KDQoFBAsCBgESBJMFHzMKDQoFBAsCBgMSBJMFNjkKWgoDBAsFEgSWBQIZGk0gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQECwUAEgSWBQ0YCg0KBQQLBQABEgSWBQ0RCg0KBQQLBQACEgSWBRUYCgwKAgQMEgaZBQC/BgEKCwoDBAwBEgSZBQgUCsIDCgQEDAIAEgShBQJFGrMDIE5PVEU6IGN0eXBlIGlzIGRlcHJlY2F0ZWQuIFVzZSBgZmVhdHVyZXMuKHBiLmNwcCkuc3RyaW5nX3R5cGVgIGluc3RlYWQuCiBUaGUgY3R5cGUgb3B0aW9uIGluc3RydWN0cyB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHRvIHVzZSBhIGRpZmZlcmVudAogcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuICBTZWUgdGhlIHNwZWNpZmljCiBvcHRpb25zIGJlbG93LiAgVGhpcyBvcHRpb24gaXMgb25seSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IHVzZSBvZgogW2N0eXBlPUNPUkRdIGFuZCBbY3R5cGU9U1RSSU5HXSAodGhlIGRlZmF1bHQpIG9uIG5vbi1yZXBlYXRlZCBmaWVsZHMgb2YKIHR5cGUgImJ5dGVzIiBpbiB0aGUgb3BlbiBzb3VyY2UgcmVsZWFzZS4KIFRPRE86IG1ha2UgY3R5cGUgYWN0dWFsbHkgZGVwcmVjYXRlZC4KCg0KBQQMAgAEEgShBQIKCg0KBQQMAgAGEgShBQsQCg0KBQQMAgABEgShBREWCg0KBQQMAgADEgShBRkaCg0KBQQMAgAIEgShBRtECg0KBQQMAgAHEgShBTNDCg4KBAQMBAASBqIFAq8FAwoNCgUEDAQAARIEogUHDAofCgYEDAQAAgASBKQFBA8aDyBEZWZhdWx0IG1vZGUuCgoPCgcEDAQAAgABEgSkBQQKCg8KBwQMBAACAAISBKQFDQ4KlgMKBgQMBAACARIErAUEDRqFAyBUaGUgb3B0aW9uIFtjdHlwZT1DT1JEXSBtYXkgYmUgYXBwbGllZCB0byBhIG5vbi1yZXBlYXRlZCBmaWVsZCBvZiB0eXBlCiAiYnl0ZXMiLiBJdCBpbmRpY2F0ZXMgdGhhdCBpbiBDKyssIHRoZSBkYXRhIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBDb3JkCiBpbnN0ZWFkIG9mIGEgc3RyaW5nLiAgRm9yIHZlcnkgbGFyZ2Ugc3RyaW5ncywgdGhpcyBtYXkgcmVkdWNlIG1lbW9yeQogZnJhZ21lbnRhdGlvbi4gSXQgbWF5IGFsc28gYWxsb3cgYmV0dGVyIHBlcmZvcm1hbmNlIHdoZW4gcGFyc2luZyBmcm9tIGEKIENvcmQsIG9yIHdoZW4gcGFyc2luZyB3aXRoIGFsaWFzaW5nIGVuYWJsZWQsIGFzIHRoZSBwYXJzZWQgQ29yZCBtYXkgdGhlbgogYWxpYXMgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KCg8KBwQMBAACAQESBKwFBAgKDwoHBAwEAAIBAhIErAULDAoOCgYEDAQAAgISBK4FBBUKDwoHBAwEAAICARIErgUEEAoPCgcEDAQAAgICEgSuBRMUCtMDCgQEDAIBEgS3BQIbGsQDIFRoZSBwYWNrZWQgb3B0aW9uIGNhbiBiZSBlbmFibGVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIGVuYWJsZQogYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQogd3JpdGluZyB0aGUgdGFnIGFuZCB0eXBlIGZvciBlYWNoIGVsZW1lbnQsIHRoZSBlbnRpcmUgYXJyYXkgaXMgZW5jb2RlZCBhcwogYSBzaW5nbGUgbGVuZ3RoLWRlbGltaXRlZCBibG9iLiBJbiBwcm90bzMsIG9ubHkgZXhwbGljaXQgc2V0dGluZyBpdCB0bwogZmFsc2Ugd2lsbCBhdm9pZCB1c2luZyBwYWNrZWQgZW5jb2RpbmcuICBUaGlzIG9wdGlvbiBpcyBwcm9oaWJpdGVkIGluCiBFZGl0aW9ucywgYnV0IHRoZSBgcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmdgIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gY29udHJvbAogdGhlIGJlaGF2aW9yLgoKDQoFBAwCAQQSBLcFAgoKDQoFBAwCAQUSBLcFCw8KDQoFBAwCAQESBLcFEBYKDQoFBAwCAQMSBLcFGRoKmgUKBAQMAgISBMQFAjMaiwUgVGhlIGpzdHlwZSBvcHRpb24gZGV0ZXJtaW5lcyB0aGUgSmF2YVNjcmlwdCB0eXBlIHVzZWQgZm9yIHZhbHVlcyBvZiB0aGUKIGZpZWxkLiAgVGhlIG9wdGlvbiBpcyBwZXJtaXR0ZWQgb25seSBmb3IgNjQgYml0IGludGVncmFsIGFuZCBmaXhlZCB0eXBlcwogKGludDY0LCB1aW50NjQsIHNpbnQ2NCwgZml4ZWQ2NCwgc2ZpeGVkNjQpLiAgQSBmaWVsZCB3aXRoIGpzdHlwZSBKU19TVFJJTkcKIGlzIHJlcHJlc2VudGVkIGFzIEphdmFTY3JpcHQgc3RyaW5nLCB3aGljaCBhdm9pZHMgbG9zcyBvZiBwcmVjaXNpb24gdGhhdAogY2FuIGhhcHBlbiB3aGVuIGEgbGFyZ2UgdmFsdWUgaXMgY29udmVydGVkIHRvIGEgZmxvYXRpbmcgcG9pbnQgSmF2YVNjcmlwdC4KIFNwZWNpZnlpbmcgSlNfTlVNQkVSIGZvciB0aGUganN0eXBlIGNhdXNlcyB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQgY29kZSB0bwogdXNlIHRoZSBKYXZhU2NyaXB0ICJudW1iZXIiIHR5cGUuICBUaGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgb3B0aW9uCiBKU19OT1JNQUwgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LgoKIFRoaXMgb3B0aW9uIGlzIGFuIGVudW0gdG8gcGVybWl0IGFkZGl0aW9uYWwgdHlwZXMgdG8gYmUgYWRkZWQsIGUuZy4KIGdvb2cubWF0aC5JbnRlZ2VyLgoKDQoFBAwCAgQSBMQFAgoKDQoFBAwCAgYSBMQFCxEKDQoFBAwCAgESBMQFEhgKDQoFBAwCAgMSBMQFGxwKDQoFBAwCAggSBMQFHTIKDQoFBAwCAgcSBMQFHjEKDgoEBAwEARIGxQUCzgUDCg0KBQQMBAEBEgTFBQcNCicKBgQMBAECABIExwUEEhoXIFVzZSB0aGUgZGVmYXVsdCB0eXBlLgoKDwoHBAwEAQIAARIExwUEDQoPCgcEDAQBAgACEgTHBRARCikKBgQMBAECARIEygUEEhoZIFVzZSBKYXZhU2NyaXB0IHN0cmluZ3MuCgoPCgcEDAQBAgEBEgTKBQQNCg8KBwQMBAECAQISBMoFEBEKKQoGBAwEAQICEgTNBQQSGhkgVXNlIEphdmFTY3JpcHQgbnVtYmVycy4KCg8KBwQMBAECAgESBM0FBA0KDwoHBAwEAQICAhIEzQUQEQqZCgoEBAwCAxIE5gUCKxqKCiBTaG91bGQgdGhpcyBmaWVsZCBiZSBwYXJzZWQgbGF6aWx5PyAgTGF6eSBhcHBsaWVzIG9ubHkgdG8gbWVzc2FnZS10eXBlCiBmaWVsZHMuICBJdCBtZWFucyB0aGF0IHdoZW4gdGhlIG91dGVyIG1lc3NhZ2UgaXMgaW5pdGlhbGx5IHBhcnNlZCwgdGhlCiBpbm5lciBtZXNzYWdlJ3MgY29udGVudHMgd2lsbCBub3QgYmUgcGFyc2VkIGJ1dCBpbnN0ZWFkIHN0b3JlZCBpbiBlbmNvZGVkCiBmb3JtLiAgVGhlIGlubmVyIG1lc3NhZ2Ugd2lsbCBhY3R1YWxseSBiZSBwYXJzZWQgd2hlbiBpdCBpcyBmaXJzdCBhY2Nlc3NlZC4KCiBUaGlzIGlzIG9ubHkgYSBoaW50LiAgSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZQogZWFnZXIgb3IgbGF6eSBwYXJzaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uLiAgSG93ZXZlciwKIHNldHRpbmcgdGhpcyBvcHRpb24gdHJ1ZSBzdWdnZXN0cyB0aGF0IHRoZSBwcm90b2NvbCBhdXRob3IgYmVsaWV2ZXMgdGhhdAogdXNpbmcgbGF6eSBwYXJzaW5nIG9uIHRoaXMgZmllbGQgaXMgd29ydGggdGhlIGFkZGl0aW9uYWwgYm9va2tlZXBpbmcKIG92ZXJoZWFkIHR5cGljYWxseSBuZWVkZWQgdG8gaW1wbGVtZW50IGl0LgoKIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhbnkgZ2VuZXJhdGVkIGNvZGU7CiBhbGwgbWV0aG9kIHNpZ25hdHVyZXMgcmVtYWluIHRoZSBzYW1lLiAgRnVydGhlcm1vcmUsIHRocmVhZC1zYWZldHkgb2YgdGhlCiBpbnRlcmZhY2UgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgb3B0aW9uOyBjb25zdCBtZXRob2RzIHJlbWFpbiBzYWZlIHRvCiBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHdoaWxlIG5vbi1jb25zdCBtZXRob2RzIGNvbnRpbnVlCiB0byByZXF1aXJlIGV4Y2x1c2l2ZSBhY2Nlc3MuCgogTm90ZSB0aGF0IGxhenkgbWVzc2FnZSBmaWVsZHMgYXJlIHN0aWxsIGVhZ2VybHkgdmVyaWZpZWQgdG8gY2hlY2sKIGlsbC1mb3JtZWQgd2lyZWZvcm1hdCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gQ2FsbGluZyBJc0luaXRpYWxpemVkKCkKIG9uIHRoZSBvdXRlciBtZXNzYWdlIHdvdWxkIGZhaWwgaWYgdGhlIGlubmVyIG1lc3NhZ2UgaGFzIG1pc3NpbmcgcmVxdWlyZWQKIGZpZWxkcy4gRmFpbGVkIHZlcmlmaWNhdGlvbiB3b3VsZCByZXN1bHQgaW4gcGFyc2luZyBmYWlsdXJlIChleGNlcHQgd2hlbgogdW5pbml0aWFsaXplZCBtZXNzYWdlcyBhcmUgYWNjZXB0YWJsZSkuCgoNCgUEDAIDBBIE5gUCCgoNCgUEDAIDBRIE5gULDwoNCgUEDAIDARIE5gUQFAoNCgUEDAIDAxIE5gUXGAoNCgUEDAIDCBIE5gUZKgoNCgUEDAIDBxIE5gUaKQqvAQoEBAwCBBIE6wUCNxqgASB1bnZlcmlmaWVkX2xhenkgZG9lcyBubyBjb3JyZWN0bmVzcyBjaGVja3Mgb24gdGhlIGJ5dGUgc3RyZWFtLiBUaGlzIHNob3VsZAogb25seSBiZSB1c2VkIHdoZXJlIGxhenkgd2l0aCB2ZXJpZmljYXRpb24gaXMgcHJvaGliaXRpdmUgZm9yIHBlcmZvcm1hbmNlCiByZWFzb25zLgoKDQoFBAwCBAQSBOsFAgoKDQoFBAwCBAUSBOsFCw8KDQoFBAwCBAESBOsFEB8KDQoFBAwCBAMSBOsFIiQKDQoFBAwCBAgSBOsFJTYKDQoFBAwCBAcSBOsFJjUK6AEKBAQMAgUSBPEFAjEa2QEgSXMgdGhpcyBmaWVsZCBkZXByZWNhdGVkPwogRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwogZm9yIGFjY2Vzc29ycywgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LCB0aGlzCiBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpZWxkcy4KCg0KBQQMAgUEEgTxBQIKCg0KBQQMAgUFEgTxBQsPCg0KBQQMAgUBEgTxBRAaCg0KBQQMAgUD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iAcfMwoNCgUEDwIEAxIEiAc2OQpaCgMEDwUSBIsHAhkaTSBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KCgwKBAQPBQASBIsHDRgKDQoFBA8FAAESBIsHDREKDQoFBA8FAAISBIsHFRgKDAoCBBASBo4HAKYHAQoLCgMEEAESBI4HCBYKkQIKBAQQAgASBJQHAiQaggIgQW55IGZlYXR1cmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljIGVkaXRpb24uCiBXQVJOSU5HOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9idWYgcGx1Z2lucyBvciBzcGVjaWFsCiBjYXNlcyBsaWtlIHRoZSBwcm90byBjb21waWxlci4gT3RoZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBBACAAQSBJQHAgoKDQoFBBACAAYSBJQHCxUKDQoFBBACAAESBJQHFh4KDQoFBBACAAMSBJQHISMK2QMKBAQQAgESBJ8HAjIa3wEgSXMgdGhpcyBzZXJ2aWNlIGRlcHJlY2F0ZWQ/CiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCiBmb3IgdGhlIHNlcnZpY2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBzZXJ2aWNlcy4KMugBIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQwogICBmcmFtZXdvcmsuICBXZSBhcG9sb2dpemUgZm9yIGhvYXJkaW5nIHRoZXNlIG51bWJlcnMgdG8gb3Vyc2Vs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ZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBBECAgQSBMQHAgoKDQoFBBECAgYSBMQHCxUKDQoFBBECAgESBMQHFh4KDQoFBBECAgMSBMQHISMKTwoEBBECAxIExwcCOhpBIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgoKDQoFBBECAwQSBMcHAgoKDQoFBBECAwYSBMcHCx4KDQoFBBECAwESBMcHHzMKDQoFBBECAwMSBMcHNjkKWgoDBBEFEgTKBwIZGk0gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQEEQUAEgTKBw0YCg0KBQQRBQABEgTKBw0RCg0KBQQRBQACEgTKBxUYCosDCgIEEhIG0wcA5wcBGvwCIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQogYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgogRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCiBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCiBpbiB0aGVtLgoKCwoDBBIBEgTTBwgbCssCCgQEEgMAEgbZBwLcBwMaugIgVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0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bWluaW11bSBzdXBwb3J0ZWQgZWRpdGlvbiAoaW5jbHVzaXZlKSB3aGVuIHRoaXMgd2FzIGNvbnN0cnVjdGVkLgogRWRpdGlvbnMgYmVmb3JlIHRoaXMgd2lsbCBub3QgaGF2ZSBkZWZhdWx0cy4KCg0KBQQUAgEEEgTDCQIKCg0KBQQUAgEGEgTDCQsSCg0KBQQUAgEBEgTDCRMiCg0KBQQUAgEDEgTDCSUmCoYBCgQEFAICEgTHCQInGnggVGhlIG1heGltdW0ga25vd24gZWRpdGlvbiAoaW5jbHVzaXZlKSB3aGVuIHRoaXMgd2FzIGNvbnN0cnVjdGVkLiBFZGl0aW9ucwogYWZ0ZXIgdGhpcyB3aWxsIG5vdCBoYXZlIHJlbGlhYmxlIGRlZmF1bHRzLgoKDQoFBBQCAgQSBMcJAgoKDQoFBBQCAgYSBMcJCxIKDQoFBBQCAgESBMcJEyIKDQoFBBQCAgMSBMcJJSYK2gEKAgQVEgbPCQDXCgEaaiBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggYQogRmlsZURlc2NyaXB0b3JQcm90byB3YXMgZ2VuZXJhdGVkLgoyYCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBPcHRpb25hbCBzb3VyY2UgY29kZSBpbmZvCgoLCgMEFQESBM8JCBYKghEKBAQVAgASBPsJAiEa8xAgQSBMb2NhdGlvbiBpZGVudGlmaWVzIGEgcGllY2Ugb2Ygc291cmNlIGNvZGUgaW4gYSAucHJvdG8gZmlsZSB3aGljaAogY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGRlZmluaXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkCiB0byBiZSB1c2VmdWwgdG8gSURFcywgY29kZSBpbmRleGVycywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3JzLCBhbmQgc2ltaWxhcgogdG9vbHMuCgogRm9yIGV4YW1wbGUsIHNheSB3ZSBoYXZlIGEgZmlsZSBsaWtlOgogICBtZXNzYWdlIEZvbyB7CiAgICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CiAgIH0KIExldCdzIGxvb2sgYXQganVzdCB0aGUgZmllbGQgZGVmaW5pdGlvbjoKICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CiAgIF4gICAgICAgXl4gICAgIF5eICBeICBeXl4KICAgYSAgICAgICBiYyAgICAgZGUgIGYgIGdoaQogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKICAgc3BhbiAgIHBhdGggICAgICAgICAgICAgICByZXByZXNlbnRzCiAgIFthLGkpICBbIDQsIDAsIDIsIDAgXSAgICAgVGhlIHdob2xlIGZpZWxkIGRlZmluaXRpb24uCiAgIFthLGIpICBbIDQsIDAsIDIsIDAsIDQgXSAgVGhlIGxhYmVsIChvcHRpb25hbCkuCiAgIFtjLGQpICBbIDQsIDAsIDIsIDAsIDUgXSAgVGhlIHR5cGUgKHN0cmluZykuCiAgIFtlLGYpICBbIDQsIDAsIDIsIDAsIDEgXSAgVGhlIG5hbWUgKGZvbykuCiAgIFtnLGgpICBbIDQsIDAsIDIsIDAsIDMgXSAgVGhlIG51bWJlciAoMSkuCgogTm90ZXM6CiAtIEEgbG9jYXRpb24gbWF5IHJlZmVyIHRvIGEgcmVwZWF0ZWQgZmllbGQgaXRzZWxmIChpLmUuIG5vdCB0byBhbnkKICAgcGFydGljdWxhciBpbmRleCB3aXRoaW4gaXQpLiAgVGhpcyBpcyB1c2VkIHdoZW5ldmVyIGEgc2V0IG9mIGVsZW1lbnRzIGFyZQogICBsb2dpY2FsbHkgZW5jbG9zZWQgaW4gYSBzaW5nbGUgY29kZSBzZWdtZW50LiAgRm9yIGV4YW1wbGUsIGFuIGVudGlyZQogICBleHRlbmQgYmxvY2sgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgZXh0ZW5zaW9uIGRlZmluaXRpb25zKSB3aWxsCiAgIGhhdmUgYW4gb3V0ZXIgbG9jYXRpb24gd2hvc2UgcGF0aCByZWZlcnMgdG8gdGhlICJleHRlbnNpb25zIiByZXBlYXRlZAogICBmaWVsZCB3aXRob3V0IGFuIGluZGV4LgogLSBNdWx0aXBsZSBsb2NhdGlvbnMgbWF5IGhhdmUgdGhlIHNhbWUgcGF0aC4gIFRoaXMgaGFwcGVucyB3aGVuIGEgc2luZ2xlCiAgIGxvZ2ljYWwgZGVjbGFyYXRpb24gaXMgc3ByZWFkIG91dCBhY3Jvc3MgbXVsdGlwbGUgcGxhY2VzLiAgVGhlIG1vc3QKICAgb2J2aW91cyBleGFtcGxlIGlzIHRoZSAiZXh0ZW5kIiBibG9jayBhZ2FpbiAtLSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUKICAgZXh0ZW5kIGJsb2NrcyBpbiB0aGUgc2FtZSBzY29wZSwgZWFjaCBvZiB3aGljaCB3aWxsIGhhdmUgdGhlIHNhbWUgcGF0aC4KIC0gQSBsb2NhdGlvbidzIHNwYW4gaXMgbm90IGFsd2F5cyBhIHN1YnNldCBvZiBpdHMgcGFyZW50J3Mgc3Bhbi4gIEZvcgogICBleGFtcGxlLCB0aGUgImV4dGVuZGVlIiBvZiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24gYXBwZWFycyBhdCB0aGUKICAgYmVnaW5uaW5nIG9mIHRoZSAiZXh0ZW5kIiBibG9jayBhbmQgaXMgc2hhcmVkIGJ5IGFsbCBleHRlbnNpb25zIHdpdGhpbgogICB0aGUgYmxvY2suCiAtIEp1c3QgYmVjYXVzZSBhIGxvY2F0aW9uJ3Mgc3BhbiBpcyBhIHN1YnNldCBvZiBzb21lIG90aGVyIGxvY2F0aW9uJ3Mgc3BhbgogICBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgYSBkZXNjZW5kYW50LiAgRm9yIGV4YW1wbGUsIGEgImdyb3VwIiBkZWZpbmVzCiAgIGJvdGggYSB0eXBlIGFuZCBhIGZpZWxkIGluIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgVGh1cywgdGhlIGxvY2F0aW9ucwogICBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGFuZCBmaWVsZCBhbmQgdGhlaXIgY29tcG9uZW50cyB3aWxsIG92ZXJsYXAuCiAtIENvZGUgd2hpY2ggdHJpZXMgdG8gaW50ZXJwcmV0IGxvY2F0aW9ucyBzaG91bGQgcHJvYmFibHkgYmUgZGVzaWduZWQgdG8KICAgaWdub3JlIHRob3NlIHRoYXQgaXQgZG9lc24ndCB1bmRlcnN0YW5kLCBhcyBtb3JlIHR5cGVzIG9mIGxvY2F0aW9ucyBjb3VsZAogICBiZSByZWNvcmRlZCBpbiB0aGUgZnV0dXJlLgoKDQoFBBUCAAQSBPsJAgoKDQoFBBUCAAYSBPsJCxMKDQoFBBUCAAESBPsJFBwKDQoFBBUCAAMSBPsJHyAKDgoEBBUDABIG/AkCzwoDCg0KBQQVAwABEgT8CQoSCooHCgYEFQMAAgASBJQKBCwa+QYgSWRlbnRpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHdhcyBkZWZpbmVkIGF0IHRoaXMKIGxvY2F0aW9uLgoKIEVhY2ggZWxlbWVudCBpcyBhIGZpZWxkIG51bWJlciBvciBhbiBpbmRleC4gIFRoZXkgZm9ybSBhIHBhdGggZnJvbQogdGhlIHJvb3QgRmlsZURlc2NyaXB0b3JQcm90byB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIGRlZmluaXRpb24gYXBwZWFycy4KIEZvciBleGFtcGxlLCB0aGlzIHBhdGg6CiAgIFsgNCwgMywgMiwgNywgMSBdCiByZWZlcnMgdG86CiAgIGZpbGUubWVzc2FnZV90eXBlKDMpICAvLyA0LCAzCiAgICAgICAuZmllbGQoNykgICAgICAgICAvLyAyLCA3CiAgICAgICAubmFtZSgpICAgICAgICAgICAvLyAxCiBUaGlzIGlzIGJlY2F1c2UgRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUgaGFzIGZpZWxkIG51bWJlciA0OgogICByZXBlYXRlZCBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKIGFuZCBEZXNjcmlwdG9yUHJvdG8uZmllbGQgaGFzIGZpZWxkIG51bWJlciAyOgogICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CiBhbmQgRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSBoYXMgZmllbGQgbnVtYmVyIDE6CiAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKCiBUaHVzLCB0aGUgYWJvdmUgcGF0aCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgYSBmaWVsZCBuYW1lLiAgSWYgd2UgcmVtb3ZlZAogdGhlIGxhc3QgZWxlbWVudDoKICAgWyA0LCAzLCAyLCA3IF0KIHRoaXMgcGF0aCByZWZlcnMgdG8gdGhlIHdob2xlIGZpZWxkIGRlY2xhcmF0aW9uIChmcm9tIHRoZSBiZWdpbm5pbmcKIG9mIHRoZSBsYWJlbCB0byB0aGUgdGVybWluYXRpbmcgc2VtaWNvbG9uKS4KCg8KBwQVAwACAAQSBJQKBAwKDwoHBBUDAAIABRIElAoNEgoPCgcEFQMAAgABEgSUChMXCg8KBwQVAwACAAMSBJQKGhsKDwoHBBUDAAIACBIElAocKwoQCggEFQMAAgAIAhIElAodKgrSAgoGBBUDAAIBEgSbCgQsGsECIEFsd2F5cyBoYXMgZXhhY3RseSB0aHJlZSBvciBmb3VyIGVsZW1lbnRzOiBzdGFydCBsaW5lLCBzdGFydCBjb2x1bW4sCiBlbmQgbGluZSAob3B0aW9uYWwsIG90aGVyd2lzZSBhc3N1bWVkIHNhbWUgYXMgc3RhcnQgbGluZSksIGVuZCBjb2x1bW4uCiBUaGVzZSBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgZmllbGQgZm9yIGVmZmljaWVuY3kuICBOb3RlIHRoYXQgbGluZQogYW5kIGNvbHVtbiBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkIC0tIHR5cGljYWxseSB5b3Ugd2lsbCB3YW50IHRvIGFkZAogMSB0byBlYWNoIGJlZm9yZSBkaXNwbGF5aW5nIHRvIGEgdXNlci4KCg8KBwQVAwACAQQSBJsKBAwKDwoHBBUDAAIBBRIEmwoNEgoPCgcEFQMAAgEBEgSbChMXCg8KBwQVAwACAQMSBJsKGhsKDwoHBBUDAAIBCBIEmwocKwoQCggEFQMAAgEIAhIEmwodKgqlDAoGBBUDAAICEgTMCgQpGpQMIElmIHRoaXMgU291cmNlQ29kZUluZm8gcmVwcmVzZW50cyBhIGNvbXBsZXRlIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgYW55CiBjb21tZW50cyBhcHBlYXJpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjbGFyYXRpb24gd2hpY2ggYXBwZWFyIHRvIGJlCiBhdHRhY2hlZCB0byB0aGUgZGVjbGFyYXRpb24uCgogQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKIHRva2VucyBhcHBlYXJpbmcgb24gdGhvc2UgbGluZXMsIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNpbmdsZSBjb21tZW50LgoKIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgd2lsbCBrZWVwIHBhcmFncmFwaHMgb2YgY29tbWVudHMgdGhhdCBhcHBlYXIKIGJlZm9yZSAoYnV0IG5vdCBjb25uZWN0ZWQgdG8pIHRoZSBjdXJyZW50IGVsZW1lbnQuIEVhY2ggcGFyYWdyYXBoLAogc2VwYXJhdGVkIGJ5IGVtcHR5IGxpbmVzLCB3aWxsIGJlIG9uZSBjb21tZW50IGVsZW1lbnQgaW4gdGhlIHJlcGVhdGVkCiBmaWVsZC4KCiBPbmx5IHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcHJvdmlkZWQ7IGNvbW1lbnQgbWFya2VycyAoZS5nLiAvLykgYXJlCiBzdHJpcHBlZCBvdXQuICBGb3IgYmxvY2sgY29tbWVudHMsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgYW4gYXN0ZXJpc2sKIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4KIE5ld2xpbmVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgoKIEV4YW1wbGVzOgoKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gZm9vLgogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhci4KICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKCiAgIG9wdGlvbmFsIHN0cmluZyBiYXogPSAzOwogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIGJhei4KCiAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gbW9vLgogICAv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Z2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCAoBAhIDIAAYCggKAQgSAyIAHwoJCgIIHxIDIgAfCggKAQgSAyMASAoJCgIICxIDIwBICggKAQgSAyQALAoJCgIIARIDJAAsCggKAQgSAyUALgoJCgIICBIDJQAuCggKAQgSAyYAIgoJCgIIChIDJgAiCggKAQgSAycAIQoJCgIIJBIDJwAhCggKAQgSAygAOwoJCgIIJRIDKAA7Cp0QCgIEABIEZQByARqQECBBIER1cmF0aW9uIHJlcHJlc2VudHMgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCBzcGFuIG9mIHRpbWUgcmVwcmVzZW50ZWQKIGFzIGEgY291bnQgb2Ygc2Vjb25kcyBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMgYXQgbmFub3NlY29uZAogcmVzb2x1dGlvbi4gSXQgaXMgaW5kZXBlbmRlbnQgb2YgYW55IGNhbGVuZGFyIGFuZCBjb25jZXB0cyBsaWtlICJkYXkiCiBvciAibW9udGgiLiBJdCBpcyByZWxhdGVkIHRvIFRpbWVzdGFtcCBpbiB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KIHR3byBUaW1lc3RhbXAgdmFsdWVzIGlzIGEgRHVyYXRpb24gYW5kIGl0IGNhbiBiZSBhZGRlZCBvciBzdWJ0cmFjdGVkCiBmcm9tIGEgVGltZXN0YW1wLiBSYW5nZSBpcyBhcHByb3hpbWF0ZWx5ICstMTAsMDAwIHllYXJzLgoKICMgRXhhbXBsZXMKCiBFeGFtcGxlIDE6IENvbXB1dGUgRHVyYXRpb24gZnJvbSB0d28gVGltZXN0YW1wcyBpbiBwc2V1ZG8gY29kZS4KCiAgICAgVGltZXN0YW1wIHN0YXJ0ID0gLi4uOwogICAgIFRpbWVzdGFtcCBlbmQgPSAuLi47CiAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47CgogICAgIGR1cmF0aW9uLnNlY29uZHMgPSBlbmQuc2Vjb25kcyAtIHN0YXJ0LnNlY29uZHM7CiAgICAgZHVyYXRpb24ubmFub3MgPSBlbmQubmFub3MgLSBzdGFydC5uYW5vczsKCiAgICAgaWYgKGR1cmF0aW9uLnNlY29uZHMgPCAwICYmIGR1cmF0aW9uLm5hbm9zID4gMCkgewogICAgICAgZHVyYXRpb24uc2Vjb25kcyArPSAxOwogICAgICAgZHVyYXRpb24ubmFub3MgLT0gMTAwMDAwMDAwMDsKICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uLnNlY29uZHMgPiAwICYmIGR1cmF0aW9uLm5hbm9zIDwgMCkgewogICAgICAgZHVyYXRpb24uc2Vjb25kcyAtPSAxOwogICAgICAgZHVyYXRpb24ubmFub3MgKz0gMTAwMDAwMDAwMDsKICAgICB9CgogRXhhbXBsZSAyOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFRpbWVzdGFtcCArIER1cmF0aW9uIGluIHBzZXVkbyBjb2RlLgoKICAgICBUaW1lc3RhbXAgc3RhcnQgPSAuLi47CiAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47CiAgICAgVGltZXN0YW1wIGVuZCA9IC4uLjsKCiAgICAgZW5kLnNlY29uZHMgPSBzdGFydC5zZWNvbmRzICsgZHVyYXRpb24uc2Vjb25kczsKICAgICBlbmQubmFub3MgPSBzdGFydC5uYW5vcyArIGR1cmF0aW9uLm5hbm9zOwoKICAgICBpZiAoZW5kLm5hbm9zIDwgMCkgewogICAgICAgZW5kLnNlY29uZHMgLT0gMTsKICAgICAgIGVuZC5uYW5vcyArPSAxMDAwMDAwMDAwOwogICAgIH0gZWxzZSBpZiAoZW5kLm5hbm9zID49IDEwMDAwMDAwMDApIHsKICAgICAgIGVuZC5zZWNvbmRzICs9IDE7CiAgICAgICBlbmQubmFub3MgLT0gMTAwMDAwMDAwMDsKICAgICB9CgogRXhhbXBsZSAzOiBDb21wdXRlIER1cmF0aW9uIGZyb20gZGF0ZXRpbWUudGltZWRlbHRhIGluIFB5dGhvbi4KCiAgICAgdGQgPSBkYXRldGltZS50aW1lZGVsdGEoZGF5cz0zLCBtaW51dGVzPTEwKQogICAgIGR1cmF0aW9uID0gRHVyYXRpb24oKQogICAgIGR1cmF0aW9uLkZyb21UaW1lZGVsdGEodGQpCgogIyBKU09OIE1hcHBpbmcKCiBJbiBKU09OIGZvcm1hdCwgdGhlIER1cmF0aW9uIHR5cGUgaXMgZW5jb2RlZCBhcyBhIHN0cmluZyByYXRoZXIgdGhhbiBhbgogb2JqZWN0LCB3aGVyZSB0aGUgc3RyaW5nIGVuZHMgaW4gdGhlIHN1ZmZpeCAicyIgKGluZGljYXRpbmcgc2Vjb25kcykgYW5kCiBpcyBwcmVjZWRlZCBieSB0aGUgbnVtYmVyIG9mIHNlY29uZHMsIHdpdGggbmFub3NlY29uZHMgZXhwcmVzc2VkIGFzCiBmcmFjdGlvbmFsIHNlY29uZHMuIEZvciBleGFtcGxlLCAzIHNlY29uZHMgd2l0aCAwIG5hbm9zZWNvbmRzIHNob3VsZCBiZQogZW5jb2RlZCBpbiBKU09OIGZvcm1hdCBhcyAiM3MiLCB3aGlsZSAzIHNlY29uZHMgYW5kIDEgbmFub3NlY29uZCBzaG91bGQKIGJlIGV4cHJlc3NlZCBpbiBKU09OIGZvcm1hdCBhcyAiMy4wMDAwMDAwMDFzIiwgYW5kIDMgc2Vjb25kcyBhbmQgMQogbWljcm9zZWNvbmQgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBKU09OIGZvcm1hdCBhcyAiMy4wMDAwMDFzIi4KCgoKCgMEAAESA2UIEArcAQoEBAACABIDaQIUGs4BIFNpZ25lZCBzZWNvbmRzIG9mIHRoZSBzcGFuIG9mIHRpbWUuIE11c3QgYmUgZnJvbSAtMzE1LDU3NiwwMDAsMDAwCiB0byArMzE1LDU3NiwwMDAsMDAwIGluY2x1c2l2ZS4gTm90ZTogdGhlc2UgYm91bmRzIGFyZSBjb21wdXRlZCBmcm9tOgogNjAgc2VjL21pbiAqIDYwIG1pbi9ociAqIDI0IGhyL2RheSAqIDM2NS4yNSBkYXlzL3llYXIgKiAxMDAwMCB5ZWFycwoKDAoFBAACAAUSA2kCBwoMCgUEAAIAARIDaQgPCgwKBQQAAgADEgNpEhMKgwMKBAQAAgESA3ECEhr1AiBTaWduZWQgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBvZiB0aGUgc3Bhbgogb2YgdGltZS4gRHVyYXRpb25zIGxlc3MgdGhhbiBvbmUgc2Vjb25kIGFyZSByZXByZXNlbnRlZCB3aXRoIGEgMAogYHNlY29uZHNgIGZpZWxkIGFuZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGBuYW5vc2AgZmllbGQuIEZvciBkdXJhdGlvbnMKIG9mIG9uZSBzZWNvbmQgb3IgbW9yZSwgYSBub24temVybyB2YWx1ZSBmb3IgdGhlIGBuYW5vc2AgZmllbGQgbXVzdCBiZQogb2YgdGhlIHNhbWUgc2lnbiBhcyB0aGUgYHNlY29uZHNgIGZpZWxkLiBNdXN0IGJlIGZyb20gLTk5OSw5OTksOTk5CiB0byArOTk5LDk5OSw5OTkgaW5jbHVzaXZlLgoKDAoFBAACAQUSA3ECBwoMCgUEAAIBARIDcQgNCgwKBQQAAgEDEgNxEBFiBnByb3RvMwqKPQogZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIhCglGaWVsZE1hc2sSFAoFcGF0aHMYASADKAlSBXBhdGhzQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5GaWVsZE1hc2tQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9maWVsZG1hc2twYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc0qhOwoHEgUeAPQBAQrMDAoBDBIDHgASMsEMIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCAoBAhIDIAAYCggKAQgSAyIALAoJCgIIARIDIgAsCggKAQgSAyMALwoJCgIICBIDIwAvCggKAQgSAyQAIgoJCgIIChIDJAAiCggKAQgSAyUAIQoJCgIIJBIDJQAhCggKAQgSAyYAOwoJCgIIJRIDJgA7CggKAQgSAycASQoJCgIICxIDJwBJCggKAQgSAygAHwoJCgIIHxIDKAAfCrIsCgIEABIG8QEA9AEBGqMsIGBGaWVsZE1hc2tgIHJlcHJlc2VudHMgYSBzZXQgb2Ygc3ltYm9saWMgZmllbGQgcGF0aHMsIGZvciBleGFtcGxlOgoKICAgICBwYXRoczogImYuYSIKICAgICBwYXRoczogImYuYi5kIgoKIEhlcmUgYGZgIHJlcHJlc2VudHMgYSBmaWVsZCBpbiBzb21lIHJvb3QgbWVzc2FnZSwgYGFgIGFuZCBgYmAKIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBmb3VuZCBpbiBgZmAsIGFuZCBgZGAgYSBmaWVsZCBmb3VuZCBpbiB0aGUKIG1lc3NhZ2UgaW4gYGYuYmAuCgogRmllbGQgbWFza3MgYXJlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiBmaWVsZHMgdGhhdCBzaG91bGQgYmUKIHJldHVybmVkIGJ5IGEgZ2V0IG9wZXJhdGlvbiBvciBtb2RpZmllZCBieSBhbiB1cGRhdGUgb3BlcmF0aW9uLgogRmllbGQgbWFza3MgYWxzbyBoYXZlIGEgY3VzdG9tIEpTT04gZW5jb2RpbmcgKHNlZSBiZWxvdykuCgogIyBGaWVsZCBNYXNrcyBpbiBQcm9qZWN0aW9ucwoKIFdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIHByb2plY3Rpb24sIGEgcmVzcG9uc2UgbWVzc2FnZSBvcgogc3ViLW1lc3NhZ2UgaXMgZmlsdGVyZWQgYnkgdGhlIEFQSSB0byBvbmx5IGNvbnRhaW4gdGhvc2UgZmllbGRzIGFzCiBzcGVjaWZpZWQgaW4gdGhlIG1hc2suIEZvciBleGFtcGxlLCBpZiB0aGUgbWFzayBpbiB0aGUgcHJldmlvdXMKIGV4YW1wbGUgaXMgYXBwbGllZCB0byBhIHJlc3BvbnNlIG1lc3NhZ2UgYXMgZm9sbG93czoKCiAgICAgZiB7CiAgICAgICBhIDogMjIKICAgICAgIGIgewogICAgICAgICBkIDogMQogICAgICAgICB4IDogMgogICAgICAgfQogICAgICAgeSA6IDEzCiAgICAgfQogICAgIHo6IDgKCiBUaGUgcmVzdWx0IHdpbGwgbm90IGNvbnRhaW4gc3BlY2lmaWMgdmFsdWVzIGZvciBmaWVsZHMgeCx5IGFuZCB6CiAodGhlaXIgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQsIGFuZCBvbWl0dGVkIGluIHByb3RvIHRleHQKIG91dHB1dCk6CgoKICAgICBmIHsKICAgICAgIGEgOiAyMgogICAgICAgYiB7CiAgICAgICAgIGQgOiAxCiAgICAgICB9CiAgICAgfQoKIEEgcmVwZWF0ZWQgZmllbGQgaXMgbm90IGFsbG93ZWQgZXhjZXB0IGF0IHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEKIHBhdGhzIHN0cmluZy4KCiBJZiBhIEZpZWxkTWFzayBvYmplY3QgaXMgbm90IHByZXNlbnQgaW4gYSBnZXQgb3BlcmF0aW9uLCB0aGUKIG9wZXJhdGlvbiBhcHBsaWVzIHRvIGFsbCBmaWVsZHMgKGFzIGlmIGEgRmllbGRNYXNrIG9mIGFsbCBmaWVsZHMKIGhhZCBiZWVuIHNwZWNpZmllZCkuCgogTm90ZSB0aGF0IGEgZmllbGQgbWFzayBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byB0aGUKIHRvcC1sZXZlbCByZXNwb25zZSBtZXNzYWdlLiBJbiBjYXNlIG9mIGEgUkVTVCBnZXQgb3BlcmF0aW9uLCB0aGUKIGZpZWxkIG1hc2sgYXBwbGllcyBkaXJlY3RseSB0byB0aGUgcmVzcG9uc2UsIGJ1dCBpbiBjYXNlIG9mIGEgUkVTVAogbGlzdCBvcGVyYXRpb24sIHRoZSBtYXNrIGluc3RlYWQgYXBwbGllcyB0byBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZQogaW4gdGhlIHJldHVybmVkIHJlc291cmNlIGxpc3QuIEluIGNhc2Ugb2YgYSBSRVNUIGN1c3RvbSBtZXRob2QsCiBvdGhlciBkZWZpbml0aW9ucyBtYXkgYmUgdXNlZC4gV2hlcmUgdGhlIG1hc2sgYXBwbGllcyB3aWxsIGJlCiBjbGVhcmx5IGRvY3VtZW50ZWQgdG9nZXRoZXIgd2l0aCBpdHMgZGVjbGFyYXRpb24gaW4gdGhlIEFQSS4gIEluCiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvbiB0aGUgcmV0dXJuZWQgcmVzb3VyY2UvcmVzb3VyY2VzIGlzIHJlcXVpcmVkCiBiZWhhdmlvciBmb3IgQVBJcy4KCiAjIEZpZWxkIE1hc2tzIGluIFVwZGF0ZSBPcGVyYXRpb25zCgogQSBmaWVsZCBtYXNrIGluIHVwZGF0ZSBvcGVyYXRpb25zIHNwZWNpZmllcyB3aGljaCBmaWVsZHMgb2YgdGhlCiB0YXJnZXRlZCByZXNvdXJjZSBhcmUgZ29pbmcgdG8gYmUgdXBkYXRlZC4gVGhlIEFQSSBpcyByZXF1aXJlZAogdG8gb25seSBjaGFuZ2UgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzIGFzIHNwZWNpZmllZCBpbiB0aGUgbWFzawogYW5kIGxlYXZlIHRoZSBvdGhlcnMgdW50b3VjaGVkLiBJZiBhIHJlc291cmNlIGlzIHBhc3NlZCBpbiB0bwogZGVzY3JpYmUgdGhlIHVwZGF0ZWQgdmFsdWVzLCB0aGUgQVBJIGlnbm9yZXMgdGhlIHZhbHVlcyBvZiBhbGwKIGZpZWxkcyBub3QgY292ZXJlZCBieSB0aGUgbWFzay4KCiBJZiBhIHJlcGVhdGVkIGZpZWxkIGlzIHNwZWNpZmllZCBmb3IgYW4gdXBkYXRlIG9wZXJhdGlvbiwgbmV3IHZhbHVlcyB3aWxsCiBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcgcmVwZWF0ZWQgZmllbGQgaW4gdGhlIHRhcmdldCByZXNvdXJjZS4gTm90ZSB0aGF0CiBhIHJlcGVhdGVkIGZpZWxkIGlzIG9ubHkgYWxsb3dlZCBpbiB0aGUgbGFzdCBwb3NpdGlvbiBvZiBhIGBwYXRoc2Agc3RyaW5nLgoKIElmIGEgc3ViLW1lc3NhZ2UgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZCBtYXNrIGZvciBhbgogdXBkYXRlIG9wZXJhdGlvbiwgdGhlbiBuZXcgdmFsdWUgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgZXhpc3Rpbmcgc3ViLW1lc3NhZ2UKIGluIHRoZSB0YXJnZXQgcmVzb3VyY2UuCgogRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSB0YXJnZXQgbWVzc2FnZToKCiAgICAgZiB7CiAgICAgICBiIHsKICAgICAgICAgZDogMQogICAgICAgICB4OiAyCiAgICAgICB9CiAgICAgICBjOiBbMV0KICAgICB9CgogQW5kIGFuIHVwZGF0ZSBtZXNzYWdlOgoKICAgICBmIHsKICAgICAgIGIgewogICAgICAgICBkOiAxMAogICAgICAgfQogICAgICAgYzogWzJdCiAgICAgfQoKIHRoZW4gaWYgdGhlIGZpZWxkIG1hc2sgaXM6CgogIHBhdGhzOiBbImYuYiIsICJmLmMiXQoKIHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlOgoKICAgICBmIHsKICAgICAgIGIgewogICAgICAgICBkOiAxMAogICAgICAgICB4OiAyCiAgICAgICB9CiAgICAgICBjOiBbMSwgMl0KICAgICB9CgogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGUgb3B0aW9ucyB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgZm9yCiByZXBlYXRlZCBhbmQgbWVzc2FnZSBmaWVsZHMuCgogSW4gb3JkZXIgdG8gcmVzZXQgYSBmaWVsZCdzIHZhbHVlIHRvIHRoZSBkZWZhdWx0LCB0aGUgZmllbGQgbXVzdAogYmUgaW4gdGhlIG1hc2sgYW5kIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgcHJvdmlkZWQgcmVzb3VyY2UuCiBIZW5jZSwgaW4gb3JkZXIgdG8gcmVzZXQgYWxsIGZpZWxkcyBvZiBhIHJlc291cmNlLCBwcm92aWRlIGEgZGVmYXVsdAogaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGFuZCBzZXQgYWxsIGZpZWxkcyBpbiB0aGUgbWFzaywgb3IgZG8KIG5vdCBwcm92aWRlIGEgbWFzayBhcyBkZXNjcmliZWQgYmVsb3cuCgogSWYgYSBmaWVsZCBtYXNrIGlzIG5vdCBwcmVzZW50IG9uIHVwZGF0ZSwgdGhlIG9wZXJhdGlvbiBhcHBsaWVzIHRvCiBhbGwgZmllbGRzIChhcyBpZiBhIGZpZWxkIG1hc2sgb2YgYWxsIGZpZWxkcyBoYXMgYmVlbiBzcGVjaWZpZWQpLgogTm90ZSB0aGF0IGluIHRoZSBwcmVzZW5jZSBvZiBzY2hlbWEgZXZvbHV0aW9uLCB0aGlzIG1heSBtZWFuIHRoYXQKIGZpZWxkcyB0aGUgY2xpZW50IGRvZXMgbm90IGtub3cgYW5kIGhhcyB0aGVyZWZvcmUgbm90IGZpbGxlZCBpbnRvCiB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlc2V0IHRvIHRoZWlyIGRlZmF1bHQuIElmIHRoaXMgaXMgdW53YW50ZWQKIGJlaGF2aW9yLCBhIHNwZWNpZmljIHNlcnZpY2UgbWF5IHJlcXVpcmUgYSBjbGllbnQgdG8gYWx3YXlzIHNwZWNpZnkKIGEgZmllbGQgbWFzaywgcHJvZHVjaW5nIGFuIGVycm9yIGlmIG5vdC4KCiBBcyB3aXRoIGdldCBvcGVyYXRpb25zLCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHdoaWNoCiBkZXNjcmliZXMgdGhlIHVwZGF0ZWQgdmFsdWVzIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZGVwZW5kcyBvbiB0aGUKIG9wZXJhdGlvbiBraW5kLiBJbiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvZiB0aGUgZmllbGQgbWFzayBpcwogcmVxdWlyZWQgdG8gYmUgaG9ub3JlZCBieSB0aGUgQVBJLgoKICMjIENvbnNpZGVyYXRpb25zIGZvciBIVFRQIFJFU1QKCiBUaGUgSFRUUCBraW5kIG9mIGFuIHVwZGF0ZSBvcGVyYXRpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG1hc2sgbXVzdAogYmUgc2V0IHRvIFBBVENIIGluc3RlYWQgb2YgUFVUIGluIG9yZGVyIHRvIHNhdGlzZnkgSFRUUCBzZW1hbnRpY3MKIChQVVQgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIGZ1bGwgdXBkYXRlcykuCgogIyBKU09OIEVuY29kaW5nIG9mIEZpZWxkIE1hc2tzCgogSW4gSlNPTiwgYSBmaWVsZCBtYXNrIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgc3RyaW5nIHdoZXJlIHBhdGhzIGFyZQogc2VwYXJhdGVkIGJ5IGEgY29tbWEuIEZpZWxkcyBuYW1lIGluIGVhY2ggcGF0aCBhcmUgY29udmVydGVkCiB0by9mcm9tIGxvd2VyLWNhbWVsIG5hbWluZyBjb252ZW50aW9ucy4KCiBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgZGVjbGFyYXRpb25zOgoKICAgICBtZXNzYWdlIFByb2ZpbGUgewogICAgICAgVXNlciB1c2VyID0gMTsKICAgICAgIFBob3RvIHBob3RvID0gMjsKICAgICB9CiAgICAgbWVzc2FnZSBVc2VyIHsKICAgICAgIHN0cmluZyBkaXNwbGF5X25hbWUgPSAxOwogICAgICAgc3RyaW5nIGFkZHJlc3MgPSAyOwogICAgIH0KCiBJbiBwcm90byBhIGZpZWxkIG1hc2sgZm9yIGBQcm9maWxlYCBtYXkgbG9vayBhcyBzdWNoOgoKICAgICBtYXNrIHsKICAgICAgIHBhdGhzOiAidXNlci5kaXNwbGF5X25hbWUiCiAgICAgICBwYXRoczogInBob3RvIgogICAgIH0KCiBJbiBKU09OLCB0aGUgc2FtZSBtYXNrIGlzIHJlcHJlc2VudGVkIGFzIGJlbG93OgoKICAgICB7CiAgICAgICBtYXNrOiAidXNlci5kaXNwbGF5TmFtZSxwaG90byIKICAgICB9CgogIyBGaWVsZCBNYXNrcyBhbmQgT25lb2YgRmllbGRzCgogRmllbGQgbWFza3MgdHJlYXQgZmllbGRzIGluIG9uZW9mcyBqdXN0IGFzIHJlZ3VsYXIgZmllbGRzLiBDb25zaWRlciB0aGUKIGZvbGxvd2luZyBtZXNzYWdlOgoKICAgICBtZXNzYWdlIFNhbXBsZU1lc3NhZ2UgewogICAgICAgb25lb2YgdGVzdF9vbmVvZiB7CiAgICAgICAgIHN0cmluZyBuYW1lID0gNDsKICAgICAgICAgU3ViTWVzc2FnZSBzdWJfbWVzc2FnZSA9IDk7CiAgICAgICB9CiAgICAgfQoKIFRoZSBmaWVsZCBtYXNrIGNhbiBiZToKCiAgICAgbWFzayB7CiAgICAgICBwYXRoczogIm5hbWUiCiAgICAgfQoKIE9yOgoKICAgICBtYXNrIHsKICAgICAgIHBhdGhzOiAic3ViX21lc3NhZ2UiCiAgICAgfQoKIE5vdGUgdGhhdCBvbmVvZiB0eXBlIG5hbWVzICgidGVzdF9vbmVvZiIgaW4gdGhpcyBjYXNlKSBjYW5ub3QgYmUgdXNlZCBpbgogcGF0aHMuCgogIyMgRmllbGQgTWFzayBWZXJpZmljYXRpb24KCiBUaGUgaW1wbGVtZW50YXRpb24gb2YgYW55IEFQSSBtZXRob2Qgd2hpY2ggaGFzIGEgRmllbGRNYXNrIHR5cGUgZmllbGQgaW4gdGhlCiByZXF1ZXN0IHNob3VsZCB2ZXJpZnkgdGhlIGluY2x1ZGVkIGZpZWxkIHBhdGhzLCBhbmQgcmV0dXJuIGFuCiBgSU5WQUxJRF9BUkdVTUVOVGAgZXJyb3IgaWYgYW55IHBhdGggaXMgdW5tYXBwYWJsZS4KCgsKAwQAARIE8QEIEQosCgQEAAIAEgTzAQIcGh4gVGhlIHNldCBvZiBmaWVsZCBtYXNrIHBhdGhzLgoKDQoFBAACAAQSBPMBAgoKDQoFBAACAAUSBPMBCxEKDQoFBAACAAESBPMBEhcKDQoFBAACAAMSBPMBGhtiBnByb3RvMwrDMQofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIjsKCVRpbWVzdGFtcBIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KFAQoTY29tLmdvb2dsZS5wcm90b2J1ZkIOVGltZXN0YW1wUHJvdG9QAVoyZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdGltZXN0YW1wcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNKwS8KBxIFHgCPAQEKzAwKAQwSAx4AEjLBDCBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKIG1ldDoKCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogZGlzdHJpYnV0aW9uLgogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCggKAQISAyAAGAoICgEIEgMiAB8KCQoCCB8SAyIAHwoICgEIEgMjAEkKCQoCCAsSAyMASQoICgEIEgMkACwKCQoCCAESAyQALAoICgEIEgMlAC8KCQoCCAgSAyUALwoICgEIEgMmACIKCQoCCAoSAyYAIgoICgEIEgMnACEKCQoCCCQSAycAIQoICgEIEgMoADsKCQoCCCUSAygAOwraHQoCBAASBoQBAI8BARrLHSBBIFRpbWVzdGFtcCByZXByZXNlbnRzIGEgcG9pbnQgaW4gdGltZSBpbmRlcGVuZGVudCBvZiBhbnkgdGltZSB6b25lIG9yIGxvY2FsCiBjYWxlbmRhciwgZW5jb2RlZCBhcyBhIGNvdW50IG9mIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0CiBuYW5vc2Vjb25kIHJlc29sdXRpb24uIFRoZSBjb3VudCBpcyByZWxhdGl2ZSB0byBhbiBlcG9jaCBhdCBVVEMgbWlkbmlnaHQgb24KIEphbnVhcnkgMSwgMTk3MCwgaW4gdGhlIHByb2xlcHRpYyBHcmVnb3JpYW4gY2FsZW5kYXIgd2hpY2ggZXh0ZW5kcyB0aGUKIEdyZWdvcmlhbiBjYWxlbmRhciBiYWNrd2FyZHMgdG8geWVhciBvbmUuCgogQWxsIG1pbnV0ZXMgYXJlIDYwIHNlY29uZHMgbG9uZy4gTGVhcCBzZWNvbmRzIGFyZSAic21lYXJlZCIgc28gdGhhdCBubyBsZWFwCiBzZWNvbmQgdGFibGUgaXMgbmVlZGVkIGZvciBpbnRlcnByZXRhdGlvbiwgdXNpbmcgYSBbMjQtaG91ciBsaW5lYXIKIHNtZWFyXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS90aW1lL3NtZWFyKS4KCiBUaGUgcmFuZ2UgaXMgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVouIEJ5CiByZXN0cmljdGluZyB0byB0aGF0IHJhbmdlLCB3ZSBlbnN1cmUgdGhhdCB3ZSBjYW4gY29udmVydCB0byBhbmQgZnJvbSBbUkZDCiAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGRhdGUgc3RyaW5ncy4KCiAjIEV4YW1wbGVzCgogRXhhbXBsZSAxOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFBPU0lYIGB0aW1lKClgLgoKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwogICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcyh0aW1lKE5VTEwpKTsKICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKDApOwoKIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBQT1NJWCBgZ2V0dGltZW9mZGF5KClgLgoKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKCiAgICAgVGltZXN0YW1wIHRpbWVzdGFtcDsKICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHModHYudHZfc2VjKTsKICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKHR2LnR2X3VzZWMgKiAxMDAwKTsKCiBFeGFtcGxlIDM6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gV2luMzIgYEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKClgLgoKICAgICBGSUxFVElNRSBmdDsKICAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOwogICAgIFVJTlQ2NCB0aWNrcyA9ICgoKFVJTlQ2NClmdC5kd0hpZ2hEYXRlVGltZSkgPDwgMzIpIHwgZnQuZHdMb3dEYXRlVGltZTsKCiAgICAgLy8gQSBXaW5kb3dzIHRpY2sgaXMgMTAwIG5hbm9zZWNvbmRzLiBXaW5kb3dzIGVwb2NoIDE2MDEtMDEtMDFUMDA6MDA6MDBaCiAgICAgLy8gaXMgMTE2NDQ0NzM2MDAgc2Vjb25kcyBiZWZvcmUgVW5peCBlcG9jaCAxOTcwLTAxLTAxVDAwOjAwOjAwWi4KICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwogICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcygoSU5UNjQpICgodGlja3MgLyAxMDAwMDAwMCkgLSAxMTY0NDQ3MzYwMExMKSk7CiAgICAgdGltZXN0YW1wLnNldF9uYW5vcygoSU5UMzIpICgodGlja3MgJSAxMDAwMDAwMCkgKiAxMDApKTsKCiBFeGFtcGxlIDQ6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gSmF2YSBgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKClgLgoKICAgICBsb25nIG1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gVGltZXN0YW1wLm5ld0J1aWxkZXIoKS5zZXRTZWNvbmRzKG1pbGxpcyAvIDEwMDApCiAgICAgICAgIC5zZXROYW5vcygoaW50KSAoKG1pbGxpcyAlIDEwMDApICogMTAwMDAwMCkpLmJ1aWxkKCk7CgogRXhhbXBsZSA1OiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIEphdmEgYEluc3RhbnQubm93KClgLgoKICAgICBJbnN0YW50IG5vdyA9IEluc3RhbnQubm93KCk7CgogICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPQogICAgICAgICBUaW1lc3RhbXAubmV3QnVpbGRlcigpLnNldFNlY29uZHMobm93LmdldEVwb2NoU2Vjb25kKCkpCiAgICAgICAgICAgICAuc2V0TmFub3Mobm93LmdldE5hbm8oKSkuYnVpbGQoKTsKCiBFeGFtcGxlIDY6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gY3VycmVudCB0aW1lIGluIFB5dGhvbi4KCiAgICAgdGltZXN0YW1wID0gVGltZXN0YW1wKCkKICAgICB0aW1lc3RhbXAuR2V0Q3VycmVudFRpbWUoKQoKICMgSlNPTiBNYXBwaW5nCgogSW4gSlNPTiBmb3JtYXQsIHRoZSBUaW1lc3RhbXAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nIGluIHRoZQogW1JGQyAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGZvcm1hdC4gVGhhdCBpcywgdGhlCiBmb3JtYXQgaXMgInt5ZWFyfS17bW9udGh9LXtkYXl9VHtob3VyfTp7bWlufTp7c2VjfVsue2ZyYWNfc2VjfV1aIgogd2hlcmUge3llYXJ9IGlzIGFsd2F5cyBleHByZXNzZWQgdXNpbmcgZm91ciBkaWdpdHMgd2hpbGUge21vbnRofSwge2RheX0sCiB7aG91cn0sIHttaW59LCBhbmQge3NlY30gYXJlIHplcm8tcGFkZGVkIHRvIHR3byBkaWdpdHMgZWFjaC4gVGhlIGZyYWN0aW9uYWwKIHNlY29uZHMsIHdoaWNoIGNhbiBnbyB1cCB0byA5IGRpZ2l0cyAoaS5lLiB1cCB0byAxIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiksCiBhcmUgb3B0aW9uYWwuIFRoZSAiWiIgc3VmZml4IGluZGljYXRlcyB0aGUgdGltZXpvbmUgKCJVVEMiKTsgdGhlIHRpbWV6b25lCiBpcyByZXF1aXJlZC4gQSBwcm90bzMgSlNPTiBzZXJpYWxpemVyIHNob3VsZCBhbHdheXMgdXNlIFVUQyAoYXMgaW5kaWNhdGVkIGJ5CiAiWiIpIHdoZW4gcHJpbnRpbmcgdGhlIFRpbWVzdGFtcCB0eXBlIGFuZCBhIHByb3RvMyBKU09OIHBhcnNlciBzaG91bGQgYmUKIGFibGUgdG8gYWNjZXB0IGJvdGggVVRDIGFuZCBvdGhlciB0aW1lem9uZXMgKGFzIGluZGljYXRlZCBieSBhbiBvZmZzZXQpLgoKIEZvciBleGFtcGxlLCAiMjAxNy0wMS0xNVQwMTozMDoxNS4wMVoiIGVuY29kZXMgMTUuMDEgc2Vjb25kcyBwYXN0CiAwMTozMCBVVEMgb24gSmFudWFyeSAxNSwgMjAxNy4KCiBJbiBKYXZhU2NyaXB0LCBvbmUgY2FuIGNvbnZlcnQgYSBEYXRlIG9iamVjdCB0byB0aGlzIGZvcm1hdCB1c2luZyB0aGUKIHN0YW5kYXJkCiBbdG9JU09TdHJpbmcoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZykKIG1ldGhvZC4gSW4gUHl0aG9uLCBhIHN0YW5kYXJkIGBkYXRldGltZS5kYXRldGltZWAgb2JqZWN0IGNhbiBiZSBjb252ZXJ0ZWQKIHRvIHRoaXMgZm9ybWF0IHVzaW5nCiBbYHN0cmZ0aW1lYF0oaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L3RpbWUuaHRtbCN0aW1lLnN0cmZ0aW1lKSB3aXRoCiB0aGUgdGltZSBmb3JtYXQgc3BlYyAnJVktJW0tJWRUJUg6JU06JVMuJWZaJy4gTGlrZXdpc2UsIGluIEphdmEsIG9uZSBjYW4gdXNlCiB0aGUgSm9kYSBUaW1lJ3MgW2BJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZSgpYF0oCiBodHRwOi8vam9kYS10aW1lLnNvdXJjZWZvcmdlLm5ldC9hcGlkb2NzL29yZy9qb2RhL3RpbWUvZm9ybWF0L0lTT0RhdGVUaW1lRm9ybWF0Lmh0bWwjZGF0ZVRpbWUoKQogKSB0byBvYnRhaW4gYSBmb3JtYXR0ZXIgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHRpbWVzdGFtcHMgaW4gdGhpcyBmb3JtYXQuCgoKCwoDBAABEgSEAQgRCp0BCgQEAAIAEgSIAQIUGo4BIFJlcHJlc2VudHMgc2Vjb25kcyBvZiBVVEMgdGltZSBzaW5jZSBVbml4IGVwb2NoCiAxOTcwLTAxLTAxVDAwOjAwOjAwWi4gTXVzdCBiZSBmcm9tIDAwMDEtMDEtMDFUMDA6MDA6MDBaIHRvCiA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuCgoNCgUEAAIABRIEiAECBwoNCgUEAAIAARIEiAEIDwoNCgUEAAIAAxIEiAESEwrlAQoEBAACARIEjgECEhrWASBOb24tbmVnYXRpdmUgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4gTmVnYXRpdmUKIHNlY29uZCB2YWx1ZXMgd2l0aCBmcmFjdGlvbnMgbXVzdCBzdGlsbCBoYXZlIG5vbi1uZWdhdGl2ZSBuYW5vcyB2YWx1ZXMKIHRoYXQgY291bnQgZm9yd2FyZCBpbiB0aW1lLiBNdXN0IGJlIGZyb20gMCB0byA5OTksOTk5LDk5OQogaW5jbHVzaXZlLgoKDQoFBAACAQUSBI4BAgcKDQoFBAACAQESBI4BCA0KDQoFBAACAQMSBI4BEBFiBnByb3RvMwqx7gwKG2J1Zi92YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxIMYnVmLnZhbGlkYXRlGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byJQCgRSdWxlEg4KAmlkGAEgASgJUgJpZBIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlEh4KCmV4cHJlc3Npb24YAyABKAlSCmV4cHJlc3Npb24ioQEKDE1lc3NhZ2VSdWxlcxIlCg5jZWxfZXhwcmVzc2lvbhgFIAMoCVINY2VsRXhwcmVzc2lvbhIkCgNjZWwYAyADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsEjQKBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVSBW9uZW9mSgQIARACUghkaXNhYmxlZCJGChBNZXNzYWdlT25lb2ZSdWxlEhYKBmZpZWxkcxgBIAMoCVIGZmllbGRzEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCIoCgpPbmVvZlJ1bGVzEhoKCHJlcXVpcmVkGAEgASgIUghyZXF1aXJlZCLjCgoKRmllbGRSdWxlcxIlCg5jZWxfZXhwcmVzc2lvbhgdIAMoCVINY2VsRXhwcmVzc2lvbhIkCgNjZWwYFyADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsEhoKCHJlcXVpcmVkGBkgASgIUghyZXF1aXJlZBIsCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlUgZpZ25vcmUSMAoFZmxvYXQYASABKAsyGC5idWYudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIzCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIAFIGZG91YmxlEjAKBWludDMyGAMgASgLMhguYnVmLnZhbGlkYXRlLkludDMyUnVsZXNIAFIFaW50MzISMAoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIzCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIAFIGdWludDMyEjMKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAUgZ1aW50NjQSMwoGc2ludDMyGAcgASgLMhkuYnVmLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIzCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIAFIGc2ludDY0EjYKB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSABSB2ZpeGVkMzISNgoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI5CghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSABSCHNmaXhlZDMyEjkKCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIAFIIc2ZpeGVkNjQSLQoEYm9vbBgNIAEoCzIXLmJ1Zi52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIzCgZzdHJpbmcYDiABKAsyGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXNIAFIGc3RyaW5nEjAKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIAFIFYnl0ZXMSLQoEZW51bRgQIAEoCzIXLmJ1Zi52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI5CghyZXBlYXRlZBgSIAEoCzIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzSABSCHJlcGVhdGVkEioKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAUgNtYXASKgoDYW55GBQgASgLMhYuYnVmLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI5CghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSABSCGR1cmF0aW9uEj0KCmZpZWxkX21hc2sYHCABKAsyHC5idWYudmFsaWRhdGUuRmllbGRNYXNrUnVsZXNIAFIJZmllbGRNYXNrEjwKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAUgl0aW1lc3RhbXBCBgoEdHlwZUoECBgQGUoECBoQG1IHc2tpcHBlZFIMaWdub3JlX2VtcHR5IloKD1ByZWRlZmluZWRSdWxlcxIkCgNjZWwYASADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHkikBgKCkZsb2F0UnVsZXMSigEKBWNvbnN0GAEgASgCQnTCSHEKbwoLZmxvYXQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSowEKAmx0GAIgASgCQpABwkiMAQqJAQoIZmxvYXQubHQafSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0ErQBCgNsdGUYAyABKAJCnwHCSJsBCpgBCglmbG9hdC5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIAFIDbHRlEvMHCgJndBgEIAEoAkLgB8JI3AcKjQEKCGZsb2F0Lmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKwwEKC2Zsb2F0Lmd0X2x0GrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzQEKFWZsb2F0Lmd0X2x0X2V4Y2x1c2l2ZRqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCtMBCgxmbG9hdC5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrdAQoWZmxvYXQuZ3RfbHRlX2V4Y2x1c2l2ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0Er8ICgNndGUYBSABKAJCqgjCSKYICpsBCglmbG9hdC5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0gEKDGZsb2F0Lmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3AEKFmZsb2F0Lmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuIBCg1mbG9hdC5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrsAQoXZmxvYXQuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKDAQoCaW4YBiADKAJCc8JIcApuCghmbG9hdC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn0KBm5vdF9pbhgHIAMoAkJmwkhjCmEKDGZsb2F0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhJ9CgZmaW5pdGUYCCABKAhCZcJIYgpgCgxmbG9hdC5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnUgZmaW5pdGUSNAoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIqIYCgtEb3VibGVSdWxlcxKLAQoFY29uc3QYASABKAFCdcJIcgpwCgxkb3VibGUuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSpAEKAmx0GAIgASgBQpEBwkiNAQqKAQoJZG91YmxlLmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBK1AQoDbHRlGAMgASgBQqABwkicAQqZAQoKZG91YmxlLmx0ZRqKASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUS+AcKAmd0GAQgASgBQuUHwkjhBwqOAQoJZG91YmxlLmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKxAEKDGRvdWJsZS5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs4BChZkb3VibGUuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK1AEKDWRvdWJsZS5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwreAQoXZG91YmxlLmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLECAoDZ3RlGAUgASgBQq8IwkirCAqcAQoKZG91YmxlLmd0ZRqNASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrTAQoNZG91YmxlLmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3QEKF2RvdWJsZS5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrjAQoOZG91YmxlLmd0ZV9sdGUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCu0BChhkb3VibGUuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKEAQoCaW4YBiADKAFCdMJIcQpvCglkb3VibGUuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ+CgZub3RfaW4YByADKAFCZ8JIZApiCg1kb3VibGUubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJydSBW5vdEluEn4KBmZpbml0ZRgIIAEoCEJmwkhjCmEKDWRvdWJsZS5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnUgZmaW5pdGUSNQoHZXhhbXBsZRgJIAMoAUIbwkgYChYKDmRvdWJsZS5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiK6FQoKSW50MzJSdWxlcxKKAQoFY29uc3QYASABKAVCdMJIcQpvCgtpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKOAQoCbHQYAiABKAVCfMJIeQp3CghpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSoQEKA2x0ZRgDIAEoBUKMAcJIiAEKhQEKCWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKbBwoCZ3QYBCABKAVCiAfCSIQHCnoKCGludDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50MzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EugHCgNndGUYBSABKAVC0wfCSM8HCogBCglpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrCAQoMaW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsoBChZpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrSAQoNaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwraAQoXaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKDAQoCaW4YBiADKAVCc8JIcApuCghpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn0KBm5vdF9pbhgHIAMoBUJmwkhjCmEKDGludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI0CgdleGFtcGxlGAggAygFQhrCSBcKFQoNaW50MzIuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iuhUKCkludDY0UnVsZXMSigEKBWNvbnN0GAEgASgDQnTCSHEKbwoLaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjgEKAmx0GAIgASgDQnzCSHkKdwoIaW50NjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0EqEBCgNsdGUYAyABKANCjAHCSIgBCoUBCglpbnQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUSmwcKAmd0GAQgASgDQogHwkiEBwp6CghpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKswEKC2ludDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq7AQoVaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwwEKDGludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKywEKFmludDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLoBwoDZ3RlGAUgASgDQtMHwkjPBwqIAQoJaW50NjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUSgwEKAmluGAYgAygDQnPCSHAKbgoIaW50NjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ9CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNAoHZXhhbXBsZRgJIAMoA0IawkgXChUKDWludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtVSW50MzJSdWxlcxKLAQoFY29uc3QYASABKA1CdcJIcgpwCgx1aW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgNQn3CSHoKeAoJdWludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKA1CjQfCSIkHCnsKCXVpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygNQnTCSHEKbwoJdWludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygNQmfCSGQKYgoNdWludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygNQhvCSBgKFgoOdWludDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtVSW50NjRSdWxlcxKLAQoFY29uc3QYASABKARCdcJIcgpwCgx1aW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgEQn3CSHoKeAoJdWludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgEQo0BwkiJAQqGAQoKdWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKARCjQfCSIkHCnsKCXVpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoBELYB8JI1AcKiQEKCnVpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygEQnTCSHEKbwoJdWludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygEQmfCSGQKYgoNdWludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygEQhvCSBgKFgoOdWludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtTSW50MzJSdWxlcxKLAQoFY29uc3QYASABKBFCdcJIcgpwCgxzaW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgRQn3CSHoKeAoJc2ludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgRQo0BwkiJAQqGAQoKc2ludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKBFCjQfCSIkHCnsKCXNpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoEULYB8JI1AcKiQEKCnNpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygRQnTCSHEKbwoJc2ludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygRQhvCSBgKFgoOc2ludDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtTSW50NjRSdWxlcxKLAQoFY29uc3QYASABKBJCdcJIcgpwCgxzaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgSQn3CSHoKeAoJc2ludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKBJCjQfCSIkHCnsKCXNpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygSQnTCSHEKbwoJc2ludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygSQmfCSGQKYgoNc2ludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygSQhvCSBgKFgoOc2ludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuItwVCgxGaXhlZDMyUnVsZXMSjAEKBWNvbnN0GAEgASgHQnbCSHMKcQoNZml4ZWQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKQAQoCbHQYAiABKAdCfsJIewp5CgpmaXhlZDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKjAQoDbHRlGAMgASgHQo4BwkiKAQqHAQoLZml4ZWQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUSpQcKAmd0GAQgASgHQpIHwkiOBwp8CgpmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS8gcKA2d0ZRgFIAEoB0LdB8JI2QcKigEKC2ZpeGVkMzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxAEKDmZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCswBChhmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtQBCg9maXhlZDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3AEKGWZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKFAQoCaW4YBiADKAdCdcJIcgpwCgpmaXhlZDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfwoGbm90X2luGAcgAygHQmjCSGUKYwoOZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNgoHZXhhbXBsZRgIIAMoB0IcwkgZChcKD2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i3BUKDEZpeGVkNjRSdWxlcxKMAQoFY29uc3QYASABKAZCdsJIcwpxCg1maXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EpABCgJsdBgCIAEoBkJ+wkh7CnkKCmZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0EqMBCgNsdGUYAyABKAZCjgHCSIoBCocBCgtmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKlBwoCZ3QYBCABKAZCkgfCSI4HCnwKCmZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLyBwoDZ3RlGAUgASgGQt0HwkjZBwqKAQoLZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIAVIDZ3RlEoUBCgJpbhgGIAMoBkJ1wkhyCnAKCmZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ/CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI2CgdleGFtcGxlGAggAygGQhzCSBkKFwoPZml4ZWQ2NC5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLuFQoNU0ZpeGVkMzJSdWxlcxKNAQoFY29uc3QYASABKA9Cd8JIdApyCg5zZml4ZWQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKRAQoCbHQYAiABKA9Cf8JIfAp6CgtzZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSpAEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKqBwoCZ3QYBCABKA9ClwfCSJMHCn0KC3NmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOc2ZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPc2ZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EvcHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKGAQoCaW4YBiADKA9CdsJIcwpxCgtzZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEoABCgZub3RfaW4YByADKA9CacJIZgpkCg9zZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNwoHZXhhbXBsZRgIIAMoD0IdwkgaChgKEHNmaXhlZDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIu4VCg1TRml4ZWQ2NFJ1bGVzEo0BCgVjb25zdBgBIAEoEEJ3wkh0CnIKDnNmaXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EpEBCgJsdBgCIAEoEEJ/wkh8CnoKC3NmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKkAQoDbHRlGAMgASgQQo8BwkiLAQqIAQoMc2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIAFIDbHRlEqoHCgJndBgEIAEoEEKXB8JIkwcKfQoLc2ZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrYBCg5zZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKGHNmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsYBCg9zZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs4BChlzZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS9wcKA2d0ZRgFIAEoEELiB8JI3gcKiwEKDHNmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9zZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGXNmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBzZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpzZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIAVIDZ3RlEoYBCgJpbhgGIAMoEEJ2wkhzCnEKC3NmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SgAEKBm5vdF9pbhgHIAMoEEJpwkhmCmQKD3NmaXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI3CgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i1wEKCUJvb2xSdWxlcxKJAQoFY29uc3QYASABKAhCc8JIcApuCgpib29sLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EjMKB2V4YW1wbGUYAiADKAhCGcJIFgoUCgxib29sLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAiLPOwoLU3RyaW5nUnVsZXMSjQEKBWNvbnN0GAEgASgJQnfCSHQKcgoMc3RyaW5nLmNvbnN0GmJ0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsIGAlc2AnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSgwEKA2xlbhgTIAEoBEJxwkhuCmwKCnN0cmluZy5sZW4aXnVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJydSA2xlbhKhAQoHbWluX2xlbhgCIAEoBEKHAcJIgwEKgAEKDnN0cmluZy5taW5fbGVuGm51aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJ1IGbWluTGVuEp8BCgdtYXhfbGVuGAMgASgEQoUBwkiBAQp/Cg5zdHJpbmcubWF4X2xlbhptdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IG1vc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJ1IGbWF4TGVuEqUBCglsZW5fYnl0ZXMYFCABKARChwHCSIMBCoABChBzdHJpbmcubGVuX2J5dGVzGmx1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl9ieXRlc10pIDogJydSCGxlbkJ5dGVzEq0BCgltaW5fYnl0ZXMYBCABKARCjwHCSIsBCogBChBzdHJpbmcubWluX2J5dGVzGnR1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgPCBydWxlcy5taW5fYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWluX2J5dGVzXSkgOiAnJ1IIbWluQnl0ZXMSrAEKCW1heF9ieXRlcxgFIAEoBEKOAcJIigEKhwEKEHN0cmluZy5tYXhfYnl0ZXMac3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9ieXRlc10pIDogJydSCG1heEJ5dGVzEpYBCgdwYXR0ZXJuGAYgASgJQnzCSHkKdwoOc3RyaW5nLnBhdHRlcm4aZSF0aGlzLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnUgdwYXR0ZXJuEowBCgZwcmVmaXgYByABKAlCdMJIcQpvCg1zdHJpbmcucHJlZml4Gl4hdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnUgZwcmVmaXgSigEKBnN1ZmZpeBgIIAEoCUJywkhvCm0KDXN0cmluZy5zdWZmaXgaXCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnUgZzdWZmaXgSmgEKCGNvbnRhaW5zGAkgASgJQn7CSHsKeQoPc3RyaW5nLmNvbnRhaW5zGmYhdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAndmFsdWUgZG9lcyBub3QgY29udGFpbiBzdWJzdHJpbmcgYCVzYCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJydSCGNvbnRhaW5zEqUBCgxub3RfY29udGFpbnMYFyABKAlCgQHCSH4KfAoTc3RyaW5nLm5vdF9jb250YWlucxpldGhpcy5jb250YWlucyhydWxlcy5ub3RfY29udGFpbnMpID8gJ3ZhbHVlIGNvbnRhaW5zIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLm5vdF9jb250YWluc10pIDogJydSC25vdENvbnRhaW5zEoQBCgJpbhgKIAMoCUJ0wkhxCm8KCXN0cmluZy5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn4KBm5vdF9pbhgLIAMoCUJnwkhkCmIKDXN0cmluZy5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4S5gEKBWVtYWlsGAwgASgIQs0BwkjJAQphCgxzdHJpbmcuZW1haWwSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGiwhcnVsZXMuZW1haWwgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzRW1haWwoKQpkChJzdHJpbmcuZW1haWxfZW1wdHkSMnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGhohcnVsZXMuZW1haWwgfHwgdGhpcyAhPSAnJ0gAUgVlbWFpbBLxAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIAFIIaG9zdG5hbWUSywEKAmlwGA4gASgIQrgBwki0AQpVCglzdHJpbmcuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGiYhcnVsZXMuaXAgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoKQpbCg9zdHJpbmcuaXBfZW1wdHkSL3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUCBhZGRyZXNzGhchcnVsZXMuaXAgfHwgdGhpcyAhPSAnJ0gAUgJpcBLcAQoEaXB2NBgPIAEoCELFAcJIwQEKXAoLc3RyaW5nLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaKSFydWxlcy5pcHY0IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKDQpCmEKEXN0cmluZy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGhkhcnVsZXMuaXB2NCB8fCB0aGlzICE9ICcnSABSBGlwdjQS3AEKBGlwdjYYECABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY2EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzGikhcnVsZXMuaXB2NiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg2KQphChFzdHJpbmcuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxoZIXJ1bGVzLmlwdjYgfHwgdGhpcyAhPSAnJ0gAUgRpcHY2EsQBCgN1cmkYESABKAhCrwHCSKsBClEKCnN0cmluZy51cmkSGXZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkaKCFydWxlcy51cmkgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzVXJpKCkKVgoQc3RyaW5nLnVyaV9lbXB0eRIodmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVSSRoYIXJ1bGVzLnVyaSB8fCB0aGlzICE9ICcnSABSA3VyaRJ4Cgd1cmlfcmVmGBIgASgIQl3CSFoKWAoOc3RyaW5nLnVyaV9yZWYSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkgUmVmZXJlbmNlGiEhcnVsZXMudXJpX3JlZiB8fCB0aGlzLmlzVXJpUmVmKClIAFIGdXJpUmVmEpkCCgdhZGRyZXNzGBUgASgIQvwBwkj4AQqBAQoOc3RyaW5nLmFkZHJlc3MSLXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0bmFtZSwgb3IgaXAgYWRkcmVzcxpAIXJ1bGVzLmFkZHJlc3MgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKSB8fCB0aGlzLmlzSXAoKQpyChRzdHJpbmcuYWRkcmVzc19lbXB0eRI8dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGhwhcnVsZXMuYWRkcmVzcyB8fCB0aGlzICE9ICcnSABSB2FkZHJlc3MSngIKBHV1aWQYFiABKAhChwLCSIMCCqUBCgtzdHJpbmcudXVpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeiFydWxlcy51dWlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpClkKEXN0cmluZy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBoZIXJ1bGVzLnV1aWQgfHwgdGhpcyAhPSAnJ0gAUgR1dWlkEvcBCgV0dXVpZBghIAEoCELeAcJI2gEKcwoMc3RyaW5nLnR1dWlkEiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdHJpbW1lZCBVVUlEGj8hcnVsZXMudHV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXszMn0kJykKYwoSc3RyaW5nLnR1dWlkX2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgdHJpbW1lZCBVVUlEGhohcnVsZXMudHV1aWQgfHwgdGhpcyAhPSAnJ0gAUgV0dXVpZBKnAgoRaXBfd2l0aF9wcmVmaXhsZW4YGiABKAhC+AHCSPQBCngKGHN0cmluZy5pcF93aXRoX3ByZWZpeGxlbhIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo7IXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KCkKeAoec3RyaW5nLmlwX3dpdGhfcHJlZml4bGVuX2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4GiYhcnVsZXMuaXBfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAUg9pcFdpdGhQcmVmaXhsZW4S4gIKE2lwdjRfd2l0aF9wcmVmaXhsZW4YGyABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQpCpIBCiBzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIAFIRaXB2NFdpdGhQcmVmaXhsZW4S4gIKE2lwdjZfd2l0aF9wcmVmaXhsZW4YHCABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2Nl93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY2X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYpCpIBCiBzdHJpbmcuaXB2Nl93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY2X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIAFIRaXB2NldpdGhQcmVmaXhsZW4S/AEKCWlwX3ByZWZpeBgdIAEoCELcAcJI2AEKbAoQc3RyaW5nLmlwX3ByZWZpeBIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIAFIIaXBQcmVmaXgSjwIKC2lwdjRfcHJlZml4GB4gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2NF9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IHByZWZpeBo8IXJ1bGVzLmlwdjRfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQsIHRydWUpCm4KGHN0cmluZy5pcHY0X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgcHJlZml4GiAhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAUgppcHY0UHJlZml4Eo8CCgtpcHY2X3ByZWZpeBgfIAEoCELrAcJI5wEKdQoSc3RyaW5nLmlwdjZfcHJlZml4EiF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBwcmVmaXgaPCFydWxlcy5pcHY2X3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2LCB0cnVlKQpuChhzdHJpbmcuaXB2Nl9wcmVmaXhfZW1wdHkSMHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IHByZWZpeBogIXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgIT0gJydIAFIKaXB2NlByZWZpeBLCAgoNaG9zdF9hbmRfcG9ydBggIAEoCEKbAsJIlwIKmQEKFHN0cmluZy5ob3N0X2FuZF9wb3J0EkF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcykgYW5kIHBvcnQgcGFpcho+IXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdEFuZFBvcnQodHJ1ZSkKeQoac3RyaW5nLmhvc3RfYW5kX3BvcnRfZW1wdHkSN3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0IGFuZCBwb3J0IHBhaXIaIiFydWxlcy5ob3N0X2FuZF9wb3J0IHx8IHRoaXMgIT0gJydIAFILaG9zdEFuZFBvcnQS+wEKBHVsaWQYIyABKAhC5AHCSOABCoIBCgtzdHJpbmcudWxpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVMSUQaVyFydWxlcy51bGlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtN11bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI1fSQnKQpZChFzdHJpbmcudWxpZF9lbXB0eRIpdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVMSUQaGSFydWxlcy51bGlkIHx8IHRoaXMgIT0gJydIAFIEdWxpZBK4BQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QvEEwkjtBArwAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSJnZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrnAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEid2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAUg53ZWxsS25vd25SZWdleBIWCgZzdHJpY3QYGSABKAhSBnN0cmljdBI1CgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIqwTCgpCeXRlc1J1bGVzEocBCgVjb25zdBgBIAEoDEJxwkhuCmwKC2J5dGVzLmNvbnN0Gl10aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0En0KA2xlbhgNIAEoBEJrwkhoCmYKCWJ5dGVzLmxlbhpZdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJydSA2xlbhKYAQoHbWluX2xlbhgCIAEoBEJ/wkh8CnoKDWJ5dGVzLm1pbl9sZW4aaXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJ1IGbWluTGVuEpABCgdtYXhfbGVuGAMgASgEQnfCSHQKcgoNYnl0ZXMubWF4X2xlbhphdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJ1IGbWF4TGVuEpkBCgdwYXR0ZXJuGAQgASgJQn/CSHwKegoNYnl0ZXMucGF0dGVybhppIXN0cmluZyh0aGlzKS5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ3ZhbHVlIG11c3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnUgdwYXR0ZXJuEokBCgZwcmVmaXgYBSABKAxCccJIbgpsCgxieXRlcy5wcmVmaXgaXCF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCAleCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnUgZwcmVmaXgShwEKBnN1ZmZpeBgGIAEoDEJvwkhsCmoKDGJ5dGVzLnN1ZmZpeBpaIXRoaXMuZW5kc1dpdGgocnVsZXMuc3VmZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpeCAleCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnUgZzdWZmaXgSjQEKCGNvbnRhaW5zGAcgASgMQnHCSG4KbAoOYnl0ZXMuY29udGFpbnMaWiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJ1IIY29udGFpbnMSqwEKAmluGAggAygMQpoBwkiWAQqTAQoIYnl0ZXMuaW4ahgFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfQoGbm90X2luGAkgAygMQmbCSGMKYQoMYnl0ZXMubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJydSBW5vdEluEu8BCgJpcBgKIAEoCELcAcJI2AEKdAoIYnl0ZXMuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGkYhcnVsZXMuaXAgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0IHx8IHRoaXMuc2l6ZSgpID09IDE2CmAKDmJ5dGVzLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxodIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpICE9IDBIAFICaXAS6gEKBGlwdjQYCyABKAhC0wHCSM8BCmUKCmJ5dGVzLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSABSBGlwdjQS6wEKBGlwdjYYDCABKAhC1AHCSNABCmYKCmJ5dGVzLmlwdjYSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAUgRpcHY2EtsBCgR1dWlkGA8gASgIQsQBwkjAAQpeCgpieXRlcy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAUgR1dWlkEjQKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biL9AwoJRW51bVJ1bGVzEokBCgVjb25zdBgBIAEoBUJzwkhwCm4KCmVudW0uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSIQoMZGVmaW5lZF9vbmx5GAIgASgIUgtkZWZpbmVkT25seRKCAQoCaW4YAyADKAVCcsJIbwptCgdlbnVtLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfAoGbm90X2luGAQgAygFQmXCSGIKYAoLZW51bS5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SMwoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACIp4ECg1SZXBlYXRlZFJ1bGVzEqgBCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJydSCG1pbkl0ZW1zEqwBCgltYXhfaXRlbXMYAiABKARCjgHCSIoBCocBChJyZXBlYXRlZC5tYXhfaXRlbXMacXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnUghtYXhJdGVtcxJ4CgZ1bmlxdWUYAyABKAhCYMJIXQpbCg9yZXBlYXRlZC51bmlxdWUSKHJlcGVhdGVkIHZhbHVlIG11c3QgY29udGFpbiB1bmlxdWUgaXRlbXMaHiFydWxlcy51bmlxdWUgfHwgdGhpcy51bmlxdWUoKVIGdW5pcXVlEi4KBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXNSBWl0ZW1zKgkI6AcQgICAgAIirAMKCE1hcFJ1bGVzEpkBCgltaW5fcGFpcnMYASABKARCfMJIeQp3Cg1tYXAubWluX3BhaXJzGmZ1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBsZWFzdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1pbl9wYWlyc10pIDogJydSCG1pblBhaXJzEpgBCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJ1IIbWF4UGFpcnMSLAoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgRrZXlzEjAKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMqCQjoBxCAgICAAiIxCghBbnlSdWxlcxIOCgJpbhgCIAMoCVICaW4SFQoGbm90X2luGAMgAygJUgVub3RJbiLGFwoNRHVyYXRpb25SdWxlcxKoAQoFY29uc3QYAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cd8JIdApyCg5kdXJhdGlvbi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKsAQoCbHQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cf8JIfAp6CgtkdXJhdGlvbi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSvwEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKPAcJIiwEKiAEKDGR1cmF0aW9uLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRLFBwoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ClwfCSJMHCn0KC2R1cmF0aW9uLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOZHVyYXRpb24uZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPZHVyYXRpb24uZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZZHVyYXRpb24uZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EpIICgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25C4gfCSN4HCosBCgxkdXJhdGlvbi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPZHVyYXRpb24uZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQZHVyYXRpb24uZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKhAQoCaW4YByADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CdsJIcwpxCgtkdXJhdGlvbi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEpsBCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CacJIZgpkCg9kdXJhdGlvbi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SUgoHZXhhbXBsZRgJIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIdwkgaChgKEGR1cmF0aW9uLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIpgGCg5GaWVsZE1hc2tSdWxlcxLGAQoFY29uc3QYASABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQpMBwkiPAQqMAQoQZmllbGRfbWFzay5jb25zdBp4dGhpcy5wYXRocyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykucGF0aHMgPyAndmFsdWUgbXVzdCBlcXVhbCBwYXRocyAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JykucGF0aHNdKSA6ICcnUgVjb25zdBLdAQoCaW4YAiADKAlCzAHCSMgBCsUBCg1maWVsZF9tYXNrLmluGrMBIXRoaXMucGF0aHMuYWxsKHAsIHAgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpIHx8IGdldEZpZWxkKHJ1bGVzLCAnaW4nKS5leGlzdHMoZiwgcC5zdGFydHNXaXRoKGYrJy4nKSkpID8gJ3ZhbHVlIG11c3Qgb25seSBjb250YWluIHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEvoBCgZub3RfaW4YAyADKAlC4gHCSN4BCtsBChFmaWVsZF9tYXNrLm5vdF9pbhrFASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ3ZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnUgVub3RJbhJVCgdleGFtcGxlGAQgAygLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0IfwkgcChoKEmZpZWxkX21hc2suZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACIsoYCg5UaW1lc3RhbXBSdWxlcxKqAQoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQnjCSHUKcwoPdGltZXN0YW1wLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0Eq8BCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCgAHCSH0KewoMdGltZXN0YW1wLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBLBAQoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKQAcJIjAEKiQEKDXRpbWVzdGFtcC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUScwoGbHRfbm93GAcgASgIQlrCSFcKVQoQdGltZXN0YW1wLmx0X25vdxpBKHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIAFIFbHROb3cSywcKAmd0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKcB8JImAcKfgoMdGltZXN0YW1wLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq3AQoPdGltZXN0YW1wLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq/AQoZdGltZXN0YW1wLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCscBChB0aW1lc3RhbXAuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrPAQoadGltZXN0YW1wLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBKYCAoDZ3RlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcELnB8JI4wcKjAEKDXRpbWVzdGFtcC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrGAQoQdGltZXN0YW1wLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrOAQoadGltZXN0YW1wLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtYBChF0aW1lc3RhbXAuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwreAQobdGltZXN0YW1wLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUSdgoGZ3Rfbm93GAggASgIQl3CSFoKWAoQdGltZXN0YW1wLmd0X25vdxpEKHJ1bGVzLmd0X25vdyAmJiB0aGlzIDwgbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cnIDogJydIAVIFZ3ROb3cSwAEKBndpdGhpbhgJIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKMAcJIiAEKhQEKEHRpbWVzdGFtcC53aXRoaW4acXRoaXMgPCBub3ctcnVsZXMud2l0aGluIHx8IHRoaXMgPiBub3crcnVsZXMud2l0aGluID8gJ3ZhbHVlIG11c3QgYmUgd2l0aGluICVzIG9mIG5vdycuZm9ybWF0KFtydWxlcy53aXRoaW5dKSA6ICcnUgZ3aXRoaW4SVAoHZXhhbXBsZRgKIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCHsJIGwoZChF0aW1lc3RhbXAuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iRQoKVmlvbGF0aW9ucxI3Cgp2aW9sYXRpb25zGAEgAygLMhcuYnVmLnZhbGlkYXRlLlZpb2xhdGlvblIKdmlvbGF0aW9ucyLFAQoJVmlvbGF0aW9uEi0KBWZpZWxkGAUgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aFIFZmllbGQSKwoEcnVsZRgGIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhSBHJ1bGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhgKB21lc3NhZ2UYAyABKAlSB21lc3NhZ2USFwoHZm9yX2tleRgEIAEoCFIGZm9yS2V5SgQIARACUgpmaWVsZF9wYXRoIkcKCUZpZWxkUGF0aBI6CghlbGVtZW50cxgBIAMoCzIeLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhFbGVtZW50UghlbGVtZW50cyLMAwoQRmllbGRQYXRoRWxlbWVudBIhCgxmaWVsZF9udW1iZXIYASABKAVSC2ZpZWxkTnVtYmVyEh0KCmZpZWxkX25hbWUYAiABKAlSCWZpZWxkTmFtZRJJCgpmaWVsZF90eXBlGAMgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVSCWZpZWxkVHlwZRJFCghrZXlfdHlwZRgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgdrZXlUeXBlEkkKCnZhbHVlX3R5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIJdmFsdWVUeXBlEhYKBWluZGV4GAYgASgESABSBWluZGV4EhsKCGJvb2xfa2V5GAcgASgISABSB2Jvb2xLZXkSGQoHaW50X2tleRgIIAEoA0gAUgZpbnRLZXkSGwoIdWludF9rZXkYCSABKARIAFIHdWludEtleRIfCgpzdHJpbmdfa2V5GAogASgJSABSCXN0cmluZ0tleUILCglzdWJzY3JpcHQqoQEKBklnbm9yZRIWChJJR05PUkVfVU5TUEVDSUZJRUQQABIYChRJR05PUkVfSUZfWkVST19WQUxVRRABEhEKDUlHTk9SRV9BTFdBWVMQAyIECAIQAioMSUdOT1JFX0VNUFRZKg5JR05PUkVfREVGQVVMVCoXSUdOT1JFX0lGX0RFRkFVTFRfVkFMVUUqFUlHTk9SRV9JRl9VTlBPUFVMQVRFRCpuCgpLbm93blJlZ2V4EhsKF0tOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEEAASIAocS05PV05fUkVHRVhfSFRUUF9IRUFERVJfTkFNRRABEiEKHUtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFEAI6VgoHbWVzc2FnZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiHCSABKAsyGi5idWYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlOk4KBW9uZW9mEh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuT25lb2ZSdWxlc1IFb25lb2Y6TgoFZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVmaWVsZDpdCgpwcmVkZWZpbmVkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiICSABKAsyHS5idWYudmFsaWRhdGUuUHJlZGVmaW5lZFJ1bGVzUgpwcmVkZWZpbmVkQm4KEmJ1aWxkLmJ1Zi52YWxpZGF0ZUINVmFsaWRhdGVQcm90b1ABWkdidWYuYnVpbGQvZ2VuL2dvL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUvcHJvdG9jb2xidWZmZXJzL2dvL2J1Zi92YWxpZGF0ZUq4tgkKBxIFDgDAJwEKzgQKAQwSAw4AEjLDBCBDb3B5cmlnaHQgMjAyMy0yMDI2IEJ1ZiBUZWNobm9sb2dpZXMsIEluYy4KCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgrqCwoBAhIDLAAVGt8LIFtQcm90b3ZhbGlkYXRlXShodHRwczovL3Byb3RvdmFsaWRhdGUuY29tLykgaXMgdGhlIHNlbWFudGljIHZhbGlkYXRpb24gbGlicmFyeSBmb3IgUHJvdG9idWYuCiBJdCBwcm92aWRlcyBzdGFuZGFyZCBhbm5vdGF0aW9ucyB0byB2YWxpZGF0ZSBjb21tb24gcnVsZXMgb24gbWVzc2FnZXMgYW5kIGZpZWxkcywgYXMgd2VsbCBhcyB0aGUgYWJpbGl0eSB0byB1c2UgW0NFTF0oaHR0cHM6Ly9jZWwuZGV2KSB0byB3cml0ZSBjdXN0b20gcnVsZXMuCiBJdCdzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgW3Byb3RvYy1nZW4tdmFsaWRhdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b2MtZ2VuLXZhbGlkYXRlKS4KCiBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIG9wdGlvbnMsIG1lc3NhZ2VzLCBhbmQgZW51bXMgdGhhdCBwb3dlciBQcm90b3ZhbGlkYXRlLgogQXBwbHkgaXRzIG9wdGlvbnMgdG8gbWVzc2FnZXMsIGZpZWxkcywgYW5kIG9uZW9mcyBpbiB5b3VyIFByb3RvYnVmIHNjaGVtYXMgdG8gYWRkIHZhbGlkYXRpb24gcnVsZXM6CgogYGBgcHJvdG8KIG1lc3NhZ2UgVXNlciB7CiAgIHN0cmluZyBpZCA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy51dWlkID0gdHJ1ZV07CiAgIHN0cmluZyBmaXJzdF9uYW1lID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLm1heF9sZW4gPSA2NF07CiAgIHN0cmluZyBsYXN0X25hbWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcubWF4X2xlbiA9IDY0XTsKCiAgIG9wdGlvbiAoYnVmLnZhbGlkYXRlLm1lc3NhZ2UpLmNlbCA9IHsKICAgICBpZDogImZpcnN0X25hbWVfcmVxdWlyZXNfbGFzdF9uYW1lIgogICAgIG1lc3NhZ2U6ICJsYXN0X25hbWUgbXVzdCBiZSBwcmVzZW50IGlmIGZpcnN0X25hbWUgaXMgcHJlc2VudCIKICAgICBleHByZXNzaW9uOiAiIWhhcyh0aGlzLmZpcnN0X25hbWUpIHx8IGhhcyh0aGlzLmxhc3RfbmFtZSkiCiAgIH07CiB9CiBgYGAKCiBUaGVzZSBydWxlcyBhcmUgZW5mb3JjZWQgYXQgcnVudGltZSBieSBsYW5ndWFnZS1zcGVjaWZpYyBsaWJyYXJpZXMuCiBTZWUgdGhlIFtkZXZlbG9wZXIgcXVpY2tzdGFydF0oaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9xdWlja3N0YXJ0LykgdG8gZ2V0IHN0YXJ0ZWQsIG9yIGdvIGRpcmVjdGx5IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgZm9yIHlvdXIgbGFuZ3VhZ2U6CiBbR29dKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWdvKQogW0phdmFTY3JpcHQvVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUtZXMpLAogW0phdmFdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWphdmEpLAogW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUtcHl0aG9uKSwKIG9yIFtDKytdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWNjKS4KCgkKAgMAEgMuACoKCQoCAwESAy8AKAoJCgIDAhIDMAAqCgkKAgMDEgMxACkKCAoBCBIDMwBeCgkKAggLEgMzAF4KCAoBCBIDNAAiCgkKAggKEgM0ACIKCAoBCBIDNQAuCgkKAggIEgM1AC4KCAoBCBIDNgArCgkKAggBEgM2ACsKgAIKAQcSBDwAQAEa9AEgTWVzc2FnZU9wdGlvbnMgaXMgYW4gZXh0ZW5zaW9uIHRvIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy4gSXQgYWxsb3dzCiB0aGUgYWRkaXRpb24gb2YgdmFsaWRhdGlvbiBydWxlcyBhdCB0aGUgbWVzc2FnZSBsZXZlbC4gVGhlc2UgcnVsZXMgY2FuIGJlCiBhcHBsaWVkIHRvIGluY29taW5nIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGV5IG1lZXQgY2VydGFpbiBjcml0ZXJpYSBiZWZvcmUKIGJlaW5nIHByb2Nlc3NlZC4KCoYBCgIHABIDPwInGnsgUnVsZXMgc3BlY2lmeSB0aGUgdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgbWVzc2FnZS4gQnkgZGVmYXVsdCwKIG5vIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGFnYWluc3QgYSBtZXNzYWdlLgoKCgoDBwACEgM8ByUKCgoDBwAEEgM/AgoKCgoDBwAGEgM/CxcKCgoDBwABEgM/GB8KCgoDBwADEgM/IiYK8gEKAQcSBEYASgEa5gEgT25lb2ZPcHRpb25zIGlzIGFuIGV4dGVuc2lvbiB0byBnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLiBJdCBhbGxvd3MKIHRoZSBhZGRpdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIG9uIGEgb25lb2YuIFRoZXNlIHJ1bGVzIGNhbiBiZQogYXBwbGllZCB0byBpbmNvbWluZyBtZXNzYWdlcyB0byBlbnN1cmUgdGhleSBtZWV0IGNlcnRhaW4gY3JpdGVyaWEgYmVmb3JlCiBiZWluZyBwcm9jZXNzZWQuCgqCAQoCBwESA0kCIxp3IFJ1bGVzIHNwZWNpZnkgdGhlIHZhbGlkYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGlzIG9uZW9mLiBCeSBkZWZhdWx0LAogbm8gdmFsaWRhdGlvbiBpcyBwZXJmb3JtZWQgYWdhaW5zdCBhIG9uZW9mLgoKCgoDBwECEgNGByMKCgoDBwEEEgNJAgoKCgoDBwEGEgNJCxUKCgoDBwEBEgNJFhsKCgoDBwEDEgNJHiIK+gEKAQcSBFAAZgEa7gEgRmllbGRPcHRpb25zIGlzIGFuIGV4dGVuc2lvbiB0byBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLiBJdCBhbGxvd3MKIHRoZSBhZGRpdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIGF0IHRoZSBmaWVsZCBsZXZlbC4gVGhlc2UgcnVsZXMgY2FuIGJlCiBhcHBsaWVkIHRvIGluY29taW5nIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGV5IG1lZXQgY2VydGFpbiBjcml0ZXJpYSBiZWZvcmUKIGJlaW5nIHByb2Nlc3NlZC4KCoIBCgIHAhIDUwIjGncgUnVsZXMgc3BlY2lmeSB0aGUgdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgZmllbGQuIEJ5IGRlZmF1bHQsCiBubyB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IGEgZmllbGQuCgoKCgMHAgISA1AHIwoKCgMHAgQSA1MCCgoKCgMHAgYSA1MLFQoKCgMHAgESA1MWGwoKCgMHAgMSA1MeIgrKAwoCBwMSA2UCLRq+AyBTcGVjaWZpZXMgcHJlZGVmaW5lZCBydWxlcy4gV2hlbiBleHRlbmRpbmcgYSBzdGFuZGFyZCBydWxlIG1lc3NhZ2UsCiB0aGlzIGFkZHMgYWRkaXRpb25hbCBDRUwgZXhwcmVzc2lvbnMgdGhhdCBhcHBseSB3aGVuIHRoZSBleHRlbnNpb24gaXMgdXNlZC4KCiBgYGBwcm90bwogZXh0ZW5kIGJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzIHsKICAgYm9vbCBpc196ZXJvIFsoYnVmLnZhbGlkYXRlLnByZWRlZmluZWQpLmNlbCA9IHsKICAgICBpZDogImludDMyLmlzX3plcm8iLAogICAgIG1lc3NhZ2U6ICJ2YWx1ZSBtdXN0IGJlIHplcm8iLAogICAgIGV4cHJlc3Npb246ICIhcnVsZSB8fCB0aGlzID09IDAiLAogICB9XTsKIH0KCiBtZXNzYWdlIEZvbyB7CiAgIGludDMyIHJlc2VydmVkID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuaW50MzIuKGlzX3plcm8pID0gdHJ1ZV07CiB9CiBgYGAKCgoKAwcDAhIDUAcjCgoKAwcDBBIDZQIKCgoKAwcDBhIDZQsaCgoKAwcDARIDZRslCgoKAwcDAxIDZSgsCoEECgIEABIFdwCHAQEa8wMgYFJ1bGVgIHJlcHJlc2VudHMgYSB2YWxpZGF0aW9uIHJ1bGUgd3JpdHRlbiBpbiB0aGUgQ29tbW9uIEV4cHJlc3Npb24KIExhbmd1YWdlIChDRUwpIHN5bnRheC4gRWFjaCBSdWxlIGluY2x1ZGVzIGEgdW5pcXVlIGlkZW50aWZpZXIsIGFuCiBvcHRpb25hbCBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIENFTCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiBGb3IgbW9yZQogaW5mb3JtYXRpb24sIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIEZvbyB7CiAgIG9wdGlvbiAoYnVmLnZhbGlkYXRlLm1lc3NhZ2UpLmNlbCA9IHsKICAgICBpZDogImZvby5iYXIiCiAgICAgbWVzc2FnZTogImJhciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIgogICAgIGV4cHJlc3Npb246ICJ0aGlzLmJhciA+IDAiCiAgIH07CiAgIGludDMyIGJhciA9IDE7CiB9CiBgYGAKCgoKAwQAARIDdwgMCqkBCgQEAAIAEgN6AhkamwEgYGlkYCBpcyBhIHN0cmluZyB0aGF0IHNlcnZlcyBhcyBhIG1hY2hpbmUtcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBSdWxlLgogSXQgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gaXRzIHNjb3BlLCB3aGljaCBjb3VsZCBiZSBlaXRoZXIgYSBtZXNzYWdlIG9yIGEgZmllbGQuCgoMCgUEAAIABBIDegIKCgwKBQQAAgAFEgN6CxEKDAoFBAACAAESA3oSFAoMCgUEAAIAAxIDehcYCoMCCgQEAAIBEgSAAQIeGvQBIGBtZXNzYWdlYCBpcyBhbiBvcHRpb25hbCBmaWVsZCB0aGF0IHByb3ZpZGVzIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZQogZm9yIHRoaXMgUnVsZSB3aGVuIHRoZSBDRUwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuIElmIGEKIG5vbi1lbXB0eSBtZXNzYWdlIGlzIHByb3ZpZGVkLCBhbnkgc3RyaW5ncyByZXN1bHRpbmcgZnJvbSB0aGUgQ0VMCiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXJlIGlnbm9yZWQuCgoNCgUEAAIBBBIEgAECCgoNCgUEAAIBBRIEgAELEQoNCgUEAAIBARIEgAESGQoNCgUEAAIBAxIEgAEcHQqiAgoEBAACAhIEhgECIRqTAiBgZXhwcmVzc2lvbmAgaXMgdGhlIGFjdHVhbCBDRUwgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGZvcgogdmFsaWRhdGlvbi4gVGhpcyBzdHJpbmcgbXVzdCByZXNvbHZlIHRvIGVpdGhlciBhIGJvb2xlYW4gb3IgYSBzdHJpbmcKIHZhbHVlLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2Ugb3IgYSBub24tZW1wdHkgc3RyaW5nLCB0aGUKIHZhbGlkYXRpb24gaXMgY29uc2lkZXJlZCBmYWlsZWQsIGFuZCB0aGUgbWVzc2FnZSBpcyByZWplY3RlZC4KCg0KBQQAAgIEEgSGAQIKCg0KBQQAAgIFEgSGAQsRCg0KBQQAAgIBEgSGARIcCg0KBQQAAgIDEgSGAR8gCtwBCgIEARIGiwEA1wEBGs0BIE1lc3NhZ2VSdWxlcyByZXByZXNlbnRzIHZhbGlkYXRpb24gcnVsZXMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGUgZW50aXJlIG1lc3NhZ2UuCiBJdCBpbmNsdWRlcyBkaXNhYmxpbmcgb3B0aW9ucyBhbmQgYSBsaXN0IG9mIFJ1bGUgbWVzc2FnZXMgcmVwcmVzZW50aW5nIENvbW1vbiBFeHByZXNzaW9uIExhbmd1YWdlIChDRUwpIHZhbGlkYXRpb24gcnVsZXMuCgoLCgMEAQESBIsBCBQK1AYKBAQBAgASBJ4BAiUaxQYgYGNlbF9leHByZXNzaW9uYCBpcyBhIHJlcGVhdGVkIGZpZWxkIENFTCBleHByZXNzaW9ucy4gRWFjaCBleHByZXNzaW9uIHNwZWNpZmllcyBhIHZhbGlkYXRpb24KIHJ1bGUgdG8gYmUgYXBwbGllZCB0byB0aGlzIG1lc3NhZ2UuIFRoZXNlIHJ1bGVzIGFyZSB3cml0dGVuIGluIENvbW1vbiBFeHByZXNzaW9uIExhbmd1YWdlIChDRUwpIHN5bnRheC4KCiBUaGlzIGlzIGEgc2ltcGxpZmllZCBmb3JtIG9mIHRoZSBgY2VsYCBSdWxlIGZpZWxkLCB3aGVyZSBvbmx5IGBleHByZXNzaW9uYCBpcyBzZXQuIFRoaXMgYWxsb3dzIGZvcgogc2ltcGxlciBzeW50YXggd2hlbiBkZWZpbmluZyBDRUwgUnVsZXMgd2hlcmUgYGlkYCBhbmQgYG1lc3NhZ2VgIGRlcml2ZWQgZnJvbSB0aGUgYGV4cHJlc3Npb25gLiBgaWRgIHdpbGwKIGJlIHNhbWUgYXMgdGhlIGBleHByZXNzaW9uYC4KCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgW3NlZSBvdXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9idWYuYnVpbGQvZG9jcy9wcm90b3ZhbGlkYXRlL3NjaGVtYXMvY3VzdG9tLXJ1bGVzLykuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGBmb29gIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb24gKGJ1Zi52YWxpZGF0ZS5tZXNzYWdlKS5jZWxfZXhwcmVzc2lvbiA9ICJ0aGlzLmZvbyA+IDQyIjsKICAgLy8gVGhlIGZpZWxkIGBmb29gIG11c3QgYmUgbGVzcyB0aGFuIDg0LgogICBvcHRpb24gKGJ1Zi52YWxpZGF0ZS5tZXNzYWdlKS5jZWxfZXhwcmVzc2lvbiA9ICJ0aGlzLmZvbyA8IDg0IjsKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsKIH0KIGBgYAoKDQoFBAECAAQSBJ4BAgoKDQoFBAECAAUSBJ4BCxEKDQoFBAECAAESBJ4BEiAKDQoFBAECAAMSBJ4BIyQKvgQKBAQBAgESBK8BAhgarwQgYGNlbGAgaXMgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIFJ1bGUuIEVhY2ggUnVsZSBzcGVjaWZpZXMgYSB2YWxpZGF0aW9uIHJ1bGUgdG8gYmUgYXBwbGllZCB0byB0aGlzIG1lc3NhZ2UuCiBUaGVzZSBydWxlcyBhcmUgd3JpdHRlbiBpbiBDb21tb24gRXhwcmVzc2lvbiBMYW5ndWFnZSAoQ0VMKSBzeW50YXguIEZvciBtb3JlIGluZm9ybWF0aW9uLAogW3NlZSBvdXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9idWYuYnVpbGQvZG9jcy9wcm90b3ZhbGlkYXRlL3NjaGVtYXMvY3VzdG9tLXJ1bGVzLykuCgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgZm9vYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0Mi4KICAgb3B0aW9uIChidWYudmFsaWRhdGUubWVzc2FnZSkuY2VsID0gewogICAgIGlkOiAibXlfbWVzc2FnZS52YWx1ZSIsCiAgICAgbWVzc2FnZTogInZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyIiwKICAgICBleHByZXNzaW9uOiAidGhpcy5mb28gPiA0MiIsCiAgIH07CiAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7CiB9CiBgYGAKCg0KBQQBAgEEEgSvAQIKCg0KBQQBAgEGEgSvAQsPCg0KBQQBAgEBEgSvARATCg0KBQQBAgEDEgSvARYXCskOCgQEAQICEgTTAQImGroOIGBvbmVvZmAgaXMgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIE1lc3NhZ2VPbmVvZlJ1bGUgdGhhdCBzcGVjaWZpZXMgYSBsaXN0IG9mIGZpZWxkcwogb2Ygd2hpY2ggYXQgbW9zdCBvbmUgY2FuIGJlIHByZXNlbnQuIElmIGByZXF1aXJlZGAgaXMgYWxzbyBzcGVjaWZpZWQsIHRoZW4gZXhhY3RseSBvbmUKIG9mIHRoZSBzcGVjaWZpZWQgZmllbGRzIF9tdXN0XyBiZSBwcmVzZW50LgoKIFRoaXMgd2lsbCBlbmZvcmNlIG9uZW9mLWxpa2UgY29uc3RyYWludHMgd2l0aCBhIGZldyBmZWF0dXJlcyBub3QgcHJvdmlkZWQgYnkKIGFjdHVhbCBQcm90b2J1ZiBvbmVvZiBkZWNsYXJhdGlvbnM6CiAgIDEuIFJlcGVhdGVkIGFuZCBtYXAgZmllbGRzIGFyZSBhbGxvd2VkIGluIHRoaXMgdmFsaWRhdGlvbi4gSW4gYSBQcm90b2J1ZiBvbmVvZiwKICAgICAgb25seSBzY2FsYXIgZmllbGRzIGFyZSBhbGxvd2VkLgogICAyLiBGaWVsZHMgd2l0aCBpbXBsaWNpdCBwcmVzZW5jZSBhcmUgYWxsb3dlZC4gSW4gYSBQcm90b2J1ZiBvbmVvZiwgYWxsIG1lbWJlcgogICAgICBmaWVsZHMgaGF2ZSBleHBsaWNpdCBwcmVzZW5jZS4gVGhpcyBtZWFucyB0aGF0LCBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV0ZXJtaW5pbmcKICAgICAgaG93IG1hbnkgZmllbGRzIGFyZSBzZXQsIGV4cGxpY2l0bHkgc2V0dGluZyBzdWNoIGEgZmllbGQgdG8gaXRzIHplcm8gdmFsdWUgaXMKICAgICAgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgbm90IHNldHRpbmcgaXQgYXQgYWxsLgogICAzLiBUaGlzIHdpbGwgYWx3YXlzIGdlbmVyYXRlIHZhbGlkYXRpb24gZXJyb3JzIGZvciBhIG1lc3NhZ2UgdW5tYXJzaGFsbGVkIGZyb20KICAgICAgc2VyaWFsaXplZCBkYXRhIHRoYXQgc2V0cyBtb3JlIHRoYW4gb25lIGZpZWxkLiBXaXRoIGEgUHJvdG9idWYgb25lb2YsIHdoZW4KICAgICAgbXVsdGlwbGUgZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGVhcmxpZXIgdmFsdWVzIGFyZSB1c3VhbGx5CiAgICAgIHNpbGVudGx5IGlnbm9yZWQgd2hlbiB1bm1hcnNoYWxsaW5nLCB3aXRoIG9ubHkgdGhlIGxhc3QgZmllbGQgYmVpbmcgc2V0IHdoZW4KICAgICAgdW5tYXJzaGFsbGluZyBjb21wbGV0ZXMuCgogTm90ZSB0aGF0IGFkZGluZyBhIGZpZWxkIHRvIGEgYG9uZW9mYCB3aWxsIGFsc28gc2V0IHRoZSBJR05PUkVfSUZfWkVST19WQUxVRSBvbiB0aGUgZmllbGRzLiBUaGlzIG1lYW5zCiBvbmx5IHRoZSBmaWVsZCB0aGF0IGlzIHNldCB3aWxsIGJlIHZhbGlkYXRlZCBhbmQgdGhlIHVuc2V0IGZpZWxkcyBhcmUgbm90IHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZpZWxkIHJ1bGVzLgogVGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0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9QEQGAoNCgUEAwIAAxIE9QEbHAqgAQoCBAQSBvoBAIEDARqRASBGaWVsZFJ1bGVzIGVuY2Fwc3VsYXRlcyB0aGUgcnVsZXMgZm9yIGVhY2ggdHlwZSBvZiBmaWVsZC4gRGVwZW5kaW5nIG9uCiB0aGUgZmllbGQsIHRoZSBjb3JyZWN0IHNldCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgcHJvcGVyIHZhbGlkYXRpb25zLgoKCwoDBAQBEgT6AQgSCtoFCgQEBAIAEgSKAgImGssFIGBjZWxfZXhwcmVzc2lvbmAgaXMgYSByZXBlYXRlZCBmaWVsZCBDRUwgZXhwcmVzc2lvbnMuIEVhY2ggZXhwcmVzc2lvbiBzcGVjaWZpZXMgYSB2YWxpZGF0aW9uCiBydWxlIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBtZXNzYWdlLiBUaGVzZSBydWxlcyBhcmUgd3JpdHRlbiBpbiBDb21tb24gRXhwcmVzc2lvbiBMYW5ndWFnZSAoQ0VMKSBzeW50YXguCgogVGhpcyBpcyBhIHNpbXBsaWZpZWQgZm9ybSBvZiB0aGUgYGNlbGAgUnVsZSBmaWVsZCwgd2hlcmUgb25seSBgZXhwcmVzc2lvbmAgaXMgc2V0LiBUaGlzIGFsbG93cyBmb3IKIHNpbXBsZXIgc3ludGF4IHdoZW4gZGVmaW5pbmcgQ0VMIFJ1bGVzIHdoZXJlIGBpZGAgYW5kIGBtZXNzYWdlYCBkZXJpdmVkIGZyb20gdGhlIGBleHByZXNzaW9uYC4gYGlkYCB3aWxsCiBiZSBzYW1lIGFzIHRoZSBgZXhwcmVzc2lvbmAuCgogRm9yIG1vcmUgaW5mb3JtYXRpb24sIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmNlbF9leHByZXNzaW9uID0gInRoaXMgPiA0MiJdOwogfQogYGBgCgoNCgUEBAIABBIEigICCgoNCgUEBAIABRIEigILEQoNCgUEBAIAARIEigISIAoNCgUEBAIAAxIEigIjJQryAwoEBAQCARIEmQICGRrjAyBgY2VsYCBpcyBhIHJlcGVhdGVkIGZpZWxkIHVzZWQgdG8gcmVwcmVzZW50IGEgdGV4dHVhbCBleHByZXNzaW9uCiBpbiB0aGUgQ29tbW9uIEV4cHJlc3Npb24gTGFuZ3VhZ2UgKENFTCkgc3ludGF4LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmNlbCA9IHsKICAgICBpZDogIm15X21lc3NhZ2UudmFsdWUiLAogICAgIG1lc3NhZ2U6ICJ2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0MiIsCiAgICAgZXhwcmVzc2lvbjogInRoaXMgPiA0MiIsCiAgIH1dOwogfQogYGBgCgoNCgUEBAIBBBIEmQICCgoNCgUEBAIBBhIEmQILDwoNCgUEBAIBARIEmQIQEwoNCgUEBAIBAxIEmQIWGArhDgoEBAQCAhIE0gICHhrSDiBJZiBgcmVxdWlyZWRgIGlzIHRydWUsIHRoZSBmaWVsZCBtdXN0IGJlIHNldC4gQSB2YWxpZGF0aW9uIGVycm9yIGlzIHJldHVybmVkCiBpZiB0aGUgZmllbGQgaXMgbm90IHNldC4KCiBgYGBwcm90bwogc3ludGF4PSJwcm90bzMiOwoKIG1lc3NhZ2UgRmllbGRzV2l0aFByZXNlbmNlIHsKICAgLy8gUmVxdWlyZXMgYW55IHN0cmluZyB0byBiZSBzZXQsIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgogICBvcHRpb25hbCBzdHJpbmcgbGluayA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogICAvLyBSZXF1aXJlcyB0cnVlIG9yIGZhbHNlIHRvIGJlIHNldC4KICAgb3B0aW9uYWwgYm9vbCBkaXNhYmxlZCA9IDIgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogICAvLyBSZXF1aXJlcyBhIG1lc3NhZ2UgdG8gYmUgc2V0LCBpbmNsdWRpbmcgdGhlIGVtcHR5IG1lc3NhZ2UuCiAgIFNvbWVNZXNzYWdlIG1zZyA9IDQgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogfQogYGBgCgogQWxsIGZpZWxkcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSB0cmFjayBwcmVzZW5jZS4gQnkgZGVmYXVsdCwgUHJvdG92YWxpZGF0ZQogaWdub3JlcyBydWxlcyBvbiB0aG9zZSBmaWVsZHMgaWYgbm8gdmFsdWUgaXMgc2V0LiBgcmVxdWlyZWRgIGVuc3VyZXMgdGhhdAogdGhlIGZpZWxkcyBhcmUgc2V0IGFuZCB2YWxpZC4KCiBGaWVsZHMgdGhhdCBkb24ndCB0cmFjayBwcmVzZW5jZSBhcmUgYWx3YXlzIHZhbGlkYXRlZCBieSBQcm90b3ZhbGlkYXRlLAogd2hldGhlciB0aGV5IGFyZSBzZXQgb3Igbm90LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBgcmVxdWlyZWRgLiBJdAogY2FuIGJlIGFkZGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpZWxkIGNhbm5vdCBiZSB0aGUgemVybyB2YWx1ZS4KCiBgYGBwcm90bwogc3ludGF4PSJwcm90bzMiOwoKIG1lc3NhZ2UgRmllbGRzV2l0aG91dFByZXNlbmNlIHsKICAgLy8gYHN0cmluZy5lbWFpbGAgYWx3YXlzIGFwcGxpZXMsIGV2ZW4gdG8gYW4gZW1wdHkgc3RyaW5nLgogICBzdHJpbmcgbGluayA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5lbWFpbCA9IHRydWUKICAgXTsKICAgLy8gYHJlcGVhdGVkLm1pbl9pdGVtc2AgYWx3YXlzIGFwcGxpZXMsIGV2ZW4gdG8gYW4gZW1wdHkgbGlzdC4KICAgcmVwZWF0ZWQgc3RyaW5nIGxhYmVscyA9IDIgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcGVhdGVkLm1pbl9pdGVtcyA9IDEKICAgXTsKICAgLy8gYHJlcXVpcmVkYCwgZm9yIGZpZWxkcyB0aGF0IGRvbid0IHRyYWNrIHByZXNlbmNlLCBpbmRpY2F0ZXMKICAgLy8gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBjYW4ndCBiZSB0aGUgemVybyB2YWx1ZS4KICAgaW50MzIgemVyb192YWx1ZV9ub3RfYWxsb3dlZCA9IDMgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogfQogYGBgCgogVG8gbGVhcm4gd2hpY2ggZmllbGRzIHRyYWNrIHByZXNlbmNlLCBzZWUgdGhlCiBbRmllbGQgUHJlc2VuY2UgY2hlYXQgc2hlZXRdKGh0dHBzOi8vcHJvdG9idWYuZGV2L3Byb2dyYW1taW5nLWd1aWRlcy9maWVsZF9wcmVzZW5jZS8jY2hlYXQpLgoKIE5vdGU6IFdoaWxlIGZpZWxkIHJ1bGVzIGNhbiBiZSBhcHBsaWVkIHRvIHJlcGVhdGVkIGl0ZW1zLCBtYXAga2V5cywgYW5kIG1hcAogdmFsdWVzLCB0aGUgZWxlbWVudHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIHNldC4gQ29uc2VxdWVudGx5LAogc3BlY2lmeWluZyBgcmVwZWF0ZWQuaXRlbXMucmVxdWlyZWRgIGlzIHJlZHVuZGFudC4KCg0KBQQEAgIEEgTSAgIKCg0KBQQEAgIFEgTSAgsPCg0KBQQEAgIBEgTSAhAYCg0KBQQEAgIDEgTSAhsdCvYCCgQEBAIDEgTfAgIeGucCIElnbm9yZSB2YWxpZGF0aW9uIHJ1bGVzIG9uIHRoZSBmaWVsZCBpZiBpdHMgdmFsdWUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCiBjcml0ZXJp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AQoCBQASBpwDAPQDARp0IFNwZWNpZmllcyBob3cgYEZpZWxkUnVsZXMuaWdub3JlYCBiZWhhdmVzLCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkJ3MgdmFsdWUsIGFuZAogd2hldGhlciB0aGUgZmllbGQgdHJhY2tzIHByZXNlbmNlLgoKCwoDBQABEgScAwULCpQKCgQFAAIAEgTQAwIZGoUKIElnbm9yZSBydWxlcyBpZiB0aGUgZmllbGQgdHJhY2tzIHByZXNlbmNlIGFuZCBpcyB1bnNldC4gVGhpcyBpcyB0aGUgZGVmYXVsdAogYmVoYXZpb3IuCgogSW4gcHJvdG8zLCBvbmx5IG1lc3NhZ2UgZmllbGRzLCBtZW1iZXJzIG9mIGEgUHJvdG9idWYgYG9uZW9mYCwgYW5kIGZpZWxkcwogd2l0aCB0aGUgYG9wdGlvbmFsYCBsYWJlbCB0cmFjayBwcmVzZW5jZS4gQ29uc2VxdWVudGx5LCB0aGUgZm9sbG93aW5nIGZpZWxkcwogYXJlIGFsd2F5cyB2YWxpZGF0ZWQsIHdoZXRoZXIgYSB2YWx1ZSBpcyBzZXQgb3Igbm90OgoKIGBgYHByb3RvCiBzeW50YXg9InByb3RvMyI7CgogbWVzc2FnZSBSdWxlc0FwcGx5IHsKICAgc3RyaW5nIGVtYWlsID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmVtYWlsID0gdHJ1ZQogICBdOwogICBpbnQzMiBhZ2UgPSAyIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5pbnQzMi5ndCA9IDAKICAgXTsKICAgcmVwZWF0ZWQgc3RyaW5nIGxhYmVscyA9IDMgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcGVhdGVkLm1pbl9pdGVtcyA9IDEKICAgXTsKIH0KIGBgYAoKIEluIGNvbnRyYXN0LCB0aGUgZm9sbG93aW5nIGZpZWxkcyB0cmFjayBwcmVzZW5jZSwgYW5kIGFyZSBvbmx5IHZhbGlkYXRlZCBpZgogYSB2YWx1ZSBpcyBzZXQ6CgogYGBgcHJvdG8KIHN5bnRheD0icHJvdG8zIjsKCiBtZXNzYWdlIFJ1bGVzQXBwbHlJZlNldCB7CiAgIG9wdGlvbmFsIHN0cmluZyBlbWFpbCA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5lbWFpbCA9IHRydWUKICAgXTsKICAgb25lb2YgcmVmIHsKICAgICBzdHJpbmcgcmVmZXJlbmNlID0gMiBbCiAgICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcudXVpZCA9IHRydWUKICAgICBdOwogICAgIHN0cmluZyBuYW1lID0gMyBbCiAgICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcubWluX2xlbiA9IDQKICAgICBdOwogICB9CiAgIFNvbWVNZXNzYWdlIG1zZyA9IDQgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLmNlbCA9IHsvKiAuLi4gKi99CiAgIF07CiB9CiBgYGAKCiBUbyBlbnN1cmUgdGhhdCBzdWNoIGEgZmllbGQgaXMgc2V0LCBhZGQgdGhlIGByZXF1aXJlZGAgcnVsZS4KCiBUbyBsZWFybiB3aGljaCBmaWVsZHMgdHJhY2sgcHJlc2VuY2UsIHNlZSB0aGUKIFtGaWVsZCBQcmVzZW5jZSBjaGVhdCBzaGVldF0oaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2ZpZWxkX3ByZXNlbmNlLyNjaGVhdCkuCgoNCgUFAAIAARIE0AMCFAoNCgUFAAIAAhIE0AMXGArJBQoEBQACARIE4AMCGxq6BSBJZ25vcmUgcnVsZXMgaWYgdGhlIGZpZWxkIGlzIHVuc2V0LCBvciBzZXQgdG8gdGhlIHplcm8gdmFsdWUuCgogVGhlIHplcm8gdmFsdWUgZGVwZW5kcyBvbiB0aGUgZmllbGQgdHlwZToKIC0gRm9yIHN0cmluZ3MsIHRoZSB6ZXJvIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcuCiAtIEZvciBieXRlcywgdGhlIHplcm8gdmFsdWUgaXMgZW1wdHkgYnl0ZXMuCiAtIEZvciBib29sLCB0aGUgemVybyB2YWx1ZSBpcyBmYWxzZS4KIC0gRm9yIG51bWVyaWMgdHlwZXMsIHRoZSB6ZXJvIHZhbHVlIGlzIHplcm8uCiAtIEZvciBlbnVtcywgdGhlIHplcm8gdmFsdWUgaXMgdGhlIGZpcnN0IGRlZmluZWQgZW51bSB2YWx1ZS4KIC0gRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIHplcm8gaXMgYW4gZW1wdHkgbGlzdC4KIC0gRm9yIG1hcCBmaWVsZHMsIHRoZSB6ZXJvIGlzIGFuIGVtcHR5IG1hcC4KIC0gRm9yIG1lc3NhZ2UgZmllbGRzLCBhYnNlbmNlIG9mIHRoZSBtZXNzYWdlICh0eXBpY2FsbHkgYSBudWxsLXZhbHVlKSBpcyBjb25zaWRlcmVkIHplcm8gdmFsdWUuCgogRm9yIGZpZWxkcyB0aGF0IHRyYWNrIHByZXNlbmNlIChlLmcuIGFkZGluZyB0aGUgYG9wdGlvbmFsYCBsYWJlbCBpbiBwcm90bzMpLAogdGhpcyBhIG5vLW9wIGFuZCBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBgSUdOT1JFX1VOU1BFQ0lGSUVEYC4KCg0KBQUAAgEBEgTgAwIWCg0KBQUAAgECEgTgAxkaCpkDCgQFAAICEgTwAwIUGooDIEFsd2F5cyBpZ25vcmUgcnVsZXMsIGluY2x1ZGluZyB0aGUgYHJlcXVpcmVkYCBydWxlLgoKIFRoaXMgaXMgdXNlZnVsIGZvciBpZ25vcmluZyB0aGUgcnVsZXMgb2YgYSByZWZlcmVuY2VkIG1lc3NhZ2UsIG9yIHRvCiB0ZW1wb3JhcmlseSBpZ25vcmUgcnVsZXMgZHVyaW5nIGRldmVsb3BtZW50LgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCdzIHJ1bGVzIHdpbGwgYWx3YXlzIGJlIGlnbm9yZWQsIGluY2x1ZGluZyBhbnkgdmFsaWRhdGlvbnMKICAgLy8gb24gdmFsdWUncyBmaWVsZHMuCiAgIE15T3RoZXJNZXNzYWdlIHZhbHVlID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuaWdub3JlID0gSUdOT1JFX0FMV0FZUwogICBdOwogfQogYGBgCgoNCgUFAAICARIE8AMCDwoNCgUFAAICAhIE8AMSEwoLCgMFAAQSBPIDAg0KDAoEBQAEABIE8gMLDAoNCgUFAAQA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FAoKBAoCAwiICQEDAxIGoAsIogttChMKCQQKAgMIiAkBBBIGpAsGqQsHChIKCgQKAgMIiAkBBAESBKULCCUKFAoKBAoCAwiICQEEAxIGpgsIqAtsCsQGCgQECgIEEga+CwTdCwYaswYgYGd0ZWAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGVgIGlzIGxhcmdlciB0aGFuIGEgc3BlY2lmaWVkIGBsdGAKIG9yIGBsdGVgLCB0aGUgcmFuZ2UgaXMgcmV2ZXJzZWQsIGFuZCB0aGUgZmllbGQgdmFsdWUgbXVzdCBiZSBvdXRzaWRlIHRoZQogc3BlY2lmaWVkIHJhbmdlLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlVSW50MzIgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IFt1aW50MzIuZ3RlXQogICB1aW50MzIgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS51aW50MzIuZ3RlID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IGFuZCBsZXNzIHRoYW4gMTAgW3VpbnQzMi5ndGVfbHRdCiAgIHVpbnQzMiBvdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLnVpbnQzMiA9IHsgZ3RlOiA1LCBsdDogMTAgfV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCBvciBsZXNzIHRoYW4gNSBbdWludDMyLmd0ZV9sdF9leGNsdXNpdmVdCiAgIHVpbnQzMiBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudWludDMyID0geyBndGU6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EgTbEQgcChQKCgQOAgMIiAkBAwMSBtwRCN4RbQoTCgkEDgIDCIgJAQQSBuARBuURBwoSCgoEDgIDCIgJAQQBEgThEQgmChQKCgQOAgMIiAkBBAMSBuIRCOQRbArOBgoEBA4CBBIG+hEEmRIGGr0GIGBndGVgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Rml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgW2ZpeGVkMzIuZ3RlXQogICBmaXhlZDMyIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQzMi5ndGUgPSA1XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgYW5kIGxlc3MgdGhhbiAxMCBbZml4ZWQzMi5ndGVfbHRdCiAgIGZpeGVkMzIgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5maXhlZDMyID0geyBndGU6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmVdCiAgIGZpeGVkMzIgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQp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AAESBP0SBhcKFAoKBA8CAgiICQEAAxIG/hIGgBNNCg4KBAQPCAESBoMTAukTAwoNCgUEDwgBARIEgxMIFAqWBgoEBA8CAxIGlhMEtRMGGoUGIGBndGAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlCiAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGAgaXMgbGFyZ2VyIHRoYW4gYSBzcGVjaWZpZWQgYGx0YCBvcgogYGx0ZWAsIHRoZSByYW5nZSBpcyByZXZlcnNlZCwgYW5kIHRoZSBmaWVsZCB2YWx1ZSBtdXN0IGJlIG91dHNpZGUgdGhlCiBzcGVjaWZpZWQgcmFuZ2UuIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVkIGNvbmRpdGlvbnMsCiBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1IFtmaXhlZDY0Lmd0XQogICBmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NC5ndCA9IDVdOwoKICAgLy8gdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gNSBhbmQgbGVzcyB0aGFuIDEwIFtmaXhlZDY0Lmd0X2x0XQogICBmaXhlZDY0IG90aGVyX3ZhbHVlID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NCA9IHsgZ3Q6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZV0KICAgZml4ZWQ2NCBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NCA9IHsgZ3Q6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBA8CAwUSBJYTBAsKDQoFBA8CAwESBJYTDA4KDQoFBA8CAwMSBJYTERIKDwoFBA8CAwgSBpYTE7UTBQoTCgkEDwIDCIgJAQASBpcTBpwTBwoSCgoEDwIDCIgJAQABEgSYEwgYChQKCgQPAgMIiAkBAAMSBpkTCJsTRQoTCgkEDwIDCIgJAQESBp0TBqITBwoSCgoEDwIDCIgJAQEBEgSeEwgbChQKCgQPAgMIiAkBAQMSBp8TCKETYAoTCgkEDwIDCIgJAQISBqMTBqgTBwoSCgoEDwIDCIgJAQIBEgSkEwglChQKCgQPAgMIiAkBAgMSBqUTCKcTXwoTCgkEDwIDCIgJAQMSBqkTBq4TBwoSCgoEDwIDCIgJAQMBEgSqEwgcChQKCgQPAgMIiAkBAwMSBqsTCK0TbQoTCgkEDwIDCIgJAQQSBq8TBrQTBwoSCgoEDwIDCIgJAQQBEgSwEwgmChQKCgQPAgMIiAkBBAMSBrETCLMTbArOBgoEBA8CBBIGyRME6BMGGr0GIGBndGVgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Rml4ZWQ2NCB7CiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgW2ZpeGVkNjQuZ3RlXQogICBmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NC5ndGUgPSA1XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgYW5kIGxlc3MgdGhhbiAxMCBbZml4ZWQ2NC5ndGVfbHRdCiAgIGZpeGVkNjQgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5maXhlZDY0ID0geyBndGU6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmVdCiAgIGZpeGVkNjQgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLmZpeGVkNjQgPSB7IGd0ZTogMTAsIGx0OiA1IH1dOwogfQogYGBgCgoNCgUEDwIEBRIEyRMECwoNCgUEDwIEARIEyRMMDwoNCgUEDwIEAxIEyRMSEwoPCgUEDwIECBIGyRMU6BMFChMKCQQPAgQIiAkBABIGyhMGzxMHChIKCgQPAgQIiAkBAAESBMsTCBkKFAoKBA8CBAiICQEAAxIGzBMIzhNSChMKCQQPAgQIiAkBARIG0BMG1RMHChIKCgQPAgQIiAkBAQESBNETCBwKFAoKBA8CBAiICQEBAxIG0hMI1BNtChMKCQQPAgQIiAkBAhIG1hMG2xMHChIKCgQPAgQIiAkBAgESBNcTCCYKFAoKBA8CBAiICQECAxIG2BMI2hNsChMKCQQPAgQIiAkBAxIG3BMG4RMHChIKCgQPAgQIiAkBAwESBN0TCB0KFAoKBA8CBAiICQEDAxIG3hMI4BN6ChMKCQQPAgQIiAkBBBIG4hMG5xMHChIKCgQPAgQIiAkBBAESBOMTCCcKFAoKBA8CBAiICQEEAxIG5BMI5hN5CsoCCgQEDwIFEgb1EwL4EwUauQIgYGluYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogSWYgdGhlIGZpZWxkIHZhbHVlIGlzbid0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSBpcwogZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Rml4ZWQ2NCB7CiAgIC8vIHZhbHVlIG11c3QgYmUgaW4gbGlzdCBbMSwgMiwgM10KICAgZml4ZWQ2NCB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmZpeGVkNjQgPSB7IGluOiBbMSwgMiwgM10gfV07CiB9CiBgYGAKCg0KBQQPAgUEEgT1EwIKCg0KBQQPAgUFEgT1EwsSCg0KBQQPAgUBEgT1ExMVCg0KBQQPAgUDEgT1ExgZCg8KBQQPAgUIEgb1Exr4EwQKEwoJBA8CBQiICQEAEgb1Exv4EwMKEgoKBA8CBQiICQEAARIE9hMEFAoSCgoEDwIFCIgJAQADEgT3EwR0CtcCCgQEDwIGEgaEFAKHFAUaxgIgYG5vdF9pbmAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIG5vdCBiZSBlcXVhbCB0byBhbnkgb2YgdGhlIHNwZWNpZmllZAogdmFsdWVzLiBJZiB0aGUgZmllbGQgdmFsdWUgaXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLCBhbiBlcnJvcgogbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlGaXhlZDY0IHsKICAgLy8gdmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCBbMSwgMiwgM10KICAgZml4ZWQ2NCB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmZpeGVkNjQgPSB7IG5vdF9pbjogWzEsIDIsIDNdIH1dOwogfQogYGBgCgoNCgUEDwIGBBIEhBQCCgoNCgUEDwIGBRIEhBQLEgoNCgUEDwIGARIEhBQTGQoNCgUEDwIGAxIEhBQcHQoPCgUEDwIGCBIGhBQehxQEChMKCQQPAgYIiAkBABIGhBQfhxQDChIKCgQPAgYIiAkBAAESBIUUBBgKEgoKBA8CBgiICQEAAxIEhhQEYwqKAwoEBA8CBxIGlRQCmBQFGvkCIGBleGFtcGxlYCBzcGVjaWZpZXMgdmFsdWVzIHRoYXQgdGhlIGZpZWxkIG1heSBoYXZlLiBUaGVzZSB2YWx1ZXMgU0hPVUxECiBjb25mb3JtIHRvIG90aGVyIHJ1bGVzLiBgZXhhbXBsZWAgdmFsdWVzIHdpbGwgbm90IGltcGFjdCB2YWxpZGF0aW9uCiBidXQgbWF5IGJlIHVzZWQgYXMgaGVscGZ1bCBndWlkYW5jZSBvbiBob3cgdG8gcG9wdWxhdGUgdGhlIGdpdmVuIGZpZWxkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Rml4ZWQ2NCB7CiAgIGZpeGVkNjQgdmFsdWUgPSAxIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5maXhlZDY0LmV4YW1wbGUgPSAxLAogICAgIChidWYudmFsaWRhdGUuZmllbGQpLmZpeGVkNjQuZXhhbXBsZSA9IDIKICAgXTsKIH0KIGBgYAoKDQoFBA8CBwQSBJUUAgoKDQoFBA8CBwUSBJUUCxIKDQoFBA8CBwESBJUUExoKDQoFBA8CBwMSBJUUHR4KDwoFBA8CBwgSBpUUH5gUBAoTCgkEDwIHCIgJAQASBpUUIJgUAwoSCgoEDwIHCIgJAQABEgSWFAQZChIKCgQPAgcIiAkBAAMSBJcUBBYKuAEKAwQPBRIEnRQCGRqqASBFeHRlbnNpb24gZmllbGRzIHRoYXQgaGF2ZSB0aGUgKGJ1Zi52YWxpZGF0ZS5wcmVkZWZpbmVkKSBvcHRpb24gc2V0CiB3aWxsIGJlIHRyZWF0ZWQgYXMgcHJlZGVmaW5lZCBmaWVsZCBydWxlcy4KIFNlZSBodHRwczovL3Byb3RvdmFsaWRhdGUuY29tL3NjaGVtYXMvcHJlZGVmaW5lZC1ydWxlcy8KCgwKBAQPBQASBJ0UDRgKDQoFBA8FAAESBJ0UDREKDQoFBA8FAAISBJ0UFRgKTgoCBBASBqEUAO0VARpAIFNGaXhlZDMyUnVsZXMgZGVzY3JpYmVzIHRoZSBydWxlcyBhcHBsaWVkIHRvIGBmaXhlZDMyYCB2YWx1ZXMuCgoLCgMEEAESBKEUCBUKoAIKBAQQAgASBqsUAq4UBRqPAiBgY29uc3RgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBleGFjdGx5IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUuIElmCiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtYXRjaCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTRml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3QgZXF1YWwgNDIKICAgc2ZpeGVkMzIgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQzMi5jb25zdCA9IDQyXTsKIH0KIGBgYAoKDQoFBBACAAQSBKsUAgoKDQoFBBACAAUSBKsUCxMKDQoFBBACAAESBKsUFBkKDQoFBBACAAMSBKsUHB0KDwoFBBACAAgSBqsUHq4UBAoTCgkEEAIACIgJAQASBqsUH64UAwoSCgoEEAIACIgJAQABEgSsFAQYChIKCgQQAgAIiAkBAAMSBK0UBHIKDgoEBBAIABIGrxQC0RQDCg0KBQQQCAABEgSvFAgRCtMCCgQEEAIBEga6FAS/FAcawgIgYGx0YCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGZpZWxkIDwKIHZhbHVlKS4gSWYgdGhlIGZpZWxkIHZhbHVlIGlzIGVxdWFsIHRvIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTRml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIDEwCiAgIHNmaXhlZDMyIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkMzIubHQgPSAxMF07CiB9CiBgYGAKCg0KBQQQAgEFEgS6FAQMCg0KBQQQAgEBEgS6FA0PCg0KBQQQAgEDEgS6FBITCg8KBQQQAgEIEga6FBS/FAYKEwoJBBACAQiICQEAEga6FBW/FAUKEgoKBBACAQiICQEAARIEuxQGFwoUCgoEEAIBCIgJAQADEga8FAa+FEAK4gIKBAQQAgISBssUBNAUBxrRAiBgbHRlYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChmaWVsZCA8PSB2YWx1ZSkuIElmIHRoZSBmaWVsZCB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZAogdmFsdWUsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkMzIgewogICAvLyB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxMAogICBzZml4ZWQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDMyLmx0ZSA9IDEwXTsKIH0KIGBgYAoKDQoFBBACAgUSBMsUBAwKDQoFBBACAgESBMsUDRAKDQoFBBACAgMSBMsUExQKDwoFBBACAggSBssUFdAUBgoTCgkEEAICCIgJAQASBssUFtAUBQoSCgoEEAICCIgJAQABEgTMFAYYChQKCgQQAgIIiAkBAAMSBs0UBs8UTQoOCgQEEAgBEgbSFAK4FQMKDQoFBBAIAQESBNIUCBQKoAYKBAQQAgMSBuUUBIQVBhqPBiBgZ3RgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZQogKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RgIGlzIGxhcmdlciB0aGFuIGEgc3BlY2lmaWVkIGBsdGAgb3IKIGBsdGVgLCB0aGUgcmFuZ2UgaXMgcmV2ZXJzZWQsIGFuZCB0aGUgZmllbGQgdmFsdWUgbXVzdCBiZSBvdXRzaWRlIHRoZQogc3BlY2lmaWVkIHJhbmdlLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTRml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDUgW3NmaXhlZDMyLmd0XQogICBzZml4ZWQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDMyLmd0ID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1IGFuZCBsZXNzIHRoYW4gMTAgW3NmaXhlZDMyLmd0X2x0XQogICBzZml4ZWQzMiBvdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDMyID0geyBndDogNSwgbHQ6IDEwIH1dOwoKICAgLy8gdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMTAgb3IgbGVzcyB0aGFuIDUgW3NmaXhlZDMyLmd0X2x0X2V4Y2x1c2l2ZV0KICAgc2ZpeGVkMzIgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDMyID0geyBndDogMTAsIGx0OiA1IH1dOwogfQogYGBgCgoNCgUEEAIDBRIE5RQEDAoNCgUEEAIDARIE5RQNDwoNCgUEEAIDAxIE5RQSEwoPCgUEEAIDCBIG5RQUhBUFChMKCQQQAgMIiAkBABIG5hQG6xQHChIKCgQQAgMIiAkBAAESBOcUCBkKFAoKBBACAwiICQEAAxIG6BQI6hRFChMKCQQQAgMIiAkBARIG7BQG8RQHChIKCgQQAgMIiAkBAQESBO0UCBwKFAoKBBACAwiICQEBAxIG7hQI8BRgChMKCQQQAgMIiAkBAhIG8hQG9xQHChIKCgQQAgMIiAkBAgESBPMUCCYKFAoKBBACAwiICQECAxIG9BQI9hRfChMKCQQQAgMIiAkBAxIG+BQG/RQHChIKCgQQAgMIiAkBAwESBPkUCB0KFAoKBBACAwiICQEDAxIG+hQI/BRtChMKCQQQAgMIiAkBBBIG/hQGgxUHChIKCgQQAgMIiAkBBAESBP8UCCcKFAoKBBACAwiICQEEAxIGgBUIghVsCtgGCgQEEAIEEgaYFQS3FQYaxwYgYGd0ZWAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGVgIGlzIGxhcmdlciB0aGFuIGEgc3BlY2lmaWVkIGBsdGAKIG9yIGBsdGVgLCB0aGUgcmFuZ2UgaXMgcmV2ZXJzZWQsIGFuZCB0aGUgZmllbGQgdmFsdWUgbXVzdCBiZSBvdXRzaWRlIHRoZQogc3BlY2lmaWVkIHJhbmdlLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTRml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgW3NmaXhlZDMyLmd0ZV0KICAgc2ZpeGVkMzIgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQzMi5ndGUgPSA1XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgYW5kIGxlc3MgdGhhbiAxMCBbc2ZpeGVkMzIuZ3RlX2x0XQogICBzZml4ZWQzMiBvdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDMyID0geyBndGU6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwIG9yIGxlc3MgdGhhbiA1IFtzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlXQogICBzZml4ZWQzMiBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkMzIgPSB7IGd0ZTogMTAsIGx0OiA1IH1dOwogfQogYGBgCgoNCgUEEAIEBRIEmBUEDAoNCgUEEAIEARIEmBUNEAoNCgUEEAIEAxIEmBUTFAoPCgUEEAIECBIGmBUVtxUFChMKCQQQAgQIiAkBABIGmRUGnhUHChIKCgQQAgQIiAkBAAESBJoVCBoKFAoKBBACBAiICQEAAxIGmxUInRVSChMKCQQQAgQIiAkBARIGnxUGpBUHChIKCgQQAgQIiAkBAQESBKAVCB0KFAoKBBACBAiICQEBAxIGoRUIoxVtChMKCQQQAgQIiAkBAhIGpRUGqhUHChIKCgQQAgQIiAkBAgESBKYVCCcKFAoKBBACBAiICQECAxIGpxUIqRVsChMKCQQQAgQIiAkBAxIGqxUGsBUHChIKCgQQAgQIiAkBAwESBKwVCB4KFAoKBBACBAiICQEDAxIGrRUIrxV6ChMKCQQQAgQIiAkBBBIGsRUGthUHChIKCgQQAgQIiAkBBAESBLIVCCgKFAoKBBACBAiICQEEAxIGsxUItRV5Cs0CCgQEEAIFEgbEFQLHFQUavAIgYGluYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gYmUgZXF1YWwgdG8gb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogSWYgdGhlIGZpZWxkIHZhbHVlIGlzbid0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSBpcwogZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkMzIgewogICAvLyB2YWx1ZSBtdXN0IGJlIGluIGxpc3QgWzEsIDIsIDNdCiAgIHNmaXhlZDMyIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkMzIgPSB7IGluOiBbMSwgMiwgM10gfV07CiB9CiBgYGAKCg0KBQQQAgUEEgTEFQIKCg0KBQQQAgUFEgTEFQsTCg0KBQQQAgUBEgTEFRQWCg0KBQQQAgUDEgTEFRkaCg8KBQQQAgUIEgbEFRvHFQQKEwoJBBACBQiICQEAEgbEFRzHFQMKEgoKBBACBQiICQEAARIExRUEFQoSCgoEEAIFCIgJAQADEgTGFQR0CtoCCgQEEAIGEgbTFQLWFQUayQIgYG5vdF9pbmAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIG5vdCBiZSBlcXVhbCB0byBhbnkgb2YgdGhlIHNwZWNpZmllZAogdmFsdWVzLiBJZiB0aGUgZmllbGQgdmFsdWUgaXMgb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLCBhbiBlcnJvcgogbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTRml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgWzEsIDIsIDNdCiAgIHNmaXhlZDMyIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkMzIgPSB7IG5vdF9pbjogWzEsIDIsIDNdIH1dOwogfQogYGBgCgoNCgUEEAIGBBIE0xUCCgoNCgUEEAIGBRIE0xULEwoNCgUEEAIGARIE0xUUGgoNCgUEEAIGAxIE0xUdHgoPCgUEEAIGCBIG0xUf1hUEChMKCQQQAgYIiAkBABIG0xUg1hUDChIKCgQQAgYIiAkBAAESBNQVBBkKEgoKBBACBgiICQEAAxIE1RUEYwqOAwoEBBACBxIG5BUC5xUFGv0CIGBleGFtcGxlYCBzcGVjaWZpZXMgdmFsdWVzIHRoYXQgdGhlIGZpZWxkIG1heSBoYXZlLiBUaGVzZSB2YWx1ZXMgU0hPVUxECiBjb25mb3JtIHRvIG90aGVyIHJ1bGVzLiBgZXhhbXBsZWAgdmFsdWVzIHdpbGwgbm90IGltcGFjdCB2YWxpZGF0aW9uCiBidXQgbWF5IGJlIHVzZWQgYXMgaGVscGZ1bCBndWlkYW5jZSBvbiBob3cgdG8gcG9wdWxhdGUgdGhlIGdpdmVuIGZpZWxkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkMzIgewogICBzZml4ZWQzMiB2YWx1ZSA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDMyLmV4YW1wbGUgPSAxLAogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDMyLmV4YW1wbGUgPSAyCiAgIF07CiB9CiBgYGAKCg0KBQQQAgcEEgTkFQIKCg0KBQQQAgcFEgTkFQsTCg0KBQQQAgcBEgTkFRQbCg0KBQQQAgcDEgTkFR4fCg8KBQQQAgcIEgbkFSDnFQQKEwoJBBACBwiICQEAEgbkFSHnFQMKEgoKBBACBwiICQEAARIE5RUEGgoSCgoEEAIHCIgJAQADEgTmFQQWCrgBCgMEEAUSBOwVAhkaqgEgRXh0ZW5zaW9uIGZpZWxkcyB0aGF0IGhhdmUgdGhlIChidWYudmFsaWRhdGUucHJlZGVmaW5lZCkgb3B0aW9uIHNldAogd2lsbCBiZSB0cmVhdGVkIGFzIHByZWRlZmluZWQgZmllbGQgcnVsZXMuCiBTZWUgaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9zY2hlbWFzL3ByZWRlZmluZWQtcnVsZXMvCgoMCgQEEAUAEgTsFQ0YCg0KBQQQBQABEgTsFQ0RCg0KBQQQBQACEgTsFRUYCk4KAgQREgbwFQC8FwEaQCBTRml4ZWQ2NFJ1bGVzIGRlc2NyaWJlcyB0aGUgcnVsZXMgYXBwbGllZCB0byBgZml4ZWQ2NGAgdmFsdWVzLgoKCwoDBBEBEgTwFQgVCqACCgQEEQIAEgb6FQL9FQUajwIgYGNvbnN0YCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gZXhhY3RseSBtYXRjaCB0aGUgc3BlY2lmaWVkIHZhbHVlLiBJZgogdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWF0Y2gsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGVxdWFsIDQyCiAgIHNmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkNjQuY29uc3QgPSA0Ml07CiB9CiBgYGAKCg0KBQQRAgAEEgT6FQIKCg0KBQQRAgAFEgT6FQsTCg0KBQQRAgABEgT6FRQZCg0KBQQRAgADEgT6FRwdCg8KBQQRAgAIEgb6FR79FQQKEwoJBBECAAiICQEAEgb6FR/9FQMKEgoKBBECAAiICQEAARIE+xUEGAoSCgoEEQIACIgJAQADEgT8FQRyCg4KBAQRCAASBv4VAqAWAwoNCgUEEQgAARIE/hUIEQrTAgoEBBECARIGiRYEjhYHGsICIGBsdGAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGxlc3MgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlIChmaWVsZCA8CiB2YWx1ZSkuIElmIHRoZSBmaWVsZCB2YWx1ZSBpcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAxMAogICBzZml4ZWQ2NCB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDY0Lmx0ID0gMTBdOwogfQogYGBgCgoNCgUEEQIBBRIEiRYEDAoNCgUEEQIBARIEiRYNDwoNCgUEEQIBAxIEiRYSEwoPCgUEEQIBCBIGiRYUjhYGChMKCQQRAgEIiAkBABIGiRYVjhYFChIKCgQRAgEIiAkBAAESBIoWBhcKFAoKBBECAQiICQEAAxIGixYGjRZACuICCgQEEQICEgaaFgSfFgca0QIgYGx0ZWAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSAoZmllbGQgPD0gdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVNGaXhlZDY0IHsKICAgLy8gdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMTAKICAgc2ZpeGVkNjQgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQ2NC5sdGUgPSAxMF07CiB9CiBgYGAKCg0KBQQRAgIFEgSaFgQMCg0KBQQRAgIBEgSaFg0QCg0KBQQRAgIDEgSaFhMUCg8KBQQRAgIIEgaaFhWfFgYKEwoJBBECAgiICQEAEgaaFhafFgUKEgoKBBECAgiICQEAARIEmxYGGAoUCgoEEQICCIgJAQADEgacFgaeFk0KDgoEBBEIARIGoRYChxcDCg0KBQQRCAEBEgShFggUCqAGCgQEEQIDEga0FgTTFgYajwYgYGd0YCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUKIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgIG9yCiBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1IFtzZml4ZWQ2NC5ndF0KICAgc2ZpeGVkNjQgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQ2NC5ndCA9IDVdOwoKICAgLy8gdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gNSBhbmQgbGVzcyB0aGFuIDEwIFtzZml4ZWQ2NC5ndF9sdF0KICAgc2ZpeGVkNjQgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQ2NCA9IHsgZ3Q6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEwIG9yIGxlc3MgdGhhbiA1IFtzZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmVdCiAgIHNmaXhlZDY0IGFub3RoZXJfdmFsdWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQ2NCA9IHsgZ3Q6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBBECAwUSBLQWBAwKDQoFBBECAwESBLQWDQ8KDQoFBBECAwMSBLQWEhMKDwoFBBECAwgSBrQWFNMWBQoTCgkEEQIDCIgJAQASBrUWBroWBwoSCgoEEQIDCIgJAQABEgS2FggZChQKCgQRAgMIiAkBAAMSBrcWCLkWRQoTCgkEEQIDCIgJAQESBrsWBsAWBwoSCgoEEQIDCIgJAQEBEgS8FggcChQKCgQRAgMIiAkBAQMSBr0WCL8WYAoTCgkEEQIDCIgJAQISBsEWBsYWBwoSCgoEEQIDCIgJAQIBEgTCFggmChQKCgQRAgMIiAkBAgMSBsMWCMUWXwoTCgkEEQIDCIgJAQMSBscWBswWBwoSCgoEEQIDCIgJAQMBEgTIFggdChQKCgQRAgMIiAkBAwMSBskWCMsWbQoTCgkEEQIDCIgJAQQSBs0WBtIWBwoSCgoEEQIDCIgJAQQBEgTOFggnChQKCgQRAgMIiAkBBAMSBs8WCNEWbArYBgoEBBECBBIG5xYEhhcGGscGIGBndGVgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IFtzZml4ZWQ2NC5ndGVdCiAgIHNmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkNjQuZ3RlID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IGFuZCBsZXNzIHRoYW4gMTAgW3NmaXhlZDY0Lmd0ZV9sdF0KICAgc2ZpeGVkNjQgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQ2NCA9IHsgZ3RlOiA1LCBsdDogMTAgfV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCBvciBsZXNzIHRoYW4gNSBbc2ZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZV0KICAgc2ZpeGVkNjQgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDY0ID0geyBndGU6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBBECBAUSBOcWBAwKDQoFBBECBAESBOcWDRAKDQoFBBECBAMSBOcWExQKDwoFBBECBAgSBucWFYYXBQoTCgkEEQIE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ZWxkIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHNwZWNpZmllZAogcmVndWxhciBleHByZXNzaW9uIChSRTIgc3ludGF4KSwgd2l0aCB0aGUgZXhwcmVzc2lvbiBwcm92aWRlZCB3aXRob3V0IGFueQogZGVsaW1pdGVycy4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYW4KIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIGBeW2EtekEtWl0vLyRgCiAgIHN0cmluZyB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5wYXR0ZXJuID0gIl5bYS16QS1aXS8vJCJdOwogfQogYGBgCgoNCgUEEwIHBBIE4BgCCgoNCgUEEwIHBRIE4BgLEQoNCgUEEwIHARIE4BgSGQoNCgUEEwIHAxIE4BgcHQoPCgUEEwIHCBIG4Bge4xgEChMKCQQTAgcIiAkBABIG4Bgf4xgDChIKCgQTAgcIiAkBAAESBOEYBBgKEgoKBBMCBwiICQEAAxIE4hgEdwruAgoEBBMCCBIG8BgC8xgFGt0CIGBwcmVmaXhgIHNwZWNpZmllcyB0aGF0IHRoZSBmaWVsZCB2YWx1ZSBtdXN0IGhhdmUgdGhlCnNwZWNpZmllZCBzdWJzdHJpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLiBJZiB0aGUgZmllbGQgdmFsdWUKIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlCiBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCBgcHJlYAogICBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcucHJlZml4ID0gInByZSJdOwogfQogYGBgCgoNCgUE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AAESBLsZBBcKEgoKBBMCDQiICQEAAxIEvBkEYwpbCgQEEwgAEgbBGQK9HQMaSyBgV2VsbEtub3duYCBydWxlcyBwcm92aWRlIGFkdmFuY2VkIHJ1bGVzIGFnYWluc3QgY29tbW9uIHN0cmluZwogcGF0dGVybnMuCgoNCgUEEwgAARIEwRkIEgrJBQoEBBMCDhIG0hkE3RkGGrgFIGBlbWFpbGAgc3BlY2lmaWVzIHRoYXQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBmb3IKIGV4YW1wbGUgImZvb0BleGFtcGxlLmNvbSIuCgogQ29uZm9ybXMgdG8gdGhlIGRlZmluaXRpb24gZm9yIGEgdmFsaWQgZW1haWwgYWRkcmVzcyBmcm9tIHRoZSBbSFRNTCBzdGFuZGFyZF0oaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5wdXQuaHRtbCN2YWxpZC1lLW1haWwtYWRkcmVzcykuCiBOb3RlIHRoYXQgdGhpcyBzdGFuZGFyZCB3aWxsZnVsbHkgZGV2aWF0ZXMgZnJvbSBbUkZDIDUzMjJdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNTMyMiksCiB3aGljaCBhbGxvd3MgbWFueSB1bmV4cGVjdGVkIGZvcm1zIG9mIGVtYWlsIGFkZHJlc3NlcyBhbmQgd2lsbCBlYXNpbHkgbWF0Y2gKIGEgdHlwb2dyYXBoaWNhbCBlcnJvci4KCiBJZiB0aGUgZmllbGQgdmFsdWUgaXNuJ3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U3RyaW5nIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MKICAgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmVtYWlsID0gdHJ1ZV07CiB9CiBgYGAKCg0KBQQTAg4FEgTSGQQICg0KBQQTAg4BEgTSGQkOCg0KBQQTAg4DEgTSGRETCg8K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AxIEjh0ILwryBwoEBBMCIBIGph0EvB0GGuEHIGB3ZWxsX2tub3duX3JlZ2V4YCBzcGVjaWZpZXMgYSBjb21tb24gd2VsbC1rbm93biBwYXR0ZXJuCiBkZWZpbmVkIGFzIGEgcmVnZXguIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1hdGNoIHRoZSB3ZWxsLWtub3duCiByZWdleCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVN0cmluZyB7CiAgIC8vIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciB2YWx1ZQogICBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcud2VsbF9rbm93bl9yZWdleCA9IEtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFXTsKIH0KIGBgYAoKICMjIyMgS25vd25SZWdleAoKIGB3ZWxsX2tub3duX3JlZ2V4YCBjb250YWlucyBzb21lIHdlbGwta25vd24gcGF0dGVybnMuCgogfCBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICB8IE51bWJlciB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiB8IEtOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEICAgICAgIHwgMCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogfCBLTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9OQU1FICB8IDEgICAgICB8IEhUVFAgaGVhZGVyIG5hbWUgYXMgZGVmaW5lZCBieSBbUkZDIDcyMzBdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMikgIHwKIHwgS05PV05fUkVHRVhfSFRUUF9IRUFERVJfVkFMVUUgfCAyICAgICAgfCBIVFRQIGhlYWRlciB2YWx1ZSBhcyBkZWZpbmVkIGJ5IFtSRkMgNzIzMF0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4yLjQpIHwKCg0KBQQTAiAGEgSmHQQOCg0KBQQTAiABEgSmHQ8fCg0KBQQTAiADEgSmHSIkCg8KBQQTAiAIEgamHSW8HQUKEwoJBBMCIAiICQEAEganHQauHQcKEgoKBBMCIAiICQEAARIEqB0IMQoSCgoEEwIgCIgJAQACEgSpHQg5ChQKCgQTAiAIiAkBAAMSBqodCK0dKgoTCgkEEwIgCIgJAQESBq8dBrMdBwoSCgoEEwIgCIgJAQEBEgSwHQg3ChIKCgQTAiAIiAkBAQISBLEdCEgKEgoKBBMCIAiICQEBAxIEsh0IPwoTCgkEEwIgCIgJAQISBrQdBrsdBwoSCgoEEwIgCIgJAQIBEgS1HQgyChIKCgQTAiAIiAkBAgISBLYdCDoKFAoKBBMCIAiICQECAxIGtx0Iuh0qCtIECgQEEwIhEgTLHQIcGsMEIFRoaXMgYXBwbGllcyB0byByZWdleGVzIGBIVFRQX0hFQURFUl9OQU1FYCBhbmQgYEhUVFBfSEVBREVSX1ZBTFVFYCB0bwogZW5hYmxlIHN0cmljdCBoZWFkZXIgdmFsaWRhdGlvbi4gQnkgZGVmYXVsdCwgdGhpcyBpcyB0cnVlLCBhbmQgSFRUUCBoZWFkZXIKIHZhbGlkYXRpb25zIGFyZSBbUkZDLWNvbXBsaWFudF0oaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMykuIFNldHRpbmcgdG8gZmFsc2Ugd2lsbCBlbmFibGUgbG9vc2VyCiB2YWxpZGF0aW9ucyB0aGF0IG9ubHkgZGlzYWxsb3cgYFxyXG5cMGAgY2hhcmFjdGVycywgd2hpY2ggY2FuIGJlIHVzZWQgdG8KIGJ5cGFzcyBoZWFkZXIgbWF0Y2hpbmcgcnVsZXMuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyBUaGUgZmllbGQgYHZhbHVlYCBtdXN0IGhhdmUgYmUgYSB2YWxpZCBIVFRQIGhlYWRlcnMsIGJ1dCBub3QgZW5mb3JjZWQgd2l0aCBzdHJpY3QgcnVsZXMuCiAgIHN0cmluZyB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5zdHJpY3QgPSBmYWxzZV07CiB9CiBgYGAKCg0KBQQTAiEEEgTLHQIKCg0KBQQTAiEFEgTLHQsPCg0KBQQTAiEBEgTLHRAWCg0KBQQTAiEDEgTLHRkbCpIDCgQEEwIiEgbZHQLcHQUagQMgYGV4YW1wbGVgIHNwZWNpZmllcyB2YWx1ZXMgdGhhdCB0aGUgZmllbGQgbWF5IGhhdmUuIFRoZXNlIHZhbHVlcyBTSE9VTEQKIGNvbmZvcm0gdG8gb3RoZXIgcnVsZXMuIGBleGFtcGxlYCB2YWx1ZXMgd2lsbCBub3QgaW1wYWN0IHZhbGlkYXRpb24KIGJ1dCBtYXkgYmUgdXNlZCBhcyBoZWxwZnVsIGd1aWRhbmNlIG9uIGhvdyB0byBwb3B1bGF0ZSB0aGUgZ2l2ZW4gZmllbGQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICBzdHJpbmcgdmFsdWUgPSAxIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcuZXhhbXBsZSA9ICJoZWxsbyIsCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmV4YW1wbGUgPSAid29ybGQiCiAgIF07CiB9CiBgYGAKCg0KBQQTAiIEEgTZHQIKCg0KBQQTAiIFEgTZHQsRCg0KBQQTAiIBEgTZHRIZCg0KBQQTAiIDEgTZHRweCg8KBQQTAiIIEgbZHR/cHQQKEwoJBBMCIgiICQEAEgbZHSDcHQMKEgoKBBMCIgiICQEAARIE2h0EGAoSCgoEEwIiCIgJAQADEgTbHQQWCrgBCgMEEwUSBOEdAhkaqgEgRXh0ZW5zaW9uIGZpZWxkcyB0aGF0IGhhdmUgdGhlIChidWYudmFsaWRhdGUucHJlZGVmaW5lZCkgb3B0aW9uIHNldAogd2lsbCBiZSB0cmVhdGVkIGFzIHByZWRlZmluZWQgZmllbGQgcnVsZXMuCiBTZWUgaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9zY2hlbWFzL3ByZWRlZmluZWQtcnVsZXMvCgoMCgQEEwUAEgThHQ0YCg0KBQQTBQABEgThHQ0RCg0KBQQTBQACEgThHRUYCj0KAgUBEgblHQDtHQEaLyBLbm93blJlZ2V4IGNvbnRhaW5zIHNvbWUgd2VsbC1rbm93biBwYXR0ZXJucy4KCgsKAwUBARIE5R0FDwoMCgQFAQIAEgTmHQIeCg0KBQUBAgABEgTmHQIZCg0KBQUBAgACEgTmHRwdCnUKBAUBAgESBOkdAiMaZyBIVFRQIGhlYWRlciBuYW1lIGFzIGRlZmluZWQgYnkgW1JGQyA3MjMwXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjIpLgoKDQoFBQECAQESBOkdAh4KDQoFBQECAQISBOkdISIKeAoEBQECAhIE7B0CJBpqIEhUVFAgaGVhZGVyIHZhbHVlIGFzIGRlZmluZWQgYnkgW1JGQyA3MjMwXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzcyMzAjc2VjdGlvbi0zLjIuNCkuCgoNCgUFAQICARIE7B0CHwoNCgUFAQICAhIE7B0iIwqfAQoCBBQSBvEdAPwfARqQASBCeXRlc1J1bGVzIGRlc2NyaWJlIHRoZSBydWxlcyBhcHBsaWVkIHRvIGBieXRlc2AgdmFsdWVzLiBUaGVzZSBydWxlcwogbWF5IGFsc28gYmUgYXBwbGllZCB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlYCBXZWxsLUtub3duLVR5cGUuCgoLCgMEFAESBPEdCBIKugIKBAQUAgASBvsdAv4dBRqpAiBgY29uc3RgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBleGFjdGx5IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnl0ZXMKIHZhbHVlLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtYXRjaCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlCeXRlcyB7CiAgIC8vIHZhbHVlIG11c3QgYmUgIlx4MDFceDAyXHgwM1x4MDQiCiAgIGJ5dGVzIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYnl0ZXMuY29uc3QgPSAiXHgwMVx4MDJceDAzXHgwNCJdOwogfQogYGBgCgoNCgUEFAIABBIE+x0CCgoNCgUEFAIABRIE+x0LEAoNCgUEFAIAARIE+x0RFgoNCgUEFAIAAxIE+x0ZGgoPCgUEFAIACBIG+x0b/h0EChMKCQQUAgAIiAkBABIG+x0c/h0DChIKCgQUAgAIiAkBAAESBPwdBBUKEgoKBBQCAAiICQEAAxIE/R0EbwqmAgoEBBQCARIGiR4CjB4FGpUCIGBsZW5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBoYXZlIHRoZSBzcGVjaWZpZWQgbGVuZ3RoIGluIGJ5dGVzLgogSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWF0Y2gsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Qnl0ZXMgewogICAvLyB2YWx1ZSBsZW5ndGggbXVzdCBiZSA0IGJ5dGVzLgogICBvcHRpb25hbCBieXRlcyB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmJ5dGVzLmxlbiA9IDRdOwogfQogYGBgCgoNCgUEFAIBBBIEiR4CCgoNCgUEFAIBBRIEiR4LEQoNCgUEFAIBARIEiR4SFQoNCgUEFAIBAxIEiR4YGgoPCgUEFAIBCBIGiR4bjB4EChMKCQQUAgEIiAkBABIGiR4cjB4DChIKCgQUAgEIiAkBAAESBIoeBBMKEgoKBBQCAQiICQEAAxIEix4EawrYAgoEBBQCAhIGmB4Cmx4FGscCIGBtaW5fbGVuYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gaGF2ZSBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIG1pbmltdW0KIGxlbmd0aCBpbiBieXRlcy4KIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVtZW50LCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUJ5dGVzIHsKICAgLy8gdmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgMiBieXRlcy4KICAgb3B0aW9uYWwgYnl0ZXMgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5ieXRlcy5taW5fbGVuID0gMl07CiB9CiBgYGAKCg0KBQQUAgIEEgSYHgIKCg0KBQQUAgIFEgSYHgsRCg0KBQQUAgIBEgSYHhIZCg0KBQQUAgIDEgSYHhwdCg8KBQQUAgIIEgaYHh6bHgQKEwoJBBQCAgiICQEAEgaYHh+bHgMKEgoKBBQCAgiICQEAARIEmR4EFwoSCgoEFAICCIgJAQADEgSaHgR7CsoCCgQEFAIDEganHgKqHgUauQIgYG1heF9sZW5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBoYXZlIGF0IG1vc3QgdGhlIHNwZWNpZmllZCBtYXhpbXVtCiBsZW5ndGggaW4gYnl0ZXMuCiBJZiB0aGUgZmllbGQgdmFsdWUgZXhjZWVkcyB0aGUgcmVxdWlyZW1lbnQsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Qnl0ZXMgewogICAvLyB2YWx1ZSBtdXN0IGJlIGF0IG1vc3QgNiBieXRlcy4KICAgb3B0aW9uYWwgYnl0ZXMgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5ieXRlcy5tYXhfbGVuID0gNl07CiB9CiBgYGAKCg0KBQQUAgMEEgSnHgIKCg0KBQQUAgMFEgSnHgsRCg0KBQQUAgMBEgSnHhIZCg0KBQQUAgMDEgSnHhwdCg8KBQQUAgMIEganHh6qHgQKEwoJBBQCAwiICQEAEganHh+qHgMKEgoKBBQCAwiICQEAARIEqB4EFwoSCgoEFAIDCIgJAQADEgSpHgRzCvYDCgQEFAIEEga4HgK7HgUa5QMgYHBhdHRlcm5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBtYXRjaCB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIKIGV4cHJlc3Npb24gKFtSRTIgc3ludGF4XShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3JlMi93aWtpL1N5bnRheCkpLgogVGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBtdXN0IGJlIHZhbGlkIFVURi04IG9yIHZhbGlkYXRpb24gd2lsbCBmYWlsIHdpdGggYQogcnVudGltZSBlcnJvci4KIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1hdGNoIHRoZSBwYXR0ZXJuLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUJ5dGVzIHsKICAgLy8gdmFsdWUgbXVzdCBtYXRjaCByZWdleCBwYXR0ZXJuICJeW2EtekEtWjAtOV0rJCIuCiAgIG9wdGlvbmFsIGJ5dGVzIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYnl0ZXMucGF0dGVybiA9ICJeW2EtekEtWjAtOV0rJCJdOwogfQogYGBgCgoNCgUEFAIEBBIEuB4CCgoNCgUEFAIEBRIEuB4LEQoNCgUEFAIEARIEuB4SGQoNCgUEFAIEAxIEuB4cHQoPCgUEFAIECBIGuB4eux4EChMKCQQUAgQIiAkBABIGuB4fux4DChIKCgQUAgQIiAkBAAESBLkeBBcKEgoKBBQCBAiICQEAAxIEuh4EewrgAgoEBBQCBRIGxx4Cyh4FGs8CIGBwcmVmaXhgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBoYXZlIHRoZSBzcGVjaWZpZWQgYnl0ZXMgYXQgdGhlCiBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZy4KIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVtZW50LCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUJ5dGVzIHsKICAgLy8gdmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggXHgwMVx4MDIKICAgb3B0aW9uYWwgYnl0ZXMgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5ieXRlcy5wcmVmaXggPSAiXHgwMVx4MDIiXTsKIH0KIGBgYAoKDQoFBBQCBQQSBMceAgoKDQoFBBQCBQUSBMceCxAKDQoFBBQCBQESBMceERcKDQoFBBQCBQMSBMceGhsKDwoFBBQCBQgSBsceHMoeBAoTCgkEFAIFCIgJAQASBsceHcoeAwoSCgoEFAIFCIgJAQABEgTIHgQWChIKCgQUAgUIiAkBAAMSBMkeBG4K2gIKBAQUAgYSBtYeAtkeBRrJAiBgc3VmZml4YCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gaGF2ZSB0aGUgc3BlY2lmaWVkIGJ5dGVzIGF0IHRoZSBlbmQKIG9mIHRoZSBzdHJpbmcuCiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlbWVudCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlCeXRlcyB7CiAgIC8vIHZhbHVlIGRvZXMgbm90IGhhdmUgc3VmZml4IFx4MDNceDA0CiAgIG9wdGlvbmFsIGJ5dGVzIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYnl0ZXMuc3VmZml4ID0gIlx4MDNceDA0Il07CiB9CiBgYGAKCg0KBQQUAgYEEgTWHgIKCg0KBQQUAgYFEgTWHgsQCg0KBQQUAgYBEgTWHhEXCg0KBQQUAgYDEgTWHhobCg8KBQQUAgYIEgbWHhzZHgQKEwoJBBQCBgiICQEAEgbWHh3ZHgMKEgoKBBQCBgiICQEAARIE1x4EFgoSCgoEFAIGCIgJAQADEgTYHgRsCtgCCgQEFAIHEgblHgLoHgUaxwIgYGNvbnRhaW5zYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gaGF2ZSB0aGUgc3BlY2lmaWVkIGJ5dGVzIGFueXdoZXJlIGluCiB0aGUgc3RyaW5nLgogSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZW1lbnQsIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Qnl0ZXMgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBjb250YWluIFx4MDJceDAzCiAgIG9wdGlvbmFsIGJ5dGVzIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYnl0ZXMuY29udGFpbnMgPSAiXHgwMlx4MDMiXTsKIH0KIGBgYAoKDQoFBBQCBwQSBOUeAgoKDQoFBBQCBwUSBOUeCxAKDQoFBBQCBwESBOUeERkKDQoFBBQCBwMSBOUeHB0KDwoFBBQCBwgSBuUeHugeBAoTCgkEFAIHCIgJAQASBuUeH+geAwoSCgoEFAIHCIgJAQABEgTmHgQYChIKCgQUAgcIiAkBAAMSBOceBGwK/gIKBAQUAggSBvQeAvceBRrtAiBgaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBlcXVhbCB0byBvbmUgb2YgdGhlIHNwZWNpZmllZAogdmFsdWVzLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtYXRjaCBhbnkgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZXMsIGFuCiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUJ5dGVzIHsKICAgLy8gdmFsdWUgbXVzdCBpbiBbIlx4MDFceDAyIiwgIlx4MDJceDAzIiwgIlx4MDNceDA0Il0KICAgb3B0aW9uYWwgYnl0ZXMgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5ieXRlcy5pbiA9IHsiXHgwMVx4MDIiLCAiXHgwMlx4MDMiLCAiXHgwM1x4MDQifV07CiB9CiBgYGAKCg0KBQQUAggEEgT0HgIKCg0KBQQUAggFEgT0HgsQCg0KBQQUAggBEgT0HhETCg0KBQQUAggDEgT0HhYXCg8KBQQUAggIEgb0Hhj3HgQKEwoJBBQCCAiICQEAEgb0Hhn3HgMKEgoKBBQCCAiICQEAARIE9R4EEgoTCgoEFAIICIgJAQADEgX2HgSYAQqJAwoEBBQCCRIGhB8Chx8FGvgCIGBub3RfaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQKIHZhbHVlcy4KIElmIHRoZSBmaWVsZCB2YWx1ZSBtYXRjaGVzIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSBpcwogZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Qnl0ZXMgewogICAvLyB2YWx1ZSBtdXN0IG5vdCBpbiBbIlx4MDFceDAyIiwgIlx4MDJceDAzIiwgIlx4MDNceDA0Il0KICAgb3B0aW9uYWwgYnl0ZXMgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5ieXRlcy5ub3RfaW4gPSB7Ilx4MDFceDAyIiwgIlx4MDJceDAzIiwgIlx4MDNceDA0In1dOwogfQogYGBgCgoNCgUEFAIJBBIEhB8CCgoNCgUEFAIJBRIEhB8LEAoNCgUEFAIJARIEhB8RFwoNCgUEFAIJAxIEhB8aGwoPCgUEFAIJCBIGhB8chx8EChMKCQQUAgkIiAkBABIGhB8dhx8DChIKCgQUAgkIiAkBAAESBIUfBBYKEgoKBBQCCQiICQEAAxIEhh8EYwpWCgQEFAgAEgaLHwLlHwMaRiBXZWxsS25vd24gcnVsZXMgcHJvdmlkZSBhZHZhbmNlZCBydWxlcyBhZ2FpbnN0IGNvbW1vbiBieXRlCiBwYXR0ZXJucwoKDQoFBBQIAAESBIsfCBIKwwIKBAQUAgoSBpUfBKAfBhqyAiBgaXBgIGVuc3VyZXMgdGhhdCB0aGUgZmllbGQgYHZhbHVlYCBpcyBhIHZhbGlkIElQIGFkZHJlc3MgKHY0IG9yIHY2KSBpbiBieXRlIGZvcm1hdC4KIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhpcyBydWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUJ5dGVzIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIGFkZHJlc3MKICAgb3B0aW9uYWwgYnl0ZXMgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5ieXRlcy5pcCA9IHRydWVdOwogfQogYGBgCgoNCgUEFAIKBRIElR8ECAoNCgUEFAIKARIElR8JCwoNCgUEFAIKAxIElR8OEAoPCgUEFAIKCBIGlR8RoB8FChMKCQQUAgoIiAkBABIGlh8Gmh8HChIKCgQUAgoIiAkBAAESBJcfCBYKEgoKBBQCCgiICQEAAhIEmB8IMwoSCgoEFAIKCIgJAQADEgSZHwhcChMKCQQUAgoIiAkBARIGmx8Gnx8HChIKCgQUAgoIiAkBAQESBJwfCBwKEgoKBBQCCgiICQEBAhIEnR8IQgoSCgoEFAIKCIgJAQEDEgSeHwgzCsACCgQEFAILEgarHwS2HwYarwIgYGlwdjRgIGVuc3VyZXMgdGhhdCB0aGUgZmllbGQgYHZhbHVlYCBpcyBhIHZhbGlkIElQdjQgYWRkcmVzcyBpbiBieXRlIGZvcm1hdC4KIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhpcyBydWxlLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUJ5dGVzIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcwogICBvcHRpb25hbCBieXRlcyB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmJ5dGVzLmlwdjQgPSB0cnVlXTsKIH0KIGBgYAoKDQoFBBQCCwUSBKsfBAgKDQoFBBQCCwESBKsfCQ0KDQoFBBQCCwMSBKsfEBIKDwoFBBQCCwgSBqsfE7YfBQoTCgkEFAILCIgJAQASBqwfBrAfBwoSCgoEFAILCIgJAQABEgStHwgYChIKCgQUAgsIiAkBAAISBK4fCDUKEgoKBBQCCwiICQEAAxIErx8ISQoTCgkEFAILCIgJAQESBrEfBrUfBwoSCgoEFAILCIgJAQEBEgSyHwgeChIKCgQUAgsIiAkBAQISBLMfCEQKEgoKBBQCCwiICQEBAxIEtB8INQq/AgoEBBQCDBIGwB8Eyx8GGq4CIGBpcHY2YCBlbnN1cmVzIHRoYXQgdGhlIGZpZWxkIGB2YWx1ZWAgaXMgYSB2YWxpZCBJUHY2IGFkZHJlc3MgaW4gYnl0ZSBmb3JtYXQuCiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoaXMgcnVsZSwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCiBgYGBwcm90bwogbWVzc2FnZSBNeUJ5dGVzIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcwogICBvcHRpb25hbCBieXRlcyB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmJ5dGVzLmlwdjYgPSB0cnVlXTsKIH0KIGBgYAoKDQoFBBQCDAUSBMAfBAgKDQoFBBQCDAESBMAfCQ0KDQoFBBQCDAMSBMAfEBIKDwoFBBQCDAgSBsAfE8sfBQoTCgkEFAIMCIgJAQASBsEfBsUfBwoSCgoEFAIMCIgJAQABEgTCHwgYChIKCgQUAgwIiAkBAAISBMMfCDUKEgoKBBQCDAiICQEAAxIExB8ISgoTCgkEFAIMCIgJAQESBsYfBsofBwoSCgoEFAIMCIgJAQEBEgTHHwgeChIKCgQUAgwIiAkBAQISBMgfCEQKEgoKBBQCDAiICQEBAxIEyR8INQrIAwoEBBQCDRIG2R8E5B8GGrcDIGB1dWlkYCBlbnN1cmVzIHRoYXQgdGhlIGZpZWxkIGB2YWx1ZWAgZW5jb2RlcyB0aGUgMTI4LWJpdCBVVUlEIGRhdGEgYXMKIGRlZmluZWQgYnkgW1JGQyA0MTIyXShodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzQxMjIjc2VjdGlvbi00LjEuMikuCiBUaGUgZmllbGQgbXVzdCBjb250YWluIGV4YWN0bHkgMTYgYnl0ZXMKIHJlcHJlc2VudGluZyB0aGUgVVVJRC4gSWYgdGhlIGZpZWxkIHZhbHVlIGlzbid0IGEgdmFsaWQgVVVJRCwgYW4gZXJyb3IKIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlCeXRlcyB7CiAgIC8vIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBVVUlECiAgIG9wdGlvbmFsIGJ5dGVzIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYnl0ZXMudXVpZCA9IHRydWVdOwogfQogYGBgCgoNCgUEFAINBRIE2R8ECAoNCgUEFAINARIE2R8JDQoNCgUEFAINAxIE2R8QEgoPCgUEFAINCBIG2R8T5B8FChMKCQQUAg0IiAkBABIG2h8G3h8HChIKCgQUAg0IiAkBAAESBNsfCBgKEgoKBBQCDQiICQEAAhIE3B8ILQoSCgoEFAINCIgJAQADEgTdHwhKChMKCQQUAg0IiAkBARIG3x8G4x8HChIKCgQUAg0IiAkBAQESBOAfCB4KEgoKBBQCDQiICQEBAhIE4R8IPAoSCgoEFAINCIgJAQEDEgTiHwg1CpQDCgQEFAIOEgbzHwL2HwUagwMgYGV4YW1wbGVgIHNwZWNpZmllcyB2YWx1ZXMgdGhhdCB0aGUgZmllbGQgbWF5IGhhdmUuIFRoZXNlIHZhbHVlcyBTSE9VTEQKIGNvbmZvcm0gdG8gb3RoZXIgcnVsZXMuIGBleGFtcGxlYCB2YWx1ZXMgd2lsbCBub3QgaW1wYWN0IHZhbGlkYXRpb24KIGJ1dCBtYXkgYmUgdXNlZCBhcyBoZWxwZnVsIGd1aWRhbmNlIG9uIGhvdyB0byBwb3B1bGF0ZSB0aGUgZ2l2ZW4gZmllbGQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlCeXRlcyB7CiAgIGJ5dGVzIHZhbHVlID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYnl0ZXMuZXhhbXBsZSA9ICJceDAxXHgwMiIsCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYnl0ZXMuZXhhbXBsZSA9ICJceDAyXHgwMyIKICAgXTsKIH0KIGBgYAoKDQoFBBQCDgQSBPMfAgoKDQoFBBQCDgUSBPMfCxAKDQoFBBQCDgESBPMfERgKDQoFBBQCDgMSBPMfGx0KDwoFBBQCDggSBvMfHvYfBAoTCgkEFAIOCIgJAQASBvMfH/YfAwoSCgoEFAIOCIgJAQABEgT0HwQXChIKCgQUAg4IiAkBAAMSBPUfBBYKuAEKAwQUBRIE+x8CGRqqASBFeHRlbnNpb24gZmllbGRzIHRoYXQgaGF2ZSB0aGUgKGJ1Zi52YWxpZGF0ZS5wcmVkZWZpbmVkKSBvcHRpb24gc2V0CiB3aWxsIGJlIHRyZWF0ZWQgYXMgcHJlZGVmaW5lZCBmaWVsZCBydWxlcy4KIFNlZSBodHRwczovL3Byb3RvdmFsaWRhdGUuY29tL3NjaGVtYXMvcHJlZGVmaW5lZC1ydWxlcy8KCgwKBAQUBQASBPsfDRgKDQoFBBQFAAESBPsfDREKDQoFBBQFAAISBPsfFRgKRgoCBBUSBv8fAOggARo4IEVudW1SdWxlcyBkZXNjcmliZSB0aGUgcnVsZXMgYXBwbGllZCB0byBgZW51bWAgdmFsdWVzLgoKCwoDBBUBEgT/HwgRCpgDCgQEFQIAEgaPIAKSIAUahwMgYGNvbnN0YCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gZXhhY3RseSBtYXRjaCB0aGUgc3BlY2lmaWVkIGVudW0gdmFsdWUuCiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtYXRjaCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBiZSBleGFjdGx5IE1ZX0VOVU1fVkFMVUUxLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmNvbnN0ID0gMV07CiB9CiBgYGAKCg0KBQQVAgAEEgSPIAIKCg0KBQQVAgAFEgSPIAsQCg0KBQQVAgABEgSPIBEWCg0KBQQVAgADEgSPIBkaCg8KBQQVAgAIEgaPIBuSIAQKEwoJBBUCAAiICQEAEgaPIBySIAMKEgoKBBUCAAiICQEAARIEkCAEFAoSCgoEFQIACIgJAQADEgSRIARyCo0DCgQEFQIBEgSjIAIhGv4CIGBkZWZpbmVkX29ubHlgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBvbmUgb2YgdGhlIGRlZmluZWQgdmFsdWVzIGZvcgogdGhpcyBlbnVtLCBmYWlsaW5nIG9uIGFueSB1bmRlZmluZWQgdmFsdWUuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBiZSBhIGRlZmluZWQgdmFsdWUgb2YgTXlFbnVtLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmRlZmluZWRfb25seSA9IHRydWVdOwog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AoohBRqsAyBgbWF4X2l0ZW1zYCBkZW5vdGVzIHRoYXQgdGhpcyBmaWVsZCBtdXN0IG5vdCBleGNlZWQgYQogY2VydGFpbiBudW1iZXIgb2YgaXRlbXMgYXMgdGhlIHVwcGVyIGxpbWl0LiBJZiB0aGUgZmllbGQgY29udGFpbnMgbW9yZQogaXRlbXMgdGhhbiBzcGVjaWZpZWQsIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQsIHJlcXVpcmluZyB0aGUKIGZpZWxkIHRvIG1haW50YWluIG5vIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVtcy4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVJlcGVhdGVkIHsKICAgLy8gdmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAzIGl0ZW0ocykKICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVwZWF0ZWQubWF4X2l0ZW1zID0gM107CiB9CiBgYGAKCg0KBQQWAgEEEgSHIQIKCg0KBQQWAgEFEgSHIQsRCg0KBQQWAgEBEgSHIRIbCg0KBQQWAgEDEgSHIR4fCg8KBQQWAgEIEgaHISCKIQQKEwoJBBYCAQiICQEAEgaHISGKIQMKEgoKBBYCAQiICQEAARIEiCEEHAoTCgoEFgIBCIgJAQADEgWJIQSDAQreAgoEBBYCAhIGliECmiEFGs0CIGB1bmlxdWVgIGluZGljYXRlcyB0aGF0IGFsbCBlbGVtZW50cyBpbiB0aGlzIGZpZWxkIG11c3QKIGJlIHVuaXF1ZS4gVGhpcyBydWxlIGlzIHN0cmljdGx5IGFwcGxpY2FibGUgdG8gc2NhbGFyIGFuZCBlbnVtCiB0eXBlcywgd2l0aCBtZXNzYWdlIHR5cGVzIG5vdCBiZWluZyBzdXBwb3J0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlSZXBlYXRlZCB7CiAgIC8vIHJlcGVhdGVkIHZhbHVlIG11c3QgY29udGFpbiB1bmlxdWUgaXRlbXMKICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVwZWF0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aGUgdmFsdWVzIGluIHRoZSBmaWVsZCBgdmFsdWVgIG11c3QgZm9sbG93IHRoZSBzcGVjaWZpZWQgcnVsZXMuCiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5tYXAudmFsdWVzID0gewogICAgIHN0cmluZzogewogICAgICAgbWluX2xlbjogNQogICAgICAgbWF4X2xlbjogMjAKICAgICB9CiAgIH1dOwogfQogYGBgCiBOb3RlIHRoYXQgdGhlIGByZXF1aXJlZGAgcnVsZSBkb2VzIG5vdCBhcHBseS4gTWFwIHZhbHVlcyBjYW5ub3QgYmUgdW5zZXQuCgoNCgUEFwIDBBIE9SECCgoNCgUEFwIDBhIE9SELFQoNCgUEFwIDARIE9SEWHAoNCgUEFwIDAxIE9SEfIAq4AQoDBBcFEgT6IQIZGqoBIEV4dGVuc2lvbiBmaWVsZHMgdGhhdCBoYXZlIHRoZSAoYnVmLnZhbGlkYXRlLnByZWRlZmluZWQpIG9wdGlvbiBzZXQKIHdpbGwgYmUgdHJlYXRlZCBhcyBwcmVkZWZpbmVkIGZpZWxkIHJ1bGVzLgogU2VlIGh0dHBzOi8vcHJvdG92YWxpZGF0ZS5jb20vc2NoZW1hcy9wcmVkZWZpbmVkLXJ1bGVzLwoKDAoEBBcFABIE+iENGAoNCgUEFwUAARIE+iENEQoNCgUEFwUAAhIE+iEVGAppCgIEGBIG/iEAmCIBGlsgQW55UnVsZXMgZGVzY3JpYmUgcnVsZXMgYXBwbGllZCBleGNsdXNpdmVseSB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5BbnlgIHdlbGwta25vd24gdHlwZS4KCgsKAwQYARIE/iEIEAq8AwoEBBgCABIEiyICGRqtAyBgaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCdzIGB0eXBlX3VybGAgdG8gYmUgZXF1YWwgdG8gb25lIG9mIHRoZQpzcGVjaWZpZWQgdmFsdWVzLiBJZiBpdCBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IKIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15QW55IHsKICAgLy8gIFRoZSBgdmFsdWVgIGZpZWxkIG11c3QgaGF2ZSBhIGB0eXBlX3VybGAgZXF1YWwgdG8gb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYW55ID0gewogICAgICAgaW46IFsidHlwZS5nb29nbGVhcGlzLmNvbS9NeVR5cGUxIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vTXlUeXBlMiJdCiAgIH1dOwogfQogYGBgCgoNCgUEGAIABBIEiyICCgoNCgUEGAIABRIEiyILEQoNCgUEGAIAARIEiyISFAoNCgUEGAIAAxIEiyIXGArIAwoEBBgCARIElyICHRq5AyByZXF1aXJlcyB0aGUgZmllbGQncyB0eXBlX3VybCB0byBiZSBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBJZiBpdCBtYXRjaGVzIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlBbnkgewogICAvLyAgVGhlIGB2YWx1ZWAgZmllbGQgbXVzdCBub3QgaGF2ZSBhIGB0eXBlX3VybGAgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYW55ID0gewogICAgICAgbm90X2luOiBbInR5cGUuZ29vZ2xlYXBpcy5jb20vRm9yYmlkZGVuVHlwZTEiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9Gb3JiaWRkZW5UeXBlMiJdCiAgIH1dOwogfQogYGBgCgoNCgUEGAIBBBIElyICCgoNCgUEGAIBBRIElyILEQoNCgUEGAIBARIElyISGAoNCgUEGAIBAxIElyIbHAp3CgIEGRIGmyIA6SMBGmkgRHVyYXRpb25SdWxlcyBkZXNjcmliZSB0aGUgcnVsZXMgYXBwbGllZCBleGNsdXNpdmVseSB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgd2VsbC1rbm93biB0eXBlLgoKCwoDBBkBEgSbIggVCvYCCgQEGQIAEgamIgKpIgUa5QIgYGNvbnN0YCBkaWN0YXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRHVyYXRpb25gIHR5cGUgZXhhY3RseS4KIElmIHRoZSBmaWVsZCdzIHZhbHVlIGRldmlhdGVzIGZyb20gdGhlIHNwZWNpZmllZCB2YWx1ZSwgYW4gZXJyb3IgbWVzc2FnZQogd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgZXF1YWwgNXMKICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24uY29uc3QgPSAiNXMiXTsKIH0KIGBgYAoKDQoFBBkCAAQSBKYiAgoKDQoFBBkCAAYSBKYiCyMKDQoFBBkCAAESBKYiJCkKDQoFBBkCAAMSBKYiLC0KDwoFBBkCAAgSBqYiLqkiBAoTCgkEGQIACIgJAQASBqYiL6kiAwoSCgoEGQIACIgJAQABEgSnIgQYChIKCgQZAgAIiAkBAAMSBKgiBHIKDgoEBBkIABIGqiICzCIDCg0KBQQZCAABEgSqIggRCpEDCgQEGQIBEga1IgS6IgcagAMgYGx0YCBzdGlwdWxhdGVzIHRoYXQgdGhlIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRHVyYXRpb25gIHR5cGUsCiBleGNsdXNpdmUuIElmIHRoZSBmaWVsZCdzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gNXMKICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24ubHQgPSAiNXMiXTsKIH0KIGBgYAoKDQoFBBkCAQYSBLUiBBwKDQoFBBkCAQESBLUiHR8KDQoFBBkCAQMSBLUiIiMKDwoFBBkCAQgSBrUiJLoiBgoTCgkEGQIBCIgJAQASBrUiJboiBQoSCgoEGQIBCIgJAQABEgS2IgYXChQKCgQZAgEIiAkBAAMSBrciBrkiQAqgAwoEBBkCAhIGxiIEyyIHGo8DIGBsdGVgIGluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSBvZiB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgdHlwZSwgaW5jbHVzaXZlLiBJZiB0aGUgZmllbGQncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwKIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEwcwogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5sdGUgPSAiMTBzIl07CiB9CiBgYGAKCg0KBQQZAgIGEgTGIgQcCg0KBQQZAgIBEgTGIh0gCg0KBQQZAgIDEgTGIiMkCg8KBQQZAgIIEgbGIiXLIgYKEwoJBBkCAgiICQEAEgbGIibLIgUKEgoKBBkCAgiICQEAARIExyIGGAoUCgoEGQICCIgJAQADEgbIIgbKIk0KDgoEBBkIARIGzSICsyMDCg0KBQQZCAEBEgTNIggUCqgHCgQEGQIDEgbgIgT/IgYalwcgYGd0YCByZXF1aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15RHVyYXRpb24gewogICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1cyBbZHVyYXRpb24uZ3RdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uLmd0ID0geyBzZWNvbmRzOiA1IH1dOwoKICAgLy8gZHVyYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gNXMgYW5kIGxlc3MgdGhhbiAxMHMgW2R1cmF0aW9uLmd0X2x0XQogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gYW5vdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndDogeyBzZWNvbmRzOiA1IH0sIGx0OiB7IHNlY29uZHM6IDEwIH0gfV07CgogICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxMHMgb3IgbGVzcyB0aGFuIDVzIFtkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmVdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBvdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndDogeyBzZWNvbmRzOiAxMCB9LCBsdDogeyBzZWNvbmRzOiA1IH0gfV07CiB9CiBgYGAKCg0KBQQZAgMGEgTgIgQcCg0KBQQZAgMBEgTgIh0fCg0KBQQZAgMDEgTgIiIjCg8KBQQZAgMIEgbg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BQQZBQACEgToIxUYCnUKAgQaEgbsIwC5JAEaZyBGaWVsZE1hc2tSdWxlcyBkZXNjcmliZSBydWxlcyBhcHBsaWVkIGV4Y2x1c2l2ZWx5IHRvIHRoZSBgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza2Agd2VsbC1rbm93biB0eXBlLgoKCwoDBBoBEgTsIwgWCpQDCgQEGgIAEgb5IwL8IwUagwMgYGNvbnN0YCBkaWN0YXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrYCB0eXBlIGV4YWN0bHkuCiBJZiB0aGUgZmllbGQncyB2YWx1ZSBkZXZpYXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUsIGFuIGVycm9yIG1lc3NhZ2UKIHdpbGwgYmUgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15RmllbGRNYXNrIHsKICAgLy8gdmFsdWUgbXVzdCBlcXVhbCBbImEiXQogICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZmllbGRfbWFzay5jb25zdCA9IHsKICAgICAgIHBhdGhzOiBbImEiXQogICB9XTsKIH0KIGBgYAoKDQoFBBoCAAQSBPkjAgoKDQoFBBoCAAYSBPkjCyQKDQoFBBoCAAESBPkjJSoKDQoFBBoCAAMSBPkjLS4KDwoFBBoCAAgSBvkjL/wjBAoTCgkEGgIACIgJAQASBvkjMPwjAwoSCgoEGgIACIgJAQABEgT6IwQaChMKCgQaAgAIiAkBAAMSBfsjBIoBCvgDCgQEGgIBEgaMJAKPJAUa5wMgYGluYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gb25seSBjb250YWluIHBhdGhzIG1hdGNoaW5nIHNwZWNpZmllZAogdmFsdWVzIG9yIHRoZWlyIHN1YnBhdGhzLgogSWYgYW55IG9mIHRoZSBmaWVsZCB2YWx1ZSdzIHBhdGhzIGRvZXNuJ3QgbWF0Y2ggdGhlIHJ1bGUsCiBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KIFNlZTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcmVmZXJlbmNlL3Byb3RvYnVmL2dvb2dsZS5wcm90b2J1Zi8jZmllbGQtbWFzawoKIGBgYHByb3RvCiBtZXNzYWdlIE15RmllbGRNYXNrIHsKICAgLy8gIFRoZSBgdmFsdWVgIEZpZWxkTWFzayBtdXN0IG9ubHkgY29udGFpbiBwYXRocyBsaXN0ZWQgaW4gYGluYC4KICAgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmZpZWxkX21hc2sgPSB7CiAgICAgICBpbjogWyJhIiwgImIiLCAiYy5hIl0KICAgfV07CiB9CiBgYGAKCg0KBQQaAgEEEgSMJAIKCg0KBQQaAgEFEgSMJAsRCg0KBQQaAgEBEgSMJBIUCg0KBQQaAgEDEgSMJBcYCg8KBQQaAgEIEgaMJBmPJAQKEwoJBBoCAQiICQEAEgaMJBqPJAMKEgoKBBoCAQiICQEAARIEjSQEFwoTCgoEGgIBCIgJAQADEgWOJATFAQqNBAoEBBoCAhIGnyQCoiQFGvwDIGBub3RfaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBub3QgY29udGFpbiBwYXRocyBtYXRjaGluZyBzcGVjaWZpZWQKIHZhbHVlcyBvciB0aGVpciBzdWJwYXRocy4KIElmIGFueSBvZiB0aGUgZmllbGQgdmFsdWUncyBwYXRocyBtYXRjaGVzIHRoZSBydWxlLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCiBTZWU6IGh0dHBzOi8vcHJvdG9idWYuZGV2L3JlZmVyZW5jZS9wcm90b2J1Zi9nb29nbGUucHJvdG9idWYvI2ZpZWxkLW1hc2sKCiBgYGBwcm90bwogbWVzc2FnZSBNeUZpZWxkTWFzayB7CiAgIC8vICBUaGUgYHZhbHVlYCBGaWVsZE1hc2sgc2hhbGwgbm90IGNvbnRhaW4gcGF0aHMgbGlzdGVkIGluIGBub3RfaW5gLgogICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZmllbGRfbWFzayA9IHsK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aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGZpZWxkIDwgdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAgLy8gZHVyYXRpb24gbXVzdCBiZSBsZXNzIHRoYW4gJ1AzRCcgW2R1cmF0aW9uLmx0XQogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5sdCA9IHsgc2Vjb25kczogMjU5MjAwIH1dOwogfQogYGBgCgoNCgUEGwIBBhIE0iQEHQoNCgUEGwIBARIE0iQeIAoNCgUEGwIBAxIE0iQjJAoPCgUEGwIBCBIG0iQl1yQGChMKCQQbAgEIiAkBABIG0iQm1yQFChIKCgQbAgEIiAkBAAESBNMkBhgKFAoKBBsCAQiICQEAAxIG1CQG1iRACrUDCgQEGwICEgbhJATmJAcapAMgcmVxdWlyZXMgdGhlIHRpbWVzdGFtcCBmaWVsZCB2YWx1ZSB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAoZmllbGQgPD0gdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVRpbWVzdGFtcCB7CiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAnMjAyMy0wNS0xNFQwMDowMDowMFonIFt0aW1lc3RhbXAubHRlXQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmx0ZSA9IHsgc2Vjb25kczogMTY3ODg2NzIwMCB9XTsKIH0KIGBgYAoKDQoFBBsCAgYSBOEkBB0KDQoFBBsCAgESBOEkHiEKDQoFBBsCAgMSBOEkJCUKDwoFBBsCAggSBuEkJuYkBgoTCgkEGwICCIgJAQASBuEkJ+YkBQoSCgoEGwICCIgJAQABEgTiJAYZChQKCgQbAgIIiAkBAAMSBuMkBuUkTQrcAgoEBBsCAxIG8CQE8yQHGssCIGBsdF9ub3dgIHNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQsIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcGAgdHlwZSwgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgdGltZS4gYGx0X25vd2AgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgd2l0aGluYCBydWxlLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAvLyB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cKICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmx0X25vdyA9IHRydWVdOwogfQogYGBgCgoNCgUEGwIDBRIE8CQECAoNCgUEGwIDARIE8CQJDwoNCgUEGwIDAxIE8CQSEwoPCgUEGwIDCBIG8CQU8yQGChMKCQQbAgMIiAkBABIG8CQV8yQFChIKCgQbAgMIiAkBAAESBPEkBhwKEgoKBBsCAwiICQEAAxIE8iQGVQoOCgQEGwgBEgb1JALoJQMKDQoFBBsIAQESBPUkCBQKwwgKBAQbAgQSBoglBKclBhqyCCBgZ3RgIHJlcXVpcmVzIHRoZSB0aW1lc3RhbXAgZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndF0KICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC5ndCA9IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9XTsKCiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAnMjAyMy0wMS0wMVQwMDowMDowMFonIGFuZCBsZXNzIHRoYW4gJzIwMjMtMDEtMDJUMDA6MDA6MDBaJyBbdGltZXN0YW1wLmd0X2x0XQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGFub3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0OiB7IHNlY29uZHM6IDE2NzI0NDQ4MDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjUzMTIwMCB9IH1dOwoKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuICcyMDIzLTAxLTAyVDAwOjAwOjAwWicgb3IgbGVzcyB0aGFuICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndF9sdF9leGNsdXNpdmVdCiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgb3RoZXJfdmFsdWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0OiB7IHNlY29uZHM6IDE2NzI1MzEyMDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9IH1dOwogfQogYGBgCgoNCgUEGwIEBhIEiCUEHQoNCgUEGwIEARIEiCUeIAoNCgUEGwIEAxIEiCUjJAoPCgUE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iAkBBBIG1CUG2SUHChIKCgQbAgUIiAkBBAESBNUlCCkKFAoKBBsCBQiICQEEAxIG1iUI2CV5CuMCCgQEGwIGEgbkJQTnJQca0gIgYGd0X25vd2Agc3BlY2lmaWVzIHRoYXQgdGhpcyBmaWVsZCwgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wYCB0eXBlLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lLiBgZ3Rfbm93YCBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlIGB3aXRoaW5gIHJ1bGUuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlUaW1lc3RhbXAgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cKICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmd0X25vdyA9IHRydWVdOwogfQogYGBgCgoNCgUEGwIGBRIE5CUECAoNCgUEGwIGARIE5CUJDwoNCgUEGwIGAxIE5CUSEwoPCgUEGwIGCBIG5CUU5yUGChMKCQQbAgYIiAkBABIG5CUV5yUFChIKCgQbAgYIiAkBAAESBOUlBhwKEgoKBBsCBgiICQEAAxIE5iUGWAqhAwoEBBsCBxIG8iUC9SUFGpADIGB3aXRoaW5gIHNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQsIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcGAgdHlwZSwgbXVzdCBiZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCB0aW1lLiBJZiB0aGUgZmllbGQgdmFsdWUgaXNuJ3Qgd2l0aGluIHRoZSBkdXJhdGlvbiwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlUaW1lc3RhbXAgewogICAvLyB2YWx1ZSBtdXN0IGJlIHdpdGhpbiAxIGhvdXIgb2Ygbm93CiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgY3JlYXRlZF9hdCA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC53aXRoaW4gPSB7c2Vjb25kczogMzYwMH1dOwogfQogYGBgCgoNCgUEGwIHBBIE8iUCCgoNCgUEGwIHBhIE8iULIwoNCgUEGwIHARIE8iUkKgoNCgUEGwIHAxIE8iUtLgoPCgUEGwIHCBIG8iUv9SUEChMKCQQbAgcIiAkBABIG8iUw9SUDChIKCgQbAgcIiAkBAAESBPMlBBoKEwoKBBsCBwiICQEAAxIF9CUEgwEKzwMKBAQbAggSBoMmAoYmBRq+AyBgZXhhbXBsZWAgc3BlY2lmaWVzIHZhbHVlcyB0aGF0IHRoZSBmaWVsZCBtYXkgaGF2ZS4gVGhlc2UgdmFsdWVzIFNIT1VMRAogY29uZm9ybSB0byBvdGhlciBydWxlcy4gYGV4YW1wbGVgIHZhbHVlcyB3aWxsIG5vdCBpbXBhY3QgdmFsaWRhdGlvbgogYnV0IG1heSBiZSB1c2VkIGFzIGhlbHBmdWwgZ3VpZGFuY2Ugb24gaG93IHRvIHBvcHVsYXRlIHRoZSBnaXZlbiBmaWVsZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVRpbWVzdGFtcCB7CiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdmFsdWUgPSAxIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAuZXhhbXBsZSA9IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9LAogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC5leGFtcGxlID0geyBzZWNvbmRzOiAxNjcyNTMxMjAwIH0sCiAgIF07CiB9CiBgYGAKCg0KBQQbAggEEgSDJgIKCg0KBQQbAggGEgSDJgskCg0KBQQbAggBEgSDJiUsCg0KBQQbAggDEgSDJi8xCg8KBQQbAggIEgaDJjKGJgQKEwoJBBsCCAiICQEAEgaDJjOGJgMKEgoKBBsCCAiICQEAARIEhCYEGwoSCgoEGwIICIgJAQADEgSFJgQWCrgBCgMEGwUSBIsmAhkaqgEgRXh0ZW5zaW9uIGZpZWxkcyB0aGF0IGhhdmUgdGhlIChidWYudmFsaWRhdGUucHJlZGVmaW5lZCkgb3B0aW9uIHNldAogd2lsbCBiZSB0cmVhdGVkIGFzIHByZWRlZmluZWQgZmllbGQgcnVsZXMuCiBTZWUgaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9zY2hlbWFzL3ByZWRlZmluZWQtcnVsZXMvCgoMCgQEGwUAEgSLJg0YCg0KBQQbBQABEgSLJg0RCg0KBQQbBQACEgSLJhUYCpICCgIEHBIGkSYAlCYBGoMCIGBWaW9sYXRpb25zYCBpcyBhIGNvbGxlY3Rpb24gb2YgYFZpb2xhdGlvbmAgbWVzc2FnZXMuIFRoaXMgbWVzc2FnZSB0eXBlIGlzIHJldHVybmVkIGJ5CiBQcm90b3ZhbGlkYXRlIHdoZW4gYSBwcm90byBtZXNzYWdlIGZhaWxzIHRvIG1lZXQgdGhlIHJlcXVpcmVtZW50cyBzZXQgYnkgdGhlIGBSdWxlYCB2YWxpZGF0aW9uIHJ1bGVzLgogRWFjaCBpbmRpdmlkdWFsIHZpb2xhdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIGBWaW9sYXRpb25gIG1lc3NhZ2UuCgoLCgMEHAESBJEmCBIKhQEKBAQcAgASBJMmAiQadyBgdmlvbGF0aW9uc2AgaXMgYSByZXBlYXRlZCBmaWVsZCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgYFZpb2xhdGlvbmAgbWVzc2FnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgdmlvbGF0aW9ucyBkZXRlY3RlZC4KCg0KBQQcAgAEEgSTJgIKCg0KBQQcAgAGEgSTJgsUCg0KBQQcAgABEgSTJhUfCg0KBQQcAgADEgSTJiIjCtgHCgIEHRIGwSYAgicBGskHIGBWaW9sYXRpb25gIHJlcHJlc2VudHMgYSBzaW5nbGUgaW5zdGFuY2Ugd2hlcmUgYSB2YWxpZGF0aW9uIHJ1bGUsIGV4cHJlc3NlZAogYXMgYSBgUnVsZWAsIHdhcyBub3QgbWV0LiBJdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmllbGQgdGhhdAogY2F1c2VkIHRoZSB2aW9sYXRpb24sIHRoZSBzcGVjaWZpYyBydWxlIHRoYXQgd2Fzbid0IGZ1bGZpbGxlZCwgYW5kIGEKIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCgogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKCiBgYGBwcm90bwogbWVzc2FnZSBVc2VyIHsKICAgICBpbnQzMiBhZ2UgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5jZWwgPSB7CiAgICAgICAgIGlkOiAidXNlci5hZ2UiLAogICAgICAgICBleHByZXNzaW9uOiAidGhpcyA8IDE4ID8gJ1VzZXIgbXVzdCBiZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQnIDogJyciLAogICAgIH1dOwogfQogYGBgCgogSXQgY291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5nIHZpb2xhdGlvbjoKCiBgYGBqc29uCiB7CiAgICJydWxlSWQiOiAidXNlci5hZ2UiLAogICAibWVzc2FnZSI6ICJVc2VyIG11c3QgYmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkIiwKICAgImZpZWxkIjogewogICAgICJlbGVtZW50cyI6IFsKICAgICAgIHsKICAgICAgICAgImZpZWxkTnVtYmVyIjogMSwKICAgICAgICAgImZpZWxkTmFtZSI6ICJhZ2UiLAogICAgICAgICAiZmllbGRUeXBlIjogIlRZUEVfSU5UMzIiCiAgICAgICB9CiAgICAgXQogICB9LAogICAicnVsZSI6IHsKICAgICAiZWxlbWVudHMiOiBbCiAgICAgICB7CiAgICAgICAgICJmaWVsZE51bWJlciI6IDIzLAogICAgICAgICAiZmllbGROYW1lIjogImNlbCIsCiAgICAgICAgICJmaWVsZFR5cGUiOiAiVFlQRV9NRVNTQUdFIiwKICAgICAgICAgImluZGV4IjogIjAiCiAgICAgICB9CiAgICAgXQogICB9CiB9CiBgYGAKCgsKAwQdARIEwSYIEQqTBAoEBB0CABIE1SYCHxqEBCBgZmllbGRgIGlzIGEgbWFjaGluZS1yZWFkYWJsZSBwYXRoIHRvIHRoZSBmaWVsZCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgogVGhpcyBjb3VsZCBiZSBhIG5lc3RlZCBmaWVsZCwgaW4gd2hpY2ggY2FzZSB0aGUgcGF0aCB3aWxsIGluY2x1ZGUgYWxsIHRoZSBwYXJlbnQgZmllbGRzIGxlYWRpbmcgdG8gdGhlIGFjdHVhbCBmaWVsZCB0aGF0IGNhdXNlZCB0aGUgdmlvbGF0aW9uLgoKIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6CgogYGBgcHJvdG8KIG1lc3NhZ2UgTWVzc2FnZSB7CiAgIGJvb2wgYSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZV07CiB9CiBgYGAKCiBJdCBjb3VsZCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgdmlvbGF0aW9uOgoKIGBgYHRleHRwcm90bwogdmlvbGF0aW9uIHsKICAgZmllbGQgeyBlbGVtZW50IHsgZmllbGRfbnVtYmVyOiAxLCBmaWVsZF9uYW1lOiAiYSIsIGZpZWxkX3R5cGU6IDggfSB9CiAgIC4uLgogfQogYGBgCgoNCgUEHQIABBIE1SYCCgoNCgUEHQIABhIE1SYLFAoNCgUEHQIAARIE1SYVGgoNCgUEHQIAAxIE1SYdHgquBgoEBB0CARIE8yYCHhqfBiBgcnVsZWAgaXMgYSBtYWNoaW5lLXJlYWRhYmxlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHNwZWNpZmljIHJ1bGUgdGhhdCBmYWlsZWQgdmFsaWRhdGlvbi4KIFRoaXMgd2lsbCBiZSBhIG5lc3RlZCBmaWVsZCBzdGFydGluZyBmcm9tIHRoZSBGaWVsZFJ1bGVzIG9mIHRoZSBmaWVsZCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgogRm9yIGN1c3RvbSBydWxlcywgdGhpcyB3aWxsIHByb3ZpZGUgdGhlIHBhdGggb2YgdGhlIHJ1bGUsIGUuZy4gYGNlbFswXWAuCgogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKCiBgYGBwcm90bwogbWVzc2FnZSBNZXNzYWdlIHsKICAgYm9vbCBhID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVxdWlyZWQgPSB0cnVlXTsKICAgYm9vbCBiID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuY2VsID0gewogICAgIGlkOiAiY3VzdG9tX3J1bGUiLAogICAgIGV4cHJlc3Npb246ICIhdGhpcyA/ICdiIG11c3QgYmUgdHJ1ZSc6ICcnIgogICB9XQogfQogYGBgCgogSXQgY291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5nIHZpb2xhdGlvbnM6CgogYGBgdGV4dHByb3RvCiB2aW9sYXRpb24gewogICBydWxlIHsgZWxlbWVudCB7IGZpZWxkX251bWJlcjogMjUsIGZpZWxkX25hbWU6ICJyZXF1aXJlZCIsIGZpZWxkX3R5cGU6IDggfSB9CiAgIC4uLgogfQogdmlvbGF0aW9uIHsKICAgcnVsZSB7IGVsZW1lbnQgeyBmaWVsZF9udW1iZXI6IDIzLCBmaWVsZF9uYW1lOiAiY2VsIiwgZmllbGRfdHlwZTogMTEsIGluZGV4OiAwIH0gfQogICAuLi4KIH0KIGBgYAoKDQoFBB0CAQQSBPMmAgoKDQoFBB0CAQYSBPMmCxQKDQoFBB0CAQESBPMmFRkKDQoFBB0CAQMSBPMmHB0KzAEKBAQdAgISBPcmAh4avQEgYHJ1bGVfaWRgIGlzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYFJ1bGVgIHRoYXQgd2FzIG5vdCBmdWxmaWxsZWQuCiBUaGlzIGlzIHRoZSBzYW1lIGBpZGAgdGhhdCB3YXMgc3BlY2lmaWVkIGluIHRoZSBgUnVsZWAgbWVzc2FnZSwgYWxsb3dpbmcgZWFzeSB0cmFjaW5nIG9mIHdoaWNoIHJ1bGUgd2FzIHZpb2xhdGVkLgoKDQoFBB0CAgQSBPcmAgoKDQoFBB0CAgUSBPcmCxEKDQoFBB0CAgESBPcmEhkKDQoFBB0CAgMSBPcmHB0K9AEKBAQdAgMSBPsmAh4a5QEgYG1lc3NhZ2VgIGlzIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyB0aGUgbmF0dXJlIG9mIHRoZSB2aW9sYXRpb24uCiBUaGlzIGNhbiBiZSB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlIGZyb20gdGhlIHZpb2xhdGVkIGBSdWxlYCwgb3IgaXQgY2FuIGJlIGEgY3VzdG9tIG1lc3NhZ2UgdGhhdCBnaXZlcyBtb3JlIGNvbnRleHQgYWJvdXQgdGhlIHZpb2xhdGlvbi4KCg0KBQQdAgMEEgT7JgIKCg0KBQQdAgMFEgT7JgsRCg0KBQQdAgMBEgT7JhIZCg0KBQQdAgMDEgT7JhwdCmcKBAQdAgQSBP4mAhwaWSBgZm9yX2tleWAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpb2xhdGlvbiB3YXMgY2F1c2VkIGJ5IGEgbWFwIGtleSwgcmF0aGVyIHRoYW4gYSB2YWx1ZS4KCg0KBQQdAgQEEgT+JgIKCg0KBQQdAgQFEgT+JgsPCg0KBQQdAgQBEgT+JhAXCg0KBQQdAgQDEgT+JhobCgsKAwQdCRIEgCcCDQoMCgQEHQkAEgSAJwsMCg0KBQQdCQABEgSAJwsMCg0KBQQdCQACEgSAJwsMCgsKAwQdChIEgScCGAoMCgQEHQoAEgSBJwsXCo4CCgIEHhIGiCcAiycBGv8BIGBGaWVsZFBhdGhgIHByb3ZpZGVzIGEgcGF0aCB0byBhIG5lc3RlZCBwcm90b2J1ZiBmaWVsZC4KCiBUaGlzIG1lc3NhZ2UgcHJvdmlkZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHJlbmRlciBhIGRvdHRlZCBmaWVsZCBwYXRoIGV2ZW4gd2l0aG91dCBwcm90b2J1ZiBkZXNjcmlwdG9ycy4KIEl0IGFsc28gcHJvdmlkZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHJlc29sdmUgYSBuZXN0ZWQgZmllbGQgdGhyb3VnaCB1bmtub3duIHdpcmUgZGF0YS4KCgsKAwQeARIEiCcIEQpsCgQEHgIAEgSKJwIpGl4gYGVsZW1lbnRzYCBjb250YWlucyBlYWNoIGVsZW1lbnQgb2YgdGhlIHBhdGgsIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgYW5kIHJlY3Vyc2luZyBkb3dud2FyZC4KCg0KBQQeAgAEEgSKJwIKCg0KBQQeAgAGEgSKJwsbCg0KBQQeAgABEgSKJxwkCg0KBQQeAgADEgSKJycoCqsDCgIEHxIGkicAwCcBGpwDIGBGaWVsZFBhdGhFbGVtZW50YCBwcm92aWRlcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbmVzdCB0aHJvdWdoIGEgc2luZ2xlIHByb3RvYnVmIGZpZWxkLgoKIElmIHRoZSBzZWxlY3RlZCBmaWVsZCBpcyBhIG1hcCBvciByZXBlYXRlZCBmaWVsZCwgdGhlIGBzdWJzY3JpcHRgIHZhbHVlIHNlbGVjdHMgYSBzcGVjaWZpYyBlbGVtZW50IGZyb20gaXQuCiBBIHBhdGggdGhhdCByZWZlcnMgdG8gYSB2YWx1ZSBuZXN0ZWQgdW5kZXIgYSBtYXAga2V5IG9yIHJlcGVhdGVkIGZpZWxkIGluZGV4IHdpbGwgaGF2ZSBhIGBzdWJzY3JpcHRgIHZhbHVlLgogVGhlIGBmaWVsZF90eXBlYCBmaWVsZCBhbGxvd3MgdW5hbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiBhIGZpZWxkIGV2ZW4gaWYgZGVzY3JpcHRvcnMgYXJlIG5vdCBhdmFpbGFibGUuCgoLCgMEHwESBJInCBgKTwoEBB8CABIElCcCIhpBIGBmaWVsZF9udW1iZXJgIGlzIHRoZSBmaWVsZCBudW1iZXIgdGhpcyBwYXRoIGVsZW1lbnQgcmVmZXJzIHRvLgoKDQoFBB8CAAQSBJQnAgoKDQoFBB8CAAUSBJQnCxAKDQoFBB8CAAESBJQnER0KDQoFBB8CAAMSBJQnICEKqgEKBAQfAgESBJgnAiEamwEgYGZpZWxkX25hbWVgIGNvbnRhaW5zIHRoZSBmaWVsZCBuYW1lIHRoaXMgcGF0aCBlbGVtZW50IHJlZmVycyB0by4KIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIGh1bWFuLXJlYWRhYmxlIHBhdGggZXZlbiBpZiB0aGUgZmllbGQgbnVtYmVyIGlzIHVua25vd24uCgoNCgUEHwIBBBIEmCcCCgoNCgUEHwIBBRIEmCcLEQoNCgUEHwIBARIEmCcSHAoNCgUEHwIBAxIEmCcfIArABAoEBB8CAhIEpCcCRBqxBCBgZmllbGRfdHlwZWAgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuIFdoZW4gdXNpbmcgcmVmbGVjdGlvbiwgdGhpcyB2YWx1ZSBpcyBub3QgbmVlZGVkLgoKIFRoaXMgdmFsdWUgaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB0cmF2ZXJzZSB1bmtub3duIGZpZWxkcyB0aHJvdWdoIHdpcmUgZGF0YS4KIFdoZW4gdHJhdmVyc2luZyB3aXJlIGRhdGEsIGJlIG1pbmRmdWwgb2YgYm90aCBwYWNrZWRbMV0gYW5kIGRlbGltaXRlZFsyXSBlbmNvZGluZyBzY2hlbWVzLgoKIFsxXTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2VuY29kaW5nLyNwYWNrZWQKIFsyXTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2VuY29kaW5nLyNncm91cHMKCiBOLkIuOiBBbHRob3VnaCBncm91cHMgYXJlIGRlcHJlY2F0ZWQsIHRoZSBjb3JyZXNwb25kaW5nIGRlbGltaXRlZCBlbmNvZGluZyBzY2hlbWUgaXMgbm90LCBhbmQKIGNhbiBiZSBleHBsaWNpdGx5IHVzZWQgaW4gUHJvdG9jb2wgQnVmZmVycyAyMDIzIEVkaXRpb24uCgoNCgUEHwICBBIEpCcCCgoNCgUEHwICBhIEpCcLNAoNCgUEHwICARIEpCc1PwoNCgUEHwICAxIEpCdCQwrkAQoEBB8CAxIEqScCQhrVASBga2V5X3R5cGVgIHNwZWNpZmllcyB0aGUgbWFwIGtleSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoaXMgdmFsdWUgaXMgdXNlZnVsIHdoZW4gdHJhdmVyc2luZwogdW5rbm93biBmaWVsZHMgdGhyb3VnaCB3aXJlIGRhdGE6IHNwZWNpZmljYWxseSwgaXQgYWxsb3dzIGhhbmRsaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCiBkaWZmZXJlbnQgaW50ZWdlciBlbmNvZGluZ3MuCgoNCgUEHwIDBBIEqScCCgoNCgUEHwIDBhIEqScLNAoNCgUEHwIDARIEqSc1PQoNCgUEHwIDAxIEqSdAQQqdAQoEBB8CBBIErScCRBqOASBgdmFsdWVfdHlwZWAgc3BlY2lmaWVzIG1hcCB2YWx1ZSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRpc3BsYXkgYQogdmFsdWUgaW5zaWRlIHVua25vd24gZmllbGRzIHRocm91Z2ggd2lyZSBkYXRhLgoKDQoFBB8CBAQSBK0nAgoKDQoFBB8CBAYSBK0nCzQKDQoFBB8CBAESBK0nNT8KDQoFBB8CBAMSBK0nQkMKfAoEBB8IABIGsCcCvycDGmwgYHN1YnNjcmlwdGAgY29udGFpbnMgYSByZXBlYXRlZCBpbmRleCBvciBtYXAga2V5LCBpZiB0aGlzIHBhdGggZWxlbWVudCBuZXN0cyBpbnRvIGEgcmVwZWF0ZWQgb3IgbWFwIGZpZWxkLgoKDQoFBB8IAAESBLAnCBEKSAoEBB8CBRIEsicEFRo6IGBpbmRleGAgc3BlY2lmaWVzIGEgMC1iYXNlZCBpbmRleCBpbnRvIGEgcmVwZWF0ZWQgZmllbGQuCgoNCgUEHwIFBRIEsicECgoNCgUEHwIFARIEsicLEAoNCgUEHwIFAxIEsicTFAo8CgQEHwIGEgS1JwQWGi4gYGJvb2xfa2V5YCBzcGVjaWZpZXMgYSBtYXAga2V5IG9mIHR5cGUgYm9vbC4KCg0KBQQfAgYFEgS1JwQICg0KBQQfAgYBEgS1JwkRCg0KBQQfAgYDEgS1JxQVCmkKBAQfAgcSBLgnBBYaWyBgaW50X2tleWAgc3BlY2lmaWVzIGEgbWFwIGtleSBvZiB0eXBlIGludDMyLCBpbnQ2NCwgc2ludDMyLCBzaW50NjQsIHNmaXhlZDMyIG9yIHNmaXhlZDY0LgoKDQoFBB8CBwUSBLgnBAkKDQoFBB8CBwESBLgnChEKDQoFBB8CBwMSBLgnFBUKWgoEBB8CCBIEuycEGBpMIGB1aW50X2tleWAgc3BlY2lmaWVzIGEgbWFwIGtleSBvZiB0eXBlIHVpbnQzMiwgdWludDY0LCBmaXhlZDMyIG9yIGZpeGVkNjQuCgoNCgUEHwIIBRIEuycECgoNCgUEHwIIARIEuycLEwoNCgUEHwIIAxIEuycWFwpACgQEHwIJEgS+JwQbGjIgYHN0cmluZ19rZXlgIHNwZWNpZmllcyBhIG1hcCBrZXkgb2YgdHlwZSBzdHJpbmcuCgoNCgUEHwIJBRIEvicECgoNCgUEHwIJARIEvicLFQoNCgUEHwIJAxIEvicYGgr2IgoVY29tbW9uL3YxL3R5cGVzLnByb3RvEhdzZXJ2aWNlYnJpZGdlLmNvbW1vbi52MRobYnVmL3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvIqABCg5Xb3JrZXJJZGVudGl0eRIqCgxzZXJ2aWNlX25hbWUYASABKAlCB7pIBHICEAFSC3NlcnZpY2VOYW1lEigKC2luc3RhbmNlX2lkGAIgASgJQge6SARyAhABUgppbnN0YW5jZUlkEhoKCGVuZHBvaW50GAMgASgJUghlbmRwb2ludBIcCgl0cmFuc3BvcnQYBCABKAlSCXRyYW5zcG9ydCJuCg9SZXNvdXJjZU1ldHJpY3MSJAoLY3B1X3BlcmNlbnQYASABKAJIAFIKY3B1UGVyY2VudIgBARIaCgZyYW1fbWIYAiABKAVIAVIFcmFtTWKIAQFCDgoMX2NwdV9wZXJjZW50QgkKB19yYW1fbWIi0gEKE0Z1bmN0aW9uRGVjbGFyYXRpb24SIAoHZm5fbmFtZRgBIAEoCUIHukgEcgIQAVIGZm5OYW1lEhYKBndlaWdodBgCIAEoBVIGd2VpZ2h0EioKEWlucHV0X3NjaGVtYV9qc29uGAMgASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAQgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgFIAMoCVIOYWxsb3dlZENhbGxlcnMi6wEKGENvbnN1bWVyR3JvdXBEZWNsYXJhdGlvbhIbCgRuYW1lGAEgASgJQge6SARyAhABUgRuYW1lEiEKB3BhdHRlcm4YAiABKAlCB7pIBHICEAFSB3BhdHRlcm4SEgoEbW9kZRgDIAEoCVIEbW9kZRIqChFyZXRyeV9wb2xpY3lfanNvbhgEIAEoCVIPcmV0cnlQb2xpY3lKc29uEhYKBmFjdGl2ZRgFIAEoCFIGYWN0aXZlEh8KC2ZpbHRlcl9leHByGAYgASgJUgpmaWx0ZXJFeHByEhYKBndlaWdodBgHIAEoBVIGd2VpZ2h0It4BChRIdHRwUm91dGVEZWNsYXJhdGlvbhIWCgZtZXRob2QYASABKAlSBm1ldGhvZBIjCg1yb3V0ZV9wYXR0ZXJuGAIgASgJUgxyb3V0ZVBhdHRlcm4SLgoTcmVxdWVzdF9zY2hlbWFfanNvbhgDIAEoCVIRcmVxdWVzdFNjaGVtYUpzb24SMAoUcmVzcG9uc2Vfc2NoZW1hX2pzb24YBCABKAlSEnJlc3BvbnNlU2NoZW1hSnNvbhInCg9hbGxvd2VkX2NhbGxlcnMYBSADKAlSDmFsbG93ZWRDYWxsZXJzIl0KE1dvcmtmbG93RGVjbGFyYXRpb24SEgoEbmFtZRgBIAEoCVIEbmFtZRIeCgpkZWZpbml0aW9uGAIgASgJUgpkZWZpbml0aW9uEhIKBG9wdHMYAyABKAlSBG9wdHMi9wEKDkpvYkRlY2xhcmF0aW9uEhsKCWNyb25fZXhwchgBIAEoCVIIY3JvbkV4cHISGgoIdGltZXpvbmUYAiABKAlSCHRpbWV6b25lEiUKDm1pc2ZpcmVfcG9saWN5GAMgASgJUg1taXNmaXJlUG9saWN5Eh8KC3RhcmdldF90eXBlGAQgASgJUgp0YXJnZXRUeXBlEh0KCnRhcmdldF9yZWYYBSABKAlSCXRhcmdldFJlZhIZCghkZWxheV9tcxgGIAEoBVIHZGVsYXlNcxIqChFyZXRyeV9wb2xpY3lfanNvbhgHIAEoCVIPcmV0cnlQb2xpY3lKc29uKmQKDVRyYW5zcG9ydE1vZGUSHgoaVFJBTlNQT1JUX01PREVfVU5TUEVDSUZJRUQQABIZChVUUkFOU1BPUlRfTU9ERV9ESVJFQ1QQARIYChRUUkFOU1BPUlRfTU9ERV9QUk9YWRACKmcKE0xvYWRCYWxhbmNpbmdQb2xpY3kSEgoOTEJfUk9VTkRfUk9CSU4QABIPCgtMQl9XRUlHSFRFRBABEhgKFExCX0xFQVNUX0NPTk5FQ1RJT05TEAISEQoNTEJfWk9ORV9BV0FSRRADKkMKE0NpcmN1aXRCcmVha2VyU3RhdGUSDQoJQ0JfQ0xPU0VEEAASCwoHQ0JfT1BFThABEhAKDENCX0hBTEZfT1BFThACQkNaQWdpdGh1Yi5jb20vc2VydmljZWJyaWRnZS9zZXJ2ZXItZ28vaW50ZXJuYWwvcGIvY29tbW9uL3YxO2NvbW1vbnYxSrUVCgYSBAAATgEKCAoBDBIDAAASCggKAQISAwEAIAoICgEIEgMDAFgKCQoCCAsSAwMAWAoJCgIDABIDBQAlCgoKAgQAEgQHAAwBCgoKAwQAARIDBwgWCgsKBAQAAgASAwgCRAoMCgUEAAIABRIDCAIICgwKBQQAAgABEgMICRUKDAoFBAACAAMSAwgYGQoMCgUEAAIACBIDCBpDChAKCQQAAgAIhwkOAhIDCBtCCgsKBAQA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UmVjb25jaWxlUmVxdWVzdBJLCghpZGVudGl0eRgBIAEoCzInLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLldvcmtlcklkZW50aXR5Qga6SAPIAQFSCGlkZW50aXR5EkoKCWZ1bmN0aW9ucxgCIAMoCzIsLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLkZ1bmN0aW9uRGVjbGFyYXRpb25SCWZ1bmN0aW9ucxJaCg9jb25zdW1lcl9ncm91cHMYAyADKAsyMS5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5Db25zdW1lckdyb3VwRGVjbGFyYXRpb25SDmNvbnN1bWVyR3JvdXBzEk4KC2h0dHBfcm91dGVzGAQgAygLMi0uc2VydmljZWJyaWRnZS5jb21tb24udjEuSHR0cFJvdXRlRGVjbGFyYXRpb25SCmh0dHBSb3V0ZXMSSgoJd29ya2Zsb3dzGAUgAygLMiwuc2VydmljZWJyaWRnZS5jb21tb24udjEuV29ya2Zsb3dEZWNsYXJhdGlvblIJd29ya2Zsb3dzEjsKBGpvYnMYBiADKAsyJy5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5Kb2JEZWNsYXJhdGlvblIEam9icxJCCgdtZXRyaWNzGAcgASgLMiguc2VydmljZWJyaWRnZS5jb21tb24udjEuUmVzb3VyY2VNZXRyaWNzUgdtZXRyaWNzEk0KDnRyYW5zcG9ydF9tb2RlGAggASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVINdHJhbnNwb3J0TW9kZRISCgR6b25lGAkgASgJUgR6b25lIl4KEVJlY29uY2lsZVJlc3BvbnNlEiAKDGxlYXNlX3R0bF9tcxgBIAEoA1IKbGVhc2VUdGxNcxInCg9zZXJ2ZXJfcmV2aXNpb24YAiABKANSDnNlcnZlclJldmlzaW9uIt0BChdJc3N1ZUNlcnRpZmljYXRlUmVxdWVzdBIqCgxzZXJ2aWNlX25hbWUYASABKAlCB7pIBHICEAFSC3NlcnZpY2VOYW1lEigKC2luc3RhbmNlX2lkGAIgASgJQge6SARyAhABUgppbnN0YW5jZUlkEiAKB2Nzcl9wZW0YAyABKAlCB7pIBHICEAFSBmNzclBlbRIrChFhZHZlcnRpc2VfYWRkcmVzcxgEIAEoCVIQYWR2ZXJ0aXNlQWRkcmVzcxIdCgpleHRyYV9zYW5zGAUgAygJUglleHRyYVNhbnMiawoYSXNzdWVDZXJ0aWZpY2F0ZVJlc3BvbnNlEhkKCGNlcnRfcGVtGAEgASgJUgdjZXJ0UGVtEhUKBmNhX3BlbRgCIAEoCVIFY2FQZW0SHQoKZXhwaXJlc19hdBgDIAEoA1IJZXhwaXJlc0F0IvYBCg5QdWJsaXNoUmVxdWVzdBIdCgV0b3BpYxgBIAEoCUIHukgEcgIQAVIFdG9waWMSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBJUCgdoZWFkZXJzGAMgAygLMjouc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHVibGlzaFJlcXVlc3QuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEhkKCHRyYWNlX2lkGAQgASgJUgd0cmFjZUlkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIjAKD1B1Ymxpc2hSZXNwb25zZRIdCgptZXNzYWdlX2lkGAEgASgJUgltZXNzYWdlSWQiigEKElJ1bldvcmtmbG93UmVxdWVzdBIsCg13b3JrZmxvd19uYW1lGAEgASgJQge6SARyAhABUgx3b3JrZmxvd05hbWUSFAoFaW5wdXQYAiABKAxSBWlucHV0EhUKBnJ1bl9pZBgDIAEoCVIFcnVuSWQSGQoIdHJhY2VfaWQYBCABKAlSB3RyYWNlSWQiLAoTUnVuV29ya2Zsb3dSZXNwb25zZRIVCgZydW5faWQYASABKAlSBXJ1bklkIk8KFUNhbmNlbFdvcmtmbG93UmVxdWVzdBIeCgZydW5faWQYASABKAlCB7pIBHICEAFSBXJ1bklkEhYKBnJlYXNvbhgCIAEoCVIGcmVhc29uIjYKFkNhbmNlbFdvcmtmbG93UmVzcG9uc2USHAoJY2FuY2VsbGVkGAEgASgIUgljYW5jZWxsZWQixAEKEFByb3h5Q2FsbFJlcXVlc3QSLAoNZnVuY3Rpb25fbmFtZRgBIAEoCUIHukgEcgIQAVIMZnVuY3Rpb25OYW1lEhgKB3BheWxvYWQYAiABKAxSB3BheWxvYWQSGQoIdHJhY2VfaWQYAyABKAlSB3RyYWNlSWQSFwoHc3Bhbl9pZBgEIAEoCVIGc3BhbklkEhUKBnJ1bl9pZBgFIAEoCVIFcnVuSWQSHQoKdGltZW91dF9tcxgGIAEoBVIJdGltZW91dE1zIlsKEVByb3h5Q2FsbFJlc3BvbnNlEhgKB3N1Y2Nlc3MYASABKAhSB3N1Y2Nlc3MSFgoGb3V0cHV0GAIgASgMUgZvdXRwdXQSFAoFZXJyb3IYAyABKAlSBWVycm9yMtMFCgxDb250cm9sUGxhbmUSbgoJUmVjb25jaWxlEi8uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUmVjb25jaWxlUmVxdWVzdBowLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlJlY29uY2lsZVJlc3BvbnNlEoMBChBJc3N1ZUNlcnRpZmljYXRlEjYuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuSXNzdWVDZXJ0aWZpY2F0ZVJlcXVlc3QaNy5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5Jc3N1ZUNlcnRpZmljYXRlUmVzcG9uc2USaAoHUHVibGlzaBItLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlB1Ymxpc2hSZXF1ZXN0Gi4uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHVibGlzaFJlc3BvbnNlEnQKC1J1bldvcmtmbG93EjEuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUnVuV29ya2Zsb3dSZXF1ZXN0GjIuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUnVuV29ya2Zsb3dSZXNwb25zZRJ9Cg5DYW5jZWxXb3JrZmxvdxI0LnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLkNhbmNlbFdvcmtmbG93UmVxdWVzdBo1LnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLkNhbmNlbFdvcmtmbG93UmVzcG9uc2USbgoJUHJveHlDYWxsEi8uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHJveHlDYWxsUmVxdWVzdBowLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlBy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dWVzdC5IZWFkZXJzRW50cnlSB2hlYWRlcnMSGQoIdHJhY2VfaWQYBCABKAlSB3RyYWNlSWQaOgoMSGVhZGVyc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EhQKBXZhbHVlGAIgASgJUgV2YWx1ZToCOAEiMAoPUHVibGlzaFJlc3BvbnNlEh0KCm1lc3NhZ2VfaWQYASABKAlSCW1lc3NhZ2VJZCKBAQoSUnVuV29ya2Zsb3dSZXF1ZXN0EiMKDXdvcmtmbG93X25hbWUYASABKAlSDHdvcmtmbG93TmFtZRIUCgVpbnB1dBgCIAEoDFIFaW5wdXQSFQoGcnVuX2lkGAMgASgJUgVydW5JZBIZCgh0cmFjZV9pZBgEIAEoCVIHdHJhY2VJZCIsChNSdW5Xb3JrZmxvd1Jlc3BvbnNlEhUKBnJ1bl9pZBgBIAEoCVIFcnVuSWQiRgoVQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0EhUKBnJ1bl9pZBgBIAEoCVIFcnVuSWQSFgoGcmVhc29uGAIgASgJUgZyZWFzb24iNgoWQ2FuY2VsV29ya2Zsb3dSZXNwb25zZRIcCgljYW5jZWxsZWQYASABKAhSCWNhbmNlbGxlZCKQAQoTQXBwZW5kU3RyZWFtUmVxdWVzdBIVCgZydW5faWQYASABKAlSBXJ1bklkEhAKA2tleRgCIAEoCVIDa2V5Eh0KCmV2ZW50X3R5cGUYAyABKAlSCWV2ZW50VHlwZRISCgRkYXRhGAQgASgMUgRkYXRhEh0KCnJ1bl9zdGF0dXMYBSABKAlSCXJ1blN0YXR1cyImChRBcHBlbmRTdHJlYW1SZXNwb25zZRIOCgJvaxgBIAEoCFICb2siQwoPV2F0Y2hSdW5SZXF1ZXN0EhUKBnJ1bl9pZBgBIAEoCVIFcnVuSWQSGQoIZnJvbV9zZXEYAiABKANSB2Zyb21TZXEipQEKDlJ1blN0cmVhbUNodW5rEhAKA3NlcRgBIAEoA1IDc2VxEhAKA2tleRgCIAEoCVIDa2V5Eh0KCmV2ZW50X3R5cGUYAyABKAlSCWV2ZW50VHlwZRISCgRkYXRhGAQgASgMUgRkYXRhEh0KCnJ1bl9zdGF0dXMYBSABKAlSCXJ1blN0YXR1cxIdCgpjcmVhdGVkX2F0GAYgASgDUgljcmVhdGVkQXQysgQKCURhdGFQbGFuZRJiCgdQdWJsaXNoEiouc2VydmljZWJyaWRnZS5kYXRhcGxhbmUudjEuUHVibGlzaFJlcXVlc3QaKy5zZXJ2aWNlYnJpZGdlLmRhdGFwbGFuZS52MS5QdWJsaXNoUmVzcG9uc2USbgoLUnVuV29ya2Zsb3cSLi5zZXJ2aWNlYnJpZGdlLmRhdGFwbGFuZS52MS5SdW5Xb3JrZmxvd1JlcXVlc3QaLy5zZXJ2aWNlYnJpZGdlLmRhdGFwbGFuZS52MS5SdW5Xb3JrZmxvd1Jlc3BvbnNlEncKDkNhbmNlbFdvcmtmbG93EjEuc2VydmljZWJyaWRnZS5kYXRhcGxhbmUudjEuQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0GjIuc2VydmljZWJyaWRnZS5kYXRhcGxhbmUudjEuQ2FuY2VsV29ya2Zsb3dSZXNwb25zZRJxCgxBcHBlbmRTdHJlYW0SLy5zZXJ2aWNlYnJpZGdlLmRhdGFwbGFuZS52MS5BcHBlbmRTdHJlYW1SZXF1ZXN0GjAuc2VydmljZWJyaWRnZS5kYXRhcGxhbmUudjEuQXBwZW5kU3RyZWFtUmVzcG9uc2USZQoIV2F0Y2hSdW4SKy5zZXJ2aWNlYnJpZGdlLmRhdGFwbGFuZS52MS5XYXRjaFJ1blJlcXVlc3QaKi5zZXJ2aWNlYnJpZGdlLmRhdGFwbGFuZS52MS5SdW5TdHJlYW1DaHVuazABQklaR2dpdGh1Yi5jb20vc2VydmljZWJyaWRnZS9zZXJ2ZXItZ28vaW50ZXJuYWwvcGIvZGF0YXBsYW5lL3YxO2RhdGFwbGFuZXYxSqcQCgYSBAAARAEKCAoBDBIDAAASCggKAQISAwEAIwoICgEIEgMDAF4KCQoCCAsSAwMAXgoKCgIGABIEBQALAQoKCgMGAAESAwUIEQoLCgQGAAIAEgMGAkYKDAoFBgACAAESAwYGDQoMCgUGAAIAAhIDBg4cCgwKBQYAAgADEgMGNUQKCwoEBgACARIDBwJKCgwKBQYAAgEBEgMHBhEKDAoFBgACAQISAwcSJAoMCgUGAAIBAxIDBzVICgsKBAYAAgISAwgCTQoMCgUGAAICARIDCAYUCgwKBQYAAgICEgMIFSoKDAoFBgACAgMSAwg1SwoLCgQGAAIDEgMJAksKDAoFBgACAwESAwkG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CQIFARIDQwkTCgwKBQQJAgUDEgNDFhdiBnByb3RvMwrvJQoacmVnaXN0cnkvdjEvcmVnaXN0cnkucHJvdG8SGXNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEaG2J1Zi92YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoVY29tbW9uL3YxL3R5cGVzLnByb3RvIoMBChBTdWJzY3JpYmVSZXF1ZXN0EiUKDmZ1bmN0aW9uX25hbWVzGAEgAygJUg1mdW5jdGlvbk5hbWVzEiUKDnJlc3BvbnNlX25vbmNlGAIgASgJUg1yZXNwb25zZU5vbmNlEiEKDGVycm9yX2RldGFpbBgDIAEoCVILZXJyb3JEZXRhaWwi0gEKEVN1YnNjcmliZVJlc3BvbnNlEhgKB3ZlcnNpb24YASABKAlSB3ZlcnNpb24SFAoFbm9uY2UYAiABKAlSBW5vbmNlEkEKBGZ1bGwYAyABKAsyKy5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlJlZ2lzdHJ5U25hcHNob3RIAFIEZnVsbBJACgVkZWx0YRgEIAEoCzIoLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuUmVnaXN0cnlEZWx0YUgAUgVkZWx0YUIICgZ1cGRhdGUi2AEKEFJlZ2lzdHJ5U25hcHNob3QSWAoJZnVuY3Rpb25zGAEgAygLMjouc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5SZWdpc3RyeVNuYXBzaG90LkZ1bmN0aW9uc0VudHJ5UglmdW5jdGlvbnMaagoORnVuY3Rpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSQgoFdmFsdWUYAiABKAsyLC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkZ1bmN0aW9uRW5kcG9pbnRzUgV2YWx1ZToCOAEi5gEKDVJlZ2lzdHJ5RGVsdGESTwoHdXBzZXJ0cxgBIAMoCzI1LnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuUmVnaXN0cnlEZWx0YS5VcHNlcnRzRW50cnlSB3Vwc2VydHMSGgoIcmVtb3ZhbHMYAiADKAlSCHJlbW92YWxzGmgKDFVwc2VydHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJCCgV2YWx1ZRgCIAEoCzIsLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuRnVuY3Rpb25FbmRwb2ludHNSBXZhbHVlOgI4ASJcChFGdW5jdGlvbkVuZHBvaW50cxJHCgllbmRwb2ludHMYASADKAsyKS5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLldvcmtlckVuZHBvaW50UgllbmRwb2ludHMisQMKDldvcmtlckVuZHBvaW50EhoKCGVuZHBvaW50GAEgASgJUghlbmRwb2ludBJNCg50cmFuc3BvcnRfbW9kZRgCIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSDXRyYW5zcG9ydE1vZGUSHwoLaW5zdGFuY2VfaWQYAyABKAlSCmluc3RhbmNlSWQSFgoGd2VpZ2h0GAQgASgFUgZ3ZWlnaHQSIQoMc2VydmljZV9uYW1lGAUgASgJUgtzZXJ2aWNlTmFtZRISCgR6b25lGAYgASgJUgR6b25lEioKEWlucHV0X3NjaGVtYV9qc29uGAogASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAsgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgMIAMoCVIOYWxsb3dlZENhbGxlcnMSQQoGaGVhbHRoGBQgASgLMikuc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5FbmRwb2ludEhlYWx0aFIGaGVhbHRoIrkCCg5FbmRwb2ludEhlYWx0aBIcCglyZWFjaGFibGUYASABKAhSCXJlYWNoYWJsZRIkCg5sYXRlbmN5X3A1MF9tcxgCIAEoBVIMbGF0ZW5jeVA1ME1zEiQKDmxhdGVuY3lfcDk5X21zGAMgASgFUgxsYXRlbmN5UDk5TXMSHQoKZXJyb3JfcmF0ZRgEIAEoAlIJZXJyb3JSYXRlEiIKDWxhc3RfY2hlY2tfYXQYBSABKANSC2xhc3RDaGVja0F0EjEKFGNvbnNlY3V0aXZlX2ZhaWx1cmVzGAYgASgFUhNjb25zZWN1dGl2ZUZhaWx1cmVzEkcKCGNiX3N0YXRlGAcgASgOMiwuc2VydmljZWJyaWRnZS5jb21tb24udjEuQ2lyY3VpdEJyZWFrZXJTdGF0ZVIHY2JTdGF0ZSI9Cg1Mb29rdXBSZXF1ZXN0EiwKDWZ1bmN0aW9uX25hbWUYASABKAlCB7pIBHICEAFSDGZ1bmN0aW9uTmFtZSKDAgoOTG9va3VwUmVzcG9uc2USJQoOY2Fub25pY2FsX25hbWUYASABKAlSDWNhbm9uaWNhbE5hbWUSRwoJZW5kcG9pbnRzGAIgAygLMikuc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5Xb3JrZXJFbmRwb2ludFIJZW5kcG9pbnRzEioKEWlucHV0X3NjaGVtYV9qc29uGAMgASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAQgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgFIAMoCVIOYWxsb3dlZENhbGxlcnMy3AEKD1JlZ2lzdHJ5U2VydmljZRJqCglTdWJzY3JpYmUSKy5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlN1YnNjcmliZVJlcXVlc3QaLC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlN1YnNjcmliZVJlc3BvbnNlKAEwARJdCgZMb29rdXASKC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkxvb2t1cFJlcXVlc3QaKS5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkxvb2t1cFJlc3BvbnNlQkdaRWdpdGh1Yi5jb20vc2VydmljZWJyaWRnZS9zZXJ2ZXItZ28vaW50ZXJuYWwvcGIvcmVnaXN0cnkvdjE7cmVnaXN0cnl2MUqfEwoGEgQAAEsBCggKAQwSAwAAEgoICgECEgMBACIKCAoBCBIDAwBcCgkKAggLEgMDAFwKCQoCAwASAwUAJQoJCgIDARIDBgAfCgoKAgYAEgQIAAsBCgoKAwYAARIDCAgXCgsKBAYAAgASAwkCTAoMCgUGAAIAARIDCQYPCgwKBQYAAgAFEgMJEBYKDAoFBgACAAISAwkXJwoMCgUGAAIABhIDCTI4CgwKBQYAAgADEgMJOUoKCwoEBgACARIDCgI1CgwKBQYAAgEBEgMKBgwKDAoFBgACAQISAwoNGgoMCgUGAAIBAxIDCiUzCgoKAgQAEgQNABEBCgoKAwQAARIDDQgYCgsKBAQAAgASAw4CJQoMCgUEAAIABBIDDgIKCgwKBQQA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GBUgASgLMiMuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlBvbmdGcmFtZUgAUgRwb25nElAKDmNvbW1hbmRfcmVzdWx0GB4gASgLMicuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkNvbW1hbmRSZXN1bHRIAFINY29tbWFuZFJlc3VsdBJICgl0ZWxlbWV0cnkYHyABKAsyKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuVGVsZW1ldHJ5RnJhbWVIAFIJdGVsZW1ldHJ5ElIKDXN0cmVhbV9hcHBlbmQYICABKAsyKy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuU3RyZWFtQXBwZW5kRnJhbWVIAFIMc3RyZWFtQXBwZW5kElIKDXdvcmtlcl9zdGF0dXMYISABKAsyKy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuV29ya2VyU3RhdHVzRnJhbWVIAFIMd29ya2VyU3RhdHVzElMKD3Bvc2l0aW9uX3VwZGF0ZRgiIAEoCzIoLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Qb3NpdGlvblVwZGF0ZUgAUg5wb3NpdGlvblVwZGF0ZRJHCghkaXNwYXRjaBgoIAEoCzIpLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5EaXNwYXRjaENvbW1hbmRIAFIIZGlzcGF0Y2gSRwoLY29uZmlnX3B1c2gYKSABKAsyJC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuQ29uZmlnUHVzaEgAUgpjb25maWdQdXNoEkoKDHBlcm1pdF9ncmFudBgyIAEoCzIlLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5QZXJtaXRHcmFudEgAUgtwZXJtaXRHcmFudBJQCg5wZXJtaXRfcmVsZWFzZRgzIAEoCzInLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5QZXJtaXRSZWxlYXNlSABSDXBlcm1pdFJlbGVhc2USTgoLZmxvd191cGRhdGUYNCABKAsyKy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRmxvd0NvbnRyb2xVcGRhdGVIAFIKZmxvd1VwZGF0ZRI8CgVlcnJvchhjIAEoCzIkLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5FcnJvckZyYW1lSABSBWVycm9yQgkKB3BheWxvYWQi9wMKBUhlbGxvEkMKCGlkZW50aXR5GAEgASgLMicuc2VydmljZWJyaWRnZS5jb21tb24udjEuV29ya2VySWRlbnRpdHlSCGlkZW50aXR5EiEKDG1heF9pbmZsaWdodBgCIAEoBVILbWF4SW5mbGlnaHQSIQoMbWluX2luZmxpZ2h0GAMgASgFUgttaW5JbmZsaWdodBIhCgxyZXN1bWVfdG9rZW4YBCABKAlSC3Jlc3VtZVRva2VuEhQKBWVwb2NoGAUgASgEUgVlcG9jaBIqChFsYXN0X3JlY2VpdmVkX3NlcRgGIAEoBFIPbGFzdFJlY2VpdmVkU2VxEiIKDWxhc3Rfc2VudF9zZXEYByABKARSC2xhc3RTZW50U2VxEjIKFWNvbXBsZXRlZF9jb21tYW5kX2lkcxgIIAMoCVITY29tcGxldGVkQ29tbWFuZElkcxIfCgtzZGtfdmVyc2lvbhgKIAEoCVIKc2RrVmVyc2lvbhIiCgxjYXBhYmlsaXRpZXMYCyADKAlSDGNhcGFiaWxpdGllcxISCgR6b25lGAwgASgJUgR6b25lEk0KDnRyYW5zcG9ydF9tb2RlGA0gASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVINdHJhbnNwb3J0TW9kZSLsBAoISGVsbG9BY2sSHQoKc2Vzc2lvbl9pZBgBIAEoCVIJc2Vzc2lvbklkEiEKDHJlc3VtZV90b2tlbhgCIAEoCVILcmVzdW1lVG9rZW4SFAoFZXBvY2gYAyABKARSBWVwb2NoEhgKB3Jlc3VtZWQYBCABKAhSB3Jlc3VtZWQSJgoPcmVzdW1lX2Zyb21fc2VxGAUgASgEUg1yZXN1bWVGcm9tU2VxEisKEXJlcGxheWVkX2NvbW1hbmRzGAYgASgFUhByZXBsYXllZENvbW1hbmRzEi0KEnJlY29uY2lsZWRfcmVzdWx0cxgHIAEoBVIRcmVjb25jaWxlZFJlc3VsdHMSMgoVaGVhcnRiZWF0X2ludGVydmFsX21zGAogASgFUhNoZWFydGJlYXRJbnRlcnZhbE1zEjAKFGhlYXJ0YmVhdF90aW1lb3V0X21zGAsgASgFUhJoZWFydGJlYXRUaW1lb3V0TXMSJwoPaW5pdGlhbF9wZXJtaXRzGAwgASgFUg5pbml0aWFsUGVybWl0cxIfCgttYXhfcGVybWl0cxgNIAEoBVIKbWF4UGVybWl0cxJgChhlZmZlY3RpdmVfdHJhbnNwb3J0X21vZGUYFCABKA4yJi5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5UcmFuc3BvcnRNb2RlUhZlZmZlY3RpdmVUcmFuc3BvcnRNb2RlElgKEnJlc3VtZV9mYWlsX3JlYXNvbhgeIAEoDjIqLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5SZXN1bWVGYWlsUmVhc29uUhByZXN1bWVGYWlsUmVhc29uInYKC0RyYWluU2lnbmFsEhYKBnJlYXNvbhgBIAEoCVIGcmVhc29uEh8KC2RlYWRsaW5lX21zGAIgASgFUgpkZWFkbGluZU1zEi4KE3BlbmRpbmdfY29tbWFuZF9pZHMYAyADKAlSEXBlbmRpbmdDb21tYW5kSWRzImAKDEdvYXdheVNpZ25hbBI4CgRjb2RlGAEgASgOMiQuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkdvYXdheUNvZGVSBGNvZGUSFgoGcmVhc29uGAIgASgJUgZyZWFzb24iLgoJUGluZ0ZyYW1lEiEKDHRpbWVzdGFtcF9tcxgBIAEoA1ILdGltZXN0YW1wTXMiZwoJUG9uZ0ZyYW1lEioKEWVjaG9fdGltZXN0YW1wX21zGAEgASgDUg9lY2hvVGltZXN0YW1wTXMSLgoTc2VydmVyX3RpbWVzdGFtcF9tcxgCIAEoA1IRc2VydmVyVGltZXN0YW1wTXMi8wEKD0Rpc3BhdGNoQ29tbWFuZBIdCgpjb21tYW5kX2lkGAEgASgJUgljb21tYW5kSWQSKAoQZGVhZGxpbmVfdW5peF9tcxgCIAEoA1IOZGVhZGxpbmVVbml4TXMSGwoJaXNfcmVwbGF5GAMgASgIUghpc1JlcGxheRI1CgNycGMYCiABKAsyIS5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUnBjVGFza0gAUgNycGMSOwoFZXZlbnQYCyABKAsyIy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRXZlbnRUYXNrSABSBWV2ZW50QgYKBHRhc2sipAEKB1JwY1Rhc2sSDgoCZm4YASABKAlSAmZuEhgKB3BheWxvYWQYAiABKAxSB3BheWxvYWQSGQoIdHJhY2VfaWQYAyABKAlSB3RyYWNlSWQSFwoHc3Bhbl9pZBgEIAEoCVIGc3BhbklkEhUKBnJ1bl9pZBgFIAEoCVIFcnVuSWQSJAoOcGFyZW50X3NwYW5faWQYBiABKAlSDHBhcmVudFNwYW5JZCLzAgoJRXZlbnRUYXNrEh0KCm1lc3NhZ2VfaWQYASABKAlSCW1lc3NhZ2VJZBIdCgpncm91cF9uYW1lGAIgASgJUglncm91cE5hbWUSFAoFdG9waWMYAyABKAlSBXRvcGljEhgKB3BheWxvYWQYBCABKAxSB3BheWxvYWQSSgoHaGVhZGVycxgFIAMoCzIwLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5FdmVudFRhc2suSGVhZGVyc0VudHJ5UgdoZWFkZXJzEhkKCHRyYWNlX2lkGAYgASgJUgd0cmFjZUlkEiQKDnBhcmVudF9zcGFuX2lkGAcgASgJUgxwYXJlbnRTcGFuSWQSGAoHYXR0ZW1wdBgIIAEoBVIHYXR0ZW1wdBIVCgZydW5faWQYCSABKAlSBXJ1bklkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIvIBCg1Db21tYW5kUmVzdWx0Eh0KCmNvbW1hbmRfaWQYASABKAlSCWNvbW1hbmRJZBIYCgdzdWNjZXNzGAIgASgIUgdzdWNjZXNzEhYKBm91dHB1dBgDIAEoDFIGb3V0cHV0EhQKBWVycm9yGAQgASgJUgVlcnJvchIQCgNhY2sYBSABKAhSA2FjaxIkCg5yZXRyeV9hZnRlcl9tcxgGIAEoBVIMcmV0cnlBZnRlck1zEiMKDXJlamVjdF9yZWFzb24YByABKAlSDHJlamVjdFJlYXNvbhIdCgpyZXN1bHRfc2VxGAggASgEUglyZXN1bHRTZXEigwEKDlRlbGVtZXRyeUZyYW1lEjkKBXNwYW5zGAEgAygLMiMuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlNwYW5FdmVudFIFc3BhbnMSNgoEbG9ncxgCIAMoCzIiLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Mb2dFbnRyeVIEbG9ncyLHAwoJU3BhbkV2ZW50EjwKBGtpbmQYASABKA4yKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuU3BhbkV2ZW50LktpbmRSBGtpbmQSGQoIdHJhY2VfaWQYAiABKAlSB3RyYWNlSWQSFwoHc3Bhbl9pZBgDIAEoCVIGc3BhbklkEiQKDnBhcmVudF9zcGFuX2lkGAQgASgJUgxwYXJlbnRTcGFuSWQSDgoCZm4YBSABKAlSAmZuEh0KCnN0YXJ0ZWRfYXQYBiABKANSCXN0YXJ0ZWRBdBIfCgtkdXJhdGlvbl9tcxgHIAEoA1IKZHVyYXRpb25NcxIYCgdzdWNjZXNzGAggASgIUgdzdWNjZXNzEhQKBWVycm9yGAkgASgJUgVlcnJvchIUCgVpbnB1dBgKIAEoDFIFaW5wdXQSFgoGb3V0cHV0GAsgASgMUgZvdXRwdXQSGAoHYXR0ZW1wdBgMIAEoBVIHYXR0ZW1wdBIbCglzcGFuX3R5cGUYDSABKAlSCHNwYW5UeXBlIj0KBEtpbmQSFAoQS0lORF9VTlNQRUNJRklFRBAAEg4KCktJTkRfU1RBUlQQARIPCgtLSU5EX0ZJTklTSBACIugCCghMb2dFbnRyeRIZCgh0cmFjZV9pZBgBIAEoCVIHdHJhY2VJZBIXCgdzcGFuX2lkGAIgASgJUgZzcGFuSWQSIQoMc2VydmljZV9uYW1lGAMgASgJUgtzZXJ2aWNlTmFtZRIUCgVsZXZlbBgEIAEoCVIFbGV2ZWwSGAoHbWVzc2FnZRgFIAEoCVIHbWVzc2FnZRIhCgx0aW1lc3RhbXBfbnMYBiABKANSC3RpbWVzdGFtcE5zElIKCmF0dHJpYnV0ZXMYByADKAsyMi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuTG9nRW50cnkuQXR0cmlidXRlc0VudHJ5UgphdHRyaWJ1dGVzEh8KC2luc3RhbmNlX2lkGAggASgJUgppbnN0YW5jZUlkGj0KD0F0dHJpYnV0ZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIo4BChFTdHJlYW1BcHBlbmRGcmFtZRIVCgZydW5faWQYASABKAlSBXJ1bklkEhAKA2tleRgCIAEoCVIDa2V5Eh0KCmV2ZW50X3R5cGUYAyABKAlSCWV2ZW50VHlwZRISCgRkYXRhGAQgASgMUgRkYXRhEh0KCnJ1bl9zdGF0dXMYBSABKAlSCXJ1blN0YXR1cyLDAQoRV29ya2VyU3RhdHVzRnJhbWUSJQoOZnVuY3Rpb25fbmFtZXMYASADKAlSDWZ1bmN0aW9uTmFtZXMSHwoLZ3JvdXBfbmFtZXMYAiADKAlSCmdyb3VwTmFtZXMSGgoIZW5kcG9pbnQYAyABKAlSCGVuZHBvaW50Eh8KC2NwdV9wZXJjZW50GAQgASgCUgpjcHVQZXJjZW50EhUKBnJhbV9tYhgFIAEoBVIFcmFtTWISEgoEem9uZRgGIAEoCVIEem9uZSJhCgtQZXJtaXRHcmFudBItChJhZGRpdGlvbmFsX3Blcm1pdHMYASABKAVSEWFkZGl0aW9uYWxQZXJtaXRzEiMKDXRvdGFsX3BlbmRpbmcYAiABKAVSDHRvdGFsUGVuZGluZyIrCg1QZXJtaXRSZWxlYXNlEhoKCHJlbGVhc2VkGAEgASgFUghyZWxlYXNlZCJTChFGbG93Q29udHJvbFVwZGF0ZRImCg9uZXdfd2luZG93X3NpemUYASABKAVSDW5ld1dpbmRvd1NpemUSFgoGcmVhc29uGAIgASgJUgZyZWFzb24iPAoOUG9zaXRpb25VcGRhdGUSKgoRbGFzdF9yZWNlaXZlZF9zZXEYASABKARSD2xhc3RSZWNlaXZlZFNlcSJiCgpDb25maWdQdXNoElQKEHRyYW5zcG9ydF9jb25maWcYASABKAsyKS5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuVHJhbnNwb3J0Q29uZmlnUg90cmFuc3BvcnRDb25maWci0QUKD1RyYW5zcG9ydENvbmZpZxJJCgxkZWZhdWx0X21vZGUYASABKA4yJi5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5UcmFuc3BvcnRNb2RlUgtkZWZhdWx0TW9kZRJsChFzZXJ2aWNlX292ZXJyaWRlcxgCIAMoCzI/LnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5UcmFuc3BvcnRDb25maWcuU2VydmljZU92ZXJyaWRlc0VudHJ5UhBzZXJ2aWNlT3ZlcnJpZGVzEm8KEmZ1bmN0aW9uX292ZXJyaWRlcxgDIAMoCzJALnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5UcmFuc3BvcnRDb25maWcuRnVuY3Rpb25PdmVycmlkZXNFbnRyeVIRZnVuY3Rpb25PdmVycmlkZXMSZgoXZGVmYXVsdF9jaXJjdWl0X2JyZWFrZXIYBCABKAsyLi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuQ2lyY3VpdEJyZWFrZXJDb25maWdSFWRlZmF1bHRDaXJjdWl0QnJlYWtlchI4CgR6b25lGAUgASgLMiQuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlpvbmVDb25maWdSBHpvbmUadwoVU2VydmljZU92ZXJyaWRlc0VudHJ5EhAKA2tleRgBIAEoCVIDa2V5EkgKBXZhbHVlGAIgASgLMjIuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlNlcnZpY2VUcmFuc3BvcnRPdmVycmlkZVIFdmFsdWU6AjgBGnkKFkZ1bmN0aW9uT3ZlcnJpZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSQoFdmFsdWUYAiABKAsyMy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRnVuY3Rpb25UcmFuc3BvcnRPdmVycmlkZVIFdmFsdWU6AjgBIvkCChhTZXJ2aWNlVHJhbnNwb3J0T3ZlcnJpZGUSOgoEbW9kZRgBIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSBG1vZGUSUQoPZmFsbGJhY2tfcG9saWN5GAIgASgOMiguc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkZhbGxiYWNrUG9saWN5Ug5mYWxsYmFja1BvbGljeRIqChFkaXJlY3RfdGltZW91dF9tcxgDIAEoBVIPZGlyZWN0VGltZW91dE1zEkkKCWxiX3BvbGljeRgEIAEoDjIsLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLkxvYWRCYWxhbmNpbmdQb2xpY3lSCGxiUG9saWN5ElcKD2NpcmN1aXRfYnJlYWtlchgFIAEoCzIuLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5DaXJjdWl0QnJlYWtlckNvbmZpZ1IOY2lyY3VpdEJyZWFrZXIiyQEKGUZ1bmN0aW9uVHJhbnNwb3J0T3ZlcnJpZGUSOgoEbW9kZRgBIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSBG1vZGUSUQoPZmFsbGJhY2tfcG9saWN5GAIgASgOMiguc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkZhbGxiYWNrUG9saWN5Ug5mYWxsYmFja1BvbGljeRIdCgp0aW1lb3V0X21zGAMgASgFUgl0aW1lb3V0TXMizwEKFENpcmN1aXRCcmVha2VyQ29uZmlnEisKEWZhaWx1cmVfdGhyZXNob2xkGAEgASgFUhBmYWlsdXJlVGhyZXNob2xkEisKEXN1Y2Nlc3NfdGhyZXNob2xkGAIgASgFUhBzdWNjZXNzVGhyZXNob2xkEigKEG9wZW5fZHVyYXRpb25fbXMYAyABKAVSDm9wZW5EdXJhdGlvbk1zEjMKFmhhbGZfb3Blbl9tYXhfcmVxdWVzdHMYBCABKAVSE2hhbGZPcGVuTWF4UmVxdWVzdHMieAoKWm9uZUNvbmZpZxIdCgpsb2NhbF96b25lGAEgASgJUglsb2NhbFpvbmUSHwoLcHJlZmVyX3pvbmUYAiABKAhSCnByZWZlclpvbmUSKgoRem9uZV93ZWlnaHRfYm9vc3QYAyABKAVSD3pvbmVXZWlnaHRCb29zdCJ+CgpFcnJvckZyYW1lEhIKBGNvZGUYASABKAVSBGNvZGUSGAoHbWVzc2FnZRgCIAEoCVIHbWVzc2FnZRIcCglyZXRyeWFibGUYAyABKAhSCXJldHJ5YWJsZRIkCg5yZXRyeV9hZnRlcl9tcxgEIAEoBVIMcmV0cnlBZnRlck1zKuwBChBSZXN1bWVGYWlsUmVhc29uEhsKF1JFU1VNRV9GQUlMX1VOU1BFQ0lGSUVEEAASHQoZUkVTVU1FX0ZBSUxfVE9LRU5fRVhQSVJFRBABEh0KGVJFU1VNRV9GQUlMX1RPS0VOX0lOVkFMSUQQAhIdChlSRVNVTUVfRkFJTF9HQVBfVE9PX0xBUkdFEAMSHgoaUkVTVU1FX0ZBSUxfRVBPQ0hfTUlTTUFUQ0gQBBIeChpSRVNVTUVfRkFJTF9TRVNTSU9OX0ZFTkNFRBAFEh4KGlJFU1VNRV9GQUlMX1NFUlZFUl9SRVNUQVJUEAYqgAEKCkdvYXdheUNvZGUSEgoOR09BV0FZX1VOS05PV04QABIcChhHT0FXQVlfR1JBQ0VGVUxf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DQoFBBoCAwESBJICCRcKDQoFBBoCAwMSBJICGhtiBnByb3RvMwr+FQoWd29ya2VyL3YxL3dvcmtlci5wcm90bxIXc2VydmljZWJyaWRnZS53b3JrZXIudjEaG2J1Zi92YWxpZGF0ZS92YWxpZGF0ZS5wcm90byLIAQoNSGFuZGxlUmVxdWVzdBIsCg1mdW5jdGlvbl9uYW1lGAEgASgJQge6SARyAhABUgxmdW5jdGlvbk5hbWUSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBIZCgh0cmFjZV9pZBgDIAEoCVIHdHJhY2VJZBIXCgdzcGFuX2lkGAQgASgJUgZzcGFuSWQSFQoGcnVuX2lkGAUgASgJUgVydW5JZBIkCg5wYXJlbnRfc3Bhbl9pZBgGIAEoCVIMcGFyZW50U3BhbklkIlgKDkhhbmRsZVJlc3BvbnNlEhgKB3N1Y2Nlc3MYASABKAhSB3N1Y2Nlc3MSFgoGb3V0cHV0GAIgASgMUgZvdXRwdXQSFAoFZXJyb3IYAyABKAlSBWVycm9yIooDCg5EZWxpdmVyUmVxdWVzdBImCgpncm91cF9uYW1lGAEgASgJQge6SARyAhABUglncm91cE5hbWUSHQoFdG9waWMYAiABKAlCB7pIBHICEAFSBXRvcGljEiYKCm1lc3NhZ2VfaWQYAyABKAlCB7pIBHICEAFSCW1lc3NhZ2VJZBIYCgdhdHRlbXB0GAQgASgFUgdhdHRlbXB0EhgKB3BheWxvYWQYBSABKAxSB3BheWxvYWQSTgoHaGVhZGVycxgGIAMoCzI0LnNlcnZpY2VicmlkZ2Uud29ya2VyLnYxLkRlbGl2ZXJSZXF1ZXN0LkhlYWRlcnNFbnRyeVIHaGVhZGVycxIZCgh0cmFjZV9pZBgHIAEoCVIHdHJhY2VJZBIXCgdzcGFuX2lkGAggASgJUgZzcGFuSWQSFQoGcnVuX2lkGAkgASgJUgVydW5JZBo6CgxIZWFkZXJzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASKEAQoPRGVsaXZlclJlc3BvbnNlEhAKA2FjaxgBIAEoCFIDYWNrEiMKDXJlamVjdF9yZWFzb24YAiABKAlSDHJlamVjdFJlYXNvbhIkCg5yZXRyeV9hZnRlcl9t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";
13
+ var DESCRIPTOR_SET_BASE64 = "ConaBAogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiLKAQoRRmlsZURlc2NyaXB0b3JTZXQSOAoEZmlsZRgBIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvUgRmaWxlKnsIgOzK/wEQgezK/wEabRJrCIDsyv8BEjQuYnVmLmRlc2NyaXB0b3IudjEuYnVmX2ZpbGVfZGVzY3JpcHRvcl9zZXRfZXh0ZW5zaW9uGi0uYnVmLmRlc2NyaXB0b3IudjEuRmlsZURlc2NyaXB0b3JTZXRFeHRlbnNpb24ixQUKE0ZpbGVEZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIYCgdwYWNrYWdlGAIgASgJUgdwYWNrYWdlEh4KCmRlcGVuZGVuY3kYAyADKAlSCmRlcGVuZGVuY3kSKwoRcHVibGljX2RlcGVuZGVuY3kYCiADKAVSEHB1YmxpY0RlcGVuZGVuY3kSJwoPd2Vha19kZXBlbmRlbmN5GAsgAygFUg53ZWFrRGVwZW5kZW5jeRIrChFvcHRpb25fZGVwZW5kZW5jeRgPIAMoCVIQb3B0aW9uRGVwZW5kZW5jeRJDCgxtZXNzYWdlX3R5cGUYBCADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgttZXNzYWdlVHlwZRJBCgllbnVtX3R5cGUYBSADKAsyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1IIZW51bVR5cGUSQQoHc2VydmljZRgGIAMoCzInLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvUgdzZXJ2aWNlEkMKCWV4dGVuc2lvbhgHIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IJZXh0ZW5zaW9uEjYKB29wdGlvbnMYCCABKAsyHC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNSB29wdGlvbnMSSQoQc291cmNlX2NvZGVfaW5mbxgJIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1IOc291cmNlQ29kZUluZm8SFgoGc3ludGF4GAwgASgJUgZzeW50YXgSMgoHZWRpdGlvbhgOIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUgdlZGl0aW9uIvwGCg9EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI7CgVmaWVsZBgCIAMoCzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1IFZmllbGQSQwoJZXh0ZW5zaW9uGAYgAygLMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvUglleHRlbnNpb24SQQoLbmVzdGVkX3R5cGUYAyADKAsyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvUgpuZXN0ZWRUeXBlEkEKCWVudW1fdHlwZRgEIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvUghlbnVtVHlwZRJYCg9leHRlbnNpb25fcmFuZ2UYBSADKAsyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlUg5leHRlbnNpb25SYW5nZRJECgpvbmVvZl9kZWNsGAggAygLMiUuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvUglvbmVvZkRlY2wSOQoHb3B0aW9ucxgHIAEoCzIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1IHb3B0aW9ucxJVCg5yZXNlcnZlZF9yYW5nZRgJIAMoCzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAogAygJUgxyZXNlcnZlZE5hbWUSQQoKdmlzaWJpbGl0eRgLIAEoDjIhLmdvb2dsZS5wcm90b2J1Zi5TeW1ib2xWaXNpYmlsaXR5Ugp2aXNpYmlsaXR5GnoKDkV4dGVuc2lvblJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZBJACgdvcHRpb25zGAMgASgLMiYuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9uc1IHb3B0aW9ucxo3Cg1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCLMBAoVRXh0ZW5zaW9uUmFuZ2VPcHRpb25zElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uElkKC2RlY2xhcmF0aW9uGAIgAygLMjIuZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbkIDiAECUgtkZWNsYXJhdGlvbhI3CghmZWF0dXJlcxgyIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UghmZWF0dXJlcxJtCgx2ZXJpZmljYXRpb24YAyABKA4yOC5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlOgpVTlZFUklGSUVEQgOIAQJSDHZlcmlmaWNhdGlvbhqUAQoLRGVjbGFyYXRpb24SFgoGbnVtYmVyGAEgASgFUgZudW1iZXISGwoJZnVsbF9uYW1lGAIgASgJUghmdWxsTmFtZRISCgR0eXBlGAMgASgJUgR0eXBlEhoKCHJlc2VydmVkGAUgASgIUghyZXNlcnZlZBIaCghyZXBlYXRlZBgGIAEoCFIIcmVwZWF0ZWRKBAgEEAUiNAoRVmVyaWZpY2F0aW9uU3RhdGUSDwoLREVDTEFSQVRJT04QABIOCgpVTlZFUklGSUVEEAEqCQjoBxCAgICAAiLBBgoURmllbGREZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRIWCgZudW1iZXIYAyABKAVSBm51bWJlchJBCgVsYWJlbBgEIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbFIFbGFiZWwSPgoEdHlwZRgFIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgR0eXBlEhsKCXR5cGVfbmFtZRgGIAEoCVIIdHlwZU5hbWUSGgoIZXh0ZW5kZWUYAiABKAlSCGV4dGVuZGVlEiMKDWRlZmF1bHRfdmFsdWUYByABKAlSDGRlZmF1bHRWYWx1ZRIfCgtvbmVvZl9pbmRleBgJIAEoBVIKb25lb2ZJbmRleBIbCglqc29uX25hbWUYCiABKAlSCGpzb25OYW1lEjcKB29wdGlvbnMYCCABKAsyHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zUgdvcHRpb25zEicKD3Byb3RvM19vcHRpb25hbBgRIAEoCFIOcHJvdG8zT3B0aW9uYWwitgIKBFR5cGUSDwoLVFlQRV9ET1VCTEUQARIOCgpUWVBFX0ZMT0FUEAISDgoKVFlQRV9JTlQ2NBADEg8KC1RZUEVfVUlOVDY0EAQSDgoKVFlQRV9JTlQzMhAFEhAKDFRZUEVfRklYRUQ2NBAGEhAKDFRZUEVfRklYRUQzMhAHEg0KCVRZUEVfQk9PTBAIEg8KC1RZUEVfU1RSSU5HEAkSDgoKVFlQRV9HUk9VUBAKEhAKDFRZUEVfTUVTU0FHRRALEg4KClRZUEVfQllURVMQDBIPCgtUWVBFX1VJTlQzMhANEg0KCVRZUEVfRU5VTRAOEhEKDVRZUEVfU0ZJWEVEMzIQDxIRCg1UWVBFX1NGSVhFRDY0EBASDwoLVFlQRV9TSU5UMzIQERIPCgtUWVBFX1NJTlQ2NBASIkMKBUxhYmVsEhIKDkxBQkVMX09QVElPTkFMEAESEgoOTEFCRUxfUkVQRUFURUQQAxISCg5MQUJFTF9SRVFVSVJFRBACImMKFE9uZW9mRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSNwoHb3B0aW9ucxgCIAEoCzIdLmdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnNSB29wdGlvbnMipgMKE0VudW1EZXNjcmlwdG9yUHJvdG8SEgoEbmFtZRgBIAEoCVIEbmFtZRI/CgV2YWx1ZRgCIAMoCzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9SBXZhbHVlEjYKB29wdGlvbnMYAyABKAsyHC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNSB29wdGlvbnMSXQoOcmVzZXJ2ZWRfcmFuZ2UYBCADKAsyNi5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5FbnVtUmVzZXJ2ZWRSYW5nZVINcmVzZXJ2ZWRSYW5nZRIjCg1yZXNlcnZlZF9uYW1lGAUgAygJUgxyZXNlcnZlZE5hbWUSQQoKdmlzaWJpbGl0eRgGIAEoDjIhLmdvb2dsZS5wcm90b2J1Zi5TeW1ib2xWaXNpYmlsaXR5Ugp2aXNpYmlsaXR5GjsKEUVudW1SZXNlcnZlZFJhbmdlEhQKBXN0YXJ0GAEgASgFUgVzdGFydBIQCgNlbmQYAiABKAVSA2VuZCKDAQoYRW51bVZhbHVlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSFgoGbnVtYmVyGAIgASgFUgZudW1iZXISOwoHb3B0aW9ucxgDIAEoCzIhLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zUgdvcHRpb25zIqcBChZTZXJ2aWNlRGVzY3JpcHRvclByb3RvEhIKBG5hbWUYASABKAlSBG5hbWUSPgoGbWV0aG9kGAIgAygLMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1IGbWV0aG9kEjkKB29wdGlvbnMYAyABKAsyHy5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNSB29wdGlvbnMiiQIKFU1ldGhvZERlc2NyaXB0b3JQcm90bxISCgRuYW1lGAEgASgJUgRuYW1lEh0KCmlucHV0X3R5cGUYAiABKAlSCWlucHV0VHlwZRIfCgtvdXRwdXRfdHlwZRgDIAEoCVIKb3V0cHV0VHlwZRI4CgdvcHRpb25zGAQgASgLMh4uZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNSB29wdGlvbnMSMAoQY2xpZW50X3N0cmVhbWluZxgFIAEoCDoFZmFsc2VSD2NsaWVudFN0cmVhbWluZxIwChBzZXJ2ZXJfc3RyZWFtaW5nGAYgASgIOgVmYWxzZVIPc2VydmVyU3RyZWFtaW5nIq0JCgtGaWxlT3B0aW9ucxIhCgxqYXZhX3BhY2thZ2UYASABKAlSC2phdmFQYWNrYWdlEjAKFGphdmFfb3V0ZXJfY2xhc3NuYW1lGAggASgJUhJqYXZhT3V0ZXJDbGFzc25hbWUSNQoTamF2YV9tdWx0aXBsZV9maWxlcxgKIAEoCDoFZmFsc2VSEWphdmFNdWx0aXBsZUZpbGVzEkQKHWphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoGBQgASgIQgIYAVIZamF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaBI6ChZqYXZhX3N0cmluZ19jaGVja191dGY4GBsgASgIOgVmYWxzZVITamF2YVN0cmluZ0NoZWNrVXRmOBJTCgxvcHRpbWl6ZV9mb3IYCSABKA4yKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOgVTUEVFRFILb3B0aW1pemVGb3ISHQoKZ29fcGFja2FnZRgLIAEoCVIJZ29QYWNrYWdlEjUKE2NjX2dlbmVyaWNfc2VydmljZXMYECABKAg6BWZhbHNlUhFjY0dlbmVyaWNTZXJ2aWNlcxI5ChVqYXZhX2dlbmVyaWNfc2VydmljZXMYESABKAg6BWZhbHNlUhNqYXZhR2VuZXJpY1NlcnZpY2VzEjUKE3B5X2dlbmVyaWNfc2VydmljZXMYEiABKAg6BWZhbHNlUhFweUdlbmVyaWNTZXJ2aWNlcxIlCgpkZXByZWNhdGVkGBcgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBIuChBjY19lbmFibGVfYXJlbmFzGB8gASgIOgR0cnVlUg5jY0VuYWJsZUFyZW5hcxIqChFvYmpjX2NsYXNzX3ByZWZpeBgkIAEoCVIPb2JqY0NsYXNzUHJlZml4EikKEGNzaGFycF9uYW1lc3BhY2UYJSABKAlSD2NzaGFycE5hbWVzcGFjZRIhCgxzd2lmdF9wcmVmaXgYJyABKAlSC3N3aWZ0UHJlZml4EigKEHBocF9jbGFzc19wcmVmaXgYKCABKAlSDnBocENsYXNzUHJlZml4EiMKDXBocF9uYW1lc3BhY2UYKSABKAlSDHBocE5hbWVzcGFjZRI0ChZwaHBfbWV0YWRhdGFfbmFtZXNwYWNlGCwgASgJUhRwaHBNZXRhZGF0YU5hbWVzcGFjZRIhCgxydWJ5X3BhY2thZ2UYLSABKAlSC3J1YnlQYWNrYWdlEjcKCGZlYXR1cmVzGDIgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uIjoKDE9wdGltaXplTW9kZRIJCgVTUEVFRBABEg0KCUNPREVfU0laRRACEhAKDExJVEVfUlVOVElNRRADKgkI6AcQgICAgAJKBAgqECtKBAgmECdSFHBocF9nZW5lcmljX3NlcnZpY2VzIvQDCg5NZXNzYWdlT3B0aW9ucxI8ChdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdBgBIAEoCDoFZmFsc2VSFG1lc3NhZ2VTZXRXaXJlRm9ybWF0EkwKH25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IYAiABKAg6BWZhbHNlUhxub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yEiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhsKCW1hcF9lbnRyeRgHIAEoCFIIbWFwRW50cnkSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYCyABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAwgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgEEAVKBAgFEAZKBAgGEAdKBAgIEAlKBAgJEAoinQ0KDEZpZWxkT3B0aW9ucxJBCgVjdHlwZRgBIAEoDjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6BlNUUklOR1IFY3R5cGUSFgoGcGFja2VkGAIgASgIUgZwYWNrZWQSRwoGanN0eXBlGAYgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6CUpTX05PUk1BTFIGanN0eXBlEhkKBGxhenkYBSABKAg6BWZhbHNlUgRsYXp5Ei4KD3VudmVyaWZpZWRfbGF6eRgPIAEoCDoFZmFsc2VSDnVudmVyaWZpZWRMYXp5EiUKCmRlcHJlY2F0ZWQYAyABKAg6BWZhbHNlUgpkZXByZWNhdGVkEhkKBHdlYWsYCiABKAg6BWZhbHNlUgR3ZWFrEigKDGRlYnVnX3JlZGFjdBgQIAEoCDoFZmFsc2VSC2RlYnVnUmVkYWN0EksKCXJldGVudGlvbhgRIAEoDjItLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uUglyZXRlbnRpb24SSAoHdGFyZ2V0cxgTIAMoDjIuLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZVIHdGFyZ2V0cxJXChBlZGl0aW9uX2RlZmF1bHRzGBQgAygLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdFIPZWRpdGlvbkRlZmF1bHRzEjcKCGZlYXR1cmVzGBUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElUKD2ZlYXR1cmVfc3VwcG9ydBgWIAEoCzIsLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRmVhdHVyZVN1cHBvcnRSDmZlYXR1cmVTdXBwb3J0ElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uGloKDkVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhIUCgV2YWx1ZRgCIAEoCVIFdmFsdWUalgIKDkZlYXR1cmVTdXBwb3J0EkcKEmVkaXRpb25faW50cm9kdWNlZBgBIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUhFlZGl0aW9uSW50cm9kdWNlZBJHChJlZGl0aW9uX2RlcHJlY2F0ZWQYAiABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIRZWRpdGlvbkRlcHJlY2F0ZWQSLwoTZGVwcmVjYXRpb25fd2FybmluZxgDIAEoCVISZGVwcmVjYXRpb25XYXJuaW5nEkEKD2VkaXRpb25fcmVtb3ZlZBgEIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5lZGl0aW9uUmVtb3ZlZCIvCgVDVHlwZRIKCgZTVFJJTkcQABIICgRDT1JEEAESEAoMU1RSSU5HX1BJRUNFEAIiNQoGSlNUeXBlEg0KCUpTX05PUk1BTBAAEg0KCUpTX1NUUklORxABEg0KCUpTX05VTUJFUhACIlUKD09wdGlvblJldGVudGlvbhIVChFSRVRFTlRJT05fVU5LTk9XThAAEhUKEVJFVEVOVElPTl9SVU5USU1FEAESFAoQUkVURU5USU9OX1NPVVJDRRACIowCChBPcHRpb25UYXJnZXRUeXBlEhcKE1RBUkdFVF9UWVBFX1VOS05PV04QABIUChBUQVJHRVRfVFlQRV9GSUxFEAESHwobVEFSR0VUX1RZUEVfRVhURU5TSU9OX1JBTkdFEAISFwoTVEFSR0VUX1RZUEVfTUVTU0FHRRADEhUKEVRBUkdFVF9UWVBFX0ZJRUxEEAQSFQoRVEFSR0VUX1RZUEVfT05FT0YQBRIUChBUQVJHRVRfVFlQRV9FTlVNEAYSGgoWVEFSR0VUX1RZUEVfRU5VTV9FTlRSWRAHEhcKE1RBUkdFVF9UWVBFX1NFUlZJQ0UQCBIWChJUQVJHRVRfVFlQRV9NRVRIT0QQCSoJCOgHEICAgIACSgQIBBAFSgQIEhATIqwBCgxPbmVvZk9wdGlvbnMSNwoIZmVhdHVyZXMYASABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLRAgoLRW51bU9wdGlvbnMSHwoLYWxsb3dfYWxpYXMYAiABKAhSCmFsbG93QWxpYXMSJQoKZGVwcmVjYXRlZBgDIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSVgomZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMYBiABKAhCAhgBUiJkZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzEjcKCGZlYXR1cmVzGAcgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSCGZlYXR1cmVzElgKFHVuaW50ZXJwcmV0ZWRfb3B0aW9uGOcHIAMoCzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uUhN1bmludGVycHJldGVkT3B0aW9uKgkI6AcQgICAgAJKBAgFEAYi2AIKEEVudW1WYWx1ZU9wdGlvbnMSJQoKZGVwcmVjYXRlZBgBIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSNwoIZmVhdHVyZXMYAiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSKAoMZGVidWdfcmVkYWN0GAMgASgIOgVmYWxzZVILZGVidWdSZWRhY3QSVQoPZmVhdHVyZV9zdXBwb3J0GAQgASgLMiwuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5GZWF0dXJlU3VwcG9ydFIOZmVhdHVyZVN1cHBvcnQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiLVAQoOU2VydmljZU9wdGlvbnMSNwoIZmVhdHVyZXMYIiABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSJQoKZGVwcmVjYXRlZBghIAEoCDoFZmFsc2VSCmRlcHJlY2F0ZWQSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24qCQjoBxCAgICAAiKZAwoNTWV0aG9kT3B0aW9ucxIlCgpkZXByZWNhdGVkGCEgASgIOgVmYWxzZVIKZGVwcmVjYXRlZBJxChFpZGVtcG90ZW5jeV9sZXZlbBgiIAEoDjIvLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLklkZW1wb3RlbmN5TGV2ZWw6E0lERU1QT1RFTkNZX1VOS05PV05SEGlkZW1wb3RlbmN5TGV2ZWwSNwoIZmVhdHVyZXMYIyABKAsyGy5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldFIIZmVhdHVyZXMSWAoUdW5pbnRlcnByZXRlZF9vcHRpb24Y5wcgAygLMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25SE3VuaW50ZXJwcmV0ZWRPcHRpb24iUAoQSWRlbXBvdGVuY3lMZXZlbBIXChNJREVNUE9URU5DWV9VTktOT1dOEAASEwoPTk9fU0lERV9FRkZFQ1RTEAESDgoKSURFTVBPVEVOVBACKgkI6AcQgICAgAIimgMKE1VuaW50ZXJwcmV0ZWRPcHRpb24SQQoEbmFtZRgCIAMoCzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0UgRuYW1lEikKEGlkZW50aWZpZXJfdmFsdWUYAyABKAlSD2lkZW50aWZpZXJWYWx1ZRIsChJwb3NpdGl2ZV9pbnRfdmFsdWUYBCABKARSEHBvc2l0aXZlSW50VmFsdWUSLAoSbmVnYXRpdmVfaW50X3ZhbHVlGAUgASgDUhBuZWdhdGl2ZUludFZhbHVlEiEKDGRvdWJsZV92YWx1ZRgGIAEoAVILZG91YmxlVmFsdWUSIQoMc3RyaW5nX3ZhbHVlGAcgASgMUgtzdHJpbmdWYWx1ZRInCg9hZ2dyZWdhdGVfdmFsdWUYCCABKAlSDmFnZ3JlZ2F0ZVZhbHVlGkoKCE5hbWVQYXJ0EhsKCW5hbWVfcGFydBgBIAIoCVIIbmFtZVBhcnQSIQoMaXNfZXh0ZW5zaW9uGAIgAigIUgtpc0V4dGVuc2lvbiK5EAoKRmVhdHVyZVNldBKRAQoOZmllbGRfcHJlc2VuY2UYASABKA4yKS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlQj+IAQGYAQSYAQGiAQ0SCEVYUExJQ0lUGIQHogENEghJTVBMSUNJVBjnB6IBDRIIRVhQTElDSVQY6AeyAQMI6AdSDWZpZWxkUHJlc2VuY2USbAoJZW51bV90eXBlGAIgASgOMiQuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGVCKYgBAZgBBpgBAaIBCxIGQ0xPU0VEGIQHogEJEgRPUEVOGOcHsgEDCOgHUghlbnVtVHlwZRKYAQoXcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmcYAyABKA4yMS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5SZXBlYXRlZEZpZWxkRW5jb2RpbmdCLYgBAZgBBJgBAaIBDRIIRVhQQU5ERUQYhAeiAQsSBlBBQ0tFRBjnB7IBAwjoB1IVcmVwZWF0ZWRGaWVsZEVuY29kaW5nEn4KD3V0ZjhfdmFsaWRhdGlvbhgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uQimIAQGYAQSYAQGiAQkSBE5PTkUYhAeiAQsSBlZFUklGWRjnB7IBAwjoB1IOdXRmOFZhbGlkYXRpb24SfgoQbWVzc2FnZV9lbmNvZGluZxgFIAEoDjIrLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0Lk1lc3NhZ2VFbmNvZGluZ0ImiAEBmAEEmAEBogEUEg9MRU5HVEhfUFJFRklYRUQYhAeyAQMI6AdSD21lc3NhZ2VFbmNvZGluZxKCAQoLanNvbl9mb3JtYXQYBiABKA4yJi5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0QjmIAQGYAQOYAQaYAQGiARcSEkxFR0FDWV9CRVNUX0VGRk9SVBiEB6IBChIFQUxMT1cY5weyAQMI6AdSCmpzb25Gb3JtYXQSqwEKFGVuZm9yY2VfbmFtaW5nX3N0eWxlGAcgASgOMi4uZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW5mb3JjZU5hbWluZ1N0eWxlQkmIAQKYAQGYAQKYAQOYAQSYAQWYAQaYAQeYAQiYAQmiARESDFNUWUxFX0xFR0FDWRiEB6IBDhIJU1RZTEUyMDI0GOkHsgEDCOkHUhJlbmZvcmNlTmFtaW5nU3R5bGUSuQEKGWRlZmF1bHRfc3ltYm9sX3Zpc2liaWxpdHkYCCABKA4yRS5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5WaXNpYmlsaXR5RmVhdHVyZS5EZWZhdWx0U3ltYm9sVmlzaWJpbGl0eUI2iAECmAEBogEPEgpFWFBPUlRfQUxMGIQHogEVEhBFWFBPUlRfVE9QX0xFVkVMGOkHsgEDCOkHUhdkZWZhdWx0U3ltYm9sVmlzaWJpbGl0eRqhAQoRVmlzaWJpbGl0eUZlYXR1cmUigQEKF0RlZmF1bHRTeW1ib2xWaXNpYmlsaXR5EiUKIURFRkFVTFRfU1lNQk9MX1ZJU0lCSUxJVFlfVU5LTk9XThAAEg4KCkVYUE9SVF9BTEwQARIUChBFWFBPUlRfVE9QX0xFVkVMEAISDQoJTE9DQUxfQUxMEAMSCgoGU1RSSUNUEARKCAgBEICAgIACIlwKDUZpZWxkUHJlc2VuY2USGgoWRklFTERfUFJFU0VOQ0VfVU5LTk9XThAAEgwKCEVYUExJQ0lUEAESDAoISU1QTElDSVQQAhITCg9MRUdBQ1lfUkVRVUlSRUQQAyI3CghFbnVtVHlwZRIVChFFTlVNX1RZUEVfVU5LTk9XThAAEggKBE9QRU4QARIKCgZDTE9TRUQQAiJWChVSZXBlYXRlZEZpZWxkRW5jb2RpbmcSIwofUkVQRUFURURfRklFTERfRU5DT0RJTkdfVU5LTk9XThAAEgoKBlBBQ0tFRBABEgwKCEVYUEFOREVEEAIiSQoOVXRmOFZhbGlkYXRpb24SGwoXVVRGOF9WQUxJREFUSU9OX1VOS05PV04QABIKCgZWRVJJRlkQAhIICgROT05FEAMiBAgBEAEiUwoPTWVzc2FnZUVuY29kaW5nEhwKGE1FU1NBR0VfRU5DT0RJTkdfVU5LTk9XThAAEhMKD0xFTkdUSF9QUkVGSVhFRBABEg0KCURFTElNSVRFRBACIkgKCkpzb25Gb3JtYXQSFwoTSlNPTl9GT1JNQVRfVU5LTk9XThAAEgkKBUFMTE9XEAESFgoSTEVHQUNZX0JFU1RfRUZGT1JUEAIiVwoSRW5mb3JjZU5hbWluZ1N0eWxlEiAKHEVORk9SQ0VfTkFNSU5HX1NUWUxFX1VOS05PV04QABINCglTVFlMRTIwMjQQARIQCgxTVFlMRV9MRUdBQ1kQAiqwAQjoBxCLThqnARIdCOgHEgcucGIuY3BwGg8ucGIuQ3BwRmVhdHVyZXMSHwjpBxIILnBiLmphdmEaEC5wYi5KYXZhRmVhdHVyZXMSGwjqBxIGLnBiLmdvGg4ucGIuR29GZWF0dXJlcxIjCOsHEgoucGIucHl0aG9uGhIucGIuUHl0aG9uRmVhdHVyZXMSIwiGThIKLnBiLnByb3RvMRoSLnBiLlByb3RvMUZlYXR1cmVzKgYIi04QkE4qBgiQThCRTkoGCOcHEOgHIu8DChJGZWF0dXJlU2V0RGVmYXVsdHMSWAoIZGVmYXVsdHMYASADKAsyPC5nb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdFIIZGVmYXVsdHMSQQoPbWluaW11bV9lZGl0aW9uGAQgASgOMhguZ29vZ2xlLnByb3RvYnVmLkVkaXRpb25SDm1pbmltdW1FZGl0aW9uEkEKD21heGltdW1fZWRpdGlvbhgFIAEoDjIYLmdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uUg5tYXhpbXVtRWRpdGlvbhr4AQoYRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0EjIKB2VkaXRpb24YAyABKA4yGC5nb29nbGUucHJvdG9idWYuRWRpdGlvblIHZWRpdGlvbhJOChRvdmVycmlkYWJsZV9mZWF0dXJlcxgEIAEoCzIbLmdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0UhNvdmVycmlkYWJsZUZlYXR1cmVzEkIKDmZpeGVkX2ZlYXR1cmVzGAUgASgLMhsuZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXRSDWZpeGVkRmVhdHVyZXNKBAgBEAJKBAgCEANSCGZlYXR1cmVzIp4DCg5Tb3VyY2VDb2RlSW5mbxJECghsb2NhdGlvbhgBIAMoCzIoLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblIIbG9jYXRpb24azgEKCExvY2F0aW9uEhYKBHBhdGgYASADKAVCAhABUgRwYXRoEhYKBHNwYW4YAiADKAVCAhABUgRzcGFuEikKEGxlYWRpbmdfY29tbWVudHMYAyABKAlSD2xlYWRpbmdDb21tZW50cxIrChF0cmFpbGluZ19jb21tZW50cxgEIAEoCVIQdHJhaWxpbmdDb21tZW50cxI6ChlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzGAYgAygJUhdsZWFkaW5nRGV0YWNoZWRDb21tZW50cyp1CIDsyv8BEIHsyv8BGmcSZQiA7Mr/ARIxLmJ1Zi5kZXNjcmlwdG9yLnYxLmJ1Zl9zb3VyY2VfY29kZV9pbmZvX2V4dGVuc2lvbhoqLmJ1Zi5kZXNjcmlwdG9yLnYxLlNvdXJjZUNvZGVJbmZvRXh0ZW5zaW9uItACChFHZW5lcmF0ZWRDb2RlSW5mbxJNCgphbm5vdGF0aW9uGAEgAygLMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb25SCmFubm90YXRpb24a6wEKCkFubm90YXRpb24SFgoEcGF0aBgBIAMoBUICEAFSBHBhdGgSHwoLc291cmNlX2ZpbGUYAiABKAlSCnNvdXJjZUZpbGUSFAoFYmVnaW4YAyABKAVSBWJlZ2luEhAKA2VuZBgEIAEoBVIDZW5kElIKCHNlbWFudGljGAUgASgOMjYuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWNSCHNlbWFudGljIigKCFNlbWFudGljEggKBE5PTkUQABIHCgNTRVQQARIJCgVBTElBUxACKqcCCgdFZGl0aW9uEhMKD0VESVRJT05fVU5LTk9XThAAEhMKDkVESVRJT05fTEVHQUNZEIQHEhMKDkVESVRJT05fUFJPVE8yEOYHEhMKDkVESVRJT05fUFJPVE8zEOcHEhEKDEVESVRJT05fMjAyMxDoBxIRCgxFRElUSU9OXzIwMjQQ6QcSFwoTRURJVElPTl8xX1RFU1RfT05MWRABEhcKE0VESVRJT05fMl9URVNUX09OTFkQAhIdChdFRElUSU9OXzk5OTk3X1RFU1RfT05MWRCdjQYSHQoXRURJVElPTl85OTk5OF9URVNUX09OTFkQno0GEh0KF0VESVRJT05fOTk5OTlfVEVTVF9PTkxZEJ+NBhITCgtFRElUSU9OX01BWBD/////BypVChBTeW1ib2xWaXNpYmlsaXR5EhQKEFZJU0lCSUxJVFlfVU5TRVQQABIUChBWSVNJQklMSVRZX0xPQ0FMEAESFQoRVklTSUJJTElUWV9FWFBPUlQQAkJ+ChNjb20uZ29vZ2xlLnByb3RvYnVmQhBEZXNjcmlwdG9yUHJvdG9zSAFaLWdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3R5cGVzL2Rlc2NyaXB0b3JwYvgBAaICA0dQQqoCGkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uSojwAwoHEgUmAIgLAQqqDwoBDBIDJgASMsEMIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoy2wIgQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQogIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAgU2FuamF5IEdo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FgoMCgUEAQIKARIDfRceCgwKBQQBAgoDEgN9ISIK9QEKBAQBAgsSBIMBAi8a5gEgVGhpcyBmaWVsZCBjb250YWlucyBvcHRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUuCiBZb3UgbWF5IHNhZmVseSByZW1vdmUgdGhpcyBlbnRpcmUgZmllbGQgd2l0aG91dCBoYXJtaW5nIHJ1bnRpbWUKIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRlc2NyaXB0b3JzIC0tIHRoZSBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgb25seSBieQogZGV2ZWxvcG1lbnQgdG9vbHMuCgoNCgUEAQILBBIEgwECCgoNCgUEAQILBhIEgwELGQoNCgUEAQILARIEgwEaKgoNCgUEAQILAxIEgwEtLgr5AgoEBAECDBIEjAECHhrqAiBUaGUgc3ludGF4IG9mIHRoZSBwcm90byBmaWxlLgogVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlICJwcm90bzIiLCAicHJvdG8zIiwgYW5kICJlZGl0aW9ucyIuCgogSWYgYGVkaXRpb25gIGlzIHByZXNlbnQsIHRoaXMgdmFsdWUgbXVzdCBiZSAiZWRpdGlvbnMiLgogV0FSTklORzogVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmIHBsdWdpbnMgb3Igc3BlY2lhbAogY2FzZXMgbGlrZSB0aGUgcHJvdG8gY29tcGlsZXIuIE90aGVyIHVzZXMgYXJlIGRpc2NvdXJhZ2VkIGFuZAogZGV2ZWxvcGVycyBzaG91bGQgcmVseSBvbiB0aGUgcHJvdG9yZWZsZWN0IEFQSXMgZm9yIHRoZWlyIGNsaWVudCBsYW5ndWFnZS4KCg0KBQQBAgwEEgSMAQIKCg0KBQQBAgwFEgSMAQsRCg0KBQQBAgwBEgSMARIYCg0KBQQBAgwDEgSMARsdCoICCgQEAQINEgSSAQIgGvMBIFRoZSBlZGl0aW9uIG9mIHRoZSBwcm90byBmaWxlLgogV0FSTklORzogVGhpcyBmaWVsZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHByb3RvYnVmIHBsdWdpbnMgb3Igc3BlY2lhbAog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ZXJ3aXNlLCBpdCdzIGRlZHVjZWQgZnJvbSB0aGUgZmllbGQncyBuYW1lIGJ5IGNvbnZlcnRpbmcKIGl0IHRvIGNhbWVsQ2FzZS4KCg0KBQQEAggEEgTAAgIKCg0KBQQEAggFEgTAAgsRCg0KBQQEAggBEgTAAhIbCg0KBQQEAggDEgTAAh4gCgwKBAQEAgkSBMICAiQKDQoFBAQCCQQSBMICAgoKDQoFBAQCCQYSBMICCxcKDQoFBAQCCQESBMICGB8KDQoFBAQCCQMSBMICIiMKsAkKBAQEAgoSBNkCAiUaoQkgSWYgdHJ1ZSwgdGhpcyBpcyBhIHByb3RvMyAib3B0aW9uYWwiLiBXaGVuIGEgcHJvdG8zIGZpZWxkIGlzIG9wdGlvbmFsLCBpdAogdHJhY2tzIHByZXNlbmNlIHJlZ2FyZGxlc3Mgb2YgZmllbGQgdHlwZS4KCiBXaGVuIHByb3RvM19vcHRpb25hbCBpcyB0cnVlLCB0aGlzIGZpZWxkIG11c3QgYmVsb25nIHRvIGEgb25lb2YgdG8gc2lnbmFsCiB0byBvbGQgcHJvdG8zIGNsaWVudHMgdGhhdCBwcmVzZW5jZSBpcyB0cmFja2VkIGZvciB0aGlzIGZpZWxkLiBUaGlzIG9uZW9mCiBpcyBrbm93biBhcyBhICJzeW50aGV0aWMiIG9uZW9mLCBhbmQgdGhpcyBmaWVsZCBtdXN0IGJlIGl0cyBzb2xlIG1lbWJlcgogKGVhY2ggcHJvdG8zIG9wdGlvbmFsIGZpZWxkIGdldHMgaXRzIG93biBzeW50aGV0aWMgb25lb2YpLiBTeW50aGV0aWMgb25lb2ZzCiBleGlzdCBpbiB0aGUgZGVzY3JpcHRvciBvbmx5LCBhbmQgZG8gbm90IGdlbmVyYXRlIGFueSBBUEkuIFN5bnRoZXRpYyBvbmVvZnMKIG11c3QgYmUgb3JkZXJlZCBhZnRlciBhbGwgInJlYWwiIG9uZW9mcy4KCiBGb3IgbWVzc2FnZSBmaWVsZHMsIHByb3RvM19vcHRpb25hbCBkb2Vzbid0IGNyZWF0ZSBhbnkgc2VtYW50aWMgY2hhbmdlLAogc2luY2Ugbm9uLXJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzIGFsd2F5cyB0cmFjayBwcmVzZW5jZS4gSG93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dmUgbWF5IGhhdmUgIm9wdGlvbnMiIGF0dGFjaGVkLiAgVGhlc2UgYXJlCiBqdXN0IGFubm90YXRpb25zIHdoaWNoIG1heSBjYXVzZSBjb2RlIHRvIGJlIGdlbmVyYXRlZCBzbGlnaHRseSBkaWZmZXJlbnRseQogb3IgbWF5IGNvbnRhaW4gaGludHMgZm9yIGNvZGUgdGhhdCBtYW5pcHVsYXRlcyBwcm90b2NvbCBtZXNzYWdlcy4KCiBDbGllbnRzIG1heSBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgYXMgZXh0ZW5zaW9ucyBvZiB0aGUgKk9wdGlvbnMgbWVzc2FnZXMuCiBUaGVzZSBleHRlbnNpb25zIG1heSBub3QgeWV0IGJlIGtub3duIGF0IHBhcnNpbmcgdGltZSwgc28gdGhlIHBhcnNlciBjYW5ub3QKIHN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlbS4gIEluc3RlYWQgaXQgc3RvcmVzIHRoZW0gaW4gYSBmaWVsZCBpbiB0aGUgKk9wdGlvbnMKIG1lc3NhZ2UgY2FsbGVkIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLiBUaGlzIGZpZWxkIG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lCiBhY3Jvc3MgYWxsICpPcHRpb25zIG1lc3NhZ2VzLiBXZSB0aGVuIHVzZSB0aGlzIGZpZWxkIHRvIHBvcHVsYXRlIHRoZQogZXh0ZW5zaW9ucyB3aGVuIHdlIGJ1aWxkIGEgZGVzY3JpcHRvciwgYXQgd2hpY2ggcG9pbnQgYWxsIHByb3RvcyBoYXZlIGJlZW4KIHBhcnNlZCBhbmQgc28gYWxsIGV4dGVuc2lvbnMgYXJlIGtub3duLgoKIEV4dGVuc2lvbiBudW1iZXJzIGZvciBjdXN0b20gb3B0aW9ucyBtYXkgYmUgY2hvc2VuIGFzIGZvbGxvd3M6CiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiBvcgogICBvcmdhbml6YXRpb24sIG9yIGZvciBleHBlcmltZW50YWwgb3B0aW9ucywgdXNlIGZpZWxkIG51bWJlcnMgNTAwMDAKICAgdGhyb3VnaCA5OTk5OS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCB5b3UgZG8gbm90IHVzZSB0aGUKICAgc2FtZSBudW1iZXIgZm9yIG11bHRpcGxlIG9wdGlvbnMuCiAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgYmUgcHVibGlzaGVkIGFuZCB1c2VkIHB1YmxpY2x5IGJ5IG11bHRpcGxlCiAgIGluZGVwZW5kZW50IGVudGl0aWVzLCBlLW1haWwgcHJvdG9idWYtZ2xvYmFsLWV4dGVuc2lvbi1yZWdpc3RyeUBnb29nbGUuY29tCiAgIHRvIHJlc2VydmUgZXh0ZW5zaW9uIG51bWJlcnMuIFNpbXBseSBwcm92aWRlIHlvdXIgcHJvamVjdCBuYW1lIChlLmcuCiAgIE9iamVjdGl2ZS1DIHBsdWdpbikgYW5kIHlvdXIgcHJvamVjdCB3ZWJzaXRlIChpZiBhdmFpbGFibGUpIC0tIHRoZXJlJ3Mgbm8KICAgbmVlZCB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvIHVzZSB0aGVtLiBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgb25lCiAgIGV4dGVuc2lvbiBudW1iZXIuIFlvdSBjYW4gZGVjbGFyZSBtdWx0aXBsZSBvcHRpb25zIHdpdGggb25seSBvbmUgZXh0ZW5zaW9uCiAgIG51bWJlciBieSBwdXR0aW5nIHRoZW0gaW4gYSBzdWItbWVzc2FnZS4gU2VlIHRoZSBDdXN0b20gT3B0aW9ucyBzZWN0aW9uIG9mCiAgIHRoZSBkb2NzIGZvciBleGFtcGxlczoKICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvI29wdGlvbnMKICAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgcG9wdWxhciwgYSB3ZWIgc2VydmljZSB3aWxsIGJlIHNldCB1cAogICB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBvcHRpb24gbnVtYmVycy4KCgsKAwQKARIEwwMIEwr0AQoEBAoCABIEyQMCIxrlASBTZXRzIHRoZSBKYXZhIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCiBwbGFjZWQuICBCeSBkZWZhdWx0LCB0aGUgcHJvdG8gcGFja2FnZSBpcyB1c2VkLCBidXQgdGhpcyBpcyBvZnRlbgogaW5hcHByb3ByaWF0ZSBiZWNhdXNlIHByb3RvIHBhY2thZ2VzIGRvIG5vdCBub3JtYWxseSBzdGFydCB3aXRoIGJhY2t3YXJkcwogZG9tYWluIG5hbWVzLgoKDQoFBAoCAAQSBMkDAgoKDQoFBAoCAAUSBMkDCxEKDQoFBAoCAAESBMkDEh4KDQoFBAoCAAMSBMkDISIK8QIKBAQKAgESBNADAisa4gIgQ29udHJvbHMgdGhlIG5hbWUgb2YgdGhlIHdyYXBwZXIgSmF2YSBjbGFzcyBnZW5lcmF0ZWQgZm9yIHRoZSAucHJvdG8gZmlsZS4KIFRoYXQgY2xhc3Mgd2lsbCBhbHdheXMgY29udGFpbiB0aGUgLnByb3RvIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzCiB3ZWxsIGFzIGFueSB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KIElmIGphdmFfbXVsdGlwbGVfZmlsZXMgaXMgZGlzYWJsZWQsIHRoZW4gYWxsIHRoZSBvdGhlciBjbGFzc2VzIGZyb20gdGhlCiAucHJvdG8gZmlsZSB3aWxsIGJlIG5lc3RlZCBpbnNpZGUgdGhlIHNpbmdsZSB3cmFwcGVyIG91dGVyIGNsYXNzLgoKDQoFBAoCAQQSBNADAgoKDQoFBAoCAQUSBNADCxEKDQoFBAoCAQESBNADEiYKDQoFBAoCAQMSBNADKSoKpgMKBAQKAgISBNgDAjsalwMgSWYgZW5hYmxlZCwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgc2VwYXJhdGUgLmphdmEKIGZpbGUgZm9yIGVhY2ggdG9wLWxldmVsIG1lc3NhZ2UsIGVudW0sIGFuZCBzZXJ2aWNlIGRlZmluZWQgaW4gdGhlIC5wcm90bwogZmlsZS4gIFRodXMsIHRoZXNlIHR5cGVzIHdpbGwgKm5vdCogYmUgbmVzdGVkIGluc2lkZSB0aGUgd3JhcHBlciBjbGFzcwogbmFtZWQgYnkgamF2YV9vdXRlcl9jbGFzc25hbWUuICBIb3dldmVyLCB0aGUgd3JhcHBlciBjbGFzcyB3aWxsIHN0aWxsIGJlCiBnZW5lcmF0ZWQgdG8gY29udGFpbiB0aGUgZmlsZSdzIGdldERlc2NyaXB0b3IoKSBtZXRob2QgYXMgd2VsbCBhcyBhbnkKIHRvcC1sZXZlbCBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhlIGZpbGUuCgoNCgUECgICBBIE2AMCCgoNCgUECgICBRIE2AMLDwoNCgUECgICARIE2AMQIwoNCgUECgICAxIE2AMmKAoNCgUECgICCBIE2AMpOgoNCgUECgICBxIE2AMqOQopCgQECgIDEgTbAwJFGhsgVGhpcyBvcHRpb24gZG9lcyBub3RoaW5nLgoKDQoFBAoCAwQSBNsDAgoKDQoFBAoCAwUSBNsDCw8KDQoFBAoCAwESBNsDEC0KDQoFBAoCAwMSBNsDMDIKDQoFBAoCAwgSBNsDM0QKDgoGBAoCAwgDEgTbAzRDCs8DCgQECgIEEgTnAwI+GsADIEEgcHJvdG8yIGZpbGUgY2FuIHNldCB0aGlzIHRvIHRydWUgdG8gb3B0IGluIHRvIFVURi04IGNoZWNraW5nIGZvciBKYXZhLAogd2hpY2ggd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaW52YWxpZCBVVEYtOCBpcyBwYXJzZWQgZnJvbSB0aGUgd2lyZSBvcgogYXNzaWduZWQgdG8gYSBzdHJpbmcgZmllbGQuCgogVE9ETzogY2xhcmlmeSBleGFjdGx5IHdoYXQga2luZHMgb2YgZmllbGQgdHlwZXMgdGhpcyBvcHRpb24KIGFwcGxpZXMgdG8sIGFuZCB1cGRhdGUgdGhlc2UgZG9jcyBhY2NvcmRpbmdseS4KCiBQcm90bzMgZmlsZXMgYWxyZWFkeSBwZXJmb3JtIHRoZXNlIGNoZWNrcy4gU2V0dGluZyB0aGUgb3B0aW9uIGV4cGxpY2l0bHkgdG8KIGZhbHNlIGhhcyBubyBlZmZlY3Q6IGl0IGNhbm5vdCBiZSB1c2VkIHRvIG9wdCBwcm90bzMgZmlsZXMgb3V0IG9mIFVURi04CiBjaGVja3MuCgoNCgUECgIEBBIE5wMCCgoNCgUECgIEBRIE5wMLDwoNCgUECgIEARIE5wMQJgoNCgUECgIEAxIE5wMpKwoNCgUECgIECBIE5wMsPQoNCgUECgIEBxIE5wMtPApMCgQECgQAEgbqAwLvAwMaPCBHZW5lcmF0ZWQgY2xhc3NlcyBjYW4gYmUgb3B0aW1pemVkIGZvciBzcGVlZCBvciBjb2RlIHNpemUuCgoNCgUECgQAARIE6gMHEwpECgYECgQAAgASBOsDBA4iNCBHZW5lcmF0ZSBjb21wbGV0ZSBjb2RlIGZvciBwYXJzaW5nLCBzZXJpYWxpemF0aW9uLAoKDwoHBAoEAAIAARIE6wMECQoPCgcECgQAAgACEgTrAwwNCkcKBgQKBAACARIE7QMEEhoGIGV0Yy4KIi8gVXNlIFJlZmxlY3Rpb25PcHMgdG8gaW1wbGVtZW50IHRoZXNlIG1ldGhvZHMuCgoPCgcECgQAAgEBEgTtAwQNCg8KBwQKBAACAQISBO0DEBEKRwoGBAoEAAICEgTuAwQVIjcgR2VuZXJhdGUgY29kZSB1c2luZyBNZXNzYWdlTGl0ZSBhbmQgdGhlIGxpdGUgcnVudGltZS4KCg8KBwQKBAACAgESBO4DBBAKDwoHBAoEAAICAhIE7gMTFAoMCgQECgIFEgTwAwI7Cg0KBQQKAgUEEgTwAwIKCg0KBQQKAgUGEgTwAwsXCg0KBQQKAgUBEgTwAxgkCg0KBQQKAgUDEgTwAycoCg0KBQQKAgUIEgTwAyk6Cg0KBQQKAgUHEgTwAyo5CuICCgQECgIGEgT3AwIiGtMCIFNldHMgdGhlIEdvIHBhY2thZ2Ugd2hlcmUgc3RydWN0cyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCiBwbGFjZWQuIElmIG9taXR0ZWQsIHRoZSBHbyBwYWNrYWdlIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmc6CiAgIC0gVGhlIGJhc2VuYW1lIG9mIHRoZSBwYWNrYWdlIGltcG9ydCBwYXRoLCBpZiBwcm92aWRlZC4KICAgLSBPdGhlcndpc2UsIHRoZSBwYWNrYWdlIHN0YXRlbWVudCBpbiB0aGUgLnByb3RvIGZpbGUsIGlmIHByZXNlbnQuCiAgIC0gT3RoZXJ3aXNlLCB0aGUgYmFzZW5hbWUgb2YgdGhlIC5wcm90byBmaWxlLCB3aXRob3V0IGV4dGVuc2lvbi4KCg0KBQQKAgYEEgT3AwIKCg0KBQQKAgYFEgT3AwsRCg0KBQQKAgYBEgT3AxIcCg0KBQQKAgYDEgT3Ax8hCtQECgQECgIHEgSDBAI7GsUEIFNob3VsZCBnZW5lcmljIHNlcnZpY2VzIGJlIGdlbmVyYXRlZCBpbiBlYWNoIGxhbmd1YWdlPyAgIkdlbmVyaWMiIHNlcnZpY2VzCiBhcmUgbm90IHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIFJQQyBzeXN0ZW0uICBUaGV5IGFyZSBnZW5lcmF0ZWQgYnkgdGhlCiBtYWluIGNvZGUgZ2VuZXJhdG9ycyBpbiBlYWNoIGxhbmd1YWdlICh3aXRob3V0IGFkZGl0aW9uYWwgcGx1Z2lucykuCiBHZW5lcmljIHNlcnZpY2VzIHdlcmUgdGhlIG9ubHkga2luZCBvZiBzZXJ2aWNlIGdlbmVyYXRpb24gc3VwcG9ydGVkIGJ5CiBlYXJseSB2ZXJzaW9ucyBvZiBnb29nbGUucHJvdG9idWYuCgogR2VuZXJpYyBzZXJ2aWNlcyBhcmUgbm93IGNvbnNpZGVyZWQgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB1c2luZyBwbHVnaW5zCiB0aGF0IGdlbmVyYXRlIGNvZGUgc3BlY2lmaWMgdG8geW91ciBwYXJ0aWN1bGFyIFJQQyBzeXN0ZW0uICBUaGVyZWZvcmUsCiB0aGVzZSBkZWZhdWx0IHRvIGZhbHNlLiAgT2xkIGNvZGUgd2hpY2ggZGVwZW5kcyBvbiBnZW5lcmljIHNlcnZpY2VzIHNob3VsZAogZXhwbGljaXRseSBzZXQgdGhlbSB0byB0cnVlLgoKDQoFBAoCBwQSBIMEAgoKDQoFBAoCBwUSBIMECw8KDQoFBAoCBwESBIMEECMKDQoFBAoCBwMSBIMEJigKDQoFBAoCBwgSBIMEKToKDQoFBAoCBwcSBIMEKjkKDAoEBAoCCBIEhAQCPQoNCgUECgIIBBIEhAQCCgoNCgUECgIIBRIEhAQLDwoNCgUECgIIARIEhAQQJQoNCgUECgIIAxIEhAQoKgoNCgUECgIICBIEhAQrPAoNCgUECgIIBxIEhAQsOwoMCgQECgIJEgSFBAI7Cg0KBQQKAgkEEgSFBAIKCg0KBQQKAgkFEgSFBAsPCg0KBQQKAgkBEgSFBBAjCg0KBQQKAgkDEgSFBCYoCg0KBQQKAgkIEgSFBCk6Cg0KBQQKAgkHEgSFBCo5CisKAwQKCRIEhgQCDiIeIHJlbW92ZWQgcGhwX2dlbmVyaWNfc2VydmljZXMKCgwKBAQKCQASBIYECw0KDQoFBAoJAAESBIYECw0KDQoFBAoJAAISBIYECw0KCwoDBAoKEgSHBAIiCgwKBAQKCgASBIcECyEK8wEKBAQKAgoSBI0EAjIa5AEgSXMgdGhpcyBmaWxlIGRlcHJlY2F0ZWQ/CiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCiBmb3IgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5CiBsZWFzdCwgdGhpcyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpbGVzLgoKDQoFBAoCCgQSBI0EAgoKDQoFBAoCCgUSBI0ECw8KDQoFBAoCCgESBI0EEBoKDQoFBAoCCgMSBI0EHR8KDQoFBAoCCggSBI0EIDEKDQoFBAoCCgcSBI0EITAKfwoEBAoCCxIEkQQCNxpxIEVuYWJsZXMgdGhlIHVzZSBvZiBhcmVuYXMgZm9yIHRoZSBwcm90byBtZXNzYWdlcyBpbiB0aGlzIGZpbGUuIFRoaXMgYXBwbGllcwogb25seSB0byBnZW5lcmF0ZWQgY2xhc3NlcyBmb3IgQysrLgoKDQoFBAoCCwQSBJEEAgoKDQoFBAoCCwUSBJEECw8KDQoFBAoCCwESBJEEECAKDQoFBAoCCwMSBJEEIyUKDQoFBAoCCwgSBJEEJjYKDQoFBAoCCwcSBJEEJzUKkgEKBAQKAgwSBJUEAikagwEgU2V0cyB0aGUgb2JqZWN0aXZlIGMgY2xhc3MgcHJlZml4IHdoaWNoIGlzIHByZXBlbmRlZCB0byBhbGwgb2JqZWN0aXZlIGMKIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gdGhpcyAucHJvdG8uIFRoZXJlIGlzIG5vIGRlZmF1bHQuCgoNCgUECgIMBBIElQQCCgoNCgUECgIMBRIElQQLEQoNCgUECgIMARIElQQSIwoNCgUECgIMAxIElQQmKApJCgQECgINEgSYBAIoGjsgTmFtZXNwYWNlIGZvciBnZW5lcmF0ZWQgY2xhc3NlczsgZGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UuCgoNCgUECgINBBIEmAQCCgoNCgUECgINBRIEmAQLEQoNCgUECgINARIEmAQSIgoNCgUECgINAxIEmAQlJwqRAgoEBAoCDhIEngQCJBqCAiBCeSBkZWZhdWx0IFN3aWZ0IGdlbmVyYXRvcnMgd2lsbCB0YWtlIHRoZSBwcm90byBwYWNrYWdlIGFuZCBDYW1lbENhc2UgaXQKIHJlcGxhY2luZyAnLicgd2l0aCB1bmRlcnNjb3JlIGFuZCB1c2UgdGhhdCB0byBwcmVmaXggdGhlIHR5cGVzL3N5bWJvbHMKIGRlZmluZWQuIFdoZW4gdGhpcyBvcHRpb25zIGlzIHByb3ZpZGVkLCB0aGV5IHdpbGwgdXNlIHRoaXMgdmFsdWUgaW5zdGVhZAogdG8gcHJlZml4IHRoZSB0eXBlcy9zeW1ib2xzIGRlZmluZWQuCgoNCgUECgIOBBIEngQCCgoNCgUECgIOBRIEngQLEQoNCgUECgIOARIEngQSHgoNCgUECgIOAxIEngQhIwp+CgQECgIPEgSiBAIoGnAgU2V0cyB0aGUgcGhwIGNsYXNzIHByZWZpeCB3aGljaCBpcyBwcmVwZW5kZWQgdG8gYWxsIHBocCBnZW5lcmF0ZWQgY2xhc3NlcwogZnJvbSB0aGlzIC5wcm90by4gRGVmYXVsdCBpcyBlbXB0eS4KCg0KBQQKAg8EEgSiBAIKCg0KBQQKAg8FEgSiBAsRCg0KBQQKAg8BEgSiBBIiCg0KBQQKAg8DEgSiBCUnCr4BCgQECgIQEgSnBAIlGq8BIFVzZSB0aGlzIG9wdGlvbiB0byBjaGFuZ2UgdGhlIG5hbWVzcGFjZSBvZiBwaHAgZ2VuZXJhdGVkIGNsYXNzZXMuIERlZmF1bHQKIGlzIGVtcHR5LiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVtcHR5LCB0aGUgcGFja2FnZSBuYW1lIHdpbGwgYmUgdXNlZCBmb3IKIGRldGVybWluaW5nIHRoZSBuYW1lc3BhY2UuCgoNCgUECgIQBBIEpwQCCgoNCgUECgIQBRIEpwQLEQoNCgUECgIQARIEpwQSHwoNCgUECgIQAxIEpwQiJArKAQoEBAoCERIErAQCLhq7ASBVc2UgdGhpcyBvcHRpb24gdG8gY2hhbmdlIHRoZSBuYW1lc3BhY2Ugb2YgcGhwIGdlbmVyYXRlZCBtZXRhZGF0YSBjbGFzc2VzLgogRGVmYXVsdCBpcyBlbXB0eS4gV2hlbiB0aGlzIG9wdGlvbiBpcyBlbXB0eSwgdGhlIHByb3RvIGZpbGUgbmFtZSB3aWxsIGJlCiB1c2VkIGZvciBkZXRlcm1pbmluZyB0aGUgbmFtZXNwYWNlLgoKDQoFBAoCEQQSBKwEAgoKDQoFBAoCEQUSBKwECxEKDQoFBAoCEQESBKwEEigKDQoFBAoCEQMSBKwEKy0KwgEKBAQKAhISBLEEAiQaswEgVXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB0aGUgcGFja2FnZSBvZiBydWJ5IGdlbmVyYXRlZCBjbGFzc2VzLiBEZWZhdWx0CiBpcyBlbXB0eS4gV2hlbiB0aGlzIG9wdGlvbiBpcyBub3Qgc2V0LCB0aGUgcGFja2FnZSBuYW1lIHdpbGwgYmUgdXNlZCBmb3IKIGRldGVybWluaW5nIHRoZSBydWJ5IHBhY2thZ2UuCgoNCgUECgISBBIEsQQCCgoNCgUECgISBRIEsQQLEQoNCgUECgISARIEsQQSHgoNCgUECgISAxIEsQQhIwqRAgoEBAoCExIEtwQCJBqCAiBBbnkgZmVhdHVyZXMgZGVmaW5lZCBpbiB0aGUgc3BlY2lmaWMgZWRpdGlvbi4KIFdBUk5JTkc6IFRoaXMgZmllbGQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBwcm90b2J1ZiBwbHVnaW5zIG9yIHNwZWNpYWwKIGNhc2VzIGxpa2UgdGhlIHByb3RvIGNvbXBpbGVyLiBPdGhlciB1c2VzIGFyZSBkaXNjb3VyYWdlZCBhbmQKIGRldmVsb3BlcnMgc2hvdWxkIHJlbHkgb24gdGhlIHByb3RvcmVmbGVjdCBBUElzIGZvciB0aGVpciBjbGllbnQgbGFuZ3VhZ2UuCgoNCgUECgITBBIEtwQCCgoNCgUECgITBhIEtwQLFQoNCgUECgITARIEtwQWHgoNCgUECgITAxIEtwQhIwp8CgQECgIUEgS7BAI6Gm4gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLgogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgIk9wdGlvbnMiIHNlY3Rpb24gYWJvdmUuCgoNCgUECgIUBBIEuwQCCgoNCgUECgIUBhIEuwQLHgoNCgUECgIUARIEuwQfMwoNCgUECgIUAxIEuwQ2OQqHAQoDBAoFEgS/BAIZGnogQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLgogU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgIk9wdGlvbnMiIHNlY3Rpb24gYWJvdmUuCgoMCgQECgUAEgS/BA0YCg0KBQQKBQABEgS/BA0RCg0KBQQKBQACEgS/BBUYCgsKAwQKCRIEwQQCDgoMCgQECgkBEgTBBAsNCg0KBQQKCQEBEgTBBAsNCg0KBQQKCQECEgTBBAsNCgwKAgQLEgbEBACXBQEKCwoDBAsBEgTEBAgWCtgFCgQECwIAEgTXBAI+GskFIFNldCB0cnVlIHRvIHVzZSB0aGUgb2xkIHByb3RvMSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0IGZvciBleHRlbnNpb25zLgogVGhpcyBpcyBwcm92aWRlZCBmb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCB0aGUgTWVzc2FnZVNldCB3aXJlCiBmb3JtYXQuICBZb3Ugc2hvdWxkIG5vdCB1c2UgdGhpcyBmb3IgYW55IG90aGVyIHJlYXNvbjogIEl0J3MgbGVzcwogZWZmaWNpZW50LCBoYXMgZmV3ZXIgZmVhdHVyZXMsIGFuZCBpcyBtb3JlIGNvbXBsaWNhdGVkLgoKIFRoZSBtZXNzYWdlIG11c3QgYmUgZGVmaW5lZCBleGFjdGx5IGFzIGZvbGxvd3M6CiAgIG1lc3NhZ2UgRm9vIHsKICAgICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOwogICAgIGV4dGVuc2lvbnMgNCB0byBtYXg7CiAgIH0KIE5vdGUgdGhhdCB0aGUgbWVzc2FnZSBjYW5ub3QgaGF2ZSBhbnkgZGVmaW5lZCBmaWVsZHM7IE1lc3NhZ2VTZXRzIG9ubHkKIGhhdmUgZXh0ZW5zaW9ucy4KCiBBbGwgZXh0ZW5zaW9ucyBvZiB5b3VyIHR5cGUgbXVzdCBiZSBzaW5ndWxhciBtZXNzYWdlczsgZS5nLiB0aGV5IGNhbm5vdAogYmUgaW50MzJzLCBlbnVtcywgb3IgcmVwZWF0ZWQgbWVzc2FnZXMuCgogQmVjYXVzZSB0aGlzIGlzIGFuIG9wdGlvbiwgdGhlIGFib3ZlIHR3byByZXN0cmljdGlvbnMgYXJlIG5vdCBlbmZvcmNlZCBieQogdGhlIHByb3RvY29sIGNvbXBpbGVyLgoKDQoFBAsCAAQSBNcEAgoKDQoFBAsCAAUSBNcECw8KDQoFBAsCAAESBNcEECcKDQoFBAsCAAMSBNcEKisKDQoFBAsCAAgSBNcELD0KDQoFBAsCAAcSBNcELTwK6wEKBAQLAgESBNwEAkYa3AEgRGlzYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN0YW5kYXJkICJkZXNjcmlwdG9yKCkiIGFjY2Vzc29yLCB3aGljaCBjYW4KIGNvbmZsaWN0IHdpdGggYSBmaWVsZCBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyBtZWFudCB0byBtYWtlIG1pZ3JhdGlvbgogZnJvbSBwcm90bzEgZWFzaWVyOyBuZXcgY29kZSBzaG91bGQgYXZvaWQgZmllbGRzIG5hbWVkICJkZXNjcmlwdG9yIi4KCg0KBQQLAgEEEgTcBAIKCg0KBQQLAgEFEgTcBAsPCg0KBQQLAgEBEgTcBBAvCg0KBQQLAgEDEgTcBDIzCg0KBQQLAgEIEgTcBDRFCg0KBQQLAgEHEgTcBDVECu4BCgQECwICEgTiBAIxGt8BIElzIHRoaXMgbWVzc2FnZSBkZXByZWNhdGVkPwogRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwogZm9yIHRoZSBtZXNzYWdlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCiB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgbWVzc2FnZXMuCgoNCgUECwICBBIE4gQCCgoNCgUECwICBRIE4gQLDwoNCgUECwICARIE4gQQGgoNCgUECwICAxIE4gQdHgoNCgUECwICCBIE4gQfMAoNCgUECwICBxIE4gQgLwoLCgMECwkSBOQEAhMKDAoEBAsJABIE5AQLDAoNCgUECwkAARIE5AQLDAoNCgUECwkAAhIE5AQLDAoMCgQECwkBEgTkBA4PCg0KBQQLCQEBEgTkBA4PCg0KBQQLCQECEgTkBA4PCgwKBAQLCQISBOQEERIKDQoFBAsJAgESBOQEERIKDQoFBAsJAgISBOQEERIKoAYKBAQLAgMSBPsEAh4akQYgV2hldGhlciB0aGUgbWVzc2FnZSBpcyBhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYXAgZW50cnkgdHlwZSBmb3IgdGhlCiBtYXBzIGZpZWxkLgoKIEZvciBtYXBzIGZpZWxkczoKICAgICBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBtYXBfZmllbGQgPSAxOwogVGhlIHBhcnNlZCBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CiAgICAgbWVzc2FnZSBNYXBGaWVsZEVudHJ5IHsKICAgICAgICAgb3B0aW9uIG1hcF9lbnRyeSA9IHRydWU7CiAgICAgICAgIG9wdGlvbmFsIEtleVR5cGUga2V5ID0gMTsKICAgICAgICAgb3B0aW9uYWwgVmFsdWVUeXBlIHZhbHVlID0gMjsKICAgICB9CiAgICAgcmVwZWF0ZWQgTWFwRmllbGRFbnRyeSBtYXBfZmllbGQgPSAxOwoKIEltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIG5vdCB0byBnZW5lcmF0ZSB0aGUgbWFwX2VudHJ5PXRydWUgbWVzc2FnZSwgYnV0CiB1c2UgYSBuYXRpdmUgbWFwIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdG8gaG9sZCB0aGUga2V5cyBhbmQgdmFsdWVzLgogVGhlIHJlZmxlY3Rpb24gQVBJcyBpbiBzdWNoIGltcGxlbWVudGF0aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKIGlmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQuCgogTk9URTogRG8gbm90IHNldCB0aGUgb3B0aW9uIGluIC5wcm90byBmaWxlcy4gQWx3YXlzIHVzZSB0aGUgbWFwcyBzeW50YXgKIGluc3RlYWQuIFRoZSBvcHRpb24gc2hvdWxkIG9ubHkgYmUgaW1wbGljaXRseSBzZXQgYnkgdGhlIHByb3RvIGNvbXBpbGVyCiBwYXJzZXIuCgoNCgUECwIDBBIE+wQCCgoNCgUECwIDBRIE+wQLDwoNCgUECwIDARIE+wQQGQoNCgUECwIDAxIE+wQcHQokCgMECwkSBP0EAg0iFyBqYXZhbGl0ZV9zZXJpYWxpemFibGUKCgwKBAQLCQMSBP0ECwwKDQoFBAsJAwESBP0ECwwKDQoFBAsJAwISBP0ECwwKHwoDBAsJEgT+BAINIhIgamF2YW5hbm9fYXNfbGl0ZQoKDAoEBAsJBBIE/gQLDAoNCgUECwkEARIE/gQLDAoNCgUECwkEAhIE/gQLDArdAwoEBAsCBBIEigUCUBrOAyBFbmFibGUgdGhlIGxlZ2FjeSBoYW5kbGluZyBvZiBKU09OIGZpZWxkIG5hbWUgY29uZmxpY3RzLiAgVGhpcyBsb3dlcmNhc2VzCiBhbmQgc3RyaXBzIHVuZGVyc2NvcmVkIGZyb20gdGhlIGZpZWxkcyBiZWZvcmUgY29tcGFyaXNvbiBpbiBwcm90bzMgb25seS4KIFRoZSBuZXcgYmVoYXZpb3IgdGFrZXMgYGpzb25fbmFtZWAgaW50byBhY2NvdW50IGFuZCBhcHBsaWVzIHRvIHByb3RvMiBhcwogd2VsbC4KCiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkgbWVhc3VyZSBhZ2FpbnN0IGJyb2tlbiBidWlsZHMgZHVlCiB0byB0aGUgY2hhbmdlIGluIGJlaGF2aW9yIGZvciBKU09OIGZpZWxkIG5hbWUgY29uZmxpY3RzLgoKIFRPRE8gVGhpcyBpcyBsZWdhY3kgYmVoYXZpb3Igd2UgcGxhbiB0byByZW1vdmUgb25jZSBkb3duc3RyZWFtCiB0ZWFtcyBoYXZlIGhhZCB0aW1lIHRvIG1pZ3JhdGUuCgoNCgUECwIEBBIEigUCCgoNCgUECwIEBRIEigULDwoNCgUECwIEARIEigUQNgoNCgUECwIEAxIEigU5OwoNCgUECwIECBIEigU8TwoOCgYECwIECAMSBIoFPU4KkQIKBAQLAgUSBJAFAiQaggIgQW55IGZlYXR1cmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljIGVkaXRpb24uCiBXQVJOSU5HOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9idWYgcGx1Z2lucyBvciBzcGVjaWFsCiBjYXNlcyBsaWtlIHRoZSBwcm90byBjb21waWxlci4gT3RoZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBAsCBQQSBJAFAgoKDQoFBAsCBQYSBJAFCxUKDQoFBAsCBQESBJAFFh4KDQoFBAsCBQMSBJAFISMKTwoEBAsCBhIEkwUCOhpBIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgoKDQoFBAsCBgQSBJMFAgoKDQoFBAsCBgYSBJMFCx4KDQoFBAsCBgESBJMFHzMKDQoFBAsCBgMSBJMFNjkKWgoDBAsFEgSWBQIZGk0gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQECwUAEgSWBQ0YCg0KBQQLBQABEgSWBQ0RCg0KBQQLBQACEgSWBRUYCgwKAgQMEgaZBQC/BgEKCwoDBAwBEgSZBQgUCsIDCgQEDAIAEgShBQJFGrMDIE5PVEU6IGN0eXBlIGlzIGRlcHJlY2F0ZWQuIFVzZSBgZmVhdHVyZXMuKHBiLmNwcCkuc3RyaW5nX3R5cGVgIGluc3RlYWQuCiBUaGUgY3R5cGUgb3B0aW9uIGluc3RydWN0cyB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHRvIHVzZSBhIGRpZmZlcmVudAogcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuICBTZWUgdGhlIHNwZWNpZmljCiBvcHRpb25zIGJlbG93LiAgVGhpcyBvcHRpb24gaXMgb25seSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0IHVzZSBvZgogW2N0eXBlPUNPUkRdIGFuZCBbY3R5cGU9U1RSSU5HXSAodGhlIGRlZmF1bHQpIG9uIG5vbi1yZXBlYXRlZCBmaWVsZHMgb2YKIHR5cGUgImJ5dGVzIiBpbiB0aGUgb3BlbiBzb3VyY2UgcmVsZWFzZS4KIFRPRE86IG1ha2UgY3R5cGUgYWN0dWFsbHkgZGVwcmVjYXRlZC4KCg0KBQQMAgAEEgShBQIKCg0KBQQMAgAGEgShBQsQCg0KBQQMAgABEgShBREWCg0KBQQMAgADEgShBRkaCg0KBQQMAgAIEgShBRtECg0KBQQMAgAHEgShBTNDCg4KBAQMBAASBqIFAq8FAwoNCgUEDAQAARIEogUHDAofCgYEDAQAAgASBKQFBA8aDyBEZWZhdWx0IG1vZGUuCgoPCgcEDAQAAgABEgSkBQQKCg8KBwQMBAACAAISBKQFDQ4KlgMKBgQMBAACARIErAUEDRqFAyBUaGUgb3B0aW9uIFtjdHlwZT1DT1JEXSBtYXkgYmUgYXBwbGllZCB0byBhIG5vbi1yZXBlYXRlZCBmaWVsZCBvZiB0eXBlCiAiYnl0ZXMiLiBJdCBpbmRpY2F0ZXMgdGhhdCBpbiBDKyssIHRoZSBkYXRhIHNob3VsZCBiZSBzdG9yZWQgaW4gYSBDb3JkCiBpbnN0ZWFkIG9mIGEgc3RyaW5nLiAgRm9yIHZlcnkgbGFyZ2Ugc3RyaW5ncywgdGhpcyBtYXkgcmVkdWNlIG1lbW9yeQogZnJhZ21lbnRhdGlvbi4gSXQgbWF5IGFsc28gYWxsb3cgYmV0dGVyIHBlcmZvcm1hbmNlIHdoZW4gcGFyc2luZyBmcm9tIGEKIENvcmQsIG9yIHdoZW4gcGFyc2luZyB3aXRoIGFsaWFzaW5nIGVuYWJsZWQsIGFzIHRoZSBwYXJzZWQgQ29yZCBtYXkgdGhlbgogYWxpYXMgdGhlIG9yaWdpbmFsIGJ1ZmZlci4KCg8KBwQMBAACAQESBKwFBAgKDwoHBAwEAAIBAhIErAULDAoOCgYEDAQAAgISBK4FBBUKDwoHBAwEAAICARIErgUEEAoPCgcEDAQAAgICEgSuBRMUCtMDCgQEDAIBEgS3BQIbGsQDIFRoZSBwYWNrZWQgb3B0aW9uIGNhbiBiZSBlbmFibGVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIGVuYWJsZQogYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQogd3JpdGluZyB0aGUgdGFnIGFuZCB0eXBlIGZvciBlYWNoIGVsZW1lbnQsIHRoZSBlbnRpcmUgYXJyYXkgaXMgZW5jb2RlZCBhcwogYSBzaW5nbGUgbGVuZ3RoLWRlbGltaXRlZCBibG9iLiBJbiBwcm90bzMsIG9ubHkgZXhwbGljaXQgc2V0dGluZyBpdCB0bwogZmFsc2Ugd2lsbCBhdm9pZCB1c2luZyBwYWNrZWQgZW5jb2RpbmcuICBUaGlzIG9wdGlvbiBpcyBwcm9oaWJpdGVkIGluCiBFZGl0aW9ucywgYnV0IHRoZSBgcmVwZWF0ZWRfZmllbGRfZW5jb2RpbmdgIGZlYXR1cmUgY2FuIGJlIHVzZWQgdG8gY29udHJvbAogdGhlIGJlaGF2aW9yLgoKDQoFBAwCAQQSBLcFAgoKDQoFBAwCAQUSBLcFCw8KDQoFBAwCAQESBLcFEBYKDQoFBAwCAQMSBLcFGRoKmgUKBAQMAgISBMQFAjMaiwUgVGhlIGpzdHlwZSBvcHRpb24gZGV0ZXJtaW5lcyB0aGUgSmF2YVNjcmlwdCB0eXBlIHVzZWQgZm9yIHZhbHVlcyBvZiB0aGUKIGZpZWxkLiAgVGhlIG9wdGlvbiBpcyBwZXJtaXR0ZWQgb25seSBmb3IgNjQgYml0IGludGVncmFsIGFuZCBmaXhlZCB0eXBlcwogKGludDY0LCB1aW50NjQsIHNpbnQ2NCwgZml4ZWQ2NCwgc2ZpeGVkNjQpLiAgQSBmaWVsZCB3aXRoIGpzdHlwZSBKU19TVFJJTkcKIGlzIHJlcHJlc2VudGVkIGFzIEphdmFTY3JpcHQgc3RyaW5nLCB3aGljaCBhdm9pZHMgbG9zcyBvZiBwcmVjaXNpb24gdGhhdAogY2FuIGhhcHBlbiB3aGVuIGEgbGFyZ2UgdmFsdWUgaXMgY29udmVydGVkIHRvIGEgZmxvYXRpbmcgcG9pbnQgSmF2YVNjcmlwdC4KIFNwZWNpZnlpbmcgSlNfTlVNQkVSIGZvciB0aGUganN0eXBlIGNhdXNlcyB0aGUgZ2VuZXJhdGVkIEphdmFTY3JpcHQgY29kZSB0bwogdXNlIHRoZSBKYXZhU2NyaXB0ICJudW1iZXIiIHR5cGUuICBUaGUgYmVoYXZpb3Igb2YgdGhlIGRlZmF1bHQgb3B0aW9uCiBKU19OT1JNQUwgaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kZW50LgoKIFRoaXMgb3B0aW9uIGlzIGFuIGVudW0gdG8gcGVybWl0IGFkZGl0aW9uYWwgdHlwZXMgdG8gYmUgYWRkZWQsIGUuZy4KIGdvb2cubWF0aC5JbnRlZ2VyLgoKDQoFBAwCAgQSBMQFAgoKDQoFBAwCAgYSBMQFCxEKDQoFBAwCAgESBMQFEhgKDQoFBAwCAgMSBMQFGxwKDQoFBAwCAggSBMQFHTIKDQoFBAwCAgcSBMQFHjEKDgoEBAwEARIGxQUCzgUDCg0KBQQMBAEBEgTFBQcNCicKBgQMBAECABIExwUEEhoXIFVzZSB0aGUgZGVmYXVsdCB0eXBlLgoKDwoHBAwEAQIAARIExwUEDQoPCgcEDAQBAgACEgTHBRARCikKBgQMBAECARIEygUEEhoZIFVzZSBKYXZhU2NyaXB0IHN0cmluZ3MuCgoPCgcEDAQBAgEBEgTKBQQNCg8KBwQMBAECAQISBMoFEBEKKQoGBAwEAQICEgTNBQQSGhkgVXNlIEphdmFTY3JpcHQgbnVtYmVycy4KCg8KBwQMBAECAgESBM0FBA0KDwoHBAwEAQICAhIEzQUQEQqZCgoEBAwCAxIE5gUCKxqKCiBTaG91bGQgdGhpcyBmaWVsZCBiZSBwYXJzZWQgbGF6aWx5PyAgTGF6eSBhcHBsaWVzIG9ubHkgdG8gbWVzc2FnZS10eXBlCiBmaWVsZHMuICBJdCBtZWFucyB0aGF0IHdoZW4gdGhlIG91dGVyIG1lc3NhZ2UgaXMgaW5pdGlhbGx5IHBhcnNlZCwgdGhlCiBpbm5lciBtZXNzYWdlJ3MgY29udGVudHMgd2lsbCBub3QgYmUgcGFyc2VkIGJ1dCBpbnN0ZWFkIHN0b3JlZCBpbiBlbmNvZGVkCiBmb3JtLiAgVGhlIGlubmVyIG1lc3NhZ2Ugd2lsbCBhY3R1YWxseSBiZSBwYXJzZWQgd2hlbiBpdCBpcyBmaXJzdCBhY2Nlc3NlZC4KCiBUaGlzIGlzIG9ubHkgYSBoaW50LiAgSW1wbGVtZW50YXRpb25zIGFyZSBmcmVlIHRvIGNob29zZSB3aGV0aGVyIHRvIHVzZQogZWFnZXIgb3IgbGF6eSBwYXJzaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uLiAgSG93ZXZlciwKIHNldHRpbmcgdGhpcyBvcHRpb24gdHJ1ZSBzdWdnZXN0cyB0aGF0IHRoZSBwcm90b2NvbCBhdXRob3IgYmVsaWV2ZXMgdGhhdAogdXNpbmcgbGF6eSBwYXJzaW5nIG9uIHRoaXMgZmllbGQgaXMgd29ydGggdGhlIGFkZGl0aW9uYWwgYm9va2tlZXBpbmcKIG92ZXJoZWFkIHR5cGljYWxseSBuZWVkZWQgdG8gaW1wbGVtZW50IGl0LgoKIFRoaXMgb3B0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcHVibGljIGludGVyZmFjZSBvZiBhbnkgZ2VuZXJhdGVkIGNvZGU7CiBhbGwgbWV0aG9kIHNpZ25hdHVyZXMgcmVtYWluIHRoZSBzYW1lLiAgRnVydGhlcm1vcmUsIHRocmVhZC1zYWZldHkgb2YgdGhlCiBpbnRlcmZhY2UgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgb3B0aW9uOyBjb25zdCBtZXRob2RzIHJlbWFpbiBzYWZlIHRvCiBjYWxsIGZyb20gbXVsdGlwbGUgdGhyZWFkcyBjb25jdXJyZW50bHksIHdoaWxlIG5vbi1jb25zdCBtZXRob2RzIGNvbnRpbnVlCiB0byByZXF1aXJlIGV4Y2x1c2l2ZSBhY2Nlc3MuCgogTm90ZSB0aGF0IGxhenkgbWVzc2FnZSBmaWVsZHMgYXJlIHN0aWxsIGVhZ2VybHkgdmVyaWZpZWQgdG8gY2hlY2sKIGlsbC1mb3JtZWQgd2lyZWZvcm1hdCBvciBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gQ2FsbGluZyBJc0luaXRpYWxpemVkKCkKIG9uIHRoZSBvdXRlciBtZXNzYWdlIHdvdWxkIGZhaWwgaWYgdGhlIGlubmVyIG1lc3NhZ2UgaGFzIG1pc3NpbmcgcmVxdWlyZWQKIGZpZWxkcy4gRmFpbGVkIHZlcmlmaWNhdGlvbiB3b3VsZCByZXN1bHQgaW4gcGFyc2luZyBmYWlsdXJlIChleGNlcHQgd2hlbgogdW5pbml0aWFsaXplZCBtZXNzYWdlcyBhcmUgYWNjZXB0YWJsZSkuCgoNCgUEDAIDBBIE5gUCCgoNCgUEDAIDBRIE5gULDwoNCgUEDAIDARIE5gUQFAoNCgUEDAIDAxIE5gUXGAoNCgUEDAIDCBIE5gUZKgoNCgUEDAIDBxIE5gUaKQqvAQoEBAwCBBIE6wUCNxqgASB1bnZlcmlmaWVkX2xhenkgZG9lcyBubyBjb3JyZWN0bmVzcyBjaGVja3Mgb24gdGhlIGJ5dGUgc3RyZWFtLiBUaGlzIHNob3VsZAogb25seSBiZSB1c2VkIHdoZXJlIGxhenkgd2l0aCB2ZXJpZmljYXRpb24gaXMgcHJvaGliaXRpdmUgZm9yIHBlcmZvcm1hbmNlCiByZWFzb25zLgoKDQoFBAwCBAQSBOsFAgoKDQoFBAwCBAUSBOsFCw8KDQoFBAwCBAESBOsFEB8KDQoFBAwCBAMSBOsFIiQKDQoFBAwCBAgSBOsFJTYKDQoFBAwCBAcSBOsFJjUK6AEKBAQMAgUSBPEFAjEa2QEgSXMgdGhpcyBmaWVsZCBkZXByZWNhdGVkPwogRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwogZm9yIGFjY2Vzc29ycywgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LCB0aGlzCiBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpZWxkcy4KCg0KBQQMAgUEEgTxBQIKCg0KBQQMAgUFEgTxBQsPCg0KBQQMAgUBEgTxBRAaCg0KBQQMAgUD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iAcfMwoNCgUEDwIEAxIEiAc2OQpaCgMEDwUSBIsHAhkaTSBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KCgwKBAQPBQASBIsHDRgKDQoFBA8FAAESBIsHDREKDQoFBA8FAAISBIsHFRgKDAoCBBASBo4HAKYHAQoLCgMEEAESBI4HCBYKkQIKBAQQAgASBJQHAiQaggIgQW55IGZlYXR1cmVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmljIGVkaXRpb24uCiBXQVJOSU5HOiBUaGlzIGZpZWxkIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9idWYgcGx1Z2lucyBvciBzcGVjaWFsCiBjYXNlcyBsaWtlIHRoZSBwcm90byBjb21waWxlci4gT3RoZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBBACAAQSBJQHAgoKDQoFBBACAAYSBJQHCxUKDQoFBBACAAESBJQHFh4KDQoFBBACAAMSBJQHISMK2QMKBAQQAgESBJ8HAjIa3wEgSXMgdGhpcyBzZXJ2aWNlIGRlcHJlY2F0ZWQ/CiBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCiBmb3IgdGhlIHNlcnZpY2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBzZXJ2aWNlcy4KMugBIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQwogICBmcmFtZXdvcmsuICBXZSBhcG9sb2dpemUgZm9yIGhvYXJkaW5nIHRoZXNlIG51bWJlcnMgdG8gb3Vyc2Vs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ZXIgdXNlcyBhcmUgZGlzY291cmFnZWQgYW5kCiBkZXZlbG9wZXJzIHNob3VsZCByZWx5IG9uIHRoZSBwcm90b3JlZmxlY3QgQVBJcyBmb3IgdGhlaXIgY2xpZW50IGxhbmd1YWdlLgoKDQoFBBECAgQSBMQHAgoKDQoFBBECAgYSBMQHCxUKDQoFBBECAgESBMQHFh4KDQoFBBECAgMSBMQHISMKTwoEBBECAxIExwcCOhpBIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgoKDQoFBBECAwQSBMcHAgoKDQoFBBECAwYSBMcHCx4KDQoFBBECAwESBMcHHzMKDQoFBBECAwMSBMcHNjkKWgoDBBEFEgTKBwIZGk0gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCgoMCgQEEQUAEgTKBw0YCg0KBQQRBQABEgTKBw0RCg0KBQQRBQACEgTKBxUYCosDCgIEEhIG0wcA5wcBGvwCIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQogYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgogRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCiBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCiBpbiB0aGVtLgoKCwoDBBIBEgTTBwgbCssCCgQEEgMAEgbZBwLcBwMaugIgVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0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bWluaW11bSBzdXBwb3J0ZWQgZWRpdGlvbiAoaW5jbHVzaXZlKSB3aGVuIHRoaXMgd2FzIGNvbnN0cnVjdGVkLgogRWRpdGlvbnMgYmVmb3JlIHRoaXMgd2lsbCBub3QgaGF2ZSBkZWZhdWx0cy4KCg0KBQQUAgEEEgTDCQIKCg0KBQQUAgEGEgTDCQsSCg0KBQQUAgEBEgTDCRMiCg0KBQQUAgEDEgTDCSUmCoYBCgQEFAICEgTHCQInGnggVGhlIG1heGltdW0ga25vd24gZWRpdGlvbiAoaW5jbHVzaXZlKSB3aGVuIHRoaXMgd2FzIGNvbnN0cnVjdGVkLiBFZGl0aW9ucwogYWZ0ZXIgdGhpcyB3aWxsIG5vdCBoYXZlIHJlbGlhYmxlIGRlZmF1bHRzLgoKDQoFBBQCAgQSBMcJAgoKDQoFBBQCAgYSBMcJCxIKDQoFBBQCAgESBMcJEyIKDQoFBBQCAgMSBMcJJSYK2gEKAgQVEgbPCQDXCgEaaiBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggYQogRmlsZURlc2NyaXB0b3JQcm90byB3YXMgZ2VuZXJhdGVkLgoyYCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiBPcHRpb25hbCBzb3VyY2UgY29kZSBpbmZvCgoLCgMEFQESBM8JCBYKghEKBAQVAgASBPsJAiEa8xAgQSBMb2NhdGlvbiBpZGVudGlmaWVzIGEgcGllY2Ugb2Ygc291cmNlIGNvZGUgaW4gYSAucHJvdG8gZmlsZSB3aGljaAogY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGRlZmluaXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkCiB0byBiZSB1c2VmdWwgdG8gSURFcywgY29kZSBpbmRleGVycywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3JzLCBhbmQgc2ltaWxhcgogdG9vbHMuCgogRm9yIGV4YW1wbGUsIHNheSB3ZSBoYXZlIGEgZmlsZSBsaWtlOgogICBtZXNzYWdlIEZvbyB7CiAgICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CiAgIH0KIExldCdzIGxvb2sgYXQganVzdCB0aGUgZmllbGQgZGVmaW5pdGlvbjoKICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDE7CiAgIF4gICAgICAgXl4gICAgIF5eICBeICBeXl4KICAgYSAgICAgICBiYyAgICAgZGUgIGYgIGdoaQogV2UgaGF2ZSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKICAgc3BhbiAgIHBhdGggICAgICAgICAgICAgICByZXByZXNlbnRzCiAgIFthLGkpICBbIDQsIDAsIDIsIDAgXSAgICAgVGhlIHdob2xlIGZpZWxkIGRlZmluaXRpb24uCiAgIFthLGIpICBbIDQsIDAsIDIsIDAsIDQgXSAgVGhlIGxhYmVsIChvcHRpb25hbCkuCiAgIFtjLGQpICBbIDQsIDAsIDIsIDAsIDUgXSAgVGhlIHR5cGUgKHN0cmluZykuCiAgIFtlLGYpICBbIDQsIDAsIDIsIDAsIDEgXSAgVGhlIG5hbWUgKGZvbykuCiAgIFtnLGgpICBbIDQsIDAsIDIsIDAsIDMgXSAgVGhlIG51bWJlciAoMSkuCgogTm90ZXM6CiAtIEEgbG9jYXRpb24gbWF5IHJlZmVyIHRvIGEgcmVwZWF0ZWQgZmllbGQgaXRzZWxmIChpLmUuIG5vdCB0byBhbnkKICAgcGFydGljdWxhciBpbmRleCB3aXRoaW4gaXQpLiAgVGhpcyBpcyB1c2VkIHdoZW5ldmVyIGEgc2V0IG9mIGVsZW1lbnRzIGFyZQogICBsb2dpY2FsbHkgZW5jbG9zZWQgaW4gYSBzaW5nbGUgY29kZSBzZWdtZW50LiAgRm9yIGV4YW1wbGUsIGFuIGVudGlyZQogICBleHRlbmQgYmxvY2sgKHBvc3NpYmx5IGNvbnRhaW5pbmcgbXVsdGlwbGUgZXh0ZW5zaW9uIGRlZmluaXRpb25zKSB3aWxsCiAgIGhhdmUgYW4gb3V0ZXIgbG9jYXRpb24gd2hvc2UgcGF0aCByZWZlcnMgdG8gdGhlICJleHRlbnNpb25zIiByZXBlYXRlZAogICBmaWVsZCB3aXRob3V0IGFuIGluZGV4LgogLSBNdWx0aXBsZSBsb2NhdGlvbnMgbWF5IGhhdmUgdGhlIHNhbWUgcGF0aC4gIFRoaXMgaGFwcGVucyB3aGVuIGEgc2luZ2xlCiAgIGxvZ2ljYWwgZGVjbGFyYXRpb24gaXMgc3ByZWFkIG91dCBhY3Jvc3MgbXVsdGlwbGUgcGxhY2VzLiAgVGhlIG1vc3QKICAgb2J2aW91cyBleGFtcGxlIGlzIHRoZSAiZXh0ZW5kIiBibG9jayBhZ2FpbiAtLSB0aGVyZSBtYXkgYmUgbXVsdGlwbGUKICAgZXh0ZW5kIGJsb2NrcyBpbiB0aGUgc2FtZSBzY29wZSwgZWFjaCBvZiB3aGljaCB3aWxsIGhhdmUgdGhlIHNhbWUgcGF0aC4KIC0gQSBsb2NhdGlvbidzIHNwYW4gaXMgbm90IGFsd2F5cyBhIHN1YnNldCBvZiBpdHMgcGFyZW50J3Mgc3Bhbi4gIEZvcgogICBleGFtcGxlLCB0aGUgImV4dGVuZGVlIiBvZiBhbiBleHRlbnNpb24gZGVjbGFyYXRpb24gYXBwZWFycyBhdCB0aGUKICAgYmVnaW5uaW5nIG9mIHRoZSAiZXh0ZW5kIiBibG9jayBhbmQgaXMgc2hhcmVkIGJ5IGFsbCBleHRlbnNpb25zIHdpdGhpbgogICB0aGUgYmxvY2suCiAtIEp1c3QgYmVjYXVzZSBhIGxvY2F0aW9uJ3Mgc3BhbiBpcyBhIHN1YnNldCBvZiBzb21lIG90aGVyIGxvY2F0aW9uJ3Mgc3BhbgogICBkb2VzIG5vdCBtZWFuIHRoYXQgaXQgaXMgYSBkZXNjZW5kYW50LiAgRm9yIGV4YW1wbGUsIGEgImdyb3VwIiBkZWZpbmVzCiAgIGJvdGggYSB0eXBlIGFuZCBhIGZpZWxkIGluIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgVGh1cywgdGhlIGxvY2F0aW9ucwogICBjb3JyZXNwb25kaW5nIHRvIHRoZSB0eXBlIGFuZCBmaWVsZCBhbmQgdGhlaXIgY29tcG9uZW50cyB3aWxsIG92ZXJsYXAuCiAtIENvZGUgd2hpY2ggdHJpZXMgdG8gaW50ZXJwcmV0IGxvY2F0aW9ucyBzaG91bGQgcHJvYmFibHkgYmUgZGVzaWduZWQgdG8KICAgaWdub3JlIHRob3NlIHRoYXQgaXQgZG9lc24ndCB1bmRlcnN0YW5kLCBhcyBtb3JlIHR5cGVzIG9mIGxvY2F0aW9ucyBjb3VsZAogICBiZSByZWNvcmRlZCBpbiB0aGUgZnV0dXJlLgoKDQoFBBUCAAQSBPsJAgoKDQoFBBUCAAYSBPsJCxMKDQoFBBUCAAESBPsJFBwKDQoFBBUCAAMSBPsJHyAKDgoEBBUDABIG/AkCzwoDCg0KBQQVAwABEgT8CQoSCooHCgYEFQMAAgASBJQKBCwa+QYgSWRlbnRpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHdhcyBkZWZpbmVkIGF0IHRoaXMKIGxvY2F0aW9uLgoKIEVhY2ggZWxlbWVudCBpcyBhIGZpZWxkIG51bWJlciBvciBhbiBpbmRleC4gIFRoZXkgZm9ybSBhIHBhdGggZnJvbQogdGhlIHJvb3QgRmlsZURlc2NyaXB0b3JQcm90byB0byB0aGUgcGxhY2Ugd2hlcmUgdGhlIGRlZmluaXRpb24gYXBwZWFycy4KIEZvciBleGFtcGxlLCB0aGlzIHBhdGg6CiAgIFsgNCwgMywgMiwgNywgMSBdCiByZWZlcnMgdG86CiAgIGZpbGUubWVzc2FnZV90eXBlKDMpICAvLyA0LCAzCiAgICAgICAuZmllbGQoNykgICAgICAgICAvLyAyLCA3CiAgICAgICAubmFtZSgpICAgICAgICAgICAvLyAxCiBUaGlzIGlzIGJlY2F1c2UgRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUgaGFzIGZpZWxkIG51bWJlciA0OgogICByZXBlYXRlZCBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKIGFuZCBEZXNjcmlwdG9yUHJvdG8uZmllbGQgaGFzIGZpZWxkIG51bWJlciAyOgogICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CiBhbmQgRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSBoYXMgZmllbGQgbnVtYmVyIDE6CiAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKCiBUaHVzLCB0aGUgYWJvdmUgcGF0aCBnaXZlcyB0aGUgbG9jYXRpb24gb2YgYSBmaWVsZCBuYW1lLiAgSWYgd2UgcmVtb3ZlZAogdGhlIGxhc3QgZWxlbWVudDoKICAgWyA0LCAzLCAyLCA3IF0KIHRoaXMgcGF0aCByZWZlcnMgdG8gdGhlIHdob2xlIGZpZWxkIGRlY2xhcmF0aW9uIChmcm9tIHRoZSBiZWdpbm5pbmcKIG9mIHRoZSBsYWJlbCB0byB0aGUgdGVybWluYXRpbmcgc2VtaWNvbG9uKS4KCg8KBwQVAwACAAQSBJQKBAwKDwoHBBUDAAIABRIElAoNEgoPCgcEFQMAAgABEgSUChMXCg8KBwQVAwACAAMSBJQKGhsKDwoHBBUDAAIACBIElAocKwoQCggEFQMAAgAIAhIElAodKgrSAgoGBBUDAAIBEgSbCgQsGsECIEFsd2F5cyBoYXMgZXhhY3RseSB0aHJlZSBvciBmb3VyIGVsZW1lbnRzOiBzdGFydCBsaW5lLCBzdGFydCBjb2x1bW4sCiBlbmQgbGluZSAob3B0aW9uYWwsIG90aGVyd2lzZSBhc3N1bWVkIHNhbWUgYXMgc3RhcnQgbGluZSksIGVuZCBjb2x1bW4uCiBUaGVzZSBhcmUgcGFja2VkIGludG8gYSBzaW5nbGUgZmllbGQgZm9yIGVmZmljaWVuY3kuICBOb3RlIHRoYXQgbGluZQogYW5kIGNvbHVtbiBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkIC0tIHR5cGljYWxseSB5b3Ugd2lsbCB3YW50IHRvIGFkZAogMSB0byBlYWNoIGJlZm9yZSBkaXNwbGF5aW5nIHRvIGEgdXNlci4KCg8KBwQVAwACAQQSBJsKBAwKDwoHBBUDAAIBBRIEmwoNEgoPCgcEFQMAAgEBEgSbChMXCg8KBwQVAwACAQMSBJsKGhsKDwoHBBUDAAIBCBIEmwocKwoQCggEFQMAAgEIAhIEmwodKgqlDAoGBBUDAAICEgTMCgQpGpQMIElmIHRoaXMgU291cmNlQ29kZUluZm8gcmVwcmVzZW50cyBhIGNvbXBsZXRlIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgYW55CiBjb21tZW50cyBhcHBlYXJpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjbGFyYXRpb24gd2hpY2ggYXBwZWFyIHRvIGJlCiBhdHRhY2hlZCB0byB0aGUgZGVjbGFyYXRpb24uCgogQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKIHRva2VucyBhcHBlYXJpbmcgb24gdGhvc2UgbGluZXMsIHdpbGwgYmUgdHJlYXRlZCBhcyBhIHNpbmdsZSBjb21tZW50LgoKIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgd2lsbCBrZWVwIHBhcmFncmFwaHMgb2YgY29tbWVudHMgdGhhdCBhcHBlYXIKIGJlZm9yZSAoYnV0IG5vdCBjb25uZWN0ZWQgdG8pIHRoZSBjdXJyZW50IGVsZW1lbnQuIEVhY2ggcGFyYWdyYXBoLAogc2VwYXJhdGVkIGJ5IGVtcHR5IGxpbmVzLCB3aWxsIGJlIG9uZSBjb21tZW50IGVsZW1lbnQgaW4gdGhlIHJlcGVhdGVkCiBmaWVsZC4KCiBPbmx5IHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcHJvdmlkZWQ7IGNvbW1lbnQgbWFya2VycyAoZS5nLiAvLykgYXJlCiBzdHJpcHBlZCBvdXQuICBGb3IgYmxvY2sgY29tbWVudHMsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgYW4gYXN0ZXJpc2sKIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4KIE5ld2xpbmVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgoKIEV4YW1wbGVzOgoKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gZm9vLgogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhci4KICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKCiAgIG9wdGlvbmFsIHN0cmluZyBiYXogPSAzOwogICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIGJhei4KCiAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gbW9vLgogICAv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Z2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCAoBAhIDIAAYCggKAQgSAyIAHwoJCgIIHxIDIgAfCggKAQgSAyMASAoJCgIICxIDIwBICggKAQgSAyQALAoJCgIIARIDJAAsCggKAQgSAyUALgoJCgIICBIDJQAuCggKAQgSAyYAIgoJCgIIChIDJgAiCggKAQgSAycAIQoJCgIIJBIDJwAhCggKAQgSAygAOwoJCgIIJRIDKAA7Cp0QCgIEABIEZQByARqQECBBIER1cmF0aW9uIHJlcHJlc2VudHMgYSBzaWduZWQsIGZpeGVkLWxlbmd0aCBzcGFuIG9mIHRpbWUgcmVwcmVzZW50ZWQKIGFzIGEgY291bnQgb2Ygc2Vjb25kcyBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMgYXQgbmFub3NlY29uZAogcmVzb2x1dGlvbi4gSXQgaXMgaW5kZXBlbmRlbnQgb2YgYW55IGNhbGVuZGFyIGFuZCBjb25jZXB0cyBsaWtlICJkYXkiCiBvciAibW9udGgiLiBJdCBpcyByZWxhdGVkIHRvIFRpbWVzdGFtcCBpbiB0aGF0IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4KIHR3byBUaW1lc3RhbXAgdmFsdWVzIGlzIGEgRHVyYXRpb24gYW5kIGl0IGNhbiBiZSBhZGRlZCBvciBzdWJ0cmFjdGVkCiBmcm9tIGEgVGltZXN0YW1wLiBSYW5nZSBpcyBhcHByb3hpbWF0ZWx5ICstMTAsMDAwIHllYXJzLgoKICMgRXhhbXBsZXMKCiBFeGFtcGxlIDE6IENvbXB1dGUgRHVyYXRpb24gZnJvbSB0d28gVGltZXN0YW1wcyBpbiBwc2V1ZG8gY29kZS4KCiAgICAgVGltZXN0YW1wIHN0YXJ0ID0gLi4uOwogICAgIFRpbWVzdGFtcCBlbmQgPSAuLi47CiAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47CgogICAgIGR1cmF0aW9uLnNlY29uZHMgPSBlbmQuc2Vjb25kcyAtIHN0YXJ0LnNlY29uZHM7CiAgICAgZHVyYXRpb24ubmFub3MgPSBlbmQubmFub3MgLSBzdGFydC5uYW5vczsKCiAgICAgaWYgKGR1cmF0aW9uLnNlY29uZHMgPCAwICYmIGR1cmF0aW9uLm5hbm9zID4gMCkgewogICAgICAgZHVyYXRpb24uc2Vjb25kcyArPSAxOwogICAgICAgZHVyYXRpb24ubmFub3MgLT0gMTAwMDAwMDAwMDsKICAgICB9IGVsc2UgaWYgKGR1cmF0aW9uLnNlY29uZHMgPiAwICYmIGR1cmF0aW9uLm5hbm9zIDwgMCkgewogICAgICAgZHVyYXRpb24uc2Vjb25kcyAtPSAxOwogICAgICAgZHVyYXRpb24ubmFub3MgKz0gMTAwMDAwMDAwMDsKICAgICB9CgogRXhhbXBsZSAyOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFRpbWVzdGFtcCArIER1cmF0aW9uIGluIHBzZXVkbyBjb2RlLgoKICAgICBUaW1lc3RhbXAgc3RhcnQgPSAuLi47CiAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47CiAgICAgVGltZXN0YW1wIGVuZCA9IC4uLjsKCiAgICAgZW5kLnNlY29uZHMgPSBzdGFydC5zZWNvbmRzICsgZHVyYXRpb24uc2Vjb25kczsKICAgICBlbmQubmFub3MgPSBzdGFydC5uYW5vcyArIGR1cmF0aW9uLm5hbm9zOwoKICAgICBpZiAoZW5kLm5hbm9zIDwgMCkgewogICAgICAgZW5kLnNlY29uZHMgLT0gMTsKICAgICAgIGVuZC5uYW5vcyArPSAxMDAwMDAwMDAwOwogICAgIH0gZWxzZSBpZiAoZW5kLm5hbm9zID49IDEwMDAwMDAwMDApIHsKICAgICAgIGVuZC5zZWNvbmRzICs9IDE7CiAgICAgICBlbmQubmFub3MgLT0gMTAwMDAwMDAwMDsKICAgICB9CgogRXhhbXBsZSAzOiBDb21wdXRlIER1cmF0aW9uIGZyb20gZGF0ZXRpbWUudGltZWRlbHRhIGluIFB5dGhvbi4KCiAgICAgdGQgPSBkYXRldGltZS50aW1lZGVsdGEoZGF5cz0zLCBtaW51dGVzPTEwKQogICAgIGR1cmF0aW9uID0gRHVyYXRpb24oKQogICAgIGR1cmF0aW9uLkZyb21UaW1lZGVsdGEodGQpCgogIyBKU09OIE1hcHBpbmcKCiBJbiBKU09OIGZvcm1hdCwgdGhlIER1cmF0aW9uIHR5cGUgaXMgZW5jb2RlZCBhcyBhIHN0cmluZyByYXRoZXIgdGhhbiBhbgogb2JqZWN0LCB3aGVyZSB0aGUgc3RyaW5nIGVuZHMgaW4gdGhlIHN1ZmZpeCAicyIgKGluZGljYXRpbmcgc2Vjb25kcykgYW5kCiBpcyBwcmVjZWRlZCBieSB0aGUgbnVtYmVyIG9mIHNlY29uZHMsIHdpdGggbmFub3NlY29uZHMgZXhwcmVzc2VkIGFzCiBmcmFjdGlvbmFsIHNlY29uZHMuIEZvciBleGFtcGxlLCAzIHNlY29uZHMgd2l0aCAwIG5hbm9zZWNvbmRzIHNob3VsZCBiZQogZW5jb2RlZCBpbiBKU09OIGZvcm1hdCBhcyAiM3MiLCB3aGlsZSAzIHNlY29uZHMgYW5kIDEgbmFub3NlY29uZCBzaG91bGQKIGJlIGV4cHJlc3NlZCBpbiBKU09OIGZvcm1hdCBhcyAiMy4wMDAwMDAwMDFzIiwgYW5kIDMgc2Vjb25kcyBhbmQgMQogbWljcm9zZWNvbmQgc2hvdWxkIGJlIGV4cHJlc3NlZCBpbiBKU09OIGZvcm1hdCBhcyAiMy4wMDAwMDFzIi4KCgoKCgMEAAESA2UIEArcAQoEBAACABIDaQIUGs4BIFNpZ25lZCBzZWNvbmRzIG9mIHRoZSBzcGFuIG9mIHRpbWUuIE11c3QgYmUgZnJvbSAtMzE1LDU3NiwwMDAsMDAwCiB0byArMzE1LDU3NiwwMDAsMDAwIGluY2x1c2l2ZS4gTm90ZTogdGhlc2UgYm91bmRzIGFyZSBjb21wdXRlZCBmcm9tOgogNjAgc2VjL21pbiAqIDYwIG1pbi9ociAqIDI0IGhyL2RheSAqIDM2NS4yNSBkYXlzL3llYXIgKiAxMDAwMCB5ZWFycwoKDAoFBAACAAUSA2kCBwoMCgUEAAIAARIDaQgPCgwKBQQAAgADEgNpEhMKgwMKBAQAAgESA3ECEhr1AiBTaWduZWQgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBvZiB0aGUgc3Bhbgogb2YgdGltZS4gRHVyYXRpb25zIGxlc3MgdGhhbiBvbmUgc2Vjb25kIGFyZSByZXByZXNlbnRlZCB3aXRoIGEgMAogYHNlY29uZHNgIGZpZWxkIGFuZCBhIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIGBuYW5vc2AgZmllbGQuIEZvciBkdXJhdGlvbnMKIG9mIG9uZSBzZWNvbmQgb3IgbW9yZSwgYSBub24temVybyB2YWx1ZSBmb3IgdGhlIGBuYW5vc2AgZmllbGQgbXVzdCBiZQogb2YgdGhlIHNhbWUgc2lnbiBhcyB0aGUgYHNlY29uZHNgIGZpZWxkLiBNdXN0IGJlIGZyb20gLTk5OSw5OTksOTk5CiB0byArOTk5LDk5OSw5OTkgaW5jbHVzaXZlLgoKDAoFBAACAQUSA3ECBwoMCgUEAAIBARIDcQgNCgwKBQQAAgEDEgNxEBFiBnByb3RvMwqKPQogZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8SD2dvb2dsZS5wcm90b2J1ZiIhCglGaWVsZE1hc2sSFAoFcGF0aHMYASADKAlSBXBhdGhzQoUBChNjb20uZ29vZ2xlLnByb3RvYnVmQg5GaWVsZE1hc2tQcm90b1ABWjJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi90eXBlcy9rbm93bi9maWVsZG1hc2twYvgBAaICA0dQQqoCHkdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlc0qhOwoHEgUeAPQBAQrMDAoBDBIDHgASMsEMIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogbWV0OgoKICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCiBkaXN0cmlidXRpb24uCiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKCAoBAhIDIAAYCggKAQgSAyIALAoJCgIIARIDIgAsCggKAQgSAyMALwoJCgIICBIDIwAvCggKAQgSAyQAIgoJCgIIChIDJAAiCggKAQgSAyUAIQoJCgIIJBIDJQAhCggKAQgSAyYAOwoJCgIIJRIDJgA7CggKAQgSAycASQoJCgIICxIDJwBJCggKAQgSAygAHwoJCgIIHxIDKAAfCrIsCgIEABIG8QEA9AEBGqMsIGBGaWVsZE1hc2tgIHJlcHJlc2VudHMgYSBzZXQgb2Ygc3ltYm9saWMgZmllbGQgcGF0aHMsIGZvciBleGFtcGxlOgoKICAgICBwYXRoczogImYuYSIKICAgICBwYXRoczogImYuYi5kIgoKIEhlcmUgYGZgIHJlcHJlc2VudHMgYSBmaWVsZCBpbiBzb21lIHJvb3QgbWVzc2FnZSwgYGFgIGFuZCBgYmAKIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBmb3VuZCBpbiBgZmAsIGFuZCBgZGAgYSBmaWVsZCBmb3VuZCBpbiB0aGUKIG1lc3NhZ2UgaW4gYGYuYmAuCgogRmllbGQgbWFza3MgYXJlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiBmaWVsZHMgdGhhdCBzaG91bGQgYmUKIHJldHVybmVkIGJ5IGEgZ2V0IG9wZXJhdGlvbiBvciBtb2RpZmllZCBieSBhbiB1cGRhdGUgb3BlcmF0aW9uLgogRmllbGQgbWFza3MgYWxzbyBoYXZlIGEgY3VzdG9tIEpTT04gZW5jb2RpbmcgKHNlZSBiZWxvdykuCgogIyBGaWVsZCBNYXNrcyBpbiBQcm9qZWN0aW9ucwoKIFdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIHByb2plY3Rpb24sIGEgcmVzcG9uc2UgbWVzc2FnZSBvcgogc3ViLW1lc3NhZ2UgaXMgZmlsdGVyZWQgYnkgdGhlIEFQSSB0byBvbmx5IGNvbnRhaW4gdGhvc2UgZmllbGRzIGFzCiBzcGVjaWZpZWQgaW4gdGhlIG1hc2suIEZvciBleGFtcGxlLCBpZiB0aGUgbWFzayBpbiB0aGUgcHJldmlvdXMKIGV4YW1wbGUgaXMgYXBwbGllZCB0byBhIHJlc3BvbnNlIG1lc3NhZ2UgYXMgZm9sbG93czoKCiAgICAgZiB7CiAgICAgICBhIDogMjIKICAgICAgIGIgewogICAgICAgICBkIDogMQogICAgICAgICB4IDogMgogICAgICAgfQogICAgICAgeSA6IDEzCiAgICAgfQogICAgIHo6IDgKCiBUaGUgcmVzdWx0IHdpbGwgbm90IGNvbnRhaW4gc3BlY2lmaWMgdmFsdWVzIGZvciBmaWVsZHMgeCx5IGFuZCB6CiAodGhlaXIgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQsIGFuZCBvbWl0dGVkIGluIHByb3RvIHRleHQKIG91dHB1dCk6CgoKICAgICBmIHsKICAgICAgIGEgOiAyMgogICAgICAgYiB7CiAgICAgICAgIGQgOiAxCiAgICAgICB9CiAgICAgfQoKIEEgcmVwZWF0ZWQgZmllbGQgaXMgbm90IGFsbG93ZWQgZXhjZXB0IGF0IHRoZSBsYXN0IHBvc2l0aW9uIG9mIGEKIHBhdGhzIHN0cmluZy4KCiBJZiBhIEZpZWxkTWFzayBvYmplY3QgaXMgbm90IHByZXNlbnQgaW4gYSBnZXQgb3BlcmF0aW9uLCB0aGUKIG9wZXJhdGlvbiBhcHBsaWVzIHRvIGFsbCBmaWVsZHMgKGFzIGlmIGEgRmllbGRNYXNrIG9mIGFsbCBmaWVsZHMKIGhhZCBiZWVuIHNwZWNpZmllZCkuCgogTm90ZSB0aGF0IGEgZmllbGQgbWFzayBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byB0aGUKIHRvcC1sZXZlbCByZXNwb25zZSBtZXNzYWdlLiBJbiBjYXNlIG9mIGEgUkVTVCBnZXQgb3BlcmF0aW9uLCB0aGUKIGZpZWxkIG1hc2sgYXBwbGllcyBkaXJlY3RseSB0byB0aGUgcmVzcG9uc2UsIGJ1dCBpbiBjYXNlIG9mIGEgUkVTVAogbGlzdCBvcGVyYXRpb24sIHRoZSBtYXNrIGluc3RlYWQgYXBwbGllcyB0byBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZQogaW4gdGhlIHJldHVybmVkIHJlc291cmNlIGxpc3QuIEluIGNhc2Ugb2YgYSBSRVNUIGN1c3RvbSBtZXRob2QsCiBvdGhlciBkZWZpbml0aW9ucyBtYXkgYmUgdXNlZC4gV2hlcmUgdGhlIG1hc2sgYXBwbGllcyB3aWxsIGJlCiBjbGVhcmx5IGRvY3VtZW50ZWQgdG9nZXRoZXIgd2l0aCBpdHMgZGVjbGFyYXRpb24gaW4gdGhlIEFQSS4gIEluCiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvbiB0aGUgcmV0dXJuZWQgcmVzb3VyY2UvcmVzb3VyY2VzIGlzIHJlcXVpcmVkCiBiZWhhdmlvciBmb3IgQVBJcy4KCiAjIEZpZWxkIE1hc2tzIGluIFVwZGF0ZSBPcGVyYXRpb25zCgogQSBmaWVsZCBtYXNrIGluIHVwZGF0ZSBvcGVyYXRpb25zIHNwZWNpZmllcyB3aGljaCBmaWVsZHMgb2YgdGhlCiB0YXJnZXRlZCByZXNvdXJjZSBhcmUgZ29pbmcgdG8gYmUgdXBkYXRlZC4gVGhlIEFQSSBpcyByZXF1aXJlZAogdG8gb25seSBjaGFuZ2UgdGhlIHZhbHVlcyBvZiB0aGUgZmllbGRzIGFzIHNwZWNpZmllZCBpbiB0aGUgbWFzawogYW5kIGxlYXZlIHRoZSBvdGhlcnMgdW50b3VjaGVkLiBJZiBhIHJlc291cmNlIGlzIHBhc3NlZCBpbiB0bwogZGVzY3JpYmUgdGhlIHVwZGF0ZWQgdmFsdWVzLCB0aGUgQVBJIGlnbm9yZXMgdGhlIHZhbHVlcyBvZiBhbGwKIGZpZWxkcyBub3QgY292ZXJlZCBieSB0aGUgbWFzay4KCiBJZiBhIHJlcGVhdGVkIGZpZWxkIGlzIHNwZWNpZmllZCBmb3IgYW4gdXBkYXRlIG9wZXJhdGlvbiwgbmV3IHZhbHVlcyB3aWxsCiBiZSBhcHBlbmRlZCB0byB0aGUgZXhpc3RpbmcgcmVwZWF0ZWQgZmllbGQgaW4gdGhlIHRhcmdldCByZXNvdXJjZS4gTm90ZSB0aGF0CiBhIHJlcGVhdGVkIGZpZWxkIGlzIG9ubHkgYWxsb3dlZCBpbiB0aGUgbGFzdCBwb3NpdGlvbiBvZiBhIGBwYXRoc2Agc3RyaW5nLgoKIElmIGEgc3ViLW1lc3NhZ2UgaXMgc3BlY2lmaWVkIGluIHRoZSBsYXN0IHBvc2l0aW9uIG9mIHRoZSBmaWVsZCBtYXNrIGZvciBhbgogdXBkYXRlIG9wZXJhdGlvbiwgdGhlbiBuZXcgdmFsdWUgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUgZXhpc3Rpbmcgc3ViLW1lc3NhZ2UKIGluIHRoZSB0YXJnZXQgcmVzb3VyY2UuCgogRm9yIGV4YW1wbGUsIGdpdmVuIHRoZSB0YXJnZXQgbWVzc2FnZToKCiAgICAgZiB7CiAgICAgICBiIHsKICAgICAgICAgZDogMQogICAgICAgICB4OiAyCiAgICAgICB9CiAgICAgICBjOiBbMV0KICAgICB9CgogQW5kIGFuIHVwZGF0ZSBtZXNzYWdlOgoKICAgICBmIHsKICAgICAgIGIgewogICAgICAgICBkOiAxMAogICAgICAgfQogICAgICAgYzogWzJdCiAgICAgfQoKIHRoZW4gaWYgdGhlIGZpZWxkIG1hc2sgaXM6CgogIHBhdGhzOiBbImYuYiIsICJmLmMiXQoKIHRoZW4gdGhlIHJlc3VsdCB3aWxsIGJlOgoKICAgICBmIHsKICAgICAgIGIgewogICAgICAgICBkOiAxMAogICAgICAgICB4OiAyCiAgICAgICB9CiAgICAgICBjOiBbMSwgMl0KICAgICB9CgogQW4gaW1wbGVtZW50YXRpb24gbWF5IHByb3ZpZGUgb3B0aW9ucyB0byBvdmVycmlkZSB0aGlzIGRlZmF1bHQgYmVoYXZpb3IgZm9yCiByZXBlYXRlZCBhbmQgbWVzc2FnZSBmaWVsZHMuCgogSW4gb3JkZXIgdG8gcmVzZXQgYSBmaWVsZCdzIHZhbHVlIHRvIHRoZSBkZWZhdWx0LCB0aGUgZmllbGQgbXVzdAogYmUgaW4gdGhlIG1hc2sgYW5kIHNldCB0byB0aGUgZGVmYXVsdCB2YWx1ZSBpbiB0aGUgcHJvdmlkZWQgcmVzb3VyY2UuCiBIZW5jZSwgaW4gb3JkZXIgdG8gcmVzZXQgYWxsIGZpZWxkcyBvZiBhIHJlc291cmNlLCBwcm92aWRlIGEgZGVmYXVsdAogaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGFuZCBzZXQgYWxsIGZpZWxkcyBpbiB0aGUgbWFzaywgb3IgZG8KIG5vdCBwcm92aWRlIGEgbWFzayBhcyBkZXNjcmliZWQgYmVsb3cuCgogSWYgYSBmaWVsZCBtYXNrIGlzIG5vdCBwcmVzZW50IG9uIHVwZGF0ZSwgdGhlIG9wZXJhdGlvbiBhcHBsaWVzIHRvCiBhbGwgZmllbGRzIChhcyBpZiBhIGZpZWxkIG1hc2sgb2YgYWxsIGZpZWxkcyBoYXMgYmVlbiBzcGVjaWZpZWQpLgogTm90ZSB0aGF0IGluIHRoZSBwcmVzZW5jZSBvZiBzY2hlbWEgZXZvbHV0aW9uLCB0aGlzIG1heSBtZWFuIHRoYXQKIGZpZWxkcyB0aGUgY2xpZW50IGRvZXMgbm90IGtub3cgYW5kIGhhcyB0aGVyZWZvcmUgbm90IGZpbGxlZCBpbnRvCiB0aGUgcmVxdWVzdCB3aWxsIGJlIHJlc2V0IHRvIHRoZWlyIGRlZmF1bHQuIElmIHRoaXMgaXMgdW53YW50ZWQKIGJlaGF2aW9yLCBhIHNwZWNpZmljIHNlcnZpY2UgbWF5IHJlcXVpcmUgYSBjbGllbnQgdG8gYWx3YXlzIHNwZWNpZnkKIGEgZmllbGQgbWFzaywgcHJvZHVjaW5nIGFuIGVycm9yIGlmIG5vdC4KCiBBcyB3aXRoIGdldCBvcGVyYXRpb25zLCB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHdoaWNoCiBkZXNjcmliZXMgdGhlIHVwZGF0ZWQgdmFsdWVzIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZGVwZW5kcyBvbiB0aGUKIG9wZXJhdGlvbiBraW5kLiBJbiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvZiB0aGUgZmllbGQgbWFzayBpcwogcmVxdWlyZWQgdG8gYmUgaG9ub3JlZCBieSB0aGUgQVBJLgoKICMjIENvbnNpZGVyYXRpb25zIGZvciBIVFRQIFJFU1QKCiBUaGUgSFRUUCBraW5kIG9mIGFuIHVwZGF0ZSBvcGVyYXRpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG1hc2sgbXVzdAogYmUgc2V0IHRvIFBBVENIIGluc3RlYWQgb2YgUFVUIGluIG9yZGVyIHRvIHNhdGlzZnkgSFRUUCBzZW1hbnRpY3MKIChQVVQgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIGZ1bGwgdXBkYXRlcykuCgogIyBKU09OIEVuY29kaW5nIG9mIEZpZWxkIE1hc2tzCgogSW4gSlNPTiwgYSBmaWVsZCBtYXNrIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgc3RyaW5nIHdoZXJlIHBhdGhzIGFyZQogc2VwYXJhdGVkIGJ5IGEgY29tbWEuIEZpZWxkcyBuYW1lIGluIGVhY2ggcGF0aCBhcmUgY29udmVydGVkCiB0by9mcm9tIGxvd2VyLWNhbWVsIG5hbWluZyBjb252ZW50aW9ucy4KCiBBcyBhbiBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2UgZGVjbGFyYXRpb25zOgoKICAgICBtZXNzYWdlIFByb2ZpbGUgewogICAgICAgVXNlciB1c2VyID0gMTsKICAgICAgIFBob3RvIHBob3RvID0gMjsKICAgICB9CiAgICAgbWVzc2FnZSBVc2VyIHsKICAgICAgIHN0cmluZyBkaXNwbGF5X25hbWUgPSAxOwogICAgICAgc3RyaW5nIGFkZHJlc3MgPSAyOwogICAgIH0KCiBJbiBwcm90byBhIGZpZWxkIG1hc2sgZm9yIGBQcm9maWxlYCBtYXkgbG9vayBhcyBzdWNoOgoKICAgICBtYXNrIHsKICAgICAgIHBhdGhzOiAidXNlci5kaXNwbGF5X25hbWUiCiAgICAgICBwYXRoczogInBob3RvIgogICAgIH0KCiBJbiBKU09OLCB0aGUgc2FtZSBtYXNrIGlzIHJlcHJlc2VudGVkIGFzIGJlbG93OgoKICAgICB7CiAgICAgICBtYXNrOiAidXNlci5kaXNwbGF5TmFtZSxwaG90byIKICAgICB9CgogIyBGaWVsZCBNYXNrcyBhbmQgT25lb2YgRmllbGRzCgogRmllbGQgbWFza3MgdHJlYXQgZmllbGRzIGluIG9uZW9mcyBqdXN0IGFzIHJlZ3VsYXIgZmllbGRzLiBDb25zaWRlciB0aGUKIGZvbGxvd2luZyBtZXNzYWdlOgoKICAgICBtZXNzYWdlIFNhbXBsZU1lc3NhZ2UgewogICAgICAgb25lb2YgdGVzdF9vbmVvZiB7CiAgICAgICAgIHN0cmluZyBuYW1lID0gNDsKICAgICAgICAgU3ViTWVzc2FnZSBzdWJfbWVzc2FnZSA9IDk7CiAgICAgICB9CiAgICAgfQoKIFRoZSBmaWVsZCBtYXNrIGNhbiBiZToKCiAgICAgbWFzayB7CiAgICAgICBwYXRoczogIm5hbWUiCiAgICAgfQoKIE9yOgoKICAgICBtYXNrIHsKICAgICAgIHBhdGhzOiAic3ViX21lc3NhZ2UiCiAgICAgfQoKIE5vdGUgdGhhdCBvbmVvZiB0eXBlIG5hbWVzICgidGVzdF9vbmVvZiIgaW4gdGhpcyBjYXNlKSBjYW5ub3QgYmUgdXNlZCBpbgogcGF0aHMuCgogIyMgRmllbGQgTWFzayBWZXJpZmljYXRpb24KCiBUaGUgaW1wbGVtZW50YXRpb24gb2YgYW55IEFQSSBtZXRob2Qgd2hpY2ggaGFzIGEgRmllbGRNYXNrIHR5cGUgZmllbGQgaW4gdGhlCiByZXF1ZXN0IHNob3VsZCB2ZXJpZnkgdGhlIGluY2x1ZGVkIGZpZWxkIHBhdGhzLCBhbmQgcmV0dXJuIGFuCiBgSU5WQUxJRF9BUkdVTUVOVGAgZXJyb3IgaWYgYW55IHBhdGggaXMgdW5tYXBwYWJsZS4KCgsKAwQAARIE8QEIEQosCgQEAAIAEgTzAQIcGh4gVGhlIHNldCBvZiBmaWVsZCBtYXNrIHBhdGhzLgoKDQoFBAACAAQSBPMBAgoKDQoFBAACAAUSBPMBCxEKDQoFBAACAAESBPMBEhcKDQoFBAACAAMSBPMBGhtiBnByb3RvMwrDMQofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bxIPZ29vZ2xlLnByb3RvYnVmIjsKCVRpbWVzdGFtcBIYCgdzZWNvbmRzGAEgASgDUgdzZWNvbmRzEhQKBW5hbm9zGAIgASgFUgVuYW5vc0KFAQoTY29tLmdvb2dsZS5wcm90b2J1ZkIOVGltZXN0YW1wUHJvdG9QAVoyZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvdHlwZXMva25vd24vdGltZXN0YW1wcGL4AQGiAgNHUEKqAh5Hb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXNKwS8KBxIFHgCPAQEKzAwKAQwSAx4AEjLBDCBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KCiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKIG1ldDoKCiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogZGlzdHJpYnV0aW9uLgogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KCggKAQISAyAAGAoICgEIEgMiAB8KCQoCCB8SAyIAHwoICgEIEgMjAEkKCQoCCAsSAyMASQoICgEIEgMkACwKCQoCCAESAyQALAoICgEIEgMlAC8KCQoCCAgSAyUALwoICgEIEgMmACIKCQoCCAoSAyYAIgoICgEIEgMnACEKCQoCCCQSAycAIQoICgEIEgMoADsKCQoCCCUSAygAOwraHQoCBAASBoQBAI8BARrLHSBBIFRpbWVzdGFtcCByZXByZXNlbnRzIGEgcG9pbnQgaW4gdGltZSBpbmRlcGVuZGVudCBvZiBhbnkgdGltZSB6b25lIG9yIGxvY2FsCiBjYWxlbmRhciwgZW5jb2RlZCBhcyBhIGNvdW50IG9mIHNlY29uZHMgYW5kIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGF0CiBuYW5vc2Vjb25kIHJlc29sdXRpb24uIFRoZSBjb3VudCBpcyByZWxhdGl2ZSB0byBhbiBlcG9jaCBhdCBVVEMgbWlkbmlnaHQgb24KIEphbnVhcnkgMSwgMTk3MCwgaW4gdGhlIHByb2xlcHRpYyBHcmVnb3JpYW4gY2FsZW5kYXIgd2hpY2ggZXh0ZW5kcyB0aGUKIEdyZWdvcmlhbiBjYWxlbmRhciBiYWNrd2FyZHMgdG8geWVhciBvbmUuCgogQWxsIG1pbnV0ZXMgYXJlIDYwIHNlY29uZHMgbG9uZy4gTGVhcCBzZWNvbmRzIGFyZSAic21lYXJlZCIgc28gdGhhdCBubyBsZWFwCiBzZWNvbmQgdGFibGUgaXMgbmVlZGVkIGZvciBpbnRlcnByZXRhdGlvbiwgdXNpbmcgYSBbMjQtaG91ciBsaW5lYXIKIHNtZWFyXShodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS90aW1lL3NtZWFyKS4KCiBUaGUgcmFuZ2UgaXMgZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVouIEJ5CiByZXN0cmljdGluZyB0byB0aGF0IHJhbmdlLCB3ZSBlbnN1cmUgdGhhdCB3ZSBjYW4gY29udmVydCB0byBhbmQgZnJvbSBbUkZDCiAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGRhdGUgc3RyaW5ncy4KCiAjIEV4YW1wbGVzCgogRXhhbXBsZSAxOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFBPU0lYIGB0aW1lKClgLgoKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwogICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcyh0aW1lKE5VTEwpKTsKICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKDApOwoKIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBQT1NJWCBgZ2V0dGltZW9mZGF5KClgLgoKICAgICBzdHJ1Y3QgdGltZXZhbCB0djsKICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKCiAgICAgVGltZXN0YW1wIHRpbWVzdGFtcDsKICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHModHYudHZfc2VjKTsKICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKHR2LnR2X3VzZWMgKiAxMDAwKTsKCiBFeGFtcGxlIDM6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gV2luMzIgYEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKClgLgoKICAgICBGSUxFVElNRSBmdDsKICAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOwogICAgIFVJTlQ2NCB0aWNrcyA9ICgoKFVJTlQ2NClmdC5kd0hpZ2hEYXRlVGltZSkgPDwgMzIpIHwgZnQuZHdMb3dEYXRlVGltZTsKCiAgICAgLy8gQSBXaW5kb3dzIHRpY2sgaXMgMTAwIG5hbm9zZWNvbmRzLiBXaW5kb3dzIGVwb2NoIDE2MDEtMDEtMDFUMDA6MDA6MDBaCiAgICAgLy8gaXMgMTE2NDQ0NzM2MDAgc2Vjb25kcyBiZWZvcmUgVW5peCBlcG9jaCAxOTcwLTAxLTAxVDAwOjAwOjAwWi4KICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwogICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcygoSU5UNjQpICgodGlja3MgLyAxMDAwMDAwMCkgLSAxMTY0NDQ3MzYwMExMKSk7CiAgICAgdGltZXN0YW1wLnNldF9uYW5vcygoSU5UMzIpICgodGlja3MgJSAxMDAwMDAwMCkgKiAxMDApKTsKCiBFeGFtcGxlIDQ6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gSmF2YSBgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKClgLgoKICAgICBsb25nIG1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwoKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gVGltZXN0YW1wLm5ld0J1aWxkZXIoKS5zZXRTZWNvbmRzKG1pbGxpcyAvIDEwMDApCiAgICAgICAgIC5zZXROYW5vcygoaW50KSAoKG1pbGxpcyAlIDEwMDApICogMTAwMDAwMCkpLmJ1aWxkKCk7CgogRXhhbXBsZSA1OiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIEphdmEgYEluc3RhbnQubm93KClgLgoKICAgICBJbnN0YW50IG5vdyA9IEluc3RhbnQubm93KCk7CgogICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPQogICAgICAgICBUaW1lc3RhbXAubmV3QnVpbGRlcigpLnNldFNlY29uZHMobm93LmdldEVwb2NoU2Vjb25kKCkpCiAgICAgICAgICAgICAuc2V0TmFub3Mobm93LmdldE5hbm8oKSkuYnVpbGQoKTsKCiBFeGFtcGxlIDY6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gY3VycmVudCB0aW1lIGluIFB5dGhvbi4KCiAgICAgdGltZXN0YW1wID0gVGltZXN0YW1wKCkKICAgICB0aW1lc3RhbXAuR2V0Q3VycmVudFRpbWUoKQoKICMgSlNPTiBNYXBwaW5nCgogSW4gSlNPTiBmb3JtYXQsIHRoZSBUaW1lc3RhbXAgdHlwZSBpcyBlbmNvZGVkIGFzIGEgc3RyaW5nIGluIHRoZQogW1JGQyAzMzM5XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpIGZvcm1hdC4gVGhhdCBpcywgdGhlCiBmb3JtYXQgaXMgInt5ZWFyfS17bW9udGh9LXtkYXl9VHtob3VyfTp7bWlufTp7c2VjfVsue2ZyYWNfc2VjfV1aIgogd2hlcmUge3llYXJ9IGlzIGFsd2F5cyBleHByZXNzZWQgdXNpbmcgZm91ciBkaWdpdHMgd2hpbGUge21vbnRofSwge2RheX0sCiB7aG91cn0sIHttaW59LCBhbmQge3NlY30gYXJlIHplcm8tcGFkZGVkIHRvIHR3byBkaWdpdHMgZWFjaC4gVGhlIGZyYWN0aW9uYWwKIHNlY29uZHMsIHdoaWNoIGNhbiBnbyB1cCB0byA5IGRpZ2l0cyAoaS5lLiB1cCB0byAxIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiksCiBhcmUgb3B0aW9uYWwuIFRoZSAiWiIgc3VmZml4IGluZGljYXRlcyB0aGUgdGltZXpvbmUgKCJVVEMiKTsgdGhlIHRpbWV6b25lCiBpcyByZXF1aXJlZC4gQSBwcm90bzMgSlNPTiBzZXJpYWxpemVyIHNob3VsZCBhbHdheXMgdXNlIFVUQyAoYXMgaW5kaWNhdGVkIGJ5CiAiWiIpIHdoZW4gcHJpbnRpbmcgdGhlIFRpbWVzdGFtcCB0eXBlIGFuZCBhIHByb3RvMyBKU09OIHBhcnNlciBzaG91bGQgYmUKIGFibGUgdG8gYWNjZXB0IGJvdGggVVRDIGFuZCBvdGhlciB0aW1lem9uZXMgKGFzIGluZGljYXRlZCBieSBhbiBvZmZzZXQpLgoKIEZvciBleGFtcGxlLCAiMjAxNy0wMS0xNVQwMTozMDoxNS4wMVoiIGVuY29kZXMgMTUuMDEgc2Vjb25kcyBwYXN0CiAwMTozMCBVVEMgb24gSmFudWFyeSAxNSwgMjAxNy4KCiBJbiBKYXZhU2NyaXB0LCBvbmUgY2FuIGNvbnZlcnQgYSBEYXRlIG9iamVjdCB0byB0aGlzIGZvcm1hdCB1c2luZyB0aGUKIHN0YW5kYXJkCiBbdG9JU09TdHJpbmcoKV0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZS90b0lTT1N0cmluZykKIG1ldGhvZC4gSW4gUHl0aG9uLCBhIHN0YW5kYXJkIGBkYXRldGltZS5kYXRldGltZWAgb2JqZWN0IGNhbiBiZSBjb252ZXJ0ZWQKIHRvIHRoaXMgZm9ybWF0IHVzaW5nCiBbYHN0cmZ0aW1lYF0oaHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMi9saWJyYXJ5L3RpbWUuaHRtbCN0aW1lLnN0cmZ0aW1lKSB3aXRoCiB0aGUgdGltZSBmb3JtYXQgc3BlYyAnJVktJW0tJWRUJUg6JU06JVMuJWZaJy4gTGlrZXdpc2UsIGluIEphdmEsIG9uZSBjYW4gdXNlCiB0aGUgSm9kYSBUaW1lJ3MgW2BJU09EYXRlVGltZUZvcm1hdC5kYXRlVGltZSgpYF0oCiBodHRwOi8vam9kYS10aW1lLnNvdXJjZWZvcmdlLm5ldC9hcGlkb2NzL29yZy9qb2RhL3RpbWUvZm9ybWF0L0lTT0RhdGVUaW1lRm9ybWF0Lmh0bWwjZGF0ZVRpbWUoKQogKSB0byBvYnRhaW4gYSBmb3JtYXR0ZXIgY2FwYWJsZSBvZiBnZW5lcmF0aW5nIHRpbWVzdGFtcHMgaW4gdGhpcyBmb3JtYXQuCgoKCwoDBAABEgSEAQgRCp0BCgQEAAIAEgSIAQIUGo4BIFJlcHJlc2VudHMgc2Vjb25kcyBvZiBVVEMgdGltZSBzaW5jZSBVbml4IGVwb2NoCiAxOTcwLTAxLTAxVDAwOjAwOjAwWi4gTXVzdCBiZSBmcm9tIDAwMDEtMDEtMDFUMDA6MDA6MDBaIHRvCiA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuCgoNCgUEAAIABRIEiAECBwoNCgUEAAIAARIEiAEIDwoNCgUEAAIAAxIEiAESEwrlAQoEBAACARIEjgECEhrWASBOb24tbmVnYXRpdmUgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbi4gTmVnYXRpdmUKIHNlY29uZCB2YWx1ZXMgd2l0aCBmcmFjdGlvbnMgbXVzdCBzdGlsbCBoYXZlIG5vbi1uZWdhdGl2ZSBuYW5vcyB2YWx1ZXMKIHRoYXQgY291bnQgZm9yd2FyZCBpbiB0aW1lLiBNdXN0IGJlIGZyb20gMCB0byA5OTksOTk5LDk5OQogaW5jbHVzaXZlLgoKDQoFBAACAQUSBI4BAgcKDQoFBAACAQESBI4BCA0KDQoFBAACAQMSBI4BEBFiBnByb3RvMwqx7gwKG2J1Zi92YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxIMYnVmLnZhbGlkYXRlGiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bxoeZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvGiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bxofZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byJQCgRSdWxlEg4KAmlkGAEgASgJUgJpZBIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlEh4KCmV4cHJlc3Npb24YAyABKAlSCmV4cHJlc3Npb24ioQEKDE1lc3NhZ2VSdWxlcxIlCg5jZWxfZXhwcmVzc2lvbhgFIAMoCVINY2VsRXhwcmVzc2lvbhIkCgNjZWwYAyADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsEjQKBW9uZW9mGAQgAygLMh4uYnVmLnZhbGlkYXRlLk1lc3NhZ2VPbmVvZlJ1bGVSBW9uZW9mSgQIARACUghkaXNhYmxlZCJGChBNZXNzYWdlT25lb2ZSdWxlEhYKBmZpZWxkcxgBIAMoCVIGZmllbGRzEhoKCHJlcXVpcmVkGAIgASgIUghyZXF1aXJlZCIoCgpPbmVvZlJ1bGVzEhoKCHJlcXVpcmVkGAEgASgIUghyZXF1aXJlZCLjCgoKRmllbGRSdWxlcxIlCg5jZWxfZXhwcmVzc2lvbhgdIAMoCVINY2VsRXhwcmVzc2lvbhIkCgNjZWwYFyADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsEhoKCHJlcXVpcmVkGBkgASgIUghyZXF1aXJlZBIsCgZpZ25vcmUYGyABKA4yFC5idWYudmFsaWRhdGUuSWdub3JlUgZpZ25vcmUSMAoFZmxvYXQYASABKAsyGC5idWYudmFsaWRhdGUuRmxvYXRSdWxlc0gAUgVmbG9hdBIzCgZkb3VibGUYAiABKAsyGS5idWYudmFsaWRhdGUuRG91YmxlUnVsZXNIAFIGZG91YmxlEjAKBWludDMyGAMgASgLMhguYnVmLnZhbGlkYXRlLkludDMyUnVsZXNIAFIFaW50MzISMAoFaW50NjQYBCABKAsyGC5idWYudmFsaWRhdGUuSW50NjRSdWxlc0gAUgVpbnQ2NBIzCgZ1aW50MzIYBSABKAsyGS5idWYudmFsaWRhdGUuVUludDMyUnVsZXNIAFIGdWludDMyEjMKBnVpbnQ2NBgGIAEoCzIZLmJ1Zi52YWxpZGF0ZS5VSW50NjRSdWxlc0gAUgZ1aW50NjQSMwoGc2ludDMyGAcgASgLMhkuYnVmLnZhbGlkYXRlLlNJbnQzMlJ1bGVzSABSBnNpbnQzMhIzCgZzaW50NjQYCCABKAsyGS5idWYudmFsaWRhdGUuU0ludDY0UnVsZXNIAFIGc2ludDY0EjYKB2ZpeGVkMzIYCSABKAsyGi5idWYudmFsaWRhdGUuRml4ZWQzMlJ1bGVzSABSB2ZpeGVkMzISNgoHZml4ZWQ2NBgKIAEoCzIaLmJ1Zi52YWxpZGF0ZS5GaXhlZDY0UnVsZXNIAFIHZml4ZWQ2NBI5CghzZml4ZWQzMhgLIAEoCzIbLmJ1Zi52YWxpZGF0ZS5TRml4ZWQzMlJ1bGVzSABSCHNmaXhlZDMyEjkKCHNmaXhlZDY0GAwgASgLMhsuYnVmLnZhbGlkYXRlLlNGaXhlZDY0UnVsZXNIAFIIc2ZpeGVkNjQSLQoEYm9vbBgNIAEoCzIXLmJ1Zi52YWxpZGF0ZS5Cb29sUnVsZXNIAFIEYm9vbBIzCgZzdHJpbmcYDiABKAsyGS5idWYudmFsaWRhdGUuU3RyaW5nUnVsZXNIAFIGc3RyaW5nEjAKBWJ5dGVzGA8gASgLMhguYnVmLnZhbGlkYXRlLkJ5dGVzUnVsZXNIAFIFYnl0ZXMSLQoEZW51bRgQIAEoCzIXLmJ1Zi52YWxpZGF0ZS5FbnVtUnVsZXNIAFIEZW51bRI5CghyZXBlYXRlZBgSIAEoCzIbLmJ1Zi52YWxpZGF0ZS5SZXBlYXRlZFJ1bGVzSABSCHJlcGVhdGVkEioKA21hcBgTIAEoCzIWLmJ1Zi52YWxpZGF0ZS5NYXBSdWxlc0gAUgNtYXASKgoDYW55GBQgASgLMhYuYnVmLnZhbGlkYXRlLkFueVJ1bGVzSABSA2FueRI5CghkdXJhdGlvbhgVIAEoCzIbLmJ1Zi52YWxpZGF0ZS5EdXJhdGlvblJ1bGVzSABSCGR1cmF0aW9uEj0KCmZpZWxkX21hc2sYHCABKAsyHC5idWYudmFsaWRhdGUuRmllbGRNYXNrUnVsZXNIAFIJZmllbGRNYXNrEjwKCXRpbWVzdGFtcBgWIAEoCzIcLmJ1Zi52YWxpZGF0ZS5UaW1lc3RhbXBSdWxlc0gAUgl0aW1lc3RhbXBCBgoEdHlwZUoECBgQGUoECBoQG1IHc2tpcHBlZFIMaWdub3JlX2VtcHR5IloKD1ByZWRlZmluZWRSdWxlcxIkCgNjZWwYASADKAsyEi5idWYudmFsaWRhdGUuUnVsZVIDY2VsSgQIGBAZSgQIGhAbUgdza2lwcGVkUgxpZ25vcmVfZW1wdHkikBgKCkZsb2F0UnVsZXMSigEKBWNvbnN0GAEgASgCQnTCSHEKbwoLZmxvYXQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSowEKAmx0GAIgASgCQpABwkiMAQqJAQoIZmxvYXQubHQafSFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0ErQBCgNsdGUYAyABKAJCnwHCSJsBCpgBCglmbG9hdC5sdGUaigEhaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlKT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIAFIDbHRlEvMHCgJndBgEIAEoAkLgB8JI3AcKjQEKCGZsb2F0Lmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKwwEKC2Zsb2F0Lmd0X2x0GrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKzQEKFWZsb2F0Lmd0X2x0X2V4Y2x1c2l2ZRqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCtMBCgxmbG9hdC5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrdAQoWZmxvYXQuZ3RfbHRlX2V4Y2x1c2l2ZRrCAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0Er8ICgNndGUYBSABKAJCqgjCSKYICpsBCglmbG9hdC5ndGUajQEhaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycK0gEKDGZsb2F0Lmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3AEKFmZsb2F0Lmd0ZV9sdF9leGNsdXNpdmUawQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCuIBCg1mbG9hdC5ndGVfbHRlGtABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrsAQoXZmxvYXQuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKDAQoCaW4YBiADKAJCc8JIcApuCghmbG9hdC5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn0KBm5vdF9pbhgHIAMoAkJmwkhjCmEKDGZsb2F0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhJ9CgZmaW5pdGUYCCABKAhCZcJIYgpgCgxmbG9hdC5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnUgZmaW5pdGUSNAoHZXhhbXBsZRgJIAMoAkIawkgXChUKDWZsb2F0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIqIYCgtEb3VibGVSdWxlcxKLAQoFY29uc3QYASABKAFCdcJIcgpwCgxkb3VibGUuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSpAEKAmx0GAIgASgBQpEBwkiNAQqKAQoJZG91YmxlLmx0Gn0haGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0KT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBK1AQoDbHRlGAMgASgBQqABwkicAQqZAQoKZG91YmxlLmx0ZRqKASFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPiBydWxlcy5sdGUpPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUS+AcKAmd0GAQgASgBQuUHwkjhBwqOAQoJZG91YmxlLmd0GoABIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKxAEKDGRvdWJsZS5ndF9sdBqzAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCs4BChZkb3VibGUuZ3RfbHRfZXhjbHVzaXZlGrMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmICh0aGlzLmlzTmFuKCkgfHwgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCkpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycK1AEKDWRvdWJsZS5ndF9sdGUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMuaXNOYW4oKSB8fCB0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwreAQoXZG91YmxlLmd0X2x0ZV9leGNsdXNpdmUawgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLECAoDZ3RlGAUgASgBQq8IwkirCAqcAQoKZG91YmxlLmd0ZRqNASFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiAodGhpcy5pc05hbigpIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrTAQoNZG91YmxlLmd0ZV9sdBrBAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK3QEKF2RvdWJsZS5ndGVfbHRfZXhjbHVzaXZlGsEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAodGhpcy5pc05hbigpIHx8IChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrjAQoOZG91YmxlLmd0ZV9sdGUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzLmlzTmFuKCkgfHwgdGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCu0BChhkb3VibGUuZ3RlX2x0ZV9leGNsdXNpdmUa0AFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHRoaXMuaXNOYW4oKSB8fCAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKEAQoCaW4YBiADKAFCdMJIcQpvCglkb3VibGUuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ+CgZub3RfaW4YByADKAFCZ8JIZApiCg1kb3VibGUubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJydSBW5vdEluEn4KBmZpbml0ZRgIIAEoCEJmwkhjCmEKDWRvdWJsZS5maW5pdGUaUHJ1bGVzLmZpbml0ZSA/ICh0aGlzLmlzTmFuKCkgfHwgdGhpcy5pc0luZigpID8gJ3ZhbHVlIG11c3QgYmUgZmluaXRlJyA6ICcnKSA6ICcnUgZmaW5pdGUSNQoHZXhhbXBsZRgJIAMoAUIbwkgYChYKDmRvdWJsZS5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiK6FQoKSW50MzJSdWxlcxKKAQoFY29uc3QYASABKAVCdMJIcQpvCgtpbnQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKOAQoCbHQYAiABKAVCfMJIeQp3CghpbnQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSoQEKA2x0ZRgDIAEoBUKMAcJIiAEKhQEKCWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKbBwoCZ3QYBCABKAVCiAfCSIQHCnoKCGludDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwqzAQoLaW50MzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCrsBChVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrDAQoMaW50MzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrLAQoWaW50MzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EugHCgNndGUYBSABKAVC0wfCSM8HCogBCglpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrCAQoMaW50MzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCsoBChZpbnQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrSAQoNaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwraAQoXaW50MzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKDAQoCaW4YBiADKAVCc8JIcApuCghpbnQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn0KBm5vdF9pbhgHIAMoBUJmwkhjCmEKDGludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI0CgdleGFtcGxlGAggAygFQhrCSBcKFQoNaW50MzIuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iuhUKCkludDY0UnVsZXMSigEKBWNvbnN0GAEgASgDQnTCSHEKbwoLaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjgEKAmx0GAIgASgDQnzCSHkKdwoIaW50NjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0EqEBCgNsdGUYAyABKANCjAHCSIgBCoUBCglpbnQ2NC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUSmwcKAmd0GAQgASgDQogHwkiEBwp6CghpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKswEKC2ludDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq7AQoVaW50NjQuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKwwEKDGludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKywEKFmludDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLoBwoDZ3RlGAUgASgDQtMHwkjPBwqIAQoJaW50NjQuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKwgEKDGludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrKAQoWaW50NjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK0gEKDWludDY0Lmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK2gEKF2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUSgwEKAmluGAYgAygDQnPCSHAKbgoIaW50NjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ9CgZub3RfaW4YByADKANCZsJIYwphCgxpbnQ2NC5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNAoHZXhhbXBsZRgJIAMoA0IawkgXChUKDWludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtVSW50MzJSdWxlcxKLAQoFY29uc3QYASABKA1CdcJIcgpwCgx1aW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgNQn3CSHoKeAoJdWludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgNQo0BwkiJAQqGAQoKdWludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKA1CjQfCSIkHCnsKCXVpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoDULYB8JI1AcKiQEKCnVpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygNQnTCSHEKbwoJdWludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygNQmfCSGQKYgoNdWludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygNQhvCSBgKFgoOdWludDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtVSW50NjRSdWxlcxKLAQoFY29uc3QYASABKARCdcJIcgpwCgx1aW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgEQn3CSHoKeAoJdWludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgEQo0BwkiJAQqGAQoKdWludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKARCjQfCSIkHCnsKCXVpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHVpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnVpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNdWludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3VpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoBELYB8JI1AcKiQEKCnVpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNdWludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXdWludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg51aW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYdWludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygEQnTCSHEKbwoJdWludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygEQmfCSGQKYgoNdWludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygEQhvCSBgKFgoOdWludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtTSW50MzJSdWxlcxKLAQoFY29uc3QYASABKBFCdcJIcgpwCgxzaW50MzIuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgRQn3CSHoKeAoJc2ludDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgRQo0BwkiJAQqGAQoKc2ludDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKBFCjQfCSIkHCnsKCXNpbnQzMi5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDMyLmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoEULYB8JI1AcKiQEKCnNpbnQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDMyLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50MzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDMyLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygRQnTCSHEKbwoJc2ludDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygRQmfCSGQKYgoNc2ludDMyLm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygRQhvCSBgKFgoOc2ludDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIssVCgtTSW50NjRSdWxlcxKLAQoFY29uc3QYASABKBJCdcJIcgpwCgxzaW50NjQuY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSjwEKAmx0GAIgASgSQn3CSHoKeAoJc2ludDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKiAQoDbHRlGAMgASgSQo0BwkiJAQqGAQoKc2ludDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKgBwoCZ3QYBCABKBJCjQfCSIkHCnsKCXNpbnQ2NC5ndBpuIWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPD0gcnVsZXMuZ3Q/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndF0pIDogJycKtAEKDHNpbnQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvAEKFnNpbnQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrEAQoNc2ludDY0Lmd0X2x0ZRqyAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndCAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJycKzAEKF3NpbnQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS7QcKA2d0ZRgFIAEoEkLYB8JI1AcKiQEKCnNpbnQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrDAQoNc2ludDY0Lmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrLAQoXc2ludDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtMBCg5zaW50NjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrbAQoYc2ludDY0Lmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUShAEKAmluGAYgAygSQnTCSHEKbwoJc2ludDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfgoGbm90X2luGAcgAygSQmfCSGQKYgoNc2ludDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI1CgdleGFtcGxlGAggAygSQhvCSBgKFgoOc2ludDY0LmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuItwVCgxGaXhlZDMyUnVsZXMSjAEKBWNvbnN0GAEgASgHQnbCSHMKcQoNZml4ZWQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKQAQoCbHQYAiABKAdCfsJIewp5CgpmaXhlZDMyLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKjAQoDbHRlGAMgASgHQo4BwkiKAQqHAQoLZml4ZWQzMi5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUSpQcKAmd0GAQgASgHQpIHwkiOBwp8CgpmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq1AQoNZml4ZWQzMi5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvQEKF2ZpeGVkMzIuZ3RfbHRfZXhjbHVzaXZlGqEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKxQEKDmZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrNAQoYZml4ZWQzMi5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS8gcKA2d0ZRgFIAEoB0LdB8JI2QcKigEKC2ZpeGVkMzIuZ3RlGnshaGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8IHJ1bGVzLmd0ZT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZV0pIDogJycKxAEKDmZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCswBChhmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtQBCg9maXhlZDMyLmd0ZV9sdGUawAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3RlICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJycK3AEKGWZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKFAQoCaW4YBiADKAdCdcJIcgpwCgpmaXhlZDMyLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfwoGbm90X2luGAcgAygHQmjCSGUKYwoOZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNgoHZXhhbXBsZRgIIAMoB0IcwkgZChcKD2ZpeGVkMzIuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i3BUKDEZpeGVkNjRSdWxlcxKMAQoFY29uc3QYASABKAZCdsJIcwpxCg1maXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EpABCgJsdBgCIAEoBkJ+wkh7CnkKCmZpeGVkNjQubHQaayFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID49IHJ1bGVzLmx0PyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMubHRdKSA6ICcnSABSAmx0EqMBCgNsdGUYAyABKAZCjgHCSIoBCocBCgtmaXhlZDY0Lmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKlBwoCZ3QYBCABKAZCkgfCSI4HCnwKCmZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrUBCg1maXhlZDY0Lmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq9AQoXZml4ZWQ2NC5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrFAQoOZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs0BChhmaXhlZDY0Lmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBLyBwoDZ3RlGAUgASgGQt0HwkjZBwqKAQoLZml4ZWQ2NC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrEAQoOZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzAEKGGZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZRqvAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycK1AEKD2ZpeGVkNjQuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrcAQoZZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIAVIDZ3RlEoUBCgJpbhgGIAMoBkJ1wkhyCnAKCmZpeGVkNjQuaW4aYiEodGhpcyBpbiBnZXRGaWVsZChydWxlcywgJ2luJykpID8gJ3ZhbHVlIG11c3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2luJyldKSA6ICcnUgJpbhJ/CgZub3RfaW4YByADKAZCaMJIZQpjCg5maXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI2CgdleGFtcGxlGAggAygGQhzCSBkKFwoPZml4ZWQ2NC5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCCwoJbGVzc190aGFuQg4KDGdyZWF0ZXJfdGhhbiLuFQoNU0ZpeGVkMzJSdWxlcxKNAQoFY29uc3QYASABKA9Cd8JIdApyCg5zZml4ZWQzMi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKRAQoCbHQYAiABKA9Cf8JIfAp6CgtzZml4ZWQzMi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSpAEKA2x0ZRgDIAEoD0KPAcJIiwEKiAEKDHNmaXhlZDMyLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRKqBwoCZ3QYBCABKA9ClwfCSJMHCn0KC3NmaXhlZDMyLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOc2ZpeGVkMzIuZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhzZml4ZWQzMi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPc2ZpeGVkMzIuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZc2ZpeGVkMzIuZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EvcHCgNndGUYBSABKA9C4gfCSN4HCosBCgxzZml4ZWQzMi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPc2ZpeGVkMzIuZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlzZml4ZWQzMi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQc2ZpeGVkMzIuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoac2ZpeGVkMzIuZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKGAQoCaW4YBiADKA9CdsJIcwpxCgtzZml4ZWQzMi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEoABCgZub3RfaW4YByADKA9CacJIZgpkCg9zZml4ZWQzMi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SNwoHZXhhbXBsZRgIIAMoD0IdwkgaChgKEHNmaXhlZDMyLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIu4VCg1TRml4ZWQ2NFJ1bGVzEo0BCgVjb25zdBgBIAEoEEJ3wkh0CnIKDnNmaXhlZDY0LmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EpEBCgJsdBgCIAEoEEJ/wkh8CnoKC3NmaXhlZDY0Lmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBKkAQoDbHRlGAMgASgQQo8BwkiLAQqIAQoMc2ZpeGVkNjQubHRlGnghaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+IHJ1bGVzLmx0ZT8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmx0ZV0pIDogJydIAFIDbHRlEqoHCgJndBgEIAEoEEKXB8JIkwcKfQoLc2ZpeGVkNjQuZ3QabiFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDw9IHJ1bGVzLmd0PyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RdKSA6ICcnCrYBCg5zZml4ZWQ2NC5ndF9sdBqjAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdF0pIDogJycKvgEKGHNmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCsYBCg9zZml4ZWQ2NC5ndF9sdGUasgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPj0gcnVsZXMuZ3QgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnCs4BChlzZml4ZWQ2NC5ndF9sdGVfZXhjbHVzaXZlGrABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0ZV0pIDogJydIAVICZ3QS9wcKA2d0ZRgFIAEoEELiB8JI3gcKiwEKDHNmaXhlZDY0Lmd0ZRp7IWhhcyhydWxlcy5sdCkgJiYgIWhhcyhydWxlcy5sdGUpICYmIHRoaXMgPCBydWxlcy5ndGU/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGVdKSA6ICcnCsUBCg9zZml4ZWQ2NC5ndGVfbHQasQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdF0pIDogJycKzQEKGXNmaXhlZDY0Lmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtUBChBzZml4ZWQ2NC5ndGVfbHRlGsABaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ZSAmJiAodGhpcyA+IHJ1bGVzLmx0ZSB8fCB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnCt0BChpzZml4ZWQ2NC5ndGVfbHRlX2V4Y2x1c2l2ZRq+AWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0ZV0pIDogJydIAVIDZ3RlEoYBCgJpbhgGIAMoEEJ2wkhzCnEKC3NmaXhlZDY0LmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SgAEKBm5vdF9pbhgHIAMoEEJpwkhmCmQKD3NmaXhlZDY0Lm5vdF9pbhpRdGhpcyBpbiBydWxlcy5ub3RfaW4gPyAndmFsdWUgbXVzdCBub3QgYmUgaW4gbGlzdCAlcycuZm9ybWF0KFtydWxlcy5ub3RfaW5dKSA6ICcnUgVub3RJbhI3CgdleGFtcGxlGAggAygQQh3CSBoKGAoQc2ZpeGVkNjQuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4i1wEKCUJvb2xSdWxlcxKJAQoFY29uc3QYASABKAhCc8JIcApuCgpib29sLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0EjMKB2V4YW1wbGUYAiADKAhCGcJIFgoUCgxib29sLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAiLPOwoLU3RyaW5nUnVsZXMSjQEKBWNvbnN0GAEgASgJQnfCSHQKcgoMc3RyaW5nLmNvbnN0GmJ0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsIGAlc2AnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSgwEKA2xlbhgTIAEoBEJxwkhuCmwKCnN0cmluZy5sZW4aXnVpbnQodGhpcy5zaXplKCkpICE9IHJ1bGVzLmxlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSAlcyBjaGFyYWN0ZXJzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJydSA2xlbhKhAQoHbWluX2xlbhgCIAEoBEKHAcJIgwEKgAEKDnN0cmluZy5taW5fbGVuGm51aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9sZW4gPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJ1IGbWluTGVuEp8BCgdtYXhfbGVuGAMgASgEQoUBwkiBAQp/Cg5zdHJpbmcubWF4X2xlbhptdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlIGF0IG1vc3QgJXMgY2hhcmFjdGVycycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJ1IGbWF4TGVuEqUBCglsZW5fYnl0ZXMYFCABKARChwHCSIMBCoABChBzdHJpbmcubGVuX2J5dGVzGmx1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgIT0gcnVsZXMubGVuX2J5dGVzID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl9ieXRlc10pIDogJydSCGxlbkJ5dGVzEq0BCgltaW5fYnl0ZXMYBCABKARCjwHCSIsBCogBChBzdHJpbmcubWluX2J5dGVzGnR1aW50KGJ5dGVzKHRoaXMpLnNpemUoKSkgPCBydWxlcy5taW5fYnl0ZXMgPyAndmFsdWUgbGVuZ3RoIG11c3QgYmUgYXQgbGVhc3QgJXMgYnl0ZXMnLmZvcm1hdChbcnVsZXMubWluX2J5dGVzXSkgOiAnJ1IIbWluQnl0ZXMSrAEKCW1heF9ieXRlcxgFIAEoBEKOAcJIigEKhwEKEHN0cmluZy5tYXhfYnl0ZXMac3VpbnQoYnl0ZXModGhpcykuc2l6ZSgpKSA+IHJ1bGVzLm1heF9ieXRlcyA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBtb3N0ICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLm1heF9ieXRlc10pIDogJydSCG1heEJ5dGVzEpYBCgdwYXR0ZXJuGAYgASgJQnzCSHkKdwoOc3RyaW5nLnBhdHRlcm4aZSF0aGlzLm1hdGNoZXMocnVsZXMucGF0dGVybikgPyAndmFsdWUgZG9lcyBub3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnUgdwYXR0ZXJuEowBCgZwcmVmaXgYByABKAlCdMJIcQpvCg1zdHJpbmcucHJlZml4Gl4hdGhpcy5zdGFydHNXaXRoKHJ1bGVzLnByZWZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBwcmVmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnUgZwcmVmaXgSigEKBnN1ZmZpeBgIIAEoCUJywkhvCm0KDXN0cmluZy5zdWZmaXgaXCF0aGlzLmVuZHNXaXRoKHJ1bGVzLnN1ZmZpeCkgPyAndmFsdWUgZG9lcyBub3QgaGF2ZSBzdWZmaXggYCVzYCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnUgZzdWZmaXgSmgEKCGNvbnRhaW5zGAkgASgJQn7CSHsKeQoPc3RyaW5nLmNvbnRhaW5zGmYhdGhpcy5jb250YWlucyhydWxlcy5jb250YWlucykgPyAndmFsdWUgZG9lcyBub3QgY29udGFpbiBzdWJzdHJpbmcgYCVzYCcuZm9ybWF0KFtydWxlcy5jb250YWluc10pIDogJydSCGNvbnRhaW5zEqUBCgxub3RfY29udGFpbnMYFyABKAlCgQHCSH4KfAoTc3RyaW5nLm5vdF9jb250YWlucxpldGhpcy5jb250YWlucyhydWxlcy5ub3RfY29udGFpbnMpID8gJ3ZhbHVlIGNvbnRhaW5zIHN1YnN0cmluZyBgJXNgJy5mb3JtYXQoW3J1bGVzLm5vdF9jb250YWluc10pIDogJydSC25vdENvbnRhaW5zEoQBCgJpbhgKIAMoCUJ0wkhxCm8KCXN0cmluZy5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEn4KBm5vdF9pbhgLIAMoCUJnwkhkCmIKDXN0cmluZy5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4S5gEKBWVtYWlsGAwgASgIQs0BwkjJAQphCgxzdHJpbmcuZW1haWwSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGiwhcnVsZXMuZW1haWwgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzRW1haWwoKQpkChJzdHJpbmcuZW1haWxfZW1wdHkSMnZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzGhohcnVsZXMuZW1haWwgfHwgdGhpcyAhPSAnJ0gAUgVlbWFpbBLxAQoIaG9zdG5hbWUYDSABKAhC0gHCSM4BCmUKD3N0cmluZy5ob3N0bmFtZRIedmFsdWUgbXVzdCBiZSBhIHZhbGlkIGhvc3RuYW1lGjIhcnVsZXMuaG9zdG5hbWUgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKQplChVzdHJpbmcuaG9zdG5hbWVfZW1wdHkSLXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0bmFtZRodIXJ1bGVzLmhvc3RuYW1lIHx8IHRoaXMgIT0gJydIAFIIaG9zdG5hbWUSywEKAmlwGA4gASgIQrgBwki0AQpVCglzdHJpbmcuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGiYhcnVsZXMuaXAgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSXAoKQpbCg9zdHJpbmcuaXBfZW1wdHkSL3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUCBhZGRyZXNzGhchcnVsZXMuaXAgfHwgdGhpcyAhPSAnJ0gAUgJpcBLcAQoEaXB2NBgPIAEoCELFAcJIwQEKXAoLc3RyaW5nLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaKSFydWxlcy5pcHY0IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwKDQpCmEKEXN0cmluZy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGhkhcnVsZXMuaXB2NCB8fCB0aGlzICE9ICcnSABSBGlwdjQS3AEKBGlwdjYYECABKAhCxQHCSMEBClwKC3N0cmluZy5pcHY2EiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBhZGRyZXNzGikhcnVsZXMuaXB2NiB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcCg2KQphChFzdHJpbmcuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxoZIXJ1bGVzLmlwdjYgfHwgdGhpcyAhPSAnJ0gAUgRpcHY2EsQBCgN1cmkYESABKAhCrwHCSKsBClEKCnN0cmluZy51cmkSGXZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkaKCFydWxlcy51cmkgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzVXJpKCkKVgoQc3RyaW5nLnVyaV9lbXB0eRIodmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVSSRoYIXJ1bGVzLnVyaSB8fCB0aGlzICE9ICcnSABSA3VyaRJ4Cgd1cmlfcmVmGBIgASgIQl3CSFoKWAoOc3RyaW5nLnVyaV9yZWYSI3ZhbHVlIG11c3QgYmUgYSB2YWxpZCBVUkkgUmVmZXJlbmNlGiEhcnVsZXMudXJpX3JlZiB8fCB0aGlzLmlzVXJpUmVmKClIAFIGdXJpUmVmEpkCCgdhZGRyZXNzGBUgASgIQvwBwkj4AQqBAQoOc3RyaW5nLmFkZHJlc3MSLXZhbHVlIG11c3QgYmUgYSB2YWxpZCBob3N0bmFtZSwgb3IgaXAgYWRkcmVzcxpAIXJ1bGVzLmFkZHJlc3MgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdG5hbWUoKSB8fCB0aGlzLmlzSXAoKQpyChRzdHJpbmcuYWRkcmVzc19lbXB0eRI8dmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIGhvc3RuYW1lLCBvciBpcCBhZGRyZXNzGhwhcnVsZXMuYWRkcmVzcyB8fCB0aGlzICE9ICcnSABSB2FkZHJlc3MSngIKBHV1aWQYFiABKAhChwLCSIMCCqUBCgtzdHJpbmcudXVpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVVSUQaeiFydWxlcy51dWlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtOWEtZkEtRl17OH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17NH0tWzAtOWEtZkEtRl17MTJ9JCcpClkKEXN0cmluZy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBoZIXJ1bGVzLnV1aWQgfHwgdGhpcyAhPSAnJ0gAUgR1dWlkEvcBCgV0dXVpZBghIAEoCELeAcJI2gEKcwoMc3RyaW5nLnR1dWlkEiJ2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgdHJpbW1lZCBVVUlEGj8hcnVsZXMudHV1aWQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLm1hdGNoZXMoJ15bMC05YS1mQS1GXXszMn0kJykKYwoSc3RyaW5nLnR1dWlkX2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgdHJpbW1lZCBVVUlEGhohcnVsZXMudHV1aWQgfHwgdGhpcyAhPSAnJ0gAUgV0dXVpZBKnAgoRaXBfd2l0aF9wcmVmaXhsZW4YGiABKAhC+AHCSPQBCngKGHN0cmluZy5pcF93aXRoX3ByZWZpeGxlbhIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo7IXJ1bGVzLmlwX3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KCkKeAoec3RyaW5nLmlwX3dpdGhfcHJlZml4bGVuX2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4GiYhcnVsZXMuaXBfd2l0aF9wcmVmaXhsZW4gfHwgdGhpcyAhPSAnJ0gAUg9pcFdpdGhQcmVmaXhsZW4S4gIKE2lwdjRfd2l0aF9wcmVmaXhsZW4YGyABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQpCpIBCiBzdHJpbmcuaXB2NF93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY0X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIAFIRaXB2NFdpdGhQcmVmaXhsZW4S4gIKE2lwdjZfd2l0aF9wcmVmaXhsZW4YHCABKAhCrwLCSKsCCpMBChpzdHJpbmcuaXB2Nl93aXRoX3ByZWZpeGxlbhI1dmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQdjYgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaPiFydWxlcy5pcHY2X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDYpCpIBCiBzdHJpbmcuaXB2Nl93aXRoX3ByZWZpeGxlbl9lbXB0eRJEdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcyB3aXRoIHByZWZpeCBsZW5ndGgaKCFydWxlcy5pcHY2X3dpdGhfcHJlZml4bGVuIHx8IHRoaXMgIT0gJydIAFIRaXB2NldpdGhQcmVmaXhsZW4S/AEKCWlwX3ByZWZpeBgdIAEoCELcAcJI2AEKbAoQc3RyaW5nLmlwX3ByZWZpeBIfdmFsdWUgbXVzdCBiZSBhIHZhbGlkIElQIHByZWZpeBo3IXJ1bGVzLmlwX3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCh0cnVlKQpoChZzdHJpbmcuaXBfcHJlZml4X2VtcHR5Ei52YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgcHJlZml4Gh4hcnVsZXMuaXBfcHJlZml4IHx8IHRoaXMgIT0gJydIAFIIaXBQcmVmaXgSjwIKC2lwdjRfcHJlZml4GB4gASgIQusBwkjnAQp1ChJzdHJpbmcuaXB2NF9wcmVmaXgSIXZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IHByZWZpeBo8IXJ1bGVzLmlwdjRfcHJlZml4IHx8IHRoaXMgPT0gJycgfHwgdGhpcy5pc0lwUHJlZml4KDQsIHRydWUpCm4KGHN0cmluZy5pcHY0X3ByZWZpeF9lbXB0eRIwdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjQgcHJlZml4GiAhcnVsZXMuaXB2NF9wcmVmaXggfHwgdGhpcyAhPSAnJ0gAUgppcHY0UHJlZml4Eo8CCgtpcHY2X3ByZWZpeBgfIAEoCELrAcJI5wEKdQoSc3RyaW5nLmlwdjZfcHJlZml4EiF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSVB2NiBwcmVmaXgaPCFydWxlcy5pcHY2X3ByZWZpeCB8fCB0aGlzID09ICcnIHx8IHRoaXMuaXNJcFByZWZpeCg2LCB0cnVlKQpuChhzdHJpbmcuaXB2Nl9wcmVmaXhfZW1wdHkSMHZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBJUHY2IHByZWZpeBogIXJ1bGVzLmlwdjZfcHJlZml4IHx8IHRoaXMgIT0gJydIAFIKaXB2NlByZWZpeBLCAgoNaG9zdF9hbmRfcG9ydBggIAEoCEKbAsJIlwIKmQEKFHN0cmluZy5ob3N0X2FuZF9wb3J0EkF2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcykgYW5kIHBvcnQgcGFpcho+IXJ1bGVzLmhvc3RfYW5kX3BvcnQgfHwgdGhpcyA9PSAnJyB8fCB0aGlzLmlzSG9zdEFuZFBvcnQodHJ1ZSkKeQoac3RyaW5nLmhvc3RfYW5kX3BvcnRfZW1wdHkSN3ZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBob3N0IGFuZCBwb3J0IHBhaXIaIiFydWxlcy5ob3N0X2FuZF9wb3J0IHx8IHRoaXMgIT0gJydIAFILaG9zdEFuZFBvcnQS+wEKBHVsaWQYIyABKAhC5AHCSOABCoIBCgtzdHJpbmcudWxpZBIadmFsdWUgbXVzdCBiZSBhIHZhbGlkIFVMSUQaVyFydWxlcy51bGlkIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCdeWzAtN11bMC05QS1ISktNTlAtVFYtWmEtaGprbW5wLXR2LXpdezI1fSQnKQpZChFzdHJpbmcudWxpZF9lbXB0eRIpdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIFVMSUQaGSFydWxlcy51bGlkIHx8IHRoaXMgIT0gJydIAFIEdWxpZBK4BQoQd2VsbF9rbm93bl9yZWdleBgYIAEoDjIYLmJ1Zi52YWxpZGF0ZS5Lbm93blJlZ2V4QvEEwkjtBArwAQojc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWUSJnZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGqABcnVsZXMud2VsbF9rbm93bl9yZWdleCAhPSAxIHx8IHRoaXMgPT0gJycgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeOj9bMC05YS16QS1aISMkJSZcJyorLS5eX3x+XHg2MF0rJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKyQnKQqNAQopc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX25hbWVfZW1wdHkSNXZhbHVlIGlzIGVtcHR5LCB3aGljaCBpcyBub3QgYSB2YWxpZCBIVFRQIGhlYWRlciBuYW1lGilydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDEgfHwgdGhpcyAhPSAnJwrnAQokc3RyaW5nLndlbGxfa25vd25fcmVnZXguaGVhZGVyX3ZhbHVlEid2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgSFRUUCBoZWFkZXIgdmFsdWUalQFydWxlcy53ZWxsX2tub3duX3JlZ2V4ICE9IDIgfHwgdGhpcy5tYXRjaGVzKCFoYXMocnVsZXMuc3RyaWN0KSB8fCBydWxlcy5zdHJpY3QgPydeW15cdTAwMDAtXHUwMDA4XHUwMDBBLVx1MDAxRlx1MDA3Rl0qJCcgOideW15cdTAwMDBcdTAwMEFcdTAwMERdKiQnKUgAUg53ZWxsS25vd25SZWdleBIWCgZzdHJpY3QYGSABKAhSBnN0cmljdBI1CgdleGFtcGxlGCIgAygJQhvCSBgKFgoOc3RyaW5nLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkIMCgp3ZWxsX2tub3duIqwTCgpCeXRlc1J1bGVzEocBCgVjb25zdBgBIAEoDEJxwkhuCmwKC2J5dGVzLmNvbnN0Gl10aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGJlICV4Jy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0En0KA2xlbhgNIAEoBEJrwkhoCmYKCWJ5dGVzLmxlbhpZdWludCh0aGlzLnNpemUoKSkgIT0gcnVsZXMubGVuID8gJ3ZhbHVlIGxlbmd0aCBtdXN0IGJlICVzIGJ5dGVzJy5mb3JtYXQoW3J1bGVzLmxlbl0pIDogJydSA2xlbhKYAQoHbWluX2xlbhgCIAEoBEJ/wkh8CnoKDWJ5dGVzLm1pbl9sZW4aaXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2xlbiA/ICd2YWx1ZSBsZW5ndGggbXVzdCBiZSBhdCBsZWFzdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5taW5fbGVuXSkgOiAnJ1IGbWluTGVuEpABCgdtYXhfbGVuGAMgASgEQnfCSHQKcgoNYnl0ZXMubWF4X2xlbhphdWludCh0aGlzLnNpemUoKSkgPiBydWxlcy5tYXhfbGVuID8gJ3ZhbHVlIG11c3QgYmUgYXQgbW9zdCAlcyBieXRlcycuZm9ybWF0KFtydWxlcy5tYXhfbGVuXSkgOiAnJ1IGbWF4TGVuEpkBCgdwYXR0ZXJuGAQgASgJQn/CSHwKegoNYnl0ZXMucGF0dGVybhppIXN0cmluZyh0aGlzKS5tYXRjaGVzKHJ1bGVzLnBhdHRlcm4pID8gJ3ZhbHVlIG11c3QgbWF0Y2ggcmVnZXggcGF0dGVybiBgJXNgJy5mb3JtYXQoW3J1bGVzLnBhdHRlcm5dKSA6ICcnUgdwYXR0ZXJuEokBCgZwcmVmaXgYBSABKAxCccJIbgpsCgxieXRlcy5wcmVmaXgaXCF0aGlzLnN0YXJ0c1dpdGgocnVsZXMucHJlZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCAleCcuZm9ybWF0KFtydWxlcy5wcmVmaXhdKSA6ICcnUgZwcmVmaXgShwEKBnN1ZmZpeBgGIAEoDEJvwkhsCmoKDGJ5dGVzLnN1ZmZpeBpaIXRoaXMuZW5kc1dpdGgocnVsZXMuc3VmZml4KSA/ICd2YWx1ZSBkb2VzIG5vdCBoYXZlIHN1ZmZpeCAleCcuZm9ybWF0KFtydWxlcy5zdWZmaXhdKSA6ICcnUgZzdWZmaXgSjQEKCGNvbnRhaW5zGAcgASgMQnHCSG4KbAoOYnl0ZXMuY29udGFpbnMaWiF0aGlzLmNvbnRhaW5zKHJ1bGVzLmNvbnRhaW5zKSA/ICd2YWx1ZSBkb2VzIG5vdCBjb250YWluICV4Jy5mb3JtYXQoW3J1bGVzLmNvbnRhaW5zXSkgOiAnJ1IIY29udGFpbnMSqwEKAmluGAggAygMQpoBwkiWAQqTAQoIYnl0ZXMuaW4ahgFnZXRGaWVsZChydWxlcywgJ2luJykuc2l6ZSgpID4gMCAmJiAhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfQoGbm90X2luGAkgAygMQmbCSGMKYQoMYnl0ZXMubm90X2luGlF0aGlzIGluIHJ1bGVzLm5vdF9pbiA/ICd2YWx1ZSBtdXN0IG5vdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW3J1bGVzLm5vdF9pbl0pIDogJydSBW5vdEluEu8BCgJpcBgKIAEoCELcAcJI2AEKdAoIYnl0ZXMuaXASIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUCBhZGRyZXNzGkYhcnVsZXMuaXAgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSA0IHx8IHRoaXMuc2l6ZSgpID09IDE2CmAKDmJ5dGVzLmlwX2VtcHR5Ei92YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVAgYWRkcmVzcxodIXJ1bGVzLmlwIHx8IHRoaXMuc2l6ZSgpICE9IDBIAFICaXAS6gEKBGlwdjQYCyABKAhC0wHCSM8BCmUKCmJ5dGVzLmlwdjQSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY0IGFkZHJlc3MaMyFydWxlcy5pcHY0IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gNApmChBieXRlcy5pcHY0X2VtcHR5EjF2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgSVB2NCBhZGRyZXNzGh8hcnVsZXMuaXB2NCB8fCB0aGlzLnNpemUoKSAhPSAwSABSBGlwdjQS6wEKBGlwdjYYDCABKAhC1AHCSNABCmYKCmJ5dGVzLmlwdjYSInZhbHVlIG11c3QgYmUgYSB2YWxpZCBJUHY2IGFkZHJlc3MaNCFydWxlcy5pcHY2IHx8IHRoaXMuc2l6ZSgpID09IDAgfHwgdGhpcy5zaXplKCkgPT0gMTYKZgoQYnl0ZXMuaXB2Nl9lbXB0eRIxdmFsdWUgaXMgZW1wdHksIHdoaWNoIGlzIG5vdCBhIHZhbGlkIElQdjYgYWRkcmVzcxofIXJ1bGVzLmlwdjYgfHwgdGhpcy5zaXplKCkgIT0gMEgAUgRpcHY2EtsBCgR1dWlkGA8gASgIQsQBwkjAAQpeCgpieXRlcy51dWlkEhp2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgVVVJRBo0IXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgPT0gMCB8fCB0aGlzLnNpemUoKSA9PSAxNgpeChBieXRlcy51dWlkX2VtcHR5Eil2YWx1ZSBpcyBlbXB0eSwgd2hpY2ggaXMgbm90IGEgdmFsaWQgVVVJRBofIXJ1bGVzLnV1aWQgfHwgdGhpcy5zaXplKCkgIT0gMEgAUgR1dWlkEjQKB2V4YW1wbGUYDiADKAxCGsJIFwoVCg1ieXRlcy5leGFtcGxlGgR0cnVlUgdleGFtcGxlKgkI6AcQgICAgAJCDAoKd2VsbF9rbm93biL9AwoJRW51bVJ1bGVzEokBCgVjb25zdBgBIAEoBUJzwkhwCm4KCmVudW0uY29uc3QaYHRoaXMgIT0gZ2V0RmllbGQocnVsZXMsICdjb25zdCcpID8gJ3ZhbHVlIG11c3QgZXF1YWwgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdjb25zdCcpXSkgOiAnJ1IFY29uc3QSIQoMZGVmaW5lZF9vbmx5GAIgASgIUgtkZWZpbmVkT25seRKCAQoCaW4YAyADKAVCcsJIbwptCgdlbnVtLmluGmIhKHRoaXMgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpKSA/ICd2YWx1ZSBtdXN0IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbZ2V0RmllbGQocnVsZXMsICdpbicpXSkgOiAnJ1ICaW4SfAoGbm90X2luGAQgAygFQmXCSGIKYAoLZW51bS5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SMwoHZXhhbXBsZRgFIAMoBUIZwkgWChQKDGVudW0uZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACIp4ECg1SZXBlYXRlZFJ1bGVzEqgBCgltaW5faXRlbXMYASABKARCigHCSIYBCoMBChJyZXBlYXRlZC5taW5faXRlbXMabXVpbnQodGhpcy5zaXplKCkpIDwgcnVsZXMubWluX2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBhdCBsZWFzdCAlZCBpdGVtKHMpJy5mb3JtYXQoW3J1bGVzLm1pbl9pdGVtc10pIDogJydSCG1pbkl0ZW1zEqwBCgltYXhfaXRlbXMYAiABKARCjgHCSIoBCocBChJyZXBlYXRlZC5tYXhfaXRlbXMacXVpbnQodGhpcy5zaXplKCkpID4gcnVsZXMubWF4X2l0ZW1zID8gJ3ZhbHVlIG11c3QgY29udGFpbiBubyBtb3JlIHRoYW4gJXMgaXRlbShzKScuZm9ybWF0KFtydWxlcy5tYXhfaXRlbXNdKSA6ICcnUghtYXhJdGVtcxJ4CgZ1bmlxdWUYAyABKAhCYMJIXQpbCg9yZXBlYXRlZC51bmlxdWUSKHJlcGVhdGVkIHZhbHVlIG11c3QgY29udGFpbiB1bmlxdWUgaXRlbXMaHiFydWxlcy51bmlxdWUgfHwgdGhpcy51bmlxdWUoKVIGdW5pcXVlEi4KBWl0ZW1zGAQgASgLMhguYnVmLnZhbGlkYXRlLkZpZWxkUnVsZXNSBWl0ZW1zKgkI6AcQgICAgAIirAMKCE1hcFJ1bGVzEpkBCgltaW5fcGFpcnMYASABKARCfMJIeQp3Cg1tYXAubWluX3BhaXJzGmZ1aW50KHRoaXMuc2l6ZSgpKSA8IHJ1bGVzLm1pbl9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBsZWFzdCAlZCBlbnRyaWVzJy5mb3JtYXQoW3J1bGVzLm1pbl9wYWlyc10pIDogJydSCG1pblBhaXJzEpgBCgltYXhfcGFpcnMYAiABKARCe8JIeAp2Cg1tYXAubWF4X3BhaXJzGmV1aW50KHRoaXMuc2l6ZSgpKSA+IHJ1bGVzLm1heF9wYWlycyA/ICdtYXAgbXVzdCBiZSBhdCBtb3N0ICVkIGVudHJpZXMnLmZvcm1hdChbcnVsZXMubWF4X3BhaXJzXSkgOiAnJ1IIbWF4UGFpcnMSLAoEa2V5cxgEIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgRrZXlzEjAKBnZhbHVlcxgFIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgZ2YWx1ZXMqCQjoBxCAgICAAiIxCghBbnlSdWxlcxIOCgJpbhgCIAMoCVICaW4SFQoGbm90X2luGAMgAygJUgVub3RJbiLGFwoNRHVyYXRpb25SdWxlcxKoAQoFY29uc3QYAiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cd8JIdApyCg5kdXJhdGlvbi5jb25zdBpgdGhpcyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykgPyAndmFsdWUgbXVzdCBlcXVhbCAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JyldKSA6ICcnUgVjb25zdBKsAQoCbHQYAyABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25Cf8JIfAp6CgtkdXJhdGlvbi5sdBprIWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPj0gcnVsZXMubHQ/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5sdF0pIDogJydIAFICbHQSvwEKA2x0ZRgEIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKPAcJIiwEKiAEKDGR1cmF0aW9uLmx0ZRp4IWhhcyhydWxlcy5ndGUpICYmICFoYXMocnVsZXMuZ3QpICYmIHRoaXMgPiBydWxlcy5sdGU/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5sdGVdKSA6ICcnSABSA2x0ZRLFBwoCZ3QYBSABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25ClwfCSJMHCn0KC2R1cmF0aW9uLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq2AQoOZHVyYXRpb24uZ3RfbHQaowFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0ID49IHJ1bGVzLmd0ICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCr4BChhkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmUaoQFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3QgJiYgKHJ1bGVzLmx0IDw9IHRoaXMgJiYgdGhpcyA8PSBydWxlcy5ndCk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAlcyBvciBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwrGAQoPZHVyYXRpb24uZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrOAQoZZHVyYXRpb24uZ3RfbHRlX2V4Y2x1c2l2ZRqwAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA8IHJ1bGVzLmd0ICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0LCBydWxlcy5sdGVdKSA6ICcnSAFSAmd0EpIICgNndGUYBiABKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25C4gfCSN4HCosBCgxkdXJhdGlvbi5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrFAQoPZHVyYXRpb24uZ3RlX2x0GrEBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPj0gcnVsZXMubHQgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCs0BChlkdXJhdGlvbi5ndGVfbHRfZXhjbHVzaXZlGq8BaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA8IHJ1bGVzLmd0ZSAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDwgcnVsZXMuZ3RlKT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrVAQoQZHVyYXRpb24uZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwrdAQoaZHVyYXRpb24uZ3RlX2x0ZV9leGNsdXNpdmUavgFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndGUgJiYgKHJ1bGVzLmx0ZSA8IHRoaXMgJiYgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBvciBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlLCBydWxlcy5sdGVdKSA6ICcnSAFSA2d0ZRKhAQoCaW4YByADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CdsJIcwpxCgtkdXJhdGlvbi5pbhpiISh0aGlzIGluIGdldEZpZWxkKHJ1bGVzLCAnaW4nKSkgPyAndmFsdWUgbXVzdCBiZSBpbiBsaXN0ICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEpsBCgZub3RfaW4YCCADKAsyGS5nb29nbGUucHJvdG9idWYuRHVyYXRpb25CacJIZgpkCg9kdXJhdGlvbi5ub3RfaW4aUXRoaXMgaW4gcnVsZXMubm90X2luID8gJ3ZhbHVlIG11c3Qgbm90IGJlIGluIGxpc3QgJXMnLmZvcm1hdChbcnVsZXMubm90X2luXSkgOiAnJ1IFbm90SW4SUgoHZXhhbXBsZRgJIAMoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkIdwkgaChgKEGR1cmF0aW9uLmV4YW1wbGUaBHRydWVSB2V4YW1wbGUqCQjoBxCAgICAAkILCglsZXNzX3RoYW5CDgoMZ3JlYXRlcl90aGFuIpgGCg5GaWVsZE1hc2tSdWxlcxLGAQoFY29uc3QYASABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrQpMBwkiPAQqMAQoQZmllbGRfbWFzay5jb25zdBp4dGhpcy5wYXRocyAhPSBnZXRGaWVsZChydWxlcywgJ2NvbnN0JykucGF0aHMgPyAndmFsdWUgbXVzdCBlcXVhbCBwYXRocyAlcycuZm9ybWF0KFtnZXRGaWVsZChydWxlcywgJ2NvbnN0JykucGF0aHNdKSA6ICcnUgVjb25zdBLdAQoCaW4YAiADKAlCzAHCSMgBCsUBCg1maWVsZF9tYXNrLmluGrMBIXRoaXMucGF0aHMuYWxsKHAsIHAgaW4gZ2V0RmllbGQocnVsZXMsICdpbicpIHx8IGdldEZpZWxkKHJ1bGVzLCAnaW4nKS5leGlzdHMoZiwgcC5zdGFydHNXaXRoKGYrJy4nKSkpID8gJ3ZhbHVlIG11c3Qgb25seSBjb250YWluIHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnaW4nKV0pIDogJydSAmluEvoBCgZub3RfaW4YAyADKAlC4gHCSN4BCtsBChFmaWVsZF9tYXNrLm5vdF9pbhrFASF0aGlzLnBhdGhzLmFsbChwLCAhKHAgaW4gZ2V0RmllbGQocnVsZXMsICdub3RfaW4nKSB8fCBnZXRGaWVsZChydWxlcywgJ25vdF9pbicpLmV4aXN0cyhmLCBwLnN0YXJ0c1dpdGgoZisnLicpKSkpID8gJ3ZhbHVlIG11c3Qgbm90IGNvbnRhaW4gYW55IHBhdGhzIGluICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnbm90X2luJyldKSA6ICcnUgVub3RJbhJVCgdleGFtcGxlGAQgAygLMhouZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza0IfwkgcChoKEmZpZWxkX21hc2suZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACIsoYCg5UaW1lc3RhbXBSdWxlcxKqAQoFY29uc3QYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQnjCSHUKcwoPdGltZXN0YW1wLmNvbnN0GmB0aGlzICE9IGdldEZpZWxkKHJ1bGVzLCAnY29uc3QnKSA/ICd2YWx1ZSBtdXN0IGVxdWFsICVzJy5mb3JtYXQoW2dldEZpZWxkKHJ1bGVzLCAnY29uc3QnKV0pIDogJydSBWNvbnN0Eq8BCgJsdBgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCgAHCSH0KewoMdGltZXN0YW1wLmx0GmshaGFzKHJ1bGVzLmd0ZSkgJiYgIWhhcyhydWxlcy5ndCkgJiYgdGhpcyA+PSBydWxlcy5sdD8gJ3ZhbHVlIG11c3QgYmUgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmx0XSkgOiAnJ0gAUgJsdBLBAQoDbHRlGAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKQAcJIjAEKiQEKDXRpbWVzdGFtcC5sdGUaeCFoYXMocnVsZXMuZ3RlKSAmJiAhaGFzKHJ1bGVzLmd0KSAmJiB0aGlzID4gcnVsZXMubHRlPyAndmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMubHRlXSkgOiAnJ0gAUgNsdGUScwoGbHRfbm93GAcgASgIQlrCSFcKVQoQdGltZXN0YW1wLmx0X25vdxpBKHJ1bGVzLmx0X25vdyAmJiB0aGlzID4gbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cnIDogJydIAFIFbHROb3cSywcKAmd0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEKcB8JImAcKfgoMdGltZXN0YW1wLmd0Gm4haGFzKHJ1bGVzLmx0KSAmJiAhaGFzKHJ1bGVzLmx0ZSkgJiYgdGhpcyA8PSBydWxlcy5ndD8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0XSkgOiAnJwq3AQoPdGltZXN0YW1wLmd0X2x0GqMBaGFzKHJ1bGVzLmx0KSAmJiBydWxlcy5sdCA+PSBydWxlcy5ndCAmJiAodGhpcyA+PSBydWxlcy5sdCB8fCB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIGFuZCBsZXNzIHRoYW4gJXMnLmZvcm1hdChbcnVsZXMuZ3QsIHJ1bGVzLmx0XSkgOiAnJwq/AQoZdGltZXN0YW1wLmd0X2x0X2V4Y2x1c2l2ZRqhAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPCBydWxlcy5ndCAmJiAocnVsZXMubHQgPD0gdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRdKSA6ICcnCscBChB0aW1lc3RhbXAuZ3RfbHRlGrIBaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlID49IHJ1bGVzLmd0ICYmICh0aGlzID4gcnVsZXMubHRlIHx8IHRoaXMgPD0gcnVsZXMuZ3QpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gJXMgYW5kIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJwrPAQoadGltZXN0YW1wLmd0X2x0ZV9leGNsdXNpdmUasAFoYXMocnVsZXMubHRlKSAmJiBydWxlcy5sdGUgPCBydWxlcy5ndCAmJiAocnVsZXMubHRlIDwgdGhpcyAmJiB0aGlzIDw9IHJ1bGVzLmd0KT8gJ3ZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuICVzIG9yIGxlc3MgdGhhbiBvciBlcXVhbCB0byAlcycuZm9ybWF0KFtydWxlcy5ndCwgcnVsZXMubHRlXSkgOiAnJ0gBUgJndBKYCAoDZ3RlGAYgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcELnB8JI4wcKjAEKDXRpbWVzdGFtcC5ndGUaeyFoYXMocnVsZXMubHQpICYmICFoYXMocnVsZXMubHRlKSAmJiB0aGlzIDwgcnVsZXMuZ3RlPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMnLmZvcm1hdChbcnVsZXMuZ3RlXSkgOiAnJwrGAQoQdGltZXN0YW1wLmd0ZV9sdBqxAWhhcyhydWxlcy5sdCkgJiYgcnVsZXMubHQgPj0gcnVsZXMuZ3RlICYmICh0aGlzID49IHJ1bGVzLmx0IHx8IHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgYW5kIGxlc3MgdGhhbiAlcycuZm9ybWF0KFtydWxlcy5ndGUsIHJ1bGVzLmx0XSkgOiAnJwrOAQoadGltZXN0YW1wLmd0ZV9sdF9leGNsdXNpdmUarwFoYXMocnVsZXMubHQpICYmIHJ1bGVzLmx0IDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdCA8PSB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRdKSA6ICcnCtYBChF0aW1lc3RhbXAuZ3RlX2x0ZRrAAWhhcyhydWxlcy5sdGUpICYmIHJ1bGVzLmx0ZSA+PSBydWxlcy5ndGUgJiYgKHRoaXMgPiBydWxlcy5sdGUgfHwgdGhpcyA8IHJ1bGVzLmd0ZSk/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAlcyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJwreAQobdGltZXN0YW1wLmd0ZV9sdGVfZXhjbHVzaXZlGr4BaGFzKHJ1bGVzLmx0ZSkgJiYgcnVsZXMubHRlIDwgcnVsZXMuZ3RlICYmIChydWxlcy5sdGUgPCB0aGlzICYmIHRoaXMgPCBydWxlcy5ndGUpPyAndmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gJXMgb3IgbGVzcyB0aGFuIG9yIGVxdWFsIHRvICVzJy5mb3JtYXQoW3J1bGVzLmd0ZSwgcnVsZXMubHRlXSkgOiAnJ0gBUgNndGUSdgoGZ3Rfbm93GAggASgIQl3CSFoKWAoQdGltZXN0YW1wLmd0X25vdxpEKHJ1bGVzLmd0X25vdyAmJiB0aGlzIDwgbm93KSA/ICd2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cnIDogJydIAVIFZ3ROb3cSwAEKBndpdGhpbhgJIAEoCzIZLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbkKMAcJIiAEKhQEKEHRpbWVzdGFtcC53aXRoaW4acXRoaXMgPCBub3ctcnVsZXMud2l0aGluIHx8IHRoaXMgPiBub3crcnVsZXMud2l0aGluID8gJ3ZhbHVlIG11c3QgYmUgd2l0aGluICVzIG9mIG5vdycuZm9ybWF0KFtydWxlcy53aXRoaW5dKSA6ICcnUgZ3aXRoaW4SVAoHZXhhbXBsZRgKIAMoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCHsJIGwoZChF0aW1lc3RhbXAuZXhhbXBsZRoEdHJ1ZVIHZXhhbXBsZSoJCOgHEICAgIACQgsKCWxlc3NfdGhhbkIOCgxncmVhdGVyX3RoYW4iRQoKVmlvbGF0aW9ucxI3Cgp2aW9sYXRpb25zGAEgAygLMhcuYnVmLnZhbGlkYXRlLlZpb2xhdGlvblIKdmlvbGF0aW9ucyLFAQoJVmlvbGF0aW9uEi0KBWZpZWxkGAUgASgLMhcuYnVmLnZhbGlkYXRlLkZpZWxkUGF0aFIFZmllbGQSKwoEcnVsZRgGIAEoCzIXLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhSBHJ1bGUSFwoHcnVsZV9pZBgCIAEoCVIGcnVsZUlkEhgKB21lc3NhZ2UYAyABKAlSB21lc3NhZ2USFwoHZm9yX2tleRgEIAEoCFIGZm9yS2V5SgQIARACUgpmaWVsZF9wYXRoIkcKCUZpZWxkUGF0aBI6CghlbGVtZW50cxgBIAMoCzIeLmJ1Zi52YWxpZGF0ZS5GaWVsZFBhdGhFbGVtZW50UghlbGVtZW50cyLMAwoQRmllbGRQYXRoRWxlbWVudBIhCgxmaWVsZF9udW1iZXIYASABKAVSC2ZpZWxkTnVtYmVyEh0KCmZpZWxkX25hbWUYAiABKAlSCWZpZWxkTmFtZRJJCgpmaWVsZF90eXBlGAMgASgOMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVSCWZpZWxkVHlwZRJFCghrZXlfdHlwZRgEIAEoDjIqLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlUgdrZXlUeXBlEkkKCnZhbHVlX3R5cGUYBSABKA4yKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZVIJdmFsdWVUeXBlEhYKBWluZGV4GAYgASgESABSBWluZGV4EhsKCGJvb2xfa2V5GAcgASgISABSB2Jvb2xLZXkSGQoHaW50X2tleRgIIAEoA0gAUgZpbnRLZXkSGwoIdWludF9rZXkYCSABKARIAFIHdWludEtleRIfCgpzdHJpbmdfa2V5GAogASgJSABSCXN0cmluZ0tleUILCglzdWJzY3JpcHQqoQEKBklnbm9yZRIWChJJR05PUkVfVU5TUEVDSUZJRUQQABIYChRJR05PUkVfSUZfWkVST19WQUxVRRABEhEKDUlHTk9SRV9BTFdBWVMQAyIECAIQAioMSUdOT1JFX0VNUFRZKg5JR05PUkVfREVGQVVMVCoXSUdOT1JFX0lGX0RFRkFVTFRfVkFMVUUqFUlHTk9SRV9JRl9VTlBPUFVMQVRFRCpuCgpLbm93blJlZ2V4EhsKF0tOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEEAASIAocS05PV05fUkVHRVhfSFRUUF9IRUFERVJfTkFNRRABEiEKHUtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFEAI6VgoHbWVzc2FnZRIfLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucxiHCSABKAsyGi5idWYudmFsaWRhdGUuTWVzc2FnZVJ1bGVzUgdtZXNzYWdlOk4KBW9uZW9mEh0uZ29vZ2xlLnByb3RvYnVmLk9uZW9mT3B0aW9ucxiHCSABKAsyGC5idWYudmFsaWRhdGUuT25lb2ZSdWxlc1IFb25lb2Y6TgoFZmllbGQSHS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zGIcJIAEoCzIYLmJ1Zi52YWxpZGF0ZS5GaWVsZFJ1bGVzUgVmaWVsZDpdCgpwcmVkZWZpbmVkEh0uZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucxiICSABKAsyHS5idWYudmFsaWRhdGUuUHJlZGVmaW5lZFJ1bGVzUgpwcmVkZWZpbmVkQm4KEmJ1aWxkLmJ1Zi52YWxpZGF0ZUINVmFsaWRhdGVQcm90b1ABWkdidWYuYnVpbGQvZ2VuL2dvL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUvcHJvdG9jb2xidWZmZXJzL2dvL2J1Zi92YWxpZGF0ZUq4tgkKBxIFDgDAJwEKzgQKAQwSAw4AEjLDBCBDb3B5cmlnaHQgMjAyMy0yMDI2IEJ1ZiBUZWNobm9sb2dpZXMsIEluYy4KCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgrqCwoBAhIDLAAVGt8LIFtQcm90b3ZhbGlkYXRlXShodHRwczovL3Byb3RvdmFsaWRhdGUuY29tLykgaXMgdGhlIHNlbWFudGljIHZhbGlkYXRpb24gbGlicmFyeSBmb3IgUHJvdG9idWYuCiBJdCBwcm92aWRlcyBzdGFuZGFyZCBhbm5vdGF0aW9ucyB0byB2YWxpZGF0ZSBjb21tb24gcnVsZXMgb24gbWVzc2FnZXMgYW5kIGZpZWxkcywgYXMgd2VsbCBhcyB0aGUgYWJpbGl0eSB0byB1c2UgW0NFTF0oaHR0cHM6Ly9jZWwuZGV2KSB0byB3cml0ZSBjdXN0b20gcnVsZXMuCiBJdCdzIHRoZSBuZXh0IGdlbmVyYXRpb24gb2YgW3Byb3RvYy1nZW4tdmFsaWRhdGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b2MtZ2VuLXZhbGlkYXRlKS4KCiBUaGlzIHBhY2thZ2UgcHJvdmlkZXMgdGhlIG9wdGlvbnMsIG1lc3NhZ2VzLCBhbmQgZW51bXMgdGhhdCBwb3dlciBQcm90b3ZhbGlkYXRlLgogQXBwbHkgaXRzIG9wdGlvbnMgdG8gbWVzc2FnZXMsIGZpZWxkcywgYW5kIG9uZW9mcyBpbiB5b3VyIFByb3RvYnVmIHNjaGVtYXMgdG8gYWRkIHZhbGlkYXRpb24gcnVsZXM6CgogYGBgcHJvdG8KIG1lc3NhZ2UgVXNlciB7CiAgIHN0cmluZyBpZCA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy51dWlkID0gdHJ1ZV07CiAgIHN0cmluZyBmaXJzdF9uYW1lID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLm1heF9sZW4gPSA2NF07CiAgIHN0cmluZyBsYXN0X25hbWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcubWF4X2xlbiA9IDY0XTsKCiAgIG9wdGlvbiAoYnVmLnZhbGlkYXRlLm1lc3NhZ2UpLmNlbCA9IHsKICAgICBpZDogImZpcnN0X25hbWVfcmVxdWlyZXNfbGFzdF9uYW1lIgogICAgIG1lc3NhZ2U6ICJsYXN0X25hbWUgbXVzdCBiZSBwcmVzZW50IGlmIGZpcnN0X25hbWUgaXMgcHJlc2VudCIKICAgICBleHByZXNzaW9uOiAiIWhhcyh0aGlzLmZpcnN0X25hbWUpIHx8IGhhcyh0aGlzLmxhc3RfbmFtZSkiCiAgIH07CiB9CiBgYGAKCiBUaGVzZSBydWxlcyBhcmUgZW5mb3JjZWQgYXQgcnVudGltZSBieSBsYW5ndWFnZS1zcGVjaWZpYyBsaWJyYXJpZXMuCiBTZWUgdGhlIFtkZXZlbG9wZXIgcXVpY2tzdGFydF0oaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9xdWlja3N0YXJ0LykgdG8gZ2V0IHN0YXJ0ZWQsIG9yIGdvIGRpcmVjdGx5IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgZm9yIHlvdXIgbGFuZ3VhZ2U6CiBbR29dKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWdvKQogW0phdmFTY3JpcHQvVHlwZVNjcmlwdF0oaHR0cHM6Ly9naXRodWIuY29tL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUtZXMpLAogW0phdmFdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWphdmEpLAogW1B5dGhvbl0oaHR0cHM6Ly9naXRodWIuY29tL2J1ZmJ1aWxkL3Byb3RvdmFsaWRhdGUtcHl0aG9uKSwKIG9yIFtDKytdKGh0dHBzOi8vZ2l0aHViLmNvbS9idWZidWlsZC9wcm90b3ZhbGlkYXRlLWNjKS4KCgkKAgMAEgMuACoKCQoCAwESAy8AKAoJCgIDAhIDMAAqCgkKAgMDEgMxACkKCAoBCBIDMwBeCgkKAggLEgMzAF4KCAoBCBIDNAAiCgkKAggKEgM0ACIKCAoBCBIDNQAuCgkKAggIEgM1AC4KCAoBCBIDNgArCgkKAggBEgM2ACsKgAIKAQcSBDwAQAEa9AEgTWVzc2FnZU9wdGlvbnMgaXMgYW4gZXh0ZW5zaW9uIHRvIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy4gSXQgYWxsb3dzCiB0aGUgYWRkaXRpb24gb2YgdmFsaWRhdGlvbiBydWxlcyBhdCB0aGUgbWVzc2FnZSBsZXZlbC4gVGhlc2UgcnVsZXMgY2FuIGJlCiBhcHBsaWVkIHRvIGluY29taW5nIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGV5IG1lZXQgY2VydGFpbiBjcml0ZXJpYSBiZWZvcmUKIGJlaW5nIHByb2Nlc3NlZC4KCoYBCgIHABIDPwInGnsgUnVsZXMgc3BlY2lmeSB0aGUgdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgbWVzc2FnZS4gQnkgZGVmYXVsdCwKIG5vIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkIGFnYWluc3QgYSBtZXNzYWdlLgoKCgoDBwACEgM8ByUKCgoDBwAEEgM/AgoKCgoDBwAGEgM/CxcKCgoDBwABEgM/GB8KCgoDBwADEgM/IiYK8gEKAQcSBEYASgEa5gEgT25lb2ZPcHRpb25zIGlzIGFuIGV4dGVuc2lvbiB0byBnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLiBJdCBhbGxvd3MKIHRoZSBhZGRpdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIG9uIGEgb25lb2YuIFRoZXNlIHJ1bGVzIGNhbiBiZQogYXBwbGllZCB0byBpbmNvbWluZyBtZXNzYWdlcyB0byBlbnN1cmUgdGhleSBtZWV0IGNlcnRhaW4gY3JpdGVyaWEgYmVmb3JlCiBiZWluZyBwcm9jZXNzZWQuCgqCAQoCBwESA0kCIxp3IFJ1bGVzIHNwZWNpZnkgdGhlIHZhbGlkYXRpb25zIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGlzIG9uZW9mLiBCeSBkZWZhdWx0LAogbm8gdmFsaWRhdGlvbiBpcyBwZXJmb3JtZWQgYWdhaW5zdCBhIG9uZW9mLgoKCgoDBwECEgNGByMKCgoDBwEEEgNJAgoKCgoDBwEGEgNJCxUKCgoDBwEBEgNJFhsKCgoDBwEDEgNJHiIK+gEKAQcSBFAAZgEa7gEgRmllbGRPcHRpb25zIGlzIGFuIGV4dGVuc2lvbiB0byBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLiBJdCBhbGxvd3MKIHRoZSBhZGRpdGlvbiBvZiB2YWxpZGF0aW9uIHJ1bGVzIGF0IHRoZSBmaWVsZCBsZXZlbC4gVGhlc2UgcnVsZXMgY2FuIGJlCiBhcHBsaWVkIHRvIGluY29taW5nIG1lc3NhZ2VzIHRvIGVuc3VyZSB0aGV5IG1lZXQgY2VydGFpbiBjcml0ZXJpYSBiZWZvcmUKIGJlaW5nIHByb2Nlc3NlZC4KCoIBCgIHAhIDUwIjGncgUnVsZXMgc3BlY2lmeSB0aGUgdmFsaWRhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIHRoaXMgZmllbGQuIEJ5IGRlZmF1bHQsCiBubyB2YWxpZGF0aW9uIGlzIHBlcmZvcm1lZCBhZ2FpbnN0IGEgZmllbGQuCgoKCgMHAgISA1AHIwoKCgMHAgQSA1MCCgoKCgMHAgYSA1MLFQoKCgMHAgESA1MWGwoKCgMHAgMSA1MeIgrKAwoCBwMSA2UCLRq+AyBTcGVjaWZpZXMgcHJlZGVmaW5lZCBydWxlcy4gV2hlbiBleHRlbmRpbmcgYSBzdGFuZGFyZCBydWxlIG1lc3NhZ2UsCiB0aGlzIGFkZHMgYWRkaXRpb25hbCBDRUwgZXhwcmVzc2lvbnMgdGhhdCBhcHBseSB3aGVuIHRoZSBleHRlbnNpb24gaXMgdXNlZC4KCiBgYGBwcm90bwogZXh0ZW5kIGJ1Zi52YWxpZGF0ZS5JbnQzMlJ1bGVzIHsKICAgYm9vbCBpc196ZXJvIFsoYnVmLnZhbGlkYXRlLnByZWRlZmluZWQpLmNlbCA9IHsKICAgICBpZDogImludDMyLmlzX3plcm8iLAogICAgIG1lc3NhZ2U6ICJ2YWx1ZSBtdXN0IGJlIHplcm8iLAogICAgIGV4cHJlc3Npb246ICIhcnVsZSB8fCB0aGlzID09IDAiLAogICB9XTsKIH0KCiBtZXNzYWdlIEZvbyB7CiAgIGludDMyIHJlc2VydmVkID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuaW50MzIuKGlzX3plcm8pID0gdHJ1ZV07CiB9CiBgYGAKCgoKAwcDAhIDUAcjCgoKAwcDBBIDZQIKCgoKAwcDBhIDZQsaCgoKAwcDARIDZRslCgoKAwcDAxIDZSgsCoEECgIEABIFdwCHAQEa8wMgYFJ1bGVgIHJlcHJlc2VudHMgYSB2YWxpZGF0aW9uIHJ1bGUgd3JpdHRlbiBpbiB0aGUgQ29tbW9uIEV4cHJlc3Npb24KIExhbmd1YWdlIChDRUwpIHN5bnRheC4gRWFjaCBSdWxlIGluY2x1ZGVzIGEgdW5pcXVlIGlkZW50aWZpZXIsIGFuCiBvcHRpb25hbCBlcnJvciBtZXNzYWdlLCBhbmQgdGhlIENFTCBleHByZXNzaW9uIHRvIGV2YWx1YXRlLiBGb3IgbW9yZQogaW5mb3JtYXRpb24sIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIEZvbyB7CiAgIG9wdGlvbiAoYnVmLnZhbGlkYXRlLm1lc3NhZ2UpLmNlbCA9IHsKICAgICBpZDogImZvby5iYXIiCiAgICAgbWVzc2FnZTogImJhciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIgogICAgIGV4cHJlc3Npb246ICJ0aGlzLmJhciA+IDAiCiAgIH07CiAgIGludDMyIGJhciA9IDE7CiB9CiBgYGAKCgoKAwQAARIDdwgMCqkBCgQEAAIAEgN6AhkamwEgYGlkYCBpcyBhIHN0cmluZyB0aGF0IHNlcnZlcyBhcyBhIG1hY2hpbmUtcmVhZGFibGUgbmFtZSBmb3IgdGhpcyBSdWxlLgogSXQgc2hvdWxkIGJlIHVuaXF1ZSB3aXRoaW4gaXRzIHNjb3BlLCB3aGljaCBjb3VsZCBiZSBlaXRoZXIgYSBtZXNzYWdlIG9yIGEgZmllbGQuCgoMCgUEAAIABBIDegIKCgwKBQQAAgAFEgN6CxEKDAoFBAACAAESA3oSFAoMCgUEAAIAAxIDehcYCoMCCgQEAAIBEgSAAQIeGvQBIGBtZXNzYWdlYCBpcyBhbiBvcHRpb25hbCBmaWVsZCB0aGF0IHByb3ZpZGVzIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZQogZm9yIHRoaXMgUnVsZSB3aGVuIHRoZSBDRUwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuIElmIGEKIG5vbi1lbXB0eSBtZXNzYWdlIGlzIHByb3ZpZGVkLCBhbnkgc3RyaW5ncyByZXN1bHRpbmcgZnJvbSB0aGUgQ0VMCiBleHByZXNzaW9uIGV2YWx1YXRpb24gYXJlIGlnbm9yZWQuCgoNCgUEAAIBBBIEgAECCgoNCgUEAAIBBRIEgAELEQoNCgUEAAIBARIEgAESGQoNCgUEAAIBAxIEgAEcHQqiAgoEBAACAhIEhgECIRqTAiBgZXhwcmVzc2lvbmAgaXMgdGhlIGFjdHVhbCBDRUwgZXhwcmVzc2lvbiB0aGF0IHdpbGwgYmUgZXZhbHVhdGVkIGZvcgogdmFsaWRhdGlvbi4gVGhpcyBzdHJpbmcgbXVzdCByZXNvbHZlIHRvIGVpdGhlciBhIGJvb2xlYW4gb3IgYSBzdHJpbmcKIHZhbHVlLiBJZiB0aGUgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2Ugb3IgYSBub24tZW1wdHkgc3RyaW5nLCB0aGUKIHZhbGlkYXRpb24gaXMgY29uc2lkZXJlZCBmYWlsZWQsIGFuZCB0aGUgbWVzc2FnZSBpcyByZWplY3RlZC4KCg0KBQQAAgIEEgSGAQIKCg0KBQQAAgIFEgSGAQsRCg0KBQQAAgIBEgSGARIcCg0KBQQAAgIDEgSGAR8gCtwBCgIEARIGiwEA1wEBGs0BIE1lc3NhZ2VSdWxlcyByZXByZXNlbnRzIHZhbGlkYXRpb24gcnVsZXMgdGhhdCBhcmUgYXBwbGllZCB0byB0aGUgZW50aXJlIG1lc3NhZ2UuCiBJdCBpbmNsdWRlcyBkaXNhYmxpbmcgb3B0aW9ucyBhbmQgYSBsaXN0IG9mIFJ1bGUgbWVzc2FnZXMgcmVwcmVzZW50aW5nIENvbW1vbiBFeHByZXNzaW9uIExhbmd1YWdlIChDRUwpIHZhbGlkYXRpb24gcnVsZXMuCgoLCgMEAQESBIsBCBQK1AYKBAQBAgASBJ4BAiUaxQYgYGNlbF9leHByZXNzaW9uYCBpcyBhIHJlcGVhdGVkIGZpZWxkIENFTCBleHByZXNzaW9ucy4gRWFjaCBleHByZXNzaW9uIHNwZWNpZmllcyBhIHZhbGlkYXRpb24KIHJ1bGUgdG8gYmUgYXBwbGllZCB0byB0aGlzIG1lc3NhZ2UuIFRoZXNlIHJ1bGVzIGFyZSB3cml0dGVuIGluIENvbW1vbiBFeHByZXNzaW9uIExhbmd1YWdlIChDRUwpIHN5bnRheC4KCiBUaGlzIGlzIGEgc2ltcGxpZmllZCBmb3JtIG9mIHRoZSBgY2VsYCBSdWxlIGZpZWxkLCB3aGVyZSBvbmx5IGBleHByZXNzaW9uYCBpcyBzZXQuIFRoaXMgYWxsb3dzIGZvcgogc2ltcGxlciBzeW50YXggd2hlbiBkZWZpbmluZyBDRUwgUnVsZXMgd2hlcmUgYGlkYCBhbmQgYG1lc3NhZ2VgIGRlcml2ZWQgZnJvbSB0aGUgYGV4cHJlc3Npb25gLiBgaWRgIHdpbGwKIGJlIHNhbWUgYXMgdGhlIGBleHByZXNzaW9uYC4KCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgW3NlZSBvdXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9idWYuYnVpbGQvZG9jcy9wcm90b3ZhbGlkYXRlL3NjaGVtYXMvY3VzdG9tLXJ1bGVzLykuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGBmb29gIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb24gKGJ1Zi52YWxpZGF0ZS5tZXNzYWdlKS5jZWxfZXhwcmVzc2lvbiA9ICJ0aGlzLmZvbyA+IDQyIjsKICAgLy8gVGhlIGZpZWxkIGBmb29gIG11c3QgYmUgbGVzcyB0aGFuIDg0LgogICBvcHRpb24gKGJ1Zi52YWxpZGF0ZS5tZXNzYWdlKS5jZWxfZXhwcmVzc2lvbiA9ICJ0aGlzLmZvbyA8IDg0IjsKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsKIH0KIGBgYAoKDQoFBAECAAQSBJ4BAgoKDQoFBAECAAUSBJ4BCxEKDQoFBAECAAESBJ4BEiAKDQoFBAECAAMSBJ4BIyQKvgQKBAQBAgESBK8BAhgarwQgYGNlbGAgaXMgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIFJ1bGUuIEVhY2ggUnVsZSBzcGVjaWZpZXMgYSB2YWxpZGF0aW9uIHJ1bGUgdG8gYmUgYXBwbGllZCB0byB0aGlzIG1lc3NhZ2UuCiBUaGVzZSBydWxlcyBhcmUgd3JpdHRlbiBpbiBDb21tb24gRXhwcmVzc2lvbiBMYW5ndWFnZSAoQ0VMKSBzeW50YXguIEZvciBtb3JlIGluZm9ybWF0aW9uLAogW3NlZSBvdXIgZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9idWYuYnVpbGQvZG9jcy9wcm90b3ZhbGlkYXRlL3NjaGVtYXMvY3VzdG9tLXJ1bGVzLykuCgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgZm9vYCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0Mi4KICAgb3B0aW9uIChidWYudmFsaWRhdGUubWVzc2FnZSkuY2VsID0gewogICAgIGlkOiAibXlfbWVzc2FnZS52YWx1ZSIsCiAgICAgbWVzc2FnZTogInZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyIiwKICAgICBleHByZXNzaW9uOiAidGhpcy5mb28gPiA0MiIsCiAgIH07CiAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7CiB9CiBgYGAKCg0KBQQBAgEEEgSvAQIKCg0KBQQBAgEGEgSvAQsPCg0KBQQBAgEBEgSvARATCg0KBQQBAgEDEgSvARYXCskOCgQEAQICEgTTAQImGroOIGBvbmVvZmAgaXMgYSByZXBlYXRlZCBmaWVsZCBvZiB0eXBlIE1lc3NhZ2VPbmVvZlJ1bGUgdGhhdCBzcGVjaWZpZXMgYSBsaXN0IG9mIGZpZWxkcwogb2Ygd2hpY2ggYXQgbW9zdCBvbmUgY2FuIGJlIHByZXNlbnQuIElmIGByZXF1aXJlZGAgaXMgYWxzbyBzcGVjaWZpZWQsIHRoZW4gZXhhY3RseSBvbmUKIG9mIHRoZSBzcGVjaWZpZWQgZmllbGRzIF9tdXN0XyBiZSBwcmVzZW50LgoKIFRoaXMgd2lsbCBlbmZvcmNlIG9uZW9mLWxpa2UgY29uc3RyYWludHMgd2l0aCBhIGZldyBmZWF0dXJlcyBub3QgcHJvdmlkZWQgYnkKIGFjdHVhbCBQcm90b2J1ZiBvbmVvZiBkZWNsYXJhdGlvbnM6CiAgIDEuIFJlcGVhdGVkIGFuZCBtYXAgZmllbGRzIGFyZSBhbGxvd2VkIGluIHRoaXMgdmFsaWRhdGlvbi4gSW4gYSBQcm90b2J1ZiBvbmVvZiwKICAgICAgb25seSBzY2FsYXIgZmllbGRzIGFyZSBhbGxvd2VkLgogICAyLiBGaWVsZHMgd2l0aCBpbXBsaWNpdCBwcmVzZW5jZSBhcmUgYWxsb3dlZC4gSW4gYSBQcm90b2J1ZiBvbmVvZiwgYWxsIG1lbWJlcgogICAgICBmaWVsZHMgaGF2ZSBleHBsaWNpdCBwcmVzZW5jZS4gVGhpcyBtZWFucyB0aGF0LCBmb3IgdGhlIHB1cnBvc2Ugb2YgZGV0ZXJtaW5pbmcKICAgICAgaG93IG1hbnkgZmllbGRzIGFyZSBzZXQsIGV4cGxpY2l0bHkgc2V0dGluZyBzdWNoIGEgZmllbGQgdG8gaXRzIHplcm8gdmFsdWUgaXMKICAgICAgZWZmZWN0aXZlbHkgdGhlIHNhbWUgYXMgbm90IHNldHRpbmcgaXQgYXQgYWxsLgogICAzLiBUaGlzIHdpbGwgYWx3YXlzIGdlbmVyYXRlIHZhbGlkYXRpb24gZXJyb3JzIGZvciBhIG1lc3NhZ2UgdW5tYXJzaGFsbGVkIGZyb20KICAgICAgc2VyaWFsaXplZCBkYXRhIHRoYXQgc2V0cyBtb3JlIHRoYW4gb25lIGZpZWxkLiBXaXRoIGEgUHJvdG9idWYgb25lb2YsIHdoZW4KICAgICAgbXVsdGlwbGUgZmllbGRzIGFyZSBwcmVzZW50IGluIHRoZSBzZXJpYWxpemVkIGZvcm0sIGVhcmxpZXIgdmFsdWVzIGFyZSB1c3VhbGx5CiAgICAgIHNpbGVudGx5IGlnbm9yZWQgd2hlbiB1bm1hcnNoYWxsaW5nLCB3aXRoIG9ubHkgdGhlIGxhc3QgZmllbGQgYmVpbmcgc2V0IHdoZW4KICAgICAgdW5tYXJzaGFsbGluZyBjb21wbGV0ZXMuCgogTm90ZSB0aGF0IGFkZGluZyBhIGZpZWxkIHRvIGEgYG9uZW9mYCB3aWxsIGFsc28gc2V0IHRoZSBJR05PUkVfSUZfWkVST19WQUxVRSBvbiB0aGUgZmllbGRzLiBUaGlzIG1lYW5zCiBvbmx5IHRoZSBmaWVsZCB0aGF0IGlzIHNldCB3aWxsIGJlIHZhbGlkYXRlZCBhbmQgdGhlIHVuc2V0IGZpZWxkcyBhcmUgbm90IHZhbGlkYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGZpZWxkIHJ1bGVzLgogVGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBzZXR0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9QEQGAoNCgUEAwIAAxIE9QEbHAqgAQoCBAQSBvoBAIEDARqRASBGaWVsZFJ1bGVzIGVuY2Fwc3VsYXRlcyB0aGUgcnVsZXMgZm9yIGVhY2ggdHlwZSBvZiBmaWVsZC4gRGVwZW5kaW5nIG9uCiB0aGUgZmllbGQsIHRoZSBjb3JyZWN0IHNldCBzaG91bGQgYmUgdXNlZCB0byBlbnN1cmUgcHJvcGVyIHZhbGlkYXRpb25zLgoKCwoDBAQBEgT6AQgSCtoFCgQEBAIAEgSKAgImGssFIGBjZWxfZXhwcmVzc2lvbmAgaXMgYSByZXBlYXRlZCBmaWVsZCBDRUwgZXhwcmVzc2lvbnMuIEVhY2ggZXhwcmVzc2lvbiBzcGVjaWZpZXMgYSB2YWxpZGF0aW9uCiBydWxlIHRvIGJlIGFwcGxpZWQgdG8gdGhpcyBtZXNzYWdlLiBUaGVzZSBydWxlcyBhcmUgd3JpdHRlbiBpbiBDb21tb24gRXhwcmVzc2lvbiBMYW5ndWFnZSAoQ0VMKSBzeW50YXguCgogVGhpcyBpcyBhIHNpbXBsaWZpZWQgZm9ybSBvZiB0aGUgYGNlbGAgUnVsZSBmaWVsZCwgd2hlcmUgb25seSBgZXhwcmVzc2lvbmAgaXMgc2V0LiBUaGlzIGFsbG93cyBmb3IKIHNpbXBsZXIgc3ludGF4IHdoZW4gZGVmaW5pbmcgQ0VMIFJ1bGVzIHdoZXJlIGBpZGAgYW5kIGBtZXNzYWdlYCBkZXJpdmVkIGZyb20gdGhlIGBleHByZXNzaW9uYC4gYGlkYCB3aWxsCiBiZSBzYW1lIGFzIHRoZSBgZXhwcmVzc2lvbmAuCgogRm9yIG1vcmUgaW5mb3JtYXRpb24sIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmNlbF9leHByZXNzaW9uID0gInRoaXMgPiA0MiJdOwogfQogYGBgCgoNCgUEBAIABBIEigICCgoNCgUEBAIABRIEigILEQoNCgUEBAIAARIEigISIAoNCgUEBAIAAxIEigIjJQryAwoEBAQCARIEmQICGRrjAyBgY2VsYCBpcyBhIHJlcGVhdGVkIGZpZWxkIHVzZWQgdG8gcmVwcmVzZW50IGEgdGV4dHVhbCBleHByZXNzaW9uCiBpbiB0aGUgQ29tbW9uIEV4cHJlc3Npb24gTGFuZ3VhZ2UgKENFTCkgc3ludGF4LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwKIFtzZWUgb3VyIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vYnVmLmJ1aWxkL2RvY3MvcHJvdG92YWxpZGF0ZS9zY2hlbWFzL2N1c3RvbS1ydWxlcy8pLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCBgdmFsdWVgIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQyLgogICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmNlbCA9IHsKICAgICBpZDogIm15X21lc3NhZ2UudmFsdWUiLAogICAgIG1lc3NhZ2U6ICJ2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA0MiIsCiAgICAgZXhwcmVzc2lvbjogInRoaXMgPiA0MiIsCiAgIH1dOwogfQogYGBgCgoNCgUEBAIBBBIEmQICCgoNCgUEBAIBBhIEmQILDwoNCgUEBAIBARIEmQIQEwoNCgUEBAIBAxIEmQIWGArhDgoEBAQCAhIE0gICHhrSDiBJZiBgcmVxdWlyZWRgIGlzIHRydWUsIHRoZSBmaWVsZCBtdXN0IGJlIHNldC4gQSB2YWxpZGF0aW9uIGVycm9yIGlzIHJldHVybmVkCiBpZiB0aGUgZmllbGQgaXMgbm90IHNldC4KCiBgYGBwcm90bwogc3ludGF4PSJwcm90bzMiOwoKIG1lc3NhZ2UgRmllbGRzV2l0aFByZXNlbmNlIHsKICAgLy8gUmVxdWlyZXMgYW55IHN0cmluZyB0byBiZSBzZXQsIGluY2x1ZGluZyB0aGUgZW1wdHkgc3RyaW5nLgogICBvcHRpb25hbCBzdHJpbmcgbGluayA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogICAvLyBSZXF1aXJlcyB0cnVlIG9yIGZhbHNlIHRvIGJlIHNldC4KICAgb3B0aW9uYWwgYm9vbCBkaXNhYmxlZCA9IDIgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogICAvLyBSZXF1aXJlcyBhIG1lc3NhZ2UgdG8gYmUgc2V0LCBpbmNsdWRpbmcgdGhlIGVtcHR5IG1lc3NhZ2UuCiAgIFNvbWVNZXNzYWdlIG1zZyA9IDQgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogfQogYGBgCgogQWxsIGZpZWxkcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSB0cmFjayBwcmVzZW5jZS4gQnkgZGVmYXVsdCwgUHJvdG92YWxpZGF0ZQogaWdub3JlcyBydWxlcyBvbiB0aG9zZSBmaWVsZHMgaWYgbm8gdmFsdWUgaXMgc2V0LiBgcmVxdWlyZWRgIGVuc3VyZXMgdGhhdAogdGhlIGZpZWxkcyBhcmUgc2V0IGFuZCB2YWxpZC4KCiBGaWVsZHMgdGhhdCBkb24ndCB0cmFjayBwcmVzZW5jZSBhcmUgYWx3YXlzIHZhbGlkYXRlZCBieSBQcm90b3ZhbGlkYXRlLAogd2hldGhlciB0aGV5IGFyZSBzZXQgb3Igbm90LiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGFkZCBgcmVxdWlyZWRgLiBJdAogY2FuIGJlIGFkZGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIGZpZWxkIGNhbm5vdCBiZSB0aGUgemVybyB2YWx1ZS4KCiBgYGBwcm90bwogc3ludGF4PSJwcm90bzMiOwoKIG1lc3NhZ2UgRmllbGRzV2l0aG91dFByZXNlbmNlIHsKICAgLy8gYHN0cmluZy5lbWFpbGAgYWx3YXlzIGFwcGxpZXMsIGV2ZW4gdG8gYW4gZW1wdHkgc3RyaW5nLgogICBzdHJpbmcgbGluayA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5lbWFpbCA9IHRydWUKICAgXTsKICAgLy8gYHJlcGVhdGVkLm1pbl9pdGVtc2AgYWx3YXlzIGFwcGxpZXMsIGV2ZW4gdG8gYW4gZW1wdHkgbGlzdC4KICAgcmVwZWF0ZWQgc3RyaW5nIGxhYmVscyA9IDIgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcGVhdGVkLm1pbl9pdGVtcyA9IDEKICAgXTsKICAgLy8gYHJlcXVpcmVkYCwgZm9yIGZpZWxkcyB0aGF0IGRvbid0IHRyYWNrIHByZXNlbmNlLCBpbmRpY2F0ZXMKICAgLy8gdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBjYW4ndCBiZSB0aGUgemVybyB2YWx1ZS4KICAgaW50MzIgemVyb192YWx1ZV9ub3RfYWxsb3dlZCA9IDMgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZQogICBdOwogfQogYGBgCgogVG8gbGVhcm4gd2hpY2ggZmllbGRzIHRyYWNrIHByZXNlbmNlLCBzZWUgdGhlCiBbRmllbGQgUHJlc2VuY2UgY2hlYXQgc2hlZXRdKGh0dHBzOi8vcHJvdG9idWYuZGV2L3Byb2dyYW1taW5nLWd1aWRlcy9maWVsZF9wcmVzZW5jZS8jY2hlYXQpLgoKIE5vdGU6IFdoaWxlIGZpZWxkIHJ1bGVzIGNhbiBiZSBhcHBsaWVkIHRvIHJlcGVhdGVkIGl0ZW1zLCBtYXAga2V5cywgYW5kIG1hcAogdmFsdWVzLCB0aGUgZWxlbWVudHMgYXJlIGFsd2F5cyBjb25zaWRlcmVkIHRvIGJlIHNldC4gQ29uc2VxdWVudGx5LAogc3BlY2lmeWluZyBgcmVwZWF0ZWQuaXRlbXMucmVxdWlyZWRgIGlzIHJlZHVuZGFudC4KCg0KBQQEAgIEEgTSAgIKCg0KBQQEAgIFEgTSAgsPCg0KBQQEAgIBEgTSAhAYCg0KBQQEAgIDEgTSAhsdCvYCCgQEBAIDEgTfAgIeGucCIElnbm9yZSB2YWxpZGF0aW9uIHJ1bGVzIG9uIHRoZSBmaWVsZCBpZiBpdHMgdmFsdWUgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkCiBjcml0ZXJp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AQoCBQASBpwDAPQDARp0IFNwZWNpZmllcyBob3cgYEZpZWxkUnVsZXMuaWdub3JlYCBiZWhhdmVzLCBkZXBlbmRpbmcgb24gdGhlIGZpZWxkJ3MgdmFsdWUsIGFuZAogd2hldGhlciB0aGUgZmllbGQgdHJhY2tzIHByZXNlbmNlLgoKCwoDBQABEgScAwULCpQKCgQFAAIAEgTQAwIZGoUKIElnbm9yZSBydWxlcyBpZiB0aGUgZmllbGQgdHJhY2tzIHByZXNlbmNlIGFuZCBpcyB1bnNldC4gVGhpcyBpcyB0aGUgZGVmYXVsdAogYmVoYXZpb3IuCgogSW4gcHJvdG8zLCBvbmx5IG1lc3NhZ2UgZmllbGRzLCBtZW1iZXJzIG9mIGEgUHJvdG9idWYgYG9uZW9mYCwgYW5kIGZpZWxkcwogd2l0aCB0aGUgYG9wdGlvbmFsYCBsYWJlbCB0cmFjayBwcmVzZW5jZS4gQ29uc2VxdWVudGx5LCB0aGUgZm9sbG93aW5nIGZpZWxkcwogYXJlIGFsd2F5cyB2YWxpZGF0ZWQsIHdoZXRoZXIgYSB2YWx1ZSBpcyBzZXQgb3Igbm90OgoKIGBgYHByb3RvCiBzeW50YXg9InByb3RvMyI7CgogbWVzc2FnZSBSdWxlc0FwcGx5IHsKICAgc3RyaW5nIGVtYWlsID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmVtYWlsID0gdHJ1ZQogICBdOwogICBpbnQzMiBhZ2UgPSAyIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5pbnQzMi5ndCA9IDAKICAgXTsKICAgcmVwZWF0ZWQgc3RyaW5nIGxhYmVscyA9IDMgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnJlcGVhdGVkLm1pbl9pdGVtcyA9IDEKICAgXTsKIH0KIGBgYAoKIEluIGNvbnRyYXN0LCB0aGUgZm9sbG93aW5nIGZpZWxkcyB0cmFjayBwcmVzZW5jZSwgYW5kIGFyZSBvbmx5IHZhbGlkYXRlZCBpZgogYSB2YWx1ZSBpcyBzZXQ6CgogYGBgcHJvdG8KIHN5bnRheD0icHJvdG8zIjsKCiBtZXNzYWdlIFJ1bGVzQXBwbHlJZlNldCB7CiAgIG9wdGlvbmFsIHN0cmluZyBlbWFpbCA9IDEgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5lbWFpbCA9IHRydWUKICAgXTsKICAgb25lb2YgcmVmIHsKICAgICBzdHJpbmcgcmVmZXJlbmNlID0gMiBbCiAgICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcudXVpZCA9IHRydWUKICAgICBdOwogICAgIHN0cmluZyBuYW1lID0gMyBbCiAgICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcubWluX2xlbiA9IDQKICAgICBdOwogICB9CiAgIFNvbWVNZXNzYWdlIG1zZyA9IDQgWwogICAgIChidWYudmFsaWRhdGUuZmllbGQpLmNlbCA9IHsvKiAuLi4gKi99CiAgIF07CiB9CiBgYGAKCiBUbyBlbnN1cmUgdGhhdCBzdWNoIGEgZmllbGQgaXMgc2V0LCBhZGQgdGhlIGByZXF1aXJlZGAgcnVsZS4KCiBUbyBsZWFybiB3aGljaCBmaWVsZHMgdHJhY2sgcHJlc2VuY2UsIHNlZSB0aGUKIFtGaWVsZCBQcmVzZW5jZSBjaGVhdCBzaGVldF0oaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2ZpZWxkX3ByZXNlbmNlLyNjaGVhdCkuCgoNCgUFAAIAARIE0AMCFAoNCgUFAAIAAhIE0AMXGArJBQoEBQACARIE4AMCGxq6BSBJZ25vcmUgcnVsZXMgaWYgdGhlIGZpZWxkIGlzIHVuc2V0LCBvciBzZXQgdG8gdGhlIHplcm8gdmFsdWUuCgogVGhlIHplcm8gdmFsdWUgZGVwZW5kcyBvbiB0aGUgZmllbGQgdHlwZToKIC0gRm9yIHN0cmluZ3MsIHRoZSB6ZXJvIHZhbHVlIGlzIHRoZSBlbXB0eSBzdHJpbmcuCiAtIEZvciBieXRlcywgdGhlIHplcm8gdmFsdWUgaXMgZW1wdHkgYnl0ZXMuCiAtIEZvciBib29sLCB0aGUgemVybyB2YWx1ZSBpcyBmYWxzZS4KIC0gRm9yIG51bWVyaWMgdHlwZXMsIHRoZSB6ZXJvIHZhbHVlIGlzIHplcm8uCiAtIEZvciBlbnVtcywgdGhlIHplcm8gdmFsdWUgaXMgdGhlIGZpcnN0IGRlZmluZWQgZW51bSB2YWx1ZS4KIC0gRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIHplcm8gaXMgYW4gZW1wdHkgbGlzdC4KIC0gRm9yIG1hcCBmaWVsZHMsIHRoZSB6ZXJvIGlzIGFuIGVtcHR5IG1hcC4KIC0gRm9yIG1lc3NhZ2UgZmllbGRzLCBhYnNlbmNlIG9mIHRoZSBtZXNzYWdlICh0eXBpY2FsbHkgYSBudWxsLXZhbHVlKSBpcyBjb25zaWRlcmVkIHplcm8gdmFsdWUuCgogRm9yIGZpZWxkcyB0aGF0IHRyYWNrIHByZXNlbmNlIChlLmcuIGFkZGluZyB0aGUgYG9wdGlvbmFsYCBsYWJlbCBpbiBwcm90bzMpLAogdGhpcyBhIG5vLW9wIGFuZCBiZWhhdmlvciBpcyB0aGUgc2FtZSBhcyB0aGUgZGVmYXVsdCBgSUdOT1JFX1VOU1BFQ0lGSUVEYC4KCg0KBQUAAgEBEgTgAwIWCg0KBQUAAgECEgTgAxkaCpkDCgQFAAICEgTwAwIUGooDIEFsd2F5cyBpZ25vcmUgcnVsZXMsIGluY2x1ZGluZyB0aGUgYHJlcXVpcmVkYCBydWxlLgoKIFRoaXMgaXMgdXNlZnVsIGZvciBpZ25vcmluZyB0aGUgcnVsZXMgb2YgYSByZWZlcmVuY2VkIG1lc3NhZ2UsIG9yIHRvCiB0ZW1wb3JhcmlseSBpZ25vcmUgcnVsZXMgZHVyaW5nIGRldmVsb3BtZW50LgoKIGBgYHByb3RvCiBtZXNzYWdlIE15TWVzc2FnZSB7CiAgIC8vIFRoZSBmaWVsZCdzIHJ1bGVzIHdpbGwgYWx3YXlzIGJlIGlnbm9yZWQsIGluY2x1ZGluZyBhbnkgdmFsaWRhdGlvbnMKICAgLy8gb24gdmFsdWUncyBmaWVsZHMuCiAgIE15T3RoZXJNZXNzYWdlIHZhbHVlID0gMSBbCiAgICAgKGJ1Zi52YWxpZGF0ZS5maWVsZCkuaWdub3JlID0gSUdOT1JFX0FMV0FZUwogICBdOwogfQogYGBgCgoNCgUFAAICARIE8AMCDwoNCgUFAAICAhIE8AMSEwoLCgMFAAQSBPIDAg0KDAoEBQAEABIE8gMLDAoNCgUFAAQA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FAoKBAoCAwiICQEDAxIGoAsIogttChMKCQQKAgMIiAkBBBIGpAsGqQsHChIKCgQKAgMIiAkBBAESBKULCCUKFAoKBAoCAwiICQEEAxIGpgsIqAtsCsQGCgQECgIEEga+CwTdCwYaswYgYGd0ZWAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGVgIGlzIGxhcmdlciB0aGFuIGEgc3BlY2lmaWVkIGBsdGAKIG9yIGBsdGVgLCB0aGUgcmFuZ2UgaXMgcmV2ZXJzZWQsIGFuZCB0aGUgZmllbGQgdmFsdWUgbXVzdCBiZSBvdXRzaWRlIHRoZQogc3BlY2lmaWVkIHJhbmdlLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlVSW50MzIgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IFt1aW50MzIuZ3RlXQogICB1aW50MzIgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS51aW50MzIuZ3RlID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IGFuZCBsZXNzIHRoYW4gMTAgW3VpbnQzMi5ndGVfbHRdCiAgIHVpbnQzMiBvdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLnVpbnQzMiA9IHsgZ3RlOiA1LCBsdDogMTAgfV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCBvciBsZXNzIHRoYW4gNSBbdWludDMyLmd0ZV9sdF9leGNsdXNpdmVdCiAgIHVpbnQzMiBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudWludDMyID0geyBndGU6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EgTbEQgcChQKCgQOAgMIiAkBAwMSBtwRCN4RbQoTCgkEDgIDCIgJAQQSBuARBuURBwoSCgoEDgIDCIgJAQQBEgThEQgmChQKCgQOAgMIiAkBBAMSBuIRCOQRbArOBgoEBA4CBBIG+hEEmRIGGr0GIGBndGVgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15Rml4ZWQzMiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgW2ZpeGVkMzIuZ3RlXQogICBmaXhlZDMyIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQzMi5ndGUgPSA1XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDUgYW5kIGxlc3MgdGhhbiAxMCBbZml4ZWQzMi5ndGVfbHRdCiAgIGZpeGVkMzIgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5maXhlZDMyID0geyBndGU6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDMyLmd0ZV9sdF9leGNsdXNpdmVdCiAgIGZpeGVkMzIgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQp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AAESBP0SBhcKFAoKBA8CAgiICQEAAxIG/hIGgBNNCg4KBAQPCAESBoMTAukTAwoNCgUEDwgBARIEgxMIFAqWBgoEBA8CAxIGlhMEtRMGGoUGIGBndGAgcmVxdWlyZXMgdGhlIGZpZWxkIHZhbHVlIHRvIGJlIGdyZWF0ZXIgdGhhbiB0aGUgc3BlY2lmaWVkIHZhbHVlCiAoZXhjbHVzaXZlKS4gSWYgdGhlIHZhbHVlIG9mIGBndGAgaXMgbGFyZ2VyIHRoYW4gYSBzcGVjaWZpZWQgYGx0YCBvcgogYGx0ZWAsIHRoZSByYW5nZSBpcyByZXZlcnNlZCwgYW5kIHRoZSBmaWVsZCB2YWx1ZSBtdXN0IGJlIG91dHNpZGUgdGhlCiBzcGVjaWZpZWQgcmFuZ2UuIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1lZXQgdGhlIHJlcXVpcmVkIGNvbmRpdGlvbnMsCiBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1IFtmaXhlZDY0Lmd0XQogICBmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NC5ndCA9IDVdOwoKICAgLy8gdmFsdWUgbXVzdCBiZSBncmVhdGVyIHRoYW4gNSBhbmQgbGVzcyB0aGFuIDEwIFtmaXhlZDY0Lmd0X2x0XQogICBmaXhlZDY0IG90aGVyX3ZhbHVlID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NCA9IHsgZ3Q6IDUsIGx0OiAxMCB9XTsKCiAgIC8vIHZhbHVlIG11c3QgYmUgZ3JlYXRlciB0aGFuIDEwIG9yIGxlc3MgdGhhbiA1IFtmaXhlZDY0Lmd0X2x0X2V4Y2x1c2l2ZV0KICAgZml4ZWQ2NCBhbm90aGVyX3ZhbHVlID0gMyBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZml4ZWQ2NCA9IHsgZ3Q6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBA8CAwUSBJYTBAsKDQoFBA8CAwESBJYTDA4KDQoFBA8CAwMSBJYTERIK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cXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZAogdmFsdWUgKGV4Y2x1c2l2ZSkuIElmIHRoZSB2YWx1ZSBvZiBgZ3RlYCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U0ZpeGVkNjQgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IFtzZml4ZWQ2NC5ndGVdCiAgIHNmaXhlZDY0IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc2ZpeGVkNjQuZ3RlID0gNV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA1IGFuZCBsZXNzIHRoYW4gMTAgW3NmaXhlZDY0Lmd0ZV9sdF0KICAgc2ZpeGVkNjQgb3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zZml4ZWQ2NCA9IHsgZ3RlOiA1LCBsdDogMTAgfV07CgogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxMCBvciBsZXNzIHRoYW4gNSBbc2ZpeGVkNjQuZ3RlX2x0X2V4Y2x1c2l2ZV0KICAgc2ZpeGVkNjQgYW5vdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLnNmaXhlZDY0ID0geyBndGU6IDEwLCBsdDogNSB9XTsKIH0KIGBgYAoKDQoFBBECBAUSBOcWBAwKDQoFBBECBAESBOcWDRAKDQoFBBECBAMSBOcWExQKDwoFBBECBAgSBucWFYYXBQoTCgkEEQIE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ZWxkIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHNwZWNpZmllZAogcmVndWxhciBleHByZXNzaW9uIChSRTIgc3ludGF4KSwgd2l0aCB0aGUgZXhwcmVzc2lvbiBwcm92aWRlZCB3aXRob3V0IGFueQogZGVsaW1pdGVycy4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWF0Y2ggdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYW4KIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBtYXRjaCByZWdleCBwYXR0ZXJuIGBeW2EtekEtWl0vLyRgCiAgIHN0cmluZyB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnN0cmluZy5wYXR0ZXJuID0gIl5bYS16QS1aXS8vJCJdOwogfQogYGBgCgoNCgUEEwIHBBIE4BgCCgoNCgUEEwIHBRIE4BgLEQoNCgUEEwIHARIE4BgSGQoNCgUEEwIHAxIE4BgcHQoPCgUEEwIHCBIG4Bge4xgEChMKCQQTAgcIiAkBABIG4Bgf4xgDChIKCgQTAgcIiAkBAAESBOEYBBgKEgoKBBMCBwiICQEAAxIE4hgEdwruAgoEBBMCCBIG8BgC8xgFGt0CIGBwcmVmaXhgIHNwZWNpZmllcyB0aGF0IHRoZSBmaWVsZCB2YWx1ZSBtdXN0IGhhdmUgdGhlCnNwZWNpZmllZCBzdWJzdHJpbmcgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLiBJZiB0aGUgZmllbGQgdmFsdWUKIGRvZXNuJ3Qgc3RhcnQgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlCiBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlTdHJpbmcgewogICAvLyB2YWx1ZSBkb2VzIG5vdCBoYXZlIHByZWZpeCBgcHJlYAogICBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcucHJlZml4ID0gInByZSJdOwogfQogYGBgCgoNCgUE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AAESBLsZBBcKEgoKBBMCDQiICQEAAxIEvBkEYwpbCgQEEwgAEgbBGQK9HQMaSyBgV2VsbEtub3duYCBydWxlcyBwcm92aWRlIGFkdmFuY2VkIHJ1bGVzIGFnYWluc3QgY29tbW9uIHN0cmluZwogcGF0dGVybnMuCgoNCgUEEwgAARIEwRkIEgrJBQoEBBMCDhIG0hkE3RkGGrgFIGBlbWFpbGAgc3BlY2lmaWVzIHRoYXQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBmb3IKIGV4YW1wbGUgImZvb0BleGFtcGxlLmNvbSIuCgogQ29uZm9ybXMgdG8gdGhlIGRlZmluaXRpb24gZm9yIGEgdmFsaWQgZW1haWwgYWRkcmVzcyBmcm9tIHRoZSBbSFRNTCBzdGFuZGFyZF0oaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvaW5wdXQuaHRtbCN2YWxpZC1lLW1haWwtYWRkcmVzcykuCiBOb3RlIHRoYXQgdGhpcyBzdGFuZGFyZCB3aWxsZnVsbHkgZGV2aWF0ZXMgZnJvbSBbUkZDIDUzMjJdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNTMyMiksCiB3aGljaCBhbGxvd3MgbWFueSB1bmV4cGVjdGVkIGZvcm1zIG9mIGVtYWlsIGFkZHJlc3NlcyBhbmQgd2lsbCBlYXNpbHkgbWF0Y2gKIGEgdHlwb2dyYXBoaWNhbCBlcnJvci4KCiBJZiB0aGUgZmllbGQgdmFsdWUgaXNuJ3QgYSB2YWxpZCBlbWFpbCBhZGRyZXNzLCBhbiBlcnJvciBtZXNzYWdlIHdpbGwgYmUgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15U3RyaW5nIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGVtYWlsIGFkZHJlc3MKICAgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuc3RyaW5nLmVtYWlsID0gdHJ1ZV07CiB9CiBgYGAKCg0KBQQTAg4FEgTSGQQICg0KBQQTAg4BEgTSGQkOCg0KBQQTAg4DEgTSGRETCg8K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AxIEjh0ILwryBwoEBBMCIBIGph0EvB0GGuEHIGB3ZWxsX2tub3duX3JlZ2V4YCBzcGVjaWZpZXMgYSBjb21tb24gd2VsbC1rbm93biBwYXR0ZXJuCiBkZWZpbmVkIGFzIGEgcmVnZXguIElmIHRoZSBmaWVsZCB2YWx1ZSBkb2Vzbid0IG1hdGNoIHRoZSB3ZWxsLWtub3duCiByZWdleCwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVN0cmluZyB7CiAgIC8vIHZhbHVlIG11c3QgYmUgYSB2YWxpZCBIVFRQIGhlYWRlciB2YWx1ZQogICBzdHJpbmcgdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5zdHJpbmcud2VsbF9rbm93bl9yZWdleCA9IEtOT1dOX1JFR0VYX0hUVFBfSEVBREVSX1ZBTFVFXTsKIH0KIGBgYAoKICMjIyMgS25vd25SZWdleAoKIGB3ZWxsX2tub3duX3JlZ2V4YCBjb250YWlucyBzb21lIHdlbGwta25vd24gcGF0dGVybnMuCgogfCBOYW1lICAgICAgICAgICAgICAgICAgICAgICAgICB8IE51bWJlciB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiB8IEtOT1dOX1JFR0VYX1VOU1BFQ0lGSUVEICAgICAgIHwgMCAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogfCBLTk9XTl9SRUdFWF9IVFRQX0hFQURFUl9OQU1FICB8IDEgICAgICB8IEhUVFAgaGVhZGVyIG5hbWUgYXMgZGVmaW5lZCBieSBbUkZDIDcyMzBdKGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNzIzMCNzZWN0aW9uLTMuMikgIHwKIHwgS05PV05fUkVHRVhfSFRUUF9IRUFERVJfVkFM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ZmllbGQgdmFsdWUgdG8gZXhhY3RseSBtYXRjaCB0aGUgc3BlY2lmaWVkIGVudW0gdmFsdWUuCiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtYXRjaCwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBiZSBleGFjdGx5IE1ZX0VOVU1fVkFMVUUxLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmNvbnN0ID0gMV07CiB9CiBgYGAKCg0KBQQVAgAEEgSPIAIKCg0KBQQVAgAFEgSPIAsQCg0KBQQVAgABEgSPIBEWCg0KBQQVAgADEgSPIBkaCg8KBQQVAgAIEgaPIBuSIAQKEwoJBBUCAAiICQEAEgaPIBySIAMKEgoKBBUCAAiICQEAARIEkCAEFAoSCgoEFQIACIgJAQADEgSRIARyCo0DCgQEFQIBEgSjIAIhGv4CIGBkZWZpbmVkX29ubHlgIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBiZSBvbmUgb2YgdGhlIGRlZmluZWQgdmFsdWVzIGZvcgogdGhpcyBlbnVtLCBmYWlsaW5nIG9uIGFueSB1bmRlZmluZWQgdmFsdWUuCgogYGBgcHJvdG8KIGVudW0gTXlFbnVtIHsKICAgTVlfRU5VTV9VTlNQRUNJRklFRCA9IDA7CiAgIE1ZX0VOVU1fVkFMVUUxID0gMTsKICAgTVlfRU5VTV9WQUxVRTIgPSAyOwogfQoKIG1lc3NhZ2UgTXlNZXNzYWdlIHsKICAgLy8gVGhlIGZpZWxkIGB2YWx1ZWAgbXVzdCBiZSBhIGRlZmluZWQgdmFsdWUgb2YgTXlFbnVtLgogICBNeUVudW0gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5lbnVtLmRlZmluZWRfb25seSA9IHRydWVdOwog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AoohBRqsAyBgbWF4X2l0ZW1zYCBkZW5vdGVzIHRoYXQgdGhpcyBmaWVsZCBtdXN0IG5vdCBleGNlZWQgYQogY2VydGFpbiBudW1iZXIgb2YgaXRlbXMgYXMgdGhlIHVwcGVyIGxpbWl0LiBJZiB0aGUgZmllbGQgY29udGFpbnMgbW9yZQogaXRlbXMgdGhhbiBzcGVjaWZpZWQsIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQsIHJlcXVpcmluZyB0aGUKIGZpZWxkIHRvIG1haW50YWluIG5vIG1vcmUgdGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBpdGVtcy4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVJlcGVhdGVkIHsKICAgLy8gdmFsdWUgbXVzdCBjb250YWluIG5vIG1vcmUgdGhhbiAzIGl0ZW0ocykKICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVwZWF0ZWQubWF4X2l0ZW1zID0gM107CiB9CiBgYGAKCg0KBQQWAgEEEgSHIQIKCg0KBQQWAgEFEgSHIQsRCg0KBQQWAgEBEgSHIRIbCg0KBQQWAgEDEgSHIR4fCg8KBQQWAgEIEgaHISCKIQQKEwoJBBYCAQiICQEAEgaHISGKIQMKEgoKBBYCAQiICQEAARIEiCEEHAoTCgoEFgIBCIgJAQADEgWJIQSDAQreAgoEBBYCAhIGliECmiEFGs0CIGB1bmlxdWVgIGluZGljYXRlcyB0aGF0IGFsbCBlbGVtZW50cyBpbiB0aGlzIGZpZWxkIG11c3QKIGJlIHVuaXF1ZS4gVGhpcyBydWxlIGlzIHN0cmljdGx5IGFwcGxpY2FibGUgdG8gc2NhbGFyIGFuZCBlbnVtCiB0eXBlcywgd2l0aCBtZXNzYWdlIHR5cGVzIG5vdCBiZWluZyBzdXBwb3J0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlSZXBlYXRlZCB7CiAgIC8vIHJlcGVhdGVkIHZhbHVlIG11c3QgY29udGFpbiB1bmlxdWUgaXRlbXMKICAgcmVwZWF0ZWQgc3RyaW5nIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVwZWF0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aGUgdmFsdWVzIGluIHRoZSBmaWVsZCBgdmFsdWVgIG11c3QgZm9sbG93IHRoZSBzcGVjaWZpZWQgcnVsZXMuCiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5tYXAudmFsdWVzID0gewogICAgIHN0cmluZzogewogICAgICAgbWluX2xlbjogNQogICAgICAgbWF4X2xlbjogMjAKICAgICB9CiAgIH1dOwogfQogYGBgCiBOb3RlIHRoYXQgdGhlIGByZXF1aXJlZGAgcnVsZSBkb2VzIG5vdCBhcHBseS4gTWFwIHZhbHVlcyBjYW5ub3QgYmUgdW5zZXQuCgoNCgUEFwIDBBIE9SECCgoNCgUEFwIDBhIE9SELFQoNCgUEFwIDARIE9SEWHAoNCgUEFwIDAxIE9SEfIAq4AQoDBBcFEgT6IQIZGqoBIEV4dGVuc2lvbiBmaWVsZHMgdGhhdCBoYXZlIHRoZSAoYnVmLnZhbGlkYXRlLnByZWRlZmluZWQpIG9wdGlvbiBzZXQKIHdpbGwgYmUgdHJlYXRlZCBhcyBwcmVkZWZpbmVkIGZpZWxkIHJ1bGVzLgogU2VlIGh0dHBzOi8vcHJvdG92YWxpZGF0ZS5jb20vc2NoZW1hcy9wcmVkZWZpbmVkLXJ1bGVzLwoKDAoEBBcFABIE+iENGAoNCgUEFwUAARIE+iENEQoNCgUEFwUAAhIE+iEVGAppCgIEGBIG/iEAmCIBGlsgQW55UnVsZXMgZGVzY3JpYmUgcnVsZXMgYXBwbGllZCBleGNsdXNpdmVseSB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5BbnlgIHdlbGwta25vd24gdHlwZS4KCgsKAwQYARIE/iEIEAq8AwoEBBgCABIEiyICGRqtAyBgaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCdzIGB0eXBlX3VybGAgdG8gYmUgZXF1YWwgdG8gb25lIG9mIHRoZQpzcGVjaWZpZWQgdmFsdWVzLiBJZiBpdCBkb2Vzbid0IG1hdGNoIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IKIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15QW55IHsKICAgLy8gIFRoZSBgdmFsdWVgIGZpZWxkIG11c3QgaGF2ZSBhIGB0eXBlX3VybGAgZXF1YWwgdG8gb25lIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYW55ID0gewogICAgICAgaW46IFsidHlwZS5nb29nbGVhcGlzLmNvbS9NeVR5cGUxIiwgInR5cGUuZ29vZ2xlYXBpcy5jb20vTXlUeXBlMiJdCiAgIH1dOwogfQogYGBgCgoNCgUEGAIABBIEiyICCgoNCgUEGAIABRIEiyILEQoNCgUEGAIAARIEiyISFAoNCgUEGAIAAxIEiyIXGArIAwoEBBgCARIElyICHRq5AyByZXF1aXJlcyB0aGUgZmllbGQncyB0eXBlX3VybCB0byBiZSBub3QgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLiBJZiBpdCBtYXRjaGVzIGFueSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcywgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlBbnkgewogICAvLyAgVGhlIGB2YWx1ZWAgZmllbGQgbXVzdCBub3QgaGF2ZSBhIGB0eXBlX3VybGAgZXF1YWwgdG8gYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICBnb29nbGUucHJvdG9idWYuQW55IHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuYW55ID0gewogICAgICAgbm90X2luOiBbInR5cGUuZ29vZ2xlYXBpcy5jb20vRm9yYmlkZGVuVHlwZTEiLCAidHlwZS5nb29nbGVhcGlzLmNvbS9Gb3JiaWRkZW5UeXBlMiJdCiAgIH1dOwogfQogYGBgCgoNCgUEGAIBBBIElyICCgoNCgUEGAIBBRIElyILEQoNCgUEGAIBARIElyISGAoNCgUEGAIBAxIElyIbHAp3CgIEGRIGmyIA6SMBGmkgRHVyYXRpb25SdWxlcyBkZXNjcmliZSB0aGUgcnVsZXMgYXBwbGllZCBleGNsdXNpdmVseSB0byB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgd2VsbC1rbm93biB0eXBlLgoKCwoDBBkBEgSbIggVCvYCCgQEGQIAEgamIgKpIgUa5QIgYGNvbnN0YCBkaWN0YXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRHVyYXRpb25gIHR5cGUgZXhhY3RseS4KIElmIHRoZSBmaWVsZCdzIHZhbHVlIGRldmlhdGVzIGZyb20gdGhlIHNwZWNpZmllZCB2YWx1ZSwgYW4gZXJyb3IgbWVzc2FnZQogd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgZXF1YWwgNXMKICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24uY29uc3QgPSAiNXMiXTsKIH0KIGBgYAoKDQoFBBkCAAQSBKYiAgoKDQoFBBkCAAYSBKYiCyMKDQoFBBkCAAESBKYiJCkKDQoFBBkCAAMSBKYiLC0KDwoFBBkCAAgSBqYiLqkiBAoTCgkEGQIACIgJAQASBqYiL6kiAwoSCgoEGQIACIgJAQABEgSnIgQYChIKCgQZAgAIiAkBAAMSBKgiBHIKDgoEBBkIABIGqiICzCIDCg0KBQQZCAABEgSqIggRCpEDCgQEGQIBEga1IgS6IgcagAMgYGx0YCBzdGlwdWxhdGVzIHRoYXQgdGhlIGZpZWxkIG11c3QgYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRHVyYXRpb25gIHR5cGUsCiBleGNsdXNpdmUuIElmIHRoZSBmaWVsZCdzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSwgYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAgLy8gdmFsdWUgbXVzdCBiZSBsZXNzIHRoYW4gNXMKICAgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZHVyYXRpb24ubHQgPSAiNXMiXTsKIH0KIGBgYAoKDQoFBBkCAQYSBLUiBBwKDQoFBBkCAQESBLUiHR8KDQoFBBkCAQMSBLUiIiMKDwoFBBkCAQgSBrUiJLoiBgoTCgkEGQIBCIgJAQASBrUiJboiBQoSCgoEGQIBCIgJAQABEgS2IgYXChQKCgQZAgEIiAkBAAMSBrciBrkiQAqgAwoEBBkCAhIGxiIEyyIHGo8DIGBsdGVgIGluZGljYXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCiB2YWx1ZSBvZiB0aGUgYGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmAgdHlwZSwgaW5jbHVzaXZlLiBJZiB0aGUgZmllbGQncyB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHNwZWNpZmllZCB2YWx1ZSwKIGFuIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlEdXJhdGlvbiB7CiAgIC8vIHZhbHVlIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDEwcwogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5sdGUgPSAiMTBzIl07CiB9CiBgYGAKCg0KBQQZAgIGEgTGIgQcCg0KBQQZAgIBEgTGIh0gCg0KBQQZAgIDEgTGIiMkCg8KBQQZAgIIEgbGIiXLIgYKEwoJBBkCAgiICQEAEgbGIibLIgUKEgoKBBkCAgiICQEAARIExyIGGAoUCgoEGQICCIgJAQADEgbIIgbKIk0KDgoEBBkIARIGzSICsyMDCg0KBQQZCAEBEgTNIggUCqgHCgQEGQIDEgbgIgT/IgYalwcgYGd0YCByZXF1aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15RHVyYXRpb24gewogICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiA1cyBbZHVyYXRpb24uZ3RdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uLmd0ID0geyBzZWNvbmRzOiA1IH1dOwoKICAgLy8gZHVyYXRpb24gbXVzdCBiZSBncmVhdGVyIHRoYW4gNXMgYW5kIGxlc3MgdGhhbiAxMHMgW2R1cmF0aW9uLmd0X2x0XQogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gYW5vdGhlcl92YWx1ZSA9IDIgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndDogeyBzZWNvbmRzOiA1IH0sIGx0OiB7IHNlY29uZHM6IDEwIH0gfV07CgogICAvLyBkdXJhdGlvbiBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAxMHMgb3IgbGVzcyB0aGFuIDVzIFtkdXJhdGlvbi5ndF9sdF9leGNsdXNpdmVdCiAgIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBvdGhlcl92YWx1ZSA9IDMgWyhidWYudmFsaWRhdGUuZmllbGQpLmR1cmF0aW9uID0geyBndDogeyBzZWNvbmRzOiAxMCB9LCBsdDogeyBzZWNvbmRzOiA1IH0gfV07CiB9CiBgYGAKCg0KBQQZAgMGEgTgIgQcCg0KBQQZAgMBEgTgIh0fCg0KBQQZAgMDEgTgIiIjCg8KBQQZAgMIEgbg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BQQZBQACEgToIxUYCnUKAgQaEgbsIwC5JAEaZyBGaWVsZE1hc2tSdWxlcyBkZXNjcmliZSBydWxlcyBhcHBsaWVkIGV4Y2x1c2l2ZWx5IHRvIHRoZSBgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza2Agd2VsbC1rbm93biB0eXBlLgoKCwoDBBoBEgTsIwgWCpQDCgQEGgIAEgb5IwL8IwUagwMgYGNvbnN0YCBkaWN0YXRlcyB0aGF0IHRoZSBmaWVsZCBtdXN0IG1hdGNoIHRoZSBzcGVjaWZpZWQgdmFsdWUgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrYCB0eXBlIGV4YWN0bHkuCiBJZiB0aGUgZmllbGQncyB2YWx1ZSBkZXZpYXRlcyBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUsIGFuIGVycm9yIG1lc3NhZ2UKIHdpbGwgYmUgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15RmllbGRNYXNrIHsKICAgLy8gdmFsdWUgbXVzdCBlcXVhbCBbImEiXQogICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZmllbGRfbWFzay5jb25zdCA9IHsKICAgICAgIHBhdGhzOiBbImEiXQogICB9XTsKIH0KIGBgYAoKDQoFBBoCAAQSBPkjAgoKDQoFBBoCAAYSBPkjCyQKDQoFBBoCAAESBPkjJSoKDQoFBBoCAAMSBPkjLS4KDwoFBBoCAAgSBvkjL/wjBAoTCgkEGgIACIgJAQASBvkjMPwjAwoSCgoEGgIACIgJAQABEgT6IwQaChMKCgQaAgAIiAkBAAMSBfsjBIoBCvgDCgQEGgIBEgaMJAKPJAUa5wMgYGluYCByZXF1aXJlcyB0aGUgZmllbGQgdmFsdWUgdG8gb25seSBjb250YWluIHBhdGhzIG1hdGNoaW5nIHNwZWNpZmllZAogdmFsdWVzIG9yIHRoZWlyIHN1YnBhdGhzLgogSWYgYW55IG9mIHRoZSBmaWVsZCB2YWx1ZSdzIHBhdGhzIGRvZXNuJ3QgbWF0Y2ggdGhlIHJ1bGUsCiBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KIFNlZTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcmVmZXJlbmNlL3Byb3RvYnVmL2dvb2dsZS5wcm90b2J1Zi8jZmllbGQtbWFzawoKIGBgYHByb3RvCiBtZXNzYWdlIE15RmllbGRNYXNrIHsKICAgLy8gIFRoZSBgdmFsdWVgIEZpZWxkTWFzayBtdXN0IG9ubHkgY29udGFpbiBwYXRocyBsaXN0ZWQgaW4gYGluYC4KICAgZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLmZpZWxkX21hc2sgPSB7CiAgICAgICBpbjogWyJhIiwgImIiLCAiYy5hIl0KICAgfV07CiB9CiBgYGAKCg0KBQQaAgEEEgSMJAIKCg0KBQQaAgEFEgSMJAsRCg0KBQQaAgEBEgSMJBIUCg0KBQQaAgEDEgSMJBcYCg8KBQQaAgEIEgaMJBmPJAQKEwoJBBoCAQiICQEAEgaMJBqPJAMKEgoKBBoCAQiICQEAARIEjSQEFwoTCgoEGgIBCIgJAQADEgWOJATFAQqNBAoEBBoCAhIGnyQCoiQFGvwDIGBub3RfaW5gIHJlcXVpcmVzIHRoZSBmaWVsZCB2YWx1ZSB0byBub3QgY29udGFpbiBwYXRocyBtYXRjaGluZyBzcGVjaWZpZWQKIHZhbHVlcyBvciB0aGVpciBzdWJwYXRocy4KIElmIGFueSBvZiB0aGUgZmllbGQgdmFsdWUncyBwYXRocyBtYXRjaGVzIHRoZSBydWxlLAogYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCiBTZWU6IGh0dHBzOi8vcHJvdG9idWYuZGV2L3JlZmVyZW5jZS9wcm90b2J1Zi9nb29nbGUucHJvdG9idWYvI2ZpZWxkLW1hc2sKCiBgYGBwcm90bwogbWVzc2FnZSBNeUZpZWxkTWFzayB7CiAgIC8vICBUaGUgYHZhbHVlYCBGaWVsZE1hc2sgc2hhbGwgbm90IGNvbnRhaW4gcGF0aHMgbGlzdGVkIGluIGBub3RfaW5gLgogICBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuZmllbGRfbWFzayA9IHsK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aXJlcyB0aGUgZHVyYXRpb24gZmllbGQgdmFsdWUgdG8gYmUgbGVzcyB0aGFuIHRoZSBzcGVjaWZpZWQgdmFsdWUgKGZpZWxkIDwgdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeUR1cmF0aW9uIHsKICAgLy8gZHVyYXRpb24gbXVzdCBiZSBsZXNzIHRoYW4gJ1AzRCcgW2R1cmF0aW9uLmx0XQogICBnb29nbGUucHJvdG9idWYuRHVyYXRpb24gdmFsdWUgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5kdXJhdGlvbi5sdCA9IHsgc2Vjb25kczogMjU5MjAwIH1dOwogfQogYGBgCgoNCgUEGwIBBhIE0iQEHQoNCgUEGwIBARIE0iQeIAoNCgUEGwIBAxIE0iQjJAoPCgUEGwIBCBIG0iQl1yQGChMKCQQbAgEIiAkBABIG0iQm1yQFChIKCgQbAgEIiAkBAAESBNMkBhgKFAoKBBsCAQiICQEAAxIG1CQG1iRACrUDCgQEGwICEgbhJATmJAcapAMgcmVxdWlyZXMgdGhlIHRpbWVzdGFtcCBmaWVsZCB2YWx1ZSB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSAoZmllbGQgPD0gdmFsdWUpLiBJZiB0aGUgZmllbGQgdmFsdWUgZG9lc24ndCBtZWV0IHRoZSByZXF1aXJlZCBjb25kaXRpb25zLCBhbiBlcnJvciBtZXNzYWdlIGlzIGdlbmVyYXRlZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVRpbWVzdGFtcCB7CiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAnMjAyMy0wNS0xNFQwMDowMDowMFonIFt0aW1lc3RhbXAubHRlXQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIHZhbHVlID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmx0ZSA9IHsgc2Vjb25kczogMTY3ODg2NzIwMCB9XTsKIH0KIGBgYAoKDQoFBBsCAgYSBOEkBB0KDQoFBBsCAgESBOEkHiEKDQoFBBsCAgMSBOEkJCUKDwoFBBsCAggSBuEkJuYkBgoTCgkEGwICCIgJAQASBuEkJ+YkBQoSCgoEGwICCIgJAQABEgTiJAYZChQKCgQbAgIIiAkBAAMSBuMkBuUkTQrcAgoEBBsCAxIG8CQE8yQHGssCIGBsdF9ub3dgIHNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQsIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcGAgdHlwZSwgbXVzdCBiZSBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgdGltZS4gYGx0X25vd2AgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIHRoZSBgd2l0aGluYCBydWxlLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAvLyB2YWx1ZSBtdXN0IGJlIGxlc3MgdGhhbiBub3cKICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmx0X25vdyA9IHRydWVdOwogfQogYGBgCgoNCgUEGwIDBRIE8CQECAoNCgUEGwIDARIE8CQJDwoNCgUEGwIDAxIE8CQSEwoPCgUEGwIDCBIG8CQU8yQGChMKCQQbAgMIiAkBABIG8CQV8yQFChIKCgQbAgMIiAkBAAESBPEkBhwKEgoKBBsCAwiICQEAAxIE8iQGVQoOCgQEGwgBEgb1JALoJQMKDQoFBBsIAQESBPUkCBQKwwgKBAQbAgQSBoglBKclBhqyCCBgZ3RgIHJlcXVpcmVzIHRoZSB0aW1lc3RhbXAgZmllbGQgdmFsdWUgdG8gYmUgZ3JlYXRlciB0aGFuIHRoZSBzcGVjaWZpZWQKIHZhbHVlIChleGNsdXNpdmUpLiBJZiB0aGUgdmFsdWUgb2YgYGd0YCBpcyBsYXJnZXIgdGhhbiBhIHNwZWNpZmllZCBgbHRgCiBvciBgbHRlYCwgdGhlIHJhbmdlIGlzIHJldmVyc2VkLCBhbmQgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgb3V0c2lkZSB0aGUKIHNwZWNpZmllZCByYW5nZS4gSWYgdGhlIGZpZWxkIHZhbHVlIGRvZXNuJ3QgbWVldCB0aGUgcmVxdWlyZWQgY29uZGl0aW9ucywKIGFuIGVycm9yIG1lc3NhZ2UgaXMgZ2VuZXJhdGVkLgoKIGBgYHByb3RvCiBtZXNzYWdlIE15VGltZXN0YW1wIHsKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndF0KICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB2YWx1ZSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC5ndCA9IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9XTsKCiAgIC8vIHRpbWVzdGFtcCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAnMjAyMy0wMS0wMVQwMDowMDowMFonIGFuZCBsZXNzIHRoYW4gJzIwMjMtMDEtMDJUMDA6MDA6MDBaJyBbdGltZXN0YW1wLmd0X2x0XQogICBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wIGFub3RoZXJfdmFsdWUgPSAyIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0OiB7IHNlY29uZHM6IDE2NzI0NDQ4MDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjUzMTIwMCB9IH1dOwoKICAgLy8gdGltZXN0YW1wIG11c3QgYmUgZ3JlYXRlciB0aGFuICcyMDIzLTAxLTAyVDAwOjAwOjAwWicgb3IgbGVzcyB0aGFuICcyMDIzLTAxLTAxVDAwOjAwOjAwWicgW3RpbWVzdGFtcC5ndF9sdF9leGNsdXNpdmVdCiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgb3RoZXJfdmFsdWUgPSAzIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAgPSB7IGd0OiB7IHNlY29uZHM6IDE2NzI1MzEyMDAgfSwgbHQ6IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9IH1dOwogfQogYGBgCgoNCgUEGwIEBhIEiCUEHQoNCgUEGwIEARIEiCUeIAoNCgUEGwIEAxIEiCUjJAoPCgUE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iAkBBBIG1CUG2SUHChIKCgQbAgUIiAkBBAESBNUlCCkKFAoKBBsCBQiICQEEAxIG1iUI2CV5CuMCCgQEGwIGEgbkJQTnJQca0gIgYGd0X25vd2Agc3BlY2lmaWVzIHRoYXQgdGhpcyBmaWVsZCwgb2YgdGhlIGBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wYCB0eXBlLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB0aW1lLiBgZ3Rfbm93YCBjYW4gb25seSBiZSB1c2VkIHdpdGggdGhlIGB3aXRoaW5gIHJ1bGUuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlUaW1lc3RhbXAgewogICAvLyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBub3cKICAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCBjcmVhdGVkX2F0ID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkudGltZXN0YW1wLmd0X25vdyA9IHRydWVdOwogfQogYGBgCgoNCgUEGwIGBRIE5CUECAoNCgUEGwIGARIE5CUJDwoNCgUEGwIGAxIE5CUSEwoPCgUEGwIGCBIG5CUU5yUGChMKCQQbAgYIiAkBABIG5CUV5yUFChIKCgQbAgYIiAkBAAESBOUlBhwKEgoKBBsCBgiICQEAAxIE5iUGWAqhAwoEBBsCBxIG8iUC9SUFGpADIGB3aXRoaW5gIHNwZWNpZmllcyB0aGF0IHRoaXMgZmllbGQsIG9mIHRoZSBgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcGAgdHlwZSwgbXVzdCBiZSB3aXRoaW4gdGhlIHNwZWNpZmllZCBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCB0aW1lLiBJZiB0aGUgZmllbGQgdmFsdWUgaXNuJ3Qgd2l0aGluIHRoZSBkdXJhdGlvbiwgYW4gZXJyb3IgbWVzc2FnZSBpcyBnZW5lcmF0ZWQuCgogYGBgcHJvdG8KIG1lc3NhZ2UgTXlUaW1lc3RhbXAgewogICAvLyB2YWx1ZSBtdXN0IGJlIHdpdGhpbiAxIGhvdXIgb2Ygbm93CiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgY3JlYXRlZF9hdCA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC53aXRoaW4gPSB7c2Vjb25kczogMzYwMH1dOwogfQogYGBgCgoNCgUEGwIHBBIE8iUCCgoNCgUEGwIHBhIE8iULIwoNCgUEGwIHARIE8iUkKgoNCgUEGwIHAxIE8iUtLgoPCgUEGwIHCBIG8iUv9SUEChMKCQQbAgcIiAkBABIG8iUw9SUDChIKCgQbAgcIiAkBAAESBPMlBBoKEwoKBBsCBwiICQEAAxIF9CUEgwEKzwMKBAQbAggSBoMmAoYmBRq+AyBgZXhhbXBsZWAgc3BlY2lmaWVzIHZhbHVlcyB0aGF0IHRoZSBmaWVsZCBtYXkgaGF2ZS4gVGhlc2UgdmFsdWVzIFNIT1VMRAogY29uZm9ybSB0byBvdGhlciBydWxlcy4gYGV4YW1wbGVgIHZhbHVlcyB3aWxsIG5vdCBpbXBhY3QgdmFsaWRhdGlvbgogYnV0IG1heSBiZSB1c2VkIGFzIGhlbHBmdWwgZ3VpZGFuY2Ugb24gaG93IHRvIHBvcHVsYXRlIHRoZSBnaXZlbiBmaWVsZC4KCiBgYGBwcm90bwogbWVzc2FnZSBNeVRpbWVzdGFtcCB7CiAgIGdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAgdmFsdWUgPSAxIFsKICAgICAoYnVmLnZhbGlkYXRlLmZpZWxkKS50aW1lc3RhbXAuZXhhbXBsZSA9IHsgc2Vjb25kczogMTY3MjQ0NDgwMCB9LAogICAgIChidWYudmFsaWRhdGUuZmllbGQpLnRpbWVzdGFtcC5leGFtcGxlID0geyBzZWNvbmRzOiAxNjcyNTMxMjAwIH0sCiAgIF07CiB9CiBgYGAKCg0KBQQbAggEEgSDJgIKCg0KBQQbAggGEgSDJgskCg0KBQQbAggBEgSDJiUsCg0KBQQbAggDEgSDJi8xCg8KBQQbAggIEgaDJjKGJgQKEwoJBBsCCAiICQEAEgaDJjOGJgMKEgoKBBsCCAiICQEAARIEhCYEGwoSCgoEGwIICIgJAQADEgSFJgQWCrgBCgMEGwUSBIsmAhkaqgEgRXh0ZW5zaW9uIGZpZWxkcyB0aGF0IGhhdmUgdGhlIChidWYudmFsaWRhdGUucHJlZGVmaW5lZCkgb3B0aW9uIHNldAogd2lsbCBiZSB0cmVhdGVkIGFzIHByZWRlZmluZWQgZmllbGQgcnVsZXMuCiBTZWUgaHR0cHM6Ly9wcm90b3ZhbGlkYXRlLmNvbS9zY2hlbWFzL3ByZWRlZmluZWQtcnVsZXMvCgoMCgQEGwUAEgSLJg0YCg0KBQQbBQABEgSLJg0RCg0KBQQbBQACEgSLJhUYCpICCgIEHBIGkSYAlCYBGoMCIGBWaW9sYXRpb25zYCBpcyBhIGNvbGxlY3Rpb24gb2YgYFZpb2xhdGlvbmAgbWVzc2FnZXMuIFRoaXMgbWVzc2FnZSB0eXBlIGlzIHJldHVybmVkIGJ5CiBQcm90b3ZhbGlkYXRlIHdoZW4gYSBwcm90byBtZXNzYWdlIGZhaWxzIHRvIG1lZXQgdGhlIHJlcXVpcmVtZW50cyBzZXQgYnkgdGhlIGBSdWxlYCB2YWxpZGF0aW9uIHJ1bGVzLgogRWFjaCBpbmRpdmlkdWFsIHZpb2xhdGlvbiBpcyByZXByZXNlbnRlZCBieSBhIGBWaW9sYXRpb25gIG1lc3NhZ2UuCgoLCgMEHAESBJEmCBIKhQEKBAQcAgASBJMmAiQadyBgdmlvbGF0aW9uc2AgaXMgYSByZXBlYXRlZCBmaWVsZCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgYFZpb2xhdGlvbmAgbWVzc2FnZXMgY29ycmVzcG9uZGluZyB0byB0aGUgdmlvbGF0aW9ucyBkZXRlY3RlZC4KCg0KBQQcAgAEEgSTJgIKCg0KBQQcAgAGEgSTJgsUCg0KBQQcAgABEgSTJhUfCg0KBQQcAgADEgSTJiIjCtgHCgIEHRIGwSYAgicBGskHIGBWaW9sYXRpb25gIHJlcHJlc2VudHMgYSBzaW5nbGUgaW5zdGFuY2Ugd2hlcmUgYSB2YWxpZGF0aW9uIHJ1bGUsIGV4cHJlc3NlZAogYXMgYSBgUnVsZWAsIHdhcyBub3QgbWV0LiBJdCBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmllbGQgdGhhdAogY2F1c2VkIHRoZSB2aW9sYXRpb24sIHRoZSBzcGVjaWZpYyBydWxlIHRoYXQgd2Fzbid0IGZ1bGZpbGxlZCwgYW5kIGEKIGh1bWFuLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UuCgogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKCiBgYGBwcm90bwogbWVzc2FnZSBVc2VyIHsKICAgICBpbnQzMiBhZ2UgPSAxIFsoYnVmLnZhbGlkYXRlLmZpZWxkKS5jZWwgPSB7CiAgICAgICAgIGlkOiAidXNlci5hZ2UiLAogICAgICAgICBleHByZXNzaW9uOiAidGhpcyA8IDE4ID8gJ1VzZXIgbXVzdCBiZSBhdCBsZWFzdCAxOCB5ZWFycyBvbGQnIDogJyciLAogICAgIH1dOwogfQogYGBgCgogSXQgY291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5nIHZpb2xhdGlvbjoKCiBgYGBqc29uCiB7CiAgICJydWxlSWQiOiAidXNlci5hZ2UiLAogICAibWVzc2FnZSI6ICJVc2VyIG11c3QgYmUgYXQgbGVhc3QgMTggeWVhcnMgb2xkIiwKICAgImZpZWxkIjogewogICAgICJlbGVtZW50cyI6IFsKICAgICAgIHsKICAgICAgICAgImZpZWxkTnVtYmVyIjogMSwKICAgICAgICAgImZpZWxkTmFtZSI6ICJhZ2UiLAogICAgICAgICAiZmllbGRUeXBlIjogIlRZUEVfSU5UMzIiCiAgICAgICB9CiAgICAgXQogICB9LAogICAicnVsZSI6IHsKICAgICAiZWxlbWVudHMiOiBbCiAgICAgICB7CiAgICAgICAgICJmaWVsZE51bWJlciI6IDIzLAogICAgICAgICAiZmllbGROYW1lIjogImNlbCIsCiAgICAgICAgICJmaWVsZFR5cGUiOiAiVFlQRV9NRVNTQUdFIiwKICAgICAgICAgImluZGV4IjogIjAiCiAgICAgICB9CiAgICAgXQogICB9CiB9CiBgYGAKCgsKAwQdARIEwSYIEQqTBAoEBB0CABIE1SYCHxqEBCBgZmllbGRgIGlzIGEgbWFjaGluZS1yZWFkYWJsZSBwYXRoIHRvIHRoZSBmaWVsZCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgogVGhpcyBjb3VsZCBiZSBhIG5lc3RlZCBmaWVsZCwgaW4gd2hpY2ggY2FzZSB0aGUgcGF0aCB3aWxsIGluY2x1ZGUgYWxsIHRoZSBwYXJlbnQgZmllbGRzIGxlYWRpbmcgdG8gdGhlIGFjdHVhbCBmaWVsZCB0aGF0IGNhdXNlZCB0aGUgdmlvbGF0aW9uLgoKIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIG1lc3NhZ2U6CgogYGBgcHJvdG8KIG1lc3NhZ2UgTWVzc2FnZSB7CiAgIGJvb2wgYSA9IDEgWyhidWYudmFsaWRhdGUuZmllbGQpLnJlcXVpcmVkID0gdHJ1ZV07CiB9CiBgYGAKCiBJdCBjb3VsZCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgdmlvbGF0aW9uOgoKIGBgYHRleHRwcm90bwogdmlvbGF0aW9uIHsKICAgZmllbGQgeyBlbGVtZW50IHsgZmllbGRfbnVtYmVyOiAxLCBmaWVsZF9uYW1lOiAiYSIsIGZpZWxkX3R5cGU6IDggfSB9CiAgIC4uLgogfQogYGBgCgoNCgUEHQIABBIE1SYCCgoNCgUEHQIABhIE1SYLFAoNCgUEHQIAARIE1SYVGgoNCgUEHQIAAxIE1SYdHgquBgoEBB0CARIE8yYCHhqfBiBgcnVsZWAgaXMgYSBtYWNoaW5lLXJlYWRhYmxlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIHNwZWNpZmljIHJ1bGUgdGhhdCBmYWlsZWQgdmFsaWRhdGlvbi4KIFRoaXMgd2lsbCBiZSBhIG5lc3RlZCBmaWVsZCBzdGFydGluZyBmcm9tIHRoZSBGaWVsZFJ1bGVzIG9mIHRoZSBmaWVsZCB0aGF0IGZhaWxlZCB2YWxpZGF0aW9uLgogRm9yIGN1c3RvbSBydWxlcywgdGhpcyB3aWxsIHByb3ZpZGUgdGhlIHBhdGggb2YgdGhlIHJ1bGUsIGUuZy4gYGNlbFswXWAuCgogRm9yIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbWVzc2FnZToKCiBgYGBwcm90bwogbWVzc2FnZSBNZXNzYWdlIHsKICAgYm9vbCBhID0gMSBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkucmVxdWlyZWQgPSB0cnVlXTsKICAgYm9vbCBiID0gMiBbKGJ1Zi52YWxpZGF0ZS5maWVsZCkuY2VsID0gewogICAgIGlkOiAiY3VzdG9tX3J1bGUiLAogICAgIGV4cHJlc3Npb246ICIhdGhpcyA/ICdiIG11c3QgYmUgdHJ1ZSc6ICcnIgogICB9XQogfQogYGBgCgogSXQgY291bGQgcHJvZHVjZSB0aGUgZm9sbG93aW5nIHZpb2xhdGlvbnM6CgogYGBgdGV4dHByb3RvCiB2aW9sYXRpb24gewogICBydWxlIHsgZWxlbWVudCB7IGZpZWxkX251bWJlcjogMjUsIGZpZWxkX25hbWU6ICJyZXF1aXJlZCIsIGZpZWxkX3R5cGU6IDggfSB9CiAgIC4uLgogfQogdmlvbGF0aW9uIHsKICAgcnVsZSB7IGVsZW1lbnQgeyBmaWVsZF9udW1iZXI6IDIzLCBmaWVsZF9uYW1lOiAiY2VsIiwgZmllbGRfdHlwZTogMTEsIGluZGV4OiAwIH0gfQogICAuLi4KIH0KIGBgYAoKDQoFBB0CAQQSBPMmAgoKDQoFBB0CAQYSBPMmCxQKDQoFBB0CAQESBPMmFRkKDQoFBB0CAQMSBPMmHB0KzAEKBAQdAgISBPcmAh4avQEgYHJ1bGVfaWRgIGlzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGUgYFJ1bGVgIHRoYXQgd2FzIG5vdCBmdWxmaWxsZWQuCiBUaGlzIGlzIHRoZSBzYW1lIGBpZGAgdGhhdCB3YXMgc3BlY2lmaWVkIGluIHRoZSBgUnVsZWAgbWVzc2FnZSwgYWxsb3dpbmcgZWFzeSB0cmFjaW5nIG9mIHdoaWNoIHJ1bGUgd2FzIHZpb2xhdGVkLgoKDQoFBB0CAgQSBPcmAgoKDQoFBB0CAgUSBPcmCxEKDQoFBB0CAgESBPcmEhkKDQoFBB0CAgMSBPcmHB0K9AEKBAQdAgMSBPsmAh4a5QEgYG1lc3NhZ2VgIGlzIGEgaHVtYW4tcmVhZGFibGUgZXJyb3IgbWVzc2FnZSB0aGF0IGRlc2NyaWJlcyB0aGUgbmF0dXJlIG9mIHRoZSB2aW9sYXRpb24uCiBUaGlzIGNhbiBiZSB0aGUgZGVmYXVsdCBlcnJvciBtZXNzYWdlIGZyb20gdGhlIHZpb2xhdGVkIGBSdWxlYCwgb3IgaXQgY2FuIGJlIGEgY3VzdG9tIG1lc3NhZ2UgdGhhdCBnaXZlcyBtb3JlIGNvbnRleHQgYWJvdXQgdGhlIHZpb2xhdGlvbi4KCg0KBQQdAgMEEgT7JgIKCg0KBQQdAgMFEgT7JgsRCg0KBQQdAgMBEgT7JhIZCg0KBQQdAgMDEgT7JhwdCmcKBAQdAgQSBP4mAhwaWSBgZm9yX2tleWAgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHZpb2xhdGlvbiB3YXMgY2F1c2VkIGJ5IGEgbWFwIGtleSwgcmF0aGVyIHRoYW4gYSB2YWx1ZS4KCg0KBQQdAgQEEgT+JgIKCg0KBQQdAgQFEgT+JgsPCg0KBQQdAgQBEgT+JhAXCg0KBQQdAgQDEgT+JhobCgsKAwQdCRIEgCcCDQoMCgQEHQkAEgSAJwsMCg0KBQQdCQABEgSAJwsMCg0KBQQdCQACEgSAJwsMCgsKAwQdChIEgScCGAoMCgQEHQoAEgSBJwsXCo4CCgIEHhIGiCcAiycBGv8BIGBGaWVsZFBhdGhgIHByb3ZpZGVzIGEgcGF0aCB0byBhIG5lc3RlZCBwcm90b2J1ZiBmaWVsZC4KCiBUaGlzIG1lc3NhZ2UgcHJvdmlkZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHJlbmRlciBhIGRvdHRlZCBmaWVsZCBwYXRoIGV2ZW4gd2l0aG91dCBwcm90b2J1ZiBkZXNjcmlwdG9ycy4KIEl0IGFsc28gcHJvdmlkZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHJlc29sdmUgYSBuZXN0ZWQgZmllbGQgdGhyb3VnaCB1bmtub3duIHdpcmUgZGF0YS4KCgsKAwQeARIEiCcIEQpsCgQEHgIAEgSKJwIpGl4gYGVsZW1lbnRzYCBjb250YWlucyBlYWNoIGVsZW1lbnQgb2YgdGhlIHBhdGgsIHN0YXJ0aW5nIGZyb20gdGhlIHJvb3QgYW5kIHJlY3Vyc2luZyBkb3dud2FyZC4KCg0KBQQeAgAEEgSKJwIKCg0KBQQeAgAGEgSKJwsbCg0KBQQeAgABEgSKJxwkCg0KBQQeAgADEgSKJycoCqsDCgIEHxIGkicAwCcBGpwDIGBGaWVsZFBhdGhFbGVtZW50YCBwcm92aWRlcyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gbmVzdCB0aHJvdWdoIGEgc2luZ2xlIHByb3RvYnVmIGZpZWxkLgoKIElmIHRoZSBzZWxlY3RlZCBmaWVsZCBpcyBhIG1hcCBvciByZXBlYXRlZCBmaWVsZCwgdGhlIGBzdWJzY3JpcHRgIHZhbHVlIHNlbGVjdHMgYSBzcGVjaWZpYyBlbGVtZW50IGZyb20gaXQuCiBBIHBhdGggdGhhdCByZWZlcnMgdG8gYSB2YWx1ZSBuZXN0ZWQgdW5kZXIgYSBtYXAga2V5IG9yIHJlcGVhdGVkIGZpZWxkIGluZGV4IHdpbGwgaGF2ZSBhIGBzdWJzY3JpcHRgIHZhbHVlLgogVGhlIGBmaWVsZF90eXBlYCBmaWVsZCBhbGxvd3MgdW5hbWJpZ3VvdXMgcmVzb2x1dGlvbiBvZiBhIGZpZWxkIGV2ZW4gaWYgZGVzY3JpcHRvcnMgYXJlIG5vdCBhdmFpbGFibGUuCgoLCgMEHwESBJInCBgKTwoEBB8CABIElCcCIhpBIGBmaWVsZF9udW1iZXJgIGlzIHRoZSBmaWVsZCBudW1iZXIgdGhpcyBwYXRoIGVsZW1lbnQgcmVmZXJzIHRvLgoKDQoFBB8CAAQSBJQnAgoKDQoFBB8CAAUSBJQnCxAKDQoFBB8CAAESBJQnER0KDQoFBB8CAAMSBJQnICEKqgEKBAQfAgESBJgnAiEamwEgYGZpZWxkX25hbWVgIGNvbnRhaW5zIHRoZSBmaWVsZCBuYW1lIHRoaXMgcGF0aCBlbGVtZW50IHJlZmVycyB0by4KIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSBhIGh1bWFuLXJlYWRhYmxlIHBhdGggZXZlbiBpZiB0aGUgZmllbGQgbnVtYmVyIGlzIHVua25vd24uCgoNCgUEHwIBBBIEmCcCCgoNCgUEHwIBBRIEmCcLEQoNCgUEHwIBARIEmCcSHAoNCgUEHwIBAxIEmCcfIArABAoEBB8CAhIEpCcCRBqxBCBgZmllbGRfdHlwZWAgc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuIFdoZW4gdXNpbmcgcmVmbGVjdGlvbiwgdGhpcyB2YWx1ZSBpcyBub3QgbmVlZGVkLgoKIFRoaXMgdmFsdWUgaXMgcHJvdmlkZWQgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB0cmF2ZXJzZSB1bmtub3duIGZpZWxkcyB0aHJvdWdoIHdpcmUgZGF0YS4KIFdoZW4gdHJhdmVyc2luZyB3aXJlIGRhdGEsIGJlIG1pbmRmdWwgb2YgYm90aCBwYWNrZWRbMV0gYW5kIGRlbGltaXRlZFsyXSBlbmNvZGluZyBzY2hlbWVzLgoKIFsxXTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2VuY29kaW5nLyNwYWNrZWQKIFsyXTogaHR0cHM6Ly9wcm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2VuY29kaW5nLyNncm91cHMKCiBOLkIuOiBBbHRob3VnaCBncm91cHMgYXJlIGRlcHJlY2F0ZWQsIHRoZSBjb3JyZXNwb25kaW5nIGRlbGltaXRlZCBlbmNvZGluZyBzY2hlbWUgaXMgbm90LCBhbmQKIGNhbiBiZSBleHBsaWNpdGx5IHVzZWQgaW4gUHJvdG9jb2wgQnVmZmVycyAyMDIzIEVkaXRpb24uCgoNCgUEHwICBBIEpCcCCgoNCgUEHwICBhIEpCcLNAoNCgUEHwICARIEpCc1PwoNCgUEHwICAxIEpCdCQwrkAQoEBB8CAxIEqScCQhrVASBga2V5X3R5cGVgIHNwZWNpZmllcyB0aGUgbWFwIGtleSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoaXMgdmFsdWUgaXMgdXNlZnVsIHdoZW4gdHJhdmVyc2luZwogdW5rbm93biBmaWVsZHMgdGhyb3VnaCB3aXJlIGRhdGE6IHNwZWNpZmljYWxseSwgaXQgYWxsb3dzIGhhbmRsaW5nIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCiBkaWZmZXJlbnQgaW50ZWdlciBlbmNvZGluZ3MuCgoNCgUEHwIDBBIEqScCCgoNCgUEHwIDBhIEqScLNAoNCgUEHwIDARIEqSc1PQoNCgUEHwIDAxIEqSdAQQqdAQoEBB8CBBIErScCRBqOASBgdmFsdWVfdHlwZWAgc3BlY2lmaWVzIG1hcCB2YWx1ZSB0eXBlIG9mIHRoaXMgZmllbGQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGRpc3BsYXkgYQogdmFsdWUgaW5zaWRlIHVua25vd24gZmllbGRzIHRocm91Z2ggd2lyZSBkYXRhLgoKDQoFBB8CBAQSBK0nAgoKDQoFBB8CBAYSBK0nCzQKDQoFBB8CBAESBK0nNT8KDQoFBB8CBAMSBK0nQkMKfAoEBB8IABIGsCcCvycDGmwgYHN1YnNjcmlwdGAgY29udGFpbnMgYSByZXBlYXRlZCBpbmRleCBvciBtYXAga2V5LCBpZiB0aGlzIHBhdGggZWxlbWVudCBuZXN0cyBpbnRvIGEgcmVwZWF0ZWQgb3IgbWFwIGZpZWxkLgoKDQoFBB8IAAESBLAnCBEKSAoEBB8CBRIEsicEFRo6IGBpbmRleGAgc3BlY2lmaWVzIGEgMC1iYXNlZCBpbmRleCBpbnRvIGEgcmVwZWF0ZWQgZmllbGQuCgoNCgUEHwIFBRIEsicECgoNCgUEHwIFARIEsicLEAoNCgUEHwIFAxIEsicTFAo8CgQEHwIGEgS1JwQWGi4gYGJvb2xfa2V5YCBzcGVjaWZpZXMgYSBtYXAga2V5IG9mIHR5cGUgYm9vbC4KCg0KBQQfAgYFEgS1JwQICg0KBQQfAgYBEgS1JwkRCg0KBQQfAgYDEgS1JxQVCmkKBAQfAgcSBLgnBBYaWyBgaW50X2tleWAgc3BlY2lmaWVzIGEgbWFwIGtleSBvZiB0eXBlIGludDMyLCBpbnQ2NCwgc2ludDMyLCBzaW50NjQsIHNmaXhlZDMyIG9yIHNmaXhlZDY0LgoKDQoFBB8CBwUSBLgnBAkKDQoFBB8CBwESBLgnChEKDQoFBB8CBwMSBLgnFBUKWgoEBB8CCBIEuycEGBpMIGB1aW50X2tleWAgc3BlY2lmaWVzIGEgbWFwIGtleSBvZiB0eXBlIHVpbnQzMiwgdWludDY0LCBmaXhlZDMyIG9yIGZpeGVkNjQuCgoNCgUEHwIIBRIEuycECgoNCgUEHwIIARIEuycLEwoNCgUEHwIIAxIEuycWFwpACgQEHwIJEgS+JwQbGjIgYHN0cmluZ19rZXlgIHNwZWNpZmllcyBhIG1hcCBrZXkgb2YgdHlwZSBzdHJpbmcuCgoNCgUEHwIJBRIEvicECgoNCgUEHwIJARIEvicLFQoNCgUEHwIJAxIEvicYGgqgKAoVY29tbW9uL3YxL3R5cGVzLnByb3RvEhdzZXJ2aWNlYnJpZGdlLmNvbW1vbi52MRobYnVmL3ZhbGlkYXRlL3ZhbGlkYXRlLnByb3RvIqABCg5Xb3JrZXJJZGVudGl0eRIqCgxzZXJ2aWNlX25hbWUYASABKAlCB7pIBHICEAFSC3NlcnZpY2VOYW1lEigKC2luc3RhbmNlX2lkGAIgASgJQge6SARyAhABUgppbnN0YW5jZUlkEhoKCGVuZHBvaW50GAMgASgJUghlbmRwb2ludBIcCgl0cmFuc3BvcnQYBCABKAlSCXRyYW5zcG9ydCJuCg9SZXNvdXJjZU1ldHJpY3MSJAoLY3B1X3BlcmNlbnQYASABKAJIAFIKY3B1UGVyY2VudIgBARIaCgZyYW1fbWIYAiABKAVIAVIFcmFtTWKIAQFCDgoMX2NwdV9wZXJjZW50QgkKB19yYW1fbWIi0gEKE0Z1bmN0aW9uRGVjbGFyYXRpb24SIAoHZm5fbmFtZRgBIAEoCUIHukgEcgIQAVIGZm5OYW1lEhYKBndlaWdodBgCIAEoBVIGd2VpZ2h0EioKEWlucHV0X3NjaGVtYV9qc29uGAMgASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAQgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgFIAMoCVIOYWxsb3dlZENhbGxlcnMi6wEKGENvbnN1bWVyR3JvdXBEZWNsYXJhdGlvbhIbCgRuYW1lGAEgASgJQge6SARyAhABUgRuYW1lEiEKB3BhdHRlcm4YAiABKAlCB7pIBHICEAFSB3BhdHRlcm4SEgoEbW9kZRgDIAEoCVIEbW9kZRIqChFyZXRyeV9wb2xpY3lfanNvbhgEIAEoCVIPcmV0cnlQb2xpY3lKc29uEhYKBmFjdGl2ZRgFIAEoCFIGYWN0aXZlEh8KC2ZpbHRlcl9leHByGAYgASgJUgpmaWx0ZXJFeHByEhYKBndlaWdodBgHIAEoBVIGd2VpZ2h0It4BChRIdHRwUm91dGVEZWNsYXJhdGlvbhIWCgZtZXRob2QYASABKAlSBm1ldGhvZBIjCg1yb3V0ZV9wYXR0ZXJuGAIgASgJUgxyb3V0ZVBhdHRlcm4SLgoTcmVxdWVzdF9zY2hlbWFfanNvbhgDIAEoCVIRcmVxdWVzdFNjaGVtYUpzb24SMAoUcmVzcG9uc2Vfc2NoZW1hX2pzb24YBCABKAlSEnJlc3BvbnNlU2NoZW1hSnNvbhInCg9hbGxvd2VkX2NhbGxlcnMYBSADKAlSDmFsbG93ZWRDYWxsZXJzIl0KE1dvcmtmbG93RGVjbGFyYXRpb24SEgoEbmFtZRgBIAEoCVIEbmFtZRIeCgpkZWZpbml0aW9uGAIgASgJUgpkZWZpbml0aW9uEhIKBG9wdHMYAyABKAlSBG9wdHMi9wEKDkpvYkRlY2xhcmF0aW9uEhsKCWNyb25fZXhwchgBIAEoCVIIY3JvbkV4cHISGgoIdGltZXpvbmUYAiABKAlSCHRpbWV6b25lEiUKDm1pc2ZpcmVfcG9saWN5GAMgASgJUg1taXNmaXJlUG9saWN5Eh8KC3RhcmdldF90eXBlGAQgASgJUgp0YXJnZXRUeXBlEh0KCnRhcmdldF9yZWYYBSABKAlSCXRhcmdldFJlZhIZCghkZWxheV9tcxgGIAEoBVIHZGVsYXlNcxIqChFyZXRyeV9wb2xpY3lfanNvbhgHIAEoCVIPcmV0cnlQb2xpY3lKc29uIqgBChJPdXRnb2luZ0RlcGVuZGVuY3kSQgoIZGVwX3R5cGUYASABKA4yJy5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5EZXBlbmRlbmN5VHlwZVIHZGVwVHlwZRIlCg50YXJnZXRfc2VydmljZRgCIAEoCVINdGFyZ2V0U2VydmljZRInCg90YXJnZXRfcmVzb3VyY2UYAyABKAlSDnRhcmdldFJlc291cmNlKoMBCg5EZXBlbmRlbmN5VHlwZRIfChtERVBFTkRFTkNZX1RZUEVfVU5TUEVDSUZJRUQQABIXChNERVBFTkRFTkNZX1RZUEVfUlBDEAESGQoVREVQRU5ERU5DWV9UWVBFX0VWRU5UEAISHAoYREVQRU5ERU5DWV9UWVBFX1dPUktGTE9XEAMqZAoNVHJhbnNwb3J0TW9kZRIeChpUUkFOU1BPUlRfTU9ERV9VTlNQRUNJRklFRBAAEhkKFVRSQU5TUE9SVF9NT0RFX0RJUkVDVBABEhgKFFRSQU5TUE9SVF9NT0RFX1BST1hZEAIqZwoTTG9hZEJhbGFuY2luZ1BvbGljeRISCg5MQl9ST1VORF9ST0JJThAAEg8KC0xCX1dFSUdIVEVEEAESGAoUTEJfTEVBU1RfQ09OTkVDVElPTlMQAhIRCg1MQl9aT05FX0FXQVJFEAMqQwoTQ2lyY3VpdEJy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djEuQ29uc3VtZXJHcm91cERlY2xhcmF0aW9uUg5jb25zdW1lckdyb3VwcxJOCgtodHRwX3JvdXRlcxgEIAMoCzItLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLkh0dHBSb3V0ZURlY2xhcmF0aW9uUgpodHRwUm91dGVzEkoKCXdvcmtmbG93cxgFIAMoCzIsLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLldvcmtmbG93RGVjbGFyYXRpb25SCXdvcmtmbG93cxI7CgRqb2JzGAYgAygLMicuc2VydmljZWJyaWRnZS5jb21tb24udjEuSm9iRGVjbGFyYXRpb25SBGpvYnMSQgoHbWV0cmljcxgHIAEoCzIoLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlJlc291cmNlTWV0cmljc1IHbWV0cmljcxJNCg50cmFuc3BvcnRfbW9kZRgIIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSDXRyYW5zcG9ydE1vZGUSEgoEem9uZRgJIAEoCVIEem9uZRJgChVvdXRnb2luZ19kZXBlbmRlbmNpZXMYCiADKAsyKy5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5PdXRnb2luZ0RlcGVuZGVuY3lSFG91dGdvaW5nRGVwZW5kZW5jaWVzIl4KEVJlY29uY2lsZVJlc3BvbnNlEiAKDGxlYXNlX3R0bF9tcxgBIAEoA1IKbGVhc2VUdGxNcxInCg9zZXJ2ZXJfcmV2aXNpb24YAiABKANSDnNlcnZlclJldmlzaW9uIt0BChdJc3N1ZUNlcnRpZmljYXRlUmVxdWVzdBIqCgxzZXJ2aWNlX25hbWUYASABKAlCB7pIBHICEAFSC3NlcnZpY2VOYW1lEigKC2luc3RhbmNlX2lkGAIgASgJQge6SARyAhABUgppbnN0YW5jZUlkEiAKB2Nzcl9wZW0YAyABKAlCB7pIBHICEAFSBmNzclBlbRIrChFhZHZlcnRpc2VfYWRkcmVzcxgEIAEoCVIQYWR2ZXJ0aXNlQWRkcmVzcxIdCgpleHRyYV9zYW5zGAUgAygJUglleHRyYVNhbnMiawoYSXNzdWVDZXJ0aWZpY2F0ZVJlc3BvbnNlEhkKCGNlcnRfcGVtGAEgASgJUgdjZXJ0UGVtEhUKBmNhX3BlbRgCIAEoCVIFY2FQZW0SHQoKZXhwaXJlc19hdBgDIAEoA1IJZXhwaXJlc0F0IvYBCg5QdWJsaXNoUmVxdWVzdBIdCgV0b3BpYxgBIAEoCUIHukgEcgIQAVIFdG9waWMSGAoHcGF5bG9hZBgCIAEoDFIHcGF5bG9hZBJUCgdoZWFkZXJzGAMgAygLMjouc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHVibGlzaFJlcXVlc3QuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEhkKCHRyYWNlX2lkGAQgASgJUgd0cmFjZUlkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIjAKD1B1Ymxpc2hSZXNwb25zZRIdCgptZXNzYWdlX2lkGAEgASgJUgltZXNzYWdlSWQiyQEKFkV4ZWN1dGVXb3JrZmxvd1JlcXVlc3QSLAoNd29ya2Zsb3dfbmFtZRgBIAEoCUIHukgEcgIQAVIMd29ya2Zsb3dOYW1lEhQKBWlucHV0GAIgASgMUgVpbnB1dBIZCgh0cmFjZV9pZBgDIAEoCVIHdHJhY2VJZBIkCg5ncm91cF90cmFjZV9pZBgEIAEoCVIMZ3JvdXBUcmFjZUlkEioKDHNlcnZpY2VfbmFtZRgFIAEoCUIHukgEcgIQAVILc2VydmljZU5hbWUiNAoXRXhlY3V0ZVdvcmtmbG93UmVzcG9uc2USGQoIdHJhY2VfaWQYASABKAlSB3RyYWNlSWQiUwoVQ2FuY2VsV29ya2Zsb3dSZXF1ZXN0EiIKCHRyYWNlX2lkGAEgASgJQge6SARyAhABUgd0cmFjZUlkEhYKBnJlYXNvbhgCIAEoCVIGcmVhc29uIjYKFkNhbmNlbFdvcmtmbG93UmVzcG9uc2USHAoJY2FuY2VsbGVkGAEgASgIUgljYW5jZWxsZWQi0wEKEFByb3h5Q2FsbFJlcXVlc3QSLAoNZnVuY3Rpb25fbmFtZRgBIAEoCUIHukgEcgIQAVIMZnVuY3Rpb25OYW1lEhgKB3BheWxvYWQYAiABKAxSB3BheWxvYWQSJAoOZ3JvdXBfdHJhY2VfaWQYAyABKAlSDGdyb3VwVHJhY2VJZBIXCgdzcGFuX2lkGAQgASgJUgZzcGFuSWQSGQoIdHJhY2VfaWQYBSABKAlSB3RyYWNlSWQSHQoKdGltZW91dF9tcxgGIAEoBVIJdGltZW91dE1zIlsKEVByb3h5Q2FsbFJlc3BvbnNlEhgKB3N1Y2Nlc3MYASABKAhSB3N1Y2Nlc3MSFgoGb3V0cHV0GAIgASgMUgZvdXRwdXQSFAoFZXJyb3IYAyABKAlSBWVycm9yImQKEVdhdGNoVHJhY2VSZXF1ZXN0EiIKCHRyYWNlX2lkGAEgASgJQge6SARyAhABUgd0cmFjZUlkEhkKCGZyb21fc2VxGAIgASgDUgdmcm9tU2VxEhAKA2tleRgDIAEoCVIDa2V5IqsBChBUcmFjZVN0cmVhbUNodW5rEhAKA3NlcRgBIAEoA1IDc2VxEhAKA2tleRgCIAEoCVIDa2V5Eh0KCmV2ZW50X3R5cGUYAyABKAlSCWV2ZW50VHlwZRISCgRkYXRhGAQgASgMUgRkYXRhEiEKDHRyYWNlX3N0YXR1cxgFIAEoCVILdHJhY2VTdGF0dXMSHQoKY3JlYXRlZF9hdBgGIAEoA1IJY3JlYXRlZEF0MtMGCgxDb250cm9sUGxhbmUSbgoJUmVjb25jaWxlEi8uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUmVjb25jaWxlUmVxdWVzdBowLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlJlY29uY2lsZVJlc3BvbnNlEoMBChBJc3N1ZUNlcnRpZmljYXRlEjYuc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuSXNzdWVDZXJ0aWZpY2F0ZVJlcXVlc3QaNy5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5Jc3N1ZUNlcnRpZmljYXRlUmVzcG9uc2USaAoHUHVibGlzaBItLnNlcnZpY2VicmlkZ2UuY29udHJvbHBsYW5lLnYxLlB1Ymxpc2hSZXF1ZXN0Gi4uc2VydmljZWJyaWRnZS5jb250cm9scGxhbmUudjEuUHVibGlzaFJlc3BvbnNlEoABCg9FeGVjdXRlV29ya2Zsb3cSNS5zZXJ2aWNlYnJpZGdlLmNvbnRyb2xwbGFuZS52MS5FeGVjdXRlV29ya2Zsb3dSZXF1ZXN0GjYuc2VydmljZWJyaWRnZS5jb250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bAIaCgwKBQQNAgMFEgNsAgcKDAoFBA0CAwESA2wJDQoMCgUEDQIDAxIDbBgZCgsKBAQNAgQSA20CGgoMCgUEDQIEBRIDbQIICgwKBQQNAgQBEgNtCRUKDAoFBA0CBAMSA20YGQoLCgQEDQIFEgNuAhoKDAoFBA0CBQUSA24CBwoMCgUEDQIFARIDbgkTCgwKBQQNAgUDEgNuGBliBnByb3RvMwr7JQoacmVnaXN0cnkvdjEvcmVnaXN0cnkucHJvdG8SGXNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEaG2J1Zi92YWxpZGF0ZS92YWxpZGF0ZS5wcm90bxoVY29tbW9uL3YxL3R5cGVzLnByb3RvIoMBChBTdWJzY3JpYmVSZXF1ZXN0EiUKDmZ1bmN0aW9uX25hbWVzGAEgAygJUg1mdW5jdGlvbk5hbWVzEiUKDnJlc3BvbnNlX25vbmNlGAIgASgJUg1yZXNwb25zZU5vbmNlEiEKDGVycm9yX2RldGFpbBgDIAEoCVILZXJyb3JEZXRhaWwi0gEKEVN1YnNjcmliZVJlc3BvbnNlEhgKB3ZlcnNpb24YASABKAlSB3ZlcnNpb24SFAoFbm9uY2UYAiABKAlSBW5vbmNlEkEKBGZ1bGwYAyABKAsyKy5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlJlZ2lzdHJ5U25hcHNob3RIAFIEZnVsbBJACgVkZWx0YRgEIAEoCzIoLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuUmVnaXN0cnlEZWx0YUgAUgVkZWx0YUIICgZ1cGRhdGUi2AEKEFJlZ2lzdHJ5U25hcHNob3QSWAoJZnVuY3Rpb25zGAEgAygLMjouc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5SZWdpc3RyeVNuYXBzaG90LkZ1bmN0aW9uc0VudHJ5UglmdW5jdGlvbnMaagoORnVuY3Rpb25zRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSQgoFdmFsdWUYAiABKAsyLC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkZ1bmN0aW9uRW5kcG9pbnRzUgV2YWx1ZToCOAEi5gEKDVJlZ2lzdHJ5RGVsdGESTwoHdXBzZXJ0cxgBIAMoCzI1LnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuUmVnaXN0cnlEZWx0YS5VcHNlcnRzRW50cnlSB3Vwc2VydHMSGgoIcmVtb3ZhbHMYAiADKAlSCHJlbW92YWxzGmgKDFVwc2VydHNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJCCgV2YWx1ZRgCIAEoCzIsLnNlcnZpY2VicmlkZ2UucmVnaXN0cnkudjEuRnVuY3Rpb25FbmRwb2ludHNSBXZhbHVlOgI4ASJcChFGdW5jdGlvbkVuZHBvaW50cxJHCgllbmRwb2ludHMYASADKAsyKS5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLldvcmtlckVuZHBvaW50UgllbmRwb2ludHMisQMKDldvcmtlckVuZHBvaW50EhoKCGVuZHBvaW50GAEgASgJUghlbmRwb2ludBJNCg50cmFuc3BvcnRfbW9kZRgCIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSDXRyYW5zcG9ydE1vZGUSHwoLaW5zdGFuY2VfaWQYAyABKAlSCmluc3RhbmNlSWQSFgoGd2VpZ2h0GAQgASgFUgZ3ZWlnaHQSIQoMc2VydmljZV9uYW1lGAUgASgJUgtzZXJ2aWNlTmFtZRISCgR6b25lGAYgASgJUgR6b25lEioKEWlucHV0X3NjaGVtYV9qc29uGAogASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAsgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgMIAMoCVIOYWxsb3dlZENhbGxlcnMSQQoGaGVhbHRoGBQgASgLMikuc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5FbmRwb2ludEhlYWx0aFIGaGVhbHRoIrkCCg5FbmRwb2ludEhlYWx0aBIcCglyZWFjaGFibGUYASABKAhSCXJlYWNoYWJsZRIkCg5sYXRlbmN5X3A1MF9tcxgCIAEoBVIMbGF0ZW5jeVA1ME1zEiQKDmxhdGVuY3lfcDk5X21zGAMgASgFUgxsYXRlbmN5UDk5TXMSHQoKZXJyb3JfcmF0ZRgEIAEoAlIJZXJyb3JSYXRlEiIKDWxhc3RfY2hlY2tfYXQYBSABKANSC2xhc3RDaGVja0F0EjEKFGNvbnNlY3V0aXZlX2ZhaWx1cmVzGAYgASgFUhNjb25zZWN1dGl2ZUZhaWx1cmVzEkcKCGNiX3N0YXRlGAcgASgOMiwuc2VydmljZWJyaWRnZS5jb21tb24udjEuQ2lyY3VpdEJyZWFrZXJTdGF0ZVIHY2JTdGF0ZSI9Cg1Mb29rdXBSZXF1ZXN0EiwKDWZ1bmN0aW9uX25hbWUYASABKAlCB7pIBHICEAFSDGZ1bmN0aW9uTmFtZSLoAQoOTG9va3VwUmVzcG9uc2USRwoJZW5kcG9pbnRzGAMgAygLMikuc2VydmljZWJyaWRnZS5yZWdpc3RyeS52MS5Xb3JrZXJFbmRwb2ludFIJZW5kcG9pbnRzEioKEWlucHV0X3NjaGVtYV9qc29uGAQgASgJUg9pbnB1dFNjaGVtYUpzb24SLAoSb3V0cHV0X3NjaGVtYV9qc29uGAUgASgJUhBvdXRwdXRTY2hlbWFKc29uEicKD2FsbG93ZWRfY2FsbGVycxgGIAMoCVIOYWxsb3dlZENhbGxlcnNKBAgBEAJKBAgCEAMy3AEKD1JlZ2lzdHJ5U2VydmljZRJqCglTdWJzY3JpYmUSKy5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlN1YnNjcmliZVJlcXVlc3QaLC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLlN1YnNjcmliZVJlc3BvbnNlKAEwARJdCgZMb29rdXASKC5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkxvb2t1cFJlcXVlc3QaKS5zZXJ2aWNlYnJpZGdlLnJlZ2lzdHJ5LnYxLkxvb2t1cFJlc3BvbnNlQkdaRWdpdGh1Yi5jb20vc2VydmljZWJyaWRnZS9zZXJ2ZXItZ28vaW50ZXJuYWwvcGIvcmVnaXN0cnkvdjE7cmVnaXN0cnl2MUrGEwoGEgQAAEsBCggKAQwSAwAAEgoICgECEgMBACIKCAoBCBIDAwBcCgkKAggLEgMDAFwKCQoCAwASAwUAJQoJCgIDARIDBgAfCgoKAgYAEgQIAAsBCgoKAwYAARIDCAgXCgsKBAYAAgASAwkCTAoMCgUGAAIAARIDCQYPCgwKBQYAAgAFEgMJEBYKDAoFBgACAAISAwkXJwoMCgUGAAIABhIDCTI4CgwKBQYAAgADEgMJOUoKCwoEBgAC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YWxIAFIFZHJhaW4SQAoGZ29hd2F5GA0gASgLMiYuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkdvYXdheVNpZ25hbEgAUgZnb2F3YXkSOQoEcGluZxgUIAEoCzIjLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5QaW5nRnJhbWVIAFIEcGluZxI5CgRwb25nGBUgASgLMiMuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlBvbmdGcmFtZUgAUgRwb25nElAKDmNvbW1hbmRfcmVzdWx0GB4gASgLMicuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkNvbW1hbmRSZXN1bHRIAFINY29tbWFuZFJlc3VsdBJICgl0ZWxlbWV0cnkYHyABKAsyKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuVGVsZW1ldHJ5RnJhbWVIAFIJdGVsZW1ldHJ5ElIKDXN0cmVhbV9hcHBlbmQYICABKAsyKy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuU3RyZWFtQXBwZW5kRnJhbWVIAFIMc3RyZWFtQXBwZW5kElIKDXdvcmtlcl9zdGF0dXMYISABKAsyKy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuV29ya2VyU3RhdHVzRnJhbWVIAFIMd29ya2VyU3RhdHVzElMKD3Bvc2l0aW9uX3VwZGF0ZRgiIAEoCzIoLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5Qb3NpdGlvblVwZGF0ZUgAUg5wb3NpdGlvblVwZGF0ZRJHCghkaXNwYXRjaBgoIAEoCzIpLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5EaXNwYXRjaENvbW1hbmRIAFIIZGlzcGF0Y2gSRwoLY29uZmlnX3B1c2gYKSABKAsyJC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuQ29uZmlnUHVzaEgAUgpjb25maWdQdXNoEkoKDHBlcm1pdF9ncmFudBgyIAEoCzIlLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5QZXJtaXRHcmFudEgAUgtwZXJtaXRHcmFudBJQCg5wZXJtaXRfcmVsZWFzZRgzIAEoCzInLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5QZXJtaXRSZWxlYXNlSABSDXBlcm1pdFJlbGVhc2USTgoLZmxvd191cGRhdGUYNCABKAsyKy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRmxvd0NvbnRyb2xVcGRhdGVIAFIKZmxvd1VwZGF0ZRJTCg9wdWJsaXNoX21lc3NhZ2UYNSABKAsyKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUHVibGlzaE1lc3NhZ2VIAFIOcHVibGlzaE1lc3NhZ2USRwoLcHVibGlzaF9hY2sYNiABKAsyJC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuUHVibGlzaEFja0gAUgpwdWJsaXNoQWNrEjwKBWVycm9yGGMgASgLMiQuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkVycm9yRnJhbWVIAFIFZXJyb3JCCQoHcGF5bG9hZCL3AwoFSGVsbG8SQwoIaWRlbnRpdHkYASABKAsyJy5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5Xb3JrZXJJZGVudGl0eVIIaWRlbnRpdHkSIQoMbWF4X2luZmxpZ2h0GAIgASgFUgttYXhJbmZsaWdodBIhCgxtaW5faW5mbGlnaHQYAyABKAVSC21pbkluZmxpZ2h0EiEKDHJlc3VtZV90b2tlbhgEIAEoCVILcmVzdW1lVG9rZW4SFAoFZXBvY2gYBSABKARSBWVwb2NoEioKEWxhc3RfcmVjZWl2ZWRfc2VxGAYgASgEUg9sYXN0UmVjZWl2ZWRTZXESIgoNbGFzdF9zZW50X3NlcRgHIAEoBFILbGFzdFNlbnRTZXESMgoVY29tcGxldGVkX2NvbW1hbmRfaWRzGAggAygJUhNjb21wbGV0ZWRDb21tYW5kSWRzEh8KC3Nka192ZXJzaW9uGAogASgJUgpzZGtWZXJzaW9uEiIKDGNhcGFiaWxpdGllcxgLIAMoCVIMY2FwYWJpbGl0aWVzEhIKBHpvbmUYDCABKAlSBHpvbmUSTQoOdHJhbnNwb3J0X21vZGUYDSABKA4yJi5zZXJ2aWNlYnJpZGdlLmNvbW1vbi52MS5UcmFuc3BvcnRNb2RlUg10cmFuc3BvcnRNb2RlIuwECghIZWxsb0FjaxIdCgpzZXNzaW9uX2lkGAEgASgJUglzZXNzaW9uSWQSIQoMcmVzdW1lX3Rva2VuGAIgASgJUgtyZXN1bWVUb2tlbhIUCgVlcG9jaBgDIAEoBFIFZXBvY2gSGAoHcmVzdW1lZBgEIAEoCFIHcmVzdW1lZBImCg9yZXN1bWVfZnJvbV9zZXEYBSABKARSDXJlc3VtZUZyb21TZXESKwoRcmVwbGF5ZWRfY29tbWFuZHMYBiABKAVSEHJlcGxheWVkQ29tbWFuZHMSLQoScmVjb25jaWxlZF9yZXN1bHRzGAcgASgFUhFyZWNvbmNpbGVkUmVzdWx0cxIyChVoZWFydGJlYXRfaW50ZXJ2YWxfbXMYCiABKAVSE2hlYXJ0YmVhdEludGVydmFsTXMSMAoUaGVhcnRiZWF0X3RpbWVvdXRfbXMYCyABKAVSEmhlYXJ0YmVhdFRpbWVvdXRNcxInCg9pbml0aWFsX3Blcm1pdHMYDCABKAVSDmluaXRpYWxQZXJtaXRzEh8KC21heF9wZXJtaXRzGA0gASgFUgptYXhQZXJtaXRzEmAKGGVmZmVjdGl2ZV90cmFuc3BvcnRfbW9kZRgUIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSFmVmZmVjdGl2ZVRyYW5zcG9ydE1vZGUSWAoScmVzdW1lX2ZhaWxfcmVhc29uGB4gASgOMiouc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlJlc3VtZUZhaWxSZWFzb25SEHJlc3VtZUZhaWxSZWFzb24idgoLRHJhaW5TaWduYWwSFgoGcmVhc29uGAEgASgJUgZyZWFzb24SHwoLZGVhZGxpbmVfbXMYAiABKAVSCmRlYWRsaW5lTXMSLgoTcGVuZGluZ19jb21tYW5kX2lkcxgDIAMoCVIRcGVuZGluZ0NvbW1hbmRJZHMiYAoMR29hd2F5U2lnbmFsEjgKBGNvZGUYASABKA4yJC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuR29hd2F5Q29kZVIEY29kZRIWCgZyZWFzb24YAiABKAlSBnJlYXNvbiIuCglQaW5nRnJhbWUSIQoMdGltZXN0YW1wX21zGAEgASgDUgt0aW1lc3RhbXBNcyJnCglQb25nRnJhbWUSKgoRZWNob190aW1lc3RhbXBfbXMYASABKANSD2VjaG9UaW1lc3RhbXBNcxIuChNzZXJ2ZXJfdGltZXN0YW1wX21zGAIgASgDUhFzZXJ2ZXJUaW1lc3RhbXBNcyK/AwoLVGFza0NvbW1hbmQSPgoEdHlwZRgBIAEoDjIqLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5UYXNrQ29tbWFuZC5UeXBlUgR0eXBlEhkKCHRyYWNlX2lkGAIgASgJUgd0cmFjZUlkEhcKB3NwYW5faWQYAyABKAlSBnNwYW5JZBIkCg5wYXJlbnRfc3Bhbl9pZBgEIAEoCVIMcGFyZW50U3BhbklkEhgKB3BheWxvYWQYBSABKAxSB3BheWxvYWQSQwoEbWV0YRgGIAMoCzIvLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5UYXNrQ29tbWFuZC5NZXRhRW50cnlSBG1ldGESKAoQZGVhZGxpbmVfdW5peF9tcxgHIAEoA1IOZGVhZGxpbmVVbml4TXMSGAoHYXR0ZW1wdBgIIAEoBVIHYXR0ZW1wdBo3CglNZXRhRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSFAoFdmFsdWUYAiABKAlSBXZhbHVlOgI4ASI6CgRUeXBlEhQKEFRZUEVfVU5TUEVDSUZJRUQQABIMCghUWVBFX1JQQxABEg4KClRZUEVfRVZFTlQQAiLBAQoPRGlzcGF0Y2hDb21tYW5kEh0KCmNvbW1hbmRfaWQYASABKAlSCWNvbW1hbmRJZBIoChBkZWFkbGluZV91bml4X21zGAIgASgDUg5kZWFkbGluZVVuaXhNcxIbCglpc19yZXBsYXkYAyABKAhSCGlzUmVwbGF5EkgKDHRhc2tfY29tbWFuZBgUIAEoCzIlLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5UYXNrQ29tbWFuZFILdGFza0NvbW1hbmQi8gEKDUNvbW1hbmRSZXN1bHQSHQoKY29tbWFuZF9pZBgBIAEoCVIJY29tbWFuZElkEhgKB3N1Y2Nlc3MYAiABKAhSB3N1Y2Nlc3MSFgoGb3V0cHV0GAMgASgMUgZvdXRwdXQSFAoFZXJyb3IYBCABKAlSBWVycm9yEhAKA2FjaxgFIAEoCFIDYWNrEiQKDnJldHJ5X2FmdGVyX21zGAYgASgFUgxyZXRyeUFmdGVyTXMSIwoNcmVqZWN0X3JlYXNvbhgHIAEoCVIMcmVqZWN0UmVhc29uEh0KCnJlc3VsdF9zZXEYCCABKARSCXJlc3VsdFNlcSKDAQoOVGVsZW1ldHJ5RnJhbWUSOQoFc3BhbnMYASADKAsyIy5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuU3BhbkV2ZW50UgVzcGFucxI2CgRsb2dzGAIgAygLMiIuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkxvZ0VudHJ5UgRsb2dzIu4DCglTcGFuRXZlbnQSPAoEa2luZBgBIAEoDjIoLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5TcGFuRXZlbnQuS2luZFIEa2luZBIZCgh0cmFjZV9pZBgCIAEoCVIHdHJhY2VJZBIXCgdzcGFuX2lkGAMgASgJUgZzcGFuSWQSJAoOcGFyZW50X3NwYW5faWQYBCABKAlSDHBhcmVudFNwYW5JZBIOCgJmbhgFIAEoCVICZm4SHQoKc3RhcnRlZF9hdBgGIAEoA1IJc3RhcnRlZEF0Eh8KC2R1cmF0aW9uX21zGAcgASgDUgpkdXJhdGlvbk1zEhgKB3N1Y2Nlc3MYCCABKAhSB3N1Y2Nlc3MSFAoFZXJyb3IYCSABKAlSBWVycm9yEhQKBWlucHV0GAogASgMUgVpbnB1dBIWCgZvdXRwdXQYCyABKAxSBm91dHB1dBIYCgdhdHRlbXB0GAwgASgFUgdhdHRlbXB0EhsKCXNwYW5fdHlwZRgNIAEoCVIIc3BhblR5cGUSJQoOdGFyZ2V0X3NlcnZpY2UYDiABKAlSDXRhcmdldFNlcnZpY2UiPQoES2luZBIUChBLSU5EX1VOU1BFQ0lGSUVEEAASDgoKS0lORF9TVEFSVBABEg8KC0tJTkRfRklOSVNIEAIisAIKCExvZ0VudHJ5EhkKCHRyYWNlX2lkGAEgASgJUgd0cmFjZUlkEhcKB3NwYW5faWQYAiABKAlSBnNwYW5JZBIUCgVsZXZlbBgEIAEoCVIFbGV2ZWwSGAoHbWVzc2FnZRgFIAEoCVIHbWVzc2FnZRIhCgx0aW1lc3RhbXBfbnMYBiABKANSC3RpbWVzdGFtcE5zElIKCmF0dHJpYnV0ZXMYByADKAsyMi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuTG9nRW50cnkuQXR0cmlidXRlc0VudHJ5UgphdHRyaWJ1dGVzGj0KD0F0dHJpYnV0ZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBSgQIAxAESgQICBAJIpYBChFTdHJlYW1BcHBlbmRGcmFtZRIZCgh0cmFjZV9pZBgBIAEoCVIHdHJhY2VJZBIQCgNrZXkYAiABKAlSA2tleRIdCgpldmVudF90eXBlGAMgASgJUglldmVudFR5cGUSEgoEZGF0YRgEIAEoDFIEZGF0YRIhCgx0cmFjZV9zdGF0dXMYBSABKAlSC3RyYWNlU3RhdHVzIsMBChFXb3JrZXJTdGF0dXNGcmFtZRIlCg5mdW5jdGlvbl9uYW1lcxgBIAMoCVINZnVuY3Rpb25OYW1lcxIfCgtncm91cF9uYW1lcxgCIAMoCVIKZ3JvdXBOYW1lcxIaCghlbmRwb2ludBgDIAEoCVIIZW5kcG9pbnQSHwoLY3B1X3BlcmNlbnQYBCABKAJSCmNwdVBlcmNlbnQSFQoGcmFtX21iGAUgASgFUgVyYW1NYhISCgR6b25lGAYgASgJUgR6b25lImEKC1Blcm1pdEdyYW50Ei0KEmFkZGl0aW9uYWxfcGVybWl0cxgBIAEoBVIRYWRkaXRpb25hbFBlcm1pdHMSIwoNdG90YWxfcGVuZGluZxgCIAEoBVIMdG90YWxQZW5kaW5nIisKDVBlcm1pdFJlbGVhc2USGgoIcmVsZWFzZWQYASABKAVSCHJlbGVhc2VkIlMKEUZsb3dDb250cm9sVXBkYXRlEiYKD25ld193aW5kb3dfc2l6ZRgBIAEoBVINbmV3V2luZG93U2l6ZRIWCgZyZWFzb24YAiABKAlSBnJlYXNvbiI8Cg5Qb3NpdGlvblVwZGF0ZRIqChFsYXN0X3JlY2VpdmVkX3NlcRgBIAEoBFIPbGFzdFJlY2VpdmVkU2VxImIKCkNvbmZpZ1B1c2gSVAoQdHJhbnNwb3J0X2NvbmZpZxgBIAEoCzIpLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5UcmFuc3BvcnRDb25maWdSD3RyYW5zcG9ydENvbmZpZyLRBQoPVHJhbnNwb3J0Q29uZmlnEkkKDGRlZmF1bHRfbW9kZRgBIAEoDjImLnNlcnZpY2VicmlkZ2UuY29tbW9uLnYxLlRyYW5zcG9ydE1vZGVSC2RlZmF1bHRNb2RlEmwKEXNlcnZpY2Vfb3ZlcnJpZGVzGAIgAygLMj8uc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRyYW5zcG9ydENvbmZpZy5TZXJ2aWNlT3ZlcnJpZGVzRW50cnlSEHNlcnZpY2VPdmVycmlkZXMSbwoSZnVuY3Rpb25fb3ZlcnJpZGVzGAMgAygLMkAuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlRyYW5zcG9ydENvbmZpZy5GdW5jdGlvbk92ZXJyaWRlc0VudHJ5UhFmdW5jdGlvbk92ZXJyaWRlcxJmChdkZWZhdWx0X2NpcmN1aXRfYnJlYWtlchgEIAEoCzIuLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5DaXJjdWl0QnJlYWtlckNvbmZpZ1IVZGVmYXVsdENpcmN1aXRCcmVha2VyEjgKBHpvbmUYBSABKAsyJC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuWm9uZUNvbmZpZ1IEem9uZRp3ChVTZXJ2aWNlT3ZlcnJpZGVzRW50cnkSEAoDa2V5GAEgASgJUgNrZXkSSAoFdmFsdWUYAiABKAsyMi5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuU2VydmljZVRyYW5zcG9ydE92ZXJyaWRlUgV2YWx1ZToCOAEaeQoWRnVuY3Rpb25PdmVycmlkZXNFbnRyeRIQCgNrZXkYASABKAlSA2tleRJJCgV2YWx1ZRgCIAEoCzIzLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5GdW5jdGlvblRyYW5zcG9ydE92ZXJyaWRlUgV2YWx1ZToCOAEi+QIKGFNlcnZpY2VUcmFuc3BvcnRPdmVycmlkZRI6CgRtb2RlGAEgASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVIEbW9kZRJRCg9mYWxsYmFja19wb2xpY3kYAiABKA4yKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRmFsbGJhY2tQb2xpY3lSDmZhbGxiYWNrUG9saWN5EioKEWRpcmVjdF90aW1lb3V0X21zGAMgASgFUg9kaXJlY3RUaW1lb3V0TXMSSQoJbGJfcG9saWN5GAQgASgOMiwuc2VydmljZWJyaWRnZS5jb21tb24udjEuTG9hZEJhbGFuY2luZ1BvbGljeVIIbGJQb2xpY3kSVwoPY2lyY3VpdF9icmVha2VyGAUgASgLMi4uc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLkNpcmN1aXRCcmVha2VyQ29uZmlnUg5jaXJjdWl0QnJlYWtlciLJAQoZRnVuY3Rpb25UcmFuc3BvcnRPdmVycmlkZRI6CgRtb2RlGAEgASgOMiYuc2VydmljZWJyaWRnZS5jb21tb24udjEuVHJhbnNwb3J0TW9kZVIEbW9kZRJRCg9mYWxsYmFja19wb2xpY3kYAiABKA4yKC5zZXJ2aWNlYnJpZGdlLnNlc3Npb24udjEuRmFsbGJhY2tQb2xpY3lSDmZhbGxiYWNrUG9saWN5Eh0KCnRpbWVvdXRfbXMYAyABKAVSCXRpbWVvdXRNcyLPAQoUQ2lyY3VpdEJyZWFrZXJDb25maWcSKwoRZmFpbHVyZV90aHJlc2hvbGQYASABKAVSEGZhaWx1cmVUaHJlc2hvbGQSKwoRc3VjY2Vzc190aHJlc2hvbGQYAiABKAVSEHN1Y2Nlc3NUaHJlc2hvbGQSKAoQb3Blbl9kdXJhdGlvbl9tcxgDIAEoBVIOb3BlbkR1cmF0aW9uTXMSMwoWaGFsZl9vcGVuX21heF9yZXF1ZXN0cxgEIAEoBVITaGFsZk9wZW5NYXhSZXF1ZXN0cyJ4Cgpab25lQ29uZmlnEh0KCmxvY2FsX3pvbmUYASABKAlSCWxvY2FsWm9uZRIfCgtwcmVmZXJfem9uZRgCIAEoCFIKcHJlZmVyWm9uZRIqChF6b25lX3dlaWdodF9ib29zdBgDIAEoBVIPem9uZVdlaWdodEJvb3N0In4KCkVycm9yRnJhbWUSEgoEY29kZRgBIAEoBVIEY29kZRIYCgdtZXNzYWdlGAIgASgJUgdtZXNzYWdlEhwKCXJldHJ5YWJsZRgDIAEoCFIJcmV0cnlhYmxlEiQKDnJldHJ5X2FmdGVyX21zGAQgASgFUgxyZXRyeUFmdGVyTXMirQIKDlB1Ymxpc2hNZXNzYWdlEh0KCnJlcXVlc3RfaWQYASABKAlSCXJlcXVlc3RJZBIUCgV0b3BpYxgCIAEoCVIFdG9waWMSGAoHcGF5bG9hZBgDIAEoDFIHcGF5bG9hZBJPCgdoZWFkZXJzGAQgAygLMjUuc2VydmljZWJyaWRnZS5zZXNzaW9uLnYxLlB1Ymxpc2hNZXNzYWdlLkhlYWRlcnNFbnRyeVIHaGVhZGVycxIZCgh0cmFjZV9pZBgFIAEoCVIHdHJhY2VJZBIkCg5wYXJlbnRfc3Bhbl9pZBgGIAEoCVIMcGFyZW50U3BhbklkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBImAKClB1Ymxpc2hBY2sSHQoKcmVxdWVzdF9pZBgBIAEoCVIJcmVxdWVzdElkEh0KCm1lc3NhZ2VfaWQYAiABKAlSCW1lc3NhZ2VJZBIUCgVlcnJvchgDIAEoCVIFZXJyb3Iq7AEKEFJlc3VtZUZhaWxSZWFzb24SGwoXUkVTVU1FX0ZBSUxfVU5TUEVDSUZJRUQQABIdChlSRVNVTUVfRkFJTF9UT0tFTl9FWFBJUkVEEAESHQoZUkVTVU1FX0ZBSUxfVE9LRU5fSU5WQUxJRBACEh0KGVJFU1VNRV9GQUlMX0dBUF9UT09fTEFSR0UQAxIeChpSRVNVTUVfRkFJTF9FUE9DSF9NSVNNQVRDSBAEEh4KGlJFU1VNRV9GQUlMX1NFU1NJT05fRkVOQ0VEEAUSHgoaUkVTVU1FX0ZBSUxfU0VSVkVSX1JFU1RBUlQQBiqAAQoKR29hd2F5Q29kZRISCg5HT0FXQVlfVU5LTk9XThAAEhwKGEdPQVdBWV9HUkFDRUZVTF9TSFVURE9XThABEhUKEUdPQVdBWV9PVkVSTE9BREVEEAISEQoNR09BV0FZX0ZFTkNFRBADEhYKEkdPQVdBWV9NQUlOVEVOQU5DRRAEKmwKDkZhbGxiYWNrUG9saWN5EhEKDUZBTExCQUNLX05PTkUQABIVChFGQUxMQkFDS19UT19QUk9YWRABEhYKEkZBTExCQUNLX1RPX0RJUkVDVBACEhgKFEZBTExCQUNLX0JFU1RfRUZGT1JUEAMyZwoOU2Vzc2lvblNlcnZpY2USVQoHQ2hhbm5lbBIiLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5FbnZlbG9wZRoiLnNlcnZpY2VicmlkZ2Uuc2Vzc2lvbi52MS5FbnZlbG9wZSgBMAFCRVpDZ2l0aHViLmNvbS9zZXJ2aWNlYnJpZGdlL3NlcnZlci1nby9pbnRlcm5hbC9wYi9zZXNz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bGl2ZXJSZXF1ZXN0EiYKCmdyb3VwX25hbWUYASABKAlCB7pIBHICEAFSCWdyb3VwTmFtZRIdCgV0b3BpYxgCIAEoCUIHukgEcgIQAVIFdG9waWMSJgoKbWVzc2FnZV9pZBgDIAEoCUIHukgEcgIQAVIJbWVzc2FnZUlkEhgKB2F0dGVtcHQYBCABKAVSB2F0dGVtcHQSGAoHcGF5bG9hZBgFIAEoDFIHcGF5bG9hZBJOCgdoZWFkZXJzGAYgAygLMjQuc2VydmljZWJyaWRnZS53b3JrZXIudjEuRGVsaXZlclJlcXVlc3QuSGVhZGVyc0VudHJ5UgdoZWFkZXJzEiQKDmdyb3VwX3RyYWNlX2lkGAcgASgJUgxncm91cFRyYWNlSWQSFwoHc3Bhbl9pZBgIIAEoCVIGc3BhbklkEhkKCHRyYWNlX2lkGAkgASgJUgd0cmFjZUlkGjoKDEhlYWRlcnNFbnRyeRIQCgNrZXkYASABKAlSA2tleRIUCgV2YWx1ZRgCIAEoCVIFdmFsdWU6AjgBIoQBCg9EZWxpdmVyUmVzcG9uc2USEAoDYWNrGAEgASgIUgNhY2sSIwoNcmVqZWN0X3JlYXNvbhgCIAEoCVIMcmVqZWN0UmVhc29uEiQKDnJldHJ5X2FmdGVyX21zGAMgASgFUgxyZXRyeUFmdGVyTXMSFAoFZXJyb3IYBCABKAlSBWVycm9yMsgBCg1Xb3JrZXJIYW5kbGVyElkKBkhhbmRsZRImLnNlcnZpY2VicmlkZ2Uud29ya2VyLnYxLkhhbmRsZVJlcXVlc3QaJy5zZXJ2aWNlYnJpZGdlLndvcmtlci52MS5IYW5kbGVSZXNwb25zZRJcCgdEZWxpdmVyEicuc2VydmljZWJyaWRnZS53b3JrZXIudjEuRGVsaXZlclJlcXVlc3QaKC5zZXJ2aWNlYnJpZGdlLndvcmtlci52MS5EZWxpdmVyUmVzcG9uc2VCQ1pBZ2l0aHViLmNvbS9zZXJ2aWNlYnJpZGdlL3NlcnZlci1nby9pbnRlcm5hbC9wYi93b3JrZXIvdjE7d29ya2VydjFK3AwKBhIEAAAsAQoICgEMEgMAABIKCAoBAhIDAQAgCggKAQgSAwMAWAoJCgIICxIDAwBYCgkKAgMAEgMFACUKCgoCBgASBAcACgEKCgoDBgABEgMHCBUK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";
14
+
15
+ // sdk/src/sdk-errors.ts
16
+ import * as grpc from "@grpc/grpc-js";
17
+ var SB = {
18
+ INVALID_SERVICE_KEY_MISSING_SEGMENT: "SB_INVALID_SERVICE_KEY_MISSING_SEGMENT",
19
+ INVALID_SERVICE_KEY_MALFORMED_SEGMENT: "SB_INVALID_SERVICE_KEY_MALFORMED_SEGMENT",
20
+ INVALID_SERVICE_KEY_MALFORMED_PEM: "SB_INVALID_SERVICE_KEY_MALFORMED_PEM",
21
+ INVALID_SERVICE_KEY_LEGACY: "SB_INVALID_SERVICE_KEY_LEGACY",
22
+ INVALID_SERVICE_KEY_MISSING_KEY_ID: "SB_INVALID_SERVICE_KEY_MISSING_KEY_ID",
23
+ INVALID_SERVICE_KEY_MALFORMED_SECRET: "SB_INVALID_SERVICE_KEY_MALFORMED_SECRET",
24
+ EMPTY_CONTROL_PLANE_CA_OPTION: "SB_EMPTY_CONTROL_PLANE_CA_OPTION",
25
+ INVALID_CONTROL_PLANE_CA: "SB_INVALID_CONTROL_PLANE_CA",
26
+ WORKER_TLS_CA_MALFORMED: "SB_WORKER_TLS_CA_MALFORMED",
27
+ WORKER_TLS_INVALID_PAIR: "SB_WORKER_TLS_INVALID_PAIR",
28
+ WORKER_TLS_INCOMPLETE_PAIR: "SB_WORKER_TLS_INCOMPLETE_PAIR",
29
+ WORKER_ENDPOINT_EMPTY: "SB_WORKER_ENDPOINT_EMPTY",
30
+ WORKER_ENDPOINT_INVALID_SCHEME: "SB_WORKER_ENDPOINT_INVALID_SCHEME",
31
+ ISSUE_CERTIFICATE_EMPTY_PEM: "SB_ISSUE_CERTIFICATE_EMPTY_PEM",
32
+ OFFLINE_QUEUE_FULL: "SB_OFFLINE_QUEUE_FULL",
33
+ RPC_TARGET_REQUIRED: "SB_RPC_TARGET_REQUIRED",
34
+ RPC_TARGET_AMBIGUOUS: "SB_RPC_TARGET_AMBIGUOUS",
35
+ NO_RPC_ENDPOINTS: "SB_NO_RPC_ENDPOINTS",
36
+ RPC_CALLER_NOT_ALLOWED: "SB_RPC_CALLER_NOT_ALLOWED",
37
+ RPC_FN_REQUIRED: "SB_RPC_FN_REQUIRED",
38
+ START_STATE_NOT_INITIALIZED: "SB_START_STATE_NOT_INITIALIZED",
39
+ START_ALREADY_CALLED: "SB_START_ALREADY_CALLED",
40
+ START_INVALID_MAX_INFLIGHT: "SB_START_INVALID_MAX_INFLIGHT",
41
+ WORKER_SERVER_NOT_INITIALIZED: "SB_WORKER_SERVER_NOT_INITIALIZED",
42
+ WORKER_TLS_NOT_PROVISIONED: "SB_WORKER_TLS_NOT_PROVISIONED",
43
+ WORKER_TLS_CA_REQUIRED: "SB_WORKER_TLS_CA_REQUIRED",
44
+ DUPLICATE_EVENT_CONSUMER_GROUP: "SB_DUPLICATE_EVENT_CONSUMER_GROUP",
45
+ FROZEN_AFTER_START: "SB_FROZEN_AFTER_START",
46
+ UNDECLARED_OUTBOUND_RPC: "SB_UNDECLARED_OUTBOUND_RPC",
47
+ RECONCILE_FAILED_PRECONDITION: "SB_RECONCILE_FAILED_PRECONDITION",
48
+ JOB_RPC_ARGS_REQUIRED: "SB_JOB_RPC_ARGS_REQUIRED",
49
+ JOB_VIA_MISMATCH: "SB_JOB_VIA_MISMATCH",
50
+ JOB_TARGET_FORM_REQUIRED: "SB_JOB_TARGET_FORM_REQUIRED",
51
+ EXECUTE_WORKFLOW_ARGS_REQUIRED: "SB_EXECUTE_WORKFLOW_ARGS_REQUIRED",
52
+ WORKFLOW_NOT_CANCELLED: "SB_WORKFLOW_NOT_CANCELLED",
53
+ INTERNAL_INVARIANT_VIOLATION: "SB_INTERNAL_INVARIANT_VIOLATION",
54
+ HANDLER_RETURNED_FAILURE: "SB_HANDLER_RETURNED_FAILURE",
55
+ WATCH_TRACE_INVALID_JSON: "SB_WATCH_TRACE_INVALID_JSON",
56
+ WATCH_TRACE_BACKPRESSURE: "SB_WATCH_TRACE_BACKPRESSURE",
57
+ GRPC_CANCELLED: "SB_GRPC_CANCELLED",
58
+ GRPC_UNKNOWN: "SB_GRPC_UNKNOWN",
59
+ GRPC_INVALID_ARGUMENT: "SB_GRPC_INVALID_ARGUMENT",
60
+ GRPC_DEADLINE_EXCEEDED: "SB_GRPC_DEADLINE_EXCEEDED",
61
+ GRPC_NOT_FOUND: "SB_GRPC_NOT_FOUND",
62
+ GRPC_ALREADY_EXISTS: "SB_GRPC_ALREADY_EXISTS",
63
+ GRPC_PERMISSION_DENIED: "SB_GRPC_PERMISSION_DENIED",
64
+ GRPC_RESOURCE_EXHAUSTED: "SB_GRPC_RESOURCE_EXHAUSTED",
65
+ GRPC_FAILED_PRECONDITION: "SB_GRPC_FAILED_PRECONDITION",
66
+ GRPC_ABORTED: "SB_GRPC_ABORTED",
67
+ GRPC_OUT_OF_RANGE: "SB_GRPC_OUT_OF_RANGE",
68
+ GRPC_UNIMPLEMENTED: "SB_GRPC_UNIMPLEMENTED",
69
+ GRPC_INTERNAL: "SB_GRPC_INTERNAL",
70
+ GRPC_UNAVAILABLE: "SB_GRPC_UNAVAILABLE",
71
+ GRPC_DATA_LOSS: "SB_GRPC_DATA_LOSS",
72
+ GRPC_UNAUTHENTICATED: "SB_GRPC_UNAUTHENTICATED",
73
+ GRPC_UNSPECIFIED: "SB_GRPC_UNSPECIFIED",
74
+ NON_GRPC: "SB_NON_GRPC"
75
+ };
76
+ var SB_MESSAGES = {
77
+ [SB.INVALID_SERVICE_KEY_MISSING_SEGMENT]: "The service key is missing a required segment.",
78
+ [SB.INVALID_SERVICE_KEY_MALFORMED_SEGMENT]: "The service key contains a malformed segment.",
79
+ [SB.INVALID_SERVICE_KEY_MALFORMED_PEM]: "The embedded CA in the service key is not valid PEM.",
80
+ [SB.INVALID_SERVICE_KEY_LEGACY]: "Legacy service keys are not supported; use an sbv2 service key.",
81
+ [SB.INVALID_SERVICE_KEY_MISSING_KEY_ID]: "The service key is missing the key identifier segment.",
82
+ [SB.INVALID_SERVICE_KEY_MALFORMED_SECRET]: "The service key secret segment is too short or malformed.",
83
+ [SB.EMPTY_CONTROL_PLANE_CA_OPTION]: "The explicit control-plane CA option is empty.",
84
+ [SB.INVALID_CONTROL_PLANE_CA]: "The control-plane CA certificate is not valid PEM.",
85
+ [SB.WORKER_TLS_CA_MALFORMED]: "A worker TLS CA certificate is not valid PEM.",
86
+ [SB.WORKER_TLS_INVALID_PAIR]: "The worker TLS certificate and private key do not form a valid pair.",
87
+ [SB.WORKER_TLS_INCOMPLETE_PAIR]: "Worker TLS certificate and private key must both be set, or both omitted.",
88
+ [SB.WORKER_ENDPOINT_EMPTY]: "Worker endpoint address is empty.",
89
+ [SB.WORKER_ENDPOINT_INVALID_SCHEME]: "Worker endpoint must be host:port without a URL scheme.",
90
+ [SB.ISSUE_CERTIFICATE_EMPTY_PEM]: "IssueCertificate returned empty certificate or CA PEM from the runtime.",
91
+ [SB.OFFLINE_QUEUE_FULL]: "The offline operation queue is full.",
92
+ [SB.RPC_TARGET_REQUIRED]: "RPC target function name is required.",
93
+ [SB.RPC_TARGET_AMBIGUOUS]: "The RPC target matches multiple services; use a globally unique function name.",
94
+ [SB.NO_RPC_ENDPOINTS]: "No worker endpoints are available for this RPC.",
95
+ [SB.RPC_CALLER_NOT_ALLOWED]: "This service is not allowed to call the target RPC.",
96
+ [SB.RPC_FN_REQUIRED]: "RPC function name is required.",
97
+ [SB.START_STATE_NOT_INITIALIZED]: "Worker start state is not initialized; call start() first.",
98
+ [SB.START_ALREADY_CALLED]: "start() has already been called on this client.",
99
+ [SB.START_INVALID_MAX_INFLIGHT]: "start() option maxInFlight must be a positive integer.",
100
+ [SB.WORKER_SERVER_NOT_INITIALIZED]: "Worker gRPC server failed to initialize.",
101
+ [SB.WORKER_TLS_NOT_PROVISIONED]: "Worker TLS materials are required but were not provisioned.",
102
+ [SB.WORKER_TLS_CA_REQUIRED]: "A TLS CA certificate is required when starting the worker with TLS.",
103
+ [SB.DUPLICATE_EVENT_CONSUMER_GROUP]: "Duplicate event consumer group for this pattern; use a unique pattern per handler.",
104
+ [SB.FROZEN_AFTER_START]: "This registration cannot be changed after start(); configure handlers and outbound declarations before start().",
105
+ [SB.UNDECLARED_OUTBOUND_RPC]: "Outbound RPC was not declared; call callsRpc(fn) before invoking this RPC when strict outbound declarations are enabled.",
106
+ [SB.RECONCILE_FAILED_PRECONDITION]: "Registration reconcile failed: the runtime rejected the current declaration state (FailedPrecondition).",
107
+ [SB.JOB_RPC_ARGS_REQUIRED]: "job(): service and function name are required for RPC jobs.",
108
+ [SB.JOB_VIA_MISMATCH]: "job(): via must be 'rpc' when using the (service, fn, opts) form.",
109
+ [SB.JOB_TARGET_FORM_REQUIRED]: "job(): use job(service, fn, opts) when via is 'rpc'.",
110
+ [SB.EXECUTE_WORKFLOW_ARGS_REQUIRED]: "executeWorkflow(): service name and workflow name are required.",
111
+ [SB.WORKFLOW_NOT_CANCELLED]: "The workflow was not cancelled.",
112
+ [SB.INTERNAL_INVARIANT_VIOLATION]: "Internal SDK invariant was violated.",
113
+ [SB.HANDLER_RETURNED_FAILURE]: "The RPC handler reported a failure.",
114
+ [SB.WATCH_TRACE_INVALID_JSON]: "watchTrace received a chunk that is not valid JSON.",
115
+ [SB.WATCH_TRACE_BACKPRESSURE]: "watchTrace consumer is not draining events fast enough.",
116
+ [SB.GRPC_CANCELLED]: "The gRPC call was cancelled.",
117
+ [SB.GRPC_UNKNOWN]: "The server returned an unknown gRPC error.",
118
+ [SB.GRPC_INVALID_ARGUMENT]: "The request was rejected (invalid argument).",
119
+ [SB.GRPC_DEADLINE_EXCEEDED]: "The gRPC call deadline was exceeded.",
120
+ [SB.GRPC_NOT_FOUND]: "The requested resource was not found.",
121
+ [SB.GRPC_ALREADY_EXISTS]: "The resource already exists.",
122
+ [SB.GRPC_PERMISSION_DENIED]: "Permission was denied for this call.",
123
+ [SB.GRPC_RESOURCE_EXHAUSTED]: "A resource limit was exceeded.",
124
+ [SB.GRPC_FAILED_PRECONDITION]: "The call failed a precondition check.",
125
+ [SB.GRPC_ABORTED]: "The operation was aborted.",
126
+ [SB.GRPC_OUT_OF_RANGE]: "A value was out of range.",
127
+ [SB.GRPC_UNIMPLEMENTED]: "The operation is not implemented on the server.",
128
+ [SB.GRPC_INTERNAL]: "The server reported an internal error.",
129
+ [SB.GRPC_UNAVAILABLE]: "The server was unavailable.",
130
+ [SB.GRPC_DATA_LOSS]: "Unrecoverable data loss or corruption was reported.",
131
+ [SB.GRPC_UNAUTHENTICATED]: "The call was not authenticated.",
132
+ [SB.GRPC_UNSPECIFIED]: "A gRPC error occurred.",
133
+ [SB.NON_GRPC]: "A non-gRPC error occurred."
134
+ };
135
+ function severityFromGrpc(code) {
136
+ switch (code) {
137
+ case grpc.status.UNAVAILABLE:
138
+ case grpc.status.UNKNOWN:
139
+ case grpc.status.DEADLINE_EXCEEDED:
140
+ case grpc.status.RESOURCE_EXHAUSTED:
141
+ return "retriable";
142
+ case grpc.status.CANCELLED:
143
+ return "ignorable";
144
+ default:
145
+ return "fatal";
146
+ }
147
+ }
148
+ function mapGrpcStatus(grpcStatus, details) {
149
+ const code = grpcCodeToSb(grpcStatus);
150
+ let message = SB_MESSAGES[code];
151
+ if (details?.trim()) {
152
+ const d = details.trim();
153
+ if (grpcStatus === grpc.status.INTERNAL || grpcStatus === grpc.status.UNKNOWN || grpcStatus === grpc.status.FAILED_PRECONDITION) {
154
+ message = `${message} ${d}`;
155
+ } else if (!message.includes(d)) {
156
+ message = `${message} ${d}`;
157
+ }
158
+ }
159
+ return { code, message };
160
+ }
161
+ function grpcCodeToSb(grpcStatus) {
162
+ switch (grpcStatus) {
163
+ case grpc.status.CANCELLED:
164
+ return SB.GRPC_CANCELLED;
165
+ case grpc.status.UNKNOWN:
166
+ return SB.GRPC_UNKNOWN;
167
+ case grpc.status.INVALID_ARGUMENT:
168
+ return SB.GRPC_INVALID_ARGUMENT;
169
+ case grpc.status.DEADLINE_EXCEEDED:
170
+ return SB.GRPC_DEADLINE_EXCEEDED;
171
+ case grpc.status.NOT_FOUND:
172
+ return SB.GRPC_NOT_FOUND;
173
+ case grpc.status.ALREADY_EXISTS:
174
+ return SB.GRPC_ALREADY_EXISTS;
175
+ case grpc.status.PERMISSION_DENIED:
176
+ return SB.GRPC_PERMISSION_DENIED;
177
+ case grpc.status.RESOURCE_EXHAUSTED:
178
+ return SB.GRPC_RESOURCE_EXHAUSTED;
179
+ case grpc.status.FAILED_PRECONDITION:
180
+ return SB.GRPC_FAILED_PRECONDITION;
181
+ case grpc.status.ABORTED:
182
+ return SB.GRPC_ABORTED;
183
+ case grpc.status.OUT_OF_RANGE:
184
+ return SB.GRPC_OUT_OF_RANGE;
185
+ case grpc.status.UNIMPLEMENTED:
186
+ return SB.GRPC_UNIMPLEMENTED;
187
+ case grpc.status.INTERNAL:
188
+ return SB.GRPC_INTERNAL;
189
+ case grpc.status.UNAVAILABLE:
190
+ return SB.GRPC_UNAVAILABLE;
191
+ case grpc.status.DATA_LOSS:
192
+ return SB.GRPC_DATA_LOSS;
193
+ case grpc.status.UNAUTHENTICATED:
194
+ return SB.GRPC_UNAUTHENTICATED;
195
+ default:
196
+ return SB.GRPC_UNSPECIFIED;
197
+ }
198
+ }
199
+
200
+ class ServiceBridgeError extends Error {
201
+ code;
202
+ grpcStatus;
203
+ component;
204
+ operation;
205
+ severity;
206
+ retryable;
207
+ cause;
208
+ constructor(opts) {
209
+ super(opts.message);
210
+ this.name = "ServiceBridgeError";
211
+ this.code = opts.code;
212
+ this.grpcStatus = opts.grpcStatus;
213
+ this.component = opts.component ?? "sdk";
214
+ this.operation = opts.operation ?? "unknown";
215
+ this.severity = opts.severity ?? severityFromGrpc(typeof opts.grpcStatus === "number" ? opts.grpcStatus : undefined);
216
+ this.retryable = this.severity === "retriable";
217
+ Object.defineProperty(this, "cause", {
218
+ value: opts.cause,
219
+ writable: true,
220
+ enumerable: false,
221
+ configurable: true
222
+ });
223
+ }
224
+ toString() {
225
+ return `ServiceBridgeError [${this.code}] [${this.severity}]: ${this.message} (${this.operation})`;
226
+ }
227
+ [Symbol.for("nodejs.util.inspect.custom")]() {
228
+ const lines = [
229
+ `ServiceBridgeError [${this.code}] [${this.severity}]`,
230
+ ` operation: ${this.operation}`,
231
+ ` message: ${this.message}`
232
+ ];
233
+ if (this.grpcStatus !== undefined) {
234
+ lines.push(` grpc: ${this.grpcStatus}`);
235
+ }
236
+ return lines.join(`
237
+ `);
238
+ }
239
+ }
14
240
 
15
241
  // sdk/src/session_v2.ts
16
242
  class AdaptiveHeartbeatV2 {
@@ -177,7 +403,6 @@ class V2SessionClient {
177
403
  constructor(config) {
178
404
  this.config = {
179
405
  serverAddress: config.serverAddress,
180
- serviceName: config.serviceName,
181
406
  instanceId: config.instanceId,
182
407
  zone: config.zone ?? "",
183
408
  transportMode: config.transportMode ?? "direct",
@@ -209,7 +434,6 @@ class V2SessionClient {
209
434
  const rs = this.position.getResumeState(this.resumeToken, this.epoch);
210
435
  return {
211
436
  identity: {
212
- serviceName: this.config.serviceName,
213
437
  instanceId: this.config.instanceId,
214
438
  transport: this.config.transportMode
215
439
  },
@@ -309,8 +533,6 @@ class V2SessionClient {
309
533
  function validateV2Config(cfg) {
310
534
  if (!cfg.serverAddress)
311
535
  throw new Error("servicebridge: serverAddress is required");
312
- if (!cfg.serviceName)
313
- throw new Error("servicebridge: serviceName is required");
314
536
  if (!cfg.instanceId)
315
537
  throw new Error("servicebridge: instanceId is required");
316
538
  if (cfg.transportMode && cfg.transportMode !== "direct" && cfg.transportMode !== "proxy") {
@@ -336,7 +558,7 @@ var traceStorage = new AsyncLocalStorage;
336
558
  function getTraceContext() {
337
559
  return traceStorage.getStore();
338
560
  }
339
- function runWithTraceContext(ctx, fn) {
561
+ function withTraceContext(ctx, fn) {
340
562
  return traceStorage.run(ctx, fn);
341
563
  }
342
564
  var servicebridgePackageDefinition = protoLoader.loadFileDescriptorSetFromBuffer(Buffer.from(DESCRIPTOR_SET_BASE64, "base64"), {
@@ -346,12 +568,11 @@ var servicebridgePackageDefinition = protoLoader.loadFileDescriptorSetFromBuffer
346
568
  defaults: true,
347
569
  oneofs: true
348
570
  });
349
- var proto = grpc.loadPackageDefinition(servicebridgePackageDefinition);
571
+ var proto = grpc2.loadPackageDefinition(servicebridgePackageDefinition);
350
572
  var servicebridgeProto = proto.servicebridge;
351
573
  var ControlPlaneService = servicebridgeProto.controlplane.v1.ControlPlane;
352
574
  var SessionService = servicebridgeProto.session.v1.SessionService;
353
575
  var RegistryService = servicebridgeProto.registry.v1.RegistryService;
354
- var DataPlaneService = servicebridgeProto.dataplane?.v1?.DataPlane;
355
576
  var WorkerHandlerService = servicebridgeProto.worker.v1.WorkerHandler;
356
577
  var channelOpts = {
357
578
  "grpc.max_receive_message_length": -1,
@@ -385,45 +606,6 @@ function decodeWithSchema(schema, buf) {
385
606
  const type = buildProtoType(schema);
386
607
  return type.decode(buf).toJSON();
387
608
  }
388
-
389
- class ServiceBridgeError extends Error {
390
- code;
391
- component;
392
- operation;
393
- severity;
394
- retryable;
395
- cause;
396
- constructor(opts) {
397
- super(opts.message);
398
- this.name = "ServiceBridgeError";
399
- this.code = opts.code;
400
- this.component = opts.component;
401
- this.operation = opts.operation;
402
- this.severity = opts.severity;
403
- this.retryable = opts.severity === "retriable";
404
- Object.defineProperty(this, "cause", {
405
- value: opts.cause,
406
- writable: true,
407
- enumerable: false,
408
- configurable: true
409
- });
410
- }
411
- toString() {
412
- return `ServiceBridgeError [${this.severity}]: ${this.message} (${this.operation})`;
413
- }
414
- [Symbol.for("nodejs.util.inspect.custom")]() {
415
- const lines = [
416
- `ServiceBridgeError [${this.severity}]`,
417
- ` operation: ${this.operation}`,
418
- ` message: ${this.message}`
419
- ];
420
- if (this.code !== undefined) {
421
- lines.push(` code: ${this.code}`);
422
- }
423
- return lines.join(`
424
- `);
425
- }
426
- }
427
609
  function containsValue(values, value) {
428
610
  return values.includes(value);
429
611
  }
@@ -462,26 +644,50 @@ function toPemBuffer(v) {
462
644
  function decodeBase64UrlSegment(segment, fieldName) {
463
645
  const trimmed = segment.trim();
464
646
  if (!trimmed) {
465
- throw new Error(`invalid service key: missing ${fieldName}`);
647
+ throw new ServiceBridgeError({
648
+ code: SB.INVALID_SERVICE_KEY_MISSING_SEGMENT,
649
+ message: `The service key is missing the "${fieldName}" segment.`,
650
+ component: "sdk",
651
+ operation: "parse-service-key",
652
+ severity: "fatal"
653
+ });
466
654
  }
467
655
  if (!/^[A-Za-z0-9_-]+$/.test(trimmed)) {
468
- throw new Error(`invalid service key: malformed ${fieldName}`);
656
+ throw new ServiceBridgeError({
657
+ code: SB.INVALID_SERVICE_KEY_MALFORMED_SEGMENT,
658
+ message: `The service key segment "${fieldName}" is malformed.`,
659
+ component: "sdk",
660
+ operation: "parse-service-key",
661
+ severity: "fatal"
662
+ });
469
663
  }
470
664
  const normalized = trimmed.replace(/-/g, "+").replace(/_/g, "/");
471
665
  const padded = normalized + "=".repeat((4 - normalized.length % 4) % 4);
472
666
  return Buffer.from(padded, "base64");
473
667
  }
474
- function validateCAPem(caPem, errorMessage) {
668
+ function validateCAPem(caPem, errorMessage, code) {
475
669
  const blocks = caPem.toString("utf8").match(/-----BEGIN CERTIFICATE-----[\s\S]+?-----END CERTIFICATE-----/g) ?? [];
476
670
  if (blocks.length === 0) {
477
- throw new Error(errorMessage);
671
+ throw new ServiceBridgeError({
672
+ code,
673
+ message: errorMessage,
674
+ component: "sdk",
675
+ operation: "validate-ca-pem",
676
+ severity: "fatal"
677
+ });
478
678
  }
479
679
  try {
480
680
  for (const block of blocks) {
481
681
  new crypto.X509Certificate(block);
482
682
  }
483
683
  } catch {
484
- throw new Error(errorMessage);
684
+ throw new ServiceBridgeError({
685
+ code,
686
+ message: errorMessage,
687
+ component: "sdk",
688
+ operation: "validate-ca-pem",
689
+ severity: "fatal"
690
+ });
485
691
  }
486
692
  return caPem;
487
693
  }
@@ -492,26 +698,59 @@ function validateWorkerCertAndKeyPair(certPem, keyPem) {
492
698
  const certPublic = cert.publicKey.export({ type: "spki", format: "pem" });
493
699
  const keyPublic = crypto.createPublicKey(key).export({ type: "spki", format: "pem" });
494
700
  if (String(certPublic) !== String(keyPublic)) {
495
- throw new Error("mismatch");
701
+ throw new ServiceBridgeError({
702
+ code: SB.WORKER_TLS_INVALID_PAIR,
703
+ message: "The worker TLS certificate public key does not match the private key.",
704
+ component: "sdk",
705
+ operation: "validate-worker-tls",
706
+ severity: "fatal"
707
+ });
496
708
  }
497
- } catch {
498
- throw new Error("invalid worker tls cert/key pair");
709
+ } catch (e) {
710
+ if (e instanceof ServiceBridgeError)
711
+ throw e;
712
+ throw new ServiceBridgeError({
713
+ code: SB.WORKER_TLS_INVALID_PAIR,
714
+ message: "The worker TLS certificate and private key do not form a valid pair.",
715
+ component: "sdk",
716
+ operation: "validate-worker-tls",
717
+ severity: "fatal",
718
+ cause: e
719
+ });
499
720
  }
500
721
  }
501
722
  function parseServiceKeyV2(serviceKey) {
502
723
  const parts = serviceKey.trim().split(".");
503
724
  if (parts.length !== 4 || parts[0] !== "sbv2") {
504
- throw new Error("legacy service keys are disabled: expected sbv2 key");
725
+ throw new ServiceBridgeError({
726
+ code: SB.INVALID_SERVICE_KEY_LEGACY,
727
+ message: "Legacy service keys are not supported; an sbv2 service key is required.",
728
+ component: "sdk",
729
+ operation: "parse-service-key",
730
+ severity: "fatal"
731
+ });
505
732
  }
506
733
  const keyId = parts[1].trim();
507
734
  if (!keyId) {
508
- throw new Error("invalid service key: missing key id");
735
+ throw new ServiceBridgeError({
736
+ code: SB.INVALID_SERVICE_KEY_MISSING_KEY_ID,
737
+ message: "The service key is missing the key identifier segment.",
738
+ component: "sdk",
739
+ operation: "parse-service-key",
740
+ severity: "fatal"
741
+ });
509
742
  }
510
743
  const secretBytes = decodeBase64UrlSegment(parts[2] ?? "", "secret segment");
511
744
  if (secretBytes.length < 16) {
512
- throw new Error("invalid service key: malformed secret segment");
745
+ throw new ServiceBridgeError({
746
+ code: SB.INVALID_SERVICE_KEY_MALFORMED_SECRET,
747
+ message: "The service key secret segment is too short or otherwise malformed.",
748
+ component: "sdk",
749
+ operation: "parse-service-key",
750
+ severity: "fatal"
751
+ });
513
752
  }
514
- const caPem = validateCAPem(decodeBase64UrlSegment(parts[3] ?? "", "ca segment"), "invalid service key: malformed embedded ca pem");
753
+ const caPem = validateCAPem(decodeBase64UrlSegment(parts[3] ?? "", "ca segment"), "The embedded CA in the service key is not valid PEM.", SB.INVALID_SERVICE_KEY_MALFORMED_PEM);
515
754
  const secretHash = crypto.createHash("sha256").update(secretBytes).digest("hex");
516
755
  return { keyId, secretHash, caPem };
517
756
  }
@@ -520,78 +759,63 @@ function resolveControlPlaneCAPem(serviceKey, opts) {
520
759
  if (opts.caCert) {
521
760
  const explicit = toPemBuffer(opts.caCert);
522
761
  if (!explicit || explicit.length === 0) {
523
- throw new Error("opts.caCert is empty");
762
+ throw new ServiceBridgeError({
763
+ code: SB.EMPTY_CONTROL_PLANE_CA_OPTION,
764
+ message: "The opts.caCert value is empty.",
765
+ component: "sdk",
766
+ operation: "resolve-control-plane-ca",
767
+ severity: "fatal"
768
+ });
524
769
  }
525
- return validateCAPem(explicit, "invalid control-plane ca cert: malformed pem");
770
+ return validateCAPem(explicit, "The control-plane CA certificate is not valid PEM.", SB.INVALID_CONTROL_PLANE_CA);
526
771
  }
527
772
  return parsedKey.caPem;
528
773
  }
529
- function severityFromStatus(code) {
530
- switch (code) {
531
- case grpc.status.UNAVAILABLE:
532
- case grpc.status.UNKNOWN:
533
- case grpc.status.DEADLINE_EXCEEDED:
534
- case grpc.status.RESOURCE_EXHAUSTED:
535
- return "retriable";
536
- case grpc.status.CANCELLED:
537
- return "ignorable";
538
- default:
539
- return "fatal";
540
- }
541
- }
542
774
  function normalizeServiceError(err, operation, component = "control-plane") {
543
775
  if (err instanceof ServiceBridgeError) {
544
776
  return err;
545
777
  }
546
778
  const grpcErr = err;
547
- const code = typeof grpcErr?.code === "number" ? grpcErr.code : undefined;
779
+ const grpcStatus = typeof grpcErr?.code === "number" ? grpcErr.code : undefined;
548
780
  const details = typeof grpcErr?.details === "string" && grpcErr.details.trim() ? grpcErr.details.trim() : undefined;
549
781
  const rawMsg = (() => {
550
782
  const m = typeof grpcErr?.message === "string" && grpcErr.message ? grpcErr.message : err instanceof Error ? err.message : String(err);
551
783
  return m.replace(/^\d+\s+[A-Z_]+:\s*/, "").trim() || m;
552
784
  })();
553
- const base = friendlyGrpcMessage(code, details ?? rawMsg);
554
- const appendDetails = details && (code === grpc.status.INTERNAL || code === grpc.status.UNKNOWN || code === undefined);
555
- const message = appendDetails ? `${base}: ${details}` : base;
785
+ if (grpcStatus !== undefined) {
786
+ const isReconcileFailedPrecondition = grpcStatus === grpc2.status.FAILED_PRECONDITION && operation.startsWith("reconcile:");
787
+ if (isReconcileFailedPrecondition) {
788
+ const base = SB_MESSAGES[SB.RECONCILE_FAILED_PRECONDITION];
789
+ const message = details ? `${base} ${details}` : base;
790
+ return new ServiceBridgeError({
791
+ code: SB.RECONCILE_FAILED_PRECONDITION,
792
+ message,
793
+ grpcStatus,
794
+ component,
795
+ operation,
796
+ cause: err
797
+ });
798
+ }
799
+ const mapped = mapGrpcStatus(grpcStatus, details ?? rawMsg);
800
+ return new ServiceBridgeError({
801
+ code: mapped.code,
802
+ message: mapped.message,
803
+ grpcStatus,
804
+ component,
805
+ operation,
806
+ cause: err
807
+ });
808
+ }
809
+ const fallbackMsg = rawMsg || "An unknown error occurred.";
556
810
  return new ServiceBridgeError({
557
- message,
558
- code,
811
+ code: SB.NON_GRPC,
812
+ message: fallbackMsg,
559
813
  component,
560
814
  operation,
561
- severity: severityFromStatus(code),
815
+ severity: "fatal",
562
816
  cause: err
563
817
  });
564
818
  }
565
- function friendlyGrpcMessage(code, rawMessage) {
566
- if (code === undefined)
567
- return rawMessage || "unknown error";
568
- switch (code) {
569
- case grpc.status.UNAVAILABLE:
570
- return "control plane unavailable";
571
- case grpc.status.DEADLINE_EXCEEDED:
572
- return "request timed out";
573
- case grpc.status.UNAUTHENTICATED:
574
- return "authentication failed — check service key";
575
- case grpc.status.PERMISSION_DENIED:
576
- return "permission denied — check service key";
577
- case grpc.status.RESOURCE_EXHAUSTED:
578
- return "rate limit exceeded";
579
- case grpc.status.NOT_FOUND:
580
- return "resource not found";
581
- case grpc.status.INTERNAL:
582
- return "internal server error";
583
- case grpc.status.FAILED_PRECONDITION:
584
- return "precondition failed";
585
- case grpc.status.CANCELLED:
586
- return "request cancelled";
587
- case grpc.status.UNIMPLEMENTED:
588
- return "operation not supported by control plane";
589
- case grpc.status.UNKNOWN:
590
- return "unknown error from control plane";
591
- default:
592
- return rawMessage || "unknown error";
593
- }
594
- }
595
819
  function friendlySDKMessage(operation, err) {
596
820
  const base = err.message;
597
821
  switch (operation) {
@@ -633,20 +857,6 @@ function reportSDKError(operation, err, component = "sdk") {
633
857
  }
634
858
  return normalized;
635
859
  }
636
- function parseCanonicalFunctionName(target) {
637
- const canonicalName = target.trim();
638
- if (!canonicalName)
639
- return null;
640
- const slash = canonicalName.indexOf("/");
641
- if (slash > 0 && slash < canonicalName.length - 1) {
642
- const serviceName = canonicalName.slice(0, slash).trim();
643
- const fnName = canonicalName.slice(slash + 1).trim();
644
- if (!serviceName || !fnName)
645
- return null;
646
- return { canonicalName, serviceName, fnName };
647
- }
648
- return { canonicalName, serviceName: "", fnName: canonicalName };
649
- }
650
860
  function workerChannelOptions(tlsOpts) {
651
861
  if (!tlsOpts?.serverName) {
652
862
  return channelOpts;
@@ -658,7 +868,7 @@ function workerChannelOptions(tlsOpts) {
658
868
  };
659
869
  }
660
870
  function workerClientCredentials(tlsOpts) {
661
- return grpc.credentials.createSsl(toPemBuffer(tlsOpts?.caCert), toPemBuffer(tlsOpts?.key), toPemBuffer(tlsOpts?.cert));
871
+ return grpc2.credentials.createSsl(toPemBuffer(tlsOpts?.caCert), toPemBuffer(tlsOpts?.key), toPemBuffer(tlsOpts?.cert));
662
872
  }
663
873
  var _wireStringMapMode = null;
664
874
  function detectWireStringMapMode() {
@@ -771,12 +981,18 @@ async function provisionWorkerTLS(controlClient, md, serviceName, instanceId, ad
771
981
  }, md, { deadline: new Date(Date.now() + 15000), waitForReady: true }, (err, res) => err ? reject(err) : resolve(res ?? {}));
772
982
  });
773
983
  if (!data.cert_pem || !data.ca_pem) {
774
- throw new Error("IssueCertificate: runtime returned empty cert or CA PEM");
984
+ throw new ServiceBridgeError({
985
+ code: SB.ISSUE_CERTIFICATE_EMPTY_PEM,
986
+ message: SB_MESSAGES[SB.ISSUE_CERTIFICATE_EMPTY_PEM],
987
+ component: "control-plane",
988
+ operation: "issue-certificate",
989
+ severity: "fatal"
990
+ });
775
991
  }
776
992
  return {
777
993
  cert: Buffer.from(data.cert_pem),
778
994
  key: Buffer.from(privateKey),
779
- caCert: validateCAPem(Buffer.from(data.ca_pem), "invalid worker provisioned ca pem")
995
+ caCert: validateCAPem(Buffer.from(data.ca_pem), "The CA PEM returned from IssueCertificate is not valid.", SB.WORKER_TLS_CA_MALFORMED)
780
996
  };
781
997
  }
782
998
  var _sbContexts = new Map;
@@ -789,7 +1005,7 @@ function ensureSbResolverRegistered() {
789
1005
 
790
1006
  class SbResolver {
791
1007
  clientId;
792
- canonicalName;
1008
+ functionKey;
793
1009
  listener;
794
1010
  refreshTimer = null;
795
1011
  constructor(target, listener) {
@@ -797,11 +1013,11 @@ function ensureSbResolverRegistered() {
797
1013
  const normalizedPath = (target.path ?? "").replace(/^\/+/, "");
798
1014
  if (authority && authority !== "localhost" && _sbContexts.has(authority)) {
799
1015
  this.clientId = authority;
800
- this.canonicalName = normalizedPath;
1016
+ this.functionKey = normalizedPath;
801
1017
  } else {
802
- const [clientIdFromPath = "", ...canonicalParts] = normalizedPath.split("/");
1018
+ const [clientIdFromPath = "", ...keyParts] = normalizedPath.split("/");
803
1019
  this.clientId = clientIdFromPath.trim();
804
- this.canonicalName = canonicalParts.join("/").trim();
1020
+ this.functionKey = keyParts.join("/").trim();
805
1021
  }
806
1022
  this.listener = listener;
807
1023
  this.init().catch(() => {});
@@ -814,7 +1030,7 @@ function ensureSbResolverRegistered() {
814
1030
  error: {
815
1031
  code: 14,
816
1032
  details: `No SB context for clientId=${this.clientId}`,
817
- metadata: new grpc.Metadata
1033
+ metadata: new grpc2.Metadata
818
1034
  }
819
1035
  }, {}, null, "sb-resolver");
820
1036
  return;
@@ -830,7 +1046,7 @@ function ensureSbResolverRegistered() {
830
1046
  if (!ctx)
831
1047
  return;
832
1048
  try {
833
- const eps = await ctx.lookupFn(this.canonicalName);
1049
+ const eps = await ctx.lookupFn(this.functionKey);
834
1050
  this.reportEndpoints(eps);
835
1051
  } catch {}
836
1052
  }
@@ -840,8 +1056,8 @@ function ensureSbResolverRegistered() {
840
1056
  ok: false,
841
1057
  error: {
842
1058
  code: 14,
843
- details: `No live endpoints for ${this.canonicalName}`,
844
- metadata: new grpc.Metadata
1059
+ details: `No live endpoints for ${this.functionKey}`,
1060
+ metadata: new grpc2.Metadata
845
1061
  }
846
1062
  }, {}, null, "sb-resolver");
847
1063
  return;
@@ -860,28 +1076,34 @@ function ensureSbResolverRegistered() {
860
1076
  }
861
1077
  registerResolver("sb", SbResolver);
862
1078
  }
863
- function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}) {
864
- const service = typeof serviceOrOpts === "string" ? serviceOrOpts.trim() : "";
865
- const globalOpts = typeof serviceOrOpts === "string" ? maybeGlobalOpts : serviceOrOpts ?? {};
1079
+ function servicebridge(url, serviceKey, opts = {}) {
866
1080
  const parsedServiceKey = parseServiceKeyV2(serviceKey);
867
- const defaultConsumerPrefix = service || parsedServiceKey.keyId || "consumer";
868
- const meta = new grpc.Metadata;
1081
+ const service = parsedServiceKey.keyId || "";
1082
+ const globalOpts = opts;
1083
+ const defaultConsumerPrefix = service || "consumer";
1084
+ const meta = new grpc2.Metadata;
869
1085
  meta.add("x-service-key", serviceKey);
870
1086
  const rawUrl = url.trim();
871
1087
  const target = rawUrl.replace(/^grpcs?:\/\//, "") || "localhost:14445";
872
1088
  const controlPlaneCA = resolveControlPlaneCAPem(serviceKey, globalOpts);
873
1089
  const configuredCACertRaw = toPemBuffer(globalOpts.workerTLS?.caCert);
874
- const configuredCACert = configuredCACertRaw ? validateCAPem(configuredCACertRaw, "invalid worker tls ca cert: malformed pem") : undefined;
1090
+ const configuredCACert = configuredCACertRaw ? validateCAPem(configuredCACertRaw, "The worker TLS CA certificate is not valid PEM.", SB.WORKER_TLS_CA_MALFORMED) : undefined;
875
1091
  const configuredClientKey = toPemBuffer(globalOpts.workerTLS?.key);
876
1092
  const configuredClientCert = toPemBuffer(globalOpts.workerTLS?.cert);
877
1093
  if (configuredClientCert && !configuredClientKey || !configuredClientCert && configuredClientKey) {
878
- throw new Error("workerTLS.cert and workerTLS.key must be provided together");
1094
+ throw new ServiceBridgeError({
1095
+ code: SB.WORKER_TLS_INCOMPLETE_PAIR,
1096
+ message: SB_MESSAGES[SB.WORKER_TLS_INCOMPLETE_PAIR],
1097
+ component: "sdk",
1098
+ operation: "servicebridge",
1099
+ severity: "fatal"
1100
+ });
879
1101
  }
880
1102
  if (configuredClientCert && configuredClientKey) {
881
1103
  validateWorkerCertAndKeyPair(configuredClientCert, configuredClientKey);
882
1104
  }
883
1105
  function makeControlPlaneCreds() {
884
- return grpc.credentials.createSsl(controlPlaneCA, null, null);
1106
+ return grpc2.credentials.createSsl(controlPlaneCA, null, null);
885
1107
  }
886
1108
  function unaryDeadlineOptions(timeoutMs = globalOpts.timeout ?? 30000) {
887
1109
  return { deadline: new Date(Date.now() + timeoutMs) };
@@ -924,10 +1146,6 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
924
1146
  ...globalOpts.workerTLS,
925
1147
  caCert: configuredCACert ?? controlPlaneCA
926
1148
  }));
927
- const dataPlaneStub = DataPlaneService ? new DataPlaneService(target, makeControlPlaneCreds(), workerChannelOptions({
928
- ...globalOpts.workerTLS,
929
- caCert: configuredCACert ?? controlPlaneCA
930
- })) : null;
931
1149
  const _controlReady = Promise.resolve();
932
1150
  const eventHandlers = new Map;
933
1151
  const fnHandlers = new Map;
@@ -935,6 +1153,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
935
1153
  const httpRegistrations = new Map;
936
1154
  const jobRegistrations = new Map;
937
1155
  const workflowRegistrations = new Map;
1156
+ const outgoingDeps = [];
938
1157
  const functionMeta = new Map;
939
1158
  const fnAliasMap = new Map;
940
1159
  const functionChannels = new Map;
@@ -948,8 +1167,9 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
948
1167
  let workerSessionReconnectTimer = null;
949
1168
  let workerSessionPingTimer = null;
950
1169
  let workerSessionPositionTimer = null;
1170
+ const pendingPublishAcks = new Map;
951
1171
  let v2Session = null;
952
- let serveState = null;
1172
+ let startState = null;
953
1173
  let heartbeatTimer = null;
954
1174
  let registrationSyncPromise = null;
955
1175
  let registrationFollowUpPromise = null;
@@ -977,7 +1197,13 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
977
1197
  const policy = globalOpts.queueOverflow ?? "drop-oldest";
978
1198
  if (offlineQueue.length >= max) {
979
1199
  if (policy === "error")
980
- throw new Error("ServiceBridge offline queue is full");
1200
+ throw new ServiceBridgeError({
1201
+ code: SB.OFFLINE_QUEUE_FULL,
1202
+ message: SB_MESSAGES[SB.OFFLINE_QUEUE_FULL],
1203
+ component: "sdk",
1204
+ operation: "offline-queue",
1205
+ severity: "fatal"
1206
+ });
981
1207
  if (policy === "drop-oldest") {
982
1208
  offlineQueue.shift();
983
1209
  } else {
@@ -987,7 +1213,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
987
1213
  offlineQueue.push(op);
988
1214
  }
989
1215
  function makeWorkerMeta() {
990
- const md = new grpc.Metadata;
1216
+ const md = new grpc2.Metadata;
991
1217
  md.add("x-caller-service", service);
992
1218
  return md;
993
1219
  }
@@ -1012,6 +1238,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1012
1238
  parent_span_id: op.parentSpanId,
1013
1239
  fn: op.fn,
1014
1240
  span_type: op.spanType ?? "",
1241
+ target_service: op.targetService ?? "",
1015
1242
  started_at: op.startedAt,
1016
1243
  input: op.inputBuf,
1017
1244
  attempt: op.attempt
@@ -1033,6 +1260,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1033
1260
  parent_span_id: op.parentSpanId ?? "",
1034
1261
  fn: op.fn,
1035
1262
  span_type: op.spanType ?? "",
1263
+ target_service: op.targetService ?? "",
1036
1264
  started_at: op.startedAt,
1037
1265
  duration_ms: op.durationMs,
1038
1266
  success: op.success,
@@ -1067,7 +1295,6 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1067
1295
  function pushLog(level, msg, attrs) {
1068
1296
  const tc = traceStorage.getStore();
1069
1297
  const entry = {
1070
- service_name: service,
1071
1298
  level,
1072
1299
  message: msg,
1073
1300
  timestamp_ns: String(Date.now() * 1e6),
@@ -1077,8 +1304,6 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1077
1304
  entry.trace_id = tc.traceId;
1078
1305
  if (tc?.spanId)
1079
1306
  entry.span_id = tc.spanId;
1080
- if (serveState?.instanceId)
1081
- entry.instance_id = serveState.instanceId;
1082
1307
  logBatch.push(entry);
1083
1308
  if (logBatch.length >= 100) {
1084
1309
  flushLogs();
@@ -1089,9 +1314,9 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1089
1314
  ensureSbResolverRegistered();
1090
1315
  _sbContexts.set(clientId, {
1091
1316
  lookupFn: async (target2) => {
1092
- const canonical = resolveCanonical(target2);
1093
- if (canonical) {
1094
- const m = functionMeta.get(canonical);
1317
+ const functionKey = resolveFunctionKey(target2);
1318
+ if (functionKey) {
1319
+ const m = functionMeta.get(functionKey);
1095
1320
  if (m && m.endpoints.length > 0)
1096
1321
  return m.endpoints;
1097
1322
  }
@@ -1127,43 +1352,91 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1127
1352
  } catch {}
1128
1353
  return;
1129
1354
  }
1130
- function resolveCanonical(target2) {
1355
+ function resolveFunctionKey(target2) {
1131
1356
  const n = target2.trim();
1132
- if (!n)
1133
- throw new Error("RPC target is required");
1357
+ if (!n) {
1358
+ throw new ServiceBridgeError({
1359
+ code: SB.RPC_TARGET_REQUIRED,
1360
+ message: SB_MESSAGES[SB.RPC_TARGET_REQUIRED],
1361
+ component: "sdk",
1362
+ operation: "resolve-function-key",
1363
+ severity: "fatal"
1364
+ });
1365
+ }
1366
+ if (n.includes("/")) {
1367
+ throw new ServiceBridgeError({
1368
+ code: SB.GRPC_INVALID_ARGUMENT,
1369
+ message: 'RPC target must not contain "/"; use the global function name only.',
1370
+ component: "sdk",
1371
+ operation: "resolve-function-key",
1372
+ severity: "fatal"
1373
+ });
1374
+ }
1134
1375
  if (functionMeta.has(n))
1135
1376
  return n;
1136
1377
  const alias = fnAliasMap.get(n);
1137
- if (alias === null)
1138
- throw new Error(`RPC target "${n}" is ambiguous — multiple services expose this function`);
1378
+ if (alias === null) {
1379
+ throw new ServiceBridgeError({
1380
+ code: SB.RPC_TARGET_AMBIGUOUS,
1381
+ message: `${SB_MESSAGES[SB.RPC_TARGET_AMBIGUOUS]} Conflicting name: "${n}".`,
1382
+ component: "sdk",
1383
+ operation: "resolve-function-key",
1384
+ severity: "fatal"
1385
+ });
1386
+ }
1139
1387
  return alias ?? null;
1140
1388
  }
1389
+ function assertRegistrationsNotFrozen(op) {
1390
+ if (workerServer) {
1391
+ throw new ServiceBridgeError({
1392
+ code: SB.FROZEN_AFTER_START,
1393
+ message: SB_MESSAGES[SB.FROZEN_AFTER_START],
1394
+ component: "sdk",
1395
+ operation: op,
1396
+ severity: "fatal"
1397
+ });
1398
+ }
1399
+ }
1400
+ function assertOutboundRpcDeclaredForTarget(functionKey) {
1401
+ if (!globalOpts.strictOutboundDeclarations)
1402
+ return;
1403
+ const ok = outgoingDeps.some((d) => d.dep_type === "rpc" && d.target_resource === functionKey.trim());
1404
+ if (!ok) {
1405
+ throw new ServiceBridgeError({
1406
+ code: SB.UNDECLARED_OUTBOUND_RPC,
1407
+ message: `${SB_MESSAGES[SB.UNDECLARED_OUTBOUND_RPC]} Target: ${functionKey}.`,
1408
+ component: "sdk",
1409
+ operation: "rpc",
1410
+ severity: "fatal"
1411
+ });
1412
+ }
1413
+ }
1141
1414
  async function doLookupFunction(target2) {
1142
1415
  return new Promise((resolve) => {
1143
1416
  registryStub.Lookup({ function_name: target2 }, meta, { deadline: new Date(Date.now() + 5000) }, (err, res) => {
1144
- if (err || !res?.canonical_name) {
1417
+ if (err || !res?.endpoints?.length) {
1145
1418
  resolve([]);
1146
1419
  return;
1147
1420
  }
1148
- const canonicalName = res.canonical_name ?? target2;
1421
+ const fnName = target2.trim();
1422
+ const firstEp = res.endpoints[0];
1423
+ const serviceName = typeof firstEp?.service_name === "string" ? firstEp.service_name : "";
1424
+ const functionKey = fnName;
1149
1425
  const endpoints = parseEndpointsFromWire(res.endpoints);
1150
- const isNewFunction = !functionMeta.has(canonicalName);
1426
+ const isNewFunction = !functionMeta.has(functionKey);
1151
1427
  if (isNewFunction) {
1152
- const parsed = parseCanonicalFunctionName(canonicalName);
1153
- if (parsed) {
1154
- functionMeta.set(canonicalName, {
1155
- canonicalName,
1156
- fnName: parsed.fnName,
1157
- serviceName: parsed.serviceName,
1158
- inputSchema: parseSchemaJsonSafe(res.input_schema_json),
1159
- outputSchema: parseSchemaJsonSafe(res.output_schema_json),
1160
- allowedCallers: Array.isArray(res.allowed_callers) ? res.allowed_callers : [],
1161
- endpoints
1162
- });
1163
- rebuildAliasMap();
1164
- }
1428
+ functionMeta.set(functionKey, {
1429
+ functionKey,
1430
+ fnName,
1431
+ serviceName,
1432
+ inputSchema: parseSchemaJsonSafe(res.input_schema_json),
1433
+ outputSchema: parseSchemaJsonSafe(res.output_schema_json),
1434
+ allowedCallers: Array.isArray(res.allowed_callers) ? res.allowed_callers : [],
1435
+ endpoints
1436
+ });
1437
+ rebuildAliasMap();
1165
1438
  } else {
1166
- const meta2 = functionMeta.get(canonicalName);
1439
+ const meta2 = functionMeta.get(functionKey);
1167
1440
  if (meta2)
1168
1441
  meta2.endpoints = endpoints;
1169
1442
  }
@@ -1177,18 +1450,18 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1177
1450
  for (const m of functionMeta.values())
1178
1451
  count.set(m.fnName, (count.get(m.fnName) ?? 0) + 1);
1179
1452
  for (const m of functionMeta.values())
1180
- fnAliasMap.set(m.fnName, (count.get(m.fnName) ?? 0) === 1 ? m.canonicalName : null);
1453
+ fnAliasMap.set(m.fnName, (count.get(m.fnName) ?? 0) === 1 ? m.functionKey : null);
1181
1454
  }
1182
- function getOrCreateFunctionChannel(canonicalName) {
1183
- let ch = functionChannels.get(canonicalName);
1455
+ function getOrCreateFunctionChannel(functionKey) {
1456
+ let ch = functionChannels.get(functionKey);
1184
1457
  if (!ch) {
1185
1458
  const tlsOpts = effectiveWorkerTLS;
1186
- const creds = tlsOpts?.caCert && tlsOpts.cert && tlsOpts.key ? workerClientCredentials(tlsOpts) : grpc.credentials.createInsecure();
1187
- ch = new grpc.Channel(`sb://localhost/${clientId}/${canonicalName}`, creds, {
1459
+ const creds = tlsOpts?.caCert && tlsOpts.cert && tlsOpts.key ? workerClientCredentials(tlsOpts) : grpc2.credentials.createInsecure();
1460
+ ch = new grpc2.Channel(`sb://localhost/${clientId}/${functionKey}`, creds, {
1188
1461
  ...workerChannelOptions(tlsOpts ?? undefined),
1189
1462
  "grpc.lb_policy_name": "round_robin"
1190
1463
  });
1191
- functionChannels.set(canonicalName, ch);
1464
+ functionChannels.set(functionKey, ch);
1192
1465
  }
1193
1466
  return ch;
1194
1467
  }
@@ -1239,7 +1512,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1239
1512
  return;
1240
1513
  const channel = stub.getChannel();
1241
1514
  const state = channel.getConnectivityState(true);
1242
- if (state === grpc.connectivityState.READY) {
1515
+ if (state === grpc2.connectivityState.READY) {
1243
1516
  if (!isOnline) {
1244
1517
  isOnline = true;
1245
1518
  const queueLen = offlineQueue.length;
@@ -1251,7 +1524,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1251
1524
  reportSDKError("flush-on-restore", err);
1252
1525
  });
1253
1526
  }
1254
- } else if (state === grpc.connectivityState.TRANSIENT_FAILURE) {
1527
+ } else if (state === grpc2.connectivityState.TRANSIENT_FAILURE) {
1255
1528
  if (isOnline) {
1256
1529
  isOnline = false;
1257
1530
  console.warn("[servicebridge] lost connection to runtime — entering offline mode");
@@ -1267,12 +1540,12 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1267
1540
  }
1268
1541
  function isConnectionError(e) {
1269
1542
  const code = e?.code;
1270
- return code === grpc.status.UNAVAILABLE || code === grpc.status.UNKNOWN;
1543
+ return code === grpc2.status.UNAVAILABLE || code === grpc2.status.UNKNOWN;
1271
1544
  }
1272
1545
  function normalizeUnknownErrorMessage(error) {
1273
1546
  return error instanceof Error ? error.message : String(error);
1274
1547
  }
1275
- function reportCallStartAsync(traceId, spanId, parentSpanId, fn, startedAt, inputBuf, attempt, spanType) {
1548
+ function reportCallStartAsync(traceId, spanId, parentSpanId, fn, startedAt, inputBuf, attempt, spanType, targetService) {
1276
1549
  if (!isOnline) {
1277
1550
  enqueueOffline({
1278
1551
  type: "reportCallStart",
@@ -1281,6 +1554,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1281
1554
  parentSpanId,
1282
1555
  fn,
1283
1556
  spanType,
1557
+ targetService,
1284
1558
  startedAt,
1285
1559
  inputBuf,
1286
1560
  attempt
@@ -1293,6 +1567,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1293
1567
  parentSpanId,
1294
1568
  fn,
1295
1569
  spanType,
1570
+ targetService,
1296
1571
  startedAt,
1297
1572
  inputBuf,
1298
1573
  attempt
@@ -1310,6 +1585,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1310
1585
  parentSpanId,
1311
1586
  fn,
1312
1587
  spanType,
1588
+ targetService,
1313
1589
  startedAt,
1314
1590
  inputBuf,
1315
1591
  attempt
@@ -1319,7 +1595,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1319
1595
  reportSDKError("report-call-start", err);
1320
1596
  });
1321
1597
  }
1322
- function reportCallAsync(traceId, spanId, fn, startedAt, inputBuf, success, attempt, outputBuf, error = "", spanType, parentSpanId = "") {
1598
+ function reportCallAsync(traceId, spanId, fn, startedAt, inputBuf, success, attempt, outputBuf, error = "", spanType, parentSpanId = "", targetService) {
1323
1599
  const durationMs = computeDurationMs(startedAt);
1324
1600
  if (!isOnline) {
1325
1601
  enqueueOffline({
@@ -1328,6 +1604,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1328
1604
  spanId,
1329
1605
  fn,
1330
1606
  spanType,
1607
+ targetService,
1331
1608
  parentSpanId,
1332
1609
  startedAt,
1333
1610
  durationMs,
@@ -1344,6 +1621,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1344
1621
  spanId,
1345
1622
  fn,
1346
1623
  spanType,
1624
+ targetService,
1347
1625
  parentSpanId,
1348
1626
  startedAt,
1349
1627
  durationMs,
@@ -1365,6 +1643,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1365
1643
  spanId,
1366
1644
  fn,
1367
1645
  spanType,
1646
+ targetService,
1368
1647
  parentSpanId,
1369
1648
  startedAt,
1370
1649
  durationMs,
@@ -1397,7 +1676,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1397
1676
  headers: toWireStringMap(op.opts?.headers),
1398
1677
  trace_id: op.opts?.traceId ?? "",
1399
1678
  parent_span_id: op.opts?.parentSpanId ?? "",
1400
- producer_service: service,
1679
+ producer_service: defaultConsumerPrefix,
1401
1680
  idempotency_key: op.opts?.idempotencyKey ?? ""
1402
1681
  }, meta, unaryDeadlineOptions(), (err) => err ? rej(err) : res());
1403
1682
  });
@@ -1453,12 +1732,12 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1453
1732
  }
1454
1733
  function isRegistryResyncRequiredError(e) {
1455
1734
  const code = e?.code;
1456
- return code === grpc.status.NOT_FOUND || code === grpc.status.FAILED_PRECONDITION;
1735
+ return code === grpc2.status.NOT_FOUND || code === grpc2.status.FAILED_PRECONDITION;
1457
1736
  }
1458
1737
  async function sendHeartbeat() {
1459
- if (!serveState)
1738
+ if (!startState)
1460
1739
  return;
1461
- const state = serveState;
1740
+ const state = startState;
1462
1741
  const metrics = getProcessMetrics();
1463
1742
  const hbMsg = {
1464
1743
  endpoint: state.endpoint,
@@ -1475,19 +1754,19 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1475
1754
  }
1476
1755
  async function sendHttpHeartbeat(_instanceId) {}
1477
1756
  async function reconcileRegistrations(reason) {
1478
- if (!serveState)
1757
+ if (!startState)
1479
1758
  return;
1480
1759
  if (registrationSyncPromise) {
1481
1760
  if (!registrationFollowUpPromise) {
1482
1761
  registrationFollowUpPromise = registrationSyncPromise.catch(() => {}).then(() => {
1483
1762
  registrationFollowUpPromise = null;
1484
- if (serveState)
1485
- return reconcileRegistrations(reason + "-followup");
1763
+ if (startState)
1764
+ return reconcileRegistrations(`${reason}-followup`);
1486
1765
  });
1487
1766
  }
1488
1767
  return registrationFollowUpPromise;
1489
1768
  }
1490
- const state = serveState;
1769
+ const state = startState;
1491
1770
  registrationSyncPromise = (async () => {
1492
1771
  const functions = Array.from(fnHandlers.entries()).map(([fn, fnEntry]) => ({
1493
1772
  fn_name: fn,
@@ -1529,7 +1808,6 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1529
1808
  await new Promise((resolve, reject) => {
1530
1809
  stub.Reconcile({
1531
1810
  identity: {
1532
- service_name: service,
1533
1811
  instance_id: state.instanceId,
1534
1812
  endpoint: state.endpoint,
1535
1813
  transport: state.transport
@@ -1544,7 +1822,12 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1544
1822
  metrics: {
1545
1823
  cpu_percent: metrics.cpuPercent ?? null,
1546
1824
  ram_mb: metrics.ramMb ?? null
1547
- }
1825
+ },
1826
+ outgoing_dependencies: outgoingDeps.map((d) => ({
1827
+ dep_type: d.dep_type === "rpc" ? 1 : d.dep_type === "event" ? 2 : d.dep_type === "workflow" ? 3 : 0,
1828
+ target_service: d.target_service,
1829
+ target_resource: d.target_resource
1830
+ }))
1548
1831
  }, meta, unaryDeadlineOptions(), (err) => err ? reject(normalizeServiceError(err, `reconcile:${reason}`)) : resolve());
1549
1832
  });
1550
1833
  registeredGroups.clear();
@@ -1563,11 +1846,11 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1563
1846
  return Math.max(1000, base + offset);
1564
1847
  }
1565
1848
  async function heartbeatTick() {
1566
- if (!serveState || stopped)
1849
+ if (!startState || stopped)
1567
1850
  return;
1568
1851
  try {
1569
1852
  await sendHeartbeat();
1570
- const state = serveState;
1853
+ const state = startState;
1571
1854
  if (state?.instanceId) {
1572
1855
  try {
1573
1856
  await sendHttpHeartbeat(state.instanceId);
@@ -1588,13 +1871,13 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1588
1871
  reportSDKError("heartbeat", err);
1589
1872
  }
1590
1873
  } finally {
1591
- if (!stopped && serveState) {
1874
+ if (!stopped && startState) {
1592
1875
  scheduleNextHeartbeat();
1593
1876
  }
1594
1877
  }
1595
1878
  }
1596
1879
  function scheduleNextHeartbeat(delayMs = nextHeartbeatDelayMs()) {
1597
- if (!serveState || stopped)
1880
+ if (!startState || stopped)
1598
1881
  return;
1599
1882
  if (heartbeatTimer)
1600
1883
  clearTimeout(heartbeatTimer);
@@ -1605,12 +1888,25 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1605
1888
  });
1606
1889
  }, delayMs);
1607
1890
  }
1608
- function makeStreamWriter(runId) {
1891
+ function makeStreamWriter(traceId) {
1609
1892
  const append = (data, key = "default") => {
1610
- if (!isOnline || !runId)
1893
+ if (!isOnline || !traceId)
1611
1894
  return Promise.resolve();
1612
- const dataBuf = Buffer.from(JSON.stringify(data));
1613
- if (sessionSend({ stream_append: { run_id: runId, key, data: dataBuf } })) {
1895
+ const dataBuf = (() => {
1896
+ if (Buffer.isBuffer(data)) {
1897
+ return data;
1898
+ }
1899
+ if (data instanceof Uint8Array) {
1900
+ return Buffer.from(data);
1901
+ }
1902
+ if (typeof data === "string") {
1903
+ return Buffer.from(data, "utf8");
1904
+ }
1905
+ return Buffer.from(JSON.stringify(data));
1906
+ })();
1907
+ if (sessionSend({
1908
+ stream_append: { trace_id: traceId, key, data: dataBuf }
1909
+ })) {
1614
1910
  return Promise.resolve();
1615
1911
  }
1616
1912
  return Promise.resolve();
@@ -1621,14 +1917,9 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1621
1917
  };
1622
1918
  }
1623
1919
  function lookupFnHandler(name) {
1624
- if (fnHandlers.has(name))
1625
- return fnHandlers.get(name);
1626
- const slash = name.lastIndexOf("/");
1627
- if (slash >= 0)
1628
- return fnHandlers.get(name.slice(slash + 1));
1629
- return;
1920
+ return fnHandlers.get(name);
1630
1921
  }
1631
- async function invokeRpcHandler(req, runId) {
1922
+ async function invokeRpcHandler(req, traceId) {
1632
1923
  const entry = lookupFnHandler(req.function_name || "");
1633
1924
  if (!entry) {
1634
1925
  return {
@@ -1660,7 +1951,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1660
1951
  const rpcCtx = {
1661
1952
  traceId: traceCtx.traceId,
1662
1953
  spanId: traceCtx.spanId,
1663
- stream: makeStreamWriter(runId)
1954
+ stream: makeStreamWriter(traceId)
1664
1955
  };
1665
1956
  try {
1666
1957
  const result = await entry.handler(parsed, rpcCtx);
@@ -1675,7 +1966,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1675
1966
  }
1676
1967
  });
1677
1968
  }
1678
- async function invokeEventHandler(req, runId) {
1969
+ async function invokeEventHandler(req, traceId) {
1679
1970
  const groupName = typeof req.group_name === "string" ? req.group_name : undefined;
1680
1971
  const entry = groupName ? eventHandlers.get(groupName) : undefined;
1681
1972
  if (!entry) {
@@ -1714,7 +2005,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1714
2005
  reject(reason) {
1715
2006
  rejectReason = reason || "rejected_by_consumer";
1716
2007
  },
1717
- stream: makeStreamWriter(runId)
2008
+ stream: makeStreamWriter(traceId)
1718
2009
  };
1719
2010
  try {
1720
2011
  await entry.handler(parsed, ctx);
@@ -1744,13 +2035,13 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1744
2035
  const allowedCallers = entry?.opts.allowedCallers;
1745
2036
  if (!requirePeerCN(call, allowedCallers, false)) {
1746
2037
  cb({
1747
- code: grpc.status.UNAUTHENTICATED,
2038
+ code: grpc2.status.UNAUTHENTICATED,
1748
2039
  message: "mTLS client cert required"
1749
2040
  });
1750
2041
  return;
1751
2042
  }
1752
- const runIdMeta = call.metadata.get("servicebridge-run-id");
1753
- const runId = typeof runIdMeta[0] === "string" ? runIdMeta[0] : "";
2043
+ const traceIdMeta = call.metadata.get("servicebridge-trace-id");
2044
+ const traceId = typeof traceIdMeta[0] === "string" ? traceIdMeta[0] : "";
1754
2045
  const workerTraceId = call.request.trace_id || crypto.randomUUID();
1755
2046
  const workerSpanId = call.request.span_id || crypto.randomUUID();
1756
2047
  const workerParentSpanId = call.request.parent_span_id || "";
@@ -1759,14 +2050,14 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1759
2050
  const rpcStartedAt = Date.now();
1760
2051
  const rpcInputBuf = call.request.payload ?? Buffer.alloc(0);
1761
2052
  reportCallStartAsync(workerTraceId, workerSpanId, workerParentSpanId, fnName, rpcStartedAt, rpcInputBuf, 1, workerSpanType);
1762
- const response = await invokeRpcHandler(call.request, runId);
2053
+ const response = await invokeRpcHandler(call.request, workerTraceId || traceId);
1763
2054
  reportCallAsync(workerTraceId, workerSpanId, fnName, rpcStartedAt, rpcInputBuf, response.success ?? true, 1, response.output ?? Buffer.alloc(0), response.error ?? "", workerSpanType, workerParentSpanId);
1764
2055
  cb(null, response);
1765
2056
  }
1766
2057
  async function handleDeliver(call, cb) {
1767
2058
  const req = call.request;
1768
- const runIdMeta = call.metadata.get("servicebridge-run-id");
1769
- const runId = typeof runIdMeta[0] === "string" ? runIdMeta[0] : "";
2059
+ const traceIdMeta = call.metadata.get("servicebridge-trace-id");
2060
+ const traceId = typeof traceIdMeta[0] === "string" ? traceIdMeta[0] : "";
1770
2061
  const result = await invokeEventHandler({
1771
2062
  message_id: String(req.message_id ?? ""),
1772
2063
  group_name: String(req.group_name ?? ""),
@@ -1776,7 +2067,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1776
2067
  trace_id: String(req.trace_id ?? ""),
1777
2068
  parent_span_id: String(req.parent_span_id ?? ""),
1778
2069
  attempt: Number(req.attempt ?? 0)
1779
- }, runId);
2070
+ }, traceId);
1780
2071
  cb(null, {
1781
2072
  ack: result.ack === true,
1782
2073
  error: result.error ?? "",
@@ -1826,46 +2117,75 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1826
2117
  try {
1827
2118
  if (deadlineUnixMs > 0 && Date.now() > deadlineUnixMs) {
1828
2119
  result.error = "command deadline exceeded";
1829
- } else if (command.rpc) {
1830
- const rpc = command.rpc;
1831
- const rpcParentSpanId = String(rpc.parent_span_id ?? "");
1832
- const rpcSpanType = "rpc";
1833
- const rpcReq = {
1834
- function_name: String(rpc.fn ?? ""),
1835
- payload: rpc.payload ? Buffer.from(rpc.payload) : Buffer.alloc(0),
1836
- trace_id: String(rpc.trace_id ?? ""),
1837
- span_id: String(rpc.span_id ?? ""),
1838
- parent_span_id: rpcParentSpanId
1839
- };
1840
- const workerTraceId = rpcReq.trace_id || crypto.randomUUID();
1841
- const workerSpanId = rpcReq.span_id || crypto.randomUUID();
1842
- const fnName = rpcReq.function_name;
1843
- const rpcStartedAt = Date.now();
1844
- reportCallStartAsync(workerTraceId, workerSpanId, rpcParentSpanId, fnName, rpcStartedAt, rpcReq.payload, 1, rpcSpanType);
1845
- const rpcResult = await invokeRpcHandler(rpcReq, String(rpc.run_id ?? ""));
1846
- reportCallAsync(workerTraceId, workerSpanId, fnName, rpcStartedAt, rpcReq.payload, rpcResult.success, 1, rpcResult.output ?? Buffer.alloc(0), rpcResult.error ?? "", rpcSpanType, rpcParentSpanId);
1847
- result.success = rpcResult.success;
1848
- result.output = rpcResult.output ?? Buffer.alloc(0);
1849
- result.error = rpcResult.error ?? "";
1850
- } else if (command.event) {
1851
- const event = command.event;
1852
- const eventResult = await invokeEventHandler({
1853
- message_id: String(event.message_id ?? ""),
1854
- group_name: String(event.group_name ?? ""),
1855
- topic: String(event.topic ?? ""),
1856
- payload: event.payload ? Buffer.from(event.payload) : Buffer.alloc(0),
1857
- headers: fromWireStringMap(event.headers),
1858
- trace_id: String(event.trace_id ?? ""),
1859
- parent_span_id: String(event.parent_span_id ?? ""),
1860
- attempt: Number(event.attempt ?? 0)
1861
- }, String(event.run_id ?? ""));
1862
- result.success = eventResult.ack === true;
1863
- result.ack = eventResult.ack === true;
1864
- result.retry_after_ms = eventResult.retry_after_ms ?? 0;
1865
- result.reject_reason = eventResult.reject_reason ?? "";
1866
- result.error = eventResult.error ?? "";
2120
+ } else if (command.task_command) {
2121
+ const tc = command.task_command;
2122
+ const tcMeta = fromWireStringMap(tc.meta);
2123
+ if (tc.type === 1 || tc.type === "TYPE_RPC") {
2124
+ const fn = tcMeta.fn ?? "";
2125
+ const tcParentSpanId = String(tc.parent_span_id ?? "");
2126
+ const tcReq = {
2127
+ function_name: fn,
2128
+ payload: tc.payload ? Buffer.from(tc.payload) : Buffer.alloc(0),
2129
+ trace_id: String(tc.trace_id ?? ""),
2130
+ span_id: String(tc.span_id ?? ""),
2131
+ parent_span_id: tcParentSpanId
2132
+ };
2133
+ const tcTraceId = tcReq.trace_id || crypto.randomUUID();
2134
+ const tcSpanId = tcReq.span_id || crypto.randomUUID();
2135
+ const tcStartedAt = Date.now();
2136
+ const tcStreamTraceId = tcMeta.trace_id ?? "";
2137
+ reportCallStartAsync(tcTraceId, tcSpanId, tcParentSpanId, fn, tcStartedAt, tcReq.payload, tc.attempt ?? 1, "rpc");
2138
+ const tcResult = await invokeRpcHandler(tcReq, tcStreamTraceId);
2139
+ reportCallAsync(tcTraceId, tcSpanId, fn, tcStartedAt, tcReq.payload, tcResult.success, tc.attempt ?? 1, tcResult.output ?? Buffer.alloc(0), tcResult.error ?? "", "rpc", tcParentSpanId);
2140
+ result.success = tcResult.success;
2141
+ result.output = tcResult.output ?? Buffer.alloc(0);
2142
+ result.error = tcResult.error ?? "";
2143
+ } else if (tc.type === 2 || tc.type === "TYPE_EVENT") {
2144
+ const evTraceId = String(tc.trace_id ?? "");
2145
+ const evParentSpanId = String(tc.parent_span_id ?? "");
2146
+ const evSpanId = String(tc.span_id ?? "") || crypto.randomUUID();
2147
+ const evTopic = tcMeta.topic ?? "";
2148
+ const evGroupName = tcMeta.group ?? tcMeta.group_name ?? "";
2149
+ const evMessageId = tcMeta.message_id ?? "";
2150
+ const evStreamTraceId = tcMeta.trace_id ?? "";
2151
+ const evAttempt = tc.attempt ?? 0;
2152
+ const evPayload = tc.payload ? Buffer.from(tc.payload) : Buffer.alloc(0);
2153
+ const reservedMetaKeys = new Set([
2154
+ "fn",
2155
+ "topic",
2156
+ "group",
2157
+ "group_name",
2158
+ "message_id",
2159
+ "trace_id"
2160
+ ]);
2161
+ const evHeaders = {};
2162
+ for (const [k, v] of Object.entries(tcMeta)) {
2163
+ if (!reservedMetaKeys.has(k))
2164
+ evHeaders[k] = v;
2165
+ }
2166
+ const evStartedAt = Date.now();
2167
+ reportCallStartAsync(evTraceId, evSpanId, evParentSpanId, evTopic, evStartedAt, evPayload, Number(evAttempt), "event");
2168
+ const evResult = await invokeEventHandler({
2169
+ message_id: evMessageId,
2170
+ group_name: evGroupName,
2171
+ topic: evTopic,
2172
+ payload: evPayload,
2173
+ headers: evHeaders,
2174
+ trace_id: evTraceId,
2175
+ parent_span_id: evParentSpanId,
2176
+ attempt: Number(evAttempt)
2177
+ }, evStreamTraceId);
2178
+ reportCallAsync(evTraceId, evSpanId, evTopic, evStartedAt, evPayload, evResult.ack === true, Number(evAttempt), Buffer.alloc(0), evResult.error ?? "", "event", evParentSpanId);
2179
+ result.success = evResult.ack === true;
2180
+ result.ack = evResult.ack === true;
2181
+ result.retry_after_ms = evResult.retry_after_ms ?? 0;
2182
+ result.reject_reason = evResult.reject_reason ?? "";
2183
+ result.error = evResult.error ?? "";
2184
+ } else {
2185
+ result.error = `unsupported task_command type: ${tc.type}`;
2186
+ }
1867
2187
  } else {
1868
- result.error = "unsupported worker command: no rpc or event task";
2188
+ result.error = "unsupported worker command: missing task_command";
1869
2189
  }
1870
2190
  } catch (err) {
1871
2191
  result.error = normalizeUnknownErrorMessage(err);
@@ -1877,7 +2197,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1877
2197
  }
1878
2198
  }
1879
2199
  function scheduleWorkerSessionReconnect(delayMs = 1000) {
1880
- if (stopped || !serveState || workerSessionReconnectTimer)
2200
+ if (stopped || !startState || workerSessionReconnectTimer)
1881
2201
  return;
1882
2202
  workerSessionReconnectTimer = setTimeout(() => {
1883
2203
  workerSessionReconnectTimer = null;
@@ -1899,18 +2219,23 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1899
2219
  };
1900
2220
  }
1901
2221
  async function openWorkerSession(initial) {
1902
- if (!serveState) {
1903
- throw new Error("serve() state is not initialized");
2222
+ if (!startState) {
2223
+ throw new ServiceBridgeError({
2224
+ code: SB.START_STATE_NOT_INITIALIZED,
2225
+ message: SB_MESSAGES[SB.START_STATE_NOT_INITIALIZED],
2226
+ component: "sdk",
2227
+ operation: "open-worker-session",
2228
+ severity: "fatal"
2229
+ });
1904
2230
  }
1905
2231
  if (workerSessionStream)
1906
2232
  return;
1907
2233
  if (!v2Session) {
1908
2234
  v2Session = new V2SessionClient({
1909
2235
  serverAddress: target,
1910
- serviceName: service,
1911
- instanceId: serveState.instanceId,
2236
+ instanceId: startState.instanceId,
1912
2237
  transportMode: "direct",
1913
- maxInflight: serveState.maxInFlight,
2238
+ maxInflight: startState.maxInFlight,
1914
2239
  minInflight: 1
1915
2240
  });
1916
2241
  }
@@ -1920,10 +2245,9 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1920
2245
  stream.write({
1921
2246
  hello: {
1922
2247
  identity: {
1923
- service_name: hf.identity.serviceName,
1924
2248
  instance_id: hf.identity.instanceId,
1925
- endpoint: serveState.endpoint,
1926
- transport: serveState.transport
2249
+ endpoint: startState.endpoint,
2250
+ transport: startState.transport
1927
2251
  },
1928
2252
  max_inflight: hf.maxInflight,
1929
2253
  min_inflight: hf.minInflight,
@@ -1989,6 +2313,26 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
1989
2313
  if (msg.flow_update && v2Session) {
1990
2314
  v2Session.onFlowControlUpdate(msg.flow_update.new_window_size ?? 0, msg.flow_update.reason ?? "");
1991
2315
  }
2316
+ if (msg.publish_ack) {
2317
+ const ack = msg.publish_ack;
2318
+ const reqId = ack.request_id ?? "";
2319
+ const pending = pendingPublishAcks.get(reqId);
2320
+ if (pending) {
2321
+ pendingPublishAcks.delete(reqId);
2322
+ clearTimeout(pending.timer);
2323
+ if (ack.error) {
2324
+ pending.reject(new ServiceBridgeError({
2325
+ code: SB.NON_GRPC,
2326
+ message: ack.error,
2327
+ component: "sdk",
2328
+ operation: "publish-event-ack",
2329
+ severity: "fatal"
2330
+ }));
2331
+ } else {
2332
+ pending.resolve(ack.message_id ?? "");
2333
+ }
2334
+ }
2335
+ }
1992
2336
  if (msg.dispatch) {
1993
2337
  processWorkerSessionCommand(msg.dispatch).catch((err) => {
1994
2338
  reportSDKError("worker-session-command", err);
@@ -2010,7 +2354,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2010
2354
  if (err != null) {
2011
2355
  reportSDKError(operation, err);
2012
2356
  }
2013
- if (!stopped && serveState) {
2357
+ if (!stopped && startState) {
2014
2358
  scheduleWorkerSessionReconnect();
2015
2359
  }
2016
2360
  };
@@ -2022,57 +2366,83 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2022
2366
  }
2023
2367
  }
2024
2368
  const svc = {
2025
- async rpc(fn, payload, opts) {
2369
+ async rpc(fn, payload, opts2) {
2026
2370
  try {
2027
2371
  await _controlReady;
2028
2372
  } catch (err) {
2029
2373
  throw normalizeServiceError(err, "control-plane");
2030
2374
  }
2375
+ const lookupKey = fn.trim();
2376
+ if (!lookupKey) {
2377
+ throw new ServiceBridgeError({
2378
+ code: SB.RPC_FN_REQUIRED,
2379
+ message: SB_MESSAGES[SB.RPC_FN_REQUIRED],
2380
+ component: "sdk",
2381
+ operation: "rpc",
2382
+ severity: "fatal"
2383
+ });
2384
+ }
2031
2385
  const tc = traceStorage.getStore();
2032
- const traceId = opts?.traceId ?? tc?.traceId ?? crypto.randomUUID();
2033
- const maxRetries = normalizeNonNegativeInt(opts?.retries ?? globalOpts.retries ?? 3, 3);
2034
- const baseDelay = normalizePositiveInt(opts?.retryDelay ?? globalOpts.retryDelay ?? 300, 300);
2035
- const timeout = normalizePositiveInt(opts?.timeout ?? globalOpts.timeout ?? 30000, 30000);
2036
- let canonical = resolveCanonical(fn);
2037
- if (!canonical) {
2038
- await doLookupFunction(fn);
2039
- canonical = resolveCanonical(fn);
2386
+ const traceId = opts2?.traceId ?? tc?.traceId ?? crypto.randomUUID();
2387
+ const maxRetries = normalizeNonNegativeInt(opts2?.retries ?? globalOpts.retries ?? 3, 3);
2388
+ const baseDelay = normalizePositiveInt(opts2?.retryDelay ?? globalOpts.retryDelay ?? 300, 300);
2389
+ const timeout = normalizePositiveInt(opts2?.timeout ?? globalOpts.timeout ?? 30000, 30000);
2390
+ let functionKey = resolveFunctionKey(lookupKey);
2391
+ if (!functionKey) {
2392
+ await doLookupFunction(lookupKey);
2393
+ functionKey = resolveFunctionKey(lookupKey);
2040
2394
  }
2041
- if (!canonical)
2042
- throw normalizeServiceError(new Error(`No endpoints available for RPC: ${fn}`), fn, "worker");
2043
- const fmeta = functionMeta.get(canonical);
2395
+ if (!functionKey) {
2396
+ throw new ServiceBridgeError({
2397
+ code: SB.NO_RPC_ENDPOINTS,
2398
+ message: `No endpoints available for RPC: ${lookupKey}`,
2399
+ component: "worker",
2400
+ operation: lookupKey,
2401
+ severity: "fatal"
2402
+ });
2403
+ }
2404
+ assertOutboundRpcDeclaredForTarget(functionKey);
2405
+ const fmeta = functionMeta.get(functionKey);
2044
2406
  if (fmeta && !containsOrAll(fmeta.allowedCallers, service)) {
2045
- throw new Error(`Service "${service}" is not allowed to call "${fn}". ` + `Permitted callers: ${fmeta.allowedCallers.join(", ")}`);
2407
+ throw new ServiceBridgeError({
2408
+ code: SB.RPC_CALLER_NOT_ALLOWED,
2409
+ message: `Service "${service}" is not allowed to call "${lookupKey}". Permitted callers: ${fmeta.allowedCallers.join(", ") || "(none)"}.`,
2410
+ component: "sdk",
2411
+ operation: "rpc",
2412
+ severity: "fatal"
2413
+ });
2046
2414
  }
2047
2415
  const inputSchema = fmeta?.inputSchema;
2048
2416
  const outputSchema = fmeta?.outputSchema;
2049
2417
  const inputBuf = inputSchema ? encodeWithSchema(inputSchema, payload) : toJsonBuffer(payload);
2050
2418
  const telemetryInputBuf = toJsonBuffer(payload);
2419
+ const rpcFnName = fmeta?.fnName ?? lookupKey;
2420
+ const rpcServiceName = fmeta?.serviceName ?? "";
2051
2421
  const rootSpanId = crypto.randomUUID();
2052
- const parentSpanId = opts?.parentSpanId ?? tc?.spanId ?? "";
2422
+ const parentSpanId = opts2?.parentSpanId ?? tc?.spanId ?? "";
2053
2423
  const rootStartedAt = Date.now();
2054
2424
  const hasRetries = maxRetries > 0;
2055
- reportCallStartAsync(traceId, rootSpanId, parentSpanId, canonical, rootStartedAt, telemetryInputBuf, 1, "rpc");
2425
+ reportCallStartAsync(traceId, rootSpanId, parentSpanId, rpcFnName, rootStartedAt, telemetryInputBuf, 1, "rpc", rpcServiceName);
2056
2426
  return traceStorage.run({ traceId, spanId: rootSpanId }, async () => {
2057
- if (opts?.mode === "proxy") {
2427
+ if (opts2?.mode === "proxy") {
2058
2428
  return await new Promise((resolve, reject) => {
2059
2429
  stub.ProxyCall({
2060
- function_name: canonical,
2430
+ function_name: rpcFnName,
2061
2431
  payload: inputBuf,
2062
2432
  trace_id: traceId,
2063
2433
  span_id: rootSpanId,
2064
2434
  timeout_ms: timeout
2065
2435
  }, meta, { deadline: new Date(Date.now() + timeout) }, (err, res) => {
2066
2436
  if (err) {
2067
- reportCallAsync(traceId, rootSpanId, canonical, rootStartedAt, telemetryInputBuf, false, 1, undefined, String(err), "rpc", parentSpanId);
2068
- return reject(normalizeServiceError(err, fn, "control-plane"));
2437
+ reportCallAsync(traceId, rootSpanId, rpcFnName, rootStartedAt, telemetryInputBuf, false, 1, undefined, String(err), "rpc", parentSpanId, rpcServiceName);
2438
+ return reject(normalizeServiceError(err, lookupKey, "control-plane"));
2069
2439
  }
2070
2440
  if (!res?.success) {
2071
2441
  const errMsg = res?.error ?? "proxy call failed";
2072
- reportCallAsync(traceId, rootSpanId, canonical, rootStartedAt, telemetryInputBuf, false, 1, undefined, errMsg, "rpc", parentSpanId);
2073
- return reject(normalizeServiceError(new Error(errMsg), fn, "worker"));
2442
+ reportCallAsync(traceId, rootSpanId, rpcFnName, rootStartedAt, telemetryInputBuf, false, 1, undefined, errMsg, "rpc", parentSpanId, rpcServiceName);
2443
+ return reject(normalizeServiceError(new Error(errMsg), lookupKey, "worker"));
2074
2444
  }
2075
- reportCallAsync(traceId, rootSpanId, canonical, rootStartedAt, telemetryInputBuf, true, 1, res.output, "", "rpc", parentSpanId);
2445
+ reportCallAsync(traceId, rootSpanId, rpcFnName, rootStartedAt, telemetryInputBuf, true, 1, res.output, "", "rpc", parentSpanId, rpcServiceName);
2076
2446
  try {
2077
2447
  const out = res.output?.length ? outputSchema ? decodeWithSchema(outputSchema, res.output) : JSON.parse(res.output.toString()) : undefined;
2078
2448
  resolve(out);
@@ -2083,23 +2453,29 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2083
2453
  });
2084
2454
  }
2085
2455
  await ensureCallerTLS();
2086
- const channel = getOrCreateFunctionChannel(canonical);
2087
- const workerClient = new WorkerHandlerService("__channel__", grpc.credentials.createInsecure(), { channelOverride: channel });
2456
+ const channel = getOrCreateFunctionChannel(functionKey);
2457
+ const workerClient = new WorkerHandlerService("__channel__", grpc2.credentials.createInsecure(), { channelOverride: channel });
2088
2458
  let lastError;
2089
2459
  for (let attempt = 1;attempt <= maxRetries + 1; attempt++) {
2090
2460
  const attemptSpanId = hasRetries ? crypto.randomUUID() : rootSpanId;
2091
2461
  const attemptParentId = hasRetries ? rootSpanId : parentSpanId;
2092
- const attemptFn = canonical;
2093
2462
  const attemptStartedAt = hasRetries ? Date.now() : rootStartedAt;
2094
2463
  if (hasRetries) {
2095
- reportCallStartAsync(traceId, attemptSpanId, attemptParentId, attemptFn, attemptStartedAt, telemetryInputBuf, attempt, "rpc");
2464
+ reportCallStartAsync(traceId, attemptSpanId, attemptParentId, rpcFnName, attemptStartedAt, telemetryInputBuf, attempt, "rpc", rpcServiceName);
2096
2465
  }
2097
2466
  try {
2098
2467
  const attemptTimeoutMs = timeout;
2099
2468
  const deadline = new Date(Date.now() + attemptTimeoutMs);
2100
- const fn2 = fmeta?.fnName ?? canonical;
2101
- if (!fn2)
2102
- throw new Error("unreachable");
2469
+ const workerFnName = fmeta?.fnName ?? lookupKey;
2470
+ if (!workerFnName) {
2471
+ throw new ServiceBridgeError({
2472
+ code: SB.INTERNAL_INVARIANT_VIOLATION,
2473
+ message: SB_MESSAGES[SB.INTERNAL_INVARIANT_VIOLATION],
2474
+ component: "sdk",
2475
+ operation: "rpc",
2476
+ severity: "fatal"
2477
+ });
2478
+ }
2103
2479
  const res = await new Promise((resolve, reject) => {
2104
2480
  let settled = false;
2105
2481
  let unaryCall;
@@ -2110,7 +2486,13 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2110
2486
  try {
2111
2487
  unaryCall?.cancel?.();
2112
2488
  } catch {}
2113
- reject(new Error(`rpc attempt timeout after ${attemptTimeoutMs}ms`));
2489
+ reject(new ServiceBridgeError({
2490
+ code: SB.NON_GRPC,
2491
+ message: `rpc attempt timeout after ${attemptTimeoutMs}ms`,
2492
+ component: "sdk",
2493
+ operation: "rpc",
2494
+ severity: "fatal"
2495
+ }));
2114
2496
  }, attemptTimeoutMs);
2115
2497
  const finish = (err, response) => {
2116
2498
  if (settled)
@@ -2125,7 +2507,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2125
2507
  };
2126
2508
  try {
2127
2509
  unaryCall = workerClient.Handle({
2128
- function_name: fn2,
2510
+ function_name: workerFnName,
2129
2511
  payload: inputBuf,
2130
2512
  trace_id: traceId,
2131
2513
  span_id: attemptSpanId,
@@ -2135,40 +2517,47 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2135
2517
  finish(err);
2136
2518
  }
2137
2519
  });
2138
- if (!res?.success)
2139
- throw new Error(res?.error || "handler returned failure");
2520
+ if (!res?.success) {
2521
+ throw new ServiceBridgeError({
2522
+ code: SB.HANDLER_RETURNED_FAILURE,
2523
+ message: res?.error?.trim() || SB_MESSAGES[SB.HANDLER_RETURNED_FAILURE],
2524
+ component: "worker",
2525
+ operation: "rpc",
2526
+ severity: "fatal"
2527
+ });
2528
+ }
2140
2529
  const outputBuf = res.output ?? Buffer.alloc(0);
2141
2530
  const result = outputSchema ? decodeWithSchema(outputSchema, outputBuf) : outputBuf?.length ? JSON.parse(outputBuf.toString()) : {};
2142
2531
  const encodedOutput = outputBuf?.length ? toJsonBuffer(result) : Buffer.alloc(0);
2143
2532
  if (hasRetries) {
2144
- reportCallAsync(traceId, attemptSpanId, attemptFn, attemptStartedAt, telemetryInputBuf, true, attempt, encodedOutput, "", "rpc", attemptParentId);
2145
- reportCallAsync(traceId, rootSpanId, canonical, rootStartedAt, telemetryInputBuf, true, attempt, encodedOutput, "", "rpc", parentSpanId);
2533
+ reportCallAsync(traceId, attemptSpanId, rpcFnName, attemptStartedAt, telemetryInputBuf, true, attempt, encodedOutput, "", "rpc", attemptParentId, rpcServiceName);
2534
+ reportCallAsync(traceId, rootSpanId, rpcFnName, rootStartedAt, telemetryInputBuf, true, attempt, encodedOutput, "", "rpc", parentSpanId, rpcServiceName);
2146
2535
  } else {
2147
- reportCallAsync(traceId, rootSpanId, canonical, rootStartedAt, telemetryInputBuf, true, attempt, encodedOutput, "", "rpc", parentSpanId);
2536
+ reportCallAsync(traceId, rootSpanId, rpcFnName, rootStartedAt, telemetryInputBuf, true, attempt, encodedOutput, "", "rpc", parentSpanId, rpcServiceName);
2148
2537
  }
2149
2538
  return result;
2150
2539
  } catch (e) {
2151
2540
  lastError = e;
2152
2541
  const errMsg = normalizeUnknownErrorMessage(e);
2153
2542
  if (hasRetries) {
2154
- reportCallAsync(traceId, attemptSpanId, attemptFn, attemptStartedAt, telemetryInputBuf, false, attempt, undefined, errMsg, "rpc", attemptParentId);
2543
+ reportCallAsync(traceId, attemptSpanId, rpcFnName, attemptStartedAt, telemetryInputBuf, false, attempt, undefined, errMsg, "rpc", attemptParentId, rpcServiceName);
2155
2544
  if (attempt > maxRetries) {
2156
- reportCallAsync(traceId, rootSpanId, canonical, rootStartedAt, telemetryInputBuf, false, attempt, undefined, errMsg, "rpc", parentSpanId);
2545
+ reportCallAsync(traceId, rootSpanId, rpcFnName, rootStartedAt, telemetryInputBuf, false, attempt, undefined, errMsg, "rpc", parentSpanId, rpcServiceName);
2157
2546
  }
2158
2547
  } else {
2159
- reportCallAsync(traceId, rootSpanId, canonical, rootStartedAt, telemetryInputBuf, false, attempt, undefined, errMsg, "rpc", parentSpanId);
2548
+ reportCallAsync(traceId, rootSpanId, rpcFnName, rootStartedAt, telemetryInputBuf, false, attempt, undefined, errMsg, "rpc", parentSpanId, rpcServiceName);
2160
2549
  }
2161
2550
  if (attempt <= maxRetries) {
2162
2551
  await new Promise((r) => setTimeout(r, baseDelay * 2 ** (attempt - 1)));
2163
2552
  }
2164
2553
  }
2165
2554
  }
2166
- throw normalizeServiceError(lastError, fn, "worker");
2555
+ throw normalizeServiceError(lastError, lookupKey, "worker");
2167
2556
  });
2168
2557
  },
2169
- event(topic, payload, opts) {
2558
+ event(topic, payload, opts2) {
2170
2559
  if (!isOnline) {
2171
- enqueueOffline({ type: "event", topic, payload, opts });
2560
+ enqueueOffline({ type: "event", topic, payload, opts: opts2 });
2172
2561
  return Promise.resolve("");
2173
2562
  }
2174
2563
  const tc = traceStorage.getStore();
@@ -2176,23 +2565,85 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2176
2565
  stub.Publish({
2177
2566
  topic,
2178
2567
  payload: toJsonBuffer(payload),
2179
- headers: toWireStringMap(opts?.headers),
2180
- trace_id: opts?.traceId ?? tc?.traceId ?? "",
2181
- parent_span_id: opts?.parentSpanId ?? tc?.spanId ?? "",
2182
- producer_service: service,
2183
- idempotency_key: opts?.idempotencyKey ?? ""
2568
+ headers: toWireStringMap(opts2?.headers),
2569
+ trace_id: opts2?.traceId ?? tc?.traceId ?? "",
2570
+ parent_span_id: opts2?.parentSpanId ?? tc?.spanId ?? "",
2571
+ producer_service: defaultConsumerPrefix,
2572
+ idempotency_key: opts2?.idempotencyKey ?? ""
2184
2573
  }, meta, unaryDeadlineOptions(), (err, res) => err ? reject(normalizeServiceError(err, `publish:${topic}`)) : resolve(res?.message_id ?? ""));
2185
2574
  });
2186
2575
  },
2187
- handleRpc(fn, handler, opts) {
2188
- fnHandlers.set(fn, { handler, opts: opts ?? {} });
2576
+ publishEvent(topic, payload, opts2) {
2577
+ const stream = workerSessionStream;
2578
+ if (!stream) {
2579
+ return Promise.reject(new Error("publishEvent requires an active worker session (call start() first)"));
2580
+ }
2581
+ const tc = traceStorage.getStore();
2582
+ const requestId = crypto.randomUUID();
2583
+ const msg = {
2584
+ request_id: requestId,
2585
+ topic,
2586
+ payload: toJsonBuffer(payload),
2587
+ headers: toWireStringMap(opts2?.headers),
2588
+ trace_id: opts2?.traceId ?? tc?.traceId ?? "",
2589
+ parent_span_id: opts2?.parentSpanId ?? tc?.spanId ?? ""
2590
+ };
2591
+ return new Promise((resolve, reject) => {
2592
+ const timer = setTimeout(() => {
2593
+ pendingPublishAcks.delete(requestId);
2594
+ reject(new Error(`publishEvent timed out after 30 s (topic="${topic}", request_id="${requestId}")`));
2595
+ }, 30000);
2596
+ pendingPublishAcks.set(requestId, { resolve, reject, timer });
2597
+ try {
2598
+ stream.write({ publish_message: msg });
2599
+ } catch (err) {
2600
+ pendingPublishAcks.delete(requestId);
2601
+ clearTimeout(timer);
2602
+ reject(normalizeServiceError(err, `publish-event:${topic}`));
2603
+ }
2604
+ });
2605
+ },
2606
+ handleRpc(fn, handler, opts2) {
2607
+ assertRegistrationsNotFrozen("handle-rpc");
2608
+ fnHandlers.set(fn, { handler, opts: opts2 ?? {} });
2189
2609
  return svc;
2190
2610
  },
2191
- handleEvent(pattern, handler, opts) {
2192
- const normalizedOpts = opts ?? {};
2193
- const groupName = normalizedOpts.groupName || `${defaultConsumerPrefix}.${pattern}`;
2611
+ callsRpc(fn) {
2612
+ assertRegistrationsNotFrozen("calls-rpc");
2613
+ outgoingDeps.push({
2614
+ dep_type: "rpc",
2615
+ target_service: "",
2616
+ target_resource: fn
2617
+ });
2618
+ },
2619
+ callsEvent(topic) {
2620
+ assertRegistrationsNotFrozen("calls-event");
2621
+ outgoingDeps.push({
2622
+ dep_type: "event",
2623
+ target_service: "",
2624
+ target_resource: topic
2625
+ });
2626
+ },
2627
+ callsWorkflow(service2, name) {
2628
+ assertRegistrationsNotFrozen("calls-workflow");
2629
+ outgoingDeps.push({
2630
+ dep_type: "workflow",
2631
+ target_service: service2,
2632
+ target_resource: name
2633
+ });
2634
+ },
2635
+ handleEvent(pattern, handler, opts2) {
2636
+ assertRegistrationsNotFrozen("handle-event");
2637
+ const normalizedOpts = opts2 ?? {};
2638
+ const groupName = `${defaultConsumerPrefix}.${pattern}`;
2194
2639
  if (eventHandlers.has(groupName)) {
2195
- throw new Error(`Duplicate event consumer group "${groupName}". ` + "Use a distinct groupName for each handleEvent() registration.");
2640
+ throw new ServiceBridgeError({
2641
+ code: SB.DUPLICATE_EVENT_CONSUMER_GROUP,
2642
+ message: `${SB_MESSAGES[SB.DUPLICATE_EVENT_CONSUMER_GROUP]} Group: "${groupName}".`,
2643
+ component: "sdk",
2644
+ operation: "handle-event",
2645
+ severity: "fatal"
2646
+ });
2196
2647
  }
2197
2648
  eventHandlers.set(groupName, {
2198
2649
  groupName,
@@ -2202,37 +2653,53 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2202
2653
  });
2203
2654
  return svc;
2204
2655
  },
2205
- async serve(opts = {}) {
2206
- if (workerServer)
2207
- throw new Error("serve() already called");
2208
- if (fnHandlers.size === 0 && eventHandlers.size === 0) {
2209
- throw new Error("No handlers registered. Call handleRpc() or handleEvent() before serve().");
2656
+ async start(opts2 = {}) {
2657
+ if (workerServer) {
2658
+ throw new ServiceBridgeError({
2659
+ code: SB.START_ALREADY_CALLED,
2660
+ message: SB_MESSAGES[SB.START_ALREADY_CALLED],
2661
+ component: "sdk",
2662
+ operation: "start",
2663
+ severity: "fatal"
2664
+ });
2210
2665
  }
2211
- if (opts.maxInFlight != null && (!Number.isInteger(opts.maxInFlight) || opts.maxInFlight < 1)) {
2212
- throw new Error("serve() maxInFlight must be a positive integer");
2666
+ if (opts2.maxInFlight != null && (!Number.isInteger(opts2.maxInFlight) || opts2.maxInFlight < 1)) {
2667
+ throw new ServiceBridgeError({
2668
+ code: SB.START_INVALID_MAX_INFLIGHT,
2669
+ message: SB_MESSAGES[SB.START_INVALID_MAX_INFLIGHT],
2670
+ component: "sdk",
2671
+ operation: "start",
2672
+ severity: "fatal"
2673
+ });
2213
2674
  }
2214
2675
  try {
2215
- workerServer = new grpc.Server(channelOpts);
2676
+ workerServer = new grpc2.Server(channelOpts);
2216
2677
  workerServer.addService(WorkerHandlerService.service, {
2217
2678
  Handle: handleRpc,
2218
2679
  Deliver: handleDeliver
2219
2680
  });
2220
- const host = opts.host || "localhost";
2681
+ const host = opts2.host || "localhost";
2221
2682
  const isWildcardBind = host === "0.0.0.0" || host === "::";
2222
2683
  const advertiseHost = isWildcardBind ? await outboundIP() || host : host;
2223
- const tlsOpts = opts.tls ?? effectiveWorkerTLS ?? undefined;
2684
+ const tlsOpts = opts2.tls ?? effectiveWorkerTLS ?? undefined;
2224
2685
  let effectiveCert = toPemBuffer(tlsOpts?.cert);
2225
2686
  let effectiveKey = toPemBuffer(tlsOpts?.key);
2226
2687
  const explicitWorkerCACert = toPemBuffer(tlsOpts?.caCert);
2227
- let effectiveCACert = explicitWorkerCACert ? validateCAPem(explicitWorkerCACert, "invalid worker tls ca cert: malformed pem") : controlPlaneCA;
2688
+ let effectiveCACert = explicitWorkerCACert ? validateCAPem(explicitWorkerCACert, "The worker TLS CA certificate is not valid PEM.", SB.WORKER_TLS_CA_MALFORMED) : controlPlaneCA;
2228
2689
  if (effectiveCert && !effectiveKey || !effectiveCert && effectiveKey) {
2229
- throw new Error("workerTLS.cert and workerTLS.key must be provided together");
2690
+ throw new ServiceBridgeError({
2691
+ code: SB.WORKER_TLS_INCOMPLETE_PAIR,
2692
+ message: SB_MESSAGES[SB.WORKER_TLS_INCOMPLETE_PAIR],
2693
+ component: "sdk",
2694
+ operation: "start",
2695
+ severity: "fatal"
2696
+ });
2230
2697
  }
2231
2698
  if (effectiveCert && effectiveKey) {
2232
2699
  validateWorkerCertAndKeyPair(effectiveCert, effectiveKey);
2233
2700
  }
2234
2701
  if (!effectiveCert || !effectiveKey) {
2235
- const instanceIdForCert = opts.instanceId || Array.from(crypto.getRandomValues(new Uint8Array(3))).map((b) => b.toString(16).padStart(2, "0")).join("");
2702
+ const instanceIdForCert = opts2.instanceId || Array.from(crypto.getRandomValues(new Uint8Array(3))).map((b) => b.toString(16).padStart(2, "0")).join("");
2236
2703
  const provisioned = await provisionWorkerTLS(stub, meta, service, instanceIdForCert, isWildcardBind && advertiseHost !== host ? advertiseHost : undefined, isWildcardBind && advertiseHost !== host ? [advertiseHost] : undefined);
2237
2704
  effectiveCert = provisioned.cert;
2238
2705
  effectiveKey = provisioned.key;
@@ -2240,29 +2707,47 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2240
2707
  }
2241
2708
  let serverCreds;
2242
2709
  if (!effectiveCert || !effectiveKey) {
2243
- throw new Error("Worker TLS cert/key is required but was not provisioned");
2710
+ throw new ServiceBridgeError({
2711
+ code: SB.WORKER_TLS_NOT_PROVISIONED,
2712
+ message: SB_MESSAGES[SB.WORKER_TLS_NOT_PROVISIONED],
2713
+ component: "sdk",
2714
+ operation: "start",
2715
+ severity: "fatal"
2716
+ });
2244
2717
  } else {
2245
2718
  if (!effectiveCACert) {
2246
- throw new Error("TLS CA cert is required when using TLS for worker serve()");
2719
+ throw new ServiceBridgeError({
2720
+ code: SB.WORKER_TLS_CA_REQUIRED,
2721
+ message: SB_MESSAGES[SB.WORKER_TLS_CA_REQUIRED],
2722
+ component: "sdk",
2723
+ operation: "start",
2724
+ severity: "fatal"
2725
+ });
2247
2726
  }
2248
- serverCreds = grpc.ServerCredentials.createSsl(effectiveCACert, [{ private_key: effectiveKey, cert_chain: effectiveCert }], true);
2727
+ serverCreds = grpc2.ServerCredentials.createSsl(effectiveCACert, [{ private_key: effectiveKey, cert_chain: effectiveCert }], true);
2249
2728
  }
2250
2729
  const port = await new Promise((resolve, reject) => {
2251
2730
  const server = workerServer;
2252
2731
  if (!server) {
2253
- reject(new Error("Worker server is not initialized"));
2732
+ reject(new ServiceBridgeError({
2733
+ code: SB.WORKER_SERVER_NOT_INITIALIZED,
2734
+ message: SB_MESSAGES[SB.WORKER_SERVER_NOT_INITIALIZED],
2735
+ component: "sdk",
2736
+ operation: "start",
2737
+ severity: "fatal"
2738
+ }));
2254
2739
  return;
2255
2740
  }
2256
2741
  server.bindAsync(`${host}:0`, serverCreds, (err, p) => err ? reject(err) : resolve(p));
2257
2742
  });
2258
2743
  const endpoint = `${advertiseHost}:${port}`;
2259
- const instanceId = opts.instanceId || Array.from(crypto.getRandomValues(new Uint8Array(3))).map((b) => b.toString(16).padStart(2, "0")).join("");
2260
- serveState = {
2744
+ const instanceId = opts2.instanceId || Array.from(crypto.getRandomValues(new Uint8Array(3))).map((b) => b.toString(16).padStart(2, "0")).join("");
2745
+ startState = {
2261
2746
  endpoint,
2262
2747
  transport: "tls",
2263
- opts,
2748
+ opts: opts2,
2264
2749
  instanceId,
2265
- maxInFlight: Math.max(1, Math.trunc(opts.maxInFlight ?? 128))
2750
+ maxInFlight: Math.max(1, Math.trunc(opts2.maxInFlight ?? 128))
2266
2751
  };
2267
2752
  if (effectiveCACert && effectiveCert && effectiveKey) {
2268
2753
  effectiveWorkerTLS = {
@@ -2282,9 +2767,9 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2282
2767
  heartbeatTimer = null;
2283
2768
  registeredGroups.clear();
2284
2769
  closeWorkerSession();
2285
- serveState = null;
2770
+ startState = null;
2286
2771
  shutdownWorkerServerGracefully();
2287
- const fatal = normalizeServiceError(err, "serve");
2772
+ const fatal = normalizeServiceError(err, "start");
2288
2773
  console.error(`[servicebridge] startup failed: ${fatal.message}`);
2289
2774
  throw fatal;
2290
2775
  }
@@ -2305,14 +2790,9 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2305
2790
  _sbContexts.delete(clientId);
2306
2791
  offlineQueue.length = 0;
2307
2792
  shutdownWorkerServerGracefully();
2308
- serveState = null;
2793
+ startState = null;
2309
2794
  setTimeout(() => {
2310
- for (const s of [
2311
- stub,
2312
- sessionStub,
2313
- registryStub,
2314
- dataPlaneStub
2315
- ]) {
2795
+ for (const s of [stub, sessionStub, registryStub]) {
2316
2796
  try {
2317
2797
  s.close?.();
2318
2798
  } catch (err) {
@@ -2321,72 +2801,126 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2321
2801
  }
2322
2802
  }, 200);
2323
2803
  },
2324
- async job(target2, opts) {
2325
- jobRegistrations.set(target2, { target: target2, opts });
2804
+ async job(serviceOrTarget, fnOrOpts, optsOrUndefined) {
2805
+ let target2;
2806
+ let opts2;
2807
+ if (typeof fnOrOpts === "string") {
2808
+ const service2 = serviceOrTarget.trim();
2809
+ const fn = fnOrOpts.trim();
2810
+ opts2 = optsOrUndefined ?? { via: "rpc" };
2811
+ if (!service2 || !fn) {
2812
+ throw new ServiceBridgeError({
2813
+ code: SB.JOB_RPC_ARGS_REQUIRED,
2814
+ message: SB_MESSAGES[SB.JOB_RPC_ARGS_REQUIRED],
2815
+ component: "sdk",
2816
+ operation: "job",
2817
+ severity: "fatal"
2818
+ });
2819
+ }
2820
+ if (opts2.via !== "rpc") {
2821
+ throw new ServiceBridgeError({
2822
+ code: SB.JOB_VIA_MISMATCH,
2823
+ message: SB_MESSAGES[SB.JOB_VIA_MISMATCH],
2824
+ component: "sdk",
2825
+ operation: "job",
2826
+ severity: "fatal"
2827
+ });
2828
+ }
2829
+ target2 = `${service2}/${fn}`;
2830
+ } else {
2831
+ target2 = serviceOrTarget;
2832
+ opts2 = fnOrOpts;
2833
+ if (opts2.via === "rpc") {
2834
+ throw new ServiceBridgeError({
2835
+ code: SB.JOB_TARGET_FORM_REQUIRED,
2836
+ message: SB_MESSAGES[SB.JOB_TARGET_FORM_REQUIRED],
2837
+ component: "sdk",
2838
+ operation: "job",
2839
+ severity: "fatal"
2840
+ });
2841
+ }
2842
+ }
2843
+ jobRegistrations.set(target2, { target: target2, opts: opts2 });
2326
2844
  if (isOnline) {
2327
2845
  await reconcileRegistrations(`job:${target2}`).catch((err) => {
2328
2846
  reportSDKError(`register-job:${target2}`, err);
2329
2847
  });
2330
2848
  } else {
2331
- enqueueOffline({ type: "job", target: target2, opts });
2849
+ enqueueOffline({ type: "job", target: target2, opts: opts2 });
2332
2850
  }
2333
2851
  return target2;
2334
2852
  },
2335
- async workflow(name, steps, opts) {
2336
- workflowRegistrations.set(name, { name, steps, opts });
2853
+ async workflow(name, steps, opts2) {
2854
+ workflowRegistrations.set(name, { name, steps, opts: opts2 });
2337
2855
  if (isOnline) {
2338
2856
  await reconcileRegistrations(`workflow:${name}`).catch((err) => {
2339
2857
  reportSDKError(`register-workflow:${name}`, err);
2340
2858
  });
2341
2859
  } else {
2342
- enqueueOffline({ type: "workflow", name, steps, opts });
2860
+ enqueueOffline({ type: "workflow", name, steps, opts: opts2 });
2343
2861
  }
2344
2862
  return name;
2345
2863
  },
2346
- async runWorkflow(name, input, opts) {
2864
+ async executeWorkflow(service2, name, input, opts2) {
2347
2865
  await _controlReady;
2866
+ const svc2 = service2.trim();
2867
+ const wfName = name.trim();
2868
+ if (!svc2 || !wfName) {
2869
+ return Promise.reject(new ServiceBridgeError({
2870
+ code: SB.EXECUTE_WORKFLOW_ARGS_REQUIRED,
2871
+ message: SB_MESSAGES[SB.EXECUTE_WORKFLOW_ARGS_REQUIRED],
2872
+ component: "sdk",
2873
+ operation: "execute-workflow",
2874
+ severity: "fatal"
2875
+ }));
2876
+ }
2348
2877
  const payload = toJsonBuffer(input ?? {});
2349
2878
  return new Promise((resolve, reject) => {
2350
- stub.RunWorkflow({
2351
- name,
2352
- input: payload,
2353
- service_name: service
2879
+ stub.ExecuteWorkflow({
2880
+ workflow_name: wfName,
2881
+ service_name: svc2,
2882
+ input: payload
2354
2883
  }, meta, unaryDeadlineOptions(), (err, res) => {
2355
2884
  if (err) {
2356
- reject(normalizeServiceError(err, "run-workflow"));
2885
+ reject(normalizeServiceError(err, "execute-workflow"));
2357
2886
  return;
2358
2887
  }
2359
2888
  resolve({
2360
- runId: res?.run_id ?? "",
2361
2889
  traceId: res?.trace_id ?? ""
2362
2890
  });
2363
2891
  });
2364
2892
  });
2365
2893
  },
2366
- async cancelWorkflowRun(runId) {
2894
+ async cancelWorkflow(traceId) {
2367
2895
  await _controlReady;
2368
2896
  await new Promise((resolve, reject) => {
2369
- stub.CancelWorkflow({ run_id: runId }, meta, unaryDeadlineOptions(), (err, res) => {
2897
+ stub.CancelWorkflow({ trace_id: traceId }, meta, unaryDeadlineOptions(), (err, res) => {
2370
2898
  if (err) {
2371
- reject(normalizeServiceError(err, "cancel-workflow-run"));
2899
+ reject(normalizeServiceError(err, "cancel-workflow"));
2372
2900
  return;
2373
2901
  }
2374
2902
  if (!res?.cancelled) {
2375
- reject(new Error(`workflow run ${runId} was not cancelled`));
2903
+ reject(new ServiceBridgeError({
2904
+ code: SB.WORKFLOW_NOT_CANCELLED,
2905
+ message: `${SB_MESSAGES[SB.WORKFLOW_NOT_CANCELLED]} Trace: ${traceId}.`,
2906
+ component: "sdk",
2907
+ operation: "cancel-workflow",
2908
+ severity: "fatal"
2909
+ }));
2376
2910
  return;
2377
2911
  }
2378
2912
  resolve();
2379
2913
  });
2380
2914
  });
2381
2915
  },
2382
- startHttpSpan(opts) {
2916
+ startHttpSpan(opts2) {
2383
2917
  const tc = traceStorage.getStore();
2384
- const traceId = opts.traceId ?? tc?.traceId ?? crypto.randomUUID();
2918
+ const traceId = opts2.traceId ?? tc?.traceId ?? crypto.randomUUID();
2385
2919
  const spanId = crypto.randomUUID();
2386
- const parentSpanId = opts.parentSpanId ?? tc?.spanId ?? "";
2387
- const fn = `${opts.method} ${opts.path}`;
2920
+ const parentSpanId = opts2.parentSpanId ?? tc?.spanId ?? "";
2921
+ const fn = `${opts2.method} ${opts2.path}`;
2388
2922
  const startedAt = Date.now();
2389
- const inputBuf = toJsonBuffer({ method: opts.method, path: opts.path });
2923
+ const inputBuf = toJsonBuffer({ method: opts2.method, path: opts2.path });
2390
2924
  reportCallStartAsync(traceId, spanId, parentSpanId, fn, startedAt, inputBuf, 1, "http");
2391
2925
  return {
2392
2926
  traceId,
@@ -2401,17 +2935,17 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2401
2935
  }
2402
2936
  };
2403
2937
  },
2404
- async registerHttpEndpoint(opts) {
2938
+ async registerHttpEndpoint(opts2) {
2405
2939
  await _controlReady;
2406
- if (serveState) {
2407
- const existing = httpRegistrations.get(`${opts.method}:${opts.route}`);
2940
+ if (startState) {
2941
+ const existing = httpRegistrations.get(`${opts2.method}:${opts2.route}`);
2408
2942
  if (!existing) {
2409
- httpRegistrations.set(`${opts.method}:${opts.route}`, {
2410
- method: opts.method,
2411
- route: opts.route,
2412
- allowedCallers: opts.allowedCallers,
2413
- requestSchemaJson: opts.requestSchemaJson,
2414
- responseSchemaJson: opts.responseSchemaJson
2943
+ httpRegistrations.set(`${opts2.method}:${opts2.route}`, {
2944
+ method: opts2.method,
2945
+ route: opts2.route,
2946
+ allowedCallers: opts2.allowedCallers,
2947
+ requestSchemaJson: opts2.requestSchemaJson,
2948
+ responseSchemaJson: opts2.responseSchemaJson
2415
2949
  });
2416
2950
  reconcileRegistrations("http-register").catch((err) => {
2417
2951
  reportSDKError("register-http-endpoint", err);
@@ -2419,12 +2953,12 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2419
2953
  }
2420
2954
  }
2421
2955
  },
2422
- watchRun(runId, opts) {
2423
- const key = opts?.key ?? "";
2424
- const fromSeq = opts?.fromSequence ?? 0;
2425
- const WATCH_RUN_QUEUE_LIMIT = 256;
2426
- const WATCH_RUN_RETRY_MIN_MS = 500;
2427
- const WATCH_RUN_RETRY_MAX_MS = 5000;
2956
+ watchTrace(traceId, opts2) {
2957
+ const key = opts2?.key ?? "";
2958
+ const fromSeq = opts2?.fromSequence ?? 0;
2959
+ const WATCH_TRACE_QUEUE_LIMIT = 256;
2960
+ const WATCH_TRACE_RETRY_MIN_MS = 500;
2961
+ const WATCH_TRACE_RETRY_MAX_MS = 5000;
2428
2962
  return {
2429
2963
  [Symbol.asyncIterator]() {
2430
2964
  let stream = null;
@@ -2432,7 +2966,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2432
2966
  let cancelled = false;
2433
2967
  let done = false;
2434
2968
  let fatalError = null;
2435
- let reconnectDelay = WATCH_RUN_RETRY_MIN_MS;
2969
+ let reconnectDelay = WATCH_TRACE_RETRY_MIN_MS;
2436
2970
  let lastSequence = fromSeq;
2437
2971
  const queue = [];
2438
2972
  const waiters = [];
@@ -2458,21 +2992,23 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2458
2992
  data = JSON.parse(rawData.toString());
2459
2993
  } catch (cause) {
2460
2994
  throw new ServiceBridgeError({
2461
- message: `watchRun received non-JSON chunk for ${runId}`,
2995
+ code: SB.WATCH_TRACE_INVALID_JSON,
2996
+ message: `${SB_MESSAGES[SB.WATCH_TRACE_INVALID_JSON]} Trace: ${traceId}.`,
2462
2997
  component: "sdk",
2463
- operation: `watch-run:${runId}`,
2998
+ operation: `watch-trace:${traceId}`,
2464
2999
  severity: "fatal",
2465
3000
  cause
2466
3001
  });
2467
3002
  }
2468
3003
  }
3004
+ const eventType = chunk.type ?? chunk.event_type;
2469
3005
  return {
2470
- type: chunk.type === "run_complete" ? "run_complete" : "chunk",
2471
- runId,
3006
+ type: eventType === "trace_complete" ? "trace_complete" : "chunk",
3007
+ traceId,
2472
3008
  key: chunk.key || key,
2473
- sequence: Number(chunk.sequence ?? 0),
3009
+ sequence: Number(chunk.sequence ?? chunk.seq ?? 0),
2474
3010
  data,
2475
- runStatus: chunk.run_status || undefined
3011
+ traceStatus: chunk.trace_status || undefined
2476
3012
  };
2477
3013
  }
2478
3014
  function clearReconnectTimer() {
@@ -2514,11 +3050,12 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2514
3050
  }
2515
3051
  return;
2516
3052
  }
2517
- if (queue.length >= WATCH_RUN_QUEUE_LIMIT) {
3053
+ if (queue.length >= WATCH_TRACE_QUEUE_LIMIT) {
2518
3054
  fail(new ServiceBridgeError({
2519
- message: `watchRun consumer is not draining fast enough for ${runId}`,
3055
+ code: SB.WATCH_TRACE_BACKPRESSURE,
3056
+ message: `${SB_MESSAGES[SB.WATCH_TRACE_BACKPRESSURE]} Trace: ${traceId}.`,
2520
3057
  component: "sdk",
2521
- operation: `watch-run:${runId}`,
3058
+ operation: `watch-trace:${traceId}`,
2522
3059
  severity: "fatal"
2523
3060
  }));
2524
3061
  return;
@@ -2537,14 +3074,14 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2537
3074
  waiters.length = 0;
2538
3075
  }
2539
3076
  function shouldRetry(err) {
2540
- if (metadataValue(err, "servicebridge-run-stream-retryable") === "true") {
3077
+ if (metadataValue(err, "servicebridge-trace-stream-retryable") === "true") {
2541
3078
  return true;
2542
3079
  }
2543
3080
  const code = err?.code;
2544
- return code === grpc.status.UNAVAILABLE || code === grpc.status.UNKNOWN || code === grpc.status.DEADLINE_EXCEEDED || code === grpc.status.RESOURCE_EXHAUSTED;
3081
+ return code === grpc2.status.UNAVAILABLE || code === grpc2.status.UNKNOWN || code === grpc2.status.DEADLINE_EXCEEDED || code === grpc2.status.RESOURCE_EXHAUSTED;
2545
3082
  }
2546
3083
  function maybeUpdateResumeSequence(err) {
2547
- const parsed = Number(metadataValue(err, "servicebridge-run-stream-resume-from") ?? 0);
3084
+ const parsed = Number(metadataValue(err, "servicebridge-trace-stream-resume-from") ?? 0);
2548
3085
  if (Number.isFinite(parsed) && parsed > lastSequence) {
2549
3086
  lastSequence = parsed;
2550
3087
  }
@@ -2557,33 +3094,24 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2557
3094
  reconnectTimer = null;
2558
3095
  start();
2559
3096
  }, delay);
2560
- reconnectDelay = Math.min(reconnectDelay * 2, WATCH_RUN_RETRY_MAX_MS);
3097
+ reconnectDelay = Math.min(reconnectDelay * 2, WATCH_TRACE_RETRY_MAX_MS);
2561
3098
  }
2562
3099
  function start() {
2563
3100
  if (cancelled || done || fatalError || stream)
2564
3101
  return;
2565
- if (!dataPlaneStub) {
2566
- fail(new ServiceBridgeError({
2567
- message: "DataPlane service is not available in this runtime version",
2568
- component: "watch-run",
2569
- operation: "watch-run-unavailable",
2570
- severity: "fatal"
2571
- }));
2572
- return;
2573
- }
2574
3102
  try {
2575
- const current = dataPlaneStub.WatchRun({ run_id: runId, key, from_seq: lastSequence }, meta);
3103
+ const current = stub.WatchTrace({ trace_id: traceId, key, from_seq: lastSequence }, meta);
2576
3104
  let endedWithOK = false;
2577
3105
  stream = current;
2578
3106
  current.on("data", (chunk) => {
2579
3107
  if (stream !== current || cancelled || done || fatalError)
2580
3108
  return;
2581
- reconnectDelay = WATCH_RUN_RETRY_MIN_MS;
3109
+ reconnectDelay = WATCH_TRACE_RETRY_MIN_MS;
2582
3110
  let event;
2583
3111
  try {
2584
3112
  event = parseChunk(chunk);
2585
3113
  } catch (err) {
2586
- fail(err instanceof ServiceBridgeError ? err : normalizeServiceError(err, `watch-run:${runId}`));
3114
+ fail(err instanceof ServiceBridgeError ? err : normalizeServiceError(err, `watch-trace:${traceId}`));
2587
3115
  return;
2588
3116
  }
2589
3117
  if (event.sequence > 0) {
@@ -2592,7 +3120,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2592
3120
  lastSequence = event.sequence;
2593
3121
  }
2594
3122
  enqueue(event);
2595
- if (event.type === "run_complete") {
3123
+ if (event.type === "trace_complete") {
2596
3124
  finish();
2597
3125
  }
2598
3126
  });
@@ -2602,17 +3130,17 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2602
3130
  clearStream(false);
2603
3131
  maybeUpdateResumeSequence(err);
2604
3132
  if (!shouldRetry(err)) {
2605
- fail(normalizeServiceError(err, `watch-run:${runId}`));
3133
+ fail(normalizeServiceError(err, `watch-trace:${traceId}`));
2606
3134
  return;
2607
3135
  }
2608
- reconnectDelay = metadataValue(err, "servicebridge-run-stream-disconnect-reason") ? WATCH_RUN_RETRY_MIN_MS : reconnectDelay;
3136
+ reconnectDelay = metadataValue(err, "servicebridge-trace-stream-disconnect-reason") ? WATCH_TRACE_RETRY_MIN_MS : reconnectDelay;
2609
3137
  scheduleReconnect();
2610
3138
  });
2611
3139
  current.on("status", (statusInfo) => {
2612
3140
  if (stream !== current && stream !== null || cancelled || done || fatalError) {
2613
3141
  return;
2614
3142
  }
2615
- endedWithOK = statusInfo.code === grpc.status.OK;
3143
+ endedWithOK = statusInfo.code === grpc2.status.OK;
2616
3144
  if (endedWithOK) {
2617
3145
  clearReconnectTimer();
2618
3146
  if (stream === null) {
@@ -2633,7 +3161,7 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2633
3161
  } catch (err) {
2634
3162
  maybeUpdateResumeSequence(err);
2635
3163
  if (!shouldRetry(err)) {
2636
- fail(normalizeServiceError(err, `watch-run:${runId}`));
3164
+ fail(normalizeServiceError(err, `watch-trace:${traceId}`));
2637
3165
  return;
2638
3166
  }
2639
3167
  scheduleReconnect();
@@ -2682,6 +3210,12 @@ function servicebridge(url, serviceKey, serviceOrOpts = {}, maybeGlobalOpts = {}
2682
3210
  }
2683
3211
  return svc;
2684
3212
  }
3213
+
3214
+ class ServiceBridge {
3215
+ constructor(url, serviceKey, opts) {
3216
+ return servicebridge(url, serviceKey, opts ?? {});
3217
+ }
3218
+ }
2685
3219
  function captureConsole(svc) {
2686
3220
  const levelMap = {
2687
3221
  log: "INFO",
@@ -2728,12 +3262,15 @@ function captureConsole(svc) {
2728
3262
  }
2729
3263
  }
2730
3264
  export {
3265
+ withTraceContext,
2731
3266
  validateV2Config,
2732
- servicebridge,
2733
- runWithTraceContext,
3267
+ mapGrpcStatus,
2734
3268
  getTraceContext,
2735
3269
  V2SessionClient,
2736
3270
  ServiceBridgeError,
3271
+ ServiceBridge,
3272
+ SB_MESSAGES,
3273
+ SB,
2737
3274
  PositionTrackerV2,
2738
3275
  FlowControlStateV2,
2739
3276
  ConfigPushStateV2,