@workflow/web-shared 5.0.0-beta.26 → 5.0.0-beta.27

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.
Files changed (74) hide show
  1. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts +34 -0
  2. package/dist/components/new-trace-viewer/components/detail-panel-width.d.ts.map +1 -0
  3. package/dist/components/new-trace-viewer/components/detail-panel-width.js +67 -0
  4. package/dist/components/new-trace-viewer/components/detail-panel.d.ts +14 -0
  5. package/dist/components/new-trace-viewer/components/detail-panel.d.ts.map +1 -0
  6. package/dist/components/new-trace-viewer/components/detail-panel.js +122 -0
  7. package/dist/components/new-trace-viewer/components/draggable-border.d.ts +31 -0
  8. package/dist/components/new-trace-viewer/components/draggable-border.d.ts.map +1 -0
  9. package/dist/components/new-trace-viewer/components/draggable-border.js +140 -0
  10. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts +1 -1
  11. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.d.ts.map +1 -1
  12. package/dist/components/new-trace-viewer/components/middle-truncate/truncate.js +2 -2
  13. package/dist/components/new-trace-viewer/components/pane-constants.d.ts +14 -0
  14. package/dist/components/new-trace-viewer/components/pane-constants.d.ts.map +1 -0
  15. package/dist/components/new-trace-viewer/components/pane-constants.js +16 -0
  16. package/dist/components/new-trace-viewer/components/split-pane.d.ts +1 -4
  17. package/dist/components/new-trace-viewer/components/split-pane.d.ts.map +1 -1
  18. package/dist/components/new-trace-viewer/components/split-pane.js +18 -16
  19. package/dist/components/new-trace-viewer/components/timeline.d.ts +2 -2
  20. package/dist/components/new-trace-viewer/components/timeline.d.ts.map +1 -1
  21. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.d.ts.map +1 -1
  22. package/dist/components/new-trace-viewer/components/trace-viewer-skeleton.js +5 -2
  23. package/dist/components/new-trace-viewer/components/use-element-width.d.ts +8 -0
  24. package/dist/components/new-trace-viewer/components/use-element-width.d.ts.map +1 -0
  25. package/dist/components/new-trace-viewer/components/use-element-width.js +25 -0
  26. package/dist/components/new-trace-viewer/context.d.ts +2 -0
  27. package/dist/components/new-trace-viewer/context.d.ts.map +1 -1
  28. package/dist/components/new-trace-viewer/context.js +3 -2
  29. package/dist/components/new-trace-viewer/trace-viewer.d.ts.map +1 -1
  30. package/dist/components/new-trace-viewer/trace-viewer.js +10 -90
  31. package/dist/components/sidebar/attribute-panel.d.ts.map +1 -1
  32. package/dist/components/sidebar/attribute-panel.js +38 -35
  33. package/dist/components/sidebar/attributes-block.d.ts +18 -7
  34. package/dist/components/sidebar/attributes-block.d.ts.map +1 -1
  35. package/dist/components/sidebar/attributes-block.js +76 -18
  36. package/dist/components/sidebar/events-list.d.ts +1 -1
  37. package/dist/components/sidebar/events-list.d.ts.map +1 -1
  38. package/dist/components/sidebar/events-list.js +9 -10
  39. package/dist/components/trace-viewer/components/map.d.ts +2 -2
  40. package/dist/components/trace-viewer/components/map.d.ts.map +1 -1
  41. package/dist/components/trace-viewer/components/node.d.ts +7 -7
  42. package/dist/components/trace-viewer/components/node.d.ts.map +1 -1
  43. package/dist/components/ui/collapsible.d.ts +46 -0
  44. package/dist/components/ui/collapsible.d.ts.map +1 -0
  45. package/dist/components/ui/collapsible.js +66 -0
  46. package/dist/components/ui/data-inspector.js +2 -7
  47. package/dist/index.d.ts +2 -2
  48. package/dist/index.d.ts.map +1 -1
  49. package/dist/index.js +3 -3
  50. package/dist/lib/hydration.d.ts +12 -2
  51. package/dist/lib/hydration.d.ts.map +1 -1
  52. package/dist/lib/hydration.js +41 -18
  53. package/package.json +6 -6
  54. package/src/components/new-trace-viewer/components/detail-panel-width.test.ts +123 -0
  55. package/src/components/new-trace-viewer/components/detail-panel-width.ts +76 -0
  56. package/src/components/new-trace-viewer/components/detail-panel.tsx +272 -0
  57. package/src/components/new-trace-viewer/components/draggable-border.tsx +216 -0
  58. package/src/components/new-trace-viewer/components/middle-truncate/truncate.ts +1 -1
  59. package/src/components/new-trace-viewer/components/pane-constants.ts +19 -0
  60. package/src/components/new-trace-viewer/components/split-pane.tsx +44 -55
  61. package/src/components/new-trace-viewer/components/trace-viewer-skeleton.tsx +4 -1
  62. package/src/components/new-trace-viewer/components/use-element-width.ts +29 -0
  63. package/src/components/new-trace-viewer/context.tsx +4 -1
  64. package/src/components/new-trace-viewer/trace-viewer.tsx +18 -199
  65. package/src/components/sidebar/attribute-panel.tsx +106 -105
  66. package/src/components/sidebar/attributes-block.tsx +170 -50
  67. package/src/components/sidebar/events-list.tsx +107 -92
  68. package/src/components/ui/collapsible.tsx +219 -0
  69. package/src/index.ts +8 -7
  70. package/src/lib/hydration.ts +48 -25
  71. package/dist/components/sidebar/detail-card.d.ts +0 -13
  72. package/dist/components/sidebar/detail-card.d.ts.map +0 -1
  73. package/dist/components/sidebar/detail-card.js +0 -36
  74. package/src/components/sidebar/detail-card.tsx +0 -143
@@ -7,6 +7,18 @@
7
7
  */
8
8
  import { extractClassName, hydrateResourceIO as hydrateResourceIOGeneric, isEncryptedData, isExpiredStub, isRunRef, observabilityRevivers, serializedInstanceToRef, } from '@workflow/core/serialization-format';
9
9
  import { EVENT_DATA_REF_FIELDS } from '@workflow/world';
10
+ const V4_EXTRA_EVENT_DATA_REF_FIELDS = {
11
+ run_started: ['input'],
12
+ step_started: ['input'],
13
+ };
14
+ export function getEventDataRefFields(eventType) {
15
+ return [
16
+ ...new Set([
17
+ ...(EVENT_DATA_REF_FIELDS[eventType] ?? []),
18
+ ...(V4_EXTRA_EVENT_DATA_REF_FIELDS[eventType] ?? []),
19
+ ]),
20
+ ];
21
+ }
10
22
  // Re-export types and utilities that consumers need
11
23
  export { CLASS_INSTANCE_REF_TYPE, ClassInstanceRef, ENCRYPTED_PLACEHOLDER, extractStreamIds, isClassInstanceRef, isEncryptedData, isRunRef, isStreamId, isStreamRef, RUN_REF_TYPE, STREAM_REF_TYPE, serializedInstanceToRef, truncateId, } from '@workflow/core/serialization-format';
12
24
  // ---------------------------------------------------------------------------
@@ -369,7 +381,7 @@ function replaceEncryptedAndExpiredWithMarkers(resource) {
369
381
  }
370
382
  if (result.eventData && typeof result.eventData === 'object') {
371
383
  const eventType = typeof result.eventType === 'string' ? result.eventType : '';
372
- const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];
384
+ const refKeys = getEventDataRefFields(eventType);
373
385
  const ed = { ...result.eventData };
374
386
  for (const key of refKeys) {
375
387
  if (key in ed) {
@@ -386,31 +398,42 @@ function replaceEncryptedAndExpiredWithMarkers(resource) {
386
398
  * When a key is provided, encrypted fields are decrypted before hydration.
387
399
  * This is the async version used when the user clicks "Decrypt" in the web UI.
388
400
  *
389
- * Handles both top-level fields (input, output, metadata) and nested
390
- * eventData subfields per `EVENT_DATA_REF_FIELDS` from `@workflow/world` for that event type.
401
+ * Handles both top-level fields (input, output, metadata) and nested eventData
402
+ * payload fields for that event type.
391
403
  */
392
404
  export async function hydrateResourceIOWithKey(resource, key) {
405
+ return hydrateResourceIOAsync(resource, key);
406
+ }
407
+ /**
408
+ * Async hydration for web display.
409
+ *
410
+ * This follows the same resource-field mapping as {@link hydrateResourceIO},
411
+ * but can also inflate compressed browser payloads through the registered
412
+ * zstd WASM decoder. When a key is provided, encrypted fields are decrypted
413
+ * first and then inflated/hydrated.
414
+ */
415
+ export async function hydrateResourceIOAsync(resource, key) {
393
416
  const { hydrateDataWithKey } = await import('@workflow/core/serialization-format');
394
- const { importKey } = await import('@workflow/core/encryption');
395
417
  // Payloads may be zstd-compressed (the Web DecompressionStream has no zstd);
396
418
  // register the WASM-backed browser decoder before hydrating. Idempotent and
397
419
  // lazy — the WASM is only compiled when a zstd payload is actually decoded.
398
420
  const { ensureZstdDecoderRegistered } = await import('./zstd-browser-decoder.js');
399
421
  ensureZstdDecoderRegistered();
400
- const cryptoKey = await importKey(key);
422
+ const cryptoKey = key
423
+ ? await import('@workflow/core/encryption').then(({ importKey }) => importKey(key))
424
+ : undefined;
401
425
  const revivers = getRevivers();
402
- /** Extract original encrypted bytes from a marker or raw Uint8Array, then decrypt + hydrate */
403
- async function decryptField(value, rev, k) {
426
+ async function hydrateField(value) {
404
427
  // Already-hydrated: encrypted marker with stored bytes
405
428
  if (isEncryptedMarker(value)) {
406
429
  const raw = value.__encryptedData;
407
- return hydrateDataWithKey(raw, rev, k);
430
+ return cryptoKey ? hydrateDataWithKey(raw, revivers, cryptoKey) : value;
408
431
  }
409
- // Raw encrypted Uint8Array (not yet hydrated)
432
+ // Raw Uint8Array: may be encrypted, compressed, or plain devalue.
410
433
  if (value instanceof Uint8Array) {
411
- return hydrateDataWithKey(value, rev, k);
434
+ return hydrateDataWithKey(value, revivers, cryptoKey);
412
435
  }
413
- // Not encrypted — return as-is
436
+ // Not serialized — return as-is.
414
437
  return value;
415
438
  }
416
439
  const r = resource;
@@ -418,22 +441,22 @@ export async function hydrateResourceIOWithKey(resource, key) {
418
441
  // Decrypt + hydrate top-level serialized fields (runs, steps, hooks)
419
442
  for (const field of ['input', 'output', 'metadata', 'error']) {
420
443
  if (field in result) {
421
- result[field] = await decryptField(result[field], revivers, cryptoKey);
444
+ result[field] = await hydrateField(result[field]);
422
445
  }
423
446
  }
424
- // Decrypt + hydrate eventData subfields (events)
447
+ // Hydrate eventData subfields (events)
425
448
  if (result.eventData && typeof result.eventData === 'object') {
426
449
  const eventType = typeof result.eventType === 'string' ? result.eventType : '';
427
- const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];
450
+ const refKeys = getEventDataRefFields(eventType);
428
451
  const eventData = { ...result.eventData };
429
452
  for (const field of refKeys) {
430
453
  if (field in eventData) {
431
- eventData[field] = await decryptField(eventData[field], revivers, cryptoKey);
454
+ eventData[field] = await hydrateField(eventData[field]);
432
455
  }
433
456
  }
434
457
  result.eventData = eventData;
435
458
  }
436
- return result;
459
+ return replaceEncryptedAndExpiredWithMarkers(result);
437
460
  }
438
461
  /**
439
462
  * Check whether a hydrated resource (event, step, run, etc.) contains any
@@ -451,7 +474,7 @@ export function hasEncryptedFields(resource) {
451
474
  }
452
475
  if (r.eventData && typeof r.eventData === 'object') {
453
476
  const eventType = typeof r.eventType === 'string' ? r.eventType : '';
454
- const refKeys = EVENT_DATA_REF_FIELDS[eventType] ?? [];
477
+ const refKeys = getEventDataRefFields(eventType);
455
478
  const ed = r.eventData;
456
479
  for (const key of refKeys) {
457
480
  if (key in ed && isEncryptedMarker(ed[key]))
@@ -460,4 +483,4 @@ export function hasEncryptedFields(resource) {
460
483
  }
461
484
  return false;
462
485
  }
463
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlkcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9oeWRyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsSUFBSSx3QkFBd0IsRUFDN0MsZUFBZSxFQUNmLGFBQWEsRUFDYixRQUFRLEVBQ1IscUJBQXFCLEVBRXJCLHVCQUF1QixHQUN4QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELG9EQUFvRDtBQUNwRCxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLGdCQUFnQixFQUNoQixxQkFBcUIsRUFDckIsZ0JBQWdCLEVBQ2hCLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsUUFBUSxFQUNSLFVBQVUsRUFDVixXQUFXLEVBRVgsWUFBWSxFQUVaLGVBQWUsRUFFZix1QkFBdUIsRUFDdkIsVUFBVSxHQUNYLE1BQU0scUNBQXFDLENBQUM7QUFFN0MsOEVBQThFO0FBQzlFLDZCQUE2QjtBQUM3Qiw4RUFBOEU7QUFFOUUsU0FBUyxtQkFBbUIsQ0FBQyxNQUFjO0lBQ3pDLElBQUksTUFBTSxLQUFLLEVBQUUsSUFBSSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDcEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLElBQUksVUFBVSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1FBQzdDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENB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O0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViLXNwZWNpZmljIGh5ZHJhdGlvbiBmb3IgbzExeSBkaXNwbGF5LlxuICpcbiAqIEJyb3dzZXItc2FmZSByZXZpdmVycyB0aGF0IHVzZSBgYXRvYigpYCBmb3IgYmFzZTY0IGRlY29kaW5nIChubyBOb2RlLmpzXG4gKiBgQnVmZmVyYCBkZXBlbmRlbmN5KS4gUHJvZHVjZXMgYENsYXNzSW5zdGFuY2VSZWZgIG9iamVjdHMgYW5kIGBTdHJlYW1SZWZgXG4gKiBvYmplY3RzIGZvciBVSSByZW5kZXJpbmcuXG4gKi9cblxuaW1wb3J0IHtcbiAgZXh0cmFjdENsYXNzTmFtZSxcbiAgaHlkcmF0ZVJlc291cmNlSU8gYXMgaHlkcmF0ZVJlc291cmNlSU9HZW5lcmljLFxuICBpc0VuY3J5cHRlZERhdGEsXG4gIGlzRXhwaXJlZFN0dWIsXG4gIGlzUnVuUmVmLFxuICBvYnNlcnZhYmlsaXR5UmV2aXZlcnMsXG4gIHR5cGUgUmV2aXZlcnMsXG4gIHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmLFxufSBmcm9tICdAd29ya2Zsb3cvY29yZS9zZXJpYWxpemF0aW9uLWZvcm1hdCc7XG5pbXBvcnQgeyBFVkVOVF9EQVRBX1JFRl9GSUVMRFMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyB0aGF0IGNvbnN1bWVycyBuZWVkXG5leHBvcnQge1xuICBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSxcbiAgQ2xhc3NJbnN0YW5jZVJlZixcbiAgRU5DUllQVEVEX1BMQUNFSE9MREVSLFxuICBleHRyYWN0U3RyZWFtSWRzLFxuICBpc0NsYXNzSW5zdGFuY2VSZWYsXG4gIGlzRW5jcnlwdGVkRGF0YSxcbiAgaXNSdW5SZWYsXG4gIGlzU3RyZWFtSWQsXG4gIGlzU3RyZWFtUmVmLFxuICB0eXBlIFJldml2ZXJzLFxuICBSVU5fUkVGX1RZUEUsXG4gIHR5cGUgUnVuUmVmLFxuICBTVFJFQU1fUkVGX1RZUEUsXG4gIHR5cGUgU3RyZWFtUmVmLFxuICBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbiAgdHJ1bmNhdGVJZCxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJyb3dzZXItc2FmZSBiYXNlNjQgZGVjb2RlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQ6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcbiAgaWYgKGJhc2U2NCA9PT0gJycgfHwgYmFzZTY0ID09PSAnLicpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICB9XG4gIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBieXRlcy5idWZmZXI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV2ViIHJldml2ZXJzIChicm93c2VyLXNhZmUsIG5vIEJ1ZmZlciBkZXBlbmRlbmN5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQnVpbGQgYSByZXZpdmVyIGZvciBvbmUgb2YgdGhlIGJ1aWx0LWluIGBFcnJvcmAgc3ViY2xhc3NlcyAoZS5nLlxuICogYFR5cGVFcnJvcmAsIGBSYW5nZUVycm9yYCkuIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG5hbWVkIHN1YmNsYXNzIGlzXG4gKiByZXNvbHZlZCBvZmYgYGdsb2JhbFRoaXNgIGF0IGNhbGwgdGltZSBzbyB0aGUgcHJvZHVjZWQgaW5zdGFuY2UgaGFzIHRoZVxuICogY29ycmVjdCBwcm90b3R5cGUgY2hhaW4gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLiBGYWxscyBiYWNrIHRvIGEgZ2VuZXJpY1xuICogYEVycm9yYCAod2l0aCBgbmFtZWAgc2V0KSBpZiB0aGUgZ2xvYmFsIGlzbid0IGF2YWlsYWJsZSwgd2hpY2gga2VlcHMgdGhlXG4gKiBvMTF5IFVJIHJlbmRlcmluZyBldmVuIG9uIGV4b3RpYyBicm93c2Vycy5cbiAqXG4gKiBgY2F1c2VgIGlzIHBhc3NlZCB0aHJvdWdoIGBFcnJvck9wdGlvbnNgIHRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIHByZXNlbnQsXG4gKiBtYXRjaGluZyBgZ2V0Q29tbW9uUmV2aXZlcnNgIGluIGBAd29ya2Zsb3cvY29yZWAgc28gdGhlIHJlc3VsdGluZyBgY2F1c2VgXG4gKiBwcm9wZXJ0eSBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIChub24tZW51bWVyYWJsZSwgc2V0IGJ5IHRoZSBlbmdpbmUpIGFzIGFcbiAqIGZyZXNobHkgdGhyb3duIEVycm9yIGluIHRoZSBjb25zdW1lciByZWFsbS4gVGhlIGAnY2F1c2UnIGluIHZhbHVlYCBjaGVja1xuICogcHJlc2VydmVzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKFxuICBuYW1lOlxuICAgIHwgJ0V2YWxFcnJvcidcbiAgICB8ICdSYW5nZUVycm9yJ1xuICAgIHwgJ1JlZmVyZW5jZUVycm9yJ1xuICAgIHwgJ1N5bnRheEVycm9yJ1xuICAgIHwgJ1R5cGVFcnJvcidcbiAgICB8ICdVUklFcnJvcidcbikge1xuICByZXR1cm4gKHZhbHVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9KSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IEN0b3IgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtuYW1lXSBhc1xuICAgICAgfCBFcnJvckNvbnN0cnVjdG9yXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgIGlmICh0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgcGF0aDogbm8gYnVpbHQtaW4gc3ViY2xhc3MgYXZhaWxhYmxlIChleG90aWMgZW52KS4gQ29uc3RydWN0XG4gICAgICAvLyBhIHBsYWluIEVycm9yIHdpdGggdGhlIHJpZ2h0IGBuYW1lYCBhbmQgY29weSBgY2F1c2VgIG1hbnVhbGx5IHNpbmNlXG4gICAgICAvLyB0aGUgYmFzZSBFcnJvciBjb25zdHJ1Y3RvciBpcyB3aGF0IHdlIGFjdHVhbGx5IGNhbGxlZC5cbiAgICAgIGVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHsgbmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2ViLXNwZWNpZmljIHJldml2ZXJzIGZvciBoeWRyYXRpbmcgc2VyaWFsaXplZCBkYXRhLlxuICpcbiAqIFVzZXMgYGF0b2IoKWAgZm9yIGJhc2U2NCBkZWNvZGluZyAobm8gTm9kZS5qcyBCdWZmZXIgZGVwZW5kZW5jeSkuXG4gKiBBbGwgdHlwZXMgYXJlIHJldml2ZWQgYXMgcmVhbCBpbnN0YW5jZXMgKERhdGUsIE1hcCwgU2V0LCBVUkwsXG4gKiBVUkxTZWFyY2hQYXJhbXMsIEhlYWRlcnMsIEVycm9yLCBldGMuKS5cbiAqXG4gKiBOT1RFOiB0aGlzIHNldCBtdXN0IG1pcnJvciB0aGUga2V5cyBpbiBgU2VyaWFsaXphYmxlU3BlY2lhbGAgKHNlZVxuICogYEB3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24vdHlwZXNgKS4gQW55IHJlZHVjZXIga2V5IGFkZGVkIG9uIHRoZVxuICogc2VyaWFsaXphdGlvbiBzaWRlIHRoYXQgaXNuJ3QgY292ZXJlZCBoZXJlIHdpbGwgY2F1c2UgYGRldmFsdWUudW5mbGF0dGVuYFxuICogdG8gdGhyb3cgYFVua25vd24gdHlwZSBYYCwgd2hpY2ggYGh5ZHJhdGVSZXNvdXJjZUlPYCBzd2FsbG93cyBhbmRcbiAqIHN1cmZhY2VzIGFzIGEgXCJGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBkZXRhaWxzXCIgYmFubmVyIGluIHRoZSBvMTF5IFVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViUmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBmdW5jdGlvbiByZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZTogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xuICAgIHJldHVybiBiYXNlNjRUb0FycmF5QnVmZmVyKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gTzExeS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtcywgc3RlcCBmdW5jdGlvbnMg4oaSIGRpc3BsYXkgb2JqZWN0cykuXG4gICAgLy8gU3ByZWFkIEZJUlNUIHNvIHdlYi1zcGVjaWZpYyBvdmVycmlkZXMgYmVsb3cgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC4uLm9ic2VydmFiaWxpdHlSZXZpdmVycyxcblxuICAgIC8vIEJpbmFyeSB0eXBlc1xuICAgIEFycmF5QnVmZmVyOiByZXZpdmVBcnJheUJ1ZmZlcixcbiAgICBCaWdJbnQ6ICh2YWx1ZTogc3RyaW5nKSA9PiBCaWdJbnQodmFsdWUpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IEJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBEYXRlOiAodmFsdWUpID0+IG5ldyBEYXRlKHZhbHVlKSxcblxuICAgIC8vIEVycm9yIGZhbWlseS4gVGhlIHJlZHVjZXIgc2lkZSAoc2VlXG4gICAgLy8gYHBhY2thZ2VzL2NvcmUvc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzYCkgZW1pdHMgYSB0YWdnZWRcbiAgICAvLyBlbnRyeSBmb3IgZWFjaCBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyBwbHVzIHRoZSB3b3JrZmxvdy1zcGVjaWZpY1xuICAgIC8vIGBGYXRhbEVycm9yYCAvIGBSZXRyeWFibGVFcnJvcmAgLyBgSG9va0NvbmZsaWN0RXJyb3JgIC9cbiAgICAvLyBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgYW5kIGBBZ2dyZWdhdGVFcnJvcmAuIFdpdGhvdXRcbiAgICAvLyBtYXRjaGluZyByZXZpdmVycyBoZXJlLCBgZGV2YWx1ZS51bmZsYXR0ZW5gIHRocm93cyBcIlVua25vd24gdHlwZSBYXCJcbiAgICAvLyDigJQgd2hpY2ggc3VyZmFjZXMgaW4gdGhlIHdlYiBvMTF5IFVJIGFzIFwiRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2VcbiAgICAvLyBkZXRhaWxzOiBVbmtub3duIHR5cGUgRmF0YWxFcnJvclwiLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEV2YWxFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdFdmFsRXJyb3InKSxcbiAgICBSYW5nZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIFN5bnRheEVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1R5cGVFcnJvcicpLFxuICAgIFVSSUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgQ3RvciA9IChcbiAgICAgICAgZ2xvYmFsVGhpcyBhcyB7IEFnZ3JlZ2F0ZUVycm9yPzogQWdncmVnYXRlRXJyb3JDb25zdHJ1Y3RvciB9XG4gICAgICApLkFnZ3JlZ2F0ZUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPVxuICAgICAgICB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gbmV3IEN0b3IodmFsdWUuZXJyb3JzLCB2YWx1ZS5tZXNzYWdlLCBvcHRzKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHtcbiAgICAgICAgICAgICAgbmFtZTogJ0FnZ3JlZ2F0ZUVycm9yJyxcbiAgICAgICAgICAgICAgZXJyb3JzOiB2YWx1ZS5lcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgLy8gYEZhdGFsRXJyb3JgIGFuZCBgUmV0cnlhYmxlRXJyb3JgIGFyZSBub3QgYnVpbHQtaW4gYnJvd3NlciBnbG9iYWxzLFxuICAgIC8vIHNvIHdlIGNhbid0IHJlc29sdmUgYSBjb25zdHJ1Y3RvciBmcm9tIGdsb2JhbFRoaXMuIFRoZSB3ZWIgbzExeSBVSVxuICAgIC8vIGRvZXNuJ3QgbmVlZCBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB0byBwYXNzIChubyB1c2VyIGNvZGUgcnVuc1xuICAgIC8vIGhlcmUpIOKAlCBpdCBqdXN0IG5lZWRzIGBuYW1lYCwgYG1lc3NhZ2VgLCBgc3RhY2tgLCBhbmQgYW55IGV4dHJhXG4gICAgLy8gZW51bWVyYWJsZSBmaWVsZHMgdG8gcmVuZGVyLiBDb25zdHJ1Y3QgYSBwbGFpbiBgRXJyb3JgIHdpdGggYG5hbWVgXG4gICAgLy8gc2V0OyBPYmplY3RJbnNwZWN0b3IgcmVhZHMgYGNvbnN0cnVjdG9yLm5hbWVgIGZvciB0aGUgZGlzcGxheWVkXG4gICAgLy8gY2xhc3MgbGFiZWwsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSByZWFsIGNsYXNzLCBzbyB3ZSBlbWl0IGEgdGFnZ2VkXG4gICAgLy8gRXJyb3Igd2hvc2UgYG5hbWVgIGZpZWxkIGNhcnJpZXMgdGhlIGNsYXNzIGlkZW50aXR5LiBUaGlzIG1hdGNoZXNcbiAgICAvLyBob3cgdGhlIGV4aXN0aW5nIGJhc2UgYEVycm9yYCByZXZpdmVyIHByZXNlbnRzIHVua25vd24gc3ViY2xhc3Nlcy5cbiAgICBGYXRhbEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cykgYXMgRXJyb3IgJiB7XG4gICAgICAgIHRva2VuPzogc3RyaW5nO1xuICAgICAgICBjb25mbGljdGluZ1J1bklkPzogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSG9va0NvbmZsaWN0RXJyb3InO1xuICAgICAgZXJyb3IudG9rZW4gPSB2YWx1ZS50b2tlbjtcbiAgICAgIGlmICh2YWx1ZS5jb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29uZmxpY3RpbmdSdW5JZCA9IHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpIGFzIEVycm9yICYge1xuICAgICAgICByZXRyeUFmdGVyPzogRGF0ZTtcbiAgICAgIH07XG4gICAgICBlcnJvci5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gYHJldHJ5QWZ0ZXJgIGlzIHNlcmlhbGl6ZWQgYXMgYW4gZXBvY2ggbXMgbnVtYmVyIChzZWUgdGhlIHJ1bnRpbWVcbiAgICAgIC8vIFJldHJ5YWJsZUVycm9yIHJlZHVjZXIgZm9yIHRoZSByYXRpb25hbGUgYXJvdW5kIHJlYWxtLXNhZmV0eSkuXG4gICAgICAvLyBSZWh5ZHJhdGUgYXMgYSBEYXRlIHNvIG8xMXkgY29uc3VtZXJzIGNhbiByZW5kZXIgaXQgZGlyZWN0bHkuXG4gICAgICAvLyBHdWFyZCBhZ2FpbnN0IHBheWxvYWRzIGZyb20gb2xkZXIgcnVudGltZSB2ZXJzaW9ucyB0aGF0IHByZWRhdGVcbiAgICAgIC8vIHRoZSBmaWVsZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBgbmV3IERhdGUodW5kZWZpbmVkKWAgd291bGRcbiAgICAgIC8vIHByb2R1Y2UgYW4gSW52YWxpZCBEYXRlIHJhdGhlciB0aGFuIG9taXR0aW5nIHRoZSBwcm9wZXJ0eS5cbiAgICAgIGlmICh2YWx1ZS5yZXRyeUFmdGVyICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IucmV0cnlBZnRlciA9IG5ldyBEYXRlKHZhbHVlLnJldHJ5QWZ0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29udGV4dD86IHVua25vd247XG4gICAgICB9O1xuICAgICAgZXJyb3IubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBNb2Rlcm4gYnJvd3NlcnMgYW5kIE5vZGUgMTgrIGV4cG9zZSBgRE9NRXhjZXB0aW9uYCBvbiBnbG9iYWxUaGlzLlxuICAgICAgLy8gYEFib3J0Q29udHJvbGxlci5hYm9ydCgpYCB3aXRoIG5vIGFyZ3VtZW50IHN5bnRoZXNpemVzIG9uZSBhcyB0aGVcbiAgICAgIC8vIHNpZ25hbCdzIHJlYXNvbiwgc28gdGhpcyBpcyBhIGNvbW1vbiBwYXlsb2FkIGZvciBhbnkgYWJvcnRlZCBzdGVwLlxuICAgICAgY29uc3QgRyA9IGdsb2JhbFRoaXMgYXMgeyBET01FeGNlcHRpb24/OiB0eXBlb2YgRE9NRXhjZXB0aW9uIH07XG4gICAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgRy5ET01FeGNlcHRpb24odmFsdWUubWVzc2FnZSwgdmFsdWUubmFtZSk7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSB7XG4gICAgICAgIChlcnJvciBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgRmxvYXQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IE1hcCh2YWx1ZSksXG4gICAgUmVnRXhwOiAodmFsdWUpID0+IG5ldyBSZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBTZXQodmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBVaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcblxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IEhlYWRlcnModmFsdWUpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7fSB9LlJlcXVlc3QhO1xuICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShjdG9yLnByb3RvdHlwZSk7XG4gICAgICBPYmplY3QuYXNzaWduKG9iaiwge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgICAgLi4uKHZhbHVlLnJlc3BvbnNlV3JpdGFibGVcbiAgICAgICAgICA/IHsgcmVzcG9uc2VXcml0YWJsZTogdmFsdWUucmVzcG9uc2VXcml0YWJsZSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L3VzZUFycm93RnVuY3Rpb246IGFycm93IGZ1bmN0aW9ucyBoYXZlIG5vIC5wcm90b3R5cGVcbiAgICAgIGNvbnN0IGN0b3IgPSB7IFJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7fSB9LlJlc3BvbnNlITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgcmVkaXJlY3RlZDogdmFsdWUucmVkaXJlY3RlZCxcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgVVJMKHZhbHVlKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4gbmV3IFVSTFNlYXJjaFBhcmFtcyh2YWx1ZSA9PT0gJy4nID8gJycgOiB2YWx1ZSksXG5cbiAgICAvLyBXZWItc3BlY2lmaWMgb3ZlcnJpZGVzIGZvciBjbGFzcyBpbnN0YW5jZXMuXG4gICAgLy8gQ3JlYXRlIG9iamVjdHMgd2l0aCBhIGR5bmFtaWNhbGx5LW5hbWVkIGNvbnN0cnVjdG9yIHNvIHRoYXRcbiAgICAvLyB0aGUgZGF0YSBpbnNwZWN0b3Igc2hvd3MgdGhlIGNsYXNzIG5hbWUgKGl0IHJlYWRzIGNvbnN0cnVjdG9yLm5hbWUpLlxuICAgIENsYXNzOiAodmFsdWUpID0+IGA8Y2xhc3M6JHtleHRyYWN0Q2xhc3NOYW1lKHZhbHVlLmNsYXNzSWQpfT5gLFxuICAgIEluc3RhbmNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJ1biBpbnN0YW5jZXMgYXJlIHJlbmRlcmVkIGFzIGNsaWNrYWJsZSBSdW5SZWYgYmFkZ2VzXG4gICAgICBjb25zdCBydW5SZWYgPSBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZih2YWx1ZSk7XG4gICAgICBpZiAoaXNSdW5SZWYocnVuUmVmKSkge1xuICAgICAgICByZXR1cm4gcnVuUmVmO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB2YWx1ZS5kYXRhO1xuICAgICAgY29uc3QgcHJvcHMgPVxuICAgICAgICBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IHsgLi4uZGF0YSB9IDogeyB2YWx1ZTogZGF0YSB9O1xuICAgICAgLy8gQ3JlYXRlIGEgY29uc3RydWN0b3Igd2l0aCB0aGUgcmlnaHQgbmFtZSB1c2luZyBjb21wdXRlZCBwcm9wZXJ0eVxuICAgICAgLy8gc28gdGhlIGRhdGEgaW5zcGVjdG9yJ3MgYG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lYCBzaG93cyB0aGUgY2xhc3MgbmFtZS5cbiAgICAgIC8vIE11c3QgdXNlIGBmdW5jdGlvbmAgKG5vdCBhcnJvdykgYmVjYXVzZSBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlLlxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBbY2xhc3NOYW1lXTogZnVuY3Rpb24gKCkge30gfVtjbGFzc05hbWVdITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHByb3BzKTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQcmUtYnVpbHQgd2ViIHJldml2ZXJzIChjYWNoZWQgZm9yIHBlcmZvcm1hbmNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBjYWNoZWRSZXZpdmVyczogUmV2aXZlcnMgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0UmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBpZiAoIWNhY2hlZFJldml2ZXJzKSB7XG4gICAgY2FjaGVkUmV2aXZlcnMgPSBnZXRXZWJSZXZpdmVycygpO1xuICB9XG4gIHJldHVybiBjYWNoZWRSZXZpdmVycztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBzZXJpYWxpemVkIGRhdGEgZmllbGRzIG9mIGEgcmVzb3VyY2UgZm9yIHdlYiBkaXNwbGF5LlxuICpcbiAqIFVzZXMgYnJvd3Nlci1zYWZlIHJldml2ZXJzIChhdG9iIGZvciBiYXNlNjQsIENsYXNzSW5zdGFuY2VSZWYgZm9yXG4gKiBjdXN0b20gY2xhc3NlcywgU3RyZWFtUmVmIGZvciBzdHJlYW1zKS4gQ2FsbCB0aGlzIG9uIGRhdGEgcmVjZWl2ZWRcbiAqIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgcGFzc2luZyBpdCB0byBVSSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZVJlc291cmNlSU88VD4ocmVzb3VyY2U6IFQpOiBUIHtcbiAgY29uc3QgaHlkcmF0ZWQgPSBoeWRyYXRlUmVzb3VyY2VJT0dlbmVyaWMoXG4gICAgcmVzb3VyY2UgYXMgYW55LFxuICAgIGdldFJldml2ZXJzKClcbiAgKSBhcyBUO1xuICByZXR1cm4gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VycyhoeWRyYXRlZCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jcnlwdGVkIGRhdGEgZGlzcGxheSBtYXJrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUUgPSAnRW5jcnlwdGVkJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZW5jcnlwdGVkIGRhdGEuXG4gKlxuICogVXNlcyB0aGUgc2FtZSBuYW1lZC1jb25zdHJ1Y3RvciB0cmljayBhcyB0aGUgSW5zdGFuY2UgcmV2aXZlciBzbyB0aGF0XG4gKiBPYmplY3RJbnNwZWN0b3IgcmVuZGVycyB0aGUgY29uc3RydWN0b3IgbmFtZSAoXCLwn5SSIEVuY3J5cHRlZFwiKSB3aXRoIG5vXG4gKiBleHBhbmRhYmxlIGNoaWxkcmVuLiBUaGUgb3JpZ2luYWwgZW5jcnlwdGVkIGJ5dGVzIGFyZSBzdG9yZWQgaW4gYVxuICogbm9uLWVudW1lcmFibGUgcHJvcGVydHkgZm9yIGxhdGVyIGRlY3J5cHRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRlZE1hcmtlcihkYXRhOiBVaW50OEFycmF5KTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFTkNSWVBURURfRElTUExBWV9OQU1FXTogZnVuY3Rpb24gKCkge30gfVtcbiAgICBFTkNSWVBURURfRElTUExBWV9OQU1FXG4gIF0hO1xuICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbiAgLy8gU3RvcmUgb3JpZ2luYWwgYnl0ZXMgZm9yIGRlY3J5cHRpb24sIGJ1dCBub24tZW51bWVyYWJsZSBzb1xuICAvLyBPYmplY3RJbnNwZWN0b3IgZG9lc24ndCBzaG93IHRoZW0gYXMgY2hpbGRyZW5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ19fZW5jcnlwdGVkRGF0YScsIHtcbiAgICB2YWx1ZTogZGF0YSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZW5jcnlwdGVkIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkaXNwbGF5IG1hcmtlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgRVhQSVJFRF9ESVNQTEFZX05BTUUgPSAnRXhwaXJlZCBEYXRhJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZXhwaXJlZCBkYXRhLlxuICpcbiAqIFVzZXMgdGhlIHNhbWUgbmFtZWQtY29uc3RydWN0b3IgdHJpY2sgYXMgdGhlIGVuY3J5cHRlZCBtYXJrZXIgc28gdGhhdFxuICogT2JqZWN0SW5zcGVjdG9yIHJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgKFwiRXhwaXJlZCBEYXRhXCIpIHdpdGggbm9cbiAqIGV4cGFuZGFibGUgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4cGlyZWRNYXJrZXIoKTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFWFBJUkVEX0RJU1BMQVlfTkFNRV06IGZ1bmN0aW9uICgpIHt9IH1bXG4gICAgRVhQSVJFRF9ESVNQTEFZX05BTUVcbiAgXSE7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHBpcmVkTWFya2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWUgPT09IEVYUElSRURfRElTUExBWV9OQU1FXG4gICk7XG59XG5cbi8qKiBSZXBsYWNlIGEgc2luZ2xlIGZpZWxkIHZhbHVlIHdpdGggYSBkaXNwbGF5IG1hcmtlciBpZiBpdCdzIGVuY3J5cHRlZCBvciBleHBpcmVkLiAqL1xuZnVuY3Rpb24gdG9EaXNwbGF5TWFya2VyKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChpc0VuY3J5cHRlZERhdGEodmFsdWUpKSByZXR1cm4gY3JlYXRlRW5jcnlwdGVkTWFya2VyKHZhbHVlIGFzIFVpbnQ4QXJyYXkpO1xuICBpZiAoaXNFeHBpcmVkU3R1Yih2YWx1ZSkpIHJldHVybiBjcmVhdGVFeHBpcmVkTWFya2VyKCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBQb3N0LXByb2Nlc3MgaHlkcmF0ZWQgcmVzb3VyY2UgZGF0YTogcmVwbGFjZSBlbmNyeXB0ZWQgVWludDhBcnJheSB2YWx1ZXNcbiAqIGFuZCBleHBpcmVkIHN0dWJzIHdpdGggZGlzcGxheS1mcmllbmRseSBtYXJrZXIgb2JqZWN0cyBpbiBrbm93biBkYXRhIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VyczxUPihyZXNvdXJjZTogVCk6IFQge1xuICBpZiAoIXJlc291cmNlIHx8IHR5cGVvZiByZXNvdXJjZSAhPT0gJ29iamVjdCcpIHJldHVybiByZXNvdXJjZTtcbiAgY29uc3QgciA9IHJlc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZXN1bHQgPSB7IC4uLnIgfTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgcmVzdWx0W2tleV0gPSB0b0Rpc3BsYXlNYXJrZXIocmVzdWx0W2tleV0pO1xuICB9XG5cbiAgaWYgKHJlc3VsdC5ldmVudERhdGEgJiYgdHlwZW9mIHJlc3VsdC5ldmVudERhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXZlbnRUeXBlID1cbiAgICAgIHR5cGVvZiByZXN1bHQuZXZlbnRUeXBlID09PSAnc3RyaW5nJyA/IHJlc3VsdC5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gRVZFTlRfREFUQV9SRUZfRklFTERTW2V2ZW50VHlwZV0gPz8gW107XG4gICAgY29uc3QgZWQgPSB7IC4uLihyZXN1bHQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlZktleXMpIHtcbiAgICAgIGlmIChrZXkgaW4gZWQpIHtcbiAgICAgICAgZWRba2V5XSA9IHRvRGlzcGxheU1hcmtlcihlZFtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LmV2ZW50RGF0YSA9IGVkO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBUO1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgcmVzb3VyY2UgZGF0YSB3aXRoIGRlY3J5cHRpb24gc3VwcG9ydC5cbiAqXG4gKiBXaGVuIGEga2V5IGlzIHByb3ZpZGVkLCBlbmNyeXB0ZWQgZmllbGRzIGFyZSBkZWNyeXB0ZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqIFRoaXMgaXMgdGhlIGFzeW5jIHZlcnNpb24gdXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIkRlY3J5cHRcIiBpbiB0aGUgd2ViIFVJLlxuICpcbiAqIEhhbmRsZXMgYm90aCB0b3AtbGV2ZWwgZmllbGRzIChpbnB1dCwgb3V0cHV0LCBtZXRhZGF0YSkgYW5kIG5lc3RlZFxuICogZXZlbnREYXRhIHN1YmZpZWxkcyBwZXIgYEVWRU5UX0RBVEFfUkVGX0ZJRUxEU2AgZnJvbSBgQHdvcmtmbG93L3dvcmxkYCBmb3IgdGhhdCBldmVudCB0eXBlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZVJlc291cmNlSU9XaXRoS2V5PFQ+KFxuICByZXNvdXJjZTogVCxcbiAga2V5OiBVaW50OEFycmF5XG4pOiBQcm9taXNlPFQ+IHtcbiAgY29uc3QgeyBoeWRyYXRlRGF0YVdpdGhLZXkgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnXG4gICk7XG4gIGNvbnN0IHsgaW1wb3J0S2V5IH0gPSBhd2FpdCBpbXBvcnQoJ0B3b3JrZmxvdy9jb3JlL2VuY3J5cHRpb24nKTtcbiAgLy8gUGF5bG9hZHMgbWF5IGJlIHpzdGQtY29tcHJlc3NlZCAodGhlIFdlYiBEZWNvbXByZXNzaW9uU3RyZWFtIGhhcyBubyB6c3RkKTtcbiAgLy8gcmVnaXN0ZXIgdGhlIFdBU00tYmFja2VkIGJyb3dzZXIgZGVjb2RlciBiZWZvcmUgaHlkcmF0aW5nLiBJZGVtcG90ZW50IGFuZFxuICAvLyBsYXp5IOKAlCB0aGUgV0FTTSBpcyBvbmx5IGNvbXBpbGVkIHdoZW4gYSB6c3RkIHBheWxvYWQgaXMgYWN0dWFsbHkgZGVjb2RlZC5cbiAgY29uc3QgeyBlbnN1cmVac3RkRGVjb2RlclJlZ2lzdGVyZWQgfSA9IGF3YWl0IGltcG9ydChcbiAgICAnLi96c3RkLWJyb3dzZXItZGVjb2Rlci5qcydcbiAgKTtcbiAgZW5zdXJlWnN0ZERlY29kZXJSZWdpc3RlcmVkKCk7XG4gIGNvbnN0IGNyeXB0b0tleSA9IGF3YWl0IGltcG9ydEtleShrZXkpO1xuICBjb25zdCByZXZpdmVycyA9IGdldFJldml2ZXJzKCk7XG5cbiAgLyoqIEV4dHJhY3Qgb3JpZ2luYWwgZW5jcnlwdGVkIGJ5dGVzIGZyb20gYSBtYXJrZXIgb3IgcmF3IFVpbnQ4QXJyYXksIHRoZW4gZGVjcnlwdCArIGh5ZHJhdGUgKi9cbiAgYXN5bmMgZnVuY3Rpb24gZGVjcnlwdEZpZWxkKFxuICAgIHZhbHVlOiB1bmtub3duLFxuICAgIHJldjogUmV2aXZlcnMsXG4gICAgazogQXdhaXRlZDxSZXR1cm5UeXBlPHR5cGVvZiBpbXBvcnRLZXk+PlxuICApOiBQcm9taXNlPHVua25vd24+IHtcbiAgICAvLyBBbHJlYWR5LWh5ZHJhdGVkOiBlbmNyeXB0ZWQgbWFya2VyIHdpdGggc3RvcmVkIGJ5dGVzXG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHZhbHVlKSkge1xuICAgICAgY29uc3QgcmF3ID0gKHZhbHVlIGFzIGFueSkuX19lbmNyeXB0ZWREYXRhIGFzIFVpbnQ4QXJyYXk7XG4gICAgICByZXR1cm4gaHlkcmF0ZURhdGFXaXRoS2V5KHJhdywgcmV2LCBrKTtcbiAgICB9XG4gICAgLy8gUmF3IGVuY3J5cHRlZCBVaW50OEFycmF5IChub3QgeWV0IGh5ZHJhdGVkKVxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YVdpdGhLZXkodmFsdWUsIHJldiwgayk7XG4gICAgfVxuICAgIC8vIE5vdCBlbmNyeXB0ZWQg4oCUIHJldHVybiBhcy1pc1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5yIH07XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgdG9wLWxldmVsIHNlcmlhbGl6ZWQgZmllbGRzIChydW5zLCBzdGVwcywgaG9va3MpXG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydpbnB1dCcsICdvdXRwdXQnLCAnbWV0YWRhdGEnLCAnZXJyb3InXSkge1xuICAgIGlmIChmaWVsZCBpbiByZXN1bHQpIHtcbiAgICAgIHJlc3VsdFtmaWVsZF0gPSBhd2FpdCBkZWNyeXB0RmllbGQocmVzdWx0W2ZpZWxkXSwgcmV2aXZlcnMsIGNyeXB0b0tleSk7XG4gICAgfVxuICB9XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgZXZlbnREYXRhIHN1YmZpZWxkcyAoZXZlbnRzKVxuICBpZiAocmVzdWx0LmV2ZW50RGF0YSAmJiB0eXBlb2YgcmVzdWx0LmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPVxuICAgICAgdHlwZW9mIHJlc3VsdC5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gcmVzdWx0LmV2ZW50VHlwZSA6ICcnO1xuICAgIGNvbnN0IHJlZktleXMgPSBFVkVOVF9EQVRBX1JFRl9GSUVMRFNbZXZlbnRUeXBlXSA/PyBbXTtcbiAgICBjb25zdCBldmVudERhdGEgPSB7IC4uLihyZXN1bHQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgcmVmS2V5cykge1xuICAgICAgaWYgKGZpZWxkIGluIGV2ZW50RGF0YSkge1xuICAgICAgICBldmVudERhdGFbZmllbGRdID0gYXdhaXQgZGVjcnlwdEZpZWxkKFxuICAgICAgICAgIGV2ZW50RGF0YVtmaWVsZF0sXG4gICAgICAgICAgcmV2aXZlcnMsXG4gICAgICAgICAgY3J5cHRvS2V5XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5ldmVudERhdGEgPSBldmVudERhdGE7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0IGFzIFQ7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGh5ZHJhdGVkIHJlc291cmNlIChldmVudCwgc3RlcCwgcnVuLCBldGMuKSBjb250YWlucyBhbnlcbiAqIGVuY3J5cHRlZCBkaXNwbGF5IG1hcmtlcnMuIEluc3BlY3RzIHRoZSBzdGFuZGFyZCB0b3AtbGV2ZWwgZmllbGRzXG4gKiAoYGlucHV0YCwgYG91dHB1dGAsIGBlcnJvcmAsIGBtZXRhZGF0YWApIGFzIHdlbGwgYXMgdGhlIGV2ZW50LXR5cGUtc3BlY2lmaWNcbiAqIGBldmVudERhdGFgIHJlZiBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNyeXB0ZWRGaWVsZHMocmVzb3VyY2U6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHJba2V5XSkpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHIuZXZlbnREYXRhICYmIHR5cGVvZiByLmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSB0eXBlb2Ygci5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gci5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gRVZFTlRfREFUQV9SRUZfRklFTERTW2V2ZW50VHlwZV0gPz8gW107XG4gICAgY29uc3QgZWQgPSByLmV2ZW50RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoa2V5IGluIGVkICYmIGlzRW5jcnlwdGVkTWFya2VyKGVkW2tleV0pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
486
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHlkcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xpYi9oeWRyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUNMLGdCQUFnQixFQUNoQixpQkFBaUIsSUFBSSx3QkFBd0IsRUFDN0MsZUFBZSxFQUNmLGFBQWEsRUFDYixRQUFRLEVBQ1IscUJBQXFCLEVBRXJCLHVCQUF1QixHQUN4QixNQUFNLHFDQUFxQyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE1BQU0sOEJBQThCLEdBQTZCO0lBQy9ELFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUN0QixZQUFZLEVBQUUsQ0FBQyxPQUFPLENBQUM7Q0FDeEIsQ0FBQztBQUVGLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxTQUFpQjtJQUNyRCxPQUFPO1FBQ0wsR0FBRyxJQUFJLEdBQUcsQ0FBQztZQUNULEdBQUcsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0MsR0FBRyxDQUFDLDhCQUE4QixDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztTQUNyRCxDQUFDO0tBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxvREFBb0Q7QUFDcEQsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLGdCQUFnQixFQUNoQixrQkFBa0IsRUFDbEIsZUFBZSxFQUNmLFFBQVEsRUFDUixVQUFVLEVBQ1YsV0FBVyxFQUVYLFlBQVksRUFFWixlQUFlLEVBRWYsdUJBQXVCLEVBQ3ZCLFVBQVUsR0FDWCxNQUFNLHFDQUFxQyxDQUFDO0FBRTdDLDhFQUE4RTtBQUM5RSw2QkFBNkI7QUFDN0IsOEVBQThFO0FBRTlFLFNBQVMsbUJBQW1CLENBQUMsTUFBYztJQUN6QyxJQUFJLE1BQU0sS0FBSyxFQUFFLElBQUksTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxJQUFJLFVBQVUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUM3QyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDO0FBQ3RCLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsb0RBQW9EO0FBQ3BELDhFQUE4RTtBQUU5RTs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBUywyQkFBMkIsQ0FDbEMsSUFNYztJQUVkLE9BQU8sQ0FBQyxLQUEyRCxFQUFFLEVBQUU7UUFDckUsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDbkUsTUFBTSxJQUFJLEdBQUksVUFBa0MsQ0FBQyxJQUFJLENBRXhDLENBQUM7UUFDZCxJQUFJLEtBQVksQ0FBQztRQUNqQixJQUFJLE9BQU8sSUFBSSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQy9CLEtBQUssR0FBRyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7YUFBTSxDQUFDO1lBQ04sd0VBQXdFO1lBQ3hFLHNFQUFzRTtZQUN0RSx5REFBeUQ7WUFDekQsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEUsQ0FBQztRQUNELElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3pELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxjQUFjO0lBQzVCLFNBQVMsaUJBQWlCLENBQUMsS0FBYTtRQUN0QyxPQUFPLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFFRCxPQUFPO1FBQ0wsc0VBQXNFO1FBQ3RFLGdFQUFnRTtRQUNoRSxHQUFHLHFCQUFxQjtRQUV4QixlQUFlO1FBQ2YsV0FBVyxFQUFFLGlCQUFpQjtRQUM5QixNQUFNLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDeEMsYUFBYSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDL0IsSUFBSSxhQUFhLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDN0MsY0FBYyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FDaEMsSUFBSSxjQUFjLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUMsSUFBSSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFaEMsc0NBQXNDO1FBQ3RDLHVFQUF1RTtRQUN2RSxvRUFBb0U7UUFDcEUsMERBQTBEO1FBQzFELHlEQUF5RDtRQUN6RCxzRUFBc0U7UUFDdEUsa0VBQWtFO1FBQ2xFLHFDQUFxQztRQUNyQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNmLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25FLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3hCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxTQUFTLEVBQUUsMkJBQTJCLENBQUMsV0FBVyxDQUFDO1FBQ25ELFVBQVUsRUFBRSwyQkFBMkIsQ0FBQyxZQUFZLENBQUM7UUFDckQsY0FBYyxFQUFFLDJCQUEyQixDQUFDLGdCQUFnQixDQUFDO1FBQzdELFdBQVcsRUFBRSwyQkFBMkIsQ0FBQyxhQUFhLENBQUM7UUFDdkQsU0FBUyxFQUFFLDJCQUEyQixDQUFDLFdBQVcsQ0FBQztRQUNuRCxRQUFRLEVBQUUsMkJBQTJCLENBQUMsVUFBVSxDQUFDO1FBQ2pELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25FLE1BQU0sSUFBSSxHQUNSLFVBQ0QsQ0FBQyxjQUFjLENBQUM7WUFDakIsTUFBTSxLQUFLLEdBQ1QsT0FBTyxJQUFJLEtBQUssVUFBVTtnQkFDeEIsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUM7Z0JBQzdDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUU7b0JBQzVDLElBQUksRUFBRSxnQkFBZ0I7b0JBQ3RCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtpQkFDckIsQ0FBQyxDQUFDO1lBQ1QsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELHNFQUFzRTtRQUN0RSxxRUFBcUU7UUFDckUsa0VBQWtFO1FBQ2xFLGtFQUFrRTtRQUNsRSxxRUFBcUU7UUFDckUsa0VBQWtFO1FBQ2xFLHFFQUFxRTtRQUNyRSxvRUFBb0U7UUFDcEUscUVBQXFFO1FBQ3JFLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3BCLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25FLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDN0MsS0FBSyxDQUFDLElBQUksR0FBRyxZQUFZLENBQUM7WUFDMUIsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELGlCQUFpQixFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDM0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBRzFDLENBQUM7WUFDRixLQUFLLENBQUMsSUFBSSxHQUFHLG1CQUFtQixDQUFDO1lBQ2pDLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUMxQixJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDekMsS0FBSyxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQztZQUNsRCxDQUFDO1lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVM7Z0JBQUUsS0FBSyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1lBQ3pELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUNELGNBQWMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ3hCLE1BQU0sSUFBSSxHQUFHLE9BQU8sSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ25FLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUUxQyxDQUFDO1lBQ0YsS0FBSyxDQUFDLElBQUksR0FBRyxnQkFBZ0IsQ0FBQztZQUM5QixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUztnQkFBRSxLQUFLLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7WUFDekQsb0VBQW9FO1lBQ3BFLGlFQUFpRTtZQUNqRSxnRUFBZ0U7WUFDaEUsa0VBQWtFO1lBQ2xFLDhEQUE4RDtZQUM5RCw2REFBNkQ7WUFDN0QsSUFBSSxLQUFLLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRSxDQUFDO2dCQUM3QixLQUFLLENBQUMsVUFBVSxHQUFHLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNoRCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0Qsc0JBQXNCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNoQyxNQUFNLElBQUksR0FBRyxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztZQUNuRSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLElBQUksQ0FFMUMsQ0FBQztZQUNGLEtBQUssQ0FBQyxJQUFJLEdBQUcsd0JBQXdCLENBQUM7WUFDdEMsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVMsRUFBRSxDQUFDO2dCQUNoQyxLQUFLLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUM7WUFDaEMsQ0FBQztZQUNELElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7UUFDRCxZQUFZLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUN0QixvRUFBb0U7WUFDcEUsb0VBQW9FO1lBQ3BFLHFFQUFxRTtZQUNyRSxNQUFNLENBQUMsR0FBRyxVQUFvRCxDQUFDO1lBQy9ELElBQUksT0FBTyxDQUFDLENBQUMsWUFBWSxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUN6QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQ3hELElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO29CQUFFLENBQUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDckQsSUFBSSxPQUFPLElBQUksS0FBSztvQkFBRyxDQUF5QixDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUNyRSxPQUFPLENBQUMsQ0FBQztZQUNYLENBQUM7WUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDdkMsS0FBSyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ3hCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTO2dCQUFFLEtBQUssQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUN6RCxJQUFJLE9BQU8sSUFBSSxLQUFLLEVBQUUsQ0FBQztnQkFDcEIsS0FBcUMsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztZQUM3RCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBQ0QsWUFBWSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRSxZQUFZLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksWUFBWSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzNFLFNBQVMsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsVUFBVSxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2RSxVQUFVLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUFDLElBQUksVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3ZFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzlCLE1BQU0sRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hELEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDO1FBQzlCLFVBQVUsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxVQUFVLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkUsaUJBQWlCLEVBQUUsQ0FBQyxLQUFhLEVBQUUsRUFBRSxDQUNuQyxJQUFJLGlCQUFpQixDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELFdBQVcsRUFBRSxDQUFDLEtBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxXQUFXLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekUsV0FBVyxFQUFFLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUV6RSxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksT0FBTyxDQUFDLEtBQUssQ0FBQztRQUN0QyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNqQixvRkFBb0Y7WUFDcEYsTUFBTSxJQUFJLEdBQUcsRUFBRSxPQUFPLEVBQUUsY0FBYSxDQUFDLEVBQUUsQ0FBQyxPQUFRLENBQUM7WUFDbEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDMUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7Z0JBQ2pCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtnQkFDcEIsR0FBRyxFQUFFLEtBQUssQ0FBQyxHQUFHO2dCQUNkLE9BQU8sRUFBRSxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO2dCQUNuQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLE1BQU0sRUFBRSxLQUFLLENBQUMsTUFBTTtnQkFDcEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0I7b0JBQ3hCLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtvQkFDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzthQUNSLENBQUMsQ0FBQztZQUNILE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQztRQUNELFFBQVEsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFO1lBQ2xCLG9GQUFvRjtZQUNwRixNQUFNLElBQUksR0FBRyxFQUFFLFFBQVEsRUFBRSxjQUFhLENBQUMsRUFBRSxDQUFDLFFBQVMsQ0FBQztZQUNwRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRTtnQkFDakIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO2dCQUNwQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLEdBQUcsRUFBRSxLQUFLLENBQUMsR0FBRztnQkFDZCxPQUFPLEVBQUUsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQztnQkFDbkMsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO2dCQUNoQixVQUFVLEVBQUUsS0FBSyxDQUFDLFVBQVU7Z0JBQzVCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTthQUNqQixDQUFDLENBQUM7WUFDSCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7UUFDRCxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLEtBQUssQ0FBQztRQUM5QixlQUFlLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLElBQUksZUFBZSxDQUFDLEtBQUssS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRTNFLDhDQUE4QztRQUM5Qyw4REFBOEQ7UUFDOUQsdUVBQXVFO1FBQ3ZFLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsVUFBVSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUc7UUFDOUQsUUFBUSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUU7WUFDbEIsd0RBQXdEO1lBQ3hELE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlDLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFDRCxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDbEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQztZQUN4QixNQUFNLEtBQUssR0FDVCxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxDQUFDO1lBQ25FLG1FQUFtRTtZQUNuRSwwRUFBMEU7WUFDMUUsOEVBQThFO1lBQzlFLG9GQUFvRjtZQUNwRixNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsY0FBYSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUUsQ0FBQztZQUN6RCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMxQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUMxQixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELDhFQUE4RTtBQUM5RSxrREFBa0Q7QUFDbEQsOEVBQThFO0FBRTlFLElBQUksY0FBYyxHQUFvQixJQUFJLENBQUM7QUFFM0MsU0FBUyxXQUFXO0lBQ2xCLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixjQUFjLEdBQUcsY0FBYyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUNELE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsYUFBYTtBQUNiLDhFQUE4RTtBQUU5RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUksUUFBVztJQUM5QyxNQUFNLFFBQVEsR0FBRyx3QkFBd0IsQ0FDdkMsUUFBZSxFQUNmLFdBQVcsRUFBRSxDQUNULENBQUM7SUFDUCxPQUFPLHFDQUFxQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCw4RUFBOEU7QUFDOUUsaUNBQWlDO0FBQ2pDLDhFQUE4RTtBQUU5RSxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxXQUFXLENBQUM7QUFFbEQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMscUJBQXFCLENBQUMsSUFBZ0I7SUFDN0Msb0ZBQW9GO0lBQ3BGLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFLGNBQWEsQ0FBQyxFQUFFLENBQ3ZELHNCQUFzQixDQUN0QixDQUFDO0lBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDMUMsNkRBQTZEO0lBQzdELGdEQUFnRDtJQUNoRCxNQUFNLENBQUMsY0FBYyxDQUFDLEdBQUcsRUFBRSxpQkFBaUIsRUFBRTtRQUM1QyxLQUFLLEVBQUUsSUFBSTtRQUNYLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFlBQVksRUFBRSxLQUFLO0tBQ3BCLENBQUMsQ0FBQztJQUNILE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELHNEQUFzRDtBQUN0RCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsS0FBYztJQUM5QyxPQUFPLENBQ0wsS0FBSyxLQUFLLElBQUk7UUFDZCxPQUFPLEtBQUssS0FBSyxRQUFRO1FBQ3pCLEtBQUssQ0FBQyxXQUFXLEVBQUUsSUFBSSxLQUFLLHNCQUFzQixDQUNuRCxDQUFDO0FBQ0osQ0FBQztBQUVELDhFQUE4RTtBQUM5RSwrQkFBK0I7QUFDL0IsOEVBQThFO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGNBQWMsQ0FBQztBQUVuRDs7Ozs7O0dBTUc7QUFDSCxTQUFTLG1CQUFtQjtJQUMxQixvRkFBb0Y7SUFDcEYsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsY0FBYSxDQUFDLEVBQUUsQ0FDckQsb0JBQW9CLENBQ3BCLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQ3ZDLENBQUM7QUFFRCx5REFBeUQ7QUFDekQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE9BQU8sQ0FDTCxLQUFLLEtBQUssSUFBSTtRQUNkLE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLEtBQUssb0JBQW9CLENBQ2pELENBQUM7QUFDSixDQUFDO0FBRUQsdUZBQXVGO0FBQ3ZGLFNBQVMsZUFBZSxDQUFDLEtBQWM7SUFDckMsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxxQkFBcUIsQ0FBQyxLQUFtQixDQUFDLENBQUM7SUFDOUUsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDO1FBQUUsT0FBTyxtQkFBbUIsRUFBRSxDQUFDO0lBQ3ZELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVEOzs7R0FHRztBQUNILFNBQVMscUNBQXFDLENBQUksUUFBVztJQUMzRCxJQUFJLENBQUMsUUFBUSxJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7UUFBRSxPQUFPLFFBQVEsQ0FBQztJQUMvRCxNQUFNLENBQUMsR0FBRyxRQUFtQyxDQUFDO0lBQzlDLE1BQU0sTUFBTSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQztJQUV4QixLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdELE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUksTUFBTSxDQUFDLFNBQXFDLEVBQUUsQ0FBQztRQUNoRSxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDO2dCQUNkLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxlQUFlLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsT0FBTyxNQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx3QkFBd0IsQ0FDNUMsUUFBVyxFQUNYLEdBQWU7SUFFZixPQUFPLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsc0JBQXNCLENBQzFDLFFBQVcsRUFDWCxHQUFnQjtJQUVoQixNQUFNLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FDekMscUNBQXFDLENBQ3RDLENBQUM7SUFDRiw2RUFBNkU7SUFDN0UsNEVBQTRFO0lBQzVFLDRFQUE0RTtJQUM1RSxNQUFNLEVBQUUsMkJBQTJCLEVBQUUsR0FBRyxNQUFNLE1BQU0sQ0FDbEQsMkJBQTJCLENBQzVCLENBQUM7SUFDRiwyQkFBMkIsRUFBRSxDQUFDO0lBQzlCLE1BQU0sU0FBUyxHQUFHLEdBQUc7UUFDbkIsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLENBQy9ELFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FDZjtRQUNILENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDZCxNQUFNLFFBQVEsR0FBRyxXQUFXLEVBQUUsQ0FBQztJQUUvQixLQUFLLFVBQVUsWUFBWSxDQUFDLEtBQWM7UUFDeEMsdURBQXVEO1FBQ3ZELElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUM3QixNQUFNLEdBQUcsR0FBSSxLQUFhLENBQUMsZUFBNkIsQ0FBQztZQUN6RCxPQUFPLFNBQVMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzFFLENBQUM7UUFDRCxrRUFBa0U7UUFDbEUsSUFBSSxLQUFLLFlBQVksVUFBVSxFQUFFLENBQUM7WUFDaEMsT0FBTyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hELENBQUM7UUFDRCxpQ0FBaUM7UUFDakMsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsUUFBbUMsQ0FBQztJQUM5QyxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFFeEIscUVBQXFFO0lBQ3JFLEtBQUssTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQzdELElBQUksS0FBSyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ3BCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUNwRCxDQUFDO0lBQ0gsQ0FBQztJQUVELHVDQUF1QztJQUN2QyxJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksT0FBTyxNQUFNLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQzdELE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUMvRCxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxNQUFNLFNBQVMsR0FBRyxFQUFFLEdBQUksTUFBTSxDQUFDLFNBQXFDLEVBQUUsQ0FBQztRQUN2RSxLQUFLLE1BQU0sS0FBSyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzVCLElBQUksS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO2dCQUN2QixTQUFTLENBQUMsS0FBSyxDQUFDLEdBQUcsTUFBTSxZQUFZLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDMUQsQ0FBQztRQUNILENBQUM7UUFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztJQUMvQixDQUFDO0lBRUQsT0FBTyxxQ0FBcUMsQ0FBQyxNQUFXLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsUUFBaUI7SUFDbEQsSUFBSSxDQUFDLFFBQVEsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDNUQsTUFBTSxDQUFDLEdBQUcsUUFBbUMsQ0FBQztJQUU5QyxLQUFLLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMzRCxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzdDLENBQUM7SUFFRCxJQUFJLENBQUMsQ0FBQyxTQUFTLElBQUksT0FBTyxDQUFDLENBQUMsU0FBUyxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ25ELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNyRSxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRCxNQUFNLEVBQUUsR0FBRyxDQUFDLENBQUMsU0FBb0MsQ0FBQztRQUNsRCxLQUFLLE1BQU0sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1lBQzFCLElBQUksR0FBRyxJQUFJLEVBQUUsSUFBSSxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQUUsT0FBTyxJQUFJLENBQUM7UUFDM0QsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFdlYi1zcGVjaWZpYyBoeWRyYXRpb24gZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBCcm93c2VyLXNhZmUgcmV2aXZlcnMgdGhhdCB1c2UgYGF0b2IoKWAgZm9yIGJhc2U2NCBkZWNvZGluZyAobm8gTm9kZS5qc1xuICogYEJ1ZmZlcmAgZGVwZW5kZW5jeSkuIFByb2R1Y2VzIGBDbGFzc0luc3RhbmNlUmVmYCBvYmplY3RzIGFuZCBgU3RyZWFtUmVmYFxuICogb2JqZWN0cyBmb3IgVUkgcmVuZGVyaW5nLlxuICovXG5cbmltcG9ydCB7XG4gIGV4dHJhY3RDbGFzc05hbWUsXG4gIGh5ZHJhdGVSZXNvdXJjZUlPIGFzIGh5ZHJhdGVSZXNvdXJjZUlPR2VuZXJpYyxcbiAgaXNFbmNyeXB0ZWREYXRhLFxuICBpc0V4cGlyZWRTdHViLFxuICBpc1J1blJlZixcbiAgb2JzZXJ2YWJpbGl0eVJldml2ZXJzLFxuICB0eXBlIFJldml2ZXJzLFxuICBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnO1xuaW1wb3J0IHsgRVZFTlRfREFUQV9SRUZfRklFTERTIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcblxuY29uc3QgVjRfRVhUUkFfRVZFTlRfREFUQV9SRUZfRklFTERTOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gPSB7XG4gIHJ1bl9zdGFydGVkOiBbJ2lucHV0J10sXG4gIHN0ZXBfc3RhcnRlZDogWydpbnB1dCddLFxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV2ZW50RGF0YVJlZkZpZWxkcyhldmVudFR5cGU6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFtcbiAgICAuLi5uZXcgU2V0KFtcbiAgICAgIC4uLihFVkVOVF9EQVRBX1JFRl9GSUVMRFNbZXZlbnRUeXBlXSA/PyBbXSksXG4gICAgICAuLi4oVjRfRVhUUkFfRVZFTlRfREFUQV9SRUZfRklFTERTW2V2ZW50VHlwZV0gPz8gW10pLFxuICAgIF0pLFxuICBdO1xufVxuXG4vLyBSZS1leHBvcnQgdHlwZXMgYW5kIHV0aWxpdGllcyB0aGF0IGNvbnN1bWVycyBuZWVkXG5leHBvcnQge1xuICBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSxcbiAgQ2xhc3NJbnN0YW5jZVJlZixcbiAgRU5DUllQVEVEX1BMQUNFSE9MREVSLFxuICBleHRyYWN0U3RyZWFtSWRzLFxuICBpc0NsYXNzSW5zdGFuY2VSZWYsXG4gIGlzRW5jcnlwdGVkRGF0YSxcbiAgaXNSdW5SZWYsXG4gIGlzU3RyZWFtSWQsXG4gIGlzU3RyZWFtUmVmLFxuICB0eXBlIFJldml2ZXJzLFxuICBSVU5fUkVGX1RZUEUsXG4gIHR5cGUgUnVuUmVmLFxuICBTVFJFQU1fUkVGX1RZUEUsXG4gIHR5cGUgU3RyZWFtUmVmLFxuICBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZixcbiAgdHJ1bmNhdGVJZCxcbn0gZnJvbSAnQHdvcmtmbG93L2NvcmUvc2VyaWFsaXphdGlvbi1mb3JtYXQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEJyb3dzZXItc2FmZSBiYXNlNjQgZGVjb2RlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gYmFzZTY0VG9BcnJheUJ1ZmZlcihiYXNlNjQ6IHN0cmluZyk6IEFycmF5QnVmZmVyIHtcbiAgaWYgKGJhc2U2NCA9PT0gJycgfHwgYmFzZTY0ID09PSAnLicpIHtcbiAgICByZXR1cm4gbmV3IEFycmF5QnVmZmVyKDApO1xuICB9XG4gIGNvbnN0IGJpbmFyeVN0cmluZyA9IGF0b2IoYmFzZTY0KTtcbiAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShiaW5hcnlTdHJpbmcubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiaW5hcnlTdHJpbmcubGVuZ3RoOyBpKyspIHtcbiAgICBieXRlc1tpXSA9IGJpbmFyeVN0cmluZy5jaGFyQ29kZUF0KGkpO1xuICB9XG4gIHJldHVybiBieXRlcy5idWZmZXI7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV2ViIHJldml2ZXJzIChicm93c2VyLXNhZmUsIG5vIEJ1ZmZlciBkZXBlbmRlbmN5KVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQnVpbGQgYSByZXZpdmVyIGZvciBvbmUgb2YgdGhlIGJ1aWx0LWluIGBFcnJvcmAgc3ViY2xhc3NlcyAoZS5nLlxuICogYFR5cGVFcnJvcmAsIGBSYW5nZUVycm9yYCkuIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIG5hbWVkIHN1YmNsYXNzIGlzXG4gKiByZXNvbHZlZCBvZmYgYGdsb2JhbFRoaXNgIGF0IGNhbGwgdGltZSBzbyB0aGUgcHJvZHVjZWQgaW5zdGFuY2UgaGFzIHRoZVxuICogY29ycmVjdCBwcm90b3R5cGUgY2hhaW4gaW4gdGhlIGNvbnN1bWVyIHJlYWxtLiBGYWxscyBiYWNrIHRvIGEgZ2VuZXJpY1xuICogYEVycm9yYCAod2l0aCBgbmFtZWAgc2V0KSBpZiB0aGUgZ2xvYmFsIGlzbid0IGF2YWlsYWJsZSwgd2hpY2gga2VlcHMgdGhlXG4gKiBvMTF5IFVJIHJlbmRlcmluZyBldmVuIG9uIGV4b3RpYyBicm93c2Vycy5cbiAqXG4gKiBgY2F1c2VgIGlzIHBhc3NlZCB0aHJvdWdoIGBFcnJvck9wdGlvbnNgIHRvIHRoZSBjb25zdHJ1Y3RvciB3aGVuIHByZXNlbnQsXG4gKiBtYXRjaGluZyBgZ2V0Q29tbW9uUmV2aXZlcnNgIGluIGBAd29ya2Zsb3cvY29yZWAgc28gdGhlIHJlc3VsdGluZyBgY2F1c2VgXG4gKiBwcm9wZXJ0eSBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIChub24tZW51bWVyYWJsZSwgc2V0IGJ5IHRoZSBlbmdpbmUpIGFzIGFcbiAqIGZyZXNobHkgdGhyb3duIEVycm9yIGluIHRoZSBjb25zdW1lciByZWFsbS4gVGhlIGAnY2F1c2UnIGluIHZhbHVlYCBjaGVja1xuICogcHJlc2VydmVzIHRoZSBkaXN0aW5jdGlvbiBiZXR3ZWVuIFwibm8gY2F1c2VcIiBhbmQgXCJjYXVzZSBpcyB1bmRlZmluZWRcIi5cbiAqL1xuZnVuY3Rpb24gbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKFxuICBuYW1lOlxuICAgIHwgJ0V2YWxFcnJvcidcbiAgICB8ICdSYW5nZUVycm9yJ1xuICAgIHwgJ1JlZmVyZW5jZUVycm9yJ1xuICAgIHwgJ1N5bnRheEVycm9yJ1xuICAgIHwgJ1R5cGVFcnJvcidcbiAgICB8ICdVUklFcnJvcidcbikge1xuICByZXR1cm4gKHZhbHVlOiB7IG1lc3NhZ2U6IHN0cmluZzsgc3RhY2s/OiBzdHJpbmc7IGNhdXNlPzogdW5rbm93biB9KSA9PiB7XG4gICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IEN0b3IgPSAoZ2xvYmFsVGhpcyBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtuYW1lXSBhc1xuICAgICAgfCBFcnJvckNvbnN0cnVjdG9yXG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZXJyb3I6IEVycm9yO1xuICAgIGlmICh0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXJyb3IgPSBuZXcgQ3Rvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgcGF0aDogbm8gYnVpbHQtaW4gc3ViY2xhc3MgYXZhaWxhYmxlIChleG90aWMgZW52KS4gQ29uc3RydWN0XG4gICAgICAvLyBhIHBsYWluIEVycm9yIHdpdGggdGhlIHJpZ2h0IGBuYW1lYCBhbmQgY29weSBgY2F1c2VgIG1hbnVhbGx5IHNpbmNlXG4gICAgICAvLyB0aGUgYmFzZSBFcnJvciBjb25zdHJ1Y3RvciBpcyB3aGF0IHdlIGFjdHVhbGx5IGNhbGxlZC5cbiAgICAgIGVycm9yID0gT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHsgbmFtZSB9KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGVycm9yLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9O1xufVxuXG4vKipcbiAqIEdldCB0aGUgd2ViLXNwZWNpZmljIHJldml2ZXJzIGZvciBoeWRyYXRpbmcgc2VyaWFsaXplZCBkYXRhLlxuICpcbiAqIFVzZXMgYGF0b2IoKWAgZm9yIGJhc2U2NCBkZWNvZGluZyAobm8gTm9kZS5qcyBCdWZmZXIgZGVwZW5kZW5jeSkuXG4gKiBBbGwgdHlwZXMgYXJlIHJldml2ZWQgYXMgcmVhbCBpbnN0YW5jZXMgKERhdGUsIE1hcCwgU2V0LCBVUkwsXG4gKiBVUkxTZWFyY2hQYXJhbXMsIEhlYWRlcnMsIEVycm9yLCBldGMuKS5cbiAqXG4gKiBOT1RFOiB0aGlzIHNldCBtdXN0IG1pcnJvciB0aGUga2V5cyBpbiBgU2VyaWFsaXphYmxlU3BlY2lhbGAgKHNlZVxuICogYEB3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24vdHlwZXNgKS4gQW55IHJlZHVjZXIga2V5IGFkZGVkIG9uIHRoZVxuICogc2VyaWFsaXphdGlvbiBzaWRlIHRoYXQgaXNuJ3QgY292ZXJlZCBoZXJlIHdpbGwgY2F1c2UgYGRldmFsdWUudW5mbGF0dGVuYFxuICogdG8gdGhyb3cgYFVua25vd24gdHlwZSBYYCwgd2hpY2ggYGh5ZHJhdGVSZXNvdXJjZUlPYCBzd2FsbG93cyBhbmRcbiAqIHN1cmZhY2VzIGFzIGEgXCJGYWlsZWQgdG8gbG9hZCByZXNvdXJjZSBkZXRhaWxzXCIgYmFubmVyIGluIHRoZSBvMTF5IFVJLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0V2ViUmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBmdW5jdGlvbiByZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZTogc3RyaW5nKTogQXJyYXlCdWZmZXIge1xuICAgIHJldHVybiBiYXNlNjRUb0FycmF5QnVmZmVyKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLy8gTzExeS1zcGVjaWZpYyByZXZpdmVycyAoc3RyZWFtcywgc3RlcCBmdW5jdGlvbnMg4oaSIGRpc3BsYXkgb2JqZWN0cykuXG4gICAgLy8gU3ByZWFkIEZJUlNUIHNvIHdlYi1zcGVjaWZpYyBvdmVycmlkZXMgYmVsb3cgdGFrZSBwcmVjZWRlbmNlLlxuICAgIC4uLm9ic2VydmFiaWxpdHlSZXZpdmVycyxcblxuICAgIC8vIEJpbmFyeSB0eXBlc1xuICAgIEFycmF5QnVmZmVyOiByZXZpdmVBcnJheUJ1ZmZlcixcbiAgICBCaWdJbnQ6ICh2YWx1ZTogc3RyaW5nKSA9PiBCaWdJbnQodmFsdWUpLFxuICAgIEJpZ0ludDY0QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PlxuICAgICAgbmV3IEJpZ0ludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBCaWdVaW50NjRBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+XG4gICAgICBuZXcgQmlnVWludDY0QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBEYXRlOiAodmFsdWUpID0+IG5ldyBEYXRlKHZhbHVlKSxcblxuICAgIC8vIEVycm9yIGZhbWlseS4gVGhlIHJlZHVjZXIgc2lkZSAoc2VlXG4gICAgLy8gYHBhY2thZ2VzL2NvcmUvc3JjL3NlcmlhbGl6YXRpb24vcmVkdWNlcnMvY29tbW9uLnRzYCkgZW1pdHMgYSB0YWdnZWRcbiAgICAvLyBlbnRyeSBmb3IgZWFjaCBidWlsdC1pbiBFcnJvciBzdWJjbGFzcyBwbHVzIHRoZSB3b3JrZmxvdy1zcGVjaWZpY1xuICAgIC8vIGBGYXRhbEVycm9yYCAvIGBSZXRyeWFibGVFcnJvcmAgLyBgSG9va0NvbmZsaWN0RXJyb3JgIC9cbiAgICAvLyBgUnVudGltZURlY3J5cHRpb25FcnJvcmAgYW5kIGBBZ2dyZWdhdGVFcnJvcmAuIFdpdGhvdXRcbiAgICAvLyBtYXRjaGluZyByZXZpdmVycyBoZXJlLCBgZGV2YWx1ZS51bmZsYXR0ZW5gIHRocm93cyBcIlVua25vd24gdHlwZSBYXCJcbiAgICAvLyDigJQgd2hpY2ggc3VyZmFjZXMgaW4gdGhlIHdlYiBvMTF5IFVJIGFzIFwiRmFpbGVkIHRvIGxvYWQgcmVzb3VyY2VcbiAgICAvLyBkZXRhaWxzOiBVbmtub3duIHR5cGUgRmF0YWxFcnJvclwiLlxuICAgIEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIEV2YWxFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdFdmFsRXJyb3InKSxcbiAgICBSYW5nZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1JhbmdlRXJyb3InKSxcbiAgICBSZWZlcmVuY2VFcnJvcjogbWFrZVdlYkVycm9yU3ViY2xhc3NSZXZpdmVyKCdSZWZlcmVuY2VFcnJvcicpLFxuICAgIFN5bnRheEVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1N5bnRheEVycm9yJyksXG4gICAgVHlwZUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1R5cGVFcnJvcicpLFxuICAgIFVSSUVycm9yOiBtYWtlV2ViRXJyb3JTdWJjbGFzc1Jldml2ZXIoJ1VSSUVycm9yJyksXG4gICAgQWdncmVnYXRlRXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgQ3RvciA9IChcbiAgICAgICAgZ2xvYmFsVGhpcyBhcyB7IEFnZ3JlZ2F0ZUVycm9yPzogQWdncmVnYXRlRXJyb3JDb25zdHJ1Y3RvciB9XG4gICAgICApLkFnZ3JlZ2F0ZUVycm9yO1xuICAgICAgY29uc3QgZXJyb3IgPVxuICAgICAgICB0eXBlb2YgQ3RvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gbmV3IEN0b3IodmFsdWUuZXJyb3JzLCB2YWx1ZS5tZXNzYWdlLCBvcHRzKVxuICAgICAgICAgIDogT2JqZWN0LmFzc2lnbihuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cyksIHtcbiAgICAgICAgICAgICAgbmFtZTogJ0FnZ3JlZ2F0ZUVycm9yJyxcbiAgICAgICAgICAgICAgZXJyb3JzOiB2YWx1ZS5lcnJvcnMsXG4gICAgICAgICAgICB9KTtcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgLy8gYEZhdGFsRXJyb3JgIGFuZCBgUmV0cnlhYmxlRXJyb3JgIGFyZSBub3QgYnVpbHQtaW4gYnJvd3NlciBnbG9iYWxzLFxuICAgIC8vIHNvIHdlIGNhbid0IHJlc29sdmUgYSBjb25zdHJ1Y3RvciBmcm9tIGdsb2JhbFRoaXMuIFRoZSB3ZWIgbzExeSBVSVxuICAgIC8vIGRvZXNuJ3QgbmVlZCBgaW5zdGFuY2VvZiBGYXRhbEVycm9yYCB0byBwYXNzIChubyB1c2VyIGNvZGUgcnVuc1xuICAgIC8vIGhlcmUpIOKAlCBpdCBqdXN0IG5lZWRzIGBuYW1lYCwgYG1lc3NhZ2VgLCBgc3RhY2tgLCBhbmQgYW55IGV4dHJhXG4gICAgLy8gZW51bWVyYWJsZSBmaWVsZHMgdG8gcmVuZGVyLiBDb25zdHJ1Y3QgYSBwbGFpbiBgRXJyb3JgIHdpdGggYG5hbWVgXG4gICAgLy8gc2V0OyBPYmplY3RJbnNwZWN0b3IgcmVhZHMgYGNvbnN0cnVjdG9yLm5hbWVgIGZvciB0aGUgZGlzcGxheWVkXG4gICAgLy8gY2xhc3MgbGFiZWwsIGJ1dCB3ZSBkb24ndCBoYXZlIHRoZSByZWFsIGNsYXNzLCBzbyB3ZSBlbWl0IGEgdGFnZ2VkXG4gICAgLy8gRXJyb3Igd2hvc2UgYG5hbWVgIGZpZWxkIGNhcnJpZXMgdGhlIGNsYXNzIGlkZW50aXR5LiBUaGlzIG1hdGNoZXNcbiAgICAvLyBob3cgdGhlIGV4aXN0aW5nIGJhc2UgYEVycm9yYCByZXZpdmVyIHByZXNlbnRzIHVua25vd24gc3ViY2xhc3Nlcy5cbiAgICBGYXRhbEVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpO1xuICAgICAgZXJyb3IubmFtZSA9ICdGYXRhbEVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgSG9va0NvbmZsaWN0RXJyb3I6ICh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3Qgb3B0cyA9ICdjYXVzZScgaW4gdmFsdWUgPyB7IGNhdXNlOiB2YWx1ZS5jYXVzZSB9IDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgRXJyb3IodmFsdWUubWVzc2FnZSwgb3B0cykgYXMgRXJyb3IgJiB7XG4gICAgICAgIHRva2VuPzogc3RyaW5nO1xuICAgICAgICBjb25mbGljdGluZ1J1bklkPzogc3RyaW5nO1xuICAgICAgfTtcbiAgICAgIGVycm9yLm5hbWUgPSAnSG9va0NvbmZsaWN0RXJyb3InO1xuICAgICAgZXJyb3IudG9rZW4gPSB2YWx1ZS50b2tlbjtcbiAgICAgIGlmICh2YWx1ZS5jb25mbGljdGluZ1J1bklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29uZmxpY3RpbmdSdW5JZCA9IHZhbHVlLmNvbmZsaWN0aW5nUnVuSWQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIFJldHJ5YWJsZUVycm9yOiAodmFsdWUpID0+IHtcbiAgICAgIGNvbnN0IG9wdHMgPSAnY2F1c2UnIGluIHZhbHVlID8geyBjYXVzZTogdmFsdWUuY2F1c2UgfSA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UsIG9wdHMpIGFzIEVycm9yICYge1xuICAgICAgICByZXRyeUFmdGVyPzogRGF0ZTtcbiAgICAgIH07XG4gICAgICBlcnJvci5uYW1lID0gJ1JldHJ5YWJsZUVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlcnJvci5zdGFjayA9IHZhbHVlLnN0YWNrO1xuICAgICAgLy8gYHJldHJ5QWZ0ZXJgIGlzIHNlcmlhbGl6ZWQgYXMgYW4gZXBvY2ggbXMgbnVtYmVyIChzZWUgdGhlIHJ1bnRpbWVcbiAgICAgIC8vIFJldHJ5YWJsZUVycm9yIHJlZHVjZXIgZm9yIHRoZSByYXRpb25hbGUgYXJvdW5kIHJlYWxtLXNhZmV0eSkuXG4gICAgICAvLyBSZWh5ZHJhdGUgYXMgYSBEYXRlIHNvIG8xMXkgY29uc3VtZXJzIGNhbiByZW5kZXIgaXQgZGlyZWN0bHkuXG4gICAgICAvLyBHdWFyZCBhZ2FpbnN0IHBheWxvYWRzIGZyb20gb2xkZXIgcnVudGltZSB2ZXJzaW9ucyB0aGF0IHByZWRhdGVcbiAgICAgIC8vIHRoZSBmaWVsZCDigJQgd2l0aG91dCB0aGlzIGNoZWNrLCBgbmV3IERhdGUodW5kZWZpbmVkKWAgd291bGRcbiAgICAgIC8vIHByb2R1Y2UgYW4gSW52YWxpZCBEYXRlIHJhdGhlciB0aGFuIG9taXR0aW5nIHRoZSBwcm9wZXJ0eS5cbiAgICAgIGlmICh2YWx1ZS5yZXRyeUFmdGVyICE9IG51bGwpIHtcbiAgICAgICAgZXJyb3IucmV0cnlBZnRlciA9IG5ldyBEYXRlKHZhbHVlLnJldHJ5QWZ0ZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVycm9yO1xuICAgIH0sXG4gICAgUnVudGltZURlY3J5cHRpb25FcnJvcjogKHZhbHVlKSA9PiB7XG4gICAgICBjb25zdCBvcHRzID0gJ2NhdXNlJyBpbiB2YWx1ZSA/IHsgY2F1c2U6IHZhbHVlLmNhdXNlIH0gOiB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlLCBvcHRzKSBhcyBFcnJvciAmIHtcbiAgICAgICAgY29udGV4dD86IHVua25vd247XG4gICAgICB9O1xuICAgICAgZXJyb3IubmFtZSA9ICdSdW50aW1lRGVjcnlwdGlvbkVycm9yJztcbiAgICAgIGlmICh2YWx1ZS5jb250ZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZXJyb3IuY29udGV4dCA9IHZhbHVlLmNvbnRleHQ7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIHJldHVybiBlcnJvcjtcbiAgICB9LFxuICAgIERPTUV4Y2VwdGlvbjogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBNb2Rlcm4gYnJvd3NlcnMgYW5kIE5vZGUgMTgrIGV4cG9zZSBgRE9NRXhjZXB0aW9uYCBvbiBnbG9iYWxUaGlzLlxuICAgICAgLy8gYEFib3J0Q29udHJvbGxlci5hYm9ydCgpYCB3aXRoIG5vIGFyZ3VtZW50IHN5bnRoZXNpemVzIG9uZSBhcyB0aGVcbiAgICAgIC8vIHNpZ25hbCdzIHJlYXNvbiwgc28gdGhpcyBpcyBhIGNvbW1vbiBwYXlsb2FkIGZvciBhbnkgYWJvcnRlZCBzdGVwLlxuICAgICAgY29uc3QgRyA9IGdsb2JhbFRoaXMgYXMgeyBET01FeGNlcHRpb24/OiB0eXBlb2YgRE9NRXhjZXB0aW9uIH07XG4gICAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGUgPSBuZXcgRy5ET01FeGNlcHRpb24odmFsdWUubWVzc2FnZSwgdmFsdWUubmFtZSk7XG4gICAgICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgICByZXR1cm4gZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKHZhbHVlLm1lc3NhZ2UpO1xuICAgICAgZXJyb3IubmFtZSA9IHZhbHVlLm5hbWU7XG4gICAgICBpZiAodmFsdWUuc3RhY2sgIT09IHVuZGVmaW5lZCkgZXJyb3Iuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSB7XG4gICAgICAgIChlcnJvciBhcyBFcnJvciAmIHsgY2F1c2U/OiB1bmtub3duIH0pLmNhdXNlID0gdmFsdWUuY2F1c2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gZXJyb3I7XG4gICAgfSxcbiAgICBGbG9hdDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgRmxvYXQzMkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgRmxvYXQ2NEFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEZsb2F0NjRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIEludDhBcnJheTogKHZhbHVlOiBzdHJpbmcpID0+IG5ldyBJbnQ4QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDE2QXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBJbnQzMkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IEludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcbiAgICBNYXA6ICh2YWx1ZSkgPT4gbmV3IE1hcCh2YWx1ZSksXG4gICAgUmVnRXhwOiAodmFsdWUpID0+IG5ldyBSZWdFeHAodmFsdWUuc291cmNlLCB2YWx1ZS5mbGFncyksXG4gICAgU2V0OiAodmFsdWUpID0+IG5ldyBTZXQodmFsdWUpLFxuICAgIFVpbnQ4QXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDhBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQ4Q2xhbXBlZEFycmF5OiAodmFsdWU6IHN0cmluZykgPT5cbiAgICAgIG5ldyBVaW50OENsYW1wZWRBcnJheShyZXZpdmVBcnJheUJ1ZmZlcih2YWx1ZSkpLFxuICAgIFVpbnQxNkFycmF5OiAodmFsdWU6IHN0cmluZykgPT4gbmV3IFVpbnQxNkFycmF5KHJldml2ZUFycmF5QnVmZmVyKHZhbHVlKSksXG4gICAgVWludDMyQXJyYXk6ICh2YWx1ZTogc3RyaW5nKSA9PiBuZXcgVWludDMyQXJyYXkocmV2aXZlQXJyYXlCdWZmZXIodmFsdWUpKSxcblxuICAgIEhlYWRlcnM6ICh2YWx1ZSkgPT4gbmV3IEhlYWRlcnModmFsdWUpLFxuICAgIFJlcXVlc3Q6ICh2YWx1ZSkgPT4ge1xuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBSZXF1ZXN0OiBmdW5jdGlvbiAoKSB7fSB9LlJlcXVlc3QhO1xuICAgICAgY29uc3Qgb2JqID0gT2JqZWN0LmNyZWF0ZShjdG9yLnByb3RvdHlwZSk7XG4gICAgICBPYmplY3QuYXNzaWduKG9iaiwge1xuICAgICAgICBtZXRob2Q6IHZhbHVlLm1ldGhvZCxcbiAgICAgICAgdXJsOiB2YWx1ZS51cmwsXG4gICAgICAgIGhlYWRlcnM6IG5ldyBIZWFkZXJzKHZhbHVlLmhlYWRlcnMpLFxuICAgICAgICBib2R5OiB2YWx1ZS5ib2R5LFxuICAgICAgICBkdXBsZXg6IHZhbHVlLmR1cGxleCxcbiAgICAgICAgLi4uKHZhbHVlLnJlc3BvbnNlV3JpdGFibGVcbiAgICAgICAgICA/IHsgcmVzcG9uc2VXcml0YWJsZTogdmFsdWUucmVzcG9uc2VXcml0YWJsZSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgICBSZXNwb25zZTogKHZhbHVlKSA9PiB7XG4gICAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9jb21wbGV4aXR5L3VzZUFycm93RnVuY3Rpb246IGFycm93IGZ1bmN0aW9ucyBoYXZlIG5vIC5wcm90b3R5cGVcbiAgICAgIGNvbnN0IGN0b3IgPSB7IFJlc3BvbnNlOiBmdW5jdGlvbiAoKSB7fSB9LlJlc3BvbnNlITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHtcbiAgICAgICAgc3RhdHVzOiB2YWx1ZS5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHZhbHVlLnN0YXR1c1RleHQsXG4gICAgICAgIHVybDogdmFsdWUudXJsLFxuICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh2YWx1ZS5oZWFkZXJzKSxcbiAgICAgICAgYm9keTogdmFsdWUuYm9keSxcbiAgICAgICAgcmVkaXJlY3RlZDogdmFsdWUucmVkaXJlY3RlZCxcbiAgICAgICAgdHlwZTogdmFsdWUudHlwZSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9LFxuICAgIFVSTDogKHZhbHVlKSA9PiBuZXcgVVJMKHZhbHVlKSxcbiAgICBVUkxTZWFyY2hQYXJhbXM6ICh2YWx1ZSkgPT4gbmV3IFVSTFNlYXJjaFBhcmFtcyh2YWx1ZSA9PT0gJy4nID8gJycgOiB2YWx1ZSksXG5cbiAgICAvLyBXZWItc3BlY2lmaWMgb3ZlcnJpZGVzIGZvciBjbGFzcyBpbnN0YW5jZXMuXG4gICAgLy8gQ3JlYXRlIG9iamVjdHMgd2l0aCBhIGR5bmFtaWNhbGx5LW5hbWVkIGNvbnN0cnVjdG9yIHNvIHRoYXRcbiAgICAvLyB0aGUgZGF0YSBpbnNwZWN0b3Igc2hvd3MgdGhlIGNsYXNzIG5hbWUgKGl0IHJlYWRzIGNvbnN0cnVjdG9yLm5hbWUpLlxuICAgIENsYXNzOiAodmFsdWUpID0+IGA8Y2xhc3M6JHtleHRyYWN0Q2xhc3NOYW1lKHZhbHVlLmNsYXNzSWQpfT5gLFxuICAgIEluc3RhbmNlOiAodmFsdWUpID0+IHtcbiAgICAgIC8vIFJ1biBpbnN0YW5jZXMgYXJlIHJlbmRlcmVkIGFzIGNsaWNrYWJsZSBSdW5SZWYgYmFkZ2VzXG4gICAgICBjb25zdCBydW5SZWYgPSBzZXJpYWxpemVkSW5zdGFuY2VUb1JlZih2YWx1ZSk7XG4gICAgICBpZiAoaXNSdW5SZWYocnVuUmVmKSkge1xuICAgICAgICByZXR1cm4gcnVuUmVmO1xuICAgICAgfVxuICAgICAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB2YWx1ZS5kYXRhO1xuICAgICAgY29uc3QgcHJvcHMgPVxuICAgICAgICBkYXRhICYmIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyA/IHsgLi4uZGF0YSB9IDogeyB2YWx1ZTogZGF0YSB9O1xuICAgICAgLy8gQ3JlYXRlIGEgY29uc3RydWN0b3Igd2l0aCB0aGUgcmlnaHQgbmFtZSB1c2luZyBjb21wdXRlZCBwcm9wZXJ0eVxuICAgICAgLy8gc28gdGhlIGRhdGEgaW5zcGVjdG9yJ3MgYG9iamVjdC5jb25zdHJ1Y3Rvci5uYW1lYCBzaG93cyB0aGUgY2xhc3MgbmFtZS5cbiAgICAgIC8vIE11c3QgdXNlIGBmdW5jdGlvbmAgKG5vdCBhcnJvdykgYmVjYXVzZSBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlLlxuICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gICAgICBjb25zdCBjdG9yID0geyBbY2xhc3NOYW1lXTogZnVuY3Rpb24gKCkge30gfVtjbGFzc05hbWVdITtcbiAgICAgIGNvbnN0IG9iaiA9IE9iamVjdC5jcmVhdGUoY3Rvci5wcm90b3R5cGUpO1xuICAgICAgT2JqZWN0LmFzc2lnbihvYmosIHByb3BzKTtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfSxcbiAgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQcmUtYnVpbHQgd2ViIHJldml2ZXJzIChjYWNoZWQgZm9yIHBlcmZvcm1hbmNlKVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmxldCBjYWNoZWRSZXZpdmVyczogUmV2aXZlcnMgfCBudWxsID0gbnVsbDtcblxuZnVuY3Rpb24gZ2V0UmV2aXZlcnMoKTogUmV2aXZlcnMge1xuICBpZiAoIWNhY2hlZFJldml2ZXJzKSB7XG4gICAgY2FjaGVkUmV2aXZlcnMgPSBnZXRXZWJSZXZpdmVycygpO1xuICB9XG4gIHJldHVybiBjYWNoZWRSZXZpdmVycztcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBzZXJpYWxpemVkIGRhdGEgZmllbGRzIG9mIGEgcmVzb3VyY2UgZm9yIHdlYiBkaXNwbGF5LlxuICpcbiAqIFVzZXMgYnJvd3Nlci1zYWZlIHJldml2ZXJzIChhdG9iIGZvciBiYXNlNjQsIENsYXNzSW5zdGFuY2VSZWYgZm9yXG4gKiBjdXN0b20gY2xhc3NlcywgU3RyZWFtUmVmIGZvciBzdHJlYW1zKS4gQ2FsbCB0aGlzIG9uIGRhdGEgcmVjZWl2ZWRcbiAqIGZyb20gdGhlIHNlcnZlciBiZWZvcmUgcGFzc2luZyBpdCB0byBVSSBjb21wb25lbnRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaHlkcmF0ZVJlc291cmNlSU88VD4ocmVzb3VyY2U6IFQpOiBUIHtcbiAgY29uc3QgaHlkcmF0ZWQgPSBoeWRyYXRlUmVzb3VyY2VJT0dlbmVyaWMoXG4gICAgcmVzb3VyY2UgYXMgYW55LFxuICAgIGdldFJldml2ZXJzKClcbiAgKSBhcyBUO1xuICByZXR1cm4gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VycyhoeWRyYXRlZCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jcnlwdGVkIGRhdGEgZGlzcGxheSBtYXJrZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IEVOQ1JZUFRFRF9ESVNQTEFZX05BTUUgPSAnRW5jcnlwdGVkJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZW5jcnlwdGVkIGRhdGEuXG4gKlxuICogVXNlcyB0aGUgc2FtZSBuYW1lZC1jb25zdHJ1Y3RvciB0cmljayBhcyB0aGUgSW5zdGFuY2UgcmV2aXZlciBzbyB0aGF0XG4gKiBPYmplY3RJbnNwZWN0b3IgcmVuZGVycyB0aGUgY29uc3RydWN0b3IgbmFtZSAoXCLwn5SSIEVuY3J5cHRlZFwiKSB3aXRoIG5vXG4gKiBleHBhbmRhYmxlIGNoaWxkcmVuLiBUaGUgb3JpZ2luYWwgZW5jcnlwdGVkIGJ5dGVzIGFyZSBzdG9yZWQgaW4gYVxuICogbm9uLWVudW1lcmFibGUgcHJvcGVydHkgZm9yIGxhdGVyIGRlY3J5cHRpb24uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUVuY3J5cHRlZE1hcmtlcihkYXRhOiBVaW50OEFycmF5KTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFTkNSWVBURURfRElTUExBWV9OQU1FXTogZnVuY3Rpb24gKCkge30gfVtcbiAgICBFTkNSWVBURURfRElTUExBWV9OQU1FXG4gIF0hO1xuICBjb25zdCBvYmogPSBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbiAgLy8gU3RvcmUgb3JpZ2luYWwgYnl0ZXMgZm9yIGRlY3J5cHRpb24sIGJ1dCBub24tZW51bWVyYWJsZSBzb1xuICAvLyBPYmplY3RJbnNwZWN0b3IgZG9lc24ndCBzaG93IHRoZW0gYXMgY2hpbGRyZW5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ19fZW5jcnlwdGVkRGF0YScsIHtcbiAgICB2YWx1ZTogZGF0YSxcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB9KTtcbiAgcmV0dXJuIG9iajtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZW5jcnlwdGVkIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbmNyeXB0ZWRNYXJrZXIodmFsdWU6IHVua25vd24pOiBib29sZWFuIHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICB2YWx1ZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gRU5DUllQVEVEX0RJU1BMQVlfTkFNRVxuICApO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkaXNwbGF5IG1hcmtlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgRVhQSVJFRF9ESVNQTEFZX05BTUUgPSAnRXhwaXJlZCBEYXRhJztcblxuLyoqXG4gKiBDcmVhdGUgYSBkaXNwbGF5LWZyaWVuZGx5IG9iamVjdCBmb3IgZXhwaXJlZCBkYXRhLlxuICpcbiAqIFVzZXMgdGhlIHNhbWUgbmFtZWQtY29uc3RydWN0b3IgdHJpY2sgYXMgdGhlIGVuY3J5cHRlZCBtYXJrZXIgc28gdGhhdFxuICogT2JqZWN0SW5zcGVjdG9yIHJlbmRlcnMgdGhlIGNvbnN0cnVjdG9yIG5hbWUgKFwiRXhwaXJlZCBEYXRhXCIpIHdpdGggbm9cbiAqIGV4cGFuZGFibGUgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUV4cGlyZWRNYXJrZXIoKTogb2JqZWN0IHtcbiAgLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS91c2VBcnJvd0Z1bmN0aW9uOiBhcnJvdyBmdW5jdGlvbnMgaGF2ZSBubyAucHJvdG90eXBlXG4gIGNvbnN0IGN0b3IgPSB7IFtFWFBJUkVEX0RJU1BMQVlfTkFNRV06IGZ1bmN0aW9uICgpIHt9IH1bXG4gICAgRVhQSVJFRF9ESVNQTEFZX05BTUVcbiAgXSE7XG4gIHJldHVybiBPYmplY3QuY3JlYXRlKGN0b3IucHJvdG90eXBlKTtcbn1cblxuLyoqIENoZWNrIGlmIGEgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIGRpc3BsYXkgbWFya2VyICovXG5leHBvcnQgZnVuY3Rpb24gaXNFeHBpcmVkTWFya2VyKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgdmFsdWUuY29uc3RydWN0b3I/Lm5hbWUgPT09IEVYUElSRURfRElTUExBWV9OQU1FXG4gICk7XG59XG5cbi8qKiBSZXBsYWNlIGEgc2luZ2xlIGZpZWxkIHZhbHVlIHdpdGggYSBkaXNwbGF5IG1hcmtlciBpZiBpdCdzIGVuY3J5cHRlZCBvciBleHBpcmVkLiAqL1xuZnVuY3Rpb24gdG9EaXNwbGF5TWFya2VyKHZhbHVlOiB1bmtub3duKTogdW5rbm93biB7XG4gIGlmIChpc0VuY3J5cHRlZERhdGEodmFsdWUpKSByZXR1cm4gY3JlYXRlRW5jcnlwdGVkTWFya2VyKHZhbHVlIGFzIFVpbnQ4QXJyYXkpO1xuICBpZiAoaXNFeHBpcmVkU3R1Yih2YWx1ZSkpIHJldHVybiBjcmVhdGVFeHBpcmVkTWFya2VyKCk7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBQb3N0LXByb2Nlc3MgaHlkcmF0ZWQgcmVzb3VyY2UgZGF0YTogcmVwbGFjZSBlbmNyeXB0ZWQgVWludDhBcnJheSB2YWx1ZXNcbiAqIGFuZCBleHBpcmVkIHN0dWJzIHdpdGggZGlzcGxheS1mcmllbmRseSBtYXJrZXIgb2JqZWN0cyBpbiBrbm93biBkYXRhIGZpZWxkcy5cbiAqL1xuZnVuY3Rpb24gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VyczxUPihyZXNvdXJjZTogVCk6IFQge1xuICBpZiAoIXJlc291cmNlIHx8IHR5cGVvZiByZXNvdXJjZSAhPT0gJ29iamVjdCcpIHJldHVybiByZXNvdXJjZTtcbiAgY29uc3QgciA9IHJlc291cmNlIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICBjb25zdCByZXN1bHQgPSB7IC4uLnIgfTtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgcmVzdWx0W2tleV0gPSB0b0Rpc3BsYXlNYXJrZXIocmVzdWx0W2tleV0pO1xuICB9XG5cbiAgaWYgKHJlc3VsdC5ldmVudERhdGEgJiYgdHlwZW9mIHJlc3VsdC5ldmVudERhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgZXZlbnRUeXBlID1cbiAgICAgIHR5cGVvZiByZXN1bHQuZXZlbnRUeXBlID09PSAnc3RyaW5nJyA/IHJlc3VsdC5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gZ2V0RXZlbnREYXRhUmVmRmllbGRzKGV2ZW50VHlwZSk7XG4gICAgY29uc3QgZWQgPSB7IC4uLihyZXN1bHQuZXZlbnREYXRhIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KSB9O1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHJlZktleXMpIHtcbiAgICAgIGlmIChrZXkgaW4gZWQpIHtcbiAgICAgICAgZWRba2V5XSA9IHRvRGlzcGxheU1hcmtlcihlZFtrZXldKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0LmV2ZW50RGF0YSA9IGVkO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdCBhcyBUO1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgcmVzb3VyY2UgZGF0YSB3aXRoIGRlY3J5cHRpb24gc3VwcG9ydC5cbiAqXG4gKiBXaGVuIGEga2V5IGlzIHByb3ZpZGVkLCBlbmNyeXB0ZWQgZmllbGRzIGFyZSBkZWNyeXB0ZWQgYmVmb3JlIGh5ZHJhdGlvbi5cbiAqIFRoaXMgaXMgdGhlIGFzeW5jIHZlcnNpb24gdXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBcIkRlY3J5cHRcIiBpbiB0aGUgd2ViIFVJLlxuICpcbiAqIEhhbmRsZXMgYm90aCB0b3AtbGV2ZWwgZmllbGRzIChpbnB1dCwgb3V0cHV0LCBtZXRhZGF0YSkgYW5kIG5lc3RlZCBldmVudERhdGFcbiAqIHBheWxvYWQgZmllbGRzIGZvciB0aGF0IGV2ZW50IHR5cGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJT1dpdGhLZXk8VD4oXG4gIHJlc291cmNlOiBULFxuICBrZXk6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gaHlkcmF0ZVJlc291cmNlSU9Bc3luYyhyZXNvdXJjZSwga2V5KTtcbn1cblxuLyoqXG4gKiBBc3luYyBoeWRyYXRpb24gZm9yIHdlYiBkaXNwbGF5LlxuICpcbiAqIFRoaXMgZm9sbG93cyB0aGUgc2FtZSByZXNvdXJjZS1maWVsZCBtYXBwaW5nIGFzIHtAbGluayBoeWRyYXRlUmVzb3VyY2VJT30sXG4gKiBidXQgY2FuIGFsc28gaW5mbGF0ZSBjb21wcmVzc2VkIGJyb3dzZXIgcGF5bG9hZHMgdGhyb3VnaCB0aGUgcmVnaXN0ZXJlZFxuICogenN0ZCBXQVNNIGRlY29kZXIuIFdoZW4gYSBrZXkgaXMgcHJvdmlkZWQsIGVuY3J5cHRlZCBmaWVsZHMgYXJlIGRlY3J5cHRlZFxuICogZmlyc3QgYW5kIHRoZW4gaW5mbGF0ZWQvaHlkcmF0ZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJT0FzeW5jPFQ+KFxuICByZXNvdXJjZTogVCxcbiAga2V5PzogVWludDhBcnJheVxuKTogUHJvbWlzZTxUPiB7XG4gIGNvbnN0IHsgaHlkcmF0ZURhdGFXaXRoS2V5IH0gPSBhd2FpdCBpbXBvcnQoXG4gICAgJ0B3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb24tZm9ybWF0J1xuICApO1xuICAvLyBQYXlsb2FkcyBtYXkgYmUgenN0ZC1jb21wcmVzc2VkICh0aGUgV2ViIERlY29tcHJlc3Npb25TdHJlYW0gaGFzIG5vIHpzdGQpO1xuICAvLyByZWdpc3RlciB0aGUgV0FTTS1iYWNrZWQgYnJvd3NlciBkZWNvZGVyIGJlZm9yZSBoeWRyYXRpbmcuIElkZW1wb3RlbnQgYW5kXG4gIC8vIGxhenkg4oCUIHRoZSBXQVNNIGlzIG9ubHkgY29tcGlsZWQgd2hlbiBhIHpzdGQgcGF5bG9hZCBpcyBhY3R1YWxseSBkZWNvZGVkLlxuICBjb25zdCB7IGVuc3VyZVpzdGREZWNvZGVyUmVnaXN0ZXJlZCB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICcuL3pzdGQtYnJvd3Nlci1kZWNvZGVyLmpzJ1xuICApO1xuICBlbnN1cmVac3RkRGVjb2RlclJlZ2lzdGVyZWQoKTtcbiAgY29uc3QgY3J5cHRvS2V5ID0ga2V5XG4gICAgPyBhd2FpdCBpbXBvcnQoJ0B3b3JrZmxvdy9jb3JlL2VuY3J5cHRpb24nKS50aGVuKCh7IGltcG9ydEtleSB9KSA9PlxuICAgICAgICBpbXBvcnRLZXkoa2V5KVxuICAgICAgKVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCByZXZpdmVycyA9IGdldFJldml2ZXJzKCk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZUZpZWxkKHZhbHVlOiB1bmtub3duKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgLy8gQWxyZWFkeS1oeWRyYXRlZDogZW5jcnlwdGVkIG1hcmtlciB3aXRoIHN0b3JlZCBieXRlc1xuICAgIGlmIChpc0VuY3J5cHRlZE1hcmtlcih2YWx1ZSkpIHtcbiAgICAgIGNvbnN0IHJhdyA9ICh2YWx1ZSBhcyBhbnkpLl9fZW5jcnlwdGVkRGF0YSBhcyBVaW50OEFycmF5O1xuICAgICAgcmV0dXJuIGNyeXB0b0tleSA/IGh5ZHJhdGVEYXRhV2l0aEtleShyYXcsIHJldml2ZXJzLCBjcnlwdG9LZXkpIDogdmFsdWU7XG4gICAgfVxuICAgIC8vIFJhdyBVaW50OEFycmF5OiBtYXkgYmUgZW5jcnlwdGVkLCBjb21wcmVzc2VkLCBvciBwbGFpbiBkZXZhbHVlLlxuICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YVdpdGhLZXkodmFsdWUsIHJldml2ZXJzLCBjcnlwdG9LZXkpO1xuICAgIH1cbiAgICAvLyBOb3Qgc2VyaWFsaXplZCDigJQgcmV0dXJuIGFzLWlzLlxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgY29uc3QgcmVzdWx0ID0geyAuLi5yIH07XG5cbiAgLy8gRGVjcnlwdCArIGh5ZHJhdGUgdG9wLWxldmVsIHNlcmlhbGl6ZWQgZmllbGRzIChydW5zLCBzdGVwcywgaG9va3MpXG4gIGZvciAoY29uc3QgZmllbGQgb2YgWydpbnB1dCcsICdvdXRwdXQnLCAnbWV0YWRhdGEnLCAnZXJyb3InXSkge1xuICAgIGlmIChmaWVsZCBpbiByZXN1bHQpIHtcbiAgICAgIHJlc3VsdFtmaWVsZF0gPSBhd2FpdCBoeWRyYXRlRmllbGQocmVzdWx0W2ZpZWxkXSk7XG4gICAgfVxuICB9XG5cbiAgLy8gSHlkcmF0ZSBldmVudERhdGEgc3ViZmllbGRzIChldmVudHMpXG4gIGlmIChyZXN1bHQuZXZlbnREYXRhICYmIHR5cGVvZiByZXN1bHQuZXZlbnREYXRhID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IGV2ZW50VHlwZSA9XG4gICAgICB0eXBlb2YgcmVzdWx0LmV2ZW50VHlwZSA9PT0gJ3N0cmluZycgPyByZXN1bHQuZXZlbnRUeXBlIDogJyc7XG4gICAgY29uc3QgcmVmS2V5cyA9IGdldEV2ZW50RGF0YVJlZkZpZWxkcyhldmVudFR5cGUpO1xuICAgIGNvbnN0IGV2ZW50RGF0YSA9IHsgLi4uKHJlc3VsdC5ldmVudERhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIH07XG4gICAgZm9yIChjb25zdCBmaWVsZCBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoZmllbGQgaW4gZXZlbnREYXRhKSB7XG4gICAgICAgIGV2ZW50RGF0YVtmaWVsZF0gPSBhd2FpdCBoeWRyYXRlRmllbGQoZXZlbnREYXRhW2ZpZWxkXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5ldmVudERhdGEgPSBldmVudERhdGE7XG4gIH1cblxuICByZXR1cm4gcmVwbGFjZUVuY3J5cHRlZEFuZEV4cGlyZWRXaXRoTWFya2VycyhyZXN1bHQgYXMgVCk7XG59XG5cbi8qKlxuICogQ2hlY2sgd2hldGhlciBhIGh5ZHJhdGVkIHJlc291cmNlIChldmVudCwgc3RlcCwgcnVuLCBldGMuKSBjb250YWlucyBhbnlcbiAqIGVuY3J5cHRlZCBkaXNwbGF5IG1hcmtlcnMuIEluc3BlY3RzIHRoZSBzdGFuZGFyZCB0b3AtbGV2ZWwgZmllbGRzXG4gKiAoYGlucHV0YCwgYG91dHB1dGAsIGBlcnJvcmAsIGBtZXRhZGF0YWApIGFzIHdlbGwgYXMgdGhlIGV2ZW50LXR5cGUtc3BlY2lmaWNcbiAqIGBldmVudERhdGFgIHJlZiBmaWVsZHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoYXNFbmNyeXB0ZWRGaWVsZHMocmVzb3VyY2U6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFyZXNvdXJjZSB8fCB0eXBlb2YgcmVzb3VyY2UgIT09ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IHIgPSByZXNvdXJjZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBmb3IgKGNvbnN0IGtleSBvZiBbJ2lucHV0JywgJ291dHB1dCcsICdtZXRhZGF0YScsICdlcnJvciddKSB7XG4gICAgaWYgKGlzRW5jcnlwdGVkTWFya2VyKHJba2V5XSkpIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHIuZXZlbnREYXRhICYmIHR5cGVvZiByLmV2ZW50RGF0YSA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBldmVudFR5cGUgPSB0eXBlb2Ygci5ldmVudFR5cGUgPT09ICdzdHJpbmcnID8gci5ldmVudFR5cGUgOiAnJztcbiAgICBjb25zdCByZWZLZXlzID0gZ2V0RXZlbnREYXRhUmVmRmllbGRzKGV2ZW50VHlwZSk7XG4gICAgY29uc3QgZWQgPSByLmV2ZW50RGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiByZWZLZXlzKSB7XG4gICAgICBpZiAoa2V5IGluIGVkICYmIGlzRW5jcnlwdGVkTWFya2VyKGVkW2tleV0pKSByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmFsc2U7XG59XG4iXX0=
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workflow/web-shared",
3
3
  "description": "Shared components for Workflow Observability UI",
4
- "version": "5.0.0-beta.26",
4
+ "version": "5.0.0-beta.27",
5
5
  "private": false,
6
6
  "files": [
7
7
  "dist",
@@ -55,9 +55,9 @@
55
55
  "streamdown": "2.3.0",
56
56
  "tailwind-merge": "3.5.0",
57
57
  "tailwindcss": "4",
58
- "@workflow/core": "5.0.0-beta.26",
59
- "@workflow/utils": "5.0.0-beta.4",
60
- "@workflow/world": "5.0.0-beta.14"
58
+ "@workflow/core": "5.0.0-beta.27",
59
+ "@workflow/utils": "5.0.0-beta.5",
60
+ "@workflow/world": "5.0.0-beta.15"
61
61
  },
62
62
  "devDependencies": {
63
63
  "@biomejs/biome": "^2.4.4",
@@ -65,9 +65,9 @@
65
65
  "@types/react": "19",
66
66
  "@types/react-dom": "19",
67
67
  "ai": "6.0.116",
68
- "typescript": "^5.9.3",
68
+ "typescript": "^6.0.3",
69
69
  "vitest": "^4.0.18",
70
- "@workflow/errors": "5.0.0-beta.8",
70
+ "@workflow/errors": "5.0.0-beta.9",
71
71
  "@workflow/tsconfig": "5.0.0-beta.0"
72
72
  },
73
73
  "scripts": {
@@ -0,0 +1,123 @@
1
+ import { afterEach, describe, expect, it, vi } from 'vitest';
2
+ import {
3
+ clampPanelWidth,
4
+ computeMaxPanelWidth,
5
+ MAIN_MIN_WIDTH,
6
+ PANEL_DEFAULT_WIDTH,
7
+ PANEL_HARD_MAX_WIDTH,
8
+ PANEL_MIN_WIDTH,
9
+ PANEL_WIDTH_STORAGE_KEY,
10
+ readStoredPanelWidth,
11
+ writeStoredPanelWidth,
12
+ } from './detail-panel-width';
13
+
14
+ function stubLocalStorage(overrides: Partial<Storage> = {}) {
15
+ const storage = {
16
+ getItem: vi.fn().mockReturnValue(null),
17
+ setItem: vi.fn(),
18
+ ...overrides,
19
+ };
20
+ vi.stubGlobal('window', { localStorage: storage });
21
+ return storage;
22
+ }
23
+
24
+ afterEach(() => {
25
+ vi.unstubAllGlobals();
26
+ });
27
+
28
+ describe('computeMaxPanelWidth', () => {
29
+ it('falls back to the hard max when the container is unmeasured', () => {
30
+ expect(computeMaxPanelWidth(0)).toBe(PANEL_HARD_MAX_WIDTH);
31
+ expect(computeMaxPanelWidth(-5)).toBe(PANEL_HARD_MAX_WIDTH);
32
+ });
33
+
34
+ it('reserves the main-area minimum', () => {
35
+ expect(computeMaxPanelWidth(1000)).toBe(1000 - MAIN_MIN_WIDTH);
36
+ });
37
+
38
+ it('caps at the hard max on very wide containers', () => {
39
+ expect(computeMaxPanelWidth(5000)).toBe(PANEL_HARD_MAX_WIDTH);
40
+ });
41
+
42
+ it('bottoms out at 0 when the container is smaller than the main minimum', () => {
43
+ expect(computeMaxPanelWidth(MAIN_MIN_WIDTH - 50)).toBe(0);
44
+ });
45
+ });
46
+
47
+ describe('clampPanelWidth', () => {
48
+ it('passes through widths within bounds', () => {
49
+ expect(clampPanelWidth(360, 1000)).toBe(360);
50
+ });
51
+
52
+ it('clamps to the panel minimum', () => {
53
+ expect(clampPanelWidth(100, 1000)).toBe(PANEL_MIN_WIDTH);
54
+ });
55
+
56
+ it('clamps to the container-relative maximum', () => {
57
+ expect(clampPanelWidth(900, 1000)).toBe(1000 - MAIN_MIN_WIDTH);
58
+ });
59
+
60
+ it('lets the max win below the crossover so the panel gives way, not the main area', () => {
61
+ // Container too small for both floors: panel compresses below its own min.
62
+ const available = PANEL_MIN_WIDTH + MAIN_MIN_WIDTH - 100;
63
+ expect(clampPanelWidth(360, available)).toBe(available - MAIN_MIN_WIDTH);
64
+ });
65
+ });
66
+
67
+ describe('readStoredPanelWidth', () => {
68
+ it('returns the default when window is unavailable (SSR)', () => {
69
+ expect(readStoredPanelWidth()).toBe(PANEL_DEFAULT_WIDTH);
70
+ });
71
+
72
+ it('returns the stored value when valid', () => {
73
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue('512') });
74
+ expect(readStoredPanelWidth()).toBe(512);
75
+ });
76
+
77
+ it('returns the default for missing or unparseable values', () => {
78
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue(null) });
79
+ expect(readStoredPanelWidth()).toBe(PANEL_DEFAULT_WIDTH);
80
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue('not-a-number') });
81
+ expect(readStoredPanelWidth()).toBe(PANEL_DEFAULT_WIDTH);
82
+ });
83
+
84
+ it('clamps stored values to absolute bounds only', () => {
85
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue('-20') });
86
+ expect(readStoredPanelWidth()).toBe(PANEL_MIN_WIDTH);
87
+ stubLocalStorage({ getItem: vi.fn().mockReturnValue('99999') });
88
+ expect(readStoredPanelWidth()).toBe(PANEL_HARD_MAX_WIDTH);
89
+ });
90
+
91
+ it('returns the default when storage access throws', () => {
92
+ stubLocalStorage({
93
+ getItem: vi.fn().mockImplementation(() => {
94
+ throw new Error('denied');
95
+ }),
96
+ });
97
+ expect(readStoredPanelWidth()).toBe(PANEL_DEFAULT_WIDTH);
98
+ });
99
+ });
100
+
101
+ describe('writeStoredPanelWidth', () => {
102
+ it('is a no-op when window is unavailable (SSR)', () => {
103
+ expect(() => writeStoredPanelWidth(400)).not.toThrow();
104
+ });
105
+
106
+ it('rounds and writes the value', () => {
107
+ const storage = stubLocalStorage();
108
+ writeStoredPanelWidth(412.6);
109
+ expect(storage.setItem).toHaveBeenCalledWith(
110
+ PANEL_WIDTH_STORAGE_KEY,
111
+ '413'
112
+ );
113
+ });
114
+
115
+ it('swallows storage errors (private mode, quota)', () => {
116
+ stubLocalStorage({
117
+ setItem: vi.fn().mockImplementation(() => {
118
+ throw new Error('quota');
119
+ }),
120
+ });
121
+ expect(() => writeStoredPanelWidth(400)).not.toThrow();
122
+ });
123
+ });
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Width model for the span detail panel: the stored value is the user's
3
+ * preferred width (absolute px, persisted to localStorage on explicit
4
+ * interaction only), while the container-relative maximum is applied at
5
+ * render time — so a width preferred on a wide screen survives a narrower
6
+ * session and restores when the viewer grows again.
7
+ */
8
+
9
+ /** Floor for the detail panel — matches the previous `clamp(280px, …)` floor. */
10
+ export const PANEL_MIN_WIDTH = 280;
11
+
12
+ /**
13
+ * Absolute ceiling enforced at the storage layer so a corrupt or stale stored
14
+ * value can never wedge the layout open.
15
+ */
16
+ export const PANEL_HARD_MAX_WIDTH = 1300;
17
+
18
+ /** Default width — matches the previous fixed 360px column. */
19
+ export const PANEL_DEFAULT_WIDTH = 360;
20
+
21
+ /**
22
+ * Width the main (event list + timeline) area keeps while the panel is
23
+ * resized or the container shrinks. Below `PANEL_MIN_WIDTH + MAIN_MIN_WIDTH`
24
+ * of container the panel gives way first, compressing below its own floor —
25
+ * the list and timeline stay usable at the panel's expense.
26
+ */
27
+ export const MAIN_MIN_WIDTH = 400;
28
+
29
+ export const PANEL_WIDTH_STORAGE_KEY = 'workflow-trace-detail-panel-width';
30
+
31
+ function clamp(value: number, min: number, max: number): number {
32
+ return Math.min(Math.max(value, min), max);
33
+ }
34
+
35
+ export function computeMaxPanelWidth(availableWidth: number): number {
36
+ if (availableWidth <= 0) return PANEL_HARD_MAX_WIDTH;
37
+ return Math.min(
38
+ Math.max(availableWidth - MAIN_MIN_WIDTH, 0),
39
+ PANEL_HARD_MAX_WIDTH
40
+ );
41
+ }
42
+
43
+ /**
44
+ * Note: when the container is too small to honor both floors
45
+ * (`availableWidth < PANEL_MIN_WIDTH + MAIN_MIN_WIDTH`), the max wins and the
46
+ * panel compresses below `PANEL_MIN_WIDTH`.
47
+ */
48
+ export function clampPanelWidth(width: number, availableWidth: number): number {
49
+ return clamp(width, PANEL_MIN_WIDTH, computeMaxPanelWidth(availableWidth));
50
+ }
51
+
52
+ export function readStoredPanelWidth(): number {
53
+ if (typeof window === 'undefined') return PANEL_DEFAULT_WIDTH;
54
+ try {
55
+ const raw = window.localStorage.getItem(PANEL_WIDTH_STORAGE_KEY);
56
+ const value = raw ? Number(raw) : Number.NaN;
57
+ if (!Number.isFinite(value)) return PANEL_DEFAULT_WIDTH;
58
+ // Only enforce absolute bounds at the storage layer; the container-relative
59
+ // max is applied at render time (see module docs).
60
+ return clamp(value, PANEL_MIN_WIDTH, PANEL_HARD_MAX_WIDTH);
61
+ } catch {
62
+ return PANEL_DEFAULT_WIDTH;
63
+ }
64
+ }
65
+
66
+ export function writeStoredPanelWidth(width: number): void {
67
+ if (typeof window === 'undefined') return;
68
+ try {
69
+ window.localStorage.setItem(
70
+ PANEL_WIDTH_STORAGE_KEY,
71
+ String(Math.round(width))
72
+ );
73
+ } catch {
74
+ // Best-effort (private mode, quota).
75
+ }
76
+ }