@cartanova/qgrid-cli 2.10.5 → 2.10.7

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 (96) hide show
  1. package/bundle/dist/application/monit/monit.frame.js +1 -1
  2. package/bundle/dist/application/qgrid/expired-token-reminder.js +1 -1
  3. package/bundle/dist/application/qgrid/oauth.js +1 -1
  4. package/bundle/dist/application/qgrid/qgrid-image-generation.js +7 -11
  5. package/bundle/dist/application/qgrid/qgrid-response-format.js +4 -4
  6. package/bundle/dist/application/qgrid/qgrid-run-lifecycle.js +26 -7
  7. package/bundle/dist/application/qgrid/qgrid.dispatcher.js +12 -7
  8. package/bundle/dist/application/qgrid/qgrid.frame.js +24 -10
  9. package/bundle/dist/application/qgrid/token-death.js +1 -1
  10. package/bundle/dist/application/qgrid/token-window-keepalive.js +1 -1
  11. package/bundle/dist/application/qgrid/tool-emulation.js +1 -1
  12. package/bundle/dist/application/request-log/request-log.model.js +5 -3
  13. package/bundle/dist/application/sonamu.generated.js +4 -1
  14. package/bundle/dist/application/sonamu.generated.sso.js +3 -1
  15. package/bundle/dist/i18n/sd.generated.js +4 -3
  16. package/bundle/dist/migrations/20261016155350_alter_request_logs_add1_alter1.js +15 -0
  17. package/bundle/dist/sonamu.config.js +2 -2
  18. package/bundle/dist/utils/providers/anthropic/anthropic-dispatcher.js +1 -1
  19. package/bundle/dist/utils/providers/anthropic/anthropic-thinking.js +1 -1
  20. package/bundle/dist/utils/providers/common/model-cost.js +14 -3
  21. package/bundle/dist/utils/providers/openai/openai-backend-protocol.js +13 -2
  22. package/bundle/dist/utils/providers/openai/openai-direct-client.js +5 -4
  23. package/bundle/dist/utils/providers/openai/openai-dispatcher.js +111 -57
  24. package/bundle/dist/utils/providers/openai/openai-image-generation.js +25 -17
  25. package/bundle/dist/utils/providers/openai/openai-refresh.js +1 -1
  26. package/bundle/src/application/qgrid/qgrid-image-generation.test.ts +19 -8
  27. package/bundle/src/application/qgrid/qgrid-image-generation.ts +17 -24
  28. package/bundle/src/application/qgrid/qgrid-response-format.test.ts +4 -2
  29. package/bundle/src/application/qgrid/qgrid-response-format.ts +7 -10
  30. package/bundle/src/application/qgrid/qgrid-run-lifecycle.test.ts +105 -9
  31. package/bundle/src/application/qgrid/qgrid-run-lifecycle.ts +47 -5
  32. package/bundle/src/application/qgrid/qgrid.dispatcher.test.ts +160 -2
  33. package/bundle/src/application/qgrid/qgrid.dispatcher.ts +40 -18
  34. package/bundle/src/application/qgrid/qgrid.frame.test.ts +74 -0
  35. package/bundle/src/application/qgrid/qgrid.frame.ts +39 -4
  36. package/bundle/src/application/request-log/request-log.entity.json +11 -2
  37. package/bundle/src/application/request-log/request-log.model.ts +4 -0
  38. package/bundle/src/application/sonamu.generated.http +2 -2
  39. package/bundle/src/application/sonamu.generated.sso.ts +2 -0
  40. package/bundle/src/application/sonamu.generated.ts +4 -0
  41. package/bundle/src/i18n/sd.generated.ts +3 -2
  42. package/bundle/src/migrations/20261016155350_alter_request_logs_add1_alter1.ts +15 -0
  43. package/bundle/src/utils/providers/common/model-cost.test.ts +28 -0
  44. package/bundle/src/utils/providers/common/model-cost.ts +19 -2
  45. package/bundle/src/utils/providers/openai/openai-backend-protocol.test.ts +23 -1
  46. package/bundle/src/utils/providers/openai/openai-backend-protocol.ts +24 -2
  47. package/bundle/src/utils/providers/openai/openai-direct-client.test.ts +15 -0
  48. package/bundle/src/utils/providers/openai/openai-direct-client.ts +14 -4
  49. package/bundle/src/utils/providers/openai/openai-dispatcher.test.ts +223 -32
  50. package/bundle/src/utils/providers/openai/openai-dispatcher.ts +174 -72
  51. package/bundle/src/utils/providers/openai/openai-image-generation.test.ts +89 -0
  52. package/bundle/src/utils/providers/openai/openai-image-generation.ts +26 -15
  53. package/bundle/web-dist/client/assets/cost-DH2jZbrw.js +1 -0
  54. package/bundle/web-dist/client/assets/index-Bw2s88Ot.css +1 -0
  55. package/bundle/web-dist/client/assets/{index-Dxw7DiXF.js → index-CwqqPF4F.js} +4 -4
  56. package/bundle/web-dist/client/assets/logs-CZgl1RSu.js +1 -0
  57. package/bundle/web-dist/client/assets/{monit-E8eGW1Sj.js → monit-TarvUWiE.js} +1 -1
  58. package/bundle/web-dist/client/assets/request-model-CojtinqK.js +1 -0
  59. package/bundle/web-dist/client/assets/{routes-7spLfIGZ.js → routes-BXR6OLah.js} +2 -2
  60. package/bundle/web-dist/client/assets/{services.generated-jnPHYMER.js → services.generated-BsieU37H.js} +1 -1
  61. package/bundle/web-dist/client/assets/{settings-BdosZFNC.js → settings-B1y5MNSU.js} +1 -1
  62. package/bundle/web-dist/client/assets/show-CG-BAdhS.js +2 -0
  63. package/bundle/web-dist/client/assets/{tokens-CBdHb2_U.js → tokens-D9tAWBEW.js} +1 -1
  64. package/bundle/web-dist/client/assets/{use-oauth-login-flow-Cyn3YPqW.js → use-oauth-login-flow-DxdOhz4a.js} +1 -1
  65. package/bundle/web-dist/client/assets/{use-update-token-mutation-DQCwCYfR.js → use-update-token-mutation-DAq0F8p-.js} +1 -1
  66. package/bundle/web-dist/client/index.html +3 -3
  67. package/bundle/web-dist/server/assets/{cost-59jBdx-I.js → cost-eEHeTRT5.js} +4 -5
  68. package/bundle/web-dist/server/assets/{lazyRouteComponent-CUR-kWzI.js → lazyRouteComponent-Dtd0NR4r.js} +2 -2
  69. package/bundle/web-dist/server/assets/{logs-CaaWO9-Z.js → logs-l91avYif.js} +33 -21
  70. package/bundle/web-dist/server/assets/{monit-CBil92fJ.js → monit-DvzribSE.js} +4 -4
  71. package/bundle/web-dist/server/assets/{plus-Bvdj8Pwx.js → plus-KZrECewT.js} +1 -1
  72. package/bundle/web-dist/server/assets/{react-dom-CyuShs9K.js → react-dom-B4a6-uuR.js} +1 -1
  73. package/bundle/web-dist/server/assets/{refresh-cw-3QAiSWBd.js → refresh-cw-BND93JrF.js} +1 -1
  74. package/bundle/web-dist/server/assets/{request-model-CnCeaNLE.js → request-model-CbqfnQOJ.js} +19 -1
  75. package/bundle/web-dist/server/assets/{routes-DtVf9yqo.js → routes-BAPWTizT.js} +6 -7
  76. package/bundle/web-dist/server/assets/{services.generated-FPwsG9p3.js → services.generated-CEbGjsI0.js} +3 -2
  77. package/bundle/web-dist/server/assets/{settings-DeHNwoMv.js → settings-BZR5HSAL.js} +3 -3
  78. package/bundle/web-dist/server/assets/{show-8NNdRxhM.js → show-CxVZTAdv.js} +17 -21
  79. package/bundle/web-dist/server/assets/{tokens-odgS2-9q.js → tokens-D1hb4eKk.js} +4 -4
  80. package/bundle/web-dist/server/assets/{use-oauth-login-flow-DTQKdYBO.js → use-oauth-login-flow-Cvdy0zF8.js} +1 -1
  81. package/bundle/web-dist/server/assets/{use-update-token-mutation-xvXbPrCI.js → use-update-token-mutation-CfYmk_4_.js} +1 -1
  82. package/bundle/web-dist/server/entry-server.generated.js +13 -10
  83. package/package.json +1 -1
  84. package/skills/qgrid/SKILL.md +9 -8
  85. package/skills/qgrid/references/ai-sdk-provider-contract.md +27 -17
  86. package/skills/qgrid/references/decision-rationale.md +8 -8
  87. package/skills/qgrid/references/openai-codex-runtime.md +19 -11
  88. package/skills/qgrid/references/prompt-cache-and-usage.md +3 -0
  89. package/skills/qgrid/references/request-log-run-lifecycle.md +14 -2
  90. package/skills/qgrid/references/sonamu-api-web-flow.md +2 -2
  91. package/skills/qgrid/references/verification-and-debugging.md +23 -9
  92. package/bundle/web-dist/client/assets/cost-CY2BJEPC.js +0 -1
  93. package/bundle/web-dist/client/assets/index-CvG4UB9v.css +0 -1
  94. package/bundle/web-dist/client/assets/logs-3n_U4qnI.js +0 -1
  95. package/bundle/web-dist/client/assets/request-model-D4CZPmnG.js +0 -1
  96. package/bundle/web-dist/client/assets/show-b2PFNI3D.js +0 -2
@@ -1,9 +1,10 @@
1
1
  import { resolveOpenAITransportKind } from "./openai-transport-config.js";
2
2
  import { QuotaThresholdExceededError } from "../../../application/qgrid/qgrid.types.js";
3
3
  import { TokenModel } from "../../../application/token/token.model.js";
4
- import { SmoothWeightedRoundRobin } from "../common/smooth-weighted-round-robin.js";
5
4
  import { resolveOpenAIEffort } from "../common/effort.js";
5
+ import { SmoothWeightedRoundRobin } from "../common/smooth-weighted-round-robin.js";
6
6
  import { ThinkingValidationError } from "../common/thinking.js";
7
+ import { imageMimeType } from "./openai-backend-protocol.js";
7
8
  import { OpenAIDirectClient } from "./openai-direct-client.js";
8
9
  import { readOpenAIQuotaUsage } from "./openai-quota.js";
9
10
  import { handleChatgptAuthTokensRefresh } from "./openai-refresh.js";
@@ -19,11 +20,12 @@ const THINKING_OFF_MODELS = /* @__PURE__ */ new Set([
19
20
  "gpt-5.5"
20
21
  ]);
21
22
  const DEFAULT_REQUEST_TIMEOUT_MS = 6e5;
22
- const TRANSPARENT_IMAGE_TOOL = "generate_transparent_image";
23
+ const IMAGE_TOOL = "generate_image";
23
24
  var ImageGenerationError = class extends Error {
24
25
  kind;
25
- constructor(kind, message) {
26
- super(message);
26
+ completedDriver;
27
+ constructor(kind, message, options) {
28
+ super(message, options);
27
29
  this.kind = kind;
28
30
  this.name = "ImageGenerationError";
29
31
  }
@@ -66,6 +68,16 @@ function inputItems(req) {
66
68
  content
67
69
  }];
68
70
  }
71
+ function imageReferences(req) {
72
+ return inputItems(req).flatMap((item) => {
73
+ if (item.type === "image_generation_call" && typeof item.result === "string") return [{
74
+ type: "input_image",
75
+ image_url: `data:${imageMimeType(item.result, item.output_format)};base64,${item.result}`
76
+ }];
77
+ if (!Array.isArray(item.content)) return [];
78
+ return item.content.filter((part) => part !== null && typeof part === "object" && (part.type === "input_image" || part.type === "image_url"));
79
+ });
80
+ }
69
81
  function asReasoning(req) {
70
82
  if (req.thinking === false) return { effort: "none" };
71
83
  const summary = req.reasoningSummary && req.reasoningSummary !== "none" ? req.reasoningSummary : void 0;
@@ -80,24 +92,38 @@ function requestOptions(req) {
80
92
  const { outputFormat, ...imageControls } = req.imageGenerationOptions ?? {};
81
93
  const auto = req.imageGeneration === "auto";
82
94
  if (auto && req.outputSchema) throw new ImageGenerationError("gate", "Automatic image generation does not support structured output or external tools");
95
+ if (auto && outputFormat && outputFormat !== "png") throw new ImageGenerationError("gate", "Automatic image generation only supports PNG output");
83
96
  return {
84
97
  model: req.model ?? "",
85
98
  ...req.systemPrompt ? { instructions: req.systemPrompt } : {},
86
99
  ...auto ? {
87
- instructions: [req.systemPrompt, "Use image_generation for ordinary image generation or editing. Use generate_transparent_image only when a transparent background is requested. Text replies are allowed when no image is needed. Use only one kind of image tool per response, and at most one generate_transparent_image call."].filter(Boolean).join("\n\n"),
100
+ instructions: [req.systemPrompt, "Use generate_image when image generation or editing is needed; otherwise reply with text. Call it at most once per response. Supply a complete, self-contained prompt with all relevant conversation instructions. Set transparent_background to true only when a transparent background is requested. Set num_last_images_to_include to 0 for a new image without references. For editing or reference-based generation, choose the smallest number of recent conversation images that includes all needed references, at most 5. References retain their chronological order. Do not select images for an unrelated new request."].filter(Boolean).join("\n\n"),
88
101
  parallelToolCalls: false,
89
102
  tools: [{
90
103
  type: "function",
91
- name: TRANSPARENT_IMAGE_TOOL,
92
- description: "Generate or edit an image with a transparent background using the conversation's reference images.",
93
- strict: true,
104
+ name: IMAGE_TOOL,
105
+ description: "Generate or edit an image, optionally with a transparent background or recent conversation images as references.",
106
+ strict: false,
94
107
  parameters: {
95
108
  type: "object",
96
- properties: { prompt: {
97
- type: "string",
98
- description: "Complete instructions for the transparent image generation or edit."
99
- } },
100
- required: ["prompt"],
109
+ properties: {
110
+ prompt: {
111
+ type: "string",
112
+ minLength: 1,
113
+ description: "Complete, self-contained instructions for the image generation or edit."
114
+ },
115
+ transparent_background: { type: "boolean" },
116
+ num_last_images_to_include: {
117
+ type: "integer",
118
+ minimum: 0,
119
+ maximum: 5
120
+ }
121
+ },
122
+ required: [
123
+ "prompt",
124
+ "transparent_background",
125
+ "num_last_images_to_include"
126
+ ],
101
127
  additionalProperties: false
102
128
  }
103
129
  }]
@@ -108,9 +134,8 @@ function requestOptions(req) {
108
134
  ...req.serviceTier ? { serviceTier: req.serviceTier === "fast" ? "priority" : req.serviceTier } : {},
109
135
  ...req.promptCacheKey ? { promptCacheKey: req.promptCacheKey } : {},
110
136
  ...req.outputSchema ? { outputSchema: { schema: req.outputSchema } } : {},
111
- ...req.imageGeneration ? { imageGeneration: req.imageGenerationOptions ? {
137
+ ...req.imageGeneration && !auto ? { imageGeneration: req.imageGenerationOptions ? {
112
138
  ...imageControls,
113
- ...auto ? { background: "auto" } : {},
114
139
  ...outputFormat ? { output_format: outputFormat } : {}
115
140
  } : true } : {}
116
141
  };
@@ -227,12 +252,26 @@ var OpenAIDispatcher = class OpenAIDispatcher {
227
252
  const images = [];
228
253
  let imageAttempted = false;
229
254
  const auto = req.imageGeneration === "auto";
230
- const transparentCalls = /* @__PURE__ */ new Map();
231
- const transparentCallIds = /* @__PURE__ */ new Set();
232
- let transparentAttempted = false;
255
+ const imageCalls = /* @__PURE__ */ new Map();
256
+ const imageCallIds = /* @__PURE__ */ new Set();
257
+ let imageToolAttempted = false;
233
258
  let driverCompleted = false;
234
259
  let servingModel = req.model ?? "";
235
260
  const metadata = selection.metadata;
261
+ const driverResult = () => ({
262
+ text,
263
+ tokenName: metadata.name,
264
+ usage,
265
+ durationMs: Date.now() - startedAt,
266
+ ttftMs: firstDeltaAt === void 0 ? null : firstDeltaAt - startedAt,
267
+ model: servingModel,
268
+ ...servingModel !== req.model ? { requestedModel: req.model } : {},
269
+ threadCoord: {
270
+ workerId: selection.tokenId,
271
+ threadId: req.promptCacheKey ?? "",
272
+ epoch: -1
273
+ }
274
+ });
236
275
  const clientEntry = this.acquireClient(selection);
237
276
  try {
238
277
  for await (const event of clientEntry.client.responses(requestOptions(req), req.abortSignal)) {
@@ -257,6 +296,7 @@ var OpenAIDispatcher = class OpenAIDispatcher {
257
296
  streamedMessageIds.add(event.item.id);
258
297
  }
259
298
  } else if (event.type === "image") {
299
+ if (auto) throw new ImageGenerationError("incomplete", "Unexpected hosted image generation");
260
300
  imageAttempted = true;
261
301
  images.push({
262
302
  data: event.base64,
@@ -264,61 +304,78 @@ var OpenAIDispatcher = class OpenAIDispatcher {
264
304
  revisedPrompt: event.revisedPrompt ?? null,
265
305
  ...event.generation ? { generation: event.generation } : {}
266
306
  });
267
- } else if (event.type === "output-item" && event.item.type === "image_generation_call") imageAttempted = true;
268
- else if (auto && event.type === "output-item" && event.item.type === "function_call") {
269
- if (event.item.name !== TRANSPARENT_IMAGE_TOOL) throw new ImageGenerationError("incomplete", "Unexpected automatic image tool call");
270
- transparentAttempted = true;
271
- transparentCallIds.add(event.item.call_id);
307
+ } else if (event.type === "output-item" && event.item.type === "image_generation_call") {
308
+ if (auto) throw new ImageGenerationError("incomplete", "Unexpected hosted image generation");
309
+ imageAttempted = true;
310
+ } else if (auto && event.type === "output-item" && event.item.type === "function_call") {
311
+ if (event.item.name !== IMAGE_TOOL) throw new ImageGenerationError("incomplete", "Unexpected automatic image tool call");
312
+ imageToolAttempted = true;
313
+ imageCallIds.add(event.item.call_id);
272
314
  if (!event.completed) continue;
273
315
  const id = event.item.call_id;
274
316
  let args;
275
317
  try {
276
318
  args = JSON.parse(String(event.item.arguments));
277
319
  } catch {
278
- throw new ImageGenerationError("incomplete", "Invalid transparent image arguments");
320
+ throw new ImageGenerationError("incomplete", "Invalid image tool arguments");
279
321
  }
280
- if (typeof id !== "string" || !id || !args || typeof args !== "object" || Array.isArray(args) || Object.keys(args).length !== 1 || !("prompt" in args) || typeof args.prompt !== "string" || !args.prompt.trim()) throw new ImageGenerationError("incomplete", "Invalid transparent image arguments");
281
- if (transparentCalls.has(id) && transparentCalls.get(id) !== args.prompt) throw new ImageGenerationError("incomplete", "Conflicting transparent image tool calls");
282
- transparentCalls.set(id, args.prompt);
283
- } else if (event.type === "completed" && event.usage) {
322
+ if (typeof id !== "string" || !id || !args || typeof args !== "object" || Array.isArray(args) || Object.keys(args).length !== 3 || !("prompt" in args) || typeof args.prompt !== "string" || !args.prompt.trim() || !("transparent_background" in args) || typeof args.transparent_background !== "boolean" || !("num_last_images_to_include" in args) || typeof args.num_last_images_to_include !== "number" || !Number.isInteger(args.num_last_images_to_include) || args.num_last_images_to_include < 0 || args.num_last_images_to_include > 5) throw new ImageGenerationError("incomplete", "Invalid image tool arguments");
323
+ const previous = imageCalls.get(id);
324
+ if (previous && (previous.prompt !== args.prompt || previous.transparent_background !== args.transparent_background || previous.num_last_images_to_include !== args.num_last_images_to_include)) throw new ImageGenerationError("incomplete", "Conflicting image tool calls");
325
+ imageCalls.set(id, {
326
+ prompt: args.prompt,
327
+ transparent_background: args.transparent_background,
328
+ num_last_images_to_include: args.num_last_images_to_include
329
+ });
330
+ } else if (event.type === "completed") {
331
+ const imageUsage = event.imageGeneration?.usage;
332
+ if (auto && imageUsage && (imageUsage.input_tokens > 0 || imageUsage.output_tokens > 0 || imageUsage.total_tokens > 0)) throw new ImageGenerationError("incomplete", "Unexpected hosted image generation");
284
333
  driverCompleted = true;
285
334
  servingModel = event.model ?? servingModel;
286
- usage = {
335
+ if (event.usage) usage = {
287
336
  totalTokens: event.usage.totalTokens,
288
337
  inputTokens: event.usage.inputTokens,
289
338
  outputTokens: event.usage.outputTokens,
290
339
  cachedInputTokens: event.usage.cachedInputTokens,
291
340
  reasoningOutputTokens: event.usage.reasoningTokens
292
341
  };
293
- } else if (event.type === "completed") {
294
- driverCompleted = true;
295
- servingModel = event.model ?? servingModel;
342
+ if (event.imageGeneration) {
343
+ const hostedImages = images.filter((image) => image.generation?.route === "codex-responses");
344
+ for (const [index, image] of hostedImages.entries()) image.generation = {
345
+ route: "codex-responses",
346
+ ...event.imageGeneration.model ? { model: event.imageGeneration.model } : {},
347
+ ...image.generation,
348
+ ...index === 0 && event.imageGeneration.usage ? { usage: event.imageGeneration.usage } : {}
349
+ };
350
+ }
296
351
  } else if (event.type === "error") {
297
352
  if (req.imageGeneration) throw new ImageGenerationError("incomplete", event.error.message);
298
353
  throw event.error;
299
354
  }
300
355
  }
301
- if (auto && transparentAttempted) {
302
- if (!driverCompleted || transparentCalls.size !== 1 || transparentCallIds.size !== 1 || imageAttempted) throw new ImageGenerationError("incomplete", "Expected one completed transparent image call without another image tool");
356
+ if (auto && imageToolAttempted) {
357
+ if (!driverCompleted || imageCalls.size !== 1 || imageCallIds.size !== 1) throw new ImageGenerationError("incomplete", "Expected one completed image tool call");
303
358
  if (req.abortSignal?.aborted) throw abortError(req.abortSignal);
304
- const prompt = [...transparentCalls.values()][0];
359
+ const args = [...imageCalls.values()][0];
360
+ const referenceCount = args.num_last_images_to_include;
361
+ const references = referenceCount ? imageReferences(req) : [];
362
+ if (referenceCount > references.length) throw new ImageGenerationError("incomplete", "Requested image references are unavailable");
305
363
  let imageCompleted = false;
306
364
  for await (const event of clientEntry.client.responses({
307
- model: req.model ?? "",
308
- ...req.systemPrompt ? { instructions: req.systemPrompt } : {},
309
- history: [...inputItems(req), {
365
+ model: "gpt-image-2",
366
+ history: [{
310
367
  type: "message",
311
368
  role: "user",
312
369
  content: [{
313
370
  type: "input_text",
314
- text: prompt
315
- }]
371
+ text: args.prompt
372
+ }, ...referenceCount ? references.slice(-referenceCount) : []]
316
373
  }],
317
374
  imageGeneration: {
318
375
  quality: req.imageGenerationOptions?.quality,
319
376
  size: req.imageGenerationOptions?.size,
320
377
  output_format: "png",
321
- background: "transparent"
378
+ background: args.transparent_background ? "transparent" : "opaque"
322
379
  }
323
380
  }, req.abortSignal)) if (event.type === "image") images.push({
324
381
  data: event.base64,
@@ -327,29 +384,26 @@ var OpenAIDispatcher = class OpenAIDispatcher {
327
384
  ...event.generation ? { generation: event.generation } : {}
328
385
  });
329
386
  else if (event.type === "completed") imageCompleted = true;
330
- else if (event.type === "error") throw new ImageGenerationError("incomplete", event.error.message);
387
+ else if (event.type === "error") throw new ImageGenerationError("incomplete", event.error.message, { cause: event.error });
331
388
  imageAttempted = true;
332
- if (!imageCompleted) throw new ImageGenerationError("incomplete", "Transparent image generation did not complete");
389
+ if (!imageCompleted) throw new ImageGenerationError("incomplete", "Image generation did not complete");
333
390
  }
334
391
  if (auto && imageAttempted && !driverCompleted) throw new ImageGenerationError("incomplete", "Image generation response did not complete");
335
392
  if (req.abortSignal?.aborted) throw abortError(req.abortSignal);
393
+ if ((req.imageGeneration === true || auto && imageAttempted) && images.length === 0) throw new ImageGenerationError(imageAttempted ? "incomplete" : "not_called", imageAttempted ? "image generation did not complete" : "model did not call image generation");
394
+ } catch (error) {
395
+ if (auto && driverCompleted && imageToolAttempted) {
396
+ const failure = error instanceof ImageGenerationError ? error : new ImageGenerationError("incomplete", error instanceof Error ? error.message : String(error), { cause: error });
397
+ if (error instanceof Error) failure.name = error.name;
398
+ failure.completedDriver = driverResult();
399
+ throw failure;
400
+ }
401
+ throw error;
336
402
  } finally {
337
403
  this.releaseClient(clientEntry);
338
404
  }
339
- if ((req.imageGeneration === true || auto && imageAttempted) && images.length === 0) throw new ImageGenerationError(imageAttempted ? "incomplete" : "not_called", imageAttempted ? "image generation did not complete" : "model did not call image generation");
340
405
  return {
341
- text,
342
- tokenName: metadata.name,
343
- usage,
344
- durationMs: Date.now() - startedAt,
345
- ttftMs: firstDeltaAt === void 0 ? null : firstDeltaAt - startedAt,
346
- model: servingModel,
347
- ...servingModel !== req.model ? { requestedModel: req.model } : {},
348
- threadCoord: {
349
- workerId: selection.tokenId,
350
- threadId: req.promptCacheKey ?? "",
351
- epoch: -1
352
- },
406
+ ...driverResult(),
353
407
  ...images.length ? { images } : {}
354
408
  };
355
409
  }
@@ -566,4 +620,4 @@ var OpenAIDispatcher = class OpenAIDispatcher {
566
620
  //#endregion
567
621
  export { ImageGenerationError, OpenAIDispatcher };
568
622
 
569
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyByZXNvbHZlT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIEdlbmVyYXRlZEltYWdlLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgVGhpbmtpbmdWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uL3RoaW5raW5nXCI7XG5pbXBvcnQge1xuICB0eXBlIEpzb25WYWx1ZSxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZUl0ZW0sXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbn0gZnJvbSBcIi4vb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2xcIjtcbmltcG9ydCB7IE9wZW5BSURpcmVjdENsaWVudCwgdHlwZSBPcGVuQUlEaXJlY3RDbGllbnRPcHRpb25zIH0gZnJvbSBcIi4vb3BlbmFpLWRpcmVjdC1jbGllbnRcIjtcbmltcG9ydCB7IHJlYWRPcGVuQUlRdW90YVVzYWdlLCB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSB9IGZyb20gXCIuL29wZW5haS1xdW90YVwiO1xuaW1wb3J0IHsgaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoIH0gZnJvbSBcIi4vb3BlbmFpLXJlZnJlc2hcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJVHJhbnNwb3J0S2luZCwgcmVzb2x2ZU9wZW5BSVRyYW5zcG9ydEtpbmQgfSBmcm9tIFwiLi9vcGVuYWktdHJhbnNwb3J0LWNvbmZpZ1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvcGVuYWktZGlzcGF0Y2hlclwiXSk7XG4vLyBWZXJpZmllZCB3aXRoIHRoZSBzdWJzY3JpcHRpb24gUmVzcG9uc2VzIGJhY2tlbmQ7IHB1YmxpYyBBUEkgc3VwcG9ydCBpcyBub3Qgc3VmZmljaWVudC5cbmNvbnN0IFRISU5LSU5HX09GRl9NT0RFTFMgPSBuZXcgU2V0KFtcbiAgXCJncHQtNi1zb2xcIixcbiAgXCJncHQtNi1sdW5hXCIsXG4gIFwiZ3B0LTUuNi1zb2xcIixcbiAgXCJncHQtNS42LXRlcnJhXCIsXG4gIFwiZ3B0LTUuNi1sdW5hXCIsXG4gIFwiZ3B0LTUuNVwiLFxuXSk7XG5jb25zdCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBUUkFOU1BBUkVOVF9JTUFHRV9UT09MID0gXCJnZW5lcmF0ZV90cmFuc3BhcmVudF9pbWFnZVwiO1xuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSBcIkltYWdlR2VuZXJhdGlvbkVycm9yXCI7XG4gIH1cbn1cblxudHlwZSBUb2tlbk1ldGFkYXRhID0ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICB3ZWlnaHQ6IG51bWJlcjtcbiAgYWN0aXZlOiBib29sZWFuO1xuICBnZW5lcmF0aW9uOiBudW1iZXI7XG59O1xuXG50eXBlIFRva2VuU2VsZWN0aW9uID0geyB0b2tlbklkOiBudW1iZXI7IG1ldGFkYXRhOiBUb2tlbk1ldGFkYXRhIH07XG5cbmV4cG9ydCB0eXBlIE9wZW5BSURpcmVjdENsaWVudEZhY3RvcnkgPSAoXG4gIG9wdGlvbnM6IE9wZW5BSURpcmVjdENsaWVudE9wdGlvbnMsXG4gIHRva2VuSWQ6IG51bWJlcixcbikgPT4gUGljazxPcGVuQUlEaXJlY3RDbGllbnQsIFwicmVzcG9uc2VzXCI+ICYgeyBjbG9zZT86ICgpID0+IHZvaWQgfTtcblxudHlwZSBDbGllbnRFbnRyeSA9IHtcbiAgZ2VuZXJhdGlvbjogbnVtYmVyO1xuICBjbGllbnQ6IFBpY2s8T3BlbkFJRGlyZWN0Q2xpZW50LCBcInJlc3BvbnNlc1wiPiAmIHsgY2xvc2U/OiAoKSA9PiB2b2lkIH07XG4gIGluRmxpZ2h0OiBudW1iZXI7XG4gIHJldGlyZWQ6IGJvb2xlYW47XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIE9wZW5BSURpc3BhdGNoZXJEZXBlbmRlbmNpZXMge1xuICBjbGllbnRGYWN0b3J5PzogT3BlbkFJRGlyZWN0Q2xpZW50RmFjdG9yeTtcbiAgZmV0Y2g/OiB0eXBlb2YgZmV0Y2g7XG59XG5cbmZ1bmN0aW9uIGFib3J0RXJyb3Ioc2lnbmFsOiBBYm9ydFNpZ25hbCk6IEVycm9yIHtcbiAgY29uc3QgcmVhc29uID0gc2lnbmFsLnJlYXNvbjtcbiAgcmV0dXJuIHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVhc29uIDogbmV3IERPTUV4Y2VwdGlvbihcIkFib3J0ZWRcIiwgXCJBYm9ydEVycm9yXCIpO1xufVxuXG5mdW5jdGlvbiBhY3RpdmVTaWduYWwoc2lnbmFsPzogQWJvcnRTaWduYWwsIHRpbWVvdXRNcz86IG51bWJlcik6IEFib3J0U2lnbmFsIHtcbiAgY29uc3QgdGltZW91dCA9IEFib3J0U2lnbmFsLnRpbWVvdXQodGltZW91dE1zID8/IERFRkFVTFRfUkVRVUVTVF9USU1FT1VUX01TKTtcbiAgcmV0dXJuIHNpZ25hbCA/IEFib3J0U2lnbmFsLmFueShbc2lnbmFsLCB0aW1lb3V0XSkgOiB0aW1lb3V0O1xufVxuXG5mdW5jdGlvbiBxdW90YU1lc3NhZ2UoZW50cmllczogQXJyYXk8eyBuYW1lOiBzdHJpbmc7IHRocmVzaG9sZDogbnVtYmVyIH0+KTogc3RyaW5nIHtcbiAgY29uc3QgZGV0YWlsID0gZW50cmllcy5tYXAoKGUpID0+IGAke2UubmFtZX0gKHRocmVzaG9sZCAke2UudGhyZXNob2xkfSUpYCkuam9pbihcIiwgXCIpO1xuICByZXR1cm4gZGV0YWlsXG4gICAgPyBgQWxsIG9wZW5haSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkOiAke2RldGFpbH1gXG4gICAgOiBcIkFsbCBvcGVuYWkgdG9rZW5zIGV4Y2VlZGVkIHF1b3RhIHRocmVzaG9sZFwiO1xufVxuXG5mdW5jdGlvbiBpbnB1dEl0ZW1zKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogT3BlbkFJUmVzcG9uc2VJdGVtW10ge1xuICBjb25zdCBoaXN0b3J5ID0gKHJlcS5jb2xkSGlzdG9yeSA/PyBbXSkgYXMgT3BlbkFJUmVzcG9uc2VJdGVtW107XG4gIGNvbnN0IGNvbnRlbnQ6IE9wZW5BSVJlc3BvbnNlSXRlbVtdID0gcmVxLmNvbGRJbnB1dC5tYXAoKGlucHV0KSA9PiB7XG4gICAgaWYgKGlucHV0LnR5cGUgPT09IFwidGV4dFwiKSByZXR1cm4geyB0eXBlOiBcImlucHV0X3RleHRcIiwgdGV4dDogaW5wdXQudGV4dCB9O1xuICAgIGlmIChpbnB1dC50eXBlID09PSBcImltYWdlXCIpIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfaW1hZ2VcIiwgaW1hZ2VfdXJsOiBpbnB1dC51cmwgfTtcbiAgICBpZiAoaW5wdXQudHlwZSA9PT0gXCJsb2NhbEltYWdlXCIpIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfaW1hZ2VcIiwgaW1hZ2VfdXJsOiBpbnB1dC5wYXRoIH07XG4gICAgcmV0dXJuIHsgdHlwZTogXCJpbnB1dF90ZXh0XCIsIHRleHQ6IGAke2lucHV0Lm5hbWV9OiAke2lucHV0LnBhdGh9YCB9O1xuICB9KTtcbiAgcmV0dXJuIFsuLi5oaXN0b3J5LCB7IHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcInVzZXJcIiwgY29udGVudCB9XTtcbn1cblxuZnVuY3Rpb24gYXNSZWFzb25pbmcocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlcS50aGlua2luZyA9PT0gZmFsc2UpIHJldHVybiB7IGVmZm9ydDogXCJub25lXCIgfTtcbiAgY29uc3Qgc3VtbWFyeSA9XG4gICAgcmVxLnJlYXNvbmluZ1N1bW1hcnkgJiYgcmVxLnJlYXNvbmluZ1N1bW1hcnkgIT09IFwibm9uZVwiID8gcmVxLnJlYXNvbmluZ1N1bW1hcnkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVmZm9ydCA9XG4gICAgcmVzb2x2ZU9wZW5BSUVmZm9ydChyZXEubW9kZWwgPz8gXCJcIiwgcmVxLmVmZm9ydCkgPz8gKHJlcS50aGlua2luZyA9PT0gdHJ1ZSA/IFwibG93XCIgOiB1bmRlZmluZWQpO1xuICBpZiAoIWVmZm9ydCAmJiAhc3VtbWFyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICAuLi4oZWZmb3J0ID8geyBlZmZvcnQgfSA6IHt9KSxcbiAgICAuLi4oc3VtbWFyeVxuICAgICAgPyB7XG4gICAgICAgICAgc3VtbWFyeTogc3VtbWFyeSBhcyBOb25OdWxsYWJsZTxPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdPltcInN1bW1hcnlcIl0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0T3B0aW9ucyhyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBjb25zdCB7IG91dHB1dEZvcm1hdCwgLi4uaW1hZ2VDb250cm9scyB9ID0gcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMgPz8ge307XG4gIGNvbnN0IGF1dG8gPSByZXEuaW1hZ2VHZW5lcmF0aW9uID09PSBcImF1dG9cIjtcbiAgaWYgKGF1dG8gJiYgcmVxLm91dHB1dFNjaGVtYSkge1xuICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgIFwiZ2F0ZVwiLFxuICAgICAgXCJBdXRvbWF0aWMgaW1hZ2UgZ2VuZXJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHN0cnVjdHVyZWQgb3V0cHV0IG9yIGV4dGVybmFsIHRvb2xzXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1vZGVsOiByZXEubW9kZWwgPz8gXCJcIixcbiAgICAuLi4ocmVxLnN5c3RlbVByb21wdCA/IHsgaW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0IH0gOiB7fSksXG4gICAgLi4uKGF1dG9cbiAgICAgID8ge1xuICAgICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgcmVxLnN5c3RlbVByb21wdCxcbiAgICAgICAgICAgIFwiVXNlIGltYWdlX2dlbmVyYXRpb24gZm9yIG9yZGluYXJ5IGltYWdlIGdlbmVyYXRpb24gb3IgZWRpdGluZy4gVXNlIGdlbmVyYXRlX3RyYW5zcGFyZW50X2ltYWdlIG9ubHkgd2hlbiBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgaXMgcmVxdWVzdGVkLiBUZXh0IHJlcGxpZXMgYXJlIGFsbG93ZWQgd2hlbiBubyBpbWFnZSBpcyBuZWVkZWQuIFVzZSBvbmx5IG9uZSBraW5kIG9mIGltYWdlIHRvb2wgcGVyIHJlc3BvbnNlLCBhbmQgYXQgbW9zdCBvbmUgZ2VuZXJhdGVfdHJhbnNwYXJlbnRfaW1hZ2UgY2FsbC5cIixcbiAgICAgICAgICBdXG4gICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pXG4gICAgICAgICAgICAuam9pbihcIlxcblxcblwiKSxcbiAgICAgICAgICBwYXJhbGxlbFRvb2xDYWxsczogZmFsc2UsXG4gICAgICAgICAgdG9vbHM6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdHlwZTogXCJmdW5jdGlvblwiLFxuICAgICAgICAgICAgICBuYW1lOiBUUkFOU1BBUkVOVF9JTUFHRV9UT09MLFxuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICBcIkdlbmVyYXRlIG9yIGVkaXQgYW4gaW1hZ2Ugd2l0aCBhIHRyYW5zcGFyZW50IGJhY2tncm91bmQgdXNpbmcgdGhlIGNvbnZlcnNhdGlvbidzIHJlZmVyZW5jZSBpbWFnZXMuXCIsXG4gICAgICAgICAgICAgIHN0cmljdDogdHJ1ZSxcbiAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgcHJvbXB0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgIFwiQ29tcGxldGUgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgdHJhbnNwYXJlbnQgaW1hZ2UgZ2VuZXJhdGlvbiBvciBlZGl0LlwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlcXVpcmVkOiBbXCJwcm9tcHRcIl0sXG4gICAgICAgICAgICAgICAgYWRkaXRpb25hbFByb3BlcnRpZXM6IGZhbHNlLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICBoaXN0b3J5OiBpbnB1dEl0ZW1zKHJlcSksXG4gICAgLi4uKGFzUmVhc29uaW5nKHJlcSkgPyB7IHJlYXNvbmluZzogYXNSZWFzb25pbmcocmVxKSB9IDoge30pLFxuICAgIC4uLihyZXEudmVyYm9zaXR5ID8geyB2ZXJib3NpdHk6IHJlcS52ZXJib3NpdHkgYXMgT3BlbkFJUmVzcG9uc2VzT3B0aW9uc1tcInZlcmJvc2l0eVwiXSB9IDoge30pLFxuICAgIC4uLihyZXEuc2VydmljZVRpZXJcbiAgICAgID8geyBzZXJ2aWNlVGllcjogcmVxLnNlcnZpY2VUaWVyID09PSBcImZhc3RcIiA/IFwicHJpb3JpdHlcIiA6IHJlcS5zZXJ2aWNlVGllciB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4ocmVxLnByb21wdENhY2hlS2V5ID8geyBwcm9tcHRDYWNoZUtleTogcmVxLnByb21wdENhY2hlS2V5IH0gOiB7fSksXG4gICAgLi4uKHJlcS5vdXRwdXRTY2hlbWEgPyB7IG91dHB1dFNjaGVtYTogeyBzY2hlbWE6IHJlcS5vdXRwdXRTY2hlbWEgYXMgSnNvblZhbHVlIH0gfSA6IHt9KSxcbiAgICAuLi4ocmVxLmltYWdlR2VuZXJhdGlvblxuICAgICAgPyB7XG4gICAgICAgICAgaW1hZ2VHZW5lcmF0aW9uOiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9uc1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4uaW1hZ2VDb250cm9scyxcbiAgICAgICAgICAgICAgICAuLi4oYXV0byA/IHsgYmFja2dyb3VuZDogXCJhdXRvXCIgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi4ob3V0cHV0Rm9ybWF0ID8geyBvdXRwdXRfZm9ybWF0OiBvdXRwdXRGb3JtYXQgfSA6IHt9KSxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB0cnVlLFxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgfTtcbn1cblxuLy8gcXVvdGHsmYAgY2FjaGUgYWZmaW5pdHnroZwg7Yag7YGw7J2EIOyEoO2Dne2VtCBIVFRQUy9XU+uhnCDsoITshqHtlZzri6QuIOuhnOy7rCDrj5nsi5zshLEg7KCc7ZWc7J2AIOyXhuuLpC5cbmV4cG9ydCBjbGFzcyBPcGVuQUlEaXNwYXRjaGVyIGltcGxlbWVudHMgUHJvdmlkZXJEaXNwYXRjaGVyIHtcbiAgcmVhZG9ubHkgdG9rZW5NZXRhZGF0YSA9IG5ldyBNYXA8bnVtYmVyLCBUb2tlbk1ldGFkYXRhPigpO1xuICByZWFkb25seSB0cmFuc3BvcnRLaW5kOiBPcGVuQUlUcmFuc3BvcnRLaW5kO1xuICByZWFkb25seSByYXRlTGltaXRzQ2FjaGUgPSBuZXcgTWFwPG51bWJlciwgT3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhICYgeyBnZW5lcmF0aW9uOiBudW1iZXIgfT4oKTtcbiAgcmVhZG9ubHkgcGVuZGluZ1JhdGVMaW1pdHMgPSBuZXcgTWFwPFxuICAgIG51bWJlcixcbiAgICB7IHRva2VuOiBUb2tlbk1ldGFkYXRhOyBnZW5lcmF0aW9uOiBudW1iZXI7IHByb21pc2U6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB9XG4gID4oKTtcbiAgcmVhZG9ubHkgY2xpZW50cyA9IG5ldyBNYXA8bnVtYmVyLCBDbGllbnRFbnRyeT4oKTtcbiAgcmVhZG9ubHkgcmV0aXJlZENsaWVudHMgPSBuZXcgU2V0PENsaWVudEVudHJ5PigpO1xuICBzdGF0aWMgcmVhZG9ubHkgUkFURV9MSU1JVFNfQ0FDSEVfVFRMID0gNjBfMDAwO1xuXG4gIHJlYWRvbmx5IHNlbGVjdG9yID0gbmV3IFNtb290aFdlaWdodGVkUm91bmRSb2JpbigpO1xuICByZWFkb25seSBjbGllbnRGYWN0b3J5OiBPcGVuQUlEaXJlY3RDbGllbnRGYWN0b3J5O1xuICByZWFkb25seSBmZXRjaEltcGw6IHR5cGVvZiBmZXRjaDtcbiAgcmVhZG9ubHkgcXVvdGFCbG9ja2VkID0gbmV3IFNldDxudW1iZXI+KCk7XG4gIGluRmxpZ2h0ID0gMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICB0cmFuc3BvcnRLaW5kOiBPcGVuQUlUcmFuc3BvcnRLaW5kID0gcmVzb2x2ZU9wZW5BSVRyYW5zcG9ydEtpbmQoKSxcbiAgICBkZXBlbmRlbmNpZXM6IE9wZW5BSURpc3BhdGNoZXJEZXBlbmRlbmNpZXMgPSB7fSxcbiAgKSB7XG4gICAgdGhpcy50cmFuc3BvcnRLaW5kID0gdHJhbnNwb3J0S2luZDtcbiAgICB0aGlzLmNsaWVudEZhY3RvcnkgPVxuICAgICAgZGVwZW5kZW5jaWVzLmNsaWVudEZhY3RvcnkgPz8gKChvcHRpb25zKSA9PiBuZXcgT3BlbkFJRGlyZWN0Q2xpZW50KG9wdGlvbnMpKTtcbiAgICB0aGlzLmZldGNoSW1wbCA9IGRlcGVuZGVuY2llcy5mZXRjaCA/PyBmZXRjaDtcbiAgfVxuXG4gIGFzeW5jIHN0YXJ0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgVG9rZW5Nb2RlbC5maW5kTWFueShcIkFcIik7XG4gICAgcm93c1xuICAgICAgLmZpbHRlcigocm93KSA9PiByb3cucHJvdmlkZXIgPT09IFwib3BlbmFpXCIpXG4gICAgICAuZm9yRWFjaCgocm93KSA9PiB7XG4gICAgICAgIHRoaXMuc2V0VG9rZW4oXG4gICAgICAgICAgcm93LmlkLFxuICAgICAgICAgIHJvdy5uYW1lLFxuICAgICAgICAgIHJvdy5jcmVkZW50aWFscyBhcyBPcGVuQUlDcmVkZW50aWFscyxcbiAgICAgICAgICByb3cucXVvdGFfdGhyZXNob2xkLFxuICAgICAgICAgIHJvdy53ZWlnaHQsXG4gICAgICAgICAgcm93LmFjdGl2ZSxcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIGxvZ2dlci5pbmZvKGBzdGFydGVkIGRpcmVjdCBPcGVuQUkgcnVudGltZSB3aXRoICR7dGhpcy50b2tlbk1ldGFkYXRhLnNpemV9IHRva2Vuc2ApO1xuICB9XG5cbiAgYXN5bmMgc3RvcCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmNsaWVudHMuZm9yRWFjaCgoeyBjbGllbnQgfSkgPT4gY2xpZW50LmNsb3NlPy4oKSk7XG4gICAgdGhpcy5jbGllbnRzLmNsZWFyKCk7XG4gICAgdGhpcy5yZXRpcmVkQ2xpZW50cy5mb3JFYWNoKChlbnRyeSkgPT4gZW50cnkuY2xpZW50LmNsb3NlPy4oKSk7XG4gICAgdGhpcy5yZXRpcmVkQ2xpZW50cy5jbGVhcigpO1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5jbGVhcigpO1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWQuY2xlYXIoKTtcbiAgICB0aGlzLnNlbGVjdG9yLnJlc2V0U2NvcmVzKCk7XG4gIH1cblxuICBhc3luYyBvblRva2VuQWRkZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnNldFRva2VuKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCwgdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBvblRva2VuVXBkYXRlZChcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsLFxuICAgIHdlaWdodCA9IDEsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG9sZCA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpO1xuICAgIHRoaXMuc2V0VG9rZW4oaWQsIG5hbWUsIGNyZWRlbnRpYWxzLCBxdW90YVRocmVzaG9sZCwgd2VpZ2h0LCBvbGQ/LmFjdGl2ZSA/PyB0cnVlKTtcbiAgfVxuXG4gIGFzeW5jIG9uVG9rZW5SZW1vdmVkKGlkOiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnJldGlyZUNsaWVudChpZCk7XG4gICAgdGhpcy50b2tlbk1ldGFkYXRhLmRlbGV0ZShpZCk7XG4gICAgdGhpcy5zZWxlY3Rvci5yZW1vdmVUb2tlbihpZCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZC5kZWxldGUoaWQpO1xuICB9XG5cbiAgb25Ub2tlbkRlYWN0aXZhdGVkKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpO1xuICAgIGlmICh0b2tlbikgdG9rZW4uYWN0aXZlID0gZmFsc2U7XG4gICAgdGhpcy5zZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgb25Ub2tlbkFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAodG9rZW4pIHRva2VuLmFjdGl2ZSA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgYXN5bmMgcmVwbGFjZVRva2VucyhcbiAgICByb3dzOiBBcnJheTx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzO1xuICAgICAgcXVvdGFUaHJlc2hvbGQ/OiBudW1iZXIgfCBudWxsO1xuICAgICAgd2VpZ2h0OiBudW1iZXI7XG4gICAgfT4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlkcyA9IG5ldyBTZXQocm93cy5tYXAoKHIpID0+IHIuaWQpKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIHRoaXMudG9rZW5NZXRhZGF0YS5rZXlzKCkpIGlmICghaWRzLmhhcyhpZCkpIGF3YWl0IHRoaXMub25Ub2tlblJlbW92ZWQoaWQpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpXG4gICAgICBhd2FpdCB0aGlzLm9uVG9rZW5VcGRhdGVkKHJvdy5pZCwgcm93Lm5hbWUsIHJvdy5jcmVkZW50aWFscywgcm93LnF1b3RhVGhyZXNob2xkLCByb3cud2VpZ2h0KTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlKHJlcTogR2VuZXJhdGVSZXF1ZXN0KTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLnJ1bihyZXEpO1xuICB9XG5cbiAgYXN5bmMgZ2VuZXJhdGVTdHJlYW0ocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIGNiOiBHZW5lcmF0ZVN0cmVhbUNhbGxiYWNrcyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKVxuICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICBcImdhdGVcIixcbiAgICAgICAgXCJpbWFnZSBnZW5lcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHN0cmVhbWluZyBwYXRoXCIsXG4gICAgICApO1xuICAgIHRyeSB7XG4gICAgICBjYi5vbkNvbXBsZXRlKGF3YWl0IHRoaXMucnVuKHJlcSwgY2Iub25EZWx0YSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjYi5vbkVycm9yKGVycm9yIGFzIEVycm9yKTtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bihyZXE6IEdlbmVyYXRlUmVxdWVzdCwgb25EZWx0YT86ICh0ZXh0OiBzdHJpbmcpID0+IHZvaWQpOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgaWYgKHJlcS50aGlua2luZyA9PT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IG1vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgICBpZiAoIVRISU5LSU5HX09GRl9NT0RFTFMuaGFzKG1vZGVsKSkge1xuICAgICAgICBjb25zdCByZWFzb24gPVxuICAgICAgICAgIG1vZGVsID09PSBcImdwdC02LWFzdHJhXCIgfHwgbW9kZWwgPT09IFwiZ3B0LTYuMS1zb2xcIlxuICAgICAgICAgICAgPyBcInRoZSBzdWJzY3JpcHRpb24gYmFja2VuZCByZXF1aXJlcyB0aGlua2luZ1wiXG4gICAgICAgICAgICA6IFwidGhpbmtpbmctb2ZmIHN1cHBvcnQgaGFzIG5vdCBiZWVuIHZlcmlmaWVkIG9uIHRoZSBzdWJzY3JpcHRpb24gYmFja2VuZFwiO1xuICAgICAgICB0aHJvdyBuZXcgVGhpbmtpbmdWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgYHRoaW5raW5nOmZhbHNlIGlzIHVuYXZhaWxhYmxlIGZvciBPcGVuQUkgbW9kZWwgJHttb2RlbCB8fCBcIjxkZWZhdWx0PlwifTogJHtyZWFzb259YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3Qgc2lnbmFsID0gYWN0aXZlU2lnbmFsKHJlcS5hYm9ydFNpZ25hbCwgcmVxLnRpbWVvdXRNcyk7XG4gICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHNpZ25hbCk7XG4gICAgY29uc3Qgc2VsZWN0aW9uID0gYXdhaXQgdGhpcy5zZWxlY3RUb2tlbihcbiAgICAgIHJlcS5wcmVmZXJyZWRUb2tlbklkLFxuICAgICAgcmVxLnJlcXVpcmVQcmVmZXJyZWRUb2tlbiA/PyBmYWxzZSxcbiAgICAgIHNpZ25hbCxcbiAgICApO1xuICAgIHRoaXMuaW5GbGlnaHQrKztcbiAgICB0cnkge1xuICAgICAgaWYgKHNpZ25hbC5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHNpZ25hbCk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5ydW5EaXJlY3Qoc2VsZWN0aW9uLCB7IC4uLnJlcSwgYWJvcnRTaWduYWw6IHNpZ25hbCB9LCBvbkRlbHRhKTtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5pbkZsaWdodC0tO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHJ1bkRpcmVjdChcbiAgICBzZWxlY3Rpb246IFRva2VuU2VsZWN0aW9uLFxuICAgIHJlcTogR2VuZXJhdGVSZXF1ZXN0LFxuICAgIG9uRGVsdGE/OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkLFxuICApOiBQcm9taXNlPEdlbmVyYXRlUmVzdWx0PiB7XG4gICAgY29uc3Qgc3RhcnRlZEF0ID0gRGF0ZS5ub3coKTtcbiAgICBsZXQgZmlyc3REZWx0YUF0OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHRleHQgPSBcIlwiO1xuICAgIGxldCBvdXRwdXRNZXNzYWdlQWNjZXB0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBtZXNzYWdlUGhhc2VzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICBjb25zdCBzdHJlYW1lZE1lc3NhZ2VJZHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBsZXQgdXNhZ2UgPSB7XG4gICAgICB0b3RhbFRva2VuczogMCxcbiAgICAgIGlucHV0VG9rZW5zOiAwLFxuICAgICAgb3V0cHV0VG9rZW5zOiAwLFxuICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IDAsXG4gICAgICByZWFzb25pbmdPdXRwdXRUb2tlbnM6IDAsXG4gICAgfTtcbiAgICBjb25zdCBpbWFnZXM6IEdlbmVyYXRlZEltYWdlW10gPSBbXTtcbiAgICBsZXQgaW1hZ2VBdHRlbXB0ZWQgPSBmYWxzZTtcbiAgICBjb25zdCBhdXRvID0gcmVxLmltYWdlR2VuZXJhdGlvbiA9PT0gXCJhdXRvXCI7XG4gICAgY29uc3QgdHJhbnNwYXJlbnRDYWxscyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3QgdHJhbnNwYXJlbnRDYWxsSWRzID0gbmV3IFNldDx1bmtub3duPigpO1xuICAgIGxldCB0cmFuc3BhcmVudEF0dGVtcHRlZCA9IGZhbHNlO1xuICAgIGxldCBkcml2ZXJDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICBsZXQgc2VydmluZ01vZGVsID0gcmVxLm1vZGVsID8/IFwiXCI7XG4gICAgY29uc3QgbWV0YWRhdGEgPSBzZWxlY3Rpb24ubWV0YWRhdGE7XG4gICAgY29uc3QgY2xpZW50RW50cnkgPSB0aGlzLmFjcXVpcmVDbGllbnQoc2VsZWN0aW9uKTtcbiAgICB0cnkge1xuICAgICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBjbGllbnRFbnRyeS5jbGllbnQucmVzcG9uc2VzKFxuICAgICAgICByZXF1ZXN0T3B0aW9ucyhyZXEpLFxuICAgICAgICByZXEuYWJvcnRTaWduYWwsXG4gICAgICApKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICByZXEuc3RvcEFmdGVyT3V0cHV0TWVzc2FnZSAmJlxuICAgICAgICAgIGV2ZW50LnR5cGUgPT09IFwib3V0cHV0LWl0ZW1cIiAmJlxuICAgICAgICAgIGV2ZW50Lml0ZW0udHlwZSA9PT0gXCJtZXNzYWdlXCIgJiZcbiAgICAgICAgICB0eXBlb2YgZXZlbnQuaXRlbS5pZCA9PT0gXCJzdHJpbmdcIiAmJlxuICAgICAgICAgIHR5cGVvZiBldmVudC5pdGVtLnBoYXNlID09PSBcInN0cmluZ1wiXG4gICAgICAgICkge1xuICAgICAgICAgIG1lc3NhZ2VQaGFzZXMuc2V0KGV2ZW50Lml0ZW0uaWQsIGV2ZW50Lml0ZW0ucGhhc2UpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChldmVudC50eXBlID09PSBcInRleHQtZGVsdGFcIikge1xuICAgICAgICAgIGlmIChvdXRwdXRNZXNzYWdlQWNjZXB0ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgIGlmIChyZXEuc3RvcEFmdGVyT3V0cHV0TWVzc2FnZSAmJiBldmVudC5pdGVtSWQpIHtcbiAgICAgICAgICAgIC8vIEJ1ZmZlciBjb21tZW50YXJ5L3VuY2xhc3NpZmllZCBtZXNzYWdlcyB1bnRpbCB0aGVpciBjb21wbGV0ZWQgaXRlbS5cbiAgICAgICAgICAgIC8vIEtub3duIGZpbmFsIGFuc3dlcnMgcmV0YWluIGluY3JlbWVudGFsIHN0cmVhbWluZy5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlUGhhc2VzLmdldChldmVudC5pdGVtSWQpICE9PSBcImZpbmFsX2Fuc3dlclwiKSBjb250aW51ZTtcbiAgICAgICAgICAgIHN0cmVhbWVkTWVzc2FnZUlkcy5hZGQoZXZlbnQuaXRlbUlkKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmlyc3REZWx0YUF0ID8/PSBEYXRlLm5vdygpO1xuICAgICAgICAgIHRleHQgKz0gZXZlbnQudGV4dDtcbiAgICAgICAgICBvbkRlbHRhPy4oZXZlbnQudGV4dCk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgZXZlbnQudHlwZSA9PT0gXCJvdXRwdXQtaXRlbVwiICYmXG4gICAgICAgICAgZXZlbnQuY29tcGxldGVkICYmXG4gICAgICAgICAgZXZlbnQuaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJlxuICAgICAgICAgICFvdXRwdXRNZXNzYWdlQWNjZXB0ZWQgJiZcbiAgICAgICAgICByZXEuc3RvcEFmdGVyT3V0cHV0TWVzc2FnZSAmJlxuICAgICAgICAgIEFycmF5LmlzQXJyYXkoZXZlbnQuaXRlbS5jb250ZW50KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBtZXNzYWdlVGV4dCA9IGV2ZW50Lml0ZW0uY29udGVudFxuICAgICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydD8udHlwZSA9PT0gXCJvdXRwdXRfdGV4dFwiICYmIHR5cGVvZiBwYXJ0LnRleHQgPT09IFwic3RyaW5nXCIpXG4gICAgICAgICAgICAubWFwKChwYXJ0KSA9PiBwYXJ0LnRleHQpXG4gICAgICAgICAgICAuam9pbihcIlwiKTtcbiAgICAgICAgICAvLyBBIHZhbGlkIGNsaWVudCB0b29sIHJlcXVlc3QgZW5kcyB0aGlzIGFwcGxpY2F0aW9uIHR1cm4uIExhdGVyIGFuc3dlcnMgY2Fubm90XG4gICAgICAgICAgLy8ga25vdyBpdHMgcmVzdWx0IHlldC4gTmV2ZXIgc3BsaXQvcmVwYWlyIG1hbGZvcm1lZCBKU09OIHdpdGhpbiBhIG1lc3NhZ2UuXG4gICAgICAgICAgY29uc3QgcGhhc2UgPSB0eXBlb2YgZXZlbnQuaXRlbS5waGFzZSA9PT0gXCJzdHJpbmdcIiA/IGV2ZW50Lml0ZW0ucGhhc2UgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgaWYgKG1lc3NhZ2VUZXh0KSBvdXRwdXRNZXNzYWdlQWNjZXB0ZWQgPSByZXEuc3RvcEFmdGVyT3V0cHV0TWVzc2FnZShtZXNzYWdlVGV4dCwgcGhhc2UpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIHR5cGVvZiBldmVudC5pdGVtLmlkID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgICAhc3RyZWFtZWRNZXNzYWdlSWRzLmhhcyhldmVudC5pdGVtLmlkKSAmJlxuICAgICAgICAgICAgKHBoYXNlICE9PSBcImNvbW1lbnRhcnlcIiB8fCBvdXRwdXRNZXNzYWdlQWNjZXB0ZWQpICYmXG4gICAgICAgICAgICBtZXNzYWdlVGV4dFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZmlyc3REZWx0YUF0ID8/PSBEYXRlLm5vdygpO1xuICAgICAgICAgICAgdGV4dCArPSBtZXNzYWdlVGV4dDtcbiAgICAgICAgICAgIG9uRGVsdGE/LihtZXNzYWdlVGV4dCk7XG4gICAgICAgICAgICBzdHJlYW1lZE1lc3NhZ2VJZHMuYWRkKGV2ZW50Lml0ZW0uaWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBcImltYWdlXCIpIHtcbiAgICAgICAgICBpbWFnZUF0dGVtcHRlZCA9IHRydWU7XG4gICAgICAgICAgaW1hZ2VzLnB1c2goe1xuICAgICAgICAgICAgZGF0YTogZXZlbnQuYmFzZTY0LFxuICAgICAgICAgICAgbWVkaWFUeXBlOiBldmVudC5taW1lVHlwZSxcbiAgICAgICAgICAgIHJldmlzZWRQcm9tcHQ6IGV2ZW50LnJldmlzZWRQcm9tcHQgPz8gbnVsbCxcbiAgICAgICAgICAgIC4uLihldmVudC5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBldmVudC5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJvdXRwdXQtaXRlbVwiICYmIGV2ZW50Lml0ZW0udHlwZSA9PT0gXCJpbWFnZV9nZW5lcmF0aW9uX2NhbGxcIikge1xuICAgICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhdXRvICYmIGV2ZW50LnR5cGUgPT09IFwib3V0cHV0LWl0ZW1cIiAmJiBldmVudC5pdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lml0ZW0ubmFtZSAhPT0gVFJBTlNQQVJFTlRfSU1BR0VfVE9PTCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcIlVuZXhwZWN0ZWQgYXV0b21hdGljIGltYWdlIHRvb2wgY2FsbFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJhbnNwYXJlbnRBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIHRyYW5zcGFyZW50Q2FsbElkcy5hZGQoZXZlbnQuaXRlbS5jYWxsX2lkKTtcbiAgICAgICAgICBpZiAoIWV2ZW50LmNvbXBsZXRlZCkgY29udGludWU7XG4gICAgICAgICAgY29uc3QgaWQgPSBldmVudC5pdGVtLmNhbGxfaWQ7XG4gICAgICAgICAgbGV0IGFyZ3M6IHVua25vd247XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFyZ3MgPSBKU09OLnBhcnNlKFN0cmluZyhldmVudC5pdGVtLmFyZ3VtZW50cykpO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcIkludmFsaWQgdHJhbnNwYXJlbnQgaW1hZ2UgYXJndW1lbnRzXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgICFpZCB8fFxuICAgICAgICAgICAgIWFyZ3MgfHxcbiAgICAgICAgICAgIHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3MpIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGggIT09IDEgfHxcbiAgICAgICAgICAgICEoXCJwcm9tcHRcIiBpbiBhcmdzKSB8fFxuICAgICAgICAgICAgdHlwZW9mIGFyZ3MucHJvbXB0ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICAhYXJncy5wcm9tcHQudHJpbSgpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIFwiSW52YWxpZCB0cmFuc3BhcmVudCBpbWFnZSBhcmd1bWVudHNcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0cmFuc3BhcmVudENhbGxzLmhhcyhpZCkgJiYgdHJhbnNwYXJlbnRDYWxscy5nZXQoaWQpICE9PSBhcmdzLnByb21wdCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgICBcImluY29tcGxldGVcIixcbiAgICAgICAgICAgICAgXCJDb25mbGljdGluZyB0cmFuc3BhcmVudCBpbWFnZSB0b29sIGNhbGxzXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0cmFuc3BhcmVudENhbGxzLnNldChpZCwgYXJncy5wcm9tcHQpO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiY29tcGxldGVkXCIgJiYgZXZlbnQudXNhZ2UpIHtcbiAgICAgICAgICBkcml2ZXJDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNlcnZpbmdNb2RlbCA9IGV2ZW50Lm1vZGVsID8/IHNlcnZpbmdNb2RlbDtcbiAgICAgICAgICB1c2FnZSA9IHtcbiAgICAgICAgICAgIHRvdGFsVG9rZW5zOiBldmVudC51c2FnZS50b3RhbFRva2VucyxcbiAgICAgICAgICAgIGlucHV0VG9rZW5zOiBldmVudC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgIG91dHB1dFRva2VuczogZXZlbnQudXNhZ2Uub3V0cHV0VG9rZW5zLFxuICAgICAgICAgICAgY2FjaGVkSW5wdXRUb2tlbnM6IGV2ZW50LnVzYWdlLmNhY2hlZElucHV0VG9rZW5zLFxuICAgICAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiBldmVudC51c2FnZS5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIGlmIChldmVudC50eXBlID09PSBcImNvbXBsZXRlZFwiKSB7XG4gICAgICAgICAgZHJpdmVyQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICBzZXJ2aW5nTW9kZWwgPSBldmVudC5tb2RlbCA/PyBzZXJ2aW5nTW9kZWw7XG4gICAgICAgIH0gZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJlcnJvclwiKSB7XG4gICAgICAgICAgaWYgKHJlcS5pbWFnZUdlbmVyYXRpb24pXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIGV2ZW50LmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICAgIHRocm93IGV2ZW50LmVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoYXV0byAmJiB0cmFuc3BhcmVudEF0dGVtcHRlZCkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWRyaXZlckNvbXBsZXRlZCB8fFxuICAgICAgICAgIHRyYW5zcGFyZW50Q2FsbHMuc2l6ZSAhPT0gMSB8fFxuICAgICAgICAgIHRyYW5zcGFyZW50Q2FsbElkcy5zaXplICE9PSAxIHx8XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgXCJpbmNvbXBsZXRlXCIsXG4gICAgICAgICAgICBcIkV4cGVjdGVkIG9uZSBjb21wbGV0ZWQgdHJhbnNwYXJlbnQgaW1hZ2UgY2FsbCB3aXRob3V0IGFub3RoZXIgaW1hZ2UgdG9vbFwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlcS5hYm9ydFNpZ25hbD8uYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihyZXEuYWJvcnRTaWduYWwpO1xuICAgICAgICBjb25zdCBwcm9tcHQgPSBbLi4udHJhbnNwYXJlbnRDYWxscy52YWx1ZXMoKV1bMF0hO1xuICAgICAgICBsZXQgaW1hZ2VDb21wbGV0ZWQgPSBmYWxzZTtcbiAgICAgICAgZm9yIGF3YWl0IChjb25zdCBldmVudCBvZiBjbGllbnRFbnRyeS5jbGllbnQucmVzcG9uc2VzKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG1vZGVsOiByZXEubW9kZWwgPz8gXCJcIixcbiAgICAgICAgICAgIC4uLihyZXEuc3lzdGVtUHJvbXB0ID8geyBpbnN0cnVjdGlvbnM6IHJlcS5zeXN0ZW1Qcm9tcHQgfSA6IHt9KSxcbiAgICAgICAgICAgIGhpc3Rvcnk6IFtcbiAgICAgICAgICAgICAgLi4uaW5wdXRJdGVtcyhyZXEpLFxuICAgICAgICAgICAgICB7IHR5cGU6IFwibWVzc2FnZVwiLCByb2xlOiBcInVzZXJcIiwgY29udGVudDogW3sgdHlwZTogXCJpbnB1dF90ZXh0XCIsIHRleHQ6IHByb21wdCB9XSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjoge1xuICAgICAgICAgICAgICBxdWFsaXR5OiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucz8ucXVhbGl0eSxcbiAgICAgICAgICAgICAgc2l6ZTogcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnM/LnNpemUsXG4gICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQ6IFwicG5nXCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmQ6IFwidHJhbnNwYXJlbnRcIixcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXEuYWJvcnRTaWduYWwsXG4gICAgICAgICkpIHtcbiAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJpbWFnZVwiKVxuICAgICAgICAgICAgaW1hZ2VzLnB1c2goe1xuICAgICAgICAgICAgICBkYXRhOiBldmVudC5iYXNlNjQsXG4gICAgICAgICAgICAgIG1lZGlhVHlwZTogZXZlbnQubWltZVR5cGUsXG4gICAgICAgICAgICAgIHJldmlzZWRQcm9tcHQ6IGV2ZW50LnJldmlzZWRQcm9tcHQgPz8gbnVsbCxcbiAgICAgICAgICAgICAgLi4uKGV2ZW50LmdlbmVyYXRpb24gPyB7IGdlbmVyYXRpb246IGV2ZW50LmdlbmVyYXRpb24gfSA6IHt9KSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiY29tcGxldGVkXCIpIGltYWdlQ29tcGxldGVkID0gdHJ1ZTtcbiAgICAgICAgICBlbHNlIGlmIChldmVudC50eXBlID09PSBcImVycm9yXCIpXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIGV2ZW50LmVycm9yLm1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpbWFnZUNvbXBsZXRlZClcbiAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXG4gICAgICAgICAgICBcImluY29tcGxldGVcIixcbiAgICAgICAgICAgIFwiVHJhbnNwYXJlbnQgaW1hZ2UgZ2VuZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlXCIsXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGlmIChhdXRvICYmIGltYWdlQXR0ZW1wdGVkICYmICFkcml2ZXJDb21wbGV0ZWQpXG4gICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJJbWFnZSBnZW5lcmF0aW9uIHJlc3BvbnNlIGRpZCBub3QgY29tcGxldGVcIik7XG4gICAgICBpZiAocmVxLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHJlcS5hYm9ydFNpZ25hbCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMucmVsZWFzZUNsaWVudChjbGllbnRFbnRyeSk7XG4gICAgfVxuICAgIGlmICgocmVxLmltYWdlR2VuZXJhdGlvbiA9PT0gdHJ1ZSB8fCAoYXV0byAmJiBpbWFnZUF0dGVtcHRlZCkpICYmIGltYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPyBcImluY29tcGxldGVcIiA6IFwibm90X2NhbGxlZFwiLFxuICAgICAgICBpbWFnZUF0dGVtcHRlZFxuICAgICAgICAgID8gXCJpbWFnZSBnZW5lcmF0aW9uIGRpZCBub3QgY29tcGxldGVcIlxuICAgICAgICAgIDogXCJtb2RlbCBkaWQgbm90IGNhbGwgaW1hZ2UgZ2VuZXJhdGlvblwiLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRleHQsXG4gICAgICB0b2tlbk5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB1c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB0dGZ0TXM6IGZpcnN0RGVsdGFBdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGZpcnN0RGVsdGFBdCAtIHN0YXJ0ZWRBdCxcbiAgICAgIG1vZGVsOiBzZXJ2aW5nTW9kZWwsXG4gICAgICAuLi4oc2VydmluZ01vZGVsICE9PSByZXEubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiByZXEubW9kZWwgfSA6IHt9KSxcbiAgICAgIHRocmVhZENvb3JkOiB7IHdvcmtlcklkOiBzZWxlY3Rpb24udG9rZW5JZCwgdGhyZWFkSWQ6IHJlcS5wcm9tcHRDYWNoZUtleSA/PyBcIlwiLCBlcG9jaDogLTEgfSxcbiAgICAgIC4uLihpbWFnZXMubGVuZ3RoID8geyBpbWFnZXMgfSA6IHt9KSxcbiAgICB9O1xuICB9XG5cbiAgLyoqIOyEuOuMgOqwgCDrsJTrgJAgY2xpZW50IOuKlCDsgqzsmqkg7KSR7J24IOyalOyyreydtCDrgZ3rgpwg65Kk7JeQIOuLq+uKlOuLpC4gKi9cbiAgYWNxdWlyZUNsaWVudChzZWxlY3Rpb246IFRva2VuU2VsZWN0aW9uKTogQ2xpZW50RW50cnkge1xuICAgIGNvbnN0IG1ldGFkYXRhID0gc2VsZWN0aW9uLm1ldGFkYXRhO1xuICAgIGxldCBlbnRyeSA9IHRoaXMuY2xpZW50cy5nZXQoc2VsZWN0aW9uLnRva2VuSWQpO1xuICAgIGlmIChlbnRyeSAmJiBlbnRyeS5nZW5lcmF0aW9uICE9PSBtZXRhZGF0YS5nZW5lcmF0aW9uKSB7XG4gICAgICB0aGlzLnJldGlyZUNsaWVudChzZWxlY3Rpb24udG9rZW5JZCk7XG4gICAgICBlbnRyeSA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKCFlbnRyeSkge1xuICAgICAgY29uc3QgY2xpZW50ID0gdGhpcy5jbGllbnRGYWN0b3J5KFxuICAgICAgICB7XG4gICAgICAgICAgY3JlZGVudGlhbHM6IHtcbiAgICAgICAgICAgIGFjY2Vzc1Rva2VuOiBtZXRhZGF0YS5jcmVkZW50aWFscy5hY2Nlc3NUb2tlbixcbiAgICAgICAgICAgIGFjY291bnRJZDogbWV0YWRhdGEuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgdHJhbnNwb3J0S2luZDogdGhpcy50cmFuc3BvcnRLaW5kLFxuICAgICAgICAgIGZldGNoOiB0aGlzLmZldGNoSW1wbCxcbiAgICAgICAgICByZWZyZXNoQ3JlZGVudGlhbHM6ICgpID0+IHRoaXMucmVmcmVzaENyZWRlbnRpYWxzKHNlbGVjdGlvbi50b2tlbklkKSxcbiAgICAgICAgfSxcbiAgICAgICAgc2VsZWN0aW9uLnRva2VuSWQsXG4gICAgICApO1xuICAgICAgZW50cnkgPSB7IGdlbmVyYXRpb246IG1ldGFkYXRhLmdlbmVyYXRpb24sIGNsaWVudCwgaW5GbGlnaHQ6IDAsIHJldGlyZWQ6IGZhbHNlIH07XG4gICAgICB0aGlzLmNsaWVudHMuc2V0KHNlbGVjdGlvbi50b2tlbklkLCBlbnRyeSk7XG4gICAgfVxuICAgIGVudHJ5LmluRmxpZ2h0Kys7XG4gICAgcmV0dXJuIGVudHJ5O1xuICB9XG5cbiAgcmVsZWFzZUNsaWVudChlbnRyeTogQ2xpZW50RW50cnkpOiB2b2lkIHtcbiAgICBlbnRyeS5pbkZsaWdodCA9IE1hdGgubWF4KDAsIGVudHJ5LmluRmxpZ2h0IC0gMSk7XG4gICAgaWYgKGVudHJ5LnJldGlyZWQgJiYgZW50cnkuaW5GbGlnaHQgPT09IDApIHtcbiAgICAgIHRoaXMucmV0aXJlZENsaWVudHMuZGVsZXRlKGVudHJ5KTtcbiAgICAgIGVudHJ5LmNsaWVudC5jbG9zZT8uKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0aXJlQ2xpZW50KHRva2VuSWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IGVudHJ5ID0gdGhpcy5jbGllbnRzLmdldCh0b2tlbklkKTtcbiAgICBpZiAoIWVudHJ5KSByZXR1cm47XG4gICAgdGhpcy5jbGllbnRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICBlbnRyeS5yZXRpcmVkID0gdHJ1ZTtcbiAgICBpZiAoZW50cnkuaW5GbGlnaHQgPT09IDApIGVudHJ5LmNsaWVudC5jbG9zZT8uKCk7XG4gICAgZWxzZSB0aGlzLnJldGlyZWRDbGllbnRzLmFkZChlbnRyeSk7XG4gIH1cblxuICAvLyDshKDtmLgg7Yag7YGw7J20IHF1b3Rh66W8IO2GteqzvO2VmOuptCDri6Trpbgg7Yag7YGwIOyhsO2ajOyZgCB3ZWlnaHRlZCDsg4Htg5wg67OA6rK97J2EIOyDneuete2VnOuLpC5cbiAgYXN5bmMgc2VsZWN0VG9rZW4oXG4gICAgcHJlZmVycmVkVG9rZW5JZDogbnVtYmVyIHwgdW5kZWZpbmVkLFxuICAgIHJlcXVpcmVQcmVmZXJyZWRUb2tlbjogYm9vbGVhbixcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLFxuICApOiBQcm9taXNlPFRva2VuU2VsZWN0aW9uPiB7XG4gICAgaWYgKHByZWZlcnJlZFRva2VuSWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uc3QgcHJlZmVycmVkID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChwcmVmZXJyZWRUb2tlbklkKTtcbiAgICAgIGlmIChwcmVmZXJyZWQ/LmFjdGl2ZSAmJiAoYXdhaXQgdGhpcy5pc1F1b3RhRWxpZ2libGUocHJlZmVycmVkVG9rZW5JZCwgcHJlZmVycmVkLCBzaWduYWwpKSkge1xuICAgICAgICByZXR1cm4geyB0b2tlbklkOiBwcmVmZXJyZWRUb2tlbklkLCBtZXRhZGF0YTogcHJlZmVycmVkIH07XG4gICAgICB9XG4gICAgICBpZiAocmVxdWlyZVByZWZlcnJlZFRva2VuKSB7XG4gICAgICAgIGlmICghcHJlZmVycmVkPy5hY3RpdmUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFByZWZlcnJlZCBvcGVuYWkgdG9rZW4gJHtwcmVmZXJyZWRUb2tlbklkfSBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGhyZXNob2xkID0gcHJlZmVycmVkLnF1b3RhVGhyZXNob2xkO1xuICAgICAgICBpZiAodGhyZXNob2xkICE9PSBudWxsICYmIHRocmVzaG9sZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihcbiAgICAgICAgICAgIHF1b3RhTWVzc2FnZShbeyBuYW1lOiBwcmVmZXJyZWQubmFtZSwgdGhyZXNob2xkIH1dKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8g7L2c65OcIOy6kOyLnOyXkOyEnCDthqDtgbAg7IiY66eM7YG8IOyhsO2ajCDsp4Dsl7DsnbQg7IyT7J207KeAIOyViuuPhOuhnSDrs5HroKwg7YyQ7KCV7ZWc64ukLlxuICAgIGNvbnN0IGNoZWNrcyA9IGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldXG4gICAgICAgIC5maWx0ZXIoKFssIHRva2VuXSkgPT4gdG9rZW4uYWN0aXZlKVxuICAgICAgICAubWFwKGFzeW5jIChbaWQsIHRva2VuXSkgPT4gKHtcbiAgICAgICAgICBpZCxcbiAgICAgICAgICB0b2tlbixcbiAgICAgICAgICBlbGlnaWJsZTogYXdhaXQgdGhpcy5pc1F1b3RhRWxpZ2libGUoaWQsIHRva2VuLCBzaWduYWwpLFxuICAgICAgICB9KSksXG4gICAgKTtcbiAgICBjb25zdCBlbGlnaWJsZSA9IG5ldyBTZXQoY2hlY2tzLmZpbHRlcigoYykgPT4gYy5lbGlnaWJsZSkubWFwKChjKSA9PiBjLmlkKSk7XG4gICAgaWYgKGVsaWdpYmxlLnNpemUgPT09IDApIHtcbiAgICAgIGNvbnN0IG92ZXIgPSBjaGVja3NcbiAgICAgICAgLmZpbHRlcihcbiAgICAgICAgICAoYykgPT5cbiAgICAgICAgICAgICFjLmVsaWdpYmxlICYmIGMudG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IG51bGwgJiYgYy50b2tlbi5xdW90YVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkLFxuICAgICAgICApXG4gICAgICAgIC5tYXAoKGMpID0+ICh7IG5hbWU6IGMudG9rZW4ubmFtZSwgdGhyZXNob2xkOiBjLnRva2VuLnF1b3RhVGhyZXNob2xkIGFzIG51bWJlciB9KSk7XG4gICAgICBpZiAob3Zlci5sZW5ndGgpIHtcbiAgICAgICAgbG9nZ2VyLndhcm4oXCJxdW90YV90aHJlc2hvbGQgZ2F0ZTogYWxsX2V4Y2VlZGVkXCIsIHtcbiAgICAgICAgICBwcm92aWRlcjogXCJvcGVuYWlcIixcbiAgICAgICAgICBvdmVyVGhyZXNob2xkVG9rZW5zOiBvdmVyLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhyb3cgbmV3IFF1b3RhVGhyZXNob2xkRXhjZWVkZWRFcnJvcihxdW90YU1lc3NhZ2Uob3ZlcikpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgfVxuICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3Rvci5zZWxlY3QoZWxpZ2libGUpO1xuICAgIGNvbnN0IG1ldGFkYXRhID0gc2VsZWN0ZWQgIT09IG51bGwgPyB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHNlbGVjdGVkKSA6IHVuZGVmaW5lZDtcbiAgICBpZiAoc2VsZWN0ZWQgPT09IG51bGwgfHwgIW1ldGFkYXRhKSB0aHJvdyBuZXcgRXJyb3IoXCJOT19PUEVOQUlfV09SS0VSU1wiKTtcbiAgICByZXR1cm4geyB0b2tlbklkOiBzZWxlY3RlZCwgbWV0YWRhdGEgfTtcbiAgfVxuXG4gIHNldFRva2VuKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZDogbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZCxcbiAgICB3ZWlnaHQ6IG51bWJlcixcbiAgICBhY3RpdmU6IGJvb2xlYW4sXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG9sZCA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpO1xuICAgIGlmIChvbGQpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24ob2xkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZCxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICBhY3RpdmUsXG4gICAgICAgIGdlbmVyYXRpb246IG9sZC5nZW5lcmF0aW9uICsgMSxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRva2VuTWV0YWRhdGEuc2V0KGlkLCB7XG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNyZWRlbnRpYWxzLFxuICAgICAgICBxdW90YVRocmVzaG9sZCxcbiAgICAgICAgd2VpZ2h0LFxuICAgICAgICBhY3RpdmUsXG4gICAgICAgIGdlbmVyYXRpb246IDEsXG4gICAgICB9KTtcbiAgICB9XG4gICAgdGhpcy5zZWxlY3Rvci5zZXRUb2tlbihpZCwgd2VpZ2h0KTtcbiAgICB0aGlzLmludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkLmRlbGV0ZShpZCk7XG4gIH1cblxuICBhc3luYyBnZXRSYXRlTGltaXRzQnlUb2tlbklkKFxuICAgIHRva2VuSWQ6IG51bWJlcixcbiAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxPcGVuQUlSYXRlTGltaXRzV2l0aE1ldGE+IHtcbiAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgaWYgKCF0b2tlbikgdGhyb3cgbmV3IEVycm9yKGBvcGVuYWkgdG9rZW4gJHt0b2tlbklkfSBub3QgZm91bmRgKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdG9rZW4uZ2VuZXJhdGlvbjtcbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJhdGVMaW1pdHNDYWNoZS5nZXQodG9rZW5JZCk7XG4gICAgaWYgKFxuICAgICAgY2FjaGVkICYmXG4gICAgICBjYWNoZWQuZ2VuZXJhdGlvbiA9PT0gdG9rZW4uZ2VuZXJhdGlvbiAmJlxuICAgICAgRGF0ZS5ub3coKSAtIGNhY2hlZC5jYWNoZWRBdCA8IE9wZW5BSURpc3BhdGNoZXIuUkFURV9MSU1JVFNfQ0FDSEVfVFRMXG4gICAgKVxuICAgICAgcmV0dXJuIGNhY2hlZDtcblxuICAgIC8vIFRUTCDrp4zro4wg7IucIOyhsO2ajOulvCDqs7XsnKDtlZzri6QuIOy1nOy0iCDtmLjstpzsnpDsnZggYWJvcnTroZwg7Iuk7Yyo7ZW064+EIGlzUXVvdGFFbGlnaWJsZeydgCBmYWlsLW9wZW7tlZzri6QuXG4gICAgY29uc3QgcGVuZGluZyA9IHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChwZW5kaW5nPy50b2tlbiA9PT0gdG9rZW4gJiYgcGVuZGluZy5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uKSByZXR1cm4gcGVuZGluZy5wcm9taXNlO1xuICAgIGNvbnN0IGZldGNoUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZSh7XG4gICAgICAgIGNyZWRlbnRpYWxzOiB0b2tlbi5jcmVkZW50aWFscyxcbiAgICAgICAgcmVmcmVzaENyZWRlbnRpYWxzOiAoKSA9PiB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyh0b2tlbklkKSxcbiAgICAgICAgZmV0Y2g6IHRoaXMuZmV0Y2hJbXBsLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikgdGhyb3cgbmV3IEVycm9yKHJlc3VsdC5yZWFzb24pO1xuICAgICAgaWYgKCFyZXN1bHQucmF3KSB0aHJvdyBuZXcgRXJyb3IoXCJPcGVuQUkgcXVvdGEgcmVzcG9uc2UgbWlzc2luZyByYXcgcmF0ZSBsaW1pdHNcIik7XG4gICAgICBjb25zdCBlbnRyeSA9IHsgZGF0YTogcmVzdWx0LnJhdywgY2FjaGVkQXQ6IERhdGUubm93KCksIGdlbmVyYXRpb24gfTtcbiAgICAgIGlmICh0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpID09PSB0b2tlbiAmJiB0b2tlbi5nZW5lcmF0aW9uID09PSBnZW5lcmF0aW9uKSB7XG4gICAgICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLnNldCh0b2tlbklkLCBlbnRyeSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZW50cnk7XG4gICAgfSkoKS5maW5hbGx5KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLnBlbmRpbmdSYXRlTGltaXRzLmdldCh0b2tlbklkKT8ucHJvbWlzZSA9PT0gZmV0Y2hQcm9taXNlKSB7XG4gICAgICAgIHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuZGVsZXRlKHRva2VuSWQpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucGVuZGluZ1JhdGVMaW1pdHMuc2V0KHRva2VuSWQsIHsgdG9rZW4sIGdlbmVyYXRpb24sIHByb21pc2U6IGZldGNoUHJvbWlzZSB9KTtcbiAgICByZXR1cm4gZmV0Y2hQcm9taXNlO1xuICB9XG5cbiAgYXN5bmMgcmVmcmVzaENyZWRlbnRpYWxzKHRva2VuSWQ6IG51bWJlcikge1xuICAgIGNvbnN0IHByZXZpb3VzID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gcHJldmlvdXM/LmdlbmVyYXRpb247XG4gICAgY29uc3QgcmVmcmVzaGVkID0gYXdhaXQgaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoKHRva2VuSWQpO1xuICAgIGNvbnN0IGNyZWRlbnRpYWxzID0ge1xuICAgICAgYWNjZXNzVG9rZW46IHJlZnJlc2hlZC5hY2Nlc3NUb2tlbixcbiAgICAgIGFjY291bnRJZDogcmVmcmVzaGVkLmNoYXRncHRBY2NvdW50SWQsXG4gICAgfTtcbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKTtcbiAgICBpZiAoIWN1cnJlbnQ/LmFjdGl2ZSkgdGhyb3cgbmV3IEVycm9yKGBvcGVuYWkgdG9rZW4gJHt0b2tlbklkfSBpcyBubyBsb25nZXIgYWN0aXZlYCk7XG4gICAgLy8gQSBzdWJzY3JpYmVyIHVwZGF0ZSBtYXkgYWxyZWFkeSBjb250YWluIG5ld2VyIGNyZWRlbnRpYWxzLiBOZXZlciBvdmVyd3JpdGUgaXRcbiAgICAvLyB3aXRoIHRoZSByZXN1bHQgb2YgYSByZWZyZXNoIHRoYXQgc3RhcnRlZCBhZ2FpbnN0IGFuIG9sZGVyIGdlbmVyYXRpb24uXG4gICAgaWYgKGN1cnJlbnQgPT09IHByZXZpb3VzICYmIGN1cnJlbnQuZ2VuZXJhdGlvbiA9PT0gZ2VuZXJhdGlvbikge1xuICAgICAgY3VycmVudC5jcmVkZW50aWFscyA9IHsgLi4uY3VycmVudC5jcmVkZW50aWFscywgLi4uY3JlZGVudGlhbHMgfTtcbiAgICAgIHRoaXMucmV0aXJlQ2xpZW50KHRva2VuSWQpO1xuICAgICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKHRva2VuSWQpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgYWNjZXNzVG9rZW46IGN1cnJlbnQuY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sXG4gICAgICBhY2NvdW50SWQ6IGN1cnJlbnQuY3JlZGVudGlhbHMuYWNjb3VudElkLFxuICAgIH07XG4gIH1cblxuICBhc3luYyBpc1F1b3RhRWxpZ2libGUoaWQ6IG51bWJlciwgdG9rZW46IFRva2VuTWV0YWRhdGEsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRva2VuLnF1b3RhVGhyZXNob2xkID09PSBudWxsIHx8IHRva2VuLnF1b3RhVGhyZXNob2xkID09PSB1bmRlZmluZWQpIHJldHVybiB0cnVlO1xuICAgIGNvbnN0IGdlbmVyYXRpb24gPSB0b2tlbi5nZW5lcmF0aW9uO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHJlYWRPcGVuQUlRdW90YVVzYWdlKGFzeW5jICgpID0+IHRoaXMuZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZChpZCwgc2lnbmFsKSk7XG4gICAgaWYgKHRoaXMudG9rZW5NZXRhZGF0YS5nZXQoaWQpICE9PSB0b2tlbiB8fCB0b2tlbi5nZW5lcmF0aW9uICE9PSBnZW5lcmF0aW9uKSByZXR1cm4gZmFsc2U7XG4gICAgaWYgKHJlc3VsdC5raW5kID09PSBcImxvb2t1cF9mYWlsZWRcIikge1xuICAgICAgdGhpcy5xdW90YUJsb2NrZWQuZGVsZXRlKGlkKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGxvb2t1cF9mYWlsX29wZW5cIiwge1xuICAgICAgICB0b2tlbklkOiBpZCxcbiAgICAgICAgdG9rZW5OYW1lOiB0b2tlbi5uYW1lLFxuICAgICAgICBsb29rdXBSZWFzb246IHJlc3VsdC5yZWFzb24sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAocmVzdWx0LnV0aWxpemF0aW9uUGN0ID49IHRva2VuLnF1b3RhVGhyZXNob2xkKSB7XG4gICAgICBpZiAoIXRoaXMucXVvdGFCbG9ja2VkLmhhcyhpZCkpXG4gICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgIGBxdW90YV90aHJlc2hvbGQgZ2F0ZTogb3Zlcl90aHJlc2hvbGQgJHt0b2tlbi5uYW1lfVske2lkfV0gKCR7cmVzdWx0LnV0aWxpemF0aW9uUGN0fSUgPj0gJHt0b2tlbi5xdW90YVRocmVzaG9sZH0lKWAsXG4gICAgICAgICk7XG4gICAgICB0aGlzLnF1b3RhQmxvY2tlZC5hZGQoaWQpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5xdW90YUJsb2NrZWQuZGVsZXRlKGlkKSlcbiAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICBgcXVvdGFfdGhyZXNob2xkIGdhdGU6IHJlY292ZXJlZCAke3Rva2VuLm5hbWV9WyR7aWR9XSAoJHtyZXN1bHQudXRpbGl6YXRpb25QY3R9JSA8ICR7dG9rZW4ucXVvdGFUaHJlc2hvbGR9JSlgLFxuICAgICAgKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGludmFsaWRhdGVSYXRlTGltaXRzQ2FjaGUoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMucmF0ZUxpbWl0c0NhY2hlLmRlbGV0ZShpZCk7XG4gIH1cblxuICBjb3VudEFjdGl2ZVRva2VucygpOiBudW1iZXIge1xuICAgIHJldHVybiBbLi4udGhpcy50b2tlbk1ldGFkYXRhLnZhbHVlcygpXS5maWx0ZXIoKHQpID0+IHQuYWN0aXZlKS5sZW5ndGg7XG4gIH1cblxuICAvLyDrqqjri4jthLDrp4Eg7Y+066eB7J2AIFRUTCDrgrQg7LqQ7Iuc66eMIOydveqzoCBmZXRjaO2VmOyngCDslYrripTri6QuIOuvuOyhsO2ajCDthqDtgbDsnYAgdXNlZFBlcmNlbnTqsIAgbnVsbOydtOuLpC5cbiAgZ2V0UXVvdGFTbmFwc2hvdCgpOiBBcnJheTx7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIHVzZWRQZXJjZW50OiBudW1iZXIgfCBudWxsO1xuICAgIHRocmVzaG9sZDogbnVtYmVyIHwgbnVsbDtcbiAgICBibG9ja2VkOiBib29sZWFuO1xuICAgIHJlc2V0c0F0OiBudW1iZXIgfCBudWxsO1xuICB9PiB7XG4gICAgY29uc3Qgbm93ID0gRGF0ZS5ub3coKTtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS5lbnRyaWVzKCldXG4gICAgICAubWFwKChbaWQsIHRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmF0ZUxpbWl0c0NhY2hlLmdldChpZCk7XG4gICAgICAgIGNvbnN0IGZyZXNoID1cbiAgICAgICAgICBjYWNoZWQgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgIGNhY2hlZC5nZW5lcmF0aW9uID09PSB0LmdlbmVyYXRpb24gJiZcbiAgICAgICAgICBub3cgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTDtcbiAgICAgICAgY29uc3QgcHJpbWFyeSA9IGZyZXNoID8gY2FjaGVkLmRhdGEucmF0ZUxpbWl0cz8ucHJpbWFyeSA6IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBuYW1lOiB0Lm5hbWUsXG4gICAgICAgICAgdXNlZFBlcmNlbnQ6IHByaW1hcnk/LnVzZWRQZXJjZW50ID8/IG51bGwsXG4gICAgICAgICAgdGhyZXNob2xkOiB0LnF1b3RhVGhyZXNob2xkID8/IG51bGwsXG4gICAgICAgICAgYmxvY2tlZDogdGhpcy5xdW90YUJsb2NrZWQuaGFzKGlkKSxcbiAgICAgICAgICAvLyB3aGFt7J2YIFVuaXgg7LSI66W8IGVwb2NoIG1z66GcIOuzgO2ZmO2VnOuLpC5cbiAgICAgICAgICByZXNldHNBdDpcbiAgICAgICAgICAgIHByaW1hcnk/LnJlc2V0c0F0ICE9PSBudWxsICYmIHByaW1hcnk/LnJlc2V0c0F0ICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBwcmltYXJ5LnJlc2V0c0F0ICogMTAwMFxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgIH07XG4gICAgICB9KVxuICAgICAgLnRvU29ydGVkKChhLCBiKSA9PiBhLm5hbWUubG9jYWxlQ29tcGFyZShiLm5hbWUpKTtcbiAgfVxufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQXlCQSxNQUFNLFNBQVMsVUFBVSxDQUFDLFNBQVMsbUJBQW1CLENBQUM7QUFFdkQsTUFBTSxzQ0FBc0IsSUFBSSxJQUFJO0NBQ2xDO0NBQ0E7Q0FDQTtDQUNBO0NBQ0E7Q0FDQTtBQUNGLENBQUM7QUFDRCxNQUFNLDZCQUE2QjtBQUNuQyxNQUFNLHlCQUF5QjtBQUkvQixJQUFhLHVCQUFiLGNBQTBDLE1BQU07Q0FFbkM7Q0FEWCxZQUNFLE1BQ0EsU0FDQTtFQUNBLE1BQU0sT0FBTztFQUhKLEtBQUEsT0FBQTtFQUlULEtBQUssT0FBTztDQUNkO0FBQ0Y7QUE4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
623
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlbmFpLWRpc3BhdGNoZXIuanMiLCJuYW1lcyI6W10sInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWxzL3Byb3ZpZGVycy9vcGVuYWkvb3BlbmFpLWRpc3BhdGNoZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TG9nZ2VyIH0gZnJvbSBcIkBsb2d0YXBlL2xvZ3RhcGVcIjtcblxuaW1wb3J0IHsgUXVvdGFUaHJlc2hvbGRFeGNlZWRlZEVycm9yIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3FncmlkL3FncmlkLnR5cGVzXCI7XG5pbXBvcnQgeyBUb2tlbk1vZGVsIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLm1vZGVsXCI7XG5pbXBvcnQgeyB0eXBlIE9wZW5BSUNyZWRlbnRpYWxzIH0gZnJvbSBcIi4uLy4uLy4uL2FwcGxpY2F0aW9uL3Rva2VuL3Rva2VuLnR5cGVzXCI7XG5pbXBvcnQgeyByZXNvbHZlT3BlbkFJRWZmb3J0IH0gZnJvbSBcIi4uL2NvbW1vbi9lZmZvcnRcIjtcbmltcG9ydCB7XG4gIHR5cGUgR2VuZXJhdGVSZXF1ZXN0LFxuICB0eXBlIEdlbmVyYXRlUmVzdWx0LFxuICB0eXBlIEdlbmVyYXRlU3RyZWFtQ2FsbGJhY2tzLFxuICB0eXBlIEdlbmVyYXRlZEltYWdlLFxuICB0eXBlIFByb3ZpZGVyRGlzcGF0Y2hlcixcbn0gZnJvbSBcIi4uL2NvbW1vbi9wcm92aWRlci1kaXNwYXRjaGVyXCI7XG5pbXBvcnQgeyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4gfSBmcm9tIFwiLi4vY29tbW9uL3Ntb290aC13ZWlnaHRlZC1yb3VuZC1yb2JpblwiO1xuaW1wb3J0IHsgVGhpbmtpbmdWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiLi4vY29tbW9uL3RoaW5raW5nXCI7XG5pbXBvcnQge1xuICBpbWFnZU1pbWVUeXBlLFxuICB0eXBlIEpzb25WYWx1ZSxcbiAgdHlwZSBPcGVuQUlSZXNwb25zZUl0ZW0sXG4gIHR5cGUgT3BlbkFJUmVzcG9uc2VzT3B0aW9ucyxcbn0gZnJvbSBcIi4vb3BlbmFpLWJhY2tlbmQtcHJvdG9jb2xcIjtcbmltcG9ydCB7IE9wZW5BSURpcmVjdENsaWVudCwgdHlwZSBPcGVuQUlEaXJlY3RDbGllbnRPcHRpb25zIH0gZnJvbSBcIi4vb3BlbmFpLWRpcmVjdC1jbGllbnRcIjtcbmltcG9ydCB7IHJlYWRPcGVuQUlRdW90YVVzYWdlLCB0eXBlIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSB9IGZyb20gXCIuL29wZW5haS1xdW90YVwiO1xuaW1wb3J0IHsgaGFuZGxlQ2hhdGdwdEF1dGhUb2tlbnNSZWZyZXNoIH0gZnJvbSBcIi4vb3BlbmFpLXJlZnJlc2hcIjtcbmltcG9ydCB7IHR5cGUgT3BlbkFJVHJhbnNwb3J0S2luZCwgcmVzb2x2ZU9wZW5BSVRyYW5zcG9ydEtpbmQgfSBmcm9tIFwiLi9vcGVuYWktdHJhbnNwb3J0LWNvbmZpZ1wiO1xuXG5jb25zdCBsb2dnZXIgPSBnZXRMb2dnZXIoW1wicWdyaWRcIiwgXCJvcGVuYWktZGlzcGF0Y2hlclwiXSk7XG4vLyBWZXJpZmllZCB3aXRoIHRoZSBzdWJzY3JpcHRpb24gUmVzcG9uc2VzIGJhY2tlbmQ7IHB1YmxpYyBBUEkgc3VwcG9ydCBpcyBub3Qgc3VmZmljaWVudC5cbmNvbnN0IFRISU5LSU5HX09GRl9NT0RFTFMgPSBuZXcgU2V0KFtcbiAgXCJncHQtNi1zb2xcIixcbiAgXCJncHQtNi1sdW5hXCIsXG4gIFwiZ3B0LTUuNi1zb2xcIixcbiAgXCJncHQtNS42LXRlcnJhXCIsXG4gIFwiZ3B0LTUuNi1sdW5hXCIsXG4gIFwiZ3B0LTUuNVwiLFxuXSk7XG5jb25zdCBERUZBVUxUX1JFUVVFU1RfVElNRU9VVF9NUyA9IDYwMF8wMDA7XG5jb25zdCBJTUFHRV9UT09MID0gXCJnZW5lcmF0ZV9pbWFnZVwiO1xuXG50eXBlIEltYWdlVG9vbEFyZ3VtZW50cyA9IHtcbiAgcHJvbXB0OiBzdHJpbmc7XG4gIHRyYW5zcGFyZW50X2JhY2tncm91bmQ6IGJvb2xlYW47XG4gIG51bV9sYXN0X2ltYWdlc190b19pbmNsdWRlOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBJbWFnZUZhaWx1cmVLaW5kID0gXCJnYXRlXCIgfCBcIm5vdF9jYWxsZWRcIiB8IFwiaW5jb21wbGV0ZVwiO1xuXG5leHBvcnQgY2xhc3MgSW1hZ2VHZW5lcmF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbXBsZXRlZERyaXZlcj86IEdlbmVyYXRlUmVzdWx0O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHJlYWRvbmx5IGtpbmQ6IEltYWdlRmFpbHVyZUtpbmQsXG4gICAgbWVzc2FnZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBFcnJvck9wdGlvbnMsXG4gICkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIG9wdGlvbnMpO1xuICAgIHRoaXMubmFtZSA9IFwiSW1hZ2VHZW5lcmF0aW9uRXJyb3JcIjtcbiAgfVxufVxuXG50eXBlIFRva2VuTWV0YWRhdGEgPSB7XG4gIG5hbWU6IHN0cmluZztcbiAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzO1xuICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGw7XG4gIHdlaWdodDogbnVtYmVyO1xuICBhY3RpdmU6IGJvb2xlYW47XG4gIGdlbmVyYXRpb246IG51bWJlcjtcbn07XG5cbnR5cGUgVG9rZW5TZWxlY3Rpb24gPSB7IHRva2VuSWQ6IG51bWJlcjsgbWV0YWRhdGE6IFRva2VuTWV0YWRhdGEgfTtcblxuZXhwb3J0IHR5cGUgT3BlbkFJRGlyZWN0Q2xpZW50RmFjdG9yeSA9IChcbiAgb3B0aW9uczogT3BlbkFJRGlyZWN0Q2xpZW50T3B0aW9ucyxcbiAgdG9rZW5JZDogbnVtYmVyLFxuKSA9PiBQaWNrPE9wZW5BSURpcmVjdENsaWVudCwgXCJyZXNwb25zZXNcIj4gJiB7IGNsb3NlPzogKCkgPT4gdm9pZCB9O1xuXG50eXBlIENsaWVudEVudHJ5ID0ge1xuICBnZW5lcmF0aW9uOiBudW1iZXI7XG4gIGNsaWVudDogUGljazxPcGVuQUlEaXJlY3RDbGllbnQsIFwicmVzcG9uc2VzXCI+ICYgeyBjbG9zZT86ICgpID0+IHZvaWQgfTtcbiAgaW5GbGlnaHQ6IG51bWJlcjtcbiAgcmV0aXJlZDogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgT3BlbkFJRGlzcGF0Y2hlckRlcGVuZGVuY2llcyB7XG4gIGNsaWVudEZhY3Rvcnk/OiBPcGVuQUlEaXJlY3RDbGllbnRGYWN0b3J5O1xuICBmZXRjaD86IHR5cGVvZiBmZXRjaDtcbn1cblxuZnVuY3Rpb24gYWJvcnRFcnJvcihzaWduYWw6IEFib3J0U2lnbmFsKTogRXJyb3Ige1xuICBjb25zdCByZWFzb24gPSBzaWduYWwucmVhc29uO1xuICByZXR1cm4gcmVhc29uIGluc3RhbmNlb2YgRXJyb3IgPyByZWFzb24gOiBuZXcgRE9NRXhjZXB0aW9uKFwiQWJvcnRlZFwiLCBcIkFib3J0RXJyb3JcIik7XG59XG5cbmZ1bmN0aW9uIGFjdGl2ZVNpZ25hbChzaWduYWw/OiBBYm9ydFNpZ25hbCwgdGltZW91dE1zPzogbnVtYmVyKTogQWJvcnRTaWduYWwge1xuICBjb25zdCB0aW1lb3V0ID0gQWJvcnRTaWduYWwudGltZW91dCh0aW1lb3V0TXMgPz8gREVGQVVMVF9SRVFVRVNUX1RJTUVPVVRfTVMpO1xuICByZXR1cm4gc2lnbmFsID8gQWJvcnRTaWduYWwuYW55KFtzaWduYWwsIHRpbWVvdXRdKSA6IHRpbWVvdXQ7XG59XG5cbmZ1bmN0aW9uIHF1b3RhTWVzc2FnZShlbnRyaWVzOiBBcnJheTx7IG5hbWU6IHN0cmluZzsgdGhyZXNob2xkOiBudW1iZXIgfT4pOiBzdHJpbmcge1xuICBjb25zdCBkZXRhaWwgPSBlbnRyaWVzLm1hcCgoZSkgPT4gYCR7ZS5uYW1lfSAodGhyZXNob2xkICR7ZS50aHJlc2hvbGR9JSlgKS5qb2luKFwiLCBcIik7XG4gIHJldHVybiBkZXRhaWxcbiAgICA/IGBBbGwgb3BlbmFpIHRva2VucyBleGNlZWRlZCBxdW90YSB0aHJlc2hvbGQ6ICR7ZGV0YWlsfWBcbiAgICA6IFwiQWxsIG9wZW5haSB0b2tlbnMgZXhjZWVkZWQgcXVvdGEgdGhyZXNob2xkXCI7XG59XG5cbmZ1bmN0aW9uIGlucHV0SXRlbXMocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBPcGVuQUlSZXNwb25zZUl0ZW1bXSB7XG4gIGNvbnN0IGhpc3RvcnkgPSAocmVxLmNvbGRIaXN0b3J5ID8/IFtdKSBhcyBPcGVuQUlSZXNwb25zZUl0ZW1bXTtcbiAgY29uc3QgY29udGVudDogT3BlbkFJUmVzcG9uc2VJdGVtW10gPSByZXEuY29sZElucHV0Lm1hcCgoaW5wdXQpID0+IHtcbiAgICBpZiAoaW5wdXQudHlwZSA9PT0gXCJ0ZXh0XCIpIHJldHVybiB7IHR5cGU6IFwiaW5wdXRfdGV4dFwiLCB0ZXh0OiBpbnB1dC50ZXh0IH07XG4gICAgaWYgKGlucHV0LnR5cGUgPT09IFwiaW1hZ2VcIikgcmV0dXJuIHsgdHlwZTogXCJpbnB1dF9pbWFnZVwiLCBpbWFnZV91cmw6IGlucHV0LnVybCB9O1xuICAgIGlmIChpbnB1dC50eXBlID09PSBcImxvY2FsSW1hZ2VcIikgcmV0dXJuIHsgdHlwZTogXCJpbnB1dF9pbWFnZVwiLCBpbWFnZV91cmw6IGlucHV0LnBhdGggfTtcbiAgICByZXR1cm4geyB0eXBlOiBcImlucHV0X3RleHRcIiwgdGV4dDogYCR7aW5wdXQubmFtZX06ICR7aW5wdXQucGF0aH1gIH07XG4gIH0pO1xuICByZXR1cm4gWy4uLmhpc3RvcnksIHsgdHlwZTogXCJtZXNzYWdlXCIsIHJvbGU6IFwidXNlclwiLCBjb250ZW50IH1dO1xufVxuXG5mdW5jdGlvbiBpbWFnZVJlZmVyZW5jZXMocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBPcGVuQUlSZXNwb25zZUl0ZW1bXSB7XG4gIHJldHVybiBpbnB1dEl0ZW1zKHJlcSkuZmxhdE1hcCgoaXRlbSkgPT4ge1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIgJiYgdHlwZW9mIGl0ZW0ucmVzdWx0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICByZXR1cm4gW1xuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogXCJpbnB1dF9pbWFnZVwiLFxuICAgICAgICAgIGltYWdlX3VybDogYGRhdGE6JHtpbWFnZU1pbWVUeXBlKGl0ZW0ucmVzdWx0LCBpdGVtLm91dHB1dF9mb3JtYXQpfTtiYXNlNjQsJHtpdGVtLnJlc3VsdH1gLFxuICAgICAgICB9LFxuICAgICAgXTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGl0ZW0uY29udGVudCkpIHJldHVybiBbXTtcbiAgICByZXR1cm4gaXRlbS5jb250ZW50LmZpbHRlcihcbiAgICAgIChwYXJ0KTogcGFydCBpcyBPcGVuQUlSZXNwb25zZUl0ZW0gPT5cbiAgICAgICAgcGFydCAhPT0gbnVsbCAmJlxuICAgICAgICB0eXBlb2YgcGFydCA9PT0gXCJvYmplY3RcIiAmJlxuICAgICAgICAocGFydC50eXBlID09PSBcImlucHV0X2ltYWdlXCIgfHwgcGFydC50eXBlID09PSBcImltYWdlX3VybFwiKSxcbiAgICApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gYXNSZWFzb25pbmcocmVxOiBHZW5lcmF0ZVJlcXVlc3QpOiBPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHJlcS50aGlua2luZyA9PT0gZmFsc2UpIHJldHVybiB7IGVmZm9ydDogXCJub25lXCIgfTtcbiAgY29uc3Qgc3VtbWFyeSA9XG4gICAgcmVxLnJlYXNvbmluZ1N1bW1hcnkgJiYgcmVxLnJlYXNvbmluZ1N1bW1hcnkgIT09IFwibm9uZVwiID8gcmVxLnJlYXNvbmluZ1N1bW1hcnkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVmZm9ydCA9XG4gICAgcmVzb2x2ZU9wZW5BSUVmZm9ydChyZXEubW9kZWwgPz8gXCJcIiwgcmVxLmVmZm9ydCkgPz8gKHJlcS50aGlua2luZyA9PT0gdHJ1ZSA/IFwibG93XCIgOiB1bmRlZmluZWQpO1xuICBpZiAoIWVmZm9ydCAmJiAhc3VtbWFyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHtcbiAgICAuLi4oZWZmb3J0ID8geyBlZmZvcnQgfSA6IHt9KSxcbiAgICAuLi4oc3VtbWFyeVxuICAgICAgPyB7XG4gICAgICAgICAgc3VtbWFyeTogc3VtbWFyeSBhcyBOb25OdWxsYWJsZTxPcGVuQUlSZXNwb25zZXNPcHRpb25zW1wicmVhc29uaW5nXCJdPltcInN1bW1hcnlcIl0sXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICB9O1xufVxuXG5mdW5jdGlvbiByZXF1ZXN0T3B0aW9ucyhyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IE9wZW5BSVJlc3BvbnNlc09wdGlvbnMge1xuICBjb25zdCB7IG91dHB1dEZvcm1hdCwgLi4uaW1hZ2VDb250cm9scyB9ID0gcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnMgPz8ge307XG4gIGNvbnN0IGF1dG8gPSByZXEuaW1hZ2VHZW5lcmF0aW9uID09PSBcImF1dG9cIjtcbiAgaWYgKGF1dG8gJiYgcmVxLm91dHB1dFNjaGVtYSkge1xuICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgIFwiZ2F0ZVwiLFxuICAgICAgXCJBdXRvbWF0aWMgaW1hZ2UgZ2VuZXJhdGlvbiBkb2VzIG5vdCBzdXBwb3J0IHN0cnVjdHVyZWQgb3V0cHV0IG9yIGV4dGVybmFsIHRvb2xzXCIsXG4gICAgKTtcbiAgfVxuICBpZiAoYXV0byAmJiBvdXRwdXRGb3JtYXQgJiYgb3V0cHV0Rm9ybWF0ICE9PSBcInBuZ1wiKSB7XG4gICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiZ2F0ZVwiLCBcIkF1dG9tYXRpYyBpbWFnZSBnZW5lcmF0aW9uIG9ubHkgc3VwcG9ydHMgUE5HIG91dHB1dFwiKTtcbiAgfVxuICByZXR1cm4ge1xuICAgIG1vZGVsOiByZXEubW9kZWwgPz8gXCJcIixcbiAgICAuLi4ocmVxLnN5c3RlbVByb21wdCA/IHsgaW5zdHJ1Y3Rpb25zOiByZXEuc3lzdGVtUHJvbXB0IH0gOiB7fSksXG4gICAgLi4uKGF1dG9cbiAgICAgID8ge1xuICAgICAgICAgIGluc3RydWN0aW9uczogW1xuICAgICAgICAgICAgcmVxLnN5c3RlbVByb21wdCxcbiAgICAgICAgICAgIFwiVXNlIGdlbmVyYXRlX2ltYWdlIHdoZW4gaW1hZ2UgZ2VuZXJhdGlvbiBvciBlZGl0aW5nIGlzIG5lZWRlZDsgb3RoZXJ3aXNlIHJlcGx5IHdpdGggdGV4dC4gQ2FsbCBpdCBhdCBtb3N0IG9uY2UgcGVyIHJlc3BvbnNlLiBTdXBwbHkgYSBjb21wbGV0ZSwgc2VsZi1jb250YWluZWQgcHJvbXB0IHdpdGggYWxsIHJlbGV2YW50IGNvbnZlcnNhdGlvbiBpbnN0cnVjdGlvbnMuIFNldCB0cmFuc3BhcmVudF9iYWNrZ3JvdW5kIHRvIHRydWUgb25seSB3aGVuIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBpcyByZXF1ZXN0ZWQuIFNldCBudW1fbGFzdF9pbWFnZXNfdG9faW5jbHVkZSB0byAwIGZvciBhIG5ldyBpbWFnZSB3aXRob3V0IHJlZmVyZW5jZXMuIEZvciBlZGl0aW5nIG9yIHJlZmVyZW5jZS1iYXNlZCBnZW5lcmF0aW9uLCBjaG9vc2UgdGhlIHNtYWxsZXN0IG51bWJlciBvZiByZWNlbnQgY29udmVyc2F0aW9uIGltYWdlcyB0aGF0IGluY2x1ZGVzIGFsbCBuZWVkZWQgcmVmZXJlbmNlcywgYXQgbW9zdCA1LiBSZWZlcmVuY2VzIHJldGFpbiB0aGVpciBjaHJvbm9sb2dpY2FsIG9yZGVyLiBEbyBub3Qgc2VsZWN0IGltYWdlcyBmb3IgYW4gdW5yZWxhdGVkIG5ldyByZXF1ZXN0LlwiLFxuICAgICAgICAgIF1cbiAgICAgICAgICAgIC5maWx0ZXIoQm9vbGVhbilcbiAgICAgICAgICAgIC5qb2luKFwiXFxuXFxuXCIpLFxuICAgICAgICAgIHBhcmFsbGVsVG9vbENhbGxzOiBmYWxzZSxcbiAgICAgICAgICB0b29sczogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0eXBlOiBcImZ1bmN0aW9uXCIsXG4gICAgICAgICAgICAgIG5hbWU6IElNQUdFX1RPT0wsXG4gICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgIFwiR2VuZXJhdGUgb3IgZWRpdCBhbiBpbWFnZSwgb3B0aW9uYWxseSB3aXRoIGEgdHJhbnNwYXJlbnQgYmFja2dyb3VuZCBvciByZWNlbnQgY29udmVyc2F0aW9uIGltYWdlcyBhcyByZWZlcmVuY2VzLlwiLFxuICAgICAgICAgICAgICAvLyBBc3RyYSdzIHN1YnNjcmlwdGlvbiBiYWNrZW5kIHJlamVjdHMgc3RyaWN0IHRvb2xzOyB2YWxpZGF0ZSBhcmd1bWVudHMgbG9jYWxseS5cbiAgICAgICAgICAgICAgc3RyaWN0OiBmYWxzZSxcbiAgICAgICAgICAgICAgcGFyYW1ldGVyczoge1xuICAgICAgICAgICAgICAgIHR5cGU6IFwib2JqZWN0XCIsXG4gICAgICAgICAgICAgICAgcHJvcGVydGllczoge1xuICAgICAgICAgICAgICAgICAgcHJvbXB0OiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICAgICAgICAgICAgICAgIG1pbkxlbmd0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgICAgICAgICAgICAgXCJDb21wbGV0ZSwgc2VsZi1jb250YWluZWQgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgaW1hZ2UgZ2VuZXJhdGlvbiBvciBlZGl0LlwiLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIHRyYW5zcGFyZW50X2JhY2tncm91bmQ6IHsgdHlwZTogXCJib29sZWFuXCIgfSxcbiAgICAgICAgICAgICAgICAgIG51bV9sYXN0X2ltYWdlc190b19pbmNsdWRlOiB7IHR5cGU6IFwiaW50ZWdlclwiLCBtaW5pbXVtOiAwLCBtYXhpbXVtOiA1IH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXF1aXJlZDogW1wicHJvbXB0XCIsIFwidHJhbnNwYXJlbnRfYmFja2dyb3VuZFwiLCBcIm51bV9sYXN0X2ltYWdlc190b19pbmNsdWRlXCJdLFxuICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiBmYWxzZSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gICAgaGlzdG9yeTogaW5wdXRJdGVtcyhyZXEpLFxuICAgIC4uLihhc1JlYXNvbmluZyhyZXEpID8geyByZWFzb25pbmc6IGFzUmVhc29uaW5nKHJlcSkgfSA6IHt9KSxcbiAgICAuLi4ocmVxLnZlcmJvc2l0eSA/IHsgdmVyYm9zaXR5OiByZXEudmVyYm9zaXR5IGFzIE9wZW5BSVJlc3BvbnNlc09wdGlvbnNbXCJ2ZXJib3NpdHlcIl0gfSA6IHt9KSxcbiAgICAuLi4ocmVxLnNlcnZpY2VUaWVyXG4gICAgICA/IHsgc2VydmljZVRpZXI6IHJlcS5zZXJ2aWNlVGllciA9PT0gXCJmYXN0XCIgPyBcInByaW9yaXR5XCIgOiByZXEuc2VydmljZVRpZXIgfVxuICAgICAgOiB7fSksXG4gICAgLi4uKHJlcS5wcm9tcHRDYWNoZUtleSA/IHsgcHJvbXB0Q2FjaGVLZXk6IHJlcS5wcm9tcHRDYWNoZUtleSB9IDoge30pLFxuICAgIC4uLihyZXEub3V0cHV0U2NoZW1hID8geyBvdXRwdXRTY2hlbWE6IHsgc2NoZW1hOiByZXEub3V0cHV0U2NoZW1hIGFzIEpzb25WYWx1ZSB9IH0gOiB7fSksXG4gICAgLi4uKHJlcS5pbWFnZUdlbmVyYXRpb24gJiYgIWF1dG9cbiAgICAgID8ge1xuICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjogcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnNcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIC4uLmltYWdlQ29udHJvbHMsXG4gICAgICAgICAgICAgICAgLi4uKG91dHB1dEZvcm1hdCA/IHsgb3V0cHV0X2Zvcm1hdDogb3V0cHV0Rm9ybWF0IH0gOiB7fSksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH07XG59XG5cbi8vIHF1b3Rh7JmAIGNhY2hlIGFmZmluaXR566GcIO2GoO2BsOydhCDshKDtg53tlbQgSFRUUFMvV1ProZwg7KCE7Iah7ZWc64ukLiDroZzsu6wg64+Z7Iuc7ISxIOygnO2VnOydgCDsl4bri6QuXG5leHBvcnQgY2xhc3MgT3BlbkFJRGlzcGF0Y2hlciBpbXBsZW1lbnRzIFByb3ZpZGVyRGlzcGF0Y2hlciB7XG4gIHJlYWRvbmx5IHRva2VuTWV0YWRhdGEgPSBuZXcgTWFwPG51bWJlciwgVG9rZW5NZXRhZGF0YT4oKTtcbiAgcmVhZG9ubHkgdHJhbnNwb3J0S2luZDogT3BlbkFJVHJhbnNwb3J0S2luZDtcbiAgcmVhZG9ubHkgcmF0ZUxpbWl0c0NhY2hlID0gbmV3IE1hcDxudW1iZXIsIE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YSAmIHsgZ2VuZXJhdGlvbjogbnVtYmVyIH0+KCk7XG4gIHJlYWRvbmx5IHBlbmRpbmdSYXRlTGltaXRzID0gbmV3IE1hcDxcbiAgICBudW1iZXIsXG4gICAgeyB0b2tlbjogVG9rZW5NZXRhZGF0YTsgZ2VuZXJhdGlvbjogbnVtYmVyOyBwcm9taXNlOiBQcm9taXNlPE9wZW5BSVJhdGVMaW1pdHNXaXRoTWV0YT4gfVxuICA+KCk7XG4gIHJlYWRvbmx5IGNsaWVudHMgPSBuZXcgTWFwPG51bWJlciwgQ2xpZW50RW50cnk+KCk7XG4gIHJlYWRvbmx5IHJldGlyZWRDbGllbnRzID0gbmV3IFNldDxDbGllbnRFbnRyeT4oKTtcbiAgc3RhdGljIHJlYWRvbmx5IFJBVEVfTElNSVRTX0NBQ0hFX1RUTCA9IDYwXzAwMDtcblxuICByZWFkb25seSBzZWxlY3RvciA9IG5ldyBTbW9vdGhXZWlnaHRlZFJvdW5kUm9iaW4oKTtcbiAgcmVhZG9ubHkgY2xpZW50RmFjdG9yeTogT3BlbkFJRGlyZWN0Q2xpZW50RmFjdG9yeTtcbiAgcmVhZG9ubHkgZmV0Y2hJbXBsOiB0eXBlb2YgZmV0Y2g7XG4gIHJlYWRvbmx5IHF1b3RhQmxvY2tlZCA9IG5ldyBTZXQ8bnVtYmVyPigpO1xuICBpbkZsaWdodCA9IDA7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgdHJhbnNwb3J0S2luZDogT3BlbkFJVHJhbnNwb3J0S2luZCA9IHJlc29sdmVPcGVuQUlUcmFuc3BvcnRLaW5kKCksXG4gICAgZGVwZW5kZW5jaWVzOiBPcGVuQUlEaXNwYXRjaGVyRGVwZW5kZW5jaWVzID0ge30sXG4gICkge1xuICAgIHRoaXMudHJhbnNwb3J0S2luZCA9IHRyYW5zcG9ydEtpbmQ7XG4gICAgdGhpcy5jbGllbnRGYWN0b3J5ID1cbiAgICAgIGRlcGVuZGVuY2llcy5jbGllbnRGYWN0b3J5ID8/ICgob3B0aW9ucykgPT4gbmV3IE9wZW5BSURpcmVjdENsaWVudChvcHRpb25zKSk7XG4gICAgdGhpcy5mZXRjaEltcGwgPSBkZXBlbmRlbmNpZXMuZmV0Y2ggPz8gZmV0Y2g7XG4gIH1cblxuICBhc3luYyBzdGFydCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IFRva2VuTW9kZWwuZmluZE1hbnkoXCJBXCIpO1xuICAgIHJvd3NcbiAgICAgIC5maWx0ZXIoKHJvdykgPT4gcm93LnByb3ZpZGVyID09PSBcIm9wZW5haVwiKVxuICAgICAgLmZvckVhY2goKHJvdykgPT4ge1xuICAgICAgICB0aGlzLnNldFRva2VuKFxuICAgICAgICAgIHJvdy5pZCxcbiAgICAgICAgICByb3cubmFtZSxcbiAgICAgICAgICByb3cuY3JlZGVudGlhbHMgYXMgT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgICAgICAgcm93LnF1b3RhX3RocmVzaG9sZCxcbiAgICAgICAgICByb3cud2VpZ2h0LFxuICAgICAgICAgIHJvdy5hY3RpdmUsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhgc3RhcnRlZCBkaXJlY3QgT3BlbkFJIHJ1bnRpbWUgd2l0aCAke3RoaXMudG9rZW5NZXRhZGF0YS5zaXplfSB0b2tlbnNgKTtcbiAgfVxuXG4gIGFzeW5jIHN0b3AoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5jbGllbnRzLmZvckVhY2goKHsgY2xpZW50IH0pID0+IGNsaWVudC5jbG9zZT8uKCkpO1xuICAgIHRoaXMuY2xpZW50cy5jbGVhcigpO1xuICAgIHRoaXMucmV0aXJlZENsaWVudHMuZm9yRWFjaCgoZW50cnkpID0+IGVudHJ5LmNsaWVudC5jbG9zZT8uKCkpO1xuICAgIHRoaXMucmV0aXJlZENsaWVudHMuY2xlYXIoKTtcbiAgICB0aGlzLnRva2VuTWV0YWRhdGEuY2xlYXIoKTtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5jbGVhcigpO1xuICAgIHRoaXMucXVvdGFCbG9ja2VkLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3Rvci5yZXNldFNjb3JlcygpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlbkFkZGVkKFxuICAgIGlkOiBudW1iZXIsXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscyxcbiAgICBxdW90YVRocmVzaG9sZD86IG51bWJlciB8IG51bGwsXG4gICAgd2VpZ2h0ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5zZXRUb2tlbihpZCwgbmFtZSwgY3JlZGVudGlhbHMsIHF1b3RhVGhyZXNob2xkLCB3ZWlnaHQsIHRydWUpO1xuICB9XG5cbiAgYXN5bmMgb25Ub2tlblVwZGF0ZWQoXG4gICAgaWQ6IG51bWJlcixcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgY3JlZGVudGlhbHM6IE9wZW5BSUNyZWRlbnRpYWxzLFxuICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbCxcbiAgICB3ZWlnaHQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBvbGQgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICB0aGlzLnNldFRva2VuKGlkLCBuYW1lLCBjcmVkZW50aWFscywgcXVvdGFUaHJlc2hvbGQsIHdlaWdodCwgb2xkPy5hY3RpdmUgPz8gdHJ1ZSk7XG4gIH1cblxuICBhc3luYyBvblRva2VuUmVtb3ZlZChpZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy5yZXRpcmVDbGllbnQoaWQpO1xuICAgIHRoaXMudG9rZW5NZXRhZGF0YS5kZWxldGUoaWQpO1xuICAgIHRoaXMuc2VsZWN0b3IucmVtb3ZlVG9rZW4oaWQpO1xuICAgIHRoaXMuaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZShpZCk7XG4gICAgdGhpcy5xdW90YUJsb2NrZWQuZGVsZXRlKGlkKTtcbiAgfVxuXG4gIG9uVG9rZW5EZWFjdGl2YXRlZChpZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAodG9rZW4pIHRva2VuLmFjdGl2ZSA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgfVxuXG4gIG9uVG9rZW5BY3RpdmF0ZWQoaWQ6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IHRva2VuID0gdGhpcy50b2tlbk1ldGFkYXRhLmdldChpZCk7XG4gICAgaWYgKHRva2VuKSB0b2tlbi5hY3RpdmUgPSB0cnVlO1xuICAgIHRoaXMuc2VsZWN0b3IucmVzZXRTY29yZXMoKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxhY2VUb2tlbnMoXG4gICAgcm93czogQXJyYXk8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgIGNyZWRlbnRpYWxzOiBPcGVuQUlDcmVkZW50aWFscztcbiAgICAgIHF1b3RhVGhyZXNob2xkPzogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHdlaWdodDogbnVtYmVyO1xuICAgIH0+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpZHMgPSBuZXcgU2V0KHJvd3MubWFwKChyKSA9PiByLmlkKSk7XG4gICAgZm9yIChjb25zdCBpZCBvZiB0aGlzLnRva2VuTWV0YWRhdGEua2V5cygpKSBpZiAoIWlkcy5oYXMoaWQpKSBhd2FpdCB0aGlzLm9uVG9rZW5SZW1vdmVkKGlkKTtcbiAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKVxuICAgICAgYXdhaXQgdGhpcy5vblRva2VuVXBkYXRlZChyb3cuaWQsIHJvdy5uYW1lLCByb3cuY3JlZGVudGlhbHMsIHJvdy5xdW90YVRocmVzaG9sZCwgcm93LndlaWdodCk7XG4gIH1cblxuICBhc3luYyBnZW5lcmF0ZShyZXE6IEdlbmVyYXRlUmVxdWVzdCk6IFByb21pc2U8R2VuZXJhdGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5ydW4ocmVxKTtcbiAgfVxuXG4gIGFzeW5jIGdlbmVyYXRlU3RyZWFtKHJlcTogR2VuZXJhdGVSZXF1ZXN0LCBjYjogR2VuZXJhdGVTdHJlYW1DYWxsYmFja3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAocmVxLmltYWdlR2VuZXJhdGlvbilcbiAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgICAgXCJnYXRlXCIsXG4gICAgICAgIFwiaW1hZ2UgZ2VuZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzdHJlYW1pbmcgcGF0aFwiLFxuICAgICAgKTtcbiAgICB0cnkge1xuICAgICAgY2Iub25Db21wbGV0ZShhd2FpdCB0aGlzLnJ1bihyZXEsIGNiLm9uRGVsdGEpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY2Iub25FcnJvcihlcnJvciBhcyBFcnJvcik7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICBhc3luYyBydW4ocmVxOiBHZW5lcmF0ZVJlcXVlc3QsIG9uRGVsdGE/OiAodGV4dDogc3RyaW5nKSA9PiB2b2lkKTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIGlmIChyZXEudGhpbmtpbmcgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCBtb2RlbCA9IHJlcS5tb2RlbCA/PyBcIlwiO1xuICAgICAgaWYgKCFUSElOS0lOR19PRkZfTU9ERUxTLmhhcyhtb2RlbCkpIHtcbiAgICAgICAgY29uc3QgcmVhc29uID1cbiAgICAgICAgICBtb2RlbCA9PT0gXCJncHQtNi1hc3RyYVwiIHx8IG1vZGVsID09PSBcImdwdC02LjEtc29sXCJcbiAgICAgICAgICAgID8gXCJ0aGUgc3Vic2NyaXB0aW9uIGJhY2tlbmQgcmVxdWlyZXMgdGhpbmtpbmdcIlxuICAgICAgICAgICAgOiBcInRoaW5raW5nLW9mZiBzdXBwb3J0IGhhcyBub3QgYmVlbiB2ZXJpZmllZCBvbiB0aGUgc3Vic2NyaXB0aW9uIGJhY2tlbmRcIjtcbiAgICAgICAgdGhyb3cgbmV3IFRoaW5raW5nVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIGB0aGlua2luZzpmYWxzZSBpcyB1bmF2YWlsYWJsZSBmb3IgT3BlbkFJIG1vZGVsICR7bW9kZWwgfHwgXCI8ZGVmYXVsdD5cIn06ICR7cmVhc29ufWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHNpZ25hbCA9IGFjdGl2ZVNpZ25hbChyZXEuYWJvcnRTaWduYWwsIHJlcS50aW1lb3V0TXMpO1xuICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihzaWduYWwpO1xuICAgIGNvbnN0IHNlbGVjdGlvbiA9IGF3YWl0IHRoaXMuc2VsZWN0VG9rZW4oXG4gICAgICByZXEucHJlZmVycmVkVG9rZW5JZCxcbiAgICAgIHJlcS5yZXF1aXJlUHJlZmVycmVkVG9rZW4gPz8gZmFsc2UsXG4gICAgICBzaWduYWwsXG4gICAgKTtcbiAgICB0aGlzLmluRmxpZ2h0Kys7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChzaWduYWwuYWJvcnRlZCkgdGhyb3cgYWJvcnRFcnJvcihzaWduYWwpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMucnVuRGlyZWN0KHNlbGVjdGlvbiwgeyAuLi5yZXEsIGFib3J0U2lnbmFsOiBzaWduYWwgfSwgb25EZWx0YSk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHRoaXMuaW5GbGlnaHQtLTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBydW5EaXJlY3QoXG4gICAgc2VsZWN0aW9uOiBUb2tlblNlbGVjdGlvbixcbiAgICByZXE6IEdlbmVyYXRlUmVxdWVzdCxcbiAgICBvbkRlbHRhPzogKHRleHQ6IHN0cmluZykgPT4gdm9pZCxcbiAgKTogUHJvbWlzZTxHZW5lcmF0ZVJlc3VsdD4ge1xuICAgIGNvbnN0IHN0YXJ0ZWRBdCA9IERhdGUubm93KCk7XG4gICAgbGV0IGZpcnN0RGVsdGFBdDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIGxldCB0ZXh0ID0gXCJcIjtcbiAgICBsZXQgb3V0cHV0TWVzc2FnZUFjY2VwdGVkID0gZmFsc2U7XG4gICAgY29uc3QgbWVzc2FnZVBoYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgY29uc3Qgc3RyZWFtZWRNZXNzYWdlSWRzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgbGV0IHVzYWdlID0ge1xuICAgICAgdG90YWxUb2tlbnM6IDAsXG4gICAgICBpbnB1dFRva2VuczogMCxcbiAgICAgIG91dHB1dFRva2VuczogMCxcbiAgICAgIGNhY2hlZElucHV0VG9rZW5zOiAwLFxuICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiAwLFxuICAgIH07XG4gICAgY29uc3QgaW1hZ2VzOiBHZW5lcmF0ZWRJbWFnZVtdID0gW107XG4gICAgbGV0IGltYWdlQXR0ZW1wdGVkID0gZmFsc2U7XG4gICAgY29uc3QgYXV0byA9IHJlcS5pbWFnZUdlbmVyYXRpb24gPT09IFwiYXV0b1wiO1xuICAgIGNvbnN0IGltYWdlQ2FsbHMgPSBuZXcgTWFwPHN0cmluZywgSW1hZ2VUb29sQXJndW1lbnRzPigpO1xuICAgIGNvbnN0IGltYWdlQ2FsbElkcyA9IG5ldyBTZXQ8dW5rbm93bj4oKTtcbiAgICBsZXQgaW1hZ2VUb29sQXR0ZW1wdGVkID0gZmFsc2U7XG4gICAgbGV0IGRyaXZlckNvbXBsZXRlZCA9IGZhbHNlO1xuICAgIGxldCBzZXJ2aW5nTW9kZWwgPSByZXEubW9kZWwgPz8gXCJcIjtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHNlbGVjdGlvbi5tZXRhZGF0YTtcbiAgICBjb25zdCBkcml2ZXJSZXN1bHQgPSAoKTogR2VuZXJhdGVSZXN1bHQgPT4gKHtcbiAgICAgIHRleHQsXG4gICAgICB0b2tlbk5hbWU6IG1ldGFkYXRhLm5hbWUsXG4gICAgICB1c2FnZSxcbiAgICAgIGR1cmF0aW9uTXM6IERhdGUubm93KCkgLSBzdGFydGVkQXQsXG4gICAgICB0dGZ0TXM6IGZpcnN0RGVsdGFBdCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IGZpcnN0RGVsdGFBdCAtIHN0YXJ0ZWRBdCxcbiAgICAgIG1vZGVsOiBzZXJ2aW5nTW9kZWwsXG4gICAgICAuLi4oc2VydmluZ01vZGVsICE9PSByZXEubW9kZWwgPyB7IHJlcXVlc3RlZE1vZGVsOiByZXEubW9kZWwgfSA6IHt9KSxcbiAgICAgIHRocmVhZENvb3JkOiB7IHdvcmtlcklkOiBzZWxlY3Rpb24udG9rZW5JZCwgdGhyZWFkSWQ6IHJlcS5wcm9tcHRDYWNoZUtleSA/PyBcIlwiLCBlcG9jaDogLTEgfSxcbiAgICB9KTtcbiAgICBjb25zdCBjbGllbnRFbnRyeSA9IHRoaXMuYWNxdWlyZUNsaWVudChzZWxlY3Rpb24pO1xuICAgIHRyeSB7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIGNsaWVudEVudHJ5LmNsaWVudC5yZXNwb25zZXMoXG4gICAgICAgIHJlcXVlc3RPcHRpb25zKHJlcSksXG4gICAgICAgIHJlcS5hYm9ydFNpZ25hbCxcbiAgICAgICkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIHJlcS5zdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlICYmXG4gICAgICAgICAgZXZlbnQudHlwZSA9PT0gXCJvdXRwdXQtaXRlbVwiICYmXG4gICAgICAgICAgZXZlbnQuaXRlbS50eXBlID09PSBcIm1lc3NhZ2VcIiAmJlxuICAgICAgICAgIHR5cGVvZiBldmVudC5pdGVtLmlkID09PSBcInN0cmluZ1wiICYmXG4gICAgICAgICAgdHlwZW9mIGV2ZW50Lml0ZW0ucGhhc2UgPT09IFwic3RyaW5nXCJcbiAgICAgICAgKSB7XG4gICAgICAgICAgbWVzc2FnZVBoYXNlcy5zZXQoZXZlbnQuaXRlbS5pZCwgZXZlbnQuaXRlbS5waGFzZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwidGV4dC1kZWx0YVwiKSB7XG4gICAgICAgICAgaWYgKG91dHB1dE1lc3NhZ2VBY2NlcHRlZCkgY29udGludWU7XG4gICAgICAgICAgaWYgKHJlcS5zdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlICYmIGV2ZW50Lml0ZW1JZCkge1xuICAgICAgICAgICAgLy8gQnVmZmVyIGNvbW1lbnRhcnkvdW5jbGFzc2lmaWVkIG1lc3NhZ2VzIHVudGlsIHRoZWlyIGNvbXBsZXRlZCBpdGVtLlxuICAgICAgICAgICAgLy8gS25vd24gZmluYWwgYW5zd2VycyByZXRhaW4gaW5jcmVtZW50YWwgc3RyZWFtaW5nLlxuICAgICAgICAgICAgaWYgKG1lc3NhZ2VQaGFzZXMuZ2V0KGV2ZW50Lml0ZW1JZCkgIT09IFwiZmluYWxfYW5zd2VyXCIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgc3RyZWFtZWRNZXNzYWdlSWRzLmFkZChldmVudC5pdGVtSWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmaXJzdERlbHRhQXQgPz89IERhdGUubm93KCk7XG4gICAgICAgICAgdGV4dCArPSBldmVudC50ZXh0O1xuICAgICAgICAgIG9uRGVsdGE/LihldmVudC50ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBldmVudC50eXBlID09PSBcIm91dHB1dC1pdGVtXCIgJiZcbiAgICAgICAgICBldmVudC5jb21wbGV0ZWQgJiZcbiAgICAgICAgICBldmVudC5pdGVtLnR5cGUgPT09IFwibWVzc2FnZVwiICYmXG4gICAgICAgICAgIW91dHB1dE1lc3NhZ2VBY2NlcHRlZCAmJlxuICAgICAgICAgIHJlcS5zdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlICYmXG4gICAgICAgICAgQXJyYXkuaXNBcnJheShldmVudC5pdGVtLmNvbnRlbnQpXG4gICAgICAgICkge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VUZXh0ID0gZXZlbnQuaXRlbS5jb250ZW50XG4gICAgICAgICAgICAuZmlsdGVyKChwYXJ0KSA9PiBwYXJ0Py50eXBlID09PSBcIm91dHB1dF90ZXh0XCIgJiYgdHlwZW9mIHBhcnQudGV4dCA9PT0gXCJzdHJpbmdcIilcbiAgICAgICAgICAgIC5tYXAoKHBhcnQpID0+IHBhcnQudGV4dClcbiAgICAgICAgICAgIC5qb2luKFwiXCIpO1xuICAgICAgICAgIC8vIEEgdmFsaWQgY2xpZW50IHRvb2wgcmVxdWVzdCBlbmRzIHRoaXMgYXBwbGljYXRpb24gdHVybi4gTGF0ZXIgYW5zd2VycyBjYW5ub3RcbiAgICAgICAgICAvLyBrbm93IGl0cyByZXN1bHQgeWV0LiBOZXZlciBzcGxpdC9yZXBhaXIgbWFsZm9ybWVkIEpTT04gd2l0aGluIGEgbWVzc2FnZS5cbiAgICAgICAgICBjb25zdCBwaGFzZSA9IHR5cGVvZiBldmVudC5pdGVtLnBoYXNlID09PSBcInN0cmluZ1wiID8gZXZlbnQuaXRlbS5waGFzZSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAobWVzc2FnZVRleHQpIG91dHB1dE1lc3NhZ2VBY2NlcHRlZCA9IHJlcS5zdG9wQWZ0ZXJPdXRwdXRNZXNzYWdlKG1lc3NhZ2VUZXh0LCBwaGFzZSk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgdHlwZW9mIGV2ZW50Lml0ZW0uaWQgPT09IFwic3RyaW5nXCIgJiZcbiAgICAgICAgICAgICFzdHJlYW1lZE1lc3NhZ2VJZHMuaGFzKGV2ZW50Lml0ZW0uaWQpICYmXG4gICAgICAgICAgICAocGhhc2UgIT09IFwiY29tbWVudGFyeVwiIHx8IG91dHB1dE1lc3NhZ2VBY2NlcHRlZCkgJiZcbiAgICAgICAgICAgIG1lc3NhZ2VUZXh0XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICBmaXJzdERlbHRhQXQgPz89IERhdGUubm93KCk7XG4gICAgICAgICAgICB0ZXh0ICs9IG1lc3NhZ2VUZXh0O1xuICAgICAgICAgICAgb25EZWx0YT8uKG1lc3NhZ2VUZXh0KTtcbiAgICAgICAgICAgIHN0cmVhbWVkTWVzc2FnZUlkcy5hZGQoZXZlbnQuaXRlbS5pZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiaW1hZ2VcIikge1xuICAgICAgICAgIGlmIChhdXRvKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcIlVuZXhwZWN0ZWQgaG9zdGVkIGltYWdlIGdlbmVyYXRpb25cIik7XG4gICAgICAgICAgaW1hZ2VBdHRlbXB0ZWQgPSB0cnVlO1xuICAgICAgICAgIGltYWdlcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IGV2ZW50LmJhc2U2NCxcbiAgICAgICAgICAgIG1lZGlhVHlwZTogZXZlbnQubWltZVR5cGUsXG4gICAgICAgICAgICByZXZpc2VkUHJvbXB0OiBldmVudC5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgICAgICAuLi4oZXZlbnQuZ2VuZXJhdGlvbiA/IHsgZ2VuZXJhdGlvbjogZXZlbnQuZ2VuZXJhdGlvbiB9IDoge30pLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwib3V0cHV0LWl0ZW1cIiAmJiBldmVudC5pdGVtLnR5cGUgPT09IFwiaW1hZ2VfZ2VuZXJhdGlvbl9jYWxsXCIpIHtcbiAgICAgICAgICBpZiAoYXV0bylcbiAgICAgICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJVbmV4cGVjdGVkIGhvc3RlZCBpbWFnZSBnZW5lcmF0aW9uXCIpO1xuICAgICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChhdXRvICYmIGV2ZW50LnR5cGUgPT09IFwib3V0cHV0LWl0ZW1cIiAmJiBldmVudC5pdGVtLnR5cGUgPT09IFwiZnVuY3Rpb25fY2FsbFwiKSB7XG4gICAgICAgICAgaWYgKGV2ZW50Lml0ZW0ubmFtZSAhPT0gSU1BR0VfVE9PTCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcIlVuZXhwZWN0ZWQgYXV0b21hdGljIGltYWdlIHRvb2wgY2FsbFwiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW1hZ2VUb29sQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgICBpbWFnZUNhbGxJZHMuYWRkKGV2ZW50Lml0ZW0uY2FsbF9pZCk7XG4gICAgICAgICAgaWYgKCFldmVudC5jb21wbGV0ZWQpIGNvbnRpbnVlO1xuICAgICAgICAgIGNvbnN0IGlkID0gZXZlbnQuaXRlbS5jYWxsX2lkO1xuICAgICAgICAgIGxldCBhcmdzOiB1bmtub3duO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhcmdzID0gSlNPTi5wYXJzZShTdHJpbmcoZXZlbnQuaXRlbS5hcmd1bWVudHMpKTtcbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJJbnZhbGlkIGltYWdlIHRvb2wgYXJndW1lbnRzXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICB0eXBlb2YgaWQgIT09IFwic3RyaW5nXCIgfHxcbiAgICAgICAgICAgICFpZCB8fFxuICAgICAgICAgICAgIWFyZ3MgfHxcbiAgICAgICAgICAgIHR5cGVvZiBhcmdzICE9PSBcIm9iamVjdFwiIHx8XG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3MpIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhhcmdzKS5sZW5ndGggIT09IDMgfHxcbiAgICAgICAgICAgICEoXCJwcm9tcHRcIiBpbiBhcmdzKSB8fFxuICAgICAgICAgICAgdHlwZW9mIGFyZ3MucHJvbXB0ICE9PSBcInN0cmluZ1wiIHx8XG4gICAgICAgICAgICAhYXJncy5wcm9tcHQudHJpbSgpIHx8XG4gICAgICAgICAgICAhKFwidHJhbnNwYXJlbnRfYmFja2dyb3VuZFwiIGluIGFyZ3MpIHx8XG4gICAgICAgICAgICB0eXBlb2YgYXJncy50cmFuc3BhcmVudF9iYWNrZ3JvdW5kICE9PSBcImJvb2xlYW5cIiB8fFxuICAgICAgICAgICAgIShcIm51bV9sYXN0X2ltYWdlc190b19pbmNsdWRlXCIgaW4gYXJncykgfHxcbiAgICAgICAgICAgIHR5cGVvZiBhcmdzLm51bV9sYXN0X2ltYWdlc190b19pbmNsdWRlICE9PSBcIm51bWJlclwiIHx8XG4gICAgICAgICAgICAhTnVtYmVyLmlzSW50ZWdlcihhcmdzLm51bV9sYXN0X2ltYWdlc190b19pbmNsdWRlKSB8fFxuICAgICAgICAgICAgYXJncy5udW1fbGFzdF9pbWFnZXNfdG9faW5jbHVkZSA8IDAgfHxcbiAgICAgICAgICAgIGFyZ3MubnVtX2xhc3RfaW1hZ2VzX3RvX2luY2x1ZGUgPiA1XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIFwiSW52YWxpZCBpbWFnZSB0b29sIGFyZ3VtZW50c1wiKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpbWFnZUNhbGxzLmdldChpZCk7XG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJldmlvdXMgJiZcbiAgICAgICAgICAgIChwcmV2aW91cy5wcm9tcHQgIT09IGFyZ3MucHJvbXB0IHx8XG4gICAgICAgICAgICAgIHByZXZpb3VzLnRyYW5zcGFyZW50X2JhY2tncm91bmQgIT09IGFyZ3MudHJhbnNwYXJlbnRfYmFja2dyb3VuZCB8fFxuICAgICAgICAgICAgICBwcmV2aW91cy5udW1fbGFzdF9pbWFnZXNfdG9faW5jbHVkZSAhPT0gYXJncy5udW1fbGFzdF9pbWFnZXNfdG9faW5jbHVkZSlcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJDb25mbGljdGluZyBpbWFnZSB0b29sIGNhbGxzXCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbWFnZUNhbGxzLnNldChpZCwge1xuICAgICAgICAgICAgcHJvbXB0OiBhcmdzLnByb21wdCxcbiAgICAgICAgICAgIHRyYW5zcGFyZW50X2JhY2tncm91bmQ6IGFyZ3MudHJhbnNwYXJlbnRfYmFja2dyb3VuZCxcbiAgICAgICAgICAgIG51bV9sYXN0X2ltYWdlc190b19pbmNsdWRlOiBhcmdzLm51bV9sYXN0X2ltYWdlc190b19pbmNsdWRlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiY29tcGxldGVkXCIpIHtcbiAgICAgICAgICBjb25zdCBpbWFnZVVzYWdlID0gZXZlbnQuaW1hZ2VHZW5lcmF0aW9uPy51c2FnZTtcbiAgICAgICAgICAvLyBUaGUgYmFja2VuZCBhbHNvIHJlcG9ydHMgYWxsLXplcm8gaW1hZ2UgdXNhZ2UgZm9yIHRleHQtb25seSByZXNwb25zZXMuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYXV0byAmJlxuICAgICAgICAgICAgaW1hZ2VVc2FnZSAmJlxuICAgICAgICAgICAgKGltYWdlVXNhZ2UuaW5wdXRfdG9rZW5zID4gMCB8fFxuICAgICAgICAgICAgICBpbWFnZVVzYWdlLm91dHB1dF90b2tlbnMgPiAwIHx8XG4gICAgICAgICAgICAgIGltYWdlVXNhZ2UudG90YWxfdG9rZW5zID4gMClcbiAgICAgICAgICApXG4gICAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIFwiVW5leHBlY3RlZCBob3N0ZWQgaW1hZ2UgZ2VuZXJhdGlvblwiKTtcbiAgICAgICAgICBkcml2ZXJDb21wbGV0ZWQgPSB0cnVlO1xuICAgICAgICAgIHNlcnZpbmdNb2RlbCA9IGV2ZW50Lm1vZGVsID8/IHNlcnZpbmdNb2RlbDtcbiAgICAgICAgICBpZiAoZXZlbnQudXNhZ2UpIHtcbiAgICAgICAgICAgIHVzYWdlID0ge1xuICAgICAgICAgICAgICB0b3RhbFRva2VuczogZXZlbnQudXNhZ2UudG90YWxUb2tlbnMsXG4gICAgICAgICAgICAgIGlucHV0VG9rZW5zOiBldmVudC51c2FnZS5pbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgb3V0cHV0VG9rZW5zOiBldmVudC51c2FnZS5vdXRwdXRUb2tlbnMsXG4gICAgICAgICAgICAgIGNhY2hlZElucHV0VG9rZW5zOiBldmVudC51c2FnZS5jYWNoZWRJbnB1dFRva2VucyxcbiAgICAgICAgICAgICAgcmVhc29uaW5nT3V0cHV0VG9rZW5zOiBldmVudC51c2FnZS5yZWFzb25pbmdUb2tlbnMsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZXZlbnQuaW1hZ2VHZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICBjb25zdCBob3N0ZWRJbWFnZXMgPSBpbWFnZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAoaW1hZ2UpID0+IGltYWdlLmdlbmVyYXRpb24/LnJvdXRlID09PSBcImNvZGV4LXJlc3BvbnNlc1wiLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBpbWFnZV0gb2YgaG9zdGVkSW1hZ2VzLmVudHJpZXMoKSkge1xuICAgICAgICAgICAgICBpbWFnZS5nZW5lcmF0aW9uID0ge1xuICAgICAgICAgICAgICAgIHJvdXRlOiBcImNvZGV4LXJlc3BvbnNlc1wiLFxuICAgICAgICAgICAgICAgIC4uLihldmVudC5pbWFnZUdlbmVyYXRpb24ubW9kZWwgPyB7IG1vZGVsOiBldmVudC5pbWFnZUdlbmVyYXRpb24ubW9kZWwgfSA6IHt9KSxcbiAgICAgICAgICAgICAgICAuLi5pbWFnZS5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgICAgIC8vIFRvb2wgdXNhZ2UgY292ZXJzIHRoZSB3aG9sZSByZXNwb25zZSwgbm90IGVhY2ggcmV0dXJuZWQgaW1hZ2UuXG4gICAgICAgICAgICAgICAgLi4uKGluZGV4ID09PSAwICYmIGV2ZW50LmltYWdlR2VuZXJhdGlvbi51c2FnZVxuICAgICAgICAgICAgICAgICAgPyB7IHVzYWdlOiBldmVudC5pbWFnZUdlbmVyYXRpb24udXNhZ2UgfVxuICAgICAgICAgICAgICAgICAgOiB7fSksXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LnR5cGUgPT09IFwiZXJyb3JcIikge1xuICAgICAgICAgIGlmIChyZXEuaW1hZ2VHZW5lcmF0aW9uKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBldmVudC5lcnJvci5tZXNzYWdlKTtcbiAgICAgICAgICB0aHJvdyBldmVudC5lcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGF1dG8gJiYgaW1hZ2VUb29sQXR0ZW1wdGVkKSB7XG4gICAgICAgIGlmICghZHJpdmVyQ29tcGxldGVkIHx8IGltYWdlQ2FsbHMuc2l6ZSAhPT0gMSB8fCBpbWFnZUNhbGxJZHMuc2l6ZSAhPT0gMSkge1xuICAgICAgICAgIHRocm93IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcImluY29tcGxldGVcIiwgXCJFeHBlY3RlZCBvbmUgY29tcGxldGVkIGltYWdlIHRvb2wgY2FsbFwiKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVxLmFib3J0U2lnbmFsPy5hYm9ydGVkKSB0aHJvdyBhYm9ydEVycm9yKHJlcS5hYm9ydFNpZ25hbCk7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBbLi4uaW1hZ2VDYWxscy52YWx1ZXMoKV1bMF0hO1xuICAgICAgICBjb25zdCByZWZlcmVuY2VDb3VudCA9IGFyZ3MubnVtX2xhc3RfaW1hZ2VzX3RvX2luY2x1ZGU7XG4gICAgICAgIGNvbnN0IHJlZmVyZW5jZXMgPSByZWZlcmVuY2VDb3VudCA/IGltYWdlUmVmZXJlbmNlcyhyZXEpIDogW107XG4gICAgICAgIGlmIChyZWZlcmVuY2VDb3VudCA+IHJlZmVyZW5jZXMubGVuZ3RoKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICAgICAgXCJpbmNvbXBsZXRlXCIsXG4gICAgICAgICAgICBcIlJlcXVlc3RlZCBpbWFnZSByZWZlcmVuY2VzIGFyZSB1bmF2YWlsYWJsZVwiLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGltYWdlQ29tcGxldGVkID0gZmFsc2U7XG4gICAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgY2xpZW50RW50cnkuY2xpZW50LnJlc3BvbnNlcyhcbiAgICAgICAgICB7XG4gICAgICAgICAgICBtb2RlbDogXCJncHQtaW1hZ2UtMlwiLFxuICAgICAgICAgICAgaGlzdG9yeTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHlwZTogXCJtZXNzYWdlXCIsXG4gICAgICAgICAgICAgICAgcm9sZTogXCJ1c2VyXCIsXG4gICAgICAgICAgICAgICAgY29udGVudDogW1xuICAgICAgICAgICAgICAgICAgeyB0eXBlOiBcImlucHV0X3RleHRcIiwgdGV4dDogYXJncy5wcm9tcHQgfSxcbiAgICAgICAgICAgICAgICAgIC4uLihyZWZlcmVuY2VDb3VudCA/IHJlZmVyZW5jZXMuc2xpY2UoLXJlZmVyZW5jZUNvdW50KSA6IFtdKSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGltYWdlR2VuZXJhdGlvbjoge1xuICAgICAgICAgICAgICBxdWFsaXR5OiByZXEuaW1hZ2VHZW5lcmF0aW9uT3B0aW9ucz8ucXVhbGl0eSxcbiAgICAgICAgICAgICAgc2l6ZTogcmVxLmltYWdlR2VuZXJhdGlvbk9wdGlvbnM/LnNpemUsXG4gICAgICAgICAgICAgIG91dHB1dF9mb3JtYXQ6IFwicG5nXCIsXG4gICAgICAgICAgICAgIGJhY2tncm91bmQ6IGFyZ3MudHJhbnNwYXJlbnRfYmFja2dyb3VuZCA/IFwidHJhbnNwYXJlbnRcIiA6IFwib3BhcXVlXCIsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVxLmFib3J0U2lnbmFsLFxuICAgICAgICApKSB7XG4gICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwiaW1hZ2VcIilcbiAgICAgICAgICAgIGltYWdlcy5wdXNoKHtcbiAgICAgICAgICAgICAgZGF0YTogZXZlbnQuYmFzZTY0LFxuICAgICAgICAgICAgICBtZWRpYVR5cGU6IGV2ZW50Lm1pbWVUeXBlLFxuICAgICAgICAgICAgICByZXZpc2VkUHJvbXB0OiBldmVudC5yZXZpc2VkUHJvbXB0ID8/IG51bGwsXG4gICAgICAgICAgICAgIC4uLihldmVudC5nZW5lcmF0aW9uID8geyBnZW5lcmF0aW9uOiBldmVudC5nZW5lcmF0aW9uIH0gOiB7fSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICBlbHNlIGlmIChldmVudC50eXBlID09PSBcImNvbXBsZXRlZFwiKSBpbWFnZUNvbXBsZXRlZCA9IHRydWU7XG4gICAgICAgICAgZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gXCJlcnJvclwiKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBldmVudC5lcnJvci5tZXNzYWdlLCB7XG4gICAgICAgICAgICAgIGNhdXNlOiBldmVudC5lcnJvcixcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGltYWdlQXR0ZW1wdGVkID0gdHJ1ZTtcbiAgICAgICAgaWYgKCFpbWFnZUNvbXBsZXRlZClcbiAgICAgICAgICB0aHJvdyBuZXcgSW1hZ2VHZW5lcmF0aW9uRXJyb3IoXCJpbmNvbXBsZXRlXCIsIFwiSW1hZ2UgZ2VuZXJhdGlvbiBkaWQgbm90IGNvbXBsZXRlXCIpO1xuICAgICAgfVxuICAgICAgaWYgKGF1dG8gJiYgaW1hZ2VBdHRlbXB0ZWQgJiYgIWRyaXZlckNvbXBsZXRlZClcbiAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFwiaW5jb21wbGV0ZVwiLCBcIkltYWdlIGdlbmVyYXRpb24gcmVzcG9uc2UgZGlkIG5vdCBjb21wbGV0ZVwiKTtcbiAgICAgIGlmIChyZXEuYWJvcnRTaWduYWw/LmFib3J0ZWQpIHRocm93IGFib3J0RXJyb3IocmVxLmFib3J0U2lnbmFsKTtcbiAgICAgIGlmICgocmVxLmltYWdlR2VuZXJhdGlvbiA9PT0gdHJ1ZSB8fCAoYXV0byAmJiBpbWFnZUF0dGVtcHRlZCkpICYmIGltYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEltYWdlR2VuZXJhdGlvbkVycm9yKFxuICAgICAgICAgIGltYWdlQXR0ZW1wdGVkID8gXCJpbmNvbXBsZXRlXCIgOiBcIm5vdF9jYWxsZWRcIixcbiAgICAgICAgICBpbWFnZUF0dGVtcHRlZFxuICAgICAgICAgICAgPyBcImltYWdlIGdlbmVyYXRpb24gZGlkIG5vdCBjb21wbGV0ZVwiXG4gICAgICAgICAgICA6IFwibW9kZWwgZGlkIG5vdCBjYWxsIGltYWdlIGdlbmVyYXRpb25cIixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKGF1dG8gJiYgZHJpdmVyQ29tcGxldGVkICYmIGltYWdlVG9vbEF0dGVtcHRlZCkge1xuICAgICAgICBjb25zdCBmYWlsdXJlID1cbiAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEltYWdlR2VuZXJhdGlvbkVycm9yXG4gICAgICAgICAgICA/IGVycm9yXG4gICAgICAgICAgICA6IG5ldyBJbWFnZUdlbmVyYXRpb25FcnJvcihcbiAgICAgICAgICAgICAgICBcImluY29tcGxldGVcIixcbiAgICAgICAgICAgICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvciksXG4gICAgICAgICAgICAgICAgeyBjYXVzZTogZXJyb3IgfSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIGZhaWx1cmUubmFtZSA9IGVycm9yLm5hbWU7XG4gICAgICAgIC8vIE9ubHkgdGhlIGNvbXBsZXRlZCBjaGF0IHN0YWdlIGlzIGNoYXJnZWFibGUgaGVyZTsgZGlzY2FyZCBwYXJ0aWFsIGltYWdlIG91dHB1dC5cbiAgICAgICAgZmFpbHVyZS5jb21wbGV0ZWREcml2ZXIgPSBkcml2ZXJSZXN1bHQoKTtcbiAgICAgICAgdGhyb3cgZmFpbHVyZTtcbiAgICAgIH1cbiAgICAgIHRocm93IGVycm9yO1xuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLnJlbGVhc2VDbGllbnQoY2xpZW50RW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgLi4uZHJpdmVyUmVzdWx0KCksXG4gICAgICAuLi4oaW1hZ2VzLmxlbmd0aCA/IHsgaW1hZ2VzIH0gOiB7fSksXG4gICAgfTtcbiAgfVxuXG4gIC8qKiDshLjrjIDqsIAg67CU64CQIGNsaWVudCDripQg7IKs7JqpIOykkeyduCDsmpTssq3snbQg64Gd64KcIOuSpOyXkCDri6vripTri6QuICovXG4gIGFjcXVpcmVDbGllbnQoc2VsZWN0aW9uOiBUb2tlblNlbGVjdGlvbik6IENsaWVudEVudHJ5IHtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHNlbGVjdGlvbi5tZXRhZGF0YTtcbiAgICBsZXQgZW50cnkgPSB0aGlzLmNsaWVudHMuZ2V0KHNlbGVjdGlvbi50b2tlbklkKTtcbiAgICBpZiAoZW50cnkgJiYgZW50cnkuZ2VuZXJhdGlvbiAhPT0gbWV0YWRhdGEuZ2VuZXJhdGlvbikge1xuICAgICAgdGhpcy5yZXRpcmVDbGllbnQoc2VsZWN0aW9uLnRva2VuSWQpO1xuICAgICAgZW50cnkgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmICghZW50cnkpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IHRoaXMuY2xpZW50RmFjdG9yeShcbiAgICAgICAge1xuICAgICAgICAgIGNyZWRlbnRpYWxzOiB7XG4gICAgICAgICAgICBhY2Nlc3NUb2tlbjogbWV0YWRhdGEuY3JlZGVudGlhbHMuYWNjZXNzVG9rZW4sXG4gICAgICAgICAgICBhY2NvdW50SWQ6IG1ldGFkYXRhLmNyZWRlbnRpYWxzLmFjY291bnRJZCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHRyYW5zcG9ydEtpbmQ6IHRoaXMudHJhbnNwb3J0S2luZCxcbiAgICAgICAgICBmZXRjaDogdGhpcy5mZXRjaEltcGwsXG4gICAgICAgICAgcmVmcmVzaENyZWRlbnRpYWxzOiAoKSA9PiB0aGlzLnJlZnJlc2hDcmVkZW50aWFscyhzZWxlY3Rpb24udG9rZW5JZCksXG4gICAgICAgIH0sXG4gICAgICAgIHNlbGVjdGlvbi50b2tlbklkLFxuICAgICAgKTtcbiAgICAgIGVudHJ5ID0geyBnZW5lcmF0aW9uOiBtZXRhZGF0YS5nZW5lcmF0aW9uLCBjbGllbnQsIGluRmxpZ2h0OiAwLCByZXRpcmVkOiBmYWxzZSB9O1xuICAgICAgdGhpcy5jbGllbnRzLnNldChzZWxlY3Rpb24udG9rZW5JZCwgZW50cnkpO1xuICAgIH1cbiAgICBlbnRyeS5pbkZsaWdodCsrO1xuICAgIHJldHVybiBlbnRyeTtcbiAgfVxuXG4gIHJlbGVhc2VDbGllbnQoZW50cnk6IENsaWVudEVudHJ5KTogdm9pZCB7XG4gICAgZW50cnkuaW5GbGlnaHQgPSBNYXRoLm1heCgwLCBlbnRyeS5pbkZsaWdodCAtIDEpO1xuICAgIGlmIChlbnRyeS5yZXRpcmVkICYmIGVudHJ5LmluRmxpZ2h0ID09PSAwKSB7XG4gICAgICB0aGlzLnJldGlyZWRDbGllbnRzLmRlbGV0ZShlbnRyeSk7XG4gICAgICBlbnRyeS5jbGllbnQuY2xvc2U/LigpO1xuICAgIH1cbiAgfVxuXG4gIHJldGlyZUNsaWVudCh0b2tlbklkOiBudW1iZXIpOiB2b2lkIHtcbiAgICBjb25zdCBlbnRyeSA9IHRoaXMuY2xpZW50cy5nZXQodG9rZW5JZCk7XG4gICAgaWYgKCFlbnRyeSkgcmV0dXJuO1xuICAgIHRoaXMuY2xpZW50cy5kZWxldGUodG9rZW5JZCk7XG4gICAgZW50cnkucmV0aXJlZCA9IHRydWU7XG4gICAgaWYgKGVudHJ5LmluRmxpZ2h0ID09PSAwKSBlbnRyeS5jbGllbnQuY2xvc2U/LigpO1xuICAgIGVsc2UgdGhpcy5yZXRpcmVkQ2xpZW50cy5hZGQoZW50cnkpO1xuICB9XG5cbiAgLy8g7ISg7Zi4IO2GoO2BsOydtCBxdW90YeulvCDthrXqs7ztlZjrqbQg64uk66W4IO2GoO2BsCDsobDtmozsmYAgd2VpZ2h0ZWQg7IOB7YOcIOuzgOqyveydhCDsg53rnrXtlZzri6QuXG4gIGFzeW5jIHNlbGVjdFRva2VuKFxuICAgIHByZWZlcnJlZFRva2VuSWQ6IG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICByZXF1aXJlUHJlZmVycmVkVG9rZW46IGJvb2xlYW4sXG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbCxcbiAgKTogUHJvbWlzZTxUb2tlblNlbGVjdGlvbj4ge1xuICAgIGlmIChwcmVmZXJyZWRUb2tlbklkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHByZWZlcnJlZCA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQocHJlZmVycmVkVG9rZW5JZCk7XG4gICAgICBpZiAocHJlZmVycmVkPy5hY3RpdmUgJiYgKGF3YWl0IHRoaXMuaXNRdW90YUVsaWdpYmxlKHByZWZlcnJlZFRva2VuSWQsIHByZWZlcnJlZCwgc2lnbmFsKSkpIHtcbiAgICAgICAgcmV0dXJuIHsgdG9rZW5JZDogcHJlZmVycmVkVG9rZW5JZCwgbWV0YWRhdGE6IHByZWZlcnJlZCB9O1xuICAgICAgfVxuICAgICAgaWYgKHJlcXVpcmVQcmVmZXJyZWRUb2tlbikge1xuICAgICAgICBpZiAoIXByZWZlcnJlZD8uYWN0aXZlKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcmVmZXJyZWQgb3BlbmFpIHRva2VuICR7cHJlZmVycmVkVG9rZW5JZH0gaXMgbm90IGF2YWlsYWJsZWApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRocmVzaG9sZCA9IHByZWZlcnJlZC5xdW90YVRocmVzaG9sZDtcbiAgICAgICAgaWYgKHRocmVzaG9sZCAhPT0gbnVsbCAmJiB0aHJlc2hvbGQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IG5ldyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IoXG4gICAgICAgICAgICBxdW90YU1lc3NhZ2UoW3sgbmFtZTogcHJlZmVycmVkLm5hbWUsIHRocmVzaG9sZCB9XSksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIOy9nOuTnCDsupDsi5zsl5DshJwg7Yag7YGwIOyImOunjO2BvCDsobDtmowg7KeA7Jew7J20IOyMk+ydtOyngCDslYrrj4TroZ0g67OR66CsIO2MkOygle2VnOuLpC5cbiAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXVxuICAgICAgICAuZmlsdGVyKChbLCB0b2tlbl0pID0+IHRva2VuLmFjdGl2ZSlcbiAgICAgICAgLm1hcChhc3luYyAoW2lkLCB0b2tlbl0pID0+ICh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgdG9rZW4sXG4gICAgICAgICAgZWxpZ2libGU6IGF3YWl0IHRoaXMuaXNRdW90YUVsaWdpYmxlKGlkLCB0b2tlbiwgc2lnbmFsKSxcbiAgICAgICAgfSkpLFxuICAgICk7XG4gICAgY29uc3QgZWxpZ2libGUgPSBuZXcgU2V0KGNoZWNrcy5maWx0ZXIoKGMpID0+IGMuZWxpZ2libGUpLm1hcCgoYykgPT4gYy5pZCkpO1xuICAgIGlmIChlbGlnaWJsZS5zaXplID09PSAwKSB7XG4gICAgICBjb25zdCBvdmVyID0gY2hlY2tzXG4gICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgKGMpID0+XG4gICAgICAgICAgICAhYy5lbGlnaWJsZSAmJiBjLnRva2VuLnF1b3RhVGhyZXNob2xkICE9PSBudWxsICYmIGMudG9rZW4ucXVvdGFUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCxcbiAgICAgICAgKVxuICAgICAgICAubWFwKChjKSA9PiAoeyBuYW1lOiBjLnRva2VuLm5hbWUsIHRocmVzaG9sZDogYy50b2tlbi5xdW90YVRocmVzaG9sZCBhcyBudW1iZXIgfSkpO1xuICAgICAgaWYgKG92ZXIubGVuZ3RoKSB7XG4gICAgICAgIGxvZ2dlci53YXJuKFwicXVvdGFfdGhyZXNob2xkIGdhdGU6IGFsbF9leGNlZWRlZFwiLCB7XG4gICAgICAgICAgcHJvdmlkZXI6IFwib3BlbmFpXCIsXG4gICAgICAgICAgb3ZlclRocmVzaG9sZFRva2Vuczogb3ZlcixcbiAgICAgICAgfSk7XG4gICAgICAgIHRocm93IG5ldyBRdW90YVRocmVzaG9sZEV4Y2VlZGVkRXJyb3IocXVvdGFNZXNzYWdlKG92ZXIpKTtcbiAgICAgIH1cbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5PX09QRU5BSV9XT1JLRVJTXCIpO1xuICAgIH1cbiAgICBjb25zdCBzZWxlY3RlZCA9IHRoaXMuc2VsZWN0b3Iuc2VsZWN0KGVsaWdpYmxlKTtcbiAgICBjb25zdCBtZXRhZGF0YSA9IHNlbGVjdGVkICE9PSBudWxsID8gdGhpcy50b2tlbk1ldGFkYXRhLmdldChzZWxlY3RlZCkgOiB1bmRlZmluZWQ7XG4gICAgaWYgKHNlbGVjdGVkID09PSBudWxsIHx8ICFtZXRhZGF0YSkgdGhyb3cgbmV3IEVycm9yKFwiTk9fT1BFTkFJX1dPUktFUlNcIik7XG4gICAgcmV0dXJuIHsgdG9rZW5JZDogc2VsZWN0ZWQsIG1ldGFkYXRhIH07XG4gIH1cblxuICBzZXRUb2tlbihcbiAgICBpZDogbnVtYmVyLFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBjcmVkZW50aWFsczogT3BlbkFJQ3JlZGVudGlhbHMsXG4gICAgcXVvdGFUaHJlc2hvbGQ6IG51bWJlciB8IG51bGwgfCB1bmRlZmluZWQsXG4gICAgd2VpZ2h0OiBudW1iZXIsXG4gICAgYWN0aXZlOiBib29sZWFuLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBvbGQgPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKTtcbiAgICBpZiAob2xkKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG9sZCwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQsXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgYWN0aXZlLFxuICAgICAgICBnZW5lcmF0aW9uOiBvbGQuZ2VuZXJhdGlvbiArIDEsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy50b2tlbk1ldGFkYXRhLnNldChpZCwge1xuICAgICAgICBuYW1lLFxuICAgICAgICBjcmVkZW50aWFscyxcbiAgICAgICAgcXVvdGFUaHJlc2hvbGQsXG4gICAgICAgIHdlaWdodCxcbiAgICAgICAgYWN0aXZlLFxuICAgICAgICBnZW5lcmF0aW9uOiAxLFxuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuc2VsZWN0b3Iuc2V0VG9rZW4oaWQsIHdlaWdodCk7XG4gICAgdGhpcy5pbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkKTtcbiAgICB0aGlzLnF1b3RhQmxvY2tlZC5kZWxldGUoaWQpO1xuICB9XG5cbiAgYXN5bmMgZ2V0UmF0ZUxpbWl0c0J5VG9rZW5JZChcbiAgICB0b2tlbklkOiBudW1iZXIsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICk6IFByb21pc2U8T3BlbkFJUmF0ZUxpbWl0c1dpdGhNZXRhPiB7XG4gICAgY29uc3QgdG9rZW4gPSB0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KHRva2VuSWQpO1xuICAgIGlmICghdG9rZW4pIHRocm93IG5ldyBFcnJvcihgb3BlbmFpIHRva2VuICR7dG9rZW5JZH0gbm90IGZvdW5kYCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHRva2VuLmdlbmVyYXRpb247XG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5yYXRlTGltaXRzQ2FjaGUuZ2V0KHRva2VuSWQpO1xuICAgIGlmIChcbiAgICAgIGNhY2hlZCAmJlxuICAgICAgY2FjaGVkLmdlbmVyYXRpb24gPT09IHRva2VuLmdlbmVyYXRpb24gJiZcbiAgICAgIERhdGUubm93KCkgLSBjYWNoZWQuY2FjaGVkQXQgPCBPcGVuQUlEaXNwYXRjaGVyLlJBVEVfTElNSVRTX0NBQ0hFX1RUTFxuICAgIClcbiAgICAgIHJldHVybiBjYWNoZWQ7XG5cbiAgICAvLyBUVEwg66eM66OMIOyLnCDsobDtmozrpbwg6rO17Jyg7ZWc64ukLiDstZzstIgg7Zi47Lac7J6Q7J2YIGFib3J066GcIOyLpO2MqO2VtOuPhCBpc1F1b3RhRWxpZ2libGXsnYAgZmFpbC1vcGVu7ZWc64ukLlxuICAgIGNvbnN0IHBlbmRpbmcgPSB0aGlzLnBlbmRpbmdSYXRlTGltaXRzLmdldCh0b2tlbklkKTtcbiAgICBpZiAocGVuZGluZz8udG9rZW4gPT09IHRva2VuICYmIHBlbmRpbmcuZ2VuZXJhdGlvbiA9PT0gZ2VuZXJhdGlvbikgcmV0dXJuIHBlbmRpbmcucHJvbWlzZTtcbiAgICBjb25zdCBmZXRjaFByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVhZE9wZW5BSVF1b3RhVXNhZ2Uoe1xuICAgICAgICBjcmVkZW50aWFsczogdG9rZW4uY3JlZGVudGlhbHMsXG4gICAgICAgIHJlZnJlc2hDcmVkZW50aWFsczogKCkgPT4gdGhpcy5yZWZyZXNoQ3JlZGVudGlhbHModG9rZW5JZCksXG4gICAgICAgIGZldGNoOiB0aGlzLmZldGNoSW1wbCxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZXN1bHQua2luZCA9PT0gXCJsb29rdXBfZmFpbGVkXCIpIHRocm93IG5ldyBFcnJvcihyZXN1bHQucmVhc29uKTtcbiAgICAgIGlmICghcmVzdWx0LnJhdykgdGhyb3cgbmV3IEVycm9yKFwiT3BlbkFJIHF1b3RhIHJlc3BvbnNlIG1pc3NpbmcgcmF3IHJhdGUgbGltaXRzXCIpO1xuICAgICAgY29uc3QgZW50cnkgPSB7IGRhdGE6IHJlc3VsdC5yYXcsIGNhY2hlZEF0OiBEYXRlLm5vdygpLCBnZW5lcmF0aW9uIH07XG4gICAgICBpZiAodGhpcy50b2tlbk1ldGFkYXRhLmdldCh0b2tlbklkKSA9PT0gdG9rZW4gJiYgdG9rZW4uZ2VuZXJhdGlvbiA9PT0gZ2VuZXJhdGlvbikge1xuICAgICAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5zZXQodG9rZW5JZCwgZW50cnkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pKCkuZmluYWxseSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5wZW5kaW5nUmF0ZUxpbWl0cy5nZXQodG9rZW5JZCk/LnByb21pc2UgPT09IGZldGNoUHJvbWlzZSkge1xuICAgICAgICB0aGlzLnBlbmRpbmdSYXRlTGltaXRzLmRlbGV0ZSh0b2tlbklkKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnBlbmRpbmdSYXRlTGltaXRzLnNldCh0b2tlbklkLCB7IHRva2VuLCBnZW5lcmF0aW9uLCBwcm9taXNlOiBmZXRjaFByb21pc2UgfSk7XG4gICAgcmV0dXJuIGZldGNoUHJvbWlzZTtcbiAgfVxuXG4gIGFzeW5jIHJlZnJlc2hDcmVkZW50aWFscyh0b2tlbklkOiBudW1iZXIpIHtcbiAgICBjb25zdCBwcmV2aW91cyA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IHByZXZpb3VzPy5nZW5lcmF0aW9uO1xuICAgIGNvbnN0IHJlZnJlc2hlZCA9IGF3YWl0IGhhbmRsZUNoYXRncHRBdXRoVG9rZW5zUmVmcmVzaCh0b2tlbklkKTtcbiAgICBjb25zdCBjcmVkZW50aWFscyA9IHtcbiAgICAgIGFjY2Vzc1Rva2VuOiByZWZyZXNoZWQuYWNjZXNzVG9rZW4sXG4gICAgICBhY2NvdW50SWQ6IHJlZnJlc2hlZC5jaGF0Z3B0QWNjb3VudElkLFxuICAgIH07XG4gICAgY29uc3QgY3VycmVudCA9IHRoaXMudG9rZW5NZXRhZGF0YS5nZXQodG9rZW5JZCk7XG4gICAgaWYgKCFjdXJyZW50Py5hY3RpdmUpIHRocm93IG5ldyBFcnJvcihgb3BlbmFpIHRva2VuICR7dG9rZW5JZH0gaXMgbm8gbG9uZ2VyIGFjdGl2ZWApO1xuICAgIC8vIEEgc3Vic2NyaWJlciB1cGRhdGUgbWF5IGFscmVhZHkgY29udGFpbiBuZXdlciBjcmVkZW50aWFscy4gTmV2ZXIgb3ZlcndyaXRlIGl0XG4gICAgLy8gd2l0aCB0aGUgcmVzdWx0IG9mIGEgcmVmcmVzaCB0aGF0IHN0YXJ0ZWQgYWdhaW5zdCBhbiBvbGRlciBnZW5lcmF0aW9uLlxuICAgIGlmIChjdXJyZW50ID09PSBwcmV2aW91cyAmJiBjdXJyZW50LmdlbmVyYXRpb24gPT09IGdlbmVyYXRpb24pIHtcbiAgICAgIGN1cnJlbnQuY3JlZGVudGlhbHMgPSB7IC4uLmN1cnJlbnQuY3JlZGVudGlhbHMsIC4uLmNyZWRlbnRpYWxzIH07XG4gICAgICB0aGlzLnJldGlyZUNsaWVudCh0b2tlbklkKTtcbiAgICAgIHRoaXMuaW52YWxpZGF0ZVJhdGVMaW1pdHNDYWNoZSh0b2tlbklkKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGFjY2Vzc1Rva2VuOiBjdXJyZW50LmNyZWRlbnRpYWxzLmFjY2Vzc1Rva2VuLFxuICAgICAgYWNjb3VudElkOiBjdXJyZW50LmNyZWRlbnRpYWxzLmFjY291bnRJZCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgaXNRdW90YUVsaWdpYmxlKGlkOiBudW1iZXIsIHRva2VuOiBUb2tlbk1ldGFkYXRhLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIGlmICh0b2tlbi5xdW90YVRocmVzaG9sZCA9PT0gbnVsbCB8fCB0b2tlbi5xdW90YVRocmVzaG9sZCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gdHJ1ZTtcbiAgICBjb25zdCBnZW5lcmF0aW9uID0gdG9rZW4uZ2VuZXJhdGlvbjtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCByZWFkT3BlbkFJUXVvdGFVc2FnZShhc3luYyAoKSA9PiB0aGlzLmdldFJhdGVMaW1pdHNCeVRva2VuSWQoaWQsIHNpZ25hbCkpO1xuICAgIGlmICh0aGlzLnRva2VuTWV0YWRhdGEuZ2V0KGlkKSAhPT0gdG9rZW4gfHwgdG9rZW4uZ2VuZXJhdGlvbiAhPT0gZ2VuZXJhdGlvbikgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChyZXN1bHQua2luZCA9PT0gXCJsb29rdXBfZmFpbGVkXCIpIHtcbiAgICAgIHRoaXMucXVvdGFCbG9ja2VkLmRlbGV0ZShpZCk7XG4gICAgICBsb2dnZXIud2FybihcInF1b3RhX3RocmVzaG9sZCBnYXRlOiBsb29rdXBfZmFpbF9vcGVuXCIsIHtcbiAgICAgICAgdG9rZW5JZDogaWQsXG4gICAgICAgIHRva2VuTmFtZTogdG9rZW4ubmFtZSxcbiAgICAgICAgbG9va3VwUmVhc29uOiByZXN1bHQucmVhc29uLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHJlc3VsdC51dGlsaXphdGlvblBjdCA+PSB0b2tlbi5xdW90YVRocmVzaG9sZCkge1xuICAgICAgaWYgKCF0aGlzLnF1b3RhQmxvY2tlZC5oYXMoaWQpKVxuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICBgcXVvdGFfdGhyZXNob2xkIGdhdGU6IG92ZXJfdGhyZXNob2xkICR7dG9rZW4ubmFtZX1bJHtpZH1dICgke3Jlc3VsdC51dGlsaXphdGlvblBjdH0lID49ICR7dG9rZW4ucXVvdGFUaHJlc2hvbGR9JSlgLFxuICAgICAgICApO1xuICAgICAgdGhpcy5xdW90YUJsb2NrZWQuYWRkKGlkKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMucXVvdGFCbG9ja2VkLmRlbGV0ZShpZCkpXG4gICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgYHF1b3RhX3RocmVzaG9sZCBnYXRlOiByZWNvdmVyZWQgJHt0b2tlbi5uYW1lfVske2lkfV0gKCR7cmVzdWx0LnV0aWxpemF0aW9uUGN0fSUgPCAke3Rva2VuLnF1b3RhVGhyZXNob2xkfSUpYCxcbiAgICAgICk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpbnZhbGlkYXRlUmF0ZUxpbWl0c0NhY2hlKGlkOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJhdGVMaW1pdHNDYWNoZS5kZWxldGUoaWQpO1xuICB9XG5cbiAgY291bnRBY3RpdmVUb2tlbnMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gWy4uLnRoaXMudG9rZW5NZXRhZGF0YS52YWx1ZXMoKV0uZmlsdGVyKCh0KSA9PiB0LmFjdGl2ZSkubGVuZ3RoO1xuICB9XG5cbiAgLy8g66qo64uI7YSw66eBIO2PtOungeydgCBUVEwg64K0IOy6kOyLnOunjCDsnb3qs6AgZmV0Y2jtlZjsp4Ag7JWK64qU64ukLiDrr7jsobDtmowg7Yag7YGw7J2AIHVzZWRQZXJjZW506rCAIG51bGzsnbTri6QuXG4gIGdldFF1b3RhU25hcHNob3QoKTogQXJyYXk8e1xuICAgIG5hbWU6IHN0cmluZztcbiAgICB1c2VkUGVyY2VudDogbnVtYmVyIHwgbnVsbDtcbiAgICB0aHJlc2hvbGQ6IG51bWJlciB8IG51bGw7XG4gICAgYmxvY2tlZDogYm9vbGVhbjtcbiAgICByZXNldHNBdDogbnVtYmVyIHwgbnVsbDtcbiAgfT4ge1xuICAgIGNvbnN0IG5vdyA9IERhdGUubm93KCk7XG4gICAgcmV0dXJuIFsuLi50aGlzLnRva2VuTWV0YWRhdGEuZW50cmllcygpXVxuICAgICAgLm1hcCgoW2lkLCB0XSkgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZWQgPSB0aGlzLnJhdGVMaW1pdHNDYWNoZS5nZXQoaWQpO1xuICAgICAgICBjb25zdCBmcmVzaCA9XG4gICAgICAgICAgY2FjaGVkICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICBjYWNoZWQuZ2VuZXJhdGlvbiA9PT0gdC5nZW5lcmF0aW9uICYmXG4gICAgICAgICAgbm93IC0gY2FjaGVkLmNhY2hlZEF0IDwgT3BlbkFJRGlzcGF0Y2hlci5SQVRFX0xJTUlUU19DQUNIRV9UVEw7XG4gICAgICAgIGNvbnN0IHByaW1hcnkgPSBmcmVzaCA/IGNhY2hlZC5kYXRhLnJhdGVMaW1pdHM/LnByaW1hcnkgOiB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgbmFtZTogdC5uYW1lLFxuICAgICAgICAgIHVzZWRQZXJjZW50OiBwcmltYXJ5Py51c2VkUGVyY2VudCA/PyBudWxsLFxuICAgICAgICAgIHRocmVzaG9sZDogdC5xdW90YVRocmVzaG9sZCA/PyBudWxsLFxuICAgICAgICAgIGJsb2NrZWQ6IHRoaXMucXVvdGFCbG9ja2VkLmhhcyhpZCksXG4gICAgICAgICAgLy8gd2hhbeydmCBVbml4IOy0iOulvCBlcG9jaCBtc+uhnCDrs4DtmZjtlZzri6QuXG4gICAgICAgICAgcmVzZXRzQXQ6XG4gICAgICAgICAgICBwcmltYXJ5Py5yZXNldHNBdCAhPT0gbnVsbCAmJiBwcmltYXJ5Py5yZXNldHNBdCAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICAgID8gcHJpbWFyeS5yZXNldHNBdCAqIDEwMDBcbiAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICB9O1xuICAgICAgfSlcbiAgICAgIC50b1NvcnRlZCgoYSwgYikgPT4gYS5uYW1lLmxvY2FsZUNvbXBhcmUoYi5u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