@workflow/core 5.0.0-beta.36 → 5.0.0-beta.37

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 (112) hide show
  1. package/dist/capabilities.d.ts +6 -0
  2. package/dist/capabilities.d.ts.map +1 -1
  3. package/dist/capabilities.js +13 -1
  4. package/dist/encryption.d.ts +15 -2
  5. package/dist/encryption.d.ts.map +1 -1
  6. package/dist/encryption.js +28 -7
  7. package/dist/flushable-stream.d.ts +26 -0
  8. package/dist/flushable-stream.d.ts.map +1 -1
  9. package/dist/flushable-stream.js +63 -187
  10. package/dist/index.d.ts +1 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +2 -2
  13. package/dist/log-format.js +3 -3
  14. package/dist/private.d.ts +76 -33
  15. package/dist/private.d.ts.map +1 -1
  16. package/dist/private.js +149 -22
  17. package/dist/replay-payload-cache.d.ts +3 -2
  18. package/dist/replay-payload-cache.d.ts.map +1 -1
  19. package/dist/replay-payload-cache.js +8 -2
  20. package/dist/runtime/count-step-started-events.d.ts +52 -0
  21. package/dist/runtime/count-step-started-events.d.ts.map +1 -0
  22. package/dist/runtime/count-step-started-events.js +72 -0
  23. package/dist/runtime/helpers.d.ts +41 -12
  24. package/dist/runtime/helpers.d.ts.map +1 -1
  25. package/dist/runtime/helpers.js +75 -22
  26. package/dist/runtime/resume-hook.d.ts +2 -2
  27. package/dist/runtime/resume-hook.d.ts.map +1 -1
  28. package/dist/runtime/resume-hook.js +174 -55
  29. package/dist/runtime/run.d.ts.map +1 -1
  30. package/dist/runtime/run.js +3 -3
  31. package/dist/runtime/runs.d.ts.map +1 -1
  32. package/dist/runtime/runs.js +5 -3
  33. package/dist/runtime/start.d.ts.map +1 -1
  34. package/dist/runtime/start.js +65 -18
  35. package/dist/runtime/step-executor.d.ts +9 -8
  36. package/dist/runtime/step-executor.d.ts.map +1 -1
  37. package/dist/runtime/step-executor.js +17 -17
  38. package/dist/runtime/suspension-handler.d.ts.map +1 -1
  39. package/dist/runtime/suspension-handler.js +2 -3
  40. package/dist/runtime/world.d.ts +2 -7
  41. package/dist/runtime/world.d.ts.map +1 -1
  42. package/dist/runtime/world.js +3 -10
  43. package/dist/runtime.d.ts +1 -1
  44. package/dist/runtime.d.ts.map +1 -1
  45. package/dist/runtime.js +74 -122
  46. package/dist/sealed-box.d.ts +167 -0
  47. package/dist/sealed-box.d.ts.map +1 -0
  48. package/dist/sealed-box.js +571 -0
  49. package/dist/serialization/client.d.ts +3 -3
  50. package/dist/serialization/client.d.ts.map +1 -1
  51. package/dist/serialization/client.js +1 -1
  52. package/dist/serialization/codec.d.ts +6 -4
  53. package/dist/serialization/codec.d.ts.map +1 -1
  54. package/dist/serialization/codec.js +1 -1
  55. package/dist/serialization/encryption.d.ts +118 -17
  56. package/dist/serialization/encryption.d.ts.map +1 -1
  57. package/dist/serialization/encryption.js +131 -15
  58. package/dist/serialization/step.d.ts +4 -4
  59. package/dist/serialization/step.d.ts.map +1 -1
  60. package/dist/serialization/step.js +2 -2
  61. package/dist/serialization/types.d.ts +20 -0
  62. package/dist/serialization/types.d.ts.map +1 -1
  63. package/dist/serialization/types.js +11 -1
  64. package/dist/serialization-format.d.ts +44 -4
  65. package/dist/serialization-format.d.ts.map +1 -1
  66. package/dist/serialization-format.js +66 -9
  67. package/dist/serialization.d.ts +21 -21
  68. package/dist/serialization.d.ts.map +1 -1
  69. package/dist/serialization.js +496 -174
  70. package/dist/set-attributes.d.ts +2 -7
  71. package/dist/set-attributes.d.ts.map +1 -1
  72. package/dist/set-attributes.js +1 -6
  73. package/dist/step/context-storage.d.ts +2 -2
  74. package/dist/step/context-storage.d.ts.map +1 -1
  75. package/dist/step/context-storage.js +2 -2
  76. package/dist/step/writable-stream.d.ts.map +1 -1
  77. package/dist/step/writable-stream.js +14 -3
  78. package/dist/step.d.ts.map +1 -1
  79. package/dist/step.js +79 -8
  80. package/dist/symbols.d.ts +23 -10
  81. package/dist/symbols.d.ts.map +1 -1
  82. package/dist/symbols.js +24 -11
  83. package/dist/telemetry/semantic-conventions.d.ts +4 -4
  84. package/dist/telemetry/semantic-conventions.js +2 -2
  85. package/dist/version.d.ts +1 -1
  86. package/dist/version.js +2 -2
  87. package/dist/vm/index.d.ts.map +1 -1
  88. package/dist/vm/index.js +76 -9
  89. package/dist/workflow/abort-controller.d.ts +1 -1
  90. package/dist/workflow/abort-controller.d.ts.map +1 -1
  91. package/dist/workflow/abort-controller.js +36 -2
  92. package/dist/workflow/hook.d.ts.map +1 -1
  93. package/dist/workflow/hook.js +64 -24
  94. package/dist/workflow/index.d.ts +1 -1
  95. package/dist/workflow/index.d.ts.map +1 -1
  96. package/dist/workflow/index.js +2 -2
  97. package/dist/workflow/set-attributes.d.ts +0 -9
  98. package/dist/workflow/set-attributes.d.ts.map +1 -1
  99. package/dist/workflow/set-attributes.js +1 -6
  100. package/dist/workflow/sleep.d.ts.map +1 -1
  101. package/dist/workflow/sleep.js +21 -9
  102. package/dist/workflow.d.ts +2 -2
  103. package/dist/workflow.d.ts.map +1 -1
  104. package/dist/workflow.js +22 -83
  105. package/docs/api-reference/set-attributes.mdx +0 -4
  106. package/docs/how-it-works/cancellation.mdx +2 -2
  107. package/docs/how-it-works/code-transform.mdx +19 -15
  108. package/docs/how-it-works/framework-integrations.mdx +95 -341
  109. package/package.json +6 -6
  110. package/dist/runtime/step-handler.d.ts +0 -2
  111. package/dist/runtime/step-handler.d.ts.map +0 -1
  112. package/dist/runtime/step-handler.js +0 -839
@@ -8,6 +8,19 @@
8
8
  import { getEventDataRefFields } from '@workflow/world';
9
9
  import { parse, unflatten } from 'devalue';
10
10
  // ---------------------------------------------------------------------------
11
+ // Key material (browser-safe re-exports)
12
+ // ---------------------------------------------------------------------------
13
+ /**
14
+ * Re-exported from the envelope layer so browser consumers (web dashboard,
15
+ * web-shared) can resolve key material without importing
16
+ * `@workflow/core/serialization`, whose module graph reaches Node built-ins
17
+ * (`node:util`, `node:async_hooks`) and cannot be bundled for the browser.
18
+ *
19
+ * Everything below is Web Crypto only: `serialization/encryption.ts`,
20
+ * `encryption.ts` and `sealed-box.ts` are all free of Node dependencies.
21
+ */
22
+ export { decrypt as decryptEnvelope, deriveRunPayloadKeys, encrypt as encryptEnvelope, isRunPayloadKeys, isSealTarget, runPayloadKeys, sealTo, } from './serialization/encryption.js';
23
+ // ---------------------------------------------------------------------------
11
24
  // Format prefix constants and encoding/decoding
12
25
  // ---------------------------------------------------------------------------
13
26
  export const SerializationFormat = {
@@ -15,6 +28,17 @@ export const SerializationFormat = {
15
28
  DEVALUE_V1: 'devl',
16
29
  /** Encrypted payload (inner payload has its own format prefix after decryption) */
17
30
  ENCRYPTED: 'encr',
31
+ /**
32
+ * Sealed payload — asymmetrically encrypted to a run's X25519 public key
33
+ * (inner payload has its own format prefix after opening).
34
+ *
35
+ * Written by cross-run writers that hold only the recipient run's public
36
+ * key. Opening it requires the run's private scalar rather than the
37
+ * symmetric per-run key, so o11y display treats it as ciphertext via
38
+ * {@link isEncryptedData} but {@link hydrateDataWithKey} does not attempt
39
+ * an AES-GCM decrypt on it.
40
+ */
41
+ SEALED: 'encp',
18
42
  /** Gzip-compressed payload (inner payload has its own format prefix after decompression) */
19
43
  GZIP: 'gzip',
20
44
  /** Zstandard-compressed payload (inner payload has its own format prefix after decompression) */
@@ -105,7 +129,15 @@ export function isExpiredStub(data) {
105
129
  return false;
106
130
  }
107
131
  /**
108
- * Check if a binary value has the 'encr' format prefix indicating encryption.
132
+ * Check if a binary value is ciphertext either a symmetrically encrypted
133
+ * payload ('encr') or a sealed cross-run payload ('encp').
134
+ *
135
+ * This is the predicate display layers want: both schemes are opaque bytes
136
+ * that must not be fed to the devalue parser, and both render as the same
137
+ * "Encrypted" affordance in the CLI and web UI. Use {@link isSealedData} when
138
+ * the *scheme* matters — notably when choosing a decryption path, since a
139
+ * sealed payload needs the run's private scalar rather than its symmetric key.
140
+ *
109
141
  * Browser-safe — does not depend on the full serialization module.
110
142
  */
111
143
  export function isEncryptedData(data) {
@@ -113,7 +145,21 @@ export function isEncryptedData(data) {
113
145
  return false;
114
146
  }
115
147
  const prefix = formatDecoder.decode(data.subarray(0, FORMAT_PREFIX_LENGTH));
116
- return prefix === SerializationFormat.ENCRYPTED;
148
+ return (prefix === SerializationFormat.ENCRYPTED ||
149
+ prefix === SerializationFormat.SEALED);
150
+ }
151
+ /**
152
+ * Check if a binary value has the 'encp' format prefix, indicating a sealed
153
+ * (asymmetrically encrypted) cross-run payload.
154
+ *
155
+ * Browser-safe — does not depend on the full serialization module.
156
+ */
157
+ export function isSealedData(data) {
158
+ if (!(data instanceof Uint8Array) || data.length < FORMAT_PREFIX_LENGTH) {
159
+ return false;
160
+ }
161
+ const prefix = formatDecoder.decode(data.subarray(0, FORMAT_PREFIX_LENGTH));
162
+ return prefix === SerializationFormat.SEALED;
117
163
  }
118
164
  /**
119
165
  * Check if a binary value has a compression format prefix ('gzip' or 'zstd').
@@ -274,17 +320,28 @@ export function hydrateData(value, revivers) {
274
320
  * decryption. Used by o11y tooling (web UI, CLI) when the user requests
275
321
  * decryption.
276
322
  *
277
- * @param value - The value to hydrate (may be encrypted)
323
+ * @param value - The value to hydrate (may be encrypted or sealed)
278
324
  * @param revivers - Devalue revivers for deserialization
279
- * @param key - AES-256 encryption key (if provided, encrypted data will be decrypted)
325
+ * @param key - The run's key material. Pass `RunPayloadKeys` (from
326
+ * `deriveRunPayloadKeys`) to open both symmetric (`encr`) and sealed
327
+ * (`encp`) payloads; a bare `CryptoKey` opens only the symmetric ones.
328
+ * Typed as a read capability so a write-only seal target — which could open
329
+ * neither scheme — is rejected at compile time rather than failing here.
280
330
  */
281
331
  export async function hydrateDataWithKey(value, revivers, key) {
282
332
  let data = value;
283
333
  if (data instanceof Uint8Array && isEncryptedData(data) && key) {
284
- // Decrypt: strip 'encr' prefix, AES-GCM decrypt, then hydrate the result
285
- const { decrypt } = await import('./encryption.js');
286
- const { payload } = decodeFormatPrefix(data);
287
- data = await decrypt(key, payload);
334
+ // Envelope-aware decrypt: handles both `encr` (AES-GCM under the run's
335
+ // symmetric key) and `encp` (sealed to the run's X25519 public key by
336
+ // some other run), dispatching on the format prefix.
337
+ const { decrypt, isRunPayloadKeys } = await import('./serialization/encryption.js');
338
+ // Opening a sealed payload needs the run's private scalar. If the caller
339
+ // supplied only a symmetric key, leave the bytes as ciphertext so the UI
340
+ // keeps showing its "Encrypted" affordance, rather than surfacing a
341
+ // decryption error for something that was never openable with this key.
342
+ if (!isSealedData(data) || isRunPayloadKeys(key)) {
343
+ data = await decrypt(data, key);
344
+ }
288
345
  }
289
346
  if (data instanceof Uint8Array && isCompressedData(data)) {
290
347
  // Decompress: strip the codec prefix and inflate. gzip uses the
@@ -666,4 +723,4 @@ export function truncateId(id, maxLength = 12) {
666
723
  return id;
667
724
  return `${id.slice(0, maxLength)}...`;
668
725
  }
669
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXphdGlvbi1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0MsOEVBQThFO0FBQzlFLGdEQUFnRDtBQUNoRCw4RUFBOEU7QUFFOUUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUc7SUFDakMsMkRBQTJEO0lBQzNELFVBQVUsRUFBRSxNQUFNO0lBQ2xCLG1GQUFtRjtJQUNuRixTQUFTLEVBQUUsTUFBTTtJQUNqQiw0RkFBNEY7SUFDNUYsSUFBSSxFQUFFLE1BQU07SUFDWixpR0FBaUc7SUFDakcsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDO0FBS1gsMkNBQTJDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRS9CLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDeEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsTUFBK0IsRUFDL0IsT0FBNkI7SUFFN0IsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLFVBQVUsQ0FBQyxFQUFFLENBQUM7UUFDckMsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLG9CQUFvQixFQUFFLENBQUM7UUFDaEQsTUFBTSxJQUFJLEtBQUssQ0FDYixxQ0FBcUMsb0JBQW9CLDJCQUEyQixNQUFNLE1BQU0sV0FBVyxDQUFDLE1BQU0s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QUksU0FBUztRQUFFLE9BQU8sRUFBRSxDQUFDO0lBQ3RDLE9BQU8sR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsS0FBSyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEJyb3dzZXItc2FmZSBzZXJpYWxpemF0aW9uIGZvcm1hdCB1dGlsaXRpZXMuXG4gKlxuICogVGhpcyBtb2R1bGUgY29udGFpbnMgdGhlIGZvcm1hdCBwcmVmaXggaGFuZGxpbmcsIGdlbmVyaWMgaHlkcmF0ZS9kZWh5ZHJhdGVcbiAqIGRpc3BhdGNoLCBhbmQgc2hhcmVkIHR5cGVzL2NsYXNzZXMgdXNlZCBieSBhbGwgZW52aXJvbm1lbnRzIChydW50aW1lLCB3ZWJcbiAqIG8xMXksIENMSSBvMTF5KS4gSXQgaGFzIE5PIE5vZGUuanMgZGVwZW5kZW5jaWVzLlxuICovXG5cbmltcG9ydCB7IGdldEV2ZW50RGF0YVJlZkZpZWxkcyB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5pbXBvcnQgeyBwYXJzZSwgdW5mbGF0dGVuIH0gZnJvbSAnZGV2YWx1ZSc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRm9ybWF0IHByZWZpeCBjb25zdGFudHMgYW5kIGVuY29kaW5nL2RlY29kaW5nXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGNvbnN0IFNlcmlhbGl6YXRpb25Gb3JtYXQgPSB7XG4gIC8qKiBkZXZhbHVlIHN0cmluZ2lmeS9wYXJzZSB3aXRoIFRleHRFbmNvZGVyL1RleHREZWNvZGVyICovXG4gIERFVkFMVUVfVjE6ICdkZXZsJyxcbiAgLyoqIEVuY3J5cHRlZCBwYXlsb2FkIChpbm5lciBwYXlsb2FkIGhhcyBpdHMgb3duIGZvcm1hdCBwcmVmaXggYWZ0ZXIgZGVjcnlwdGlvbikgKi9cbiAgRU5DUllQVEVEOiAnZW5jcicsXG4gIC8qKiBHemlwLWNvbXByZXNzZWQgcGF5bG9hZCAoaW5uZXIgcGF5bG9hZCBoYXMgaXRzIG93biBmb3JtYXQgcHJlZml4IGFmdGVyIGRlY29tcHJlc3Npb24pICovXG4gIEdaSVA6ICdnemlwJyxcbiAgLyoqIFpzdGFuZGFyZC1jb21wcmVzc2VkIHBheWxvYWQgKGlubmVyIHBheWxvYWQgaGFzIGl0cyBvd24gZm9ybWF0IHByZWZpeCBhZnRlciBkZWNvbXByZXNzaW9uKSAqL1xuICBaU1REOiAnenN0ZCcsXG59IGFzIGNvbnN0O1xuXG5leHBvcnQgdHlwZSBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSA9XG4gICh0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdClba2V5b2YgdHlwZW9mIFNlcmlhbGl6YXRpb25Gb3JtYXRdO1xuXG4vKiogTGVuZ3RoIG9mIHRoZSBmb3JtYXQgcHJlZml4IGluIGJ5dGVzICovXG5jb25zdCBGT1JNQVRfUFJFRklYX0xFTkdUSCA9IDQ7XG5cbmNvbnN0IGZvcm1hdEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IGZvcm1hdERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLyoqXG4gKiBFbmNvZGUgYSBwYXlsb2FkIHdpdGggYSBmb3JtYXQgcHJlZml4LlxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlV2l0aEZvcm1hdFByZWZpeChcbiAgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZSxcbiAgcGF5bG9hZDogVWludDhBcnJheSB8IHVua25vd25cbik6IFVpbnQ4QXJyYXkgfCB1bmtub3duIHtcbiAgaWYgKCEocGF5bG9hZCBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpKSB7XG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cblxuICBjb25zdCBwcmVmaXhCeXRlcyA9IGZvcm1hdEVuY29kZXIuZW5jb2RlKGZvcm1hdCk7XG4gIGlmIChwcmVmaXhCeXRlcy5sZW5ndGggIT09IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEZvcm1hdCBpZGVudGlmaWVyIG11c3QgYmUgZXhhY3RseSAke0ZPUk1BVF9QUkVGSVhfTEVOR1RIfSBBU0NJSSBjaGFyYWN0ZXJzLCBnb3QgXCIke2Zvcm1hdH1cIiAoJHtwcmVmaXhCeXRlcy5sZW5ndGh9IGJ5dGVzKWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gbmV3IFVpbnQ4QXJyYXkoRk9STUFUX1BSRUZJWF9MRU5HVEggKyBwYXlsb2FkLmxlbmd0aCk7XG4gIHJlc3VsdC5zZXQocHJlZml4Qnl0ZXMsIDApO1xuICByZXN1bHQuc2V0KHBheWxvYWQsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBmb3JtYXQtcHJlZml4ZWQgcGF5bG9hZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUZvcm1hdFByZWZpeChkYXRhOiBVaW50OEFycmF5IHwgdW5rbm93bik6IHtcbiAgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0VHlwZTtcbiAgcGF5bG9hZDogVWludDhBcnJheTtcbn0ge1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICByZXR1cm4ge1xuICAgICAgZm9ybWF0OiBTZXJpYWxpemF0aW9uRm9ybWF0LkRFVkFMVUVfVjEsXG4gICAgICBwYXlsb2FkOiBuZXcgVGV4dEVuY29kZXIoKS5lbmNvZGUoSlNPTi5zdHJpbmdpZnkoZGF0YSkpLFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5sZW5ndGggPCBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBEYXRhIHRvbyBzaG9ydCB0byBjb250YWluIGZvcm1hdCBwcmVmaXg6IGV4cGVjdGVkIGF0IGxlYXN0ICR7Rk9STUFUX1BSRUZJWF9MRU5HVEh9IGJ5dGVzLCBnb3QgJHtkYXRhLmxlbmd0aH1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeEJ5dGVzID0gZGF0YS5zdWJhcnJheSgwLCBGT1JNQVRfUFJFRklYX0xFTkdUSCk7XG4gIGNvbnN0IGZvcm1hdCA9IGZvcm1hdERlY29kZXIuZGVjb2RlKHByZWZpeEJ5dGVzKTtcblxuICBjb25zdCBrbm93bkZvcm1hdHMgPSBPYmplY3QudmFsdWVzKFNlcmlhbGl6YXRpb25Gb3JtYXQpIGFzIHN0cmluZ1tdO1xuICBpZiAoIWtub3duRm9ybWF0cy5pbmNsdWRlcyhmb3JtYXQpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYFVua25vd24gc2VyaWFsaXphdGlvbiBmb3JtYXQ6IFwiJHtmb3JtYXR9XCIuIEtub3duIGZvcm1hdHM6ICR7a25vd25Gb3JtYXRzLmpvaW4oJywgJyl9YFxuICAgICk7XG4gIH1cblxuICBjb25zdCBwYXlsb2FkID0gZGF0YS5zdWJhcnJheShGT1JNQVRfUFJFRklYX0xFTkdUSCk7XG4gIHJldHVybiB7IGZvcm1hdDogZm9ybWF0IGFzIFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlLCBwYXlsb2FkIH07XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRW5jcnlwdGVkIGRhdGEgZGV0ZWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBQbGFjZWhvbGRlciBzdHJpbmcgZGlzcGxheWVkIHdoZW4gZGF0YSBpcyBlbmNyeXB0ZWQgYW5kIGRlY3J5cHRpb25cbiAqIGhhcyBub3QgYmVlbiByZXF1ZXN0ZWQuIFVzZWQgYnkgYm90aCBDTEkgYW5kIHdlYiBvMTF5LlxuICovXG5leHBvcnQgY29uc3QgRU5DUllQVEVEX1BMQUNFSE9MREVSID0gJ1xcdXsxRjUxMn0gRW5jcnlwdGVkJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFeHBpcmVkIGRhdGEgZGV0ZWN0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBDaGVjayBpZiBhIHBsYWluIG9iamVjdCBpcyBgeyBleHBpcmVkQXQ6IFwiPElTTyBkYXRlPlwiIH1gIOKAlCBhIHNpbmdsZS1rZXlcbiAqIG9iamVjdCB3aXRoIGEgc3RyaW5nIGBleHBpcmVkQXRgIHZhbHVlLlxuICovXG5mdW5jdGlvbiBpc0V4cGlyZWRPYmplY3QoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgeyBleHBpcmVkQXQ6IHN0cmluZyB9IHtcbiAgaWYgKGRhdGEgPT09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGRhdGEpO1xuICByZXR1cm4gKFxuICAgIGtleXMubGVuZ3RoID09PSAxICYmXG4gICAga2V5c1swXSA9PT0gJ2V4cGlyZWRBdCcgJiZcbiAgICB0eXBlb2YgKGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pLmV4cGlyZWRBdCA9PT0gJ3N0cmluZydcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGh5ZHJhdGVkIHZhbHVlIGlzIGFuIGV4cGlyZWQgZGF0YSBzdHViIGZyb20gdGhlIHNlcnZlci5cbiAqXG4gKiBUaGUgc2VydmVyIHJlcGxhY2VzIGV4cGlyZWQgcmVmIGZpZWxkcyB3aXRoIGEgZGV2YWx1ZS1lbmNvZGVkIHN0dWJcbiAqIChgbWFrZUV4cGlyZWRTdHViYCkgdGhhdCBkZXNlcmlhbGl6ZXMgdG8gYFt7IGV4cGlyZWRBdDogXCI8SVNPIGRhdGU+XCIgfV1gXG4gKiBhZnRlciBgdW5mbGF0dGVuYCAoYXJyYXktd3JhcHBlZCBkdWUgdG8gYmFja3dhcmRzLWNvbXBhdGlibGUgZW5jb2RpbmcpLlxuICogQWxzbyBtYXRjaGVzIHRoZSB1bndyYXBwZWQgYHsgZXhwaXJlZEF0OiBcIi4uLlwiIH1gIGZvcm0gZm9yIHJvYnVzdG5lc3MuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0V4cGlyZWRTdHViKGRhdGE6IHVua25vd24pOiBib29sZWFuIHtcbiAgLy8gRGlyZWN0IG9iamVjdCBmb3JtOiB7IGV4cGlyZWRBdDogXCIuLi5cIiB9XG4gIGlmIChpc0V4cGlyZWRPYmplY3QoZGF0YSkpIHJldHVybiB0cnVlO1xuICAvLyBBcnJheS13cmFwcGVkIGZvcm0gZnJvbSBkZXZhbHVlIHVuZmxhdHRlbjogW3sgZXhwaXJlZEF0OiBcIi4uLlwiIH1dXG4gIGlmIChBcnJheS5pc0FycmF5KGRhdGEpICYmIGRhdGEubGVuZ3RoID09PSAxICYmIGlzRXhwaXJlZE9iamVjdChkYXRhWzBdKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGJpbmFyeSB2YWx1ZSBoYXMgdGhlICdlbmNyJyBmb3JtYXQgcHJlZml4IGluZGljYXRpbmcgZW5jcnlwdGlvbi5cbiAqIEJyb3dzZXItc2FmZSDigJQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBmdWxsIHNlcmlhbGl6YXRpb24gbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNFbmNyeXB0ZWREYXRhKGRhdGE6IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCEoZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IGRhdGEubGVuZ3RoIDwgRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcHJlZml4ID0gZm9ybWF0RGVjb2Rlci5kZWNvZGUoZGF0YS5zdWJhcnJheSgwLCBGT1JNQVRfUFJFRklYX0xFTkdUSCkpO1xuICByZXR1cm4gcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRDtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGJpbmFyeSB2YWx1ZSBoYXMgYSBjb21wcmVzc2lvbiBmb3JtYXQgcHJlZml4ICgnZ3ppcCcgb3IgJ3pzdGQnKS5cbiAqIEJyb3dzZXItc2FmZSDigJQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBmdWxsIHNlcmlhbGl6YXRpb24gbW9kdWxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNDb21wcmVzc2VkRGF0YShkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IGZvcm1hdERlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpKTtcbiAgcmV0dXJuIChcbiAgICBwcmVmaXggPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUCB8fCBwcmVmaXggPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuWlNURFxuICApO1xufVxuXG5pbnRlcmZhY2UgTm9kZVpsaWJEZWNvZGUge1xuICBndW56aXBTeW5jPzogKGRhdGE6IFVpbnQ4QXJyYXkpID0+IFVpbnQ4QXJyYXk7XG4gIHpzdGREZWNvbXByZXNzU3luYz86IChkYXRhOiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5O1xufVxuXG4vKipcbiAqIFJlc29sdmUgYG5vZGU6emxpYmAgdmlhIGBwcm9jZXNzLmdldEJ1aWx0aW5Nb2R1bGVgIOKAlCBubyBzdGF0aWMgTm9kZVxuICogZGVwZW5kZW5jeSwgaW52aXNpYmxlIHRvIGJyb3dzZXIgYnVuZGxlcnMuIFJldHVybnMgdW5kZWZpbmVkIG9mZiBOb2RlLlxuICovXG5mdW5jdGlvbiBnZXROb2RlWmxpYigpOiBOb2RlWmxpYkRlY29kZSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGdsb2JhbFRoaXMgYXMge1xuICAgICAgICBwcm9jZXNzPzogeyBnZXRCdWlsdGluTW9kdWxlPzogKGlkOiBzdHJpbmcpID0+IE5vZGVabGliRGVjb2RlIH07XG4gICAgICB9XG4gICAgKS5wcm9jZXNzPy5nZXRCdWlsdGluTW9kdWxlPy4oJ25vZGU6emxpYicpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogU3luY2hyb25vdXNseSBkZWNvbXByZXNzIGEgYGd6aXBgL2B6c3RkYCBwYXlsb2FkIHdoZW4gcnVubmluZyBvbiBOb2RlLmpzLlxuICpcbiAqIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBzeW5jIGRlY29tcHJlc3Npb24gaXNuJ3QgYXZhaWxhYmxlIChlLmcuIGluIHRoZVxuICogYnJvd3Nlciwgb3IgenN0ZCBvbiBOb2RlIDwgMjIuMTUpIOKAlCBjYWxsZXJzIGZhbGwgYmFjayB0byBsZWF2aW5nIHRoZSBkYXRhXG4gKiB1bi1oeWRyYXRlZCAodGhlIGFzeW5jIGBoeWRyYXRlRGF0YVdpdGhLZXlgIHBhdGggaGFuZGxlcyBkZWNvbXByZXNzaW9uIGluXG4gKiBicm93c2VycyB2aWEgYERlY29tcHJlc3Npb25TdHJlYW1gIC8gYSByZWdpc3RlcmVkIHpzdGQgZGVjb2RlcikuXG4gKi9cbmZ1bmN0aW9uIGRlY29tcHJlc3NTeW5jSWZBdmFpbGFibGUoXG4gIGZvcm1hdDogc3RyaW5nLFxuICBwYXlsb2FkOiBVaW50OEFycmF5XG4pOiBVaW50OEFycmF5IHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICBjb25zdCB6bGliID0gZ2V0Tm9kZVpsaWIoKTtcbiAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVAgJiYgemxpYj8uZ3VuemlwU3luYykge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHpsaWIuZ3VuemlwU3luYyhwYXlsb2FkKSk7XG4gICAgfVxuICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuWlNURCAmJiB6bGliPy56c3RkRGVjb21wcmVzc1N5bmMpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh6bGliLnpzdGREZWNvbXByZXNzU3luYyhwYXlsb2FkKSk7XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyBGYWxsIHRocm91Z2gg4oCUIHRyZWF0IGFzIHVuYXZhaWxhYmxlXG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCcm93c2VyIHpzdGQgZGVjb2RlciwgcmVnaXN0ZXJlZCBieSB0aGUgbzExeSBob3N0ICh3ZWItc2hhcmVkKSBzaW5jZSB0aGVcbiAqIFdlYiBgRGVjb21wcmVzc2lvblN0cmVhbWAgaGFzIG5vIHpzdGQgc3VwcG9ydC4gTm9kZSBkZWNvZGVzIHZpYSBgbm9kZTp6bGliYFxuICogYW5kIG5ldmVyIG5lZWRzIHRoaXMuIFNlZSBgcmVnaXN0ZXJac3RkRGVjb2RlcmAuXG4gKi9cbmxldCB6c3RkQnJvd3NlckRlY29kZXI6XG4gIHwgKChwYXlsb2FkOiBVaW50OEFycmF5KSA9PiBQcm9taXNlPFVpbnQ4QXJyYXk+KVxuICB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBSZWdpc3RlciBhIGJyb3dzZXIgenN0ZCBkZWNvZGVyIChlLmcuIGEgV0FTTS1iYWNrZWQgb25lKS4gVGhlIHdlYiBvMTF5IFVJXG4gKiBjYWxscyB0aGlzIGF0IGluaXQgc28gYGh5ZHJhdGVEYXRhV2l0aEtleWAgY2FuIGluZmxhdGUgenN0ZCBwYXlsb2FkcyBhZnRlclxuICogY2xpZW50LXNpZGUgZGVjcnlwdGlvbi4gTm9kZSByZWFkZXJzIHVzZSBgbm9kZTp6bGliYCBhbmQgaWdub3JlIHRoaXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlclpzdGREZWNvZGVyKFxuICBkZWNvZGVyOiAocGF5bG9hZDogVWludDhBcnJheSkgPT4gUHJvbWlzZTxVaW50OEFycmF5PlxuKTogdm9pZCB7XG4gIHpzdGRCcm93c2VyRGVjb2RlciA9IGRlY29kZXI7XG59XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgZGVjb21wcmVzcyBhIGBnemlwYC9genN0ZGAgcGF5bG9hZC5cbiAqIC0gZ3ppcDogd2ViLXN0YW5kYXJkIGBEZWNvbXByZXNzaW9uU3RyZWFtYCAoTm9kZSAxOCssIGJyb3dzZXJzLCBlZGdlKS5cbiAqIC0genN0ZDogYG5vZGU6emxpYmAgd2hlbiBvbiBOb2RlLCBlbHNlIHRoZSByZWdpc3RlcmVkIGJyb3dzZXIgZGVjb2Rlci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZGVjb21wcmVzc0FzeW5jKFxuICBmb3JtYXQ6IHN0cmluZyxcbiAgcGF5bG9hZDogVWludDhBcnJheVxuKTogUHJvbWlzZTxVaW50OEFycmF5PiB7XG4gIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuWlNURCkge1xuICAgIGNvbnN0IHN5bmMgPSBkZWNvbXByZXNzU3luY0lmQXZhaWxhYmxlKGZvcm1hdCwgcGF5bG9hZCk7XG4gICAgaWYgKHN5bmMpIHJldHVybiBzeW5jO1xuICAgIGlmICh6c3RkQnJvd3NlckRlY29kZXIpIHJldHVybiB6c3RkQnJvd3NlckRlY29kZXIocGF5bG9hZCk7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ3pzdGQtY29tcHJlc3NlZCB3b3JrZmxvdyBkYXRhIGVuY291bnRlcmVkIGJ1dCBubyB6c3RkIGRlY29kZXIgaXMgJyArXG4gICAgICAgICdhdmFpbGFibGUuIE5vZGUuanMgMjIuMTUrIGRlY29kZXMgbmF0aXZlbHk7IGluIHRoZSBicm93c2VyIHJlZ2lzdGVyICcgK1xuICAgICAgICAnb25lIHZpYSByZWdpc3RlclpzdGREZWNvZGVyICh0aGUgd2ViIG8xMXkgcGFja2FnZSBkb2VzIHRoaXMpLidcbiAgICApO1xuICB9XG5cbiAgY29uc3QgdHJhbnNmb3JtID0gbmV3IERlY29tcHJlc3Npb25TdHJlYW0oJ2d6aXAnKTtcbiAgY29uc3Qgd3JpdGVyID0gdHJhbnNmb3JtLndyaXRhYmxlLmdldFdyaXRlcigpO1xuICBjb25zdCB3cml0ZVByb21pc2UgPSB3cml0ZXIud3JpdGUocGF5bG9hZCkudGhlbigoKSA9PiB3cml0ZXIuY2xvc2UoKSk7XG4gIHdyaXRlUHJvbWlzZS5jYXRjaCgoKSA9PiB7fSk7XG4gIGNvbnN0IGNodW5rczogVWludDhBcnJheVtdID0gW107XG4gIGxldCB0b3RhbCA9IDA7XG4gIGNvbnN0IHJlYWRlciA9IHRyYW5zZm9ybS5yZWFkYWJsZS5nZXRSZWFkZXIoKTtcbiAgZm9yICg7Oykge1xuICAgIGNvbnN0IHsgZG9uZSwgdmFsdWUgfSA9IGF3YWl0IHJlYWRlci5yZWFkKCk7XG4gICAgaWYgKGRvbmUpIGJyZWFrO1xuICAgIGNodW5rcy5wdXNoKHZhbHVlKTtcbiAgICB0b3RhbCArPSB2YWx1ZS5sZW5ndGg7XG4gIH1cbiAgYXdhaXQgd3JpdGVQcm9taXNlO1xuICBjb25zdCBvdXQgPSBuZXcgVWludDhBcnJheSh0b3RhbCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgIG91dC5zZXQoY2h1bmssIG9mZnNldCk7XG4gICAgb2Zmc2V0ICs9IGNodW5rLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJldml2ZXJzIHR5cGUgKHNoYXJlZCBhY3Jvc3MgYWxsIGVudmlyb25tZW50cylcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIEEgbWFwIG9mIHR5cGUgbmFtZSDihpIgcmV2aXZlciBmdW5jdGlvbiwgdXNlZCBieSBkZXZhbHVlJ3MgYHBhcnNlYC9gdW5mbGF0dGVuYC5cbiAqIEVhY2ggZW52aXJvbm1lbnQgKHJ1bnRpbWUsIHdlYiwgQ0xJKSBwcm92aWRlcyBpdHMgb3duIHNldC5cbiAqL1xuZXhwb3J0IHR5cGUgUmV2aXZlcnMgPSBSZWNvcmQ8c3RyaW5nLCAodmFsdWU6IGFueSkgPT4gYW55PjtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBHZW5lcmljIGh5ZHJhdGUvZGVoeWRyYXRlIGRpc3BhdGNoXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIChkZXNlcmlhbGl6ZSkgYSB2YWx1ZSB0aGF0IHdhcyBzdG9yZWQgaW4gdGhlIGRhdGFiYXNlLlxuICpcbiAqIEhhbmRsZXMgZm91ciBkYXRhIHNoYXBlczpcbiAqIDEuIGBVaW50OEFycmF5YCB3aXRoICdlbmNyJyBwcmVmaXgg4oaSIHJldHVybmVkIGFzLWlzIChlbmNyeXB0ZWQsIG5vdCB5ZXQgZGVjcnlwdGVkKVxuICogMi4gYFVpbnQ4QXJyYXlgIHdpdGggYSBmb3JtYXQgcHJlZml4IChzcGVjVmVyc2lvbiAyKykg4oaSIGRlY29kZSBwcmVmaXgsIHBhcnNlXG4gKiAzLiBgQXJyYXlgIChsZWdhY3kgc3BlY1ZlcnNpb24gMSwgXCJyZXZpdmVkIGRldmFsdWVcIikg4oaSIHVuZmxhdHRlblxuICogNC4gT3RoZXIgKGFscmVhZHkgYSBwbGFpbiBKUyB2YWx1ZSkg4oaSIHJldHVybiBhcy1pc1xuICpcbiAqIEVuY3J5cHRlZCBkYXRhIGlzIGludGVudGlvbmFsbHkgbGVmdCBhcyBhIGBVaW50OEFycmF5YCBzbyB0aGF0IGNvbnN1bWVyc1xuICogKENMSSwgd2ViIFVJKSBjYW4gZGV0ZWN0IGl0IHdpdGggYGlzRW5jcnlwdGVkRGF0YSgpYCBhbmQgZGVjaWRlIGhvdyB0b1xuICogaGFuZGxlIGl0IOKAlCB0aGUgQ0xJIHJlcGxhY2VzIGl0IHdpdGggYSBzdHlsZWQgcGxhY2Vob2xkZXIsIHRoZSB3ZWIgVUlcbiAqIHJlbmRlcnMgYW4gXCJFbmNyeXB0ZWRcIiBjYXJkIHdpdGggYSBEZWNyeXB0IGJ1dHRvbiB0aGF0IHRyaWdnZXJzXG4gKiBjbGllbnQtc2lkZSBkZWNyeXB0aW9uIG9uIGRlbWFuZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGh5ZHJhdGVEYXRhKHZhbHVlOiB1bmtub3duLCByZXZpdmVyczogUmV2aXZlcnMpOiB1bmtub3duIHtcbiAgaWYgKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIC8vIEVuY3J5cHRlZCBkYXRhIHBhc3NlcyB0aHJvdWdoIHVudG91Y2hlZCDigJQgbzExeSBsYXllcnMgZGV0ZWN0IGl0IHdpdGhcbiAgICAvLyBpc0VuY3J5cHRlZERhdGEoKSBhbmQgaGFuZGxlIGRpc3BsYXkgKHdlYjogbmFtZWQgY29uc3RydWN0b3Igb2JqZWN0LFxuICAgIC8vIENMSTogRW5jcnlwdGVkRGF0YVJlZiB3aXRoIHV0aWwuaW5zcGVjdC5jdXN0b20pLlxuICAgIGlmIChpc0VuY3J5cHRlZERhdGEodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgeyBmb3JtYXQsIHBheWxvYWQgfSA9IGRlY29kZUZvcm1hdFByZWZpeCh2YWx1ZSk7XG4gICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5ERVZBTFVFX1YxKSB7XG4gICAgICBjb25zdCBzdHIgPSBuZXcgVGV4dERlY29kZXIoKS5kZWNvZGUocGF5bG9hZCk7XG4gICAgICByZXR1cm4gcGFyc2Uoc3RyLCByZXZpdmVycyk7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQIHx8XG4gICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuWlNURFxuICAgICkge1xuICAgICAgLy8gQ29tcHJlc3NlZCBwYXlsb2FkIOKAlCBkZWNvbXByZXNzIHN5bmNocm9ub3VzbHkgd2hlbiBydW5uaW5nIG9uXG4gICAgICAvLyBOb2RlLmpzIChDTEksIHNlcnZlciBvMTF5KS4gSW4gYnJvd3NlcnMgdGhlcmUgaXMgbm8gc3luYyBjb2RlYztcbiAgICAgIC8vIHBhc3MgdGhlIGRhdGEgdGhyb3VnaCB1bnRvdWNoZWQgKGxpa2UgZW5jcnlwdGVkIGRhdGEpIHNvIGFzeW5jXG4gICAgICAvLyBjb25zdW1lcnMgY2FuIHJvdXRlIGl0IHRocm91Z2ggYGh5ZHJhdGVEYXRhV2l0aEtleWAsIHdoaWNoXG4gICAgICAvLyBkZWNvbXByZXNzZXMgdmlhIERlY29tcHJlc3Npb25TdHJlYW0gLyBhIHJlZ2lzdGVyZWQgenN0ZCBkZWNvZGVyLlxuICAgICAgY29uc3QgaW5mbGF0ZWQgPSBkZWNvbXByZXNzU3luY0lmQXZhaWxhYmxlKGZvcm1hdCwgcGF5bG9hZCk7XG4gICAgICBpZiAoaW5mbGF0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdmFsdWU7XG4gICAgICB9XG4gICAgICAvLyBUaGUgaW5mbGF0ZWQgYnl0ZXMgY2FycnkgdGhlaXIgb3duIGZvcm1hdCBwcmVmaXggKGUuZy4gJ2RldmwnKVxuICAgICAgcmV0dXJuIGh5ZHJhdGVEYXRhKGluZmxhdGVkLCByZXZpdmVycyk7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgc2VyaWFsaXphdGlvbiBmb3JtYXQ6ICR7Zm9ybWF0fWApO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZmxhdHRlbih2YWx1ZSwgcmV2aXZlcnMpO1xuICB9XG5cbiAgLy8gQWxyZWFkeSBhIHBsYWluIEpTIHZhbHVlIChlLmcuLCBudW1iZXIsIHN0cmluZywgbnVsbClcbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgYSB2YWx1ZSwgZGVjcnlwdGluZyBpdCBmaXJzdCBpZiBhbiBlbmNyeXB0aW9uIGtleSBpcyBwcm92aWRlZC5cbiAqXG4gKiBUaGlzIGlzIHRoZSBhc3luYyB2ZXJzaW9uIG9mIGBoeWRyYXRlRGF0YWAgdGhhdCBzdXBwb3J0cyB0cmFuc3BhcmVudFxuICogZGVjcnlwdGlvbi4gVXNlZCBieSBvMTF5IHRvb2xpbmcgKHdlYiBVSSwgQ0xJKSB3aGVuIHRoZSB1c2VyIHJlcXVlc3RzXG4gKiBkZWNyeXB0aW9uLlxuICpcbiAqIEBwYXJhbSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBoeWRyYXRlIChtYXkgYmUgZW5jcnlwdGVkKVxuICogQHBhcmFtIHJldml2ZXJzIC0gRGV2YWx1ZSByZXZpdmVycyBmb3IgZGVzZXJpYWxpemF0aW9uXG4gKiBAcGFyYW0ga2V5IC0gQUVTLTI1NiBlbmNyeXB0aW9uIGtleSAoaWYgcHJvdmlkZWQsIGVuY3J5cHRlZCBkYXRhIHdpbGwgYmUgZGVjcnlwdGVkKVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaHlkcmF0ZURhdGFXaXRoS2V5KFxuICB2YWx1ZTogdW5rbm93bixcbiAgcmV2aXZlcnM6IFJldml2ZXJzLFxuICBrZXk6IGltcG9ydCgnLi9lbmNyeXB0aW9uLmpzJykuQ3J5cHRvS2V5IHwgdW5kZWZpbmVkXG4pOiBQcm9taXNlPHVua25vd24+IHtcbiAgbGV0IGRhdGEgPSB2YWx1ZTtcbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGlzRW5jcnlwdGVkRGF0YShkYXRhKSAmJiBrZXkpIHtcbiAgICAvLyBEZWNyeXB0OiBzdHJpcCAnZW5jcicgcHJlZml4LCBBRVMtR0NNIGRlY3J5cHQsIHRoZW4gaHlkcmF0ZSB0aGUgcmVzdWx0XG4gICAgY29uc3QgeyBkZWNyeXB0IH0gPSBhd2FpdCBpbXBvcnQoJy4vZW5jcnlwdGlvbi5qcycpO1xuICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gZGVjb2RlRm9ybWF0UHJlZml4KGRhdGEpO1xuICAgIGRhdGEgPSBhd2FpdCBkZWNyeXB0KGtleSwgcGF5bG9hZCk7XG4gIH1cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGlzQ29tcHJlc3NlZERhdGEoZGF0YSkpIHtcbiAgICAvLyBEZWNvbXByZXNzOiBzdHJpcCB0aGUgY29kZWMgcHJlZml4IGFuZCBpbmZsYXRlLiBnemlwIHVzZXMgdGhlXG4gICAgLy8gd2ViLXN0YW5kYXJkIERlY29tcHJlc3Npb25TdHJlYW0gKHdvcmtzIGluIGJyb3dzZXJzKTsgenN0ZCB1c2VzXG4gICAgLy8gbm9kZTp6bGliIG9uIE5vZGUgb3IgdGhlIHJlZ2lzdGVyZWQgV0FTTSBkZWNvZGVyIGluIHRoZSBicm93c2VyLlxuICAgIC8vIFRoZSBpbmZsYXRlZCBieXRlcyBjYXJyeSB0aGVpciBvd24gZm9ybWF0IHByZWZpeCAoZS5nLiAnZGV2bCcpLlxuICAgIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YSk7XG4gICAgZGF0YSA9IGF3YWl0IGRlY29tcHJlc3NBc3luYyhmb3JtYXQsIHBheWxvYWQpO1xuICB9XG4gIC8vIERlbGVnYXRlIHRoZSAoZGVjcnlwdGVkL2RlY29tcHJlc3NlZCkgcmVzdWx0IHRvIHN5bmMgaHlkcmF0ZURhdGFcbiAgcmV0dXJuIGh5ZHJhdGVEYXRhKGRhdGEsIHJldml2ZXJzKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgbWFya2VyIHR5cGVzIGZvciBvMTF5IGRpc3BsYXlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBTVFJFQU1fSURfUFJFRklYID0gJ3N0cm1fJztcblxuLyoqIE1hcmtlciBmb3Igc3RyZWFtIHJlZmVyZW5jZSBvYmplY3RzIHJlbmRlcmVkIGFzIGxpbmtzIGluIHRoZSBVSSAqL1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5cbi8qKiBBIHN0cmVhbSByZWZlcmVuY2UgZm9yIFVJIGRpc3BsYXkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG4vKiogTWFya2VyIGZvciBSdW4gcmVmZXJlbmNlIG9iamVjdHMgcmVuZGVyZWQgYXMgbGlua3MgaW4gdGhlIFVJICovXG5leHBvcnQgY29uc3QgUlVOX1JFRl9UWVBFID0gJ19fd29ya2Zsb3dfcnVuX3JlZl9fJztcblxuLyoqIEEgUnVuIHJlZmVyZW5jZSBmb3IgVUkgZGlzcGxheSAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5SZWYge1xuICBfX3R5cGU6IHR5cGVvZiBSVU5fUkVGX1RZUEU7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgUnVuUmVmIG9iamVjdCAqL1xuZXhwb3J0IGNvbnN0IGlzUnVuUmVmID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgIHZhbHVlLl9fdHlwZSA9PT0gUlVOX1JFRl9UWVBFICYmXG4gICAgJ3J1bklkJyBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZydcbiAgKTtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBSdW4gdmFsdWUgdG8gYSBSdW5SZWYgZm9yIGRpc3BsYXkgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkUnVuVG9SdW5SZWYgPSAodmFsdWU6IHsgcnVuSWQ6IHN0cmluZyB9KTogUnVuUmVmID0+IHtcbiAgcmV0dXJuIHsgX190eXBlOiBSVU5fUkVGX1RZUEUsIHJ1bklkOiB2YWx1ZS5ydW5JZCB9O1xufTtcblxuLyoqIE1hcmtlciBmb3IgY3VzdG9tIGNsYXNzIGluc3RhbmNlIHJlZmVyZW5jZXMgKi9cbmV4cG9ydCBjb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcblxuLyoqXG4gKiBBIGNsYXNzIGluc3RhbmNlIHJlZmVyZW5jZSBmb3IgbzExeSBkaXNwbGF5LlxuICpcbiAqIEJyb3dzZXItc2FmZSBiYXNlIGNsYXNzIOKAlCBubyBgdXRpbC5pbnNwZWN0LmN1c3RvbWAuIEVudmlyb25tZW50LXNwZWNpZmljXG4gKiByZW5kZXJpbmcgKENMSSBpbnNwZWN0LCB3ZWIgY29tcG9uZW50KSBpcyBoYW5kbGVkIGJ5IGVhY2ggY29uc3VtZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGFzc0luc3RhbmNlUmVmIHtcbiAgcmVhZG9ubHkgX190eXBlID0gQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBjbGFzc0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IHVua25vd25cbiAgKSB7fVxuXG4gIHRvSlNPTigpOiB7XG4gICAgX190eXBlOiBzdHJpbmc7XG4gICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgY2xhc3NJZDogc3RyaW5nO1xuICAgIGRhdGE6IHVua25vd247XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6IHRoaXMuX190eXBlLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIGNsYXNzSWQ6IHRoaXMuY2xhc3NJZCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgQ2xhc3NJbnN0YW5jZVJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc0NsYXNzSW5zdGFuY2VSZWYgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBDbGFzc0luc3RhbmNlUmVmID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIENsYXNzSW5zdGFuY2VSZWYgfHxcbiAgICAodmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdfX3R5cGUnIGluIHZhbHVlICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09IENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFICYmXG4gICAgICAnY2xhc3NOYW1lJyBpbiB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpXG4gICk7XG59O1xuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmVhbSBJRCBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbUlkID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoU1RSRUFNX0lEX1BSRUZJWCk7XG59O1xuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbVJlZiA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFN0cmVhbVJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICB2YWx1ZS5fX3R5cGUgPT09IFNUUkVBTV9SRUZfVFlQRSAmJlxuICAgICdzdHJlYW1JZCcgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuc3RyZWFtSWQgPT09ICdzdHJpbmcnXG4gICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlZCBvMTF5IHJldml2ZXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udmVydCBhIHNlcmlhbGl6ZWQgc3RyZWFtIHZhbHVlIHRvIGEgU3RyZWFtUmVmIGZvciBkaXNwbGF5LlxuICovXG5leHBvcnQgY29uc3Qgc3RyZWFtVG9TdHJlYW1SZWYgPSAodmFsdWU6IGFueSk6IFN0cmVhbVJlZiA9PiB7XG4gIGxldCBzdHJlYW1JZDogc3RyaW5nO1xuICBpZiAoJ25hbWUnIGluIHZhbHVlKSB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyh2YWx1ZS5uYW1lKTtcbiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChTVFJFQU1fSURfUFJFRklYKSkge1xuICAgICAgc3RyZWFtSWQgPSBgJHtTVFJFQU1fSURfUFJFRklYfSR7bmFtZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW1JZCA9IG5hbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmVhbUlkID0gYCR7U1RSRUFNX0lEX1BSRUZJWH1udWxsYDtcbiAgfVxuICByZXR1cm4geyBfX3R5cGU6IFNUUkVBTV9SRUZfVFlQRSwgc3RyZWFtSWQgfTtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBzdGVwIGZ1bmN0aW9uIHRvIGEgZGlzcGxheSBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkU3RlcEZ1bmN0aW9uVG9TdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gJ251bGwnO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuICdudWxsJztcbiAgaWYgKCdzdGVwSWQnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIGA8c3RlcDokeyh2YWx1ZSBhcyB7IHN0ZXBJZDogc3RyaW5nIH0pLnN0ZXBJZH0+YDtcbiAgfVxuICByZXR1cm4gJzxmdW5jdGlvbj4nO1xufTtcblxuLyoqIEV4dHJhY3QgdGhlIGNsYXNzIG5hbWUgZnJvbSBhIGNsYXNzSWQgKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0Q2xhc3NOYW1lID0gKGNsYXNzSWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghY2xhc3NJZCkgcmV0dXJuICdVbmtub3duJztcbiAgY29uc3QgcGFydHMgPSBjbGFzc0lkLnNwbGl0KCcvJyk7XG4gIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSB8fCBjbGFzc0lkO1xufTtcblxuLyoqIENvbnZlcnQgYSBzZXJpYWxpemVkIGNsYXNzIGluc3RhbmNlIHRvIGEgQ2xhc3NJbnN0YW5jZVJlZiBmb3IgZGlzcGxheS5cbiAqICBSdW4gaW5zdGFuY2VzIGFyZSBzcGVjaWFsLWNhc2VkIHRvIGEgUnVuUmVmIGZvciBjbGlja2FibGUgcmVuZGVyaW5nLiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmID0gKHZhbHVlOiB7XG4gIGNsYXNzSWQ6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbn0pOiBDbGFzc0luc3RhbmNlUmVmIHwgUnVuUmVmID0+IHtcbiAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgaWYgKFxuICAgIGNsYXNzTmFtZSA9PT0gJ1J1bicgJiZcbiAgICB2YWx1ZS5kYXRhICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlLmRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3J1bklkJyBpbiB2YWx1ZS5kYXRhICYmXG4gICAgdHlwZW9mICh2YWx1ZS5kYXRhIGFzIHsgcnVuSWQ6IHVua25vd24gfSkucnVuSWQgPT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiBzZXJpYWxpemVkUnVuVG9SdW5SZWYodmFsdWUuZGF0YSBhcyB7IHJ1bklkOiBzdHJpbmcgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDbGFzc0luc3RhbmNlUmVmKGNsYXNzTmFtZSwgdmFsdWUuY2xhc3NJZCwgdmFsdWUuZGF0YSk7XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgY2xhc3MgcmVmZXJlbmNlIHRvIGEgZGlzcGxheSBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkQ2xhc3NUb1N0cmluZyA9ICh2YWx1ZTogeyBjbGFzc0lkOiBzdHJpbmcgfSk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBgPGNsYXNzOiR7ZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKX0+YDtcbn07XG5cbi8qKlxuICogU3RhbmRhcmQgbzExeSByZXZpdmVycyB0aGF0IG92ZXJyaWRlIHJ1bnRpbWUtc3BlY2lmaWMgdHlwZXMgd2l0aFxuICogZGlzcGxheS1mcmllbmRseSB2YWx1ZXMuIFVzZWQgYnkgYm90aCB3ZWIgYW5kIENMSSBoeWRyYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNlcnZhYmlsaXR5UmV2aXZlcnM6IFJldml2ZXJzID0ge1xuICBSZWFkYWJsZVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFdyaXRhYmxlU3RyZWFtOiBzdHJlYW1Ub1N0cmVhbVJlZixcbiAgVHJhbnNmb3JtU3RyZWFtOiBzdHJlYW1Ub1N0cmVhbVJlZixcbiAgQWJvcnRDb250cm9sbGVyOiAodmFsdWU6IGFueSkgPT5cbiAgICBgPEFib3J0Q29udHJvbGxlcihhYm9ydGVkOiAke3ZhbHVlLmFib3J0ZWR9KT5gLFxuICBBYm9ydFNpZ25hbDogKHZhbHVlOiBhbnkpID0+IGA8QWJvcnRTaWduYWwoYWJvcnRlZDogJHt2YWx1ZS5hYm9ydGVkfSk+YCxcbiAgLy8gRE9NRXhjZXB0aW9uIG5lZWRzIGFuIGV4cGxpY2l0IHJldml2ZXI6IHdpdGhvdXQgb25lLCBkZXZhbHVlLnBhcnNlXG4gIC8vIHRocm93cyBvbiB0aGUgYFtcIkRPTUV4Y2VwdGlvblwiLCAuLi5dYCB0YWcgYW5kIGBoeWRyYXRlU3RlcElPYCdzXG4gIC8vIHRyeS9jYXRjaCBsZWF2ZXMgdGhlIHJhdyBmbGF0LWVuY29kZWQgc3RyaW5nIGluIHRoZSBVSS4gQWJvcnRDb250cm9sbGVyXG4gIC8vIHN5bnRoZXNpemVzIGEgRE9NRXhjZXB0aW9uIGFzIHRoZSBkZWZhdWx0IGBzaWduYWwucmVhc29uYCB3aGVuIGFib3J0KClcbiAgLy8gaXMgY2FsbGVkIHdpdGggbm8gYXJnIOKAlCBzbyBhbnkgYWJvcnQgdGhhdCByb3VuZC10cmlwcyB0aHJvdWdoIGEgc3RlcFxuICAvLyBib3VuZGFyeSBzdXJmYWNlcyBoZXJlLiBSZWNvbnN0cnVjdCBhcyBhIHJlYWwgRE9NRXhjZXB0aW9uIHdoZW4gdGhlXG4gIC8vIGdsb2JhbCBpcyBhdmFpbGFibGUgKG1vZGVybiBicm93c2VycyArIE5vZGUgMTgrKSwgZWxzZSBmYWxsIGJhY2sgdG9cbiAgLy8gYW4gRXJyb3IgcHJlc2VydmluZyBuYW1lL21lc3NhZ2Uvc3RhY2svY2F1c2UgZm9yIGRpc3BsYXkuXG4gIERPTUV4Y2VwdGlvbjogKHZhbHVlOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZztcbiAgICBjYXVzZT86IHVua25vd247XG4gIH0pID0+IHtcbiAgICBjb25zdCBHID0gZ2xvYmFsVGhpcyBhcyB7IERPTUV4Y2VwdGlvbj86IHR5cGVvZiBET01FeGNlcHRpb24gfTtcbiAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBlID0gbmV3IEcuRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGUuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIGNvbnN0IGU6IEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfSA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICBlLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGUuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICByZXR1cm4gZTtcbiAgfSxcbiAgU3RlcEZ1bmN0aW9uOiBzZXJpYWxpemVkU3RlcEZ1bmN0aW9uVG9TdHJpbmcsXG4gIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZTogeyB3b3JrZmxvd0lkOiBzdHJpbmcgfSkgPT5cbiAgICBgPHdvcmtmbG93OiR7dmFsdWUud29ya2Zsb3dJZH0+YCxcbiAgSW5zdGFuY2U6IHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmLFxuICBDbGFzczogc2VyaWFsaXplZENsYXNzVG9TdHJpbmcsXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc291cmNlLWxldmVsIGh5ZHJhdGlvbiBkaXNwYXRjaCAoZm9yIG8xMXkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBkYXRhIGZpZWxkcyBvZiBhIHN0ZXAgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVTdGVwSU88XG4gIFQgZXh0ZW5kcyB7IHN0ZXBJZD86IHN0cmluZzsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueTsgZXJyb3I/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG4gIGxldCBoeWRyYXRlZEVycm9yID0gcmVzb3VyY2UuZXJyb3I7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYGVycm9yYCBmaWVsZCBpcyBgU2VyaWFsaXplZERhdGFgIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAvLyBgZGVoeWRyYXRlU3RlcEVycm9yYC4gSHlkcmF0ZSBpdCBzbyBvYnNlcnZhYmlsaXR5IHRvb2xzIChDTEksIHdlYiBVSSlcbiAgLy8gY2FuIHJlYWQgYHN0ZXAuZXJyb3IubWVzc2FnZWAsIGBzdGVwLmVycm9yLnN0YWNrYCwgZXRjLlxuICBpZiAocmVzb3VyY2UuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZEVycm9yID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBpbnB1dDogaHlkcmF0ZWRJbnB1dCxcbiAgICBvdXRwdXQ6IGh5ZHJhdGVkT3V0cHV0LFxuICAgIGVycm9yOiBoeWRyYXRlZEVycm9yLFxuICB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGRhdGEgZmllbGRzIG9mIGEgd29ya2Zsb3cgcnVuIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlV29ya2Zsb3dJTzxcbiAgVCBleHRlbmRzIHsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueTsgZXJyb3I/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG4gIGxldCBoeWRyYXRlZEVycm9yID0gcmVzb3VyY2UuZXJyb3I7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYGVycm9yYCBmaWVsZCBpcyBgU2VyaWFsaXplZERhdGFgIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAvLyBgZGVoeWRyYXRlUnVuRXJyb3JgLiBIeWRyYXRlIGl0IHNvIG9ic2VydmFiaWxpdHkgdG9vbHMgKENMSSwgd2ViIFVJKVxuICAvLyBjYW4gcmVhZCBgcnVuLmVycm9yLm1lc3NhZ2VgLCBgcnVuLmVycm9yLnN0YWNrYCwgZXRjLlxuICBpZiAocmVzb3VyY2UuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZEVycm9yID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBpbnB1dDogaHlkcmF0ZWRJbnB1dCxcbiAgICBvdXRwdXQ6IGh5ZHJhdGVkT3V0cHV0LFxuICAgIGVycm9yOiBoeWRyYXRlZEVycm9yLFxuICB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGV2ZW50RGF0YSBmaWVsZHMgb2YgYW4gZXZlbnQgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVFdmVudERhdGE8XG4gIFQgZXh0ZW5kcyB7IGV2ZW50SWQ/OiBzdHJpbmc7IGV2ZW50VHlwZT86IHN0cmluZzsgZXZlbnREYXRhPzogYW55IH0sXG4+KHJlc291cmNlOiBULCByZXZpdmVyczogUmV2aXZlcnMpOiBUIHtcbiAgaWYgKCFyZXNvdXJjZS5ldmVudERhdGEpIHJldHVybiByZXNvdXJjZTtcblxuICBjb25zdCBldmVudERhdGEgPSB7IC4uLnJlc291cmNlLmV2ZW50RGF0YSB9O1xuXG4gIGZvciAoY29uc3QgZmllbGQgb2YgZ2V0RXZlbnREYXRhUmVmRmllbGRzKHJlc291cmNlLmV2ZW50VHlwZSA/PyAnJykpIHtcbiAgICBpZiAoZXZlbnREYXRhW2ZpZWxkXSA9PSBudWxsKSBjb250aW51ZTtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhW2ZpZWxkXSA9IGh5ZHJhdGVEYXRhKGV2ZW50RGF0YVtmaWVsZF0sIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIGV2ZW50RGF0YSB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIG1ldGFkYXRhIGZpZWxkIG9mIGEgaG9vayByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZUhvb2tNZXRhZGF0YTxUIGV4dGVuZHMgeyBob29rSWQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKHJlc291cmNlLm1ldGFkYXRhID09IG51bGwpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWRNZXRhZGF0YSA9IHJlc291cmNlLm1ldGFkYXRhO1xuICB0cnkge1xuICAgIGh5ZHJhdGVkTWV0YWRhdGEgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5tZXRhZGF0YSwgcmV2aXZlcnMpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIG1ldGFkYXRhOiBoeWRyYXRlZE1ldGFkYXRhIH07XG59XG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgc2VyaWFsaXplZCBkYXRhIGZpZWxkcyBvZiBhbnkgcmVzb3VyY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBEaXNwYXRjaGVzIGJ5IHJlc291cmNlIHR5cGUgKHN0ZXAsIGhvb2ssIGV2ZW50LCB3b3JrZmxvdykgYW5kIGNhbGxzXG4gKiBgaHlkcmF0ZURhdGFgIHdpdGggdGhlIHByb3ZpZGVkIHJldml2ZXJzIGZvciBlYWNoIGRhdGEgZmllbGQuXG4gKlxuICogRWFjaCBlbnZpcm9ubWVudCAod2ViLCBDTEkpIHByb3ZpZGVzIGl0cyBvd24gcmV2aXZlcnMg4oCUIHRoaXMgZnVuY3Rpb25cbiAqIG9ubHkgaGFuZGxlcyB0aGUgZGlzcGF0Y2ggbG9naWMgYW5kIGZpZWxkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJTzxcbiAgVCBleHRlbmRzIHtcbiAgICBzdGVwSWQ/OiBzdHJpbmc7XG4gICAgaG9va0lkPzogc3RyaW5nO1xuICAgIGV2ZW50SWQ/OiBzdHJpbmc7XG4gICAgZXZlbnRUeXBlPzogc3RyaW5nO1xuICAgIGlucHV0PzogYW55O1xuICAgIG91dHB1dD86IGFueTtcbiAgICBtZXRhZGF0YT86IGFueTtcbiAgICBldmVudERhdGE/OiBhbnk7XG4gICAgZXhlY3V0aW9uQ29udGV4dD86IGFueTtcbiAgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBpZiAoIXJlc291cmNlKSByZXR1cm4gcmVzb3VyY2U7XG5cbiAgbGV0IGh5ZHJhdGVkOiBUO1xuICBpZiAoJ3N0ZXBJZCcgaW4gcmVzb3VyY2UpIHtcbiAgICBoeWRyYXRlZCA9IGh5ZHJhdGVTdGVwSU8ocmVzb3VyY2UsIHJldml2ZXJzKTtcbiAgfSBlbHNlIGlmICgnaG9va0lkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZUhvb2tNZXRhZGF0YShyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2UgaWYgKCdldmVudElkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZUV2ZW50RGF0YShyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZVdvcmtmbG93SU8ocmVzb3VyY2UsIHJldml2ZXJzKTtcbiAgfVxuXG4gIC8vIFN0cmlwIGV4ZWN1dGlvbkNvbnRleHQsIHByZXNlcnZpbmcgb25seSB3b3JrZmxvd0NvcmVWZXJzaW9uIGZvciBkaXNwbGF5XG4gIGlmICgnZXhlY3V0aW9uQ29udGV4dCcgaW4gaHlkcmF0ZWQpIHtcbiAgICBjb25zdCB7IGV4ZWN1dGlvbkNvbnRleHQsIC4uLnJlc3QgfSA9IGh5ZHJhdGVkO1xuICAgIGNvbnN0IHdvcmtmbG93Q29yZVZlcnNpb24gPVxuICAgICAgZXhlY3V0aW9uQ29udGV4dCAmJlxuICAgICAgdHlwZW9mIGV4ZWN1dGlvbkNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgICAnd29ya2Zsb3dDb3JlVmVyc2lvbicgaW4gZXhlY3V0aW9uQ29udGV4dFxuICAgICAgICA/IGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dDb3JlVmVyc2lvblxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3dDb3JlVmVyc2lvbikge1xuICAgICAgcmV0dXJuIHsgLi4ucmVzdCwgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3QgYXMgVDtcbiAgfVxuXG4gIHJldHVybiBoeWRyYXRlZDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBFeHRyYWN0IGFsbCBzdHJlYW0gSURzIGZyb20gYSB2YWx1ZSAocmVjdXJzaXZlbHkgdHJhdmVyc2VzIG9iamVjdHMvYXJyYXlzKSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTdHJlYW1JZHMob2JqOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBzdHJlYW1JZHM6IHN0cmluZ1tdID0gW107XG4gIC8vIFRoZSBoeWRyYXRlZCBvMTF5IGRhdGEgdGhpcyB3YWxrcyBjb21lcyBmcm9tIGRldmFsdWUsIHdoaWNoIHN1cHBvcnRzXG4gIC8vIGNpcmN1bGFyIGFuZCByZXBlYXRlZCByZWZlcmVuY2VzLiBUcmFjayB2aXNpdGVkIGNvbnRhaW5lcnMgc28gYSBjeWNsZVxuICAvLyAoZS5nLiBhIHN0ZXAgcmVzdWx0IHdob3NlIG9iamVjdCByZWZlcnMgYmFjayB0byBpdHNlbGYpIGRvZXNuJ3QgcmVjdXJzZVxuICAvLyBmb3JldmVyIGFuZCBvdmVyZmxvdyB0aGUgc3RhY2suXG4gIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgZnVuY3Rpb24gdHJhdmVyc2UodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJlYW1JZCh2YWx1ZSkpIHtcbiAgICAgIHN0cmVhbUlkcy5wdXNoKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIHRyYXZlcnNlKGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgICAgdHJhdmVyc2UodmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmF2ZXJzZShvYmopO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHN0cmVhbUlkcykpO1xufVxuXG4vKiogVHJ1bmNhdGUgYSBzdHJpbmcgdG8gYSBtYXhpbXVtIGxlbmd0aCwgYWRkaW5nIGVsbGlwc2lzIGlmIG5lZWRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlSWQoaWQ6IHN0cmluZywgbWF4TGVuZ3RoID0gMTIpOiBzdHJpbmcge1xuICBpZiAoaWQubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIGlkO1xuICByZXR1cm4gYCR7aWQuc2xpY2UoMCwgbWF4TGVuZ3RoKX0uLi5gO1xufVxuIl19
726
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi1mb3JtYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvc2VyaWFsaXphdGlvbi1mb3JtYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFFM0MsOEVBQThFO0FBQzlFLHlDQUF5QztBQUN6Qyw4RUFBOEU7QUFFOUU7Ozs7Ozs7O0dBUUc7QUFDSCxPQUFPLEVBRUwsT0FBTyxJQUFJLGVBQWUsRUFDMUIsb0JBQW9CLEVBQ3BCLE9BQU8sSUFBSSxlQUFlLEVBQzFCLGdCQUFnQixFQUNoQixZQUFZLEVBR1osY0FBYyxFQUVkLE1BQU0sR0FDUCxNQUFNLCtCQUErQixDQUFDO0FBRXZDLDhFQUE4RTtBQUM5RSxnREFBZ0Q7QUFDaEQsOEVBQThFO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHO0lBQ2pDLDJEQUEyRDtJQUMzRCxVQUFVLEVBQUUsTUFBTTtJQUNsQixtRkFBbUY7SUFDbkYsU0FBUyxFQUFFLE1BQU07SUFDakI7Ozs7Ozs7OztPQVNHO0lBQ0gsTUFBTSxFQUFFLE1BQU07SUFDZCw0RkFBNEY7SUFDNUYsSUFBSSxFQUFFLE1BQU07SUFDWixpR0FBaUc7SUFDakcsSUFBSSxFQUFFLE1BQU07Q0FDSixDQUFDO0FBS1gsMkNBQTJDO0FBQzNDLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO0FBRS9CLE1BQU0sYUFBYSxHQUFHLElBQUksV0FBVyxFQUFFLENBQUM7QUFDeEMsTUFBTSxhQUFhLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztBQUV4Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDcEMsTUFBK0IsRUFDL0IsT0FBNkI7SUFFN0IsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLFVB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QUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztZQUNoQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUN6QixRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLEtBQUssSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUM5QyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUFFLE9BQU87WUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNoQixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDdkMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNkLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCx1RUFBdUU7QUFDdkUsTUFBTSxVQUFVLFVBQVUsQ0FBQyxFQUFVLEVBQUUsU0FBUyxHQUFHLEVBQUU7SUFDbkQsSUFBSSxFQUFFLENBQUMsTUFBTSxJQUFJLFNBQVM7UUFBRSxPQUFPLEVBQUUsQ0FBQztJQUN0QyxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEtBQUssQ0FBQztBQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBCcm93c2VyLXNhZmUgc2VyaWFsaXphdGlvbiBmb3JtYXQgdXRpbGl0aWVzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGNvbnRhaW5zIHRoZSBmb3JtYXQgcHJlZml4IGhhbmRsaW5nLCBnZW5lcmljIGh5ZHJhdGUvZGVoeWRyYXRlXG4gKiBkaXNwYXRjaCwgYW5kIHNoYXJlZCB0eXBlcy9jbGFzc2VzIHVzZWQgYnkgYWxsIGVudmlyb25tZW50cyAocnVudGltZSwgd2ViXG4gKiBvMTF5LCBDTEkgbzExeSkuIEl0IGhhcyBOTyBOb2RlLmpzIGRlcGVuZGVuY2llcy5cbiAqL1xuXG5pbXBvcnQgeyBnZXRFdmVudERhdGFSZWZGaWVsZHMgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgcGFyc2UsIHVuZmxhdHRlbiB9IGZyb20gJ2RldmFsdWUnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEtleSBtYXRlcmlhbCAoYnJvd3Nlci1zYWZlIHJlLWV4cG9ydHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZS1leHBvcnRlZCBmcm9tIHRoZSBlbnZlbG9wZSBsYXllciBzbyBicm93c2VyIGNvbnN1bWVycyAod2ViIGRhc2hib2FyZCxcbiAqIHdlYi1zaGFyZWQpIGNhbiByZXNvbHZlIGtleSBtYXRlcmlhbCB3aXRob3V0IGltcG9ydGluZ1xuICogYEB3b3JrZmxvdy9jb3JlL3NlcmlhbGl6YXRpb25gLCB3aG9zZSBtb2R1bGUgZ3JhcGggcmVhY2hlcyBOb2RlIGJ1aWx0LWluc1xuICogKGBub2RlOnV0aWxgLCBgbm9kZTphc3luY19ob29rc2ApIGFuZCBjYW5ub3QgYmUgYnVuZGxlZCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogRXZlcnl0aGluZyBiZWxvdyBpcyBXZWIgQ3J5cHRvIG9ubHk6IGBzZXJpYWxpemF0aW9uL2VuY3J5cHRpb24udHNgLFxuICogYGVuY3J5cHRpb24udHNgIGFuZCBgc2VhbGVkLWJveC50c2AgYXJlIGFsbCBmcmVlIG9mIE5vZGUgZGVwZW5kZW5jaWVzLlxuICovXG5leHBvcnQge1xuICB0eXBlIERlY3J5cHRpb25LZXksXG4gIGRlY3J5cHQgYXMgZGVjcnlwdEVudmVsb3BlLFxuICBkZXJpdmVSdW5QYXlsb2FkS2V5cyxcbiAgZW5jcnlwdCBhcyBlbmNyeXB0RW52ZWxvcGUsXG4gIGlzUnVuUGF5bG9hZEtleXMsXG4gIGlzU2VhbFRhcmdldCxcbiAgdHlwZSBQYXlsb2FkS2V5LFxuICB0eXBlIFJ1blBheWxvYWRLZXlzLFxuICBydW5QYXlsb2FkS2V5cyxcbiAgdHlwZSBTZWFsVGFyZ2V0LFxuICBzZWFsVG8sXG59IGZyb20gJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGb3JtYXQgcHJlZml4IGNvbnN0YW50cyBhbmQgZW5jb2RpbmcvZGVjb2Rpbmdcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbkZvcm1hdCA9IHtcbiAgLyoqIGRldmFsdWUgc3RyaW5naWZ5L3BhcnNlIHdpdGggVGV4dEVuY29kZXIvVGV4dERlY29kZXIgKi9cbiAgREVWQUxVRV9WMTogJ2RldmwnLFxuICAvKiogRW5jcnlwdGVkIHBheWxvYWQgKGlubmVyIHBheWxvYWQgaGFzIGl0cyBvd24gZm9ybWF0IHByZWZpeCBhZnRlciBkZWNyeXB0aW9uKSAqL1xuICBFTkNSWVBURUQ6ICdlbmNyJyxcbiAgLyoqXG4gICAqIFNlYWxlZCBwYXlsb2FkIOKAlCBhc3ltbWV0cmljYWxseSBlbmNyeXB0ZWQgdG8gYSBydW4ncyBYMjU1MTkgcHVibGljIGtleVxuICAgKiAoaW5uZXIgcGF5bG9hZCBoYXMgaXRzIG93biBmb3JtYXQgcHJlZml4IGFmdGVyIG9wZW5pbmcpLlxuICAgKlxuICAgKiBXcml0dGVuIGJ5IGNyb3NzLXJ1biB3cml0ZXJzIHRoYXQgaG9sZCBvbmx5IHRoZSByZWNpcGllbnQgcnVuJ3MgcHVibGljXG4gICAqIGtleS4gT3BlbmluZyBpdCByZXF1aXJlcyB0aGUgcnVuJ3MgcHJpdmF0ZSBzY2FsYXIgcmF0aGVyIHRoYW4gdGhlXG4gICAqIHN5bW1ldHJpYyBwZXItcnVuIGtleSwgc28gbzExeSBkaXNwbGF5IHRyZWF0cyBpdCBhcyBjaXBoZXJ0ZXh0IHZpYVxuICAgKiB7QGxpbmsgaXNFbmNyeXB0ZWREYXRhfSBidXQge0BsaW5rIGh5ZHJhdGVEYXRhV2l0aEtleX0gZG9lcyBub3QgYXR0ZW1wdFxuICAgKiBhbiBBRVMtR0NNIGRlY3J5cHQgb24gaXQuXG4gICAqL1xuICBTRUFMRUQ6ICdlbmNwJyxcbiAgLyoqIEd6aXAtY29tcHJlc3NlZCBwYXlsb2FkIChpbm5lciBwYXlsb2FkIGhhcyBpdHMgb3duIGZvcm1hdCBwcmVmaXggYWZ0ZXIgZGVjb21wcmVzc2lvbikgKi9cbiAgR1pJUDogJ2d6aXAnLFxuICAvKiogWnN0YW5kYXJkLWNvbXByZXNzZWQgcGF5bG9hZCAoaW5uZXIgcGF5bG9hZCBoYXMgaXRzIG93biBmb3JtYXQgcHJlZml4IGFmdGVyIGRlY29tcHJlc3Npb24pICovXG4gIFpTVEQ6ICd6c3RkJyxcbn0gYXMgY29uc3Q7XG5cbmV4cG9ydCB0eXBlIFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlID1cbiAgKHR5cGVvZiBTZXJpYWxpemF0aW9uRm9ybWF0KVtrZXlvZiB0eXBlb2YgU2VyaWFsaXphdGlvbkZvcm1hdF07XG5cbi8qKiBMZW5ndGggb2YgdGhlIGZvcm1hdCBwcmVmaXggaW4gYnl0ZXMgKi9cbmNvbnN0IEZPUk1BVF9QUkVGSVhfTEVOR1RIID0gNDtcblxuY29uc3QgZm9ybWF0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuY29uc3QgZm9ybWF0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKipcbiAqIEVuY29kZSBhIHBheWxvYWQgd2l0aCBhIGZvcm1hdCBwcmVmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmNvZGVXaXRoRm9ybWF0UHJlZml4KFxuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlLFxuICBwYXlsb2FkOiBVaW50OEFycmF5IHwgdW5rbm93blxuKTogVWludDhBcnJheSB8IHVua25vd24ge1xuICBpZiAoIShwYXlsb2FkIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICByZXR1cm4gcGF5bG9hZDtcbiAgfVxuXG4gIGNvbnN0IHByZWZpeEJ5dGVzID0gZm9ybWF0RW5jb2Rlci5lbmNvZGUoZm9ybWF0KTtcbiAgaWYgKHByZWZpeEJ5dGVzLmxlbmd0aCAhPT0gRk9STUFUX1BSRUZJWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgRm9ybWF0IGlkZW50aWZpZXIgbXVzdCBiZSBleGFjdGx5ICR7Rk9STUFUX1BSRUZJWF9MRU5HVEh9IEFTQ0lJIGNoYXJhY3RlcnMsIGdvdCBcIiR7Zm9ybWF0fVwiICgke3ByZWZpeEJ5dGVzLmxlbmd0aH0gYnl0ZXMpYFxuICAgICk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBuZXcgVWludDhBcnJheShGT1JNQVRfUFJFRklYX0xFTkdUSCArIHBheWxvYWQubGVuZ3RoKTtcbiAgcmVzdWx0LnNldChwcmVmaXhCeXRlcywgMCk7XG4gIHJlc3VsdC5zZXQocGF5bG9hZCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIERlY29kZSBhIGZvcm1hdC1wcmVmaXhlZCBwYXlsb2FkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRm9ybWF0UHJlZml4KGRhdGE6IFVpbnQ4QXJyYXkgfCB1bmtub3duKToge1xuICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXRUeXBlO1xuICBwYXlsb2FkOiBVaW50OEFycmF5O1xufSB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSkge1xuICAgIHJldHVybiB7XG4gICAgICBmb3JtYXQ6IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSxcbiAgICAgIHBheWxvYWQ6IG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZShKU09OLnN0cmluZ2lmeShkYXRhKSksXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYERhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZm9ybWF0IHByZWZpeDogZXhwZWN0ZWQgYXQgbGVhc3QgJHtGT1JNQVRfUFJFRklYX0xFTkdUSH0gYnl0ZXMsIGdvdCAke2RhdGEubGVuZ3RofWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgcHJlZml4Qnl0ZXMgPSBkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgY29uc3QgZm9ybWF0ID0gZm9ybWF0RGVjb2Rlci5kZWNvZGUocHJlZml4Qnl0ZXMpO1xuXG4gIGNvbnN0IGtub3duRm9ybWF0cyA9IE9iamVjdC52YWx1ZXMoU2VyaWFsaXphdGlvbkZvcm1hdCkgYXMgc3RyaW5nW107XG4gIGlmICgha25vd25Gb3JtYXRzLmluY2x1ZGVzKGZvcm1hdCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgVW5rbm93biBzZXJpYWxpemF0aW9uIGZvcm1hdDogXCIke2Zvcm1hdH1cIi4gS25vd24gZm9ybWF0czogJHtrbm93bkZvcm1hdHMuam9pbignLCAnKX1gXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHBheWxvYWQgPSBkYXRhLnN1YmFycmF5KEZPUk1BVF9QUkVGSVhfTEVOR1RIKTtcbiAgcmV0dXJuIHsgZm9ybWF0OiBmb3JtYXQgYXMgU2VyaWFsaXphdGlvbkZvcm1hdFR5cGUsIHBheWxvYWQgfTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBFbmNyeXB0ZWQgZGF0YSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFBsYWNlaG9sZGVyIHN0cmluZyBkaXNwbGF5ZWQgd2hlbiBkYXRhIGlzIGVuY3J5cHRlZCBhbmQgZGVjcnlwdGlvblxuICogaGFzIG5vdCBiZWVuIHJlcXVlc3RlZC4gVXNlZCBieSBib3RoIENMSSBhbmQgd2ViIG8xMXkuXG4gKi9cbmV4cG9ydCBjb25zdCBFTkNSWVBURURfUExBQ0VIT0xERVIgPSAnXFx1ezFGNTEyfSBFbmNyeXB0ZWQnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEV4cGlyZWQgZGF0YSBkZXRlY3Rpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIENoZWNrIGlmIGEgcGxhaW4gb2JqZWN0IGlzIGB7IGV4cGlyZWRBdDogXCI8SVNPIGRhdGU+XCIgfWAg4oCUIGEgc2luZ2xlLWtleVxuICogb2JqZWN0IHdpdGggYSBzdHJpbmcgYGV4cGlyZWRBdGAgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGlzRXhwaXJlZE9iamVjdChkYXRhOiB1bmtub3duKTogZGF0YSBpcyB7IGV4cGlyZWRBdDogc3RyaW5nIH0ge1xuICBpZiAoZGF0YSA9PT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShkYXRhKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZGF0YSk7XG4gIHJldHVybiAoXG4gICAga2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICBrZXlzWzBdID09PSAnZXhwaXJlZEF0JyAmJlxuICAgIHR5cGVvZiAoZGF0YSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikuZXhwaXJlZEF0ID09PSAnc3RyaW5nJ1xuICApO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgaHlkcmF0ZWQgdmFsdWUgaXMgYW4gZXhwaXJlZCBkYXRhIHN0dWIgZnJvbSB0aGUgc2VydmVyLlxuICpcbiAqIFRoZSBzZXJ2ZXIgcmVwbGFjZXMgZXhwaXJlZCByZWYgZmllbGRzIHdpdGggYSBkZXZhbHVlLWVuY29kZWQgc3R1YlxuICogKGBtYWtlRXhwaXJlZFN0dWJgKSB0aGF0IGRlc2VyaWFsaXplcyB0byBgW3sgZXhwaXJlZEF0OiBcIjxJU08gZGF0ZT5cIiB9XWBcbiAqIGFmdGVyIGB1bmZsYXR0ZW5gIChhcnJheS13cmFwcGVkIGR1ZSB0byBiYWNrd2FyZHMtY29tcGF0aWJsZSBlbmNvZGluZykuXG4gKiBBbHNvIG1hdGNoZXMgdGhlIHVud3JhcHBlZCBgeyBleHBpcmVkQXQ6IFwiLi4uXCIgfWAgZm9ybSBmb3Igcm9idXN0bmVzcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRXhwaXJlZFN0dWIoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICAvLyBEaXJlY3Qgb2JqZWN0IGZvcm06IHsgZXhwaXJlZEF0OiBcIi4uLlwiIH1cbiAgaWYgKGlzRXhwaXJlZE9iamVjdChkYXRhKSkgcmV0dXJuIHRydWU7XG4gIC8vIEFycmF5LXdyYXBwZWQgZm9ybSBmcm9tIGRldmFsdWUgdW5mbGF0dGVuOiBbeyBleHBpcmVkQXQ6IFwiLi4uXCIgfV1cbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkgJiYgZGF0YS5sZW5ndGggPT09IDEgJiYgaXNFeHBpcmVkT2JqZWN0KGRhdGFbMF0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG4vKipcbiAqIENoZWNrIGlmIGEgYmluYXJ5IHZhbHVlIGlzIGNpcGhlcnRleHQg4oCUIGVpdGhlciBhIHN5bW1ldHJpY2FsbHkgZW5jcnlwdGVkXG4gKiBwYXlsb2FkICgnZW5jcicpIG9yIGEgc2VhbGVkIGNyb3NzLXJ1biBwYXlsb2FkICgnZW5jcCcpLlxuICpcbiAqIFRoaXMgaXMgdGhlIHByZWRpY2F0ZSBkaXNwbGF5IGxheWVycyB3YW50OiBib3RoIHNjaGVtZXMgYXJlIG9wYXF1ZSBieXRlc1xuICogdGhhdCBtdXN0IG5vdCBiZSBmZWQgdG8gdGhlIGRldmFsdWUgcGFyc2VyLCBhbmQgYm90aCByZW5kZXIgYXMgdGhlIHNhbWVcbiAqIFwiRW5jcnlwdGVkXCIgYWZmb3JkYW5jZSBpbiB0aGUgQ0xJIGFuZCB3ZWIgVUkuIFVzZSB7QGxpbmsgaXNTZWFsZWREYXRhfSB3aGVuXG4gKiB0aGUgKnNjaGVtZSogbWF0dGVycyDigJQgbm90YWJseSB3aGVuIGNob29zaW5nIGEgZGVjcnlwdGlvbiBwYXRoLCBzaW5jZSBhXG4gKiBzZWFsZWQgcGF5bG9hZCBuZWVkcyB0aGUgcnVuJ3MgcHJpdmF0ZSBzY2FsYXIgcmF0aGVyIHRoYW4gaXRzIHN5bW1ldHJpYyBrZXkuXG4gKlxuICogQnJvd3Nlci1zYWZlIOKAlCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGZ1bGwgc2VyaWFsaXphdGlvbiBtb2R1bGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0VuY3J5cHRlZERhdGEoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgZGF0YS5sZW5ndGggPCBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBmb3JtYXREZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKSk7XG4gIHJldHVybiAoXG4gICAgcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkVOQ1JZUFRFRCB8fFxuICAgIHByZWZpeCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRURcbiAgKTtcbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhIGJpbmFyeSB2YWx1ZSBoYXMgdGhlICdlbmNwJyBmb3JtYXQgcHJlZml4LCBpbmRpY2F0aW5nIGEgc2VhbGVkXG4gKiAoYXN5bW1ldHJpY2FsbHkgZW5jcnlwdGVkKSBjcm9zcy1ydW4gcGF5bG9hZC5cbiAqXG4gKiBCcm93c2VyLXNhZmUg4oCUIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZnVsbCBzZXJpYWxpemF0aW9uIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2VhbGVkRGF0YShkYXRhOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBkYXRhLmxlbmd0aCA8IEZPUk1BVF9QUkVGSVhfTEVOR1RIKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByZWZpeCA9IGZvcm1hdERlY29kZXIuZGVjb2RlKGRhdGEuc3ViYXJyYXkoMCwgRk9STUFUX1BSRUZJWF9MRU5HVEgpKTtcbiAgcmV0dXJuIHByZWZpeCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5TRUFMRUQ7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgYSBiaW5hcnkgdmFsdWUgaGFzIGEgY29tcHJlc3Npb24gZm9ybWF0IHByZWZpeCAoJ2d6aXAnIG9yICd6c3RkJykuXG4gKiBCcm93c2VyLXNhZmUg4oCUIGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgZnVsbCBzZXJpYWxpemF0aW9uIG1vZHVsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tcHJlc3NlZERhdGEoZGF0YTogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIShkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkgfHwgZGF0YS5sZW5ndGggPCBGT1JNQVRfUFJFRklYX0xFTkdUSCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBmb3JtYXREZWNvZGVyLmRlY29kZShkYXRhLnN1YmFycmF5KDAsIEZPUk1BVF9QUkVGSVhfTEVOR1RIKSk7XG4gIHJldHVybiAoXG4gICAgcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LkdaSVAgfHwgcHJlZml4ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVERcbiAgKTtcbn1cblxuaW50ZXJmYWNlIE5vZGVabGliRGVjb2RlIHtcbiAgZ3VuemlwU3luYz86IChkYXRhOiBVaW50OEFycmF5KSA9PiBVaW50OEFycmF5O1xuICB6c3RkRGVjb21wcmVzc1N5bmM/OiAoZGF0YTogVWludDhBcnJheSkgPT4gVWludDhBcnJheTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGBub2RlOnpsaWJgIHZpYSBgcHJvY2Vzcy5nZXRCdWlsdGluTW9kdWxlYCDigJQgbm8gc3RhdGljIE5vZGVcbiAqIGRlcGVuZGVuY3ksIGludmlzaWJsZSB0byBicm93c2VyIGJ1bmRsZXJzLiBSZXR1cm5zIHVuZGVmaW5lZCBvZmYgTm9kZS5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZVpsaWIoKTogTm9kZVpsaWJEZWNvZGUgfCB1bmRlZmluZWQge1xuICB0cnkge1xuICAgIHJldHVybiAoXG4gICAgICBnbG9iYWxUaGlzIGFzIHtcbiAgICAgICAgcHJvY2Vzcz86IHsgZ2V0QnVpbHRpbk1vZHVsZT86IChpZDogc3RyaW5nKSA9PiBOb2RlWmxpYkRlY29kZSB9O1xuICAgICAgfVxuICAgICkucHJvY2Vzcz8uZ2V0QnVpbHRpbk1vZHVsZT8uKCdub2RlOnpsaWInKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgZGVjb21wcmVzcyBhIGBnemlwYC9genN0ZGAgcGF5bG9hZCB3aGVuIHJ1bm5pbmcgb24gTm9kZS5qcy5cbiAqXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gc3luYyBkZWNvbXByZXNzaW9uIGlzbid0IGF2YWlsYWJsZSAoZS5nLiBpbiB0aGVcbiAqIGJyb3dzZXIsIG9yIHpzdGQgb24gTm9kZSA8IDIyLjE1KSDigJQgY2FsbGVycyBmYWxsIGJhY2sgdG8gbGVhdmluZyB0aGUgZGF0YVxuICogdW4taHlkcmF0ZWQgKHRoZSBhc3luYyBgaHlkcmF0ZURhdGFXaXRoS2V5YCBwYXRoIGhhbmRsZXMgZGVjb21wcmVzc2lvbiBpblxuICogYnJvd3NlcnMgdmlhIGBEZWNvbXByZXNzaW9uU3RyZWFtYCAvIGEgcmVnaXN0ZXJlZCB6c3RkIGRlY29kZXIpLlxuICovXG5mdW5jdGlvbiBkZWNvbXByZXNzU3luY0lmQXZhaWxhYmxlKFxuICBmb3JtYXQ6IHN0cmluZyxcbiAgcGF5bG9hZDogVWludDhBcnJheVxuKTogVWludDhBcnJheSB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgY29uc3QgemxpYiA9IGdldE5vZGVabGliKCk7XG4gICAgaWYgKGZvcm1hdCA9PT0gU2VyaWFsaXphdGlvbkZvcm1hdC5HWklQICYmIHpsaWI/Lmd1bnppcFN5bmMpIHtcbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSh6bGliLmd1bnppcFN5bmMocGF5bG9hZCkpO1xuICAgIH1cbiAgICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVEQgJiYgemxpYj8uenN0ZERlY29tcHJlc3NTeW5jKSB7XG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoemxpYi56c3RkRGVjb21wcmVzc1N5bmMocGF5bG9hZCkpO1xuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gRmFsbCB0aHJvdWdoIOKAlCB0cmVhdCBhcyB1bmF2YWlsYWJsZVxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQnJvd3NlciB6c3RkIGRlY29kZXIsIHJlZ2lzdGVyZWQgYnkgdGhlIG8xMXkgaG9zdCAod2ViLXNoYXJlZCkgc2luY2UgdGhlXG4gKiBXZWIgYERlY29tcHJlc3Npb25TdHJlYW1gIGhhcyBubyB6c3RkIHN1cHBvcnQuIE5vZGUgZGVjb2RlcyB2aWEgYG5vZGU6emxpYmBcbiAqIGFuZCBuZXZlciBuZWVkcyB0aGlzLiBTZWUgYHJlZ2lzdGVyWnN0ZERlY29kZXJgLlxuICovXG5sZXQgenN0ZEJyb3dzZXJEZWNvZGVyOlxuICB8ICgocGF5bG9hZDogVWludDhBcnJheSkgPT4gUHJvbWlzZTxVaW50OEFycmF5PilcbiAgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBicm93c2VyIHpzdGQgZGVjb2RlciAoZS5nLiBhIFdBU00tYmFja2VkIG9uZSkuIFRoZSB3ZWIgbzExeSBVSVxuICogY2FsbHMgdGhpcyBhdCBpbml0IHNvIGBoeWRyYXRlRGF0YVdpdGhLZXlgIGNhbiBpbmZsYXRlIHpzdGQgcGF5bG9hZHMgYWZ0ZXJcbiAqIGNsaWVudC1zaWRlIGRlY3J5cHRpb24uIE5vZGUgcmVhZGVycyB1c2UgYG5vZGU6emxpYmAgYW5kIGlnbm9yZSB0aGlzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJac3RkRGVjb2RlcihcbiAgZGVjb2RlcjogKHBheWxvYWQ6IFVpbnQ4QXJyYXkpID0+IFByb21pc2U8VWludDhBcnJheT5cbik6IHZvaWQge1xuICB6c3RkQnJvd3NlckRlY29kZXIgPSBkZWNvZGVyO1xufVxuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IGRlY29tcHJlc3MgYSBgZ3ppcGAvYHpzdGRgIHBheWxvYWQuXG4gKiAtIGd6aXA6IHdlYi1zdGFuZGFyZCBgRGVjb21wcmVzc2lvblN0cmVhbWAgKE5vZGUgMTgrLCBicm93c2VycywgZWRnZSkuXG4gKiAtIHpzdGQ6IGBub2RlOnpsaWJgIHdoZW4gb24gTm9kZSwgZWxzZSB0aGUgcmVnaXN0ZXJlZCBicm93c2VyIGRlY29kZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRlY29tcHJlc3NBc3luYyhcbiAgZm9ybWF0OiBzdHJpbmcsXG4gIHBheWxvYWQ6IFVpbnQ4QXJyYXlcbik6IFByb21pc2U8VWludDhBcnJheT4ge1xuICBpZiAoZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVEQpIHtcbiAgICBjb25zdCBzeW5jID0gZGVjb21wcmVzc1N5bmNJZkF2YWlsYWJsZShmb3JtYXQsIHBheWxvYWQpO1xuICAgIGlmIChzeW5jKSByZXR1cm4gc3luYztcbiAgICBpZiAoenN0ZEJyb3dzZXJEZWNvZGVyKSByZXR1cm4genN0ZEJyb3dzZXJEZWNvZGVyKHBheWxvYWQpO1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICd6c3RkLWNvbXByZXNzZWQgd29ya2Zsb3cgZGF0YSBlbmNvdW50ZXJlZCBidXQgbm8genN0ZCBkZWNvZGVyIGlzICcgK1xuICAgICAgICAnYXZhaWxhYmxlLiBOb2RlLmpzIDIyLjE1KyBkZWNvZGVzIG5hdGl2ZWx5OyBpbiB0aGUgYnJvd3NlciByZWdpc3RlciAnICtcbiAgICAgICAgJ29uZSB2aWEgcmVnaXN0ZXJac3RkRGVjb2RlciAodGhlIHdlYiBvMTF5IHBhY2thZ2UgZG9lcyB0aGlzKS4nXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IHRyYW5zZm9ybSA9IG5ldyBEZWNvbXByZXNzaW9uU3RyZWFtKCdnemlwJyk7XG4gIGNvbnN0IHdyaXRlciA9IHRyYW5zZm9ybS53cml0YWJsZS5nZXRXcml0ZXIoKTtcbiAgY29uc3Qgd3JpdGVQcm9taXNlID0gd3JpdGVyLndyaXRlKHBheWxvYWQpLnRoZW4oKCkgPT4gd3JpdGVyLmNsb3NlKCkpO1xuICB3cml0ZVByb21pc2UuY2F0Y2goKCkgPT4ge30pO1xuICBjb25zdCBjaHVua3M6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuICBsZXQgdG90YWwgPSAwO1xuICBjb25zdCByZWFkZXIgPSB0cmFuc2Zvcm0ucmVhZGFibGUuZ2V0UmVhZGVyKCk7XG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGlmIChkb25lKSBicmVhaztcbiAgICBjaHVua3MucHVzaCh2YWx1ZSk7XG4gICAgdG90YWwgKz0gdmFsdWUubGVuZ3RoO1xuICB9XG4gIGF3YWl0IHdyaXRlUHJvbWlzZTtcbiAgY29uc3Qgb3V0ID0gbmV3IFVpbnQ4QXJyYXkodG90YWwpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgZm9yIChjb25zdCBjaHVuayBvZiBjaHVua3MpIHtcbiAgICBvdXQuc2V0KGNodW5rLCBvZmZzZXQpO1xuICAgIG9mZnNldCArPSBjaHVuay5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIG91dDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBSZXZpdmVycyB0eXBlIChzaGFyZWQgYWNyb3NzIGFsbCBlbnZpcm9ubWVudHMpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBBIG1hcCBvZiB0eXBlIG5hbWUg4oaSIHJldml2ZXIgZnVuY3Rpb24sIHVzZWQgYnkgZGV2YWx1ZSdzIGBwYXJzZWAvYHVuZmxhdHRlbmAuXG4gKiBFYWNoIGVudmlyb25tZW50IChydW50aW1lLCB3ZWIsIENMSSkgcHJvdmlkZXMgaXRzIG93biBzZXQuXG4gKi9cbmV4cG9ydCB0eXBlIFJldml2ZXJzID0gUmVjb3JkPHN0cmluZywgKHZhbHVlOiBhbnkpID0+IGFueT47XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gR2VuZXJpYyBoeWRyYXRlL2RlaHlkcmF0ZSBkaXNwYXRjaFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogSHlkcmF0ZSAoZGVzZXJpYWxpemUpIGEgdmFsdWUgdGhhdCB3YXMgc3RvcmVkIGluIHRoZSBkYXRhYmFzZS5cbiAqXG4gKiBIYW5kbGVzIGZvdXIgZGF0YSBzaGFwZXM6XG4gKiAxLiBgVWludDhBcnJheWAgd2l0aCAnZW5jcicgcHJlZml4IOKGkiByZXR1cm5lZCBhcy1pcyAoZW5jcnlwdGVkLCBub3QgeWV0IGRlY3J5cHRlZClcbiAqIDIuIGBVaW50OEFycmF5YCB3aXRoIGEgZm9ybWF0IHByZWZpeCAoc3BlY1ZlcnNpb24gMispIOKGkiBkZWNvZGUgcHJlZml4LCBwYXJzZVxuICogMy4gYEFycmF5YCAobGVnYWN5IHNwZWNWZXJzaW9uIDEsIFwicmV2aXZlZCBkZXZhbHVlXCIpIOKGkiB1bmZsYXR0ZW5cbiAqIDQuIE90aGVyIChhbHJlYWR5IGEgcGxhaW4gSlMgdmFsdWUpIOKGkiByZXR1cm4gYXMtaXNcbiAqXG4gKiBFbmNyeXB0ZWQgZGF0YSBpcyBpbnRlbnRpb25hbGx5IGxlZnQgYXMgYSBgVWludDhBcnJheWAgc28gdGhhdCBjb25zdW1lcnNcbiAqIChDTEksIHdlYiBVSSkgY2FuIGRldGVjdCBpdCB3aXRoIGBpc0VuY3J5cHRlZERhdGEoKWAgYW5kIGRlY2lkZSBob3cgdG9cbiAqIGhhbmRsZSBpdCDigJQgdGhlIENMSSByZXBsYWNlcyBpdCB3aXRoIGEgc3R5bGVkIHBsYWNlaG9sZGVyLCB0aGUgd2ViIFVJXG4gKiByZW5kZXJzIGFuIFwiRW5jcnlwdGVkXCIgY2FyZCB3aXRoIGEgRGVjcnlwdCBidXR0b24gdGhhdCB0cmlnZ2Vyc1xuICogY2xpZW50LXNpZGUgZGVjcnlwdGlvbiBvbiBkZW1hbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlRGF0YSh2YWx1ZTogdW5rbm93biwgcmV2aXZlcnM6IFJldml2ZXJzKTogdW5rbm93biB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHtcbiAgICAvLyBFbmNyeXB0ZWQgZGF0YSBwYXNzZXMgdGhyb3VnaCB1bnRvdWNoZWQg4oCUIG8xMXkgbGF5ZXJzIGRldGVjdCBpdCB3aXRoXG4gICAgLy8gaXNFbmNyeXB0ZWREYXRhKCkgYW5kIGhhbmRsZSBkaXNwbGF5ICh3ZWI6IG5hbWVkIGNvbnN0cnVjdG9yIG9iamVjdCxcbiAgICAvLyBDTEk6IEVuY3J5cHRlZERhdGFSZWYgd2l0aCB1dGlsLmluc3BlY3QuY3VzdG9tKS5cbiAgICBpZiAoaXNFbmNyeXB0ZWREYXRhKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cblxuICAgIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgodmFsdWUpO1xuICAgIGlmIChmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuREVWQUxVRV9WMSkge1xuICAgICAgY29uc3Qgc3RyID0gbmV3IFRleHREZWNvZGVyKCkuZGVjb2RlKHBheWxvYWQpO1xuICAgICAgcmV0dXJuIHBhcnNlKHN0ciwgcmV2aXZlcnMpO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBmb3JtYXQgPT09IFNlcmlhbGl6YXRpb25Gb3JtYXQuR1pJUCB8fFxuICAgICAgZm9ybWF0ID09PSBTZXJpYWxpemF0aW9uRm9ybWF0LlpTVERcbiAgICApIHtcbiAgICAgIC8vIENvbXByZXNzZWQgcGF5bG9hZCDigJQgZGVjb21wcmVzcyBzeW5jaHJvbm91c2x5IHdoZW4gcnVubmluZyBvblxuICAgICAgLy8gTm9kZS5qcyAoQ0xJLCBzZXJ2ZXIgbzExeSkuIEluIGJyb3dzZXJzIHRoZXJlIGlzIG5vIHN5bmMgY29kZWM7XG4gICAgICAvLyBwYXNzIHRoZSBkYXRhIHRocm91Z2ggdW50b3VjaGVkIChsaWtlIGVuY3J5cHRlZCBkYXRhKSBzbyBhc3luY1xuICAgICAgLy8gY29uc3VtZXJzIGNhbiByb3V0ZSBpdCB0aHJvdWdoIGBoeWRyYXRlRGF0YVdpdGhLZXlgLCB3aGljaFxuICAgICAgLy8gZGVjb21wcmVzc2VzIHZpYSBEZWNvbXByZXNzaW9uU3RyZWFtIC8gYSByZWdpc3RlcmVkIHpzdGQgZGVjb2Rlci5cbiAgICAgIGNvbnN0IGluZmxhdGVkID0gZGVjb21wcmVzc1N5bmNJZkF2YWlsYWJsZShmb3JtYXQsIHBheWxvYWQpO1xuICAgICAgaWYgKGluZmxhdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGluZmxhdGVkIGJ5dGVzIGNhcnJ5IHRoZWlyIG93biBmb3JtYXQgcHJlZml4IChlLmcuICdkZXZsJylcbiAgICAgIHJldHVybiBoeWRyYXRlRGF0YShpbmZsYXRlZCwgcmV2aXZlcnMpO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHNlcmlhbGl6YXRpb24gZm9ybWF0OiAke2Zvcm1hdH1gKTtcbiAgfVxuXG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIHJldHVybiB1bmZsYXR0ZW4odmFsdWUsIHJldml2ZXJzKTtcbiAgfVxuXG4gIC8vIEFscmVhZHkgYSBwbGFpbiBKUyB2YWx1ZSAoZS5nLiwgbnVtYmVyLCBzdHJpbmcsIG51bGwpXG4gIHJldHVybiB2YWx1ZTtcbn1cblxuLyoqXG4gKiBIeWRyYXRlIGEgdmFsdWUsIGRlY3J5cHRpbmcgaXQgZmlyc3QgaWYgYW4gZW5jcnlwdGlvbiBrZXkgaXMgcHJvdmlkZWQuXG4gKlxuICogVGhpcyBpcyB0aGUgYXN5bmMgdmVyc2lvbiBvZiBgaHlkcmF0ZURhdGFgIHRoYXQgc3VwcG9ydHMgdHJhbnNwYXJlbnRcbiAqIGRlY3J5cHRpb24uIFVzZWQgYnkgbzExeSB0b29saW5nICh3ZWIgVUksIENMSSkgd2hlbiB0aGUgdXNlciByZXF1ZXN0c1xuICogZGVjcnlwdGlvbi5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gaHlkcmF0ZSAobWF5IGJlIGVuY3J5cHRlZCBvciBzZWFsZWQpXG4gKiBAcGFyYW0gcmV2aXZlcnMgLSBEZXZhbHVlIHJldml2ZXJzIGZvciBkZXNlcmlhbGl6YXRpb25cbiAqIEBwYXJhbSBrZXkgLSBUaGUgcnVuJ3Mga2V5IG1hdGVyaWFsLiBQYXNzIGBSdW5QYXlsb2FkS2V5c2AgKGZyb21cbiAqICAgYGRlcml2ZVJ1blBheWxvYWRLZXlzYCkgdG8gb3BlbiBib3RoIHN5bW1ldHJpYyAoYGVuY3JgKSBhbmQgc2VhbGVkXG4gKiAgIChgZW5jcGApIHBheWxvYWRzOyBhIGJhcmUgYENyeXB0b0tleWAgb3BlbnMgb25seSB0aGUgc3ltbWV0cmljIG9uZXMuXG4gKiAgIFR5cGVkIGFzIGEgcmVhZCBjYXBhYmlsaXR5IHNvIGEgd3JpdGUtb25seSBzZWFsIHRhcmdldCDigJQgd2hpY2ggY291bGQgb3BlblxuICogICBuZWl0aGVyIHNjaGVtZSDigJQgaXMgcmVqZWN0ZWQgYXQgY29tcGlsZSB0aW1lIHJhdGhlciB0aGFuIGZhaWxpbmcgaGVyZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGh5ZHJhdGVEYXRhV2l0aEtleShcbiAgdmFsdWU6IHVua25vd24sXG4gIHJldml2ZXJzOiBSZXZpdmVycyxcbiAga2V5OiBpbXBvcnQoJy4vc2VyaWFsaXphdGlvbi9lbmNyeXB0aW9uLmpzJykuRGVjcnlwdGlvbktleSB8IHVuZGVmaW5lZFxuKTogUHJvbWlzZTx1bmtub3duPiB7XG4gIGxldCBkYXRhID0gdmFsdWU7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSAmJiBpc0VuY3J5cHRlZERhdGEoZGF0YSkgJiYga2V5KSB7XG4gICAgLy8gRW52ZWxvcGUtYXdhcmUgZGVjcnlwdDogaGFuZGxlcyBib3RoIGBlbmNyYCAoQUVTLUdDTSB1bmRlciB0aGUgcnVuJ3NcbiAgICAvLyBzeW1tZXRyaWMga2V5KSBhbmQgYGVuY3BgIChzZWFsZWQgdG8gdGhlIHJ1bidzIFgyNTUxOSBwdWJsaWMga2V5IGJ5XG4gICAgLy8gc29tZSBvdGhlciBydW4pLCBkaXNwYXRjaGluZyBvbiB0aGUgZm9ybWF0IHByZWZpeC5cbiAgICBjb25zdCB7IGRlY3J5cHQsIGlzUnVuUGF5bG9hZEtleXMgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICcuL3NlcmlhbGl6YXRpb24vZW5jcnlwdGlvbi5qcydcbiAgICApO1xuICAgIC8vIE9wZW5pbmcgYSBzZWFsZWQgcGF5bG9hZCBuZWVkcyB0aGUgcnVuJ3MgcHJpdmF0ZSBzY2FsYXIuIElmIHRoZSBjYWxsZXJcbiAgICAvLyBzdXBwbGllZCBvbmx5IGEgc3ltbWV0cmljIGtleSwgbGVhdmUgdGhlIGJ5dGVzIGFzIGNpcGhlcnRleHQgc28gdGhlIFVJXG4gICAgLy8ga2VlcHMgc2hvd2luZyBpdHMgXCJFbmNyeXB0ZWRcIiBhZmZvcmRhbmNlLCByYXRoZXIgdGhhbiBzdXJmYWNpbmcgYVxuICAgIC8vIGRlY3J5cHRpb24gZXJyb3IgZm9yIHNvbWV0aGluZyB0aGF0IHdhcyBuZXZlciBvcGVuYWJsZSB3aXRoIHRoaXMga2V5LlxuICAgIGlmICghaXNTZWFsZWREYXRhKGRhdGEpIHx8IGlzUnVuUGF5bG9hZEtleXMoa2V5KSkge1xuICAgICAgZGF0YSA9IGF3YWl0IGRlY3J5cHQoZGF0YSwga2V5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGlzQ29tcHJlc3NlZERhdGEoZGF0YSkpIHtcbiAgICAvLyBEZWNvbXByZXNzOiBzdHJpcCB0aGUgY29kZWMgcHJlZml4IGFuZCBpbmZsYXRlLiBnemlwIHVzZXMgdGhlXG4gICAgLy8gd2ViLXN0YW5kYXJkIERlY29tcHJlc3Npb25TdHJlYW0gKHdvcmtzIGluIGJyb3dzZXJzKTsgenN0ZCB1c2VzXG4gICAgLy8gbm9kZTp6bGliIG9uIE5vZGUgb3IgdGhlIHJlZ2lzdGVyZWQgV0FTTSBkZWNvZGVyIGluIHRoZSBicm93c2VyLlxuICAgIC8vIFRoZSBpbmZsYXRlZCBieXRlcyBjYXJyeSB0aGVpciBvd24gZm9ybWF0IHByZWZpeCAoZS5nLiAnZGV2bCcpLlxuICAgIGNvbnN0IHsgZm9ybWF0LCBwYXlsb2FkIH0gPSBkZWNvZGVGb3JtYXRQcmVmaXgoZGF0YSk7XG4gICAgZGF0YSA9IGF3YWl0IGRlY29tcHJlc3NBc3luYyhmb3JtYXQsIHBheWxvYWQpO1xuICB9XG4gIC8vIERlbGVnYXRlIHRoZSAoZGVjcnlwdGVkL2RlY29tcHJlc3NlZCkgcmVzdWx0IHRvIHN5bmMgaHlkcmF0ZURhdGFcbiAgcmV0dXJuIGh5ZHJhdGVEYXRhKGRhdGEsIHJldml2ZXJzKTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaGFyZWQgbWFya2VyIHR5cGVzIGZvciBvMTF5IGRpc3BsYXlcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5jb25zdCBTVFJFQU1fSURfUFJFRklYID0gJ3N0cm1fJztcblxuLyoqIE1hcmtlciBmb3Igc3RyZWFtIHJlZmVyZW5jZSBvYmplY3RzIHJlbmRlcmVkIGFzIGxpbmtzIGluIHRoZSBVSSAqL1xuZXhwb3J0IGNvbnN0IFNUUkVBTV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X3N0cmVhbV9yZWZfXyc7XG5cbi8qKiBBIHN0cmVhbSByZWZlcmVuY2UgZm9yIFVJIGRpc3BsYXkgKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3RyZWFtUmVmIHtcbiAgX190eXBlOiB0eXBlb2YgU1RSRUFNX1JFRl9UWVBFO1xuICBzdHJlYW1JZDogc3RyaW5nO1xufVxuXG4vKiogTWFya2VyIGZvciBSdW4gcmVmZXJlbmNlIG9iamVjdHMgcmVuZGVyZWQgYXMgbGlua3MgaW4gdGhlIFVJICovXG5leHBvcnQgY29uc3QgUlVOX1JFRl9UWVBFID0gJ19fd29ya2Zsb3dfcnVuX3JlZl9fJztcblxuLyoqIEEgUnVuIHJlZmVyZW5jZSBmb3IgVUkgZGlzcGxheSAqL1xuZXhwb3J0IGludGVyZmFjZSBSdW5SZWYge1xuICBfX3R5cGU6IHR5cGVvZiBSVU5fUkVGX1RZUEU7XG4gIHJ1bklkOiBzdHJpbmc7XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgUnVuUmVmIG9iamVjdCAqL1xuZXhwb3J0IGNvbnN0IGlzUnVuUmVmID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUnVuUmVmID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSAhPT0gbnVsbCAmJlxuICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAnX190eXBlJyBpbiB2YWx1ZSAmJlxuICAgIHZhbHVlLl9fdHlwZSA9PT0gUlVOX1JFRl9UWVBFICYmXG4gICAgJ3J1bklkJyBpbiB2YWx1ZSAmJlxuICAgIHR5cGVvZiB2YWx1ZS5ydW5JZCA9PT0gJ3N0cmluZydcbiAgKTtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBSdW4gdmFsdWUgdG8gYSBSdW5SZWYgZm9yIGRpc3BsYXkgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkUnVuVG9SdW5SZWYgPSAodmFsdWU6IHsgcnVuSWQ6IHN0cmluZyB9KTogUnVuUmVmID0+IHtcbiAgcmV0dXJuIHsgX190eXBlOiBSVU5fUkVGX1RZUEUsIHJ1bklkOiB2YWx1ZS5ydW5JZCB9O1xufTtcblxuLyoqIE1hcmtlciBmb3IgY3VzdG9tIGNsYXNzIGluc3RhbmNlIHJlZmVyZW5jZXMgKi9cbmV4cG9ydCBjb25zdCBDTEFTU19JTlNUQU5DRV9SRUZfVFlQRSA9ICdfX3dvcmtmbG93X2NsYXNzX2luc3RhbmNlX3JlZl9fJztcblxuLyoqXG4gKiBBIGNsYXNzIGluc3RhbmNlIHJlZmVyZW5jZSBmb3IgbzExeSBkaXNwbGF5LlxuICpcbiAqIEJyb3dzZXItc2FmZSBiYXNlIGNsYXNzIOKAlCBubyBgdXRpbC5pbnNwZWN0LmN1c3RvbWAuIEVudmlyb25tZW50LXNwZWNpZmljXG4gKiByZW5kZXJpbmcgKENMSSBpbnNwZWN0LCB3ZWIgY29tcG9uZW50KSBpcyBoYW5kbGVkIGJ5IGVhY2ggY29uc3VtZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBDbGFzc0luc3RhbmNlUmVmIHtcbiAgcmVhZG9ubHkgX190eXBlID0gQ0xBU1NfSU5TVEFOQ0VfUkVGX1RZUEU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHJlYWRvbmx5IGNsYXNzTmFtZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBjbGFzc0lkOiBzdHJpbmcsXG4gICAgcHVibGljIHJlYWRvbmx5IGRhdGE6IHVua25vd25cbiAgKSB7fVxuXG4gIHRvSlNPTigpOiB7XG4gICAgX190eXBlOiBzdHJpbmc7XG4gICAgY2xhc3NOYW1lOiBzdHJpbmc7XG4gICAgY2xhc3NJZDogc3RyaW5nO1xuICAgIGRhdGE6IHVua25vd247XG4gIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBfX3R5cGU6IHRoaXMuX190eXBlLFxuICAgICAgY2xhc3NOYW1lOiB0aGlzLmNsYXNzTmFtZSxcbiAgICAgIGNsYXNzSWQ6IHRoaXMuY2xhc3NJZCxcbiAgICAgIGRhdGE6IHRoaXMuZGF0YSxcbiAgICB9O1xuICB9XG59XG5cbi8qKiBDaGVjayBpZiBhIHZhbHVlIGlzIGEgQ2xhc3NJbnN0YW5jZVJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc0NsYXNzSW5zdGFuY2VSZWYgPSAoXG4gIHZhbHVlOiB1bmtub3duXG4pOiB2YWx1ZSBpcyBDbGFzc0luc3RhbmNlUmVmID0+IHtcbiAgcmV0dXJuIChcbiAgICB2YWx1ZSBpbnN0YW5jZW9mIENsYXNzSW5zdGFuY2VSZWYgfHxcbiAgICAodmFsdWUgIT09IG51bGwgJiZcbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICdfX3R5cGUnIGluIHZhbHVlICYmXG4gICAgICB2YWx1ZS5fX3R5cGUgPT09IENMQVNTX0lOU1RBTkNFX1JFRl9UWVBFICYmXG4gICAgICAnY2xhc3NOYW1lJyBpbiB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlLmNsYXNzTmFtZSA9PT0gJ3N0cmluZycpXG4gICk7XG59O1xuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIHN0cmVhbSBJRCBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbUlkID0gKHZhbHVlOiB1bmtub3duKTogYm9vbGVhbiA9PiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlLnN0YXJ0c1dpdGgoU1RSRUFNX0lEX1BSRUZJWCk7XG59O1xuXG4vKiogQ2hlY2sgaWYgYSB2YWx1ZSBpcyBhIFN0cmVhbVJlZiBvYmplY3QgKi9cbmV4cG9ydCBjb25zdCBpc1N0cmVhbVJlZiA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFN0cmVhbVJlZiA9PiB7XG4gIHJldHVybiAoXG4gICAgdmFsdWUgIT09IG51bGwgJiZcbiAgICB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgJ19fdHlwZScgaW4gdmFsdWUgJiZcbiAgICB2YWx1ZS5fX3R5cGUgPT09IFNUUkVBTV9SRUZfVFlQRSAmJlxuICAgICdzdHJlYW1JZCcgaW4gdmFsdWUgJiZcbiAgICB0eXBlb2YgdmFsdWUuc3RyZWFtSWQgPT09ICdzdHJpbmcnXG4gICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNoYXJlZCBvMTF5IHJldml2ZXIgaGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogQ29udmVydCBhIHNlcmlhbGl6ZWQgc3RyZWFtIHZhbHVlIHRvIGEgU3RyZWFtUmVmIGZvciBkaXNwbGF5LlxuICovXG5leHBvcnQgY29uc3Qgc3RyZWFtVG9TdHJlYW1SZWYgPSAodmFsdWU6IGFueSk6IFN0cmVhbVJlZiA9PiB7XG4gIGxldCBzdHJlYW1JZDogc3RyaW5nO1xuICBpZiAoJ25hbWUnIGluIHZhbHVlKSB7XG4gICAgY29uc3QgbmFtZSA9IFN0cmluZyh2YWx1ZS5uYW1lKTtcbiAgICBpZiAoIW5hbWUuc3RhcnRzV2l0aChTVFJFQU1fSURfUFJFRklYKSkge1xuICAgICAgc3RyZWFtSWQgPSBgJHtTVFJFQU1fSURfUFJFRklYfSR7bmFtZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJlYW1JZCA9IG5hbWU7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHN0cmVhbUlkID0gYCR7U1RSRUFNX0lEX1BSRUZJWH1udWxsYDtcbiAgfVxuICByZXR1cm4geyBfX3R5cGU6IFNUUkVBTV9SRUZfVFlQRSwgc3RyZWFtSWQgfTtcbn07XG5cbi8qKiBDb252ZXJ0IGEgc2VyaWFsaXplZCBzdGVwIGZ1bmN0aW9uIHRvIGEgZGlzcGxheSBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkU3RlcEZ1bmN0aW9uVG9TdHJpbmcgPSAodmFsdWU6IHVua25vd24pOiBzdHJpbmcgPT4ge1xuICBpZiAoIXZhbHVlKSByZXR1cm4gJ251bGwnO1xuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JykgcmV0dXJuICdudWxsJztcbiAgaWYgKCdzdGVwSWQnIGluIHZhbHVlKSB7XG4gICAgcmV0dXJuIGA8c3RlcDokeyh2YWx1ZSBhcyB7IHN0ZXBJZDogc3RyaW5nIH0pLnN0ZXBJZH0+YDtcbiAgfVxuICByZXR1cm4gJzxmdW5jdGlvbj4nO1xufTtcblxuLyoqIEV4dHJhY3QgdGhlIGNsYXNzIG5hbWUgZnJvbSBhIGNsYXNzSWQgKi9cbmV4cG9ydCBjb25zdCBleHRyYWN0Q2xhc3NOYW1lID0gKGNsYXNzSWQ6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGlmICghY2xhc3NJZCkgcmV0dXJuICdVbmtub3duJztcbiAgY29uc3QgcGFydHMgPSBjbGFzc0lkLnNwbGl0KCcvJyk7XG4gIHJldHVybiBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSB8fCBjbGFzc0lkO1xufTtcblxuLyoqIENvbnZlcnQgYSBzZXJpYWxpemVkIGNsYXNzIGluc3RhbmNlIHRvIGEgQ2xhc3NJbnN0YW5jZVJlZiBmb3IgZGlzcGxheS5cbiAqICBSdW4gaW5zdGFuY2VzIGFyZSBzcGVjaWFsLWNhc2VkIHRvIGEgUnVuUmVmIGZvciBjbGlja2FibGUgcmVuZGVyaW5nLiAqL1xuZXhwb3J0IGNvbnN0IHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmID0gKHZhbHVlOiB7XG4gIGNsYXNzSWQ6IHN0cmluZztcbiAgZGF0YTogdW5rbm93bjtcbn0pOiBDbGFzc0luc3RhbmNlUmVmIHwgUnVuUmVmID0+IHtcbiAgY29uc3QgY2xhc3NOYW1lID0gZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKTtcbiAgaWYgKFxuICAgIGNsYXNzTmFtZSA9PT0gJ1J1bicgJiZcbiAgICB2YWx1ZS5kYXRhICE9PSBudWxsICYmXG4gICAgdHlwZW9mIHZhbHVlLmRhdGEgPT09ICdvYmplY3QnICYmXG4gICAgJ3J1bklkJyBpbiB2YWx1ZS5kYXRhICYmXG4gICAgdHlwZW9mICh2YWx1ZS5kYXRhIGFzIHsgcnVuSWQ6IHVua25vd24gfSkucnVuSWQgPT09ICdzdHJpbmcnXG4gICkge1xuICAgIHJldHVybiBzZXJpYWxpemVkUnVuVG9SdW5SZWYodmFsdWUuZGF0YSBhcyB7IHJ1bklkOiBzdHJpbmcgfSk7XG4gIH1cbiAgcmV0dXJuIG5ldyBDbGFzc0luc3RhbmNlUmVmKGNsYXNzTmFtZSwgdmFsdWUuY2xhc3NJZCwgdmFsdWUuZGF0YSk7XG59O1xuXG4vKiogQ29udmVydCBhIHNlcmlhbGl6ZWQgY2xhc3MgcmVmZXJlbmNlIHRvIGEgZGlzcGxheSBzdHJpbmcgKi9cbmV4cG9ydCBjb25zdCBzZXJpYWxpemVkQ2xhc3NUb1N0cmluZyA9ICh2YWx1ZTogeyBjbGFzc0lkOiBzdHJpbmcgfSk6IHN0cmluZyA9PiB7XG4gIHJldHVybiBgPGNsYXNzOiR7ZXh0cmFjdENsYXNzTmFtZSh2YWx1ZS5jbGFzc0lkKX0+YDtcbn07XG5cbi8qKlxuICogU3RhbmRhcmQgbzExeSByZXZpdmVycyB0aGF0IG92ZXJyaWRlIHJ1bnRpbWUtc3BlY2lmaWMgdHlwZXMgd2l0aFxuICogZGlzcGxheS1mcmllbmRseSB2YWx1ZXMuIFVzZWQgYnkgYm90aCB3ZWIgYW5kIENMSSBoeWRyYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBvYnNlcnZhYmlsaXR5UmV2aXZlcnM6IFJldml2ZXJzID0ge1xuICBSZWFkYWJsZVN0cmVhbTogc3RyZWFtVG9TdHJlYW1SZWYsXG4gIFdyaXRhYmxlU3RyZWFtOiBzdHJlYW1Ub1N0cmVhbVJlZixcbiAgVHJhbnNmb3JtU3RyZWFtOiBzdHJlYW1Ub1N0cmVhbVJlZixcbiAgQWJvcnRDb250cm9sbGVyOiAodmFsdWU6IGFueSkgPT5cbiAgICBgPEFib3J0Q29udHJvbGxlcihhYm9ydGVkOiAke3ZhbHVlLmFib3J0ZWR9KT5gLFxuICBBYm9ydFNpZ25hbDogKHZhbHVlOiBhbnkpID0+IGA8QWJvcnRTaWduYWwoYWJvcnRlZDogJHt2YWx1ZS5hYm9ydGVkfSk+YCxcbiAgLy8gRE9NRXhjZXB0aW9uIG5lZWRzIGFuIGV4cGxpY2l0IHJldml2ZXI6IHdpdGhvdXQgb25lLCBkZXZhbHVlLnBhcnNlXG4gIC8vIHRocm93cyBvbiB0aGUgYFtcIkRPTUV4Y2VwdGlvblwiLCAuLi5dYCB0YWcgYW5kIGBoeWRyYXRlU3RlcElPYCdzXG4gIC8vIHRyeS9jYXRjaCBsZWF2ZXMgdGhlIHJhdyBmbGF0LWVuY29kZWQgc3RyaW5nIGluIHRoZSBVSS4gQWJvcnRDb250cm9sbGVyXG4gIC8vIHN5bnRoZXNpemVzIGEgRE9NRXhjZXB0aW9uIGFzIHRoZSBkZWZhdWx0IGBzaWduYWwucmVhc29uYCB3aGVuIGFib3J0KClcbiAgLy8gaXMgY2FsbGVkIHdpdGggbm8gYXJnIOKAlCBzbyBhbnkgYWJvcnQgdGhhdCByb3VuZC10cmlwcyB0aHJvdWdoIGEgc3RlcFxuICAvLyBib3VuZGFyeSBzdXJmYWNlcyBoZXJlLiBSZWNvbnN0cnVjdCBhcyBhIHJlYWwgRE9NRXhjZXB0aW9uIHdoZW4gdGhlXG4gIC8vIGdsb2JhbCBpcyBhdmFpbGFibGUgKG1vZGVybiBicm93c2VycyArIE5vZGUgMTgrKSwgZWxzZSBmYWxsIGJhY2sgdG9cbiAgLy8gYW4gRXJyb3IgcHJlc2VydmluZyBuYW1lL21lc3NhZ2Uvc3RhY2svY2F1c2UgZm9yIGRpc3BsYXkuXG4gIERPTUV4Y2VwdGlvbjogKHZhbHVlOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBzdGFjaz86IHN0cmluZztcbiAgICBjYXVzZT86IHVua25vd247XG4gIH0pID0+IHtcbiAgICBjb25zdCBHID0gZ2xvYmFsVGhpcyBhcyB7IERPTUV4Y2VwdGlvbj86IHR5cGVvZiBET01FeGNlcHRpb24gfTtcbiAgICBpZiAodHlwZW9mIEcuRE9NRXhjZXB0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBjb25zdCBlID0gbmV3IEcuRE9NRXhjZXB0aW9uKHZhbHVlLm1lc3NhZ2UsIHZhbHVlLm5hbWUpO1xuICAgICAgaWYgKHZhbHVlLnN0YWNrICE9PSB1bmRlZmluZWQpIGUuc3RhY2sgPSB2YWx1ZS5zdGFjaztcbiAgICAgIGlmICgnY2F1c2UnIGluIHZhbHVlKSAoZSBhcyB7IGNhdXNlPzogdW5rbm93biB9KS5jYXVzZSA9IHZhbHVlLmNhdXNlO1xuICAgICAgcmV0dXJuIGU7XG4gICAgfVxuICAgIGNvbnN0IGU6IEVycm9yICYgeyBjYXVzZT86IHVua25vd24gfSA9IG5ldyBFcnJvcih2YWx1ZS5tZXNzYWdlKTtcbiAgICBlLm5hbWUgPSB2YWx1ZS5uYW1lO1xuICAgIGlmICh2YWx1ZS5zdGFjayAhPT0gdW5kZWZpbmVkKSBlLnN0YWNrID0gdmFsdWUuc3RhY2s7XG4gICAgaWYgKCdjYXVzZScgaW4gdmFsdWUpIGUuY2F1c2UgPSB2YWx1ZS5jYXVzZTtcbiAgICByZXR1cm4gZTtcbiAgfSxcbiAgU3RlcEZ1bmN0aW9uOiBzZXJpYWxpemVkU3RlcEZ1bmN0aW9uVG9TdHJpbmcsXG4gIFdvcmtmbG93RnVuY3Rpb246ICh2YWx1ZTogeyB3b3JrZmxvd0lkOiBzdHJpbmcgfSkgPT5cbiAgICBgPHdvcmtmbG93OiR7dmFsdWUud29ya2Zsb3dJZH0+YCxcbiAgSW5zdGFuY2U6IHNlcmlhbGl6ZWRJbnN0YW5jZVRvUmVmLFxuICBDbGFzczogc2VyaWFsaXplZENsYXNzVG9TdHJpbmcsXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFJlc291cmNlLWxldmVsIGh5ZHJhdGlvbiBkaXNwYXRjaCAoZm9yIG8xMXkpXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBIeWRyYXRlIHRoZSBkYXRhIGZpZWxkcyBvZiBhIHN0ZXAgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVTdGVwSU88XG4gIFQgZXh0ZW5kcyB7IHN0ZXBJZD86IHN0cmluZzsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueTsgZXJyb3I/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG4gIGxldCBoeWRyYXRlZEVycm9yID0gcmVzb3VyY2UuZXJyb3I7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYGVycm9yYCBmaWVsZCBpcyBgU2VyaWFsaXplZERhdGFgIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAvLyBgZGVoeWRyYXRlU3RlcEVycm9yYC4gSHlkcmF0ZSBpdCBzbyBvYnNlcnZhYmlsaXR5IHRvb2xzIChDTEksIHdlYiBVSSlcbiAgLy8gY2FuIHJlYWQgYHN0ZXAuZXJyb3IubWVzc2FnZWAsIGBzdGVwLmVycm9yLnN0YWNrYCwgZXRjLlxuICBpZiAocmVzb3VyY2UuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZEVycm9yID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBpbnB1dDogaHlkcmF0ZWRJbnB1dCxcbiAgICBvdXRwdXQ6IGh5ZHJhdGVkT3V0cHV0LFxuICAgIGVycm9yOiBoeWRyYXRlZEVycm9yLFxuICB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGRhdGEgZmllbGRzIG9mIGEgd29ya2Zsb3cgcnVuIHJlc291cmNlLlxuICovXG5mdW5jdGlvbiBoeWRyYXRlV29ya2Zsb3dJTzxcbiAgVCBleHRlbmRzIHsgaW5wdXQ/OiBhbnk7IG91dHB1dD86IGFueTsgZXJyb3I/OiBhbnkgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBsZXQgaHlkcmF0ZWRJbnB1dCA9IHJlc291cmNlLmlucHV0O1xuICBsZXQgaHlkcmF0ZWRPdXRwdXQgPSByZXNvdXJjZS5vdXRwdXQ7XG4gIGxldCBoeWRyYXRlZEVycm9yID0gcmVzb3VyY2UuZXJyb3I7XG5cbiAgaWYgKHJlc291cmNlLmlucHV0ICE9IG51bGwpIHtcbiAgICB0cnkge1xuICAgICAgaHlkcmF0ZWRJbnB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLmlucHV0LCByZXZpdmVycyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICAgIH1cbiAgfVxuXG4gIGlmIChyZXNvdXJjZS5vdXRwdXQgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZE91dHB1dCA9IGh5ZHJhdGVEYXRhKHJlc291cmNlLm91dHB1dCwgcmV2aXZlcnMpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgLy8gTGVhdmUgdW4taHlkcmF0ZWRcbiAgICB9XG4gIH1cblxuICAvLyBUaGUgYGVycm9yYCBmaWVsZCBpcyBgU2VyaWFsaXplZERhdGFgIChVaW50OEFycmF5KSBwcm9kdWNlZCBieVxuICAvLyBgZGVoeWRyYXRlUnVuRXJyb3JgLiBIeWRyYXRlIGl0IHNvIG9ic2VydmFiaWxpdHkgdG9vbHMgKENMSSwgd2ViIFVJKVxuICAvLyBjYW4gcmVhZCBgcnVuLmVycm9yLm1lc3NhZ2VgLCBgcnVuLmVycm9yLnN0YWNrYCwgZXRjLlxuICBpZiAocmVzb3VyY2UuZXJyb3IgIT0gbnVsbCkge1xuICAgIHRyeSB7XG4gICAgICBoeWRyYXRlZEVycm9yID0gaHlkcmF0ZURhdGEocmVzb3VyY2UuZXJyb3IsIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5yZXNvdXJjZSxcbiAgICBpbnB1dDogaHlkcmF0ZWRJbnB1dCxcbiAgICBvdXRwdXQ6IGh5ZHJhdGVkT3V0cHV0LFxuICAgIGVycm9yOiBoeWRyYXRlZEVycm9yLFxuICB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIGV2ZW50RGF0YSBmaWVsZHMgb2YgYW4gZXZlbnQgcmVzb3VyY2UuXG4gKi9cbmZ1bmN0aW9uIGh5ZHJhdGVFdmVudERhdGE8XG4gIFQgZXh0ZW5kcyB7IGV2ZW50SWQ/OiBzdHJpbmc7IGV2ZW50VHlwZT86IHN0cmluZzsgZXZlbnREYXRhPzogYW55IH0sXG4+KHJlc291cmNlOiBULCByZXZpdmVyczogUmV2aXZlcnMpOiBUIHtcbiAgaWYgKCFyZXNvdXJjZS5ldmVudERhdGEpIHJldHVybiByZXNvdXJjZTtcblxuICBjb25zdCBldmVudERhdGEgPSB7IC4uLnJlc291cmNlLmV2ZW50RGF0YSB9O1xuXG4gIGZvciAoY29uc3QgZmllbGQgb2YgZ2V0RXZlbnREYXRhUmVmRmllbGRzKHJlc291cmNlLmV2ZW50VHlwZSA/PyAnJykpIHtcbiAgICBpZiAoZXZlbnREYXRhW2ZpZWxkXSA9PSBudWxsKSBjb250aW51ZTtcbiAgICB0cnkge1xuICAgICAgZXZlbnREYXRhW2ZpZWxkXSA9IGh5ZHJhdGVEYXRhKGV2ZW50RGF0YVtmaWVsZF0sIHJldml2ZXJzKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIExlYXZlIHVuLWh5ZHJhdGVkXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIGV2ZW50RGF0YSB9O1xufVxuXG4vKipcbiAqIEh5ZHJhdGUgdGhlIG1ldGFkYXRhIGZpZWxkIG9mIGEgaG9vayByZXNvdXJjZS5cbiAqL1xuZnVuY3Rpb24gaHlkcmF0ZUhvb2tNZXRhZGF0YTxUIGV4dGVuZHMgeyBob29rSWQ/OiBzdHJpbmc7IG1ldGFkYXRhPzogYW55IH0+KFxuICByZXNvdXJjZTogVCxcbiAgcmV2aXZlcnM6IFJldml2ZXJzXG4pOiBUIHtcbiAgaWYgKHJlc291cmNlLm1ldGFkYXRhID09IG51bGwpIHJldHVybiByZXNvdXJjZTtcblxuICBsZXQgaHlkcmF0ZWRNZXRhZGF0YSA9IHJlc291cmNlLm1ldGFkYXRhO1xuICB0cnkge1xuICAgIGh5ZHJhdGVkTWV0YWRhdGEgPSBoeWRyYXRlRGF0YShyZXNvdXJjZS5tZXRhZGF0YSwgcmV2aXZlcnMpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBMZWF2ZSB1bi1oeWRyYXRlZFxuICB9XG5cbiAgcmV0dXJuIHsgLi4ucmVzb3VyY2UsIG1ldGFkYXRhOiBoeWRyYXRlZE1ldGFkYXRhIH07XG59XG5cbi8qKlxuICogSHlkcmF0ZSB0aGUgc2VyaWFsaXplZCBkYXRhIGZpZWxkcyBvZiBhbnkgcmVzb3VyY2UgZm9yIG8xMXkgZGlzcGxheS5cbiAqXG4gKiBEaXNwYXRjaGVzIGJ5IHJlc291cmNlIHR5cGUgKHN0ZXAsIGhvb2ssIGV2ZW50LCB3b3JrZmxvdykgYW5kIGNhbGxzXG4gKiBgaHlkcmF0ZURhdGFgIHdpdGggdGhlIHByb3ZpZGVkIHJldml2ZXJzIGZvciBlYWNoIGRhdGEgZmllbGQuXG4gKlxuICogRWFjaCBlbnZpcm9ubWVudCAod2ViLCBDTEkpIHByb3ZpZGVzIGl0cyBvd24gcmV2aXZlcnMg4oCUIHRoaXMgZnVuY3Rpb25cbiAqIG9ubHkgaGFuZGxlcyB0aGUgZGlzcGF0Y2ggbG9naWMgYW5kIGZpZWxkIG1hcHBpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBoeWRyYXRlUmVzb3VyY2VJTzxcbiAgVCBleHRlbmRzIHtcbiAgICBzdGVwSWQ/OiBzdHJpbmc7XG4gICAgaG9va0lkPzogc3RyaW5nO1xuICAgIGV2ZW50SWQ/OiBzdHJpbmc7XG4gICAgZXZlbnRUeXBlPzogc3RyaW5nO1xuICAgIGlucHV0PzogYW55O1xuICAgIG91dHB1dD86IGFueTtcbiAgICBtZXRhZGF0YT86IGFueTtcbiAgICBldmVudERhdGE/OiBhbnk7XG4gICAgZXhlY3V0aW9uQ29udGV4dD86IGFueTtcbiAgfSxcbj4ocmVzb3VyY2U6IFQsIHJldml2ZXJzOiBSZXZpdmVycyk6IFQge1xuICBpZiAoIXJlc291cmNlKSByZXR1cm4gcmVzb3VyY2U7XG5cbiAgbGV0IGh5ZHJhdGVkOiBUO1xuICBpZiAoJ3N0ZXBJZCcgaW4gcmVzb3VyY2UpIHtcbiAgICBoeWRyYXRlZCA9IGh5ZHJhdGVTdGVwSU8ocmVzb3VyY2UsIHJldml2ZXJzKTtcbiAgfSBlbHNlIGlmICgnaG9va0lkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZUhvb2tNZXRhZGF0YShyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2UgaWYgKCdldmVudElkJyBpbiByZXNvdXJjZSkge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZUV2ZW50RGF0YShyZXNvdXJjZSwgcmV2aXZlcnMpO1xuICB9IGVsc2Uge1xuICAgIGh5ZHJhdGVkID0gaHlkcmF0ZVdvcmtmbG93SU8ocmVzb3VyY2UsIHJldml2ZXJzKTtcbiAgfVxuXG4gIC8vIFN0cmlwIGV4ZWN1dGlvbkNvbnRleHQsIHByZXNlcnZpbmcgb25seSB3b3JrZmxvd0NvcmVWZXJzaW9uIGZvciBkaXNwbGF5XG4gIGlmICgnZXhlY3V0aW9uQ29udGV4dCcgaW4gaHlkcmF0ZWQpIHtcbiAgICBjb25zdCB7IGV4ZWN1dGlvbkNvbnRleHQsIC4uLnJlc3QgfSA9IGh5ZHJhdGVkO1xuICAgIGNvbnN0IHdvcmtmbG93Q29yZVZlcnNpb24gPVxuICAgICAgZXhlY3V0aW9uQ29udGV4dCAmJlxuICAgICAgdHlwZW9mIGV4ZWN1dGlvbkNvbnRleHQgPT09ICdvYmplY3QnICYmXG4gICAgICAnd29ya2Zsb3dDb3JlVmVyc2lvbicgaW4gZXhlY3V0aW9uQ29udGV4dFxuICAgICAgICA/IGV4ZWN1dGlvbkNvbnRleHQud29ya2Zsb3dDb3JlVmVyc2lvblxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICBpZiAod29ya2Zsb3dDb3JlVmVyc2lvbikge1xuICAgICAgcmV0dXJuIHsgLi4ucmVzdCwgd29ya2Zsb3dDb3JlVmVyc2lvbiB9IGFzIHVua25vd24gYXMgVDtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3QgYXMgVDtcbiAgfVxuXG4gIHJldHVybiBoeWRyYXRlZDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBVdGlsaXR5IGZ1bmN0aW9uc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBFeHRyYWN0IGFsbCBzdHJlYW0gSURzIGZyb20gYSB2YWx1ZSAocmVjdXJzaXZlbHkgdHJhdmVyc2VzIG9iamVjdHMvYXJyYXlzKSAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RTdHJlYW1JZHMob2JqOiB1bmtub3duKTogc3RyaW5nW10ge1xuICBjb25zdCBzdHJlYW1JZHM6IHN0cmluZ1tdID0gW107XG4gIC8vIFRoZSBoeWRyYXRlZCBvMTF5IGRhdGEgdGhpcyB3YWxrcyBjb21lcyBmcm9tIGRldmFsdWUsIHdoaWNoIHN1cHBvcnRzXG4gIC8vIGNpcmN1bGFyIGFuZCByZXBlYXRlZCByZWZlcmVuY2VzLiBUcmFjayB2aXNpdGVkIGNvbnRhaW5lcnMgc28gYSBjeWNsZVxuICAvLyAoZS5nLiBhIHN0ZXAgcmVzdWx0IHdob3NlIG9iamVjdCByZWZlcnMgYmFjayB0byBpdHNlbGYpIGRvZXNuJ3QgcmVjdXJzZVxuICAvLyBmb3JldmVyIGFuZCBvdmVyZmxvdyB0aGUgc3RhY2suXG4gIGNvbnN0IHNlZW4gPSBuZXcgV2Vha1NldDxvYmplY3Q+KCk7XG5cbiAgZnVuY3Rpb24gdHJhdmVyc2UodmFsdWU6IHVua25vd24pOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJlYW1JZCh2YWx1ZSkpIHtcbiAgICAgIHN0cmVhbUlkcy5wdXNoKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgZm9yIChjb25zdCBpdGVtIG9mIHZhbHVlKSB7XG4gICAgICAgIHRyYXZlcnNlKGl0ZW0pO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKHNlZW4uaGFzKHZhbHVlKSkgcmV0dXJuO1xuICAgICAgc2Vlbi5hZGQodmFsdWUpO1xuICAgICAgZm9yIChjb25zdCB2YWwgb2YgT2JqZWN0LnZhbHVlcyh2YWx1ZSkpIHtcbiAgICAgICAgdHJhdmVyc2UodmFsKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0cmF2ZXJzZShvYmopO1xuICByZXR1cm4gQXJyYXkuZnJvbShuZXcgU2V0KHN0cmVhbUlkcykpO1xufVxuXG4vKiogVHJ1bmNhdGUgYSBzdHJpbmcgdG8gYSBtYXhpbXVtIGxlbmd0aCwgYWRkaW5nIGVsbGlwc2lzIGlmIG5lZWRlZCAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlSWQoaWQ6IHN0cmluZywgbWF4TGVuZ3RoID0gMTIpOiBzdHJpbmcge1xuICBpZiAoaWQubGVuZ3RoIDw9IG1heExlbmd0aCkgcmV0dXJuIGlkO1xuICByZXR1cm4gYCR7aWQuc2xpY2UoMCwgbWF4TGVuZ3RoKX0uLi5gO1xufVxuIl19
@@ -1,9 +1,8 @@
1
- import { type CryptoKey } from './encryption.js';
2
1
  import { compress, decompress } from './serialization/compression.js';
3
- import { decrypt, type EncryptionKeyParam, encrypt } from './serialization/encryption.js';
2
+ import { aesKeyOf, decrypt, deriveRunPayloadKeys, type EncryptionKeyParam, encrypt, isRunPayloadKeys, isSealTarget, type PayloadKey, type RunPayloadKeys, runPayloadKeys, type SealTarget, sealTo } from './serialization/encryption.js';
4
3
  import { decodeFormatPrefix, encodeWithFormatPrefix, isEncrypted, peekFormatPrefix } from './serialization/format.js';
5
4
  import { type FormatPrefix, isFormatPrefix, SerializationFormat } from './serialization/types.js';
6
- export { SerializationFormat, type FormatPrefix, isFormatPrefix, encodeWithFormatPrefix, decodeFormatPrefix, peekFormatPrefix, isEncrypted, encrypt, decrypt, compress, decompress, type EncryptionKeyParam, };
5
+ export { SerializationFormat, type FormatPrefix, isFormatPrefix, encodeWithFormatPrefix, decodeFormatPrefix, peekFormatPrefix, isEncrypted, encrypt, decrypt, compress, decompress, type EncryptionKeyParam, type PayloadKey, type RunPayloadKeys, type SealTarget, sealTo, runPayloadKeys, deriveRunPayloadKeys, isSealTarget, isRunPayloadKeys, aesKeyOf, };
7
6
  export type SerializationFormatType = (typeof SerializationFormat)[keyof typeof SerializationFormat];
8
7
  /**
9
8
  * Detect if a readable stream is a byte stream.
@@ -285,6 +284,7 @@ export declare function getCommonRevivers(global?: Record<string, any>): {
285
284
  name: string;
286
285
  runId?: string;
287
286
  deploymentId?: string;
287
+ encryptionPublicKey?: string;
288
288
  }) => any) | undefined;
289
289
  AbortController?: ((value: {
290
290
  streamName: string;
@@ -323,13 +323,13 @@ export declare function getWorkflowRevivers(global?: Record<string, any>): Parti
323
323
  *
324
324
  * @deprecated Use `encrypt` from `./serialization/encryption.js` instead.
325
325
  */
326
- export declare function maybeEncrypt(data: Uint8Array, key: CryptoKey | undefined): Promise<Uint8Array>;
326
+ export declare function maybeEncrypt(data: Uint8Array, key: PayloadKey | undefined): Promise<Uint8Array>;
327
327
  /**
328
328
  * Decrypt data if it has the 'encr' prefix.
329
329
  *
330
330
  * @deprecated Use `decrypt` from `./serialization/encryption.js` instead.
331
331
  */
332
- export declare function maybeDecrypt(data: Uint8Array | unknown, key: CryptoKey | undefined): Promise<Uint8Array | unknown>;
332
+ export declare function maybeDecrypt(data: Uint8Array | unknown, key: PayloadKey | undefined): Promise<Uint8Array | unknown>;
333
333
  /**
334
334
  * Replay hydration has two stages:
335
335
  *
@@ -350,7 +350,7 @@ export interface PreparedReplayPayload {
350
350
  * both direct and promised results lets a future synchronous Node decryptor use
351
351
  * the same cache contract as today's asynchronous Web Crypto implementation.
352
352
  */
353
- export type ReplayPayloadPreparer = (value: unknown, key: CryptoKey | undefined) => PreparedReplayPayload | Promise<PreparedReplayPayload>;
353
+ export type ReplayPayloadPreparer = (value: unknown, key: PayloadKey | undefined) => PreparedReplayPayload | Promise<PreparedReplayPayload>;
354
354
  /**
355
355
  * Decrypt and decompress persisted data without parsing it into JavaScript.
356
356
  * Legacy non-binary values pass through unchanged for their consumer to revive.
@@ -384,34 +384,34 @@ export declare function deserializePreparedStepError(prepared: PreparedReplayPay
384
384
  * backwards compatibility with older runs.
385
385
  * @returns The dehydrated value as binary data (Uint8Array) with format prefix
386
386
  */
387
- export declare function dehydrateWorkflowArguments(value: unknown, runId: string, key: CryptoKey | undefined, ops?: Promise<void>[], global?: Record<string, any>, v1Compat?: boolean, framedByteStreams?: boolean, compression?: boolean): Promise<Uint8Array | unknown>;
387
+ export declare function dehydrateWorkflowArguments(value: unknown, runId: string, key: PayloadKey | undefined, ops?: Promise<void>[], global?: Record<string, any>, v1Compat?: boolean, framedByteStreams?: boolean, compression?: boolean): Promise<Uint8Array | unknown>;
388
388
  /**
389
389
  * Called from workflow execution environment to hydrate the workflow
390
390
  * arguments from the database at the start of workflow execution. A prepared
391
391
  * payload skips host-side decrypt/decompress but always performs VM revival.
392
392
  */
393
- export declare function hydrateWorkflowArguments(value: Uint8Array | unknown, _runId: string, key: CryptoKey | undefined, global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>, prepared?: PreparedReplayPayload): Promise<any>;
393
+ export declare function hydrateWorkflowArguments(value: Uint8Array | unknown, _runId: string, key: PayloadKey | undefined, global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>, prepared?: PreparedReplayPayload): Promise<any>;
394
394
  /**
395
395
  * Dehydrate workflow return value for storage.
396
396
  */
397
- export declare function dehydrateWorkflowReturnValue(value: unknown, _runId: string, key: CryptoKey | undefined, global?: Record<string, any>, v1Compat?: boolean, compression?: boolean): Promise<Uint8Array | unknown>;
397
+ export declare function dehydrateWorkflowReturnValue(value: unknown, _runId: string, key: PayloadKey | undefined, global?: Record<string, any>, v1Compat?: boolean, compression?: boolean): Promise<Uint8Array | unknown>;
398
398
  /**
399
399
  * Called from the client side to hydrate the workflow return value
400
400
  * of a completed workflow run.
401
401
  */
402
- export declare function hydrateWorkflowReturnValue(value: Uint8Array | unknown, runId: string, key: CryptoKey | undefined, ops?: Promise<void>[], global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>): Promise<any>;
402
+ export declare function hydrateWorkflowReturnValue(value: Uint8Array | unknown, runId: string, key: PayloadKey | undefined, ops?: Promise<void>[], global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>): Promise<any>;
403
403
  /**
404
404
  * Called from the workflow handler when a step is being created.
405
405
  * Dehydrates values from within the workflow execution environment.
406
406
  */
407
- export declare function dehydrateStepArguments(value: unknown, _runId: string, key: CryptoKey | undefined, global?: Record<string, any>, v1Compat?: boolean, compression?: boolean): Promise<Uint8Array | unknown>;
407
+ export declare function dehydrateStepArguments(value: unknown, _runId: string, key: PayloadKey | undefined, global?: Record<string, any>, v1Compat?: boolean, compression?: boolean): Promise<Uint8Array | unknown>;
408
408
  /**
409
- * Called from the step handler to hydrate the arguments of a step
409
+ * Called from the step executor to hydrate the arguments of a step
410
410
  * from the database at the start of the step execution.
411
411
  */
412
- export declare function hydrateStepArguments(value: Uint8Array | unknown, runId: string, key: CryptoKey | undefined, ops?: Promise<any>[], global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>, deploymentId?: string): Promise<any>;
412
+ export declare function hydrateStepArguments(value: Uint8Array | unknown, runId: string, key: PayloadKey | undefined, ops?: Promise<any>[], global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>, deploymentId?: string): Promise<any>;
413
413
  /**
414
- * Called from the step handler when a step has completed.
414
+ * Called from the step executor when a step has completed.
415
415
  * Dehydrates values from within the step execution environment
416
416
  * into a format that can be saved to the database.
417
417
  *
@@ -427,9 +427,9 @@ export declare function hydrateStepArguments(value: Uint8Array | unknown, runId:
427
427
  * backwards compatibility with older runs.
428
428
  * @returns The dehydrated value as binary data (Uint8Array) with format prefix
429
429
  */
430
- export declare function dehydrateStepReturnValue(value: unknown, runId: string, key: CryptoKey | undefined, ops?: Promise<any>[], global?: Record<string, any>, v1Compat?: boolean, framedByteStreams?: boolean, compression?: boolean, runReadyBarrier?: Promise<unknown>): Promise<Uint8Array | unknown>;
430
+ export declare function dehydrateStepReturnValue(value: unknown, runId: string, key: PayloadKey | undefined, ops?: Promise<any>[], global?: Record<string, any>, v1Compat?: boolean, framedByteStreams?: boolean, compression?: boolean, runReadyBarrier?: Promise<unknown>): Promise<Uint8Array | unknown>;
431
431
  /**
432
- * Called from the step handler when a step throws. Dehydrates the thrown
432
+ * Called from the step executor when a step throws. Dehydrates the thrown
433
433
  * value from within the step execution environment into a format that can
434
434
  * be saved to the database in a `step_failed` or `step_retrying` event.
435
435
  *
@@ -444,7 +444,7 @@ export declare function dehydrateStepReturnValue(value: unknown, runId: string,
444
444
  * @param global - Global object for serialization context
445
445
  * @returns The dehydrated value as binary data (Uint8Array) with format prefix
446
446
  */
447
- export declare function dehydrateStepError(value: unknown, runId: string, key: CryptoKey | undefined, ops?: Promise<any>[], global?: Record<string, any>, compression?: boolean): Promise<Uint8Array>;
447
+ export declare function dehydrateStepError(value: unknown, runId: string, key: PayloadKey | undefined, ops?: Promise<any>[], global?: Record<string, any>, compression?: boolean): Promise<Uint8Array>;
448
448
  /**
449
449
  * Called from the workflow handler when replaying the event log of a
450
450
  * `step_failed` or `step_retrying` event. Hydrates the thrown value from
@@ -458,7 +458,7 @@ export declare function dehydrateStepError(value: unknown, runId: string, key: C
458
458
  * @param prepared - Optional cached decrypt/decompress result
459
459
  * @returns The hydrated thrown value, ready to reject the step promise
460
460
  */
461
- export declare function hydrateStepError(value: Uint8Array | unknown, _runId: string, key: CryptoKey | undefined, global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>, prepared?: PreparedReplayPayload): Promise<unknown>;
461
+ export declare function hydrateStepError(value: Uint8Array | unknown, _runId: string, key: PayloadKey | undefined, global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>, prepared?: PreparedReplayPayload): Promise<unknown>;
462
462
  /**
463
463
  * Called from the workflow handler when the workflow itself throws.
464
464
  * Dehydrates the thrown value from within the workflow execution environment
@@ -470,7 +470,7 @@ export declare function hydrateStepError(value: Uint8Array | unknown, _runId: st
470
470
  * @param global - Global object for serialization context
471
471
  * @returns The dehydrated value as binary data (Uint8Array) with format prefix
472
472
  */
473
- export declare function dehydrateRunError(value: unknown, _runId: string, key: CryptoKey | undefined, global?: Record<string, any>, compression?: boolean): Promise<Uint8Array>;
473
+ export declare function dehydrateRunError(value: unknown, _runId: string, key: PayloadKey | undefined, global?: Record<string, any>, compression?: boolean): Promise<Uint8Array>;
474
474
  /**
475
475
  * Called from the client side (or observability tools) to hydrate the run
476
476
  * error value of a failed workflow run.
@@ -483,7 +483,7 @@ export declare function dehydrateRunError(value: unknown, _runId: string, key: C
483
483
  * @param extraRevivers - Additional revivers for custom types
484
484
  * @returns The hydrated thrown value, ready to be consumed by the client
485
485
  */
486
- export declare function hydrateRunError(value: Uint8Array | unknown, runId: string, key: CryptoKey | undefined, ops?: Promise<void>[], global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>): Promise<unknown>;
486
+ export declare function hydrateRunError(value: Uint8Array | unknown, runId: string, key: PayloadKey | undefined, ops?: Promise<void>[], global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>): Promise<unknown>;
487
487
  /**
488
488
  * Called from the workflow handler when replaying the event log of a `step_completed` event.
489
489
  * Hydrates the return value of a step from the database.
@@ -497,5 +497,5 @@ export declare function hydrateRunError(value: Uint8Array | unknown, runId: stri
497
497
  * Called from the workflow handler when replaying the event log
498
498
  * of a `step_completed` event.
499
499
  */
500
- export declare function hydrateStepReturnValue(value: Uint8Array | unknown, _runId: string, key: CryptoKey | undefined, global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>, prepared?: PreparedReplayPayload): Promise<any>;
500
+ export declare function hydrateStepReturnValue(value: Uint8Array | unknown, _runId: string, key: PayloadKey | undefined, global?: Record<string, any>, extraRevivers?: Record<string, (value: any) => any>, prepared?: PreparedReplayPayload): Promise<any>;
501
501
  //# sourceMappingURL=serialization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"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"}