@dbx-tools/appkit-web-search 0.9.132 → 0.9.138

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/src/search.js CHANGED
@@ -167,23 +167,22 @@ async function postServing(ctx, url, body, runtime, cacheKey, signal, writeProgr
167
167
  if (!response.ok) {
168
168
  const responseBody = await response.text();
169
169
  const model = object.isRecord(body) && typeof body.model === "string" ? body.model : undefined;
170
- logger.error("serving-request-rejected", {
171
- model,
172
- api: url.endsWith("/responses") ? "responses" : "chat",
173
- url,
174
- status: response.status,
175
- responseBody,
176
- });
177
- if (response.status === 400 &&
170
+ const crossRegionDisabled = response.status === 400 &&
178
171
  model &&
179
172
  policy.modelFamily(model) === policy.ModelFamily.Gemini &&
180
- GEMINI_CROSS_REGION_DISABLED.test(responseBody)) {
173
+ GEMINI_CROSS_REGION_DISABLED.test(responseBody);
174
+ if (crossRegionDisabled) {
181
175
  const expiresAt = Date.now() + GEMINI_CROSS_REGION_COOLDOWN_MS;
182
176
  runtime.familyCooldowns.set(policy.ModelFamily.Gemini, expiresAt);
183
- logger.warn("provider-family-suppressed", {
184
- family: policy.ModelFamily.Gemini,
185
- reason: "cross-region-disabled",
186
- expiresAt: new Date(expiresAt).toISOString(),
177
+ runtime.availableFamilies.delete(policy.ModelFamily.Gemini);
178
+ }
179
+ else {
180
+ logger.error("serving-request-rejected", {
181
+ model,
182
+ api: url.endsWith("/responses") ? "responses" : "chat",
183
+ url,
184
+ status: response.status,
185
+ responseBody,
187
186
  });
188
187
  }
189
188
  // Load-shedding and server faults are worth another attempt; a 4xx is
@@ -199,7 +198,7 @@ async function postServing(ctx, url, body, runtime, cacheKey, signal, writeProgr
199
198
  response.headers.get("content-type")?.includes("text/event-stream")
200
199
  ? readStreamingResponse(response, writeProgress)
201
200
  : response.json();
202
- }, signal);
201
+ }, signal, false);
203
202
  return object.isRecord(payload) ? payload : {};
204
203
  }
205
204
  /** Consume an OpenAI Responses SSE stream and retain its completed response. */
@@ -372,28 +371,76 @@ export async function runWebSearch(request, runtimeOrConfig, ctx, signal, writeP
372
371
  `disabled. Deploy a supported endpoint, set model or ${MODEL_ENV}, or enable the ` +
373
372
  "fallback (WEB_SEARCH_SCRAPE_FALLBACK=1).");
374
373
  }
374
+ return runSelectedWebSearch(request, runtime, ctx, endpoint, signal, writeProgress);
375
+ }
376
+ /** Run one selected family after its first request establishes availability. */
377
+ async function runSelectedWebSearch(request, runtime, ctx, endpoint, signal, writeProgress) {
378
+ const family = endpointFamily(endpoint);
379
+ if (!family || runtime.availableFamilies.has(family)) {
380
+ try {
381
+ return await runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress);
382
+ }
383
+ catch (error) {
384
+ return runSearchFallback(request, runtime, ctx, endpoint, error, signal, writeProgress);
385
+ }
386
+ }
387
+ const activeProbe = runtime.familyProbes.get(family);
388
+ if (activeProbe) {
389
+ signal?.throwIfAborted();
390
+ await activeProbe;
391
+ signal?.throwIfAborted();
392
+ return runWebSearch(request, runtime, ctx, signal, writeProgress);
393
+ }
394
+ let releaseProbe;
395
+ const probe = new Promise((resolve) => {
396
+ releaseProbe = resolve;
397
+ });
398
+ runtime.familyProbes.set(family, probe);
399
+ if (runtime.availableFamilies.has(family) || activeFamilyCooldowns(runtime).has(family)) {
400
+ runtime.familyProbes.delete(family);
401
+ releaseProbe();
402
+ return runWebSearch(request, runtime, ctx, signal, writeProgress);
403
+ }
404
+ let failure;
375
405
  try {
376
- return await runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress);
406
+ const result = await runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress);
407
+ runtime.availableFamilies.add(family);
408
+ return result;
377
409
  }
378
410
  catch (error) {
379
- if (endpointFamily(endpoint) !== policy.ModelFamily.Gemini ||
380
- !activeFamilyCooldowns(runtime).has(policy.ModelFamily.Gemini)) {
381
- throw error;
382
- }
383
- const fallback = await resolveWebSearchModel(ctx, runtime, request.model);
384
- if (!fallback) {
385
- if (config.scrapeFallback) {
386
- logger.info("gemini-unavailable:scrape-fallback", { query: request.query });
387
- return runScrapeSearch(request, runtime, signal);
388
- }
389
- throw error;
411
+ failure = error;
412
+ }
413
+ finally {
414
+ if (runtime.familyProbes.get(family) === probe)
415
+ runtime.familyProbes.delete(family);
416
+ releaseProbe();
417
+ }
418
+ return runSearchFallback(request, runtime, ctx, endpoint, failure, signal, writeProgress);
419
+ }
420
+ /** Resolve a cached family failure to another model or the scrape fallback. */
421
+ async function runSearchFallback(request, runtime, ctx, endpoint, error, signal, writeProgress) {
422
+ if (endpointFamily(endpoint) !== policy.ModelFamily.Gemini ||
423
+ !activeFamilyCooldowns(runtime).has(policy.ModelFamily.Gemini)) {
424
+ throw error;
425
+ }
426
+ const fallback = await resolveWebSearchModel(ctx, runtime, request.model);
427
+ if (!fallback) {
428
+ if (runtime.config.scrapeFallback) {
429
+ logger.warn("web-search-model-fallback", {
430
+ failedModel: endpoint.name,
431
+ fallback: "scrape",
432
+ reason: "cross-region-disabled",
433
+ });
434
+ return runScrapeSearch(request, runtime, signal);
390
435
  }
391
- logger.info("gemini-unavailable:model-fallback", {
392
- failedModel: endpoint.name,
393
- fallbackModel: fallback.name,
394
- });
395
- return runNativeWebSearch(request, runtime, ctx, fallback, signal, writeProgress);
436
+ throw error;
396
437
  }
438
+ logger.warn("web-search-model-fallback", {
439
+ failedModel: endpoint.name,
440
+ fallbackModel: fallback.name,
441
+ reason: "cross-region-disabled",
442
+ });
443
+ return runSelectedWebSearch(request, runtime, ctx, fallback, signal, writeProgress);
397
444
  }
398
445
  /** Execute one native provider request against an already-selected endpoint. */
399
446
  async function runNativeWebSearch(request, runtime, ctx, endpoint, signal, writeProgress) {
@@ -432,4 +479,4 @@ async function runNativeWebSearch(request, runtime, ctx, endpoint, signal, write
432
479
  });
433
480
  return { query: request.query, answer, citations: trimmed, model: modelId };
434
481
  }
435
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQWdDLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBR25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDakMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENB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QUFDO0lBRXRGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUTtRQUNSLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWIgc2VhcmNoIGJhY2tlZCBieSB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wuXG4gKlxuICogVW5saWtlIGEgc2NyYXBpbmcgY2xpZW50LCB0aGUgc2VhcmNoIHJ1bnMgKmluc2lkZSogYSBtb2RlbCBjYWxsOiB3ZSBQT1NUIHRoZVxuICogcXVlcnkgdG8gdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnQgd2l0aCB0aGUgcHJvdmlkZXIncyB3ZWItc2VhcmNoXG4gKiB0b29sIHNwZWMgYXR0YWNoZWQsIGFuZCB0aGUgbW9kZWwgc2VhcmNoZXMgdGhlIHdlYiBhbmQgd3JpdGVzIHRoZSBhbnN3ZXIuXG4gKiB7QGxpbmsgcnVuV2ViU2VhcmNofTpcbiAqXG4gKiAgIDEuIFJlc29sdmVzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIElOREVQRU5ERU5UTFkgb2YgdGhlIGNhbGxpbmdcbiAqICAgICAgYWdlbnQncyBjaGF0IG1vZGVsICh0aGUgYWdlbnQgbWF5IHJ1biBvbiBhIG1vZGVsIHdpdGhvdXQgd2ViIHNlYXJjaCkuXG4gKiAgICAgIEEgcGlubmVkIGBtb2RlbGAgKHJlcXVlc3Qgb3IgY29uZmlnKSBpcyBmdXp6eS1tYXRjaGVkOyBvdGhlcndpc2UgdGhlXG4gKiAgICAgIGNvbmZpZ3VyZWQgZmFsbGJhY2sgb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQpIGlzIHdhbGtlZCB0byB0aGUgZmlyc3RcbiAqICAgICAgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IHRoYXQgZXhpc3RzLiBBbiBleHBsaWNpdCBidXQgdW5zdXBwb3J0ZWRcbiAqICAgICAgbW9kZWwgaXMgYSBoYXJkIGVycm9yLCBub3QgYSBzaWxlbnQgZmFsbGJhY2suXG4gKiAgIDIuIFBPU1RzIHRvIHRoZSBwcm92aWRlcidzIFJFU1Qgc3VyZmFjZSAoYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgXG4gKiAgICAgIGZvciBPcGVuQUksIGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2AgZm9yIEdlbWluaSkgd2l0aCB0aGVcbiAqICAgICAgbWFwcGVkIHRvb2wgc3BlYywgYXV0aGVudGljYXRlZCBhcyB0aGUgT0JPIGNhbGxlci5cbiAqICAgMy4gUmV0dXJucyB0aGUgc3ludGhlc2l6ZWQgYW5zd2VyIHBsdXMgdGhlIGNpdGVkIHNvdXJjZXMsIHdpdGggY2l0YXRpb25zXG4gKiAgICAgIHNpbGVudGx5IGZpbHRlcmVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgVVJMIGFsbG93LWxpc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3Rvb2wtcHJvdmlkZXJcIjtcbmltcG9ydCB7IGludm9rZSwgcG9saWN5LCByZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG9wZW5haUNoYXQsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgTU9ERUxfRU5WLCB0eXBlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NhbGxTZXR0aW5ncywgd2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IHN1cHBvcnRzV2ViU2VhcmNoLCB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseSwgd2ViU2VhcmNoVG9vbFNwZWMgfSBmcm9tIFwiLi9wcm92aWRlci50c1wiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZVJlYWQsXG4gIHRvV2ViU2VhcmNoUnVudGltZSxcbiAgdHlwZSBXZWJTZWFyY2hSdW50aW1lLFxuICB0eXBlIFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCxcbn0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTZWFyY2hDaXRhdGlvbiwgV2ViU2VhcmNoUmVxdWVzdCwgV2ViU2VhcmNoUmVzdWx0IH0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyBydW5TY3JhcGVTZWFyY2ggfSBmcm9tIFwiLi9zY3JhcGUudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gbW9kZWxDYXRhbG9nLldvcmtzcGFjZUNsaWVudExpa2UgJiBpbnZva2UuQXV0aGVudGljYXRpbmdDbGllbnRMaWtlO1xudHlwZSBQcm9ncmVzc1dyaXRlciA9IE5vbk51bGxhYmxlPEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdPjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3NlYXJjaFwiKTtcbmNvbnN0IHsgbG9va3VwTW9kZWxzIH0gPSByZXNvbHZlO1xuY29uc3QgeyBsaXN0U2VydmluZ0VuZHBvaW50cyB9ID0gbW9kZWxDYXRhbG9nO1xuXG4vKipcbiAqIEhvdyBkZWVwIHRoZSBncm91bmRpbmctbWV0YWRhdGEgd2FsayBkZXNjZW5kcy4gR2VtaW5pIG5lc3RzIGl0cyBzb3VyY2VzIGFcbiAqIGhhbmRmdWwgb2YgbGV2ZWxzIGRvd24gYW5kIHRoZSBzaGFwZSB2YXJpZXMgYnkgbW9kZWwgdmVyc2lvbiwgc28gdGhlIHdhbGtcbiAqIGlzIGdlbmVyaWM7IHRoZSBib3VuZCBpcyB3aGF0IGtlZXBzIGEgcGF0aG9sb2dpY2FsIHBheWxvYWQgZnJvbSB0dXJuaW5nIGl0XG4gKiBpbnRvIGEgZnVsbCB0cmF2ZXJzYWwgb2YgdGhlIHJlc3BvbnNlLlxuICovXG5jb25zdCBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggPSA2O1xuY29uc3QgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5jb25zdCBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVEID0gL2Nyb3NzLXJlZ2lvbiBwcm9jZXNzaW5nIGlzIGRpc2FibGVkL2k7XG5cbi8qKiBMb3dlc3QgSFRUUCBzdGF0dXMgdHJlYXRlZCBhcyBhIHNlcnZlci1zaWRlIChyZXRyeWFibGUpIHNlcnZpbmcgZmFpbHVyZS4gKi9cbmNvbnN0IFNFUlZFUl9FUlJPUl9TVEFUVVMgPSA1MDA7XG5cbi8qKiBTdGF0dXMgTW9kZWwgU2VydmluZyB1c2VzIHRvIHNoZWQgbG9hZDsgcmV0cnlhYmxlIGxpa2UgYSA1eHguICovXG5jb25zdCBSQVRFX0xJTUlURURfU1RBVFVTID0gNDI5O1xuXG4vKiogQ29udGV4dCBhIHNlYXJjaCBuZWVkcyBmcm9tIHRoZSBjYWxsZXI6IHRoZSBPQk8gY2xpZW50ICsgd29ya3NwYWNlIGhvc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlYXJjaENvbnRleHQge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFRydXN0ZWQgaWRlbnRpdHkgb2YgdGhlIGNyZWRlbnRpYWwgY2FycmllZCBieSBgY2xpZW50YC4gKi9cbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIE1vZGVsLXNlbGVjdGlvbiBmaWVsZHMgdXNlZCB0byByYW5rIG9uZSB3ZWItc2VhcmNoIGVuZHBvaW50LiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoTW9kZWxTZWxlY3Rpb25PcHRpb25zID0gUGljazxcbiAgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIFwibW9kZWxcIiB8IFwibW9kZWxGYWxsYmFja3NcIiB8IFwiZnV6enlcIiB8IFwiZnV6enlUaHJlc2hvbGRcIlxuPjtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCArIGhvc3QgZnJvbSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb25cbiAqIGNvbnRleHQuIEluc2lkZSBgYWdlbnQuc3RyZWFtYCdzIGBhc1VzZXIocmVxKWAgc2NvcGUgdGhpcyBoaXRzIHRoZSBzZXJ2aW5nXG4gKiBlbmRwb2ludCBhcyB0aGUgcmVxdWVzdGluZyB1c2VyOyBvdXRzaWRlIGEgdXNlciBjb250ZXh0IEFwcEtpdCBmYWxscyBiYWNrIHRvXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCgpOiBQcm9taXNlPFdlYlNlYXJjaENvbnRleHQ+IHtcbiAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGN0eC5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgY2FjaGVJZGVudGl0eSA9IFwidXNlcklkXCIgaW4gY3R4ID8gY3R4LnVzZXJJZCA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICByZXR1cm4geyBjbGllbnQ6IGN0eC5jbGllbnQsIGhvc3QsIGNhY2hlSWRlbnRpdHkgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIGFnYWluc3QgdGhlIExJVkUgd29ya3NwYWNlIGNhdGFsb2d1ZSAtIHNvXG4gKiB3ZSBuZXZlciByZXR1cm4gYW4gZW5kcG9pbnQgaWQgdGhhdCBpc24ndCBhY3R1YWxseSBkZXBsb3llZCAodGhlIFwiZW5kcG9pbnRcbiAqIGRvZXMgbm90IGV4aXN0XCIgZmFpbHVyZSBhIGhhcmRjb2RlZCBmYWxsYmFjayBpZCB3b3VsZCBjYXVzZSkuIFJldXNlc1xuICogYEBkYngtdG9vbHMvbW9kZWxgJ3MgZXhpc3RpbmcgY2F0YWxvZ3VlICsgcmFua2VyIHJhdGhlciB0aGFuIGEgY3VzdG9tXG4gKiBsb29rdXA6IHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gbGlzdHMgdGhlIGVuZHBvaW50cyAoY2FjaGVkKSwgYW5kIHdlXG4gKiByZXN0cmljdCB0aGUgY2FuZGlkYXRlIHNldCB0aHJvdWdoIG1vZGVsLW93bmVkIGNhcGFiaWxpdHkgbWV0YWRhdGEgYmVmb3JlXG4gKiB7QGxpbmsgbG9va3VwTW9kZWxzfSByYW5rcyB3aXRoaW4gaXQuXG4gKlxuICogVGhlIGhpZ2hlc3QtcmFua2VkIEdlbWluaSBtb2RlbCB3aW5zLiBXaXRob3V0IEdlbWluaSwgYSBHUFQgcmVxdWVzdCBtYXRjaGluZ1xuICogdGhlIGNhbGxpbmcvY29uZmlndXJlZCBtb2RlbCB3aW5zLCBmb2xsb3dlZCBieSB0aGUgaGlnaGVzdC1yYW5rZWQgR1BUIG1vZGVsXG4gKiBhbmQgdGhlbiBhbnkgYWRkaXRpb25hbCBjb25maWd1cmVkIHNlYXJjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoTW9kZWwoXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsPiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjdHguY2xpZW50LCBjdHguaG9zdCwge1xuICAgIC4uLihjdHguY2FjaGVJZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY3R4LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiBzZWxlY3RXZWJTZWFyY2hFbmRwb2ludChlbmRwb2ludHMsIHJlcXVlc3RlZCwgY29uZmlnLCBhY3RpdmVGYW1pbHlDb29sZG93bnMocnVudGltZSkpO1xufVxuXG4vKiogU2VsZWN0IG9uZSBkZXBsb3llZCB3ZWItc2VhcmNoIGVuZHBvaW50IHVzaW5nIGZhbWlseSBhbmQgY2FwYWJpbGl0eSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V2ViU2VhcmNoRW5kcG9pbnQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBXZWJTZWFyY2hNb2RlbFNlbGVjdGlvbk9wdGlvbnMsXG4gIHN1cHByZXNzZWRGYW1pbGllczogUmVhZG9ubHlTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PiA9IG5ldyBTZXQoKSxcbik6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsIHtcbiAgLy8gT25seSBkZXBsb3llZCwgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50cyBhcmUgY2FuZGlkYXRlcy5cbiAgY29uc3QgY2FwYWJsZSA9IGVuZHBvaW50cy5maWx0ZXIoKGVuZHBvaW50KSA9PiB7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICAgIHJldHVybiBzdXBwb3J0c1dlYlNlYXJjaChlbmRwb2ludCkgJiYgKCFmYW1pbHkgfHwgIXN1cHByZXNzZWRGYW1pbGllcy5oYXMoZmFtaWx5KSk7XG4gIH0pO1xuICBjb25zdCBnZW1pbmkgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICBsaW1pdDogMSxcbiAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgfSlbMF0/LmVuZHBvaW50O1xuICBpZiAoZ2VtaW5pKSByZXR1cm4gZ2VtaW5pO1xuICBjb25zdCBncHQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCxcbiAgICBsaW1pdDogNTAsXG4gICAgdGhyZXNob2xkOiBjb25maWcuZnV6enlUaHJlc2hvbGQsXG4gIH0pLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBlbmRwb2ludCk7XG5cbiAgY29uc3QgcHJlZmVycmVkID0gcmVxdWVzdGVkID8/IGNvbmZpZy5tb2RlbDtcbiAgaWYgKHByZWZlcnJlZCAmJiBwb2xpY3kubW9kZWxGYW1pbHkocHJlZmVycmVkKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBjb25maWcuZnV6enlcbiAgICAgID8gbG9va3VwTW9kZWxzKGdwdCwge1xuICAgICAgICAgIHNlYXJjaDogcHJlZmVycmVkLFxuICAgICAgICAgIGxpbWl0OiAxLFxuICAgICAgICAgIHRocmVzaG9sZDogY29uZmlnLmZ1enp5VGhyZXNob2xkLFxuICAgICAgICB9KVswXT8uZW5kcG9pbnRcbiAgICAgIDogZ3B0LmZpbmQoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lID09PSBwcmVmZXJyZWQpO1xuICAgIGlmIChtYXRjaGVkKSByZXR1cm4gbWF0Y2hlZDtcbiAgfVxuICBpZiAoZ3B0WzBdKSByZXR1cm4gZ3B0WzBdO1xuXG4gIGZvciAoY29uc3Qgc2VhcmNoIG9mIGNvbmZpZy5tb2RlbEZhbGxiYWNrcykge1xuICAgIGlmIChcbiAgICAgIHNlYXJjaC50b0xvd2VyQ2FzZSgpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICBzZWFyY2gudG9Mb3dlckNhc2UoKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgICAgc2VhcmNoLFxuICAgICAgbGltaXQ6IDEsXG4gICAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgICB9KVswXT8uZW5kcG9pbnQ7XG4gICAgaWYgKG1hdGNoZWQpIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBSZXR1cm4gb25lIGVuZHBvaW50J3MgbW9kZWwtb3duZWQgZmFtaWx5IGlkZW50aXR5LiAqL1xuZnVuY3Rpb24gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBwb2xpY3kuTW9kZWxGYW1pbHkgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcG9saWN5Lm1vZGVsRmFtaWx5KGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUgPz8gZW5kcG9pbnQubmFtZSk7XG59XG5cbi8qKiBEcm9wIGV4cGlyZWQgZmFtaWx5IGNvb2xkb3ducyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50bHkgc3VwcHJlc3NlZCBzZXQuICovXG5mdW5jdGlvbiBhY3RpdmVGYW1pbHlDb29sZG93bnMoXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIG5vdyA9IERhdGUubm93KCksXG4pOiBSZWFkb25seVNldDxwb2xpY3kuTW9kZWxGYW1pbHk+IHtcbiAgZm9yIChjb25zdCBbZmFtaWx5LCBleHBpcmVzQXRdIG9mIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zKSB7XG4gICAgaWYgKGV4cGlyZXNBdCA8PSBub3cpIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmRlbGV0ZShmYW1pbHkpO1xuICB9XG4gIHJldHVybiBuZXcgU2V0KHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmtleXMoKSk7XG59XG5cbi8qKlxuICogUE9TVCBhIHNlcnZpbmcgcmVxdWVzdCBhcyB0aGUgT0JPIGNhbGxlciBhbmQgcmV0dXJuIHRoZSBwYXJzZWQgSlNPTiBib2R5LlxuICpcbiAqIEF1dGggaGVhZGVycyBhcmUgbWludGVkIHBlciBjYWxsIGZyb20gdGhlIE9CTyBjbGllbnQncyBTREsgY29uZmlnLCB3aGljaFxuICogcmVmcmVzaGVzIHRoZSB0b2tlbiB3aGVuIGl0IGlzIGNsb3NlIHRvIGV4cGlyeSwgc28gdGhlIHJlcXVlc3QgY2FycmllcyB0aGVcbiAqIHJlcXVlc3RpbmcgdXNlcidzIGlkZW50aXR5LlxuICpcbiAqIFRoaXMgaXMgdGhlIG9uZSBEYXRhYnJpY2tzIGNhbGwgaW4gdGhlIHJlcG8gdGhhdCBkb2VzIG5vdCBnbyB0aHJvdWdoXG4gKiBgYXBpQ2xpZW50LnJlcXVlc3RgICsgYGRhdGFicmlja3MudG9Db250ZXh0YCAod2hpY2ggZG9lcyBmb3J3YXJkXG4gKiBjYW5jZWxsYXRpb24pLiBSZXRyeSBjbGFzc2lmaWNhdGlvbiBoZXJlIGhhcyB0byBkaXN0aW5ndWlzaCBhIGxvYWQtc2hlZCBvclxuICogc2VydmVyIGZhdWx0IGZyb20gdGhpcyByZXF1ZXN0J3Mgb3duIDR4eCwgYW5kIGBmZXRjaGAgZXhwb3NlcyB0aGUgSFRUUCBzdGF0dXNcbiAqIGRpcmVjdGx5OyB0aGUgU0RLIHJhaXNlcyBhbiBgQXBpRXJyb3JgIHRoYXQgY2FycmllcyB0aGUgc3RhdHVzIHVuZGVyXG4gKiBpbmNvbnNpc3RlbnQga2V5cywgd2hpY2ggaXMgZ3Vlc3N3b3JrIGJ5IGNvbXBhcmlzb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RTZXJ2aW5nKFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHVybDogc3RyaW5nLFxuICBib2R5OiB1bmtub3duLFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjYWNoZUtleTogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwic2VydmluZy1yZXF1ZXN0XCIsXG4gICAgdG9DYWxsU2V0dGluZ3Mod2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzLCBjb25maWcudGltZW91dE1zLCBjYWNoZUtleSksXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGN0eC5jbGllbnQpKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPVxuICAgICAgICAgIG9iamVjdC5pc1JlY29yZChib2R5KSAmJiB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IGJvZHkubW9kZWwgOiB1bmRlZmluZWQ7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcInNlcnZpbmctcmVxdWVzdC1yZWplY3RlZFwiLCB7XG4gICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgYXBpOiB1cmwuZW5kc1dpdGgoXCIvcmVzcG9uc2VzXCIpID8gXCJyZXNwb25zZXNcIiA6IFwiY2hhdFwiLFxuICAgICAgICAgIHVybCxcbiAgICAgICAgICBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgICAgICByZXNwb25zZUJvZHksXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID09PSA0MDAgJiZcbiAgICAgICAgICBtb2RlbCAmJlxuICAgICAgICAgIHBvbGljeS5tb2RlbEZhbWlseShtb2RlbCkgPT09IHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmkgJiZcbiAgICAgICAgICBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVELnRlc3QocmVzcG9uc2VCb2R5KVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBEYXRlLm5vdygpICsgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUztcbiAgICAgICAgICBydW50aW1lLmZhbWlseUNvb2xkb3ducy5zZXQocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSwgZXhwaXJlc0F0KTtcbiAgICAgICAgICBsb2dnZXIud2FybihcInByb3ZpZGVyLWZhbWlseS1zdXBwcmVzc2VkXCIsIHtcbiAgICAgICAgICAgIGZhbWlseTogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICAgICAgICAgIHJlYXNvbjogXCJjcm9zcy1yZWdpb24tZGlzYWJsZWRcIixcbiAgICAgICAgICAgIGV4cGlyZXNBdDogbmV3IERhdGUoZXhwaXJlc0F0KS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIExvYWQtc2hlZGRpbmcgYW5kIHNlcnZlciBmYXVsdHMgYXJlIHdvcnRoIGFub3RoZXIgYXR0ZW1wdDsgYSA0eHggaXNcbiAgICAgICAgLy8gdGhpcyByZXF1ZXN0J3Mgb3duIHByb2JsZW0sIHNvIGl0IG11c3Qgbm90IGJlIHJldHJpZWQuXG4gICAgICAgIGNvbnN0IHJldHJ5YWJsZSA9XG4gICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzID49IFNFUlZFUl9FUlJPUl9TVEFUVVMgfHwgcmVzcG9uc2Uuc3RhdHVzID09PSBSQVRFX0xJTUlURURfU1RBVFVTO1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gYHdlYi1zZWFyY2g6IE1vZGVsIFNlcnZpbmcgcmVqZWN0ZWQgdGhlIHNlYXJjaCByZXF1ZXN0IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgO1xuICAgICAgICB0aHJvdyByZXRyeWFibGVcbiAgICAgICAgICA/IG5ldyBDb25uZWN0aW9uRXJyb3IobWVzc2FnZSwgeyBjb250ZXh0OiB7IHN0YXR1czogcmVzcG9uc2Uuc3RhdHVzIH0gfSlcbiAgICAgICAgICA6IG5ldyBFeGVjdXRpb25FcnJvcihtZXNzYWdlLCB7IGNvbnRleHQ6IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB3cml0ZVByb2dyZXNzICYmXG4gICAgICAgIHJlc3BvbnNlLmJvZHkgJiZcbiAgICAgICAgcmVzcG9uc2UuaGVhZGVycy5nZXQoXCJjb250ZW50LXR5cGVcIik/LmluY2x1ZGVzKFwidGV4dC9ldmVudC1zdHJlYW1cIilcbiAgICAgICAgPyByZWFkU3RyZWFtaW5nUmVzcG9uc2UocmVzcG9uc2UsIHdyaXRlUHJvZ3Jlc3MpXG4gICAgICAgIDogcmVzcG9uc2UuanNvbigpO1xuICAgIH0sXG4gICAgc2lnbmFsLFxuICApO1xuICByZXR1cm4gb2JqZWN0LmlzUmVjb3JkKHBheWxvYWQpID8gcGF5bG9hZCA6IHt9O1xufVxuXG4vKiogQ29uc3VtZSBhbiBPcGVuQUkgUmVzcG9uc2VzIFNTRSBzdHJlYW0gYW5kIHJldGFpbiBpdHMgY29tcGxldGVkIHJlc3BvbnNlLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVhZFN0cmVhbWluZ1Jlc3BvbnNlKFxuICByZXNwb25zZTogUmVzcG9uc2UsXG4gIHdyaXRlUHJvZ3Jlc3M6IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCByZWFkZXIgPSByZXNwb25zZS5ib2R5IS5nZXRSZWFkZXIoKTtcbiAgY29uc3QgZGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuICBsZXQgYnVmZmVyID0gXCJcIjtcbiAgbGV0IGNvbXBsZXRlZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfCB1bmRlZmluZWQ7XG4gIGNvbnN0IGNvbnN1bWUgPSBhc3luYyAoZnJhbWU6IHN0cmluZykgPT4ge1xuICAgIGNvbnN0IGRhdGEgPSBmcmFtZVxuICAgICAgLnNwbGl0KFwiXFxuXCIpXG4gICAgICAuZmlsdGVyKChsaW5lKSA9PiBsaW5lLnN0YXJ0c1dpdGgoXCJkYXRhOlwiKSlcbiAgICAgIC5tYXAoKGxpbmUpID0+IGxpbmUuc2xpY2UoNSkudHJpbVN0YXJ0KCkpXG4gICAgICAuam9pbihcIlxcblwiKTtcbiAgICBpZiAoIWRhdGEgfHwgZGF0YSA9PT0gXCJbRE9ORV1cIikgcmV0dXJuO1xuICAgIGNvbnN0IGV2ZW50ID0gSlNPTi5wYXJzZShkYXRhKSBhcyB1bmtub3duO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKGV2ZW50KSB8fCB0eXBlb2YgZXZlbnQudHlwZSAhPT0gXCJzdHJpbmdcIikgcmV0dXJuO1xuICAgIGF3YWl0IGVtaXRXZWJTZWFyY2hQcm9ncmVzcyhldmVudCwgd3JpdGVQcm9ncmVzcyk7XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzcG9uc2UuY29tcGxldGVkXCIgJiYgb2JqZWN0LmlzUmVjb3JkKGV2ZW50LnJlc3BvbnNlKSkge1xuICAgICAgY29tcGxldGVkID0gZXZlbnQucmVzcG9uc2U7XG4gICAgfVxuICAgIGlmIChldmVudC50eXBlID09PSBcInJlc3BvbnNlLmZhaWxlZFwiKSB7XG4gICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJ3ZWItc2VhcmNoOiBzdHJlYW1pbmcgcmVzcG9uc2UgZmFpbGVkXCIsIHtcbiAgICAgICAgY29udGV4dDogeyByZXNwb25zZTogZXZlbnQucmVzcG9uc2UgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfTtcblxuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgeyBkb25lLCB2YWx1ZSB9ID0gYXdhaXQgcmVhZGVyLnJlYWQoKTtcbiAgICBidWZmZXIgKz0gZGVjb2Rlci5kZWNvZGUodmFsdWUsIHsgc3RyZWFtOiAhZG9uZSB9KTtcbiAgICBidWZmZXIgPSBidWZmZXIucmVwbGFjZUFsbChcIlxcclxcblwiLCBcIlxcblwiKTtcbiAgICBsZXQgYm91bmRhcnkgPSBidWZmZXIuaW5kZXhPZihcIlxcblxcblwiKTtcbiAgICB3aGlsZSAoYm91bmRhcnkgPj0gMCkge1xuICAgICAgYXdhaXQgY29uc3VtZShidWZmZXIuc2xpY2UoMCwgYm91bmRhcnkpKTtcbiAgICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShib3VuZGFyeSArIDIpO1xuICAgICAgYm91bmRhcnkgPSBidWZmZXIuaW5kZXhPZihcIlxcblxcblwiKTtcbiAgICB9XG4gICAgaWYgKGRvbmUpIGJyZWFrO1xuICB9XG4gIGlmIChidWZmZXIudHJpbSgpKSBhd2FpdCBjb25zdW1lKGJ1ZmZlcik7XG4gIGlmICghY29tcGxldGVkKSB0aHJvdyBuZXcgRXhlY3V0aW9uRXJyb3IoXCJ3ZWItc2VhcmNoOiBzdHJlYW1pbmcgcmVzcG9uc2UgZGlkIG5vdCBjb21wbGV0ZVwiKTtcbiAgcmV0dXJuIGNvbXBsZXRlZDtcbn1cblxuLyoqIFB1Ymxpc2ggbmF0aXZlIHdlYi1zZWFyY2ggbGlmZWN5Y2xlIGV2ZW50cyBhcyBjb21tb24gdG9vbCBwcm9ncmVzcy4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVtaXRXZWJTZWFyY2hQcm9ncmVzcyhcbiAgZXZlbnQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICB3cml0ZVByb2dyZXNzOiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoZXZlbnQudHlwZSAhPT0gXCJyZXNwb25zZS5vdXRwdXRfaXRlbS5kb25lXCIgfHwgIW9iamVjdC5pc1JlY29yZChldmVudC5pdGVtKSkgcmV0dXJuO1xuICBjb25zdCBhY3Rpb24gPSBvYmplY3QuaXNSZWNvcmQoZXZlbnQuaXRlbS5hY3Rpb24pID8gZXZlbnQuaXRlbS5hY3Rpb24gOiB1bmRlZmluZWQ7XG4gIGlmICghYWN0aW9uIHx8IGFjdGlvbi50eXBlICE9PSBcInNlYXJjaFwiKSByZXR1cm47XG4gIGNvbnN0IHF1ZXJ5ID0gdHlwZW9mIGFjdGlvbi5xdWVyeSA9PT0gXCJzdHJpbmdcIiA/IGFjdGlvbi5xdWVyeSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcXVlcmllcyA9IEFycmF5LmlzQXJyYXkoYWN0aW9uLnF1ZXJpZXMpXG4gICAgPyBhY3Rpb24ucXVlcmllcy5maWx0ZXIoKHZhbHVlKTogdmFsdWUgaXMgc3RyaW5nID0+IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIilcbiAgICA6IFtdO1xuICBjb25zdCBncm91cElkID1cbiAgICB0eXBlb2YgZXZlbnQuaXRlbS5pZCA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBldmVudC5pdGVtLmlkXG4gICAgICA6IGBzZWFyY2gtJHtTdHJpbmcoZXZlbnQuc2VxdWVuY2VfbnVtYmVyID8/IHF1ZXJ5ID8/IFwidW5rbm93blwiKX1gO1xuICBjb25zdCByZXN1bHRDb3VudCA9IHF1ZXJpZXMubGVuZ3RoID4gMCA/IHF1ZXJpZXMubGVuZ3RoIDogcXVlcnkgPyAxIDogMDtcbiAgYXdhaXQgd3JpdGVQcm9ncmVzcyh7XG4gICAgdHlwZTogXCJ0b29sX3N0YXR1c1wiLFxuICAgIHN0YXR1czogXCJzZWFyY2hcIixcbiAgICBtZXNzYWdlOiBxdWVyeSA/PyBcInRoZSB3ZWJcIixcbiAgICBncm91cElkLFxuICB9KTtcbiAgYXdhaXQgd3JpdGVQcm9ncmVzcyh7XG4gICAgdHlwZTogXCJ0b29sX3N0YXR1c1wiLFxuICAgIHN0YXR1czogXCJyZXN1bHRcIixcbiAgICBtZXNzYWdlOiBcIlJlc3VsdFwiLFxuICAgIGdyb3VwSWQsXG4gICAgLi4uKHJlc3VsdENvdW50ID4gMFxuICAgICAgPyB7IGRldGFpbDogYCR7cmVzdWx0Q291bnR9ICR7cmVzdWx0Q291bnQgPT09IDEgPyBcInJlc3VsdFwiIDogXCJyZXN1bHRzXCJ9YCB9XG4gICAgICA6IHt9KSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSByZXNwb25zZSBleHRyYWN0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEV4dHJhY3QgYW5zd2VyIHRleHQgYW5kIGNpdGF0aW9ucyBmcm9tIGFuIE9wZW5BSSBSZXNwb25zZXMgQVBJIHBheWxvYWQuXG4gKi9cbmZ1bmN0aW9uIGZyb21SZXNwb25zZXNQYXlsb2FkKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBhbnN3ZXI6IHN0cmluZztcbiAgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdO1xufSB7XG4gIGNvbnN0IG91dHB1dCA9IEFycmF5LmlzQXJyYXkocGF5bG9hZC5vdXRwdXQpID8gcGF5bG9hZC5vdXRwdXQgOiBbXTtcbiAgY29uc3QgdGV4dHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgaXRlbSBvZiBvdXRwdXQpIHtcbiAgICBpZiAoIW9iamVjdC5pc1JlY29yZChpdGVtKSkgY29udGludWU7XG4gICAgY29uc3QgcGFydHMgPSBvcGVuYWlDaGF0LmNoYXRDb250ZW50UGFydHMoaXRlbS5jb250ZW50KTtcbiAgICBpZiAoIXBhcnRzKSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHBhcnQgb2YgcGFydHMpIHtcbiAgICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnQpKSBjb250aW51ZTtcbiAgICAgIGNvbnN0IHRleHQgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShwYXJ0LnRleHQpO1xuICAgICAgaWYgKHRleHQpIHRleHRzLnB1c2godGV4dCk7XG4gICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IEFycmF5LmlzQXJyYXkocGFydC5hbm5vdGF0aW9ucykgPyBwYXJ0LmFubm90YXRpb25zIDogW107XG4gICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoYW5ub3RhdGlvbikpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCB1cmwgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShhbm5vdGF0aW9uLnVybCk7XG4gICAgICAgIGlmICghdXJsIHx8IHNlZW4uaGFzKHVybCkpIGNvbnRpbnVlO1xuICAgICAgICBzZWVuLmFkZCh1cmwpO1xuICAgICAgICBjb25zdCB0aXRsZSA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KGFubm90YXRpb24udGl0bGUpO1xuICAgICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBhbnN3ZXIgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eShwYXlsb2FkLm91dHB1dF90ZXh0KSB8fCB0ZXh0cy5qb2luKFwiXFxuXCIpLnRyaW0oKTtcbiAgcmV0dXJuIHsgYW5zd2VyLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0IGFuc3dlciB0ZXh0ICsgY2l0YXRpb25zIGZyb20gYSBDaGF0IENvbXBsZXRpb25zIHBheWxvYWQgKEdlbWluaSB2aWFcbiAqIGBnb29nbGVfc2VhcmNoYCkuIFRoZSBhbnN3ZXIgaXMgYGNob2ljZXNbMF0ubWVzc2FnZS5jb250ZW50YDsgZ3JvdW5kaW5nXG4gKiBzb3VyY2VzLCB3aGVuIHByZXNlbnQsIHN1cmZhY2UgdW5kZXIgYGNob2ljZXNbMF0ubWVzc2FnZWAgZ3JvdW5kaW5nXG4gKiBtZXRhZGF0YSAoYmVzdC1lZmZvcnQgLSBzaGFwZXMgdmFyeSwgc28gd2Ugc2NhbiBmb3IgdXJsLWJlYXJpbmcgZW50cmllcykuXG4gKi9cbmZ1bmN0aW9uIGZyb21DaGF0UGF5bG9hZChwYXlsb2FkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IHtcbiAgYW5zd2VyOiBzdHJpbmc7XG4gIGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXTtcbn0ge1xuICBjb25zdCBjaG9pY2VzID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLmNob2ljZXMpID8gcGF5bG9hZC5jaG9pY2VzIDogW107XG4gIGNvbnN0IGZpcnN0ID0gY2hvaWNlc1swXTtcbiAgY29uc3QgbWVzc2FnZSA9IG9iamVjdC5pc1JlY29yZChmaXJzdCkgJiYgb2JqZWN0LmlzUmVjb3JkKGZpcnN0Lm1lc3NhZ2UpID8gZmlyc3QubWVzc2FnZSA6IHt9O1xuICBjb25zdCBhbnN3ZXIgPSBvcGVuYWlDaGF0LmNoYXRDb250ZW50VG9UZXh0KG1lc3NhZ2UuY29udGVudCk7XG4gIGNvbnN0IGNpdGF0aW9uczogV2ViU2VhcmNoQ2l0YXRpb25bXSA9IFtdO1xuICAvLyBCZXN0LWVmZm9ydCBncm91bmRpbmcgZXh0cmFjdGlvbjogd2FsayBhbnkgbmVzdGVkIG9iamVjdCBmb3Ige3VyaXx1cmwsdGl0bGV9LlxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHZpc2l0ID0gKHY6IHVua25vd24sIGRlcHRoOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICBpZiAoZGVwdGggPiBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggfHwgIW9iamVjdC5pc1JlY29yZCh2KSkgcmV0dXJuO1xuICAgIGNvbnN0IHVybCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHYudXJsKSB8fCBzdHJpbmdVdGlscy50cmltVG9FbXB0eSh2LnVyaSk7XG4gICAgaWYgKHVybCAmJiAhc2Vlbi5oYXModXJsKSkge1xuICAgICAgc2Vlbi5hZGQodXJsKTtcbiAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkodi50aXRsZSk7XG4gICAgICBjaXRhdGlvbnMucHVzaCh7IHVybCwgLi4uKHRpdGxlID8geyB0aXRsZSB9IDoge30pIH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHZhbCBvZiBPYmplY3QudmFsdWVzKHYpKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWwpKSB2YWwuZm9yRWFjaCgoeCkgPT4gdmlzaXQoeCwgZGVwdGggKyAxKSk7XG4gICAgICBlbHNlIGlmICh2YWwgJiYgdHlwZW9mIHZhbCA9PT0gXCJvYmplY3RcIikgdmlzaXQodmFsLCBkZXB0aCArIDEpO1xuICAgIH1cbiAgfTtcbiAgdmlzaXQobWVzc2FnZS5ncm91bmRpbmdfbWV0YWRhdGEgPz8gbWVzc2FnZS5ncm91bmRpbmdNZXRhZGF0YSwgMCk7XG4gIHJldHVybiB7IGFuc3dlciwgY2l0YXRpb25zIH07XG59XG5cbi8qKlxuICogUnVuIGEgd2ViIHNlYXJjaC4gUHJlZmVycyB0aGUgRGF0YWJyaWNrcyBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIG9uIGFcbiAqIGRlcGxveWVkIEdQVC9HZW1pbmkgZW5kcG9pbnQgKHN5bnRoZXNpemVkIGFuc3dlciArIGNpdGF0aW9ucyk7IHdoZW4gdGhlXG4gKiB3b3Jrc3BhY2UgaGFzIG5vIHN1Y2ggZW5kcG9pbnQgQU5EIHRoZSBzY3JhcGUgZmFsbGJhY2sgaXMgZW5hYmxlZCwgZmFsbHNcbiAqIGJhY2sgdG8gYSBEdWNrRHVja0dvIHNjcmFwZSBzbyB0aGUgdG9vbCBzdGlsbCByZXR1cm5zIHJlc3VsdHMgaW5zdGVhZCBvZlxuICogZXJyb3JpbmcuIENpdGF0aW9ucyBhcmUgZmlsdGVyZWQgdGhyb3VnaCB0aGUgY29uZmlndXJlZCBVUkwgYWxsb3ctbGlzdC5cbiAqXG4gKiBgc2lnbmFsYCBjYW5jZWxzIHRoZSB3aG9sZSBjYWxsLCBpbmNsdWRpbmcgdGhlIGluLWZsaWdodCBzZXJ2aW5nIHJlcXVlc3QuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBydW5XZWJTZWFyY2goXG4gIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gIHJ1bnRpbWVPckNvbmZpZzogV2ViU2VhcmNoUnVudGltZUlucHV0LFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB3cml0ZVByb2dyZXNzPzogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICBjb25zdCBydW50aW1lID0gdG9XZWJTZWFyY2hSdW50aW1lKHJ1bnRpbWVPckNvbmZpZyk7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludCA9IGF3YWl0IHJlc29sdmVXZWJTZWFyY2hNb2RlbChjdHgsIHJ1bnRpbWUsIHJlcXVlc3QubW9kZWwpO1xuXG4gIGlmIChlbmRwb2ludCA9PT0gbnVsbCkge1xuICAgIC8vIE5vIG5hdGl2ZSB3ZWItc2VhcmNoIG1vZGVsIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlLlxuICAgIGlmIChjb25maWcuc2NyYXBlRmFsbGJhY2spIHtcbiAgICAgIGxvZ2dlci5pbmZvKFwibm8tbmF0aXZlLW1vZGVsOnNjcmFwZS1mYWxsYmFja1wiLCB7IHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5IH0pO1xuICAgICAgcmV0dXJuIHJ1blNjcmFwZVNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBzaWduYWwpO1xuICAgIH1cbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIFwiV2ViLXNlYXJjaC1jYXBhYmxlIHNlcnZpbmcgZW5kcG9pbnRcIixcbiAgICAgIFwiTm8gR1BUL0dlbWluaSBlbmRwb2ludCBpcyBkZXBsb3llZCBpbiB0aGlzIHdvcmtzcGFjZSBhbmQgdGhlIHNjcmFwZSBmYWxsYmFjayBpcyBcIiArXG4gICAgICAgIGBkaXNhYmxlZC4gRGVwbG95IGEgc3VwcG9ydGVkIGVuZHBvaW50LCBzZXQgbW9kZWwgb3IgJHtNT0RFTF9FTlZ9LCBvciBlbmFibGUgdGhlIGAgK1xuICAgICAgICBcImZhbGxiYWNrIChXRUJfU0VBUkNIX1NDUkFQRV9GQUxMQkFDSz0xKS5cIixcbiAgICApO1xuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gYXdhaXQgcnVuTmF0aXZlV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaWYgKFxuICAgICAgZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpICE9PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICAhYWN0aXZlRmFtaWx5Q29vbGRvd25zKHJ1bnRpbWUpLmhhcyhwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pKVxuICAgICkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGNvbnN0IGZhbGxiYWNrID0gYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaE1vZGVsKGN0eCwgcnVudGltZSwgcmVxdWVzdC5tb2RlbCk7XG4gICAgaWYgKCFmYWxsYmFjaykge1xuICAgICAgaWYgKGNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgICBsb2dnZXIuaW5mbyhcImdlbWluaS11bmF2YWlsYWJsZTpzY3JhcGUtZmFsbGJhY2tcIiwgeyBxdWVyeTogcmVxdWVzdC5xdWVyeSB9KTtcbiAgICAgICAgcmV0dXJuIHJ1blNjcmFwZVNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBzaWduYWwpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGxvZ2dlci5pbmZvKFwiZ2VtaW5pLXVuYXZhaWxhYmxlOm1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICAgIGZhaWxlZE1vZGVsOiBlbmRwb2ludC5uYW1lLFxuICAgICAgZmFsbGJhY2tNb2RlbDogZmFsbGJhY2submFtZSxcbiAgICB9KTtcbiAgICByZXR1cm4gcnVuTmF0aXZlV2ViU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZmFsbGJhY2ssIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cbn1cblxuLyoqIEV4ZWN1dGUgb25lIG5hdGl2ZSBwcm92aWRlciByZXF1ZXN0IGFnYWluc3QgYW4gYWxyZWFkeS1zZWxlY3RlZCBlbmRwb2ludC4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1bk5hdGl2ZVdlYlNlYXJjaChcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBtb2RlbElkID0gZW5kcG9pbnQubmFtZTtcbiAgY29uc3QgcHJvdmlkZXIgPSB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseShcbiAgICBwb2xpY3kubW9kZWxGYW1pbHkoZW5kcG9pbnQubW9kZWxTZXJ2aWNlTmFtZSA/PyBlbmRwb2ludC5uYW1lKSxcbiAgKTtcbiAgaWYgKCFwcm92aWRlcikge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJOYXRpdmUgd2ViLXNlYXJjaCBwcm92aWRlclwiLFxuICAgICAgYE1vZGVsICR7bW9kZWxJZH0gaGFzIG5vIHN1cHBvcnRlZCBwcm92aWRlciBmYW1pbHkuYCxcbiAgICApO1xuICB9XG4gIGNvbnN0IHNwZWMgPSB3ZWJTZWFyY2hUb29sU3BlYyhwcm92aWRlciwgY29uZmlnLndlYlNlYXJjaFRvb2xzKTtcblxuICBjb25zdCB1cmwgPVxuICAgIHNwZWMuYXBpID09PSBcInJlc3BvbnNlc1wiID8gaW52b2tlLnJlc3BvbnNlc1VybChjdHguaG9zdCkgOiBpbnZva2UuY2hhdENvbXBsZXRpb25zVXJsKGN0eC5ob3N0KTtcbiAgY29uc3QgYm9keSA9XG4gICAgc3BlYy5hcGkgPT09IFwicmVzcG9uc2VzXCJcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnNwZWMucmVxdWVzdCxcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBpbnB1dDogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgICAgLi4uKHdyaXRlUHJvZ3Jlc3MgPyB7IHN0cmVhbTogdHJ1ZSB9IDoge30pLFxuICAgICAgICB9XG4gICAgICA6IHtcbiAgICAgICAgICAuLi5zcGVjLnJlcXVlc3QsXG4gICAgICAgICAgbW9kZWw6IG1vZGVsSWQsXG4gICAgICAgICAgbWVzc2FnZXM6IFt7IHJvbGU6IFwidXNlclwiLCBjb250ZW50OiByZXF1ZXN0LnF1ZXJ5IH1dLFxuICAgICAgICB9O1xuXG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBwb3N0U2VydmluZyhcbiAgICBjdHgsXG4gICAgdXJsLFxuICAgIGJvZHksXG4gICAgcnVudGltZSxcbiAgICBbXCJ3ZWItc2VhcmNoXCIsIFwic2VydmluZ1wiLCBzcGVjLmFwaSwgbW9kZWxJZCwgcmVxdWVzdC5xdWVyeV0sXG4gICAgc2lnbmFsLFxuICAgIHdyaXRlUHJvZ3Jlc3MsXG4gICk7XG5cbiAgY29uc3QgeyBhbnN3ZXIsIGNpdGF0aW9ucyB9ID1cbiAgICBzcGVjLmFwaSA9PT0gXCJyZXNwb25zZXNcIiA/IGZyb21SZXNwb25zZXNQYXlsb2FkKHBheWxvYWQpIDogZnJvbUNoYXRQYXlsb2FkKHBheWxvYWQpO1xuXG4gIGNvbnN0IHBlcm1pdHRlZCA9IGNpdGF0aW9ucy5maWx0ZXIoKGMpID0+IGNvbmZpZy5hbGxvd0xpc3QuYWxsb3dzKGMudXJsKSk7XG4gIGNvbnN0IGRyb3BwZWQgPSBjaXRhdGlvbnMubGVuZ3RoIC0gcGVybWl0dGVkLmxlbmd0aDtcbiAgY29uc3QgdHJpbW1lZCA9IHBlcm1pdHRlZC5zbGljZSgwLCBjb25maWcubWF4Q2l0YXRpb25zKTtcbiAgbG9nZ2VyLmRlYnVnKFwic2VhcmNoZWRcIiwge1xuICAgIHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LFxuICAgIG1vZGVsOiBtb2RlbElkLFxuICAgIHByb3ZpZGVyLFxuICAgIGNpdGF0aW9uczogY2l0YXRpb25zLmxlbmd0aCxcbiAgICAuLi4oZHJvcHBlZCA+IDAgPyB7IGZpbHRlcmVkOiBkcm9wcGVkIH0gOiB7fSksXG4gICAgcmV0dXJuZWQ6IHRyaW1tZWQubGVuZ3RoLFxuICB9KTtcblxuICByZXR1cm4geyBxdWVyeTogcmVxdWVzdC5xdWVyeSwgYW5zd2VyLCBjaXRhdGlvbnM6IHRyaW1tZWQsIG1vZGVsOiBtb2RlbElkIH07XG59XG4iXX0=
482
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlYXJjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixlQUFlLEVBQ2YsY0FBYyxFQUNkLG1CQUFtQixHQUNwQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN6RSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUErQixNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxTQUFTLEVBQWdDLE1BQU0sYUFBYSxDQUFDO0FBQ3RFLE9BQU8sRUFBRSxjQUFjLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDekUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLDBCQUEwQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2pHLE9BQU8sRUFDTCxXQUFXLEVBQ1gsa0JBQWtCLEdBR25CLE1BQU0sY0FBYyxDQUFDO0FBRXRCLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFJOUMsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQy9DLE1BQU0sRUFBRSxZQUFZLEVBQUUsR0FBRyxPQUFPLENBQUM7QUFDakMsTUFBTSxFQUFFLG9CQUFvQixFQUFFLEdBQUcsWUFBWSxDQUFDO0FBRTlDOzs7OztHQUtHO0FBQ0gsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLENBQUM7QUFDbkMsTUFBTSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENB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Q0FBQyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRGLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNwRCxNQUFNLE9BQU8sR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUU7UUFDdkIsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLEtBQUssRUFBRSxPQUFPO1FBQ2QsUUFBUTtRQUNSLFNBQVMsRUFBRSxTQUFTLENBQUMsTUFBTTtRQUMzQixHQUFHLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM3QyxRQUFRLEVBQUUsT0FBTyxDQUFDLE1BQU07S0FDekIsQ0FBQyxDQUFDO0lBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztBQUM5RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWIgc2VhcmNoIGJhY2tlZCBieSB0aGUgRGF0YWJyaWNrcyBNb2RlbCBTZXJ2aW5nIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wuXG4gKlxuICogVW5saWtlIGEgc2NyYXBpbmcgY2xpZW50LCB0aGUgc2VhcmNoIHJ1bnMgKmluc2lkZSogYSBtb2RlbCBjYWxsOiB3ZSBQT1NUIHRoZVxuICogcXVlcnkgdG8gdGhlIHdvcmtzcGFjZSdzIHNlcnZpbmcgZW5kcG9pbnQgd2l0aCB0aGUgcHJvdmlkZXIncyB3ZWItc2VhcmNoXG4gKiB0b29sIHNwZWMgYXR0YWNoZWQsIGFuZCB0aGUgbW9kZWwgc2VhcmNoZXMgdGhlIHdlYiBhbmQgd3JpdGVzIHRoZSBhbnN3ZXIuXG4gKiB7QGxpbmsgcnVuV2ViU2VhcmNofTpcbiAqXG4gKiAgIDEuIFJlc29sdmVzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIElOREVQRU5ERU5UTFkgb2YgdGhlIGNhbGxpbmdcbiAqICAgICAgYWdlbnQncyBjaGF0IG1vZGVsICh0aGUgYWdlbnQgbWF5IHJ1biBvbiBhIG1vZGVsIHdpdGhvdXQgd2ViIHNlYXJjaCkuXG4gKiAgICAgIEEgcGlubmVkIGBtb2RlbGAgKHJlcXVlc3Qgb3IgY29uZmlnKSBpcyBmdXp6eS1tYXRjaGVkOyBvdGhlcndpc2UgdGhlXG4gKiAgICAgIGNvbmZpZ3VyZWQgZmFsbGJhY2sgb3JkZXIgKEdlbWluaSwgdGhlbiBHUFQpIGlzIHdhbGtlZCB0byB0aGUgZmlyc3RcbiAqICAgICAgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IHRoYXQgZXhpc3RzLiBBbiBleHBsaWNpdCBidXQgdW5zdXBwb3J0ZWRcbiAqICAgICAgbW9kZWwgaXMgYSBoYXJkIGVycm9yLCBub3QgYSBzaWxlbnQgZmFsbGJhY2suXG4gKiAgIDIuIFBPU1RzIHRvIHRoZSBwcm92aWRlcidzIFJFU1Qgc3VyZmFjZSAoYC9zZXJ2aW5nLWVuZHBvaW50cy9yZXNwb25zZXNgXG4gKiAgICAgIGZvciBPcGVuQUksIGAvc2VydmluZy1lbmRwb2ludHMvY2hhdC9jb21wbGV0aW9uc2AgZm9yIEdlbWluaSkgd2l0aCB0aGVcbiAqICAgICAgbWFwcGVkIHRvb2wgc3BlYywgYXV0aGVudGljYXRlZCBhcyB0aGUgT0JPIGNhbGxlci5cbiAqICAgMy4gUmV0dXJucyB0aGUgc3ludGhlc2l6ZWQgYW5zd2VyIHBsdXMgdGhlIGNpdGVkIHNvdXJjZXMsIHdpdGggY2l0YXRpb25zXG4gKiAgICAgIHNpbGVudGx5IGZpbHRlcmVkIHRocm91Z2ggdGhlIGNvbmZpZ3VyZWQgVVJMIGFsbG93LWxpc3QuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgQ29ubmVjdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2V0RXhlY3V0aW9uQ29udGV4dCxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudFRvb2xFeGVjdXRpb25Db250ZXh0IH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0L3Rvb2wtcHJvdmlkZXJcIjtcbmltcG9ydCB7IGludm9rZSwgcG9saWN5LCByZXNvbHZlLCBtb2RlbENhdGFsb2cgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgbG9nLCBvYmplY3QsIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IG9wZW5haUNoYXQsIHR5cGUgU2VydmluZ0VuZHBvaW50U3VtbWFyeSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tb2RlbFwiO1xuaW1wb3J0IHsgTU9ERUxfRU5WLCB0eXBlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NhbGxTZXR0aW5ncywgd2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcbmltcG9ydCB7IHN1cHBvcnRzV2ViU2VhcmNoLCB3ZWJTZWFyY2hQcm92aWRlckZvckZhbWlseSwgd2ViU2VhcmNoVG9vbFNwZWMgfSBmcm9tIFwiLi9wcm92aWRlci50c1wiO1xuaW1wb3J0IHtcbiAgZXhlY3V0ZVJlYWQsXG4gIHRvV2ViU2VhcmNoUnVudGltZSxcbiAgdHlwZSBXZWJTZWFyY2hSdW50aW1lLFxuICB0eXBlIFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCxcbn0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTZWFyY2hDaXRhdGlvbiwgV2ViU2VhcmNoUmVxdWVzdCwgV2ViU2VhcmNoUmVzdWx0IH0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyBydW5TY3JhcGVTZWFyY2ggfSBmcm9tIFwiLi9zY3JhcGUudHNcIjtcblxudHlwZSBXb3Jrc3BhY2VDbGllbnRMaWtlID0gbW9kZWxDYXRhbG9nLldvcmtzcGFjZUNsaWVudExpa2UgJiBpbnZva2UuQXV0aGVudGljYXRpbmdDbGllbnRMaWtlO1xudHlwZSBQcm9ncmVzc1dyaXRlciA9IE5vbk51bGxhYmxlPEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdPjtcbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3NlYXJjaFwiKTtcbmNvbnN0IHsgbG9va3VwTW9kZWxzIH0gPSByZXNvbHZlO1xuY29uc3QgeyBsaXN0U2VydmluZ0VuZHBvaW50cyB9ID0gbW9kZWxDYXRhbG9nO1xuXG4vKipcbiAqIEhvdyBkZWVwIHRoZSBncm91bmRpbmctbWV0YWRhdGEgd2FsayBkZXNjZW5kcy4gR2VtaW5pIG5lc3RzIGl0cyBzb3VyY2VzIGFcbiAqIGhhbmRmdWwgb2YgbGV2ZWxzIGRvd24gYW5kIHRoZSBzaGFwZSB2YXJpZXMgYnkgbW9kZWwgdmVyc2lvbiwgc28gdGhlIHdhbGtcbiAqIGlzIGdlbmVyaWM7IHRoZSBib3VuZCBpcyB3aGF0IGtlZXBzIGEgcGF0aG9sb2dpY2FsIHBheWxvYWQgZnJvbSB0dXJuaW5nIGl0XG4gKiBpbnRvIGEgZnVsbCB0cmF2ZXJzYWwgb2YgdGhlIHJlc3BvbnNlLlxuICovXG5jb25zdCBNQVhfR1JPVU5ESU5HX1dBTEtfREVQVEggPSA2O1xuY29uc3QgR0VNSU5JX0NST1NTX1JFR0lPTl9DT09MRE9XTl9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5jb25zdCBHRU1JTklfQ1JPU1NfUkVHSU9OX0RJU0FCTEVEID0gL2Nyb3NzLXJlZ2lvbiBwcm9jZXNzaW5nIGlzIGRpc2FibGVkL2k7XG5cbi8qKiBMb3dlc3QgSFRUUCBzdGF0dXMgdHJlYXRlZCBhcyBhIHNlcnZlci1zaWRlIChyZXRyeWFibGUpIHNlcnZpbmcgZmFpbHVyZS4gKi9cbmNvbnN0IFNFUlZFUl9FUlJPUl9TVEFUVVMgPSA1MDA7XG5cbi8qKiBTdGF0dXMgTW9kZWwgU2VydmluZyB1c2VzIHRvIHNoZWQgbG9hZDsgcmV0cnlhYmxlIGxpa2UgYSA1eHguICovXG5jb25zdCBSQVRFX0xJTUlURURfU1RBVFVTID0gNDI5O1xuXG4vKiogQ29udGV4dCBhIHNlYXJjaCBuZWVkcyBmcm9tIHRoZSBjYWxsZXI6IHRoZSBPQk8gY2xpZW50ICsgd29ya3NwYWNlIGhvc3QuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYlNlYXJjaENvbnRleHQge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2U7XG4gIGhvc3Q6IHN0cmluZztcbiAgLyoqIFRydXN0ZWQgaWRlbnRpdHkgb2YgdGhlIGNyZWRlbnRpYWwgY2FycmllZCBieSBgY2xpZW50YC4gKi9cbiAgY2FjaGVJZGVudGl0eT86IHN0cmluZztcbn1cblxuLyoqIE1vZGVsLXNlbGVjdGlvbiBmaWVsZHMgdXNlZCB0byByYW5rIG9uZSB3ZWItc2VhcmNoIGVuZHBvaW50LiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoTW9kZWxTZWxlY3Rpb25PcHRpb25zID0gUGljazxcbiAgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWcsXG4gIFwibW9kZWxcIiB8IFwibW9kZWxGYWxsYmFja3NcIiB8IFwiZnV6enlcIiB8IFwiZnV6enlUaHJlc2hvbGRcIlxuPjtcblxuLyoqXG4gKiBSZXNvbHZlIHRoZSBPQk8gd29ya3NwYWNlIGNsaWVudCArIGhvc3QgZnJvbSB0aGUgYWN0aXZlIEFwcEtpdCBleGVjdXRpb25cbiAqIGNvbnRleHQuIEluc2lkZSBgYWdlbnQuc3RyZWFtYCdzIGBhc1VzZXIocmVxKWAgc2NvcGUgdGhpcyBoaXRzIHRoZSBzZXJ2aW5nXG4gKiBlbmRwb2ludCBhcyB0aGUgcmVxdWVzdGluZyB1c2VyOyBvdXRzaWRlIGEgdXNlciBjb250ZXh0IEFwcEtpdCBmYWxscyBiYWNrIHRvXG4gKiB0aGUgc2VydmljZSBwcmluY2lwYWwuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCgpOiBQcm9taXNlPFdlYlNlYXJjaENvbnRleHQ+IHtcbiAgY29uc3QgY3R4ID0gZ2V0RXhlY3V0aW9uQ29udGV4dCgpO1xuICBjb25zdCBob3N0ID0gKGF3YWl0IGN0eC5jbGllbnQuY29uZmlnLmdldEhvc3QoKSkudG9TdHJpbmcoKTtcbiAgY29uc3QgY2FjaGVJZGVudGl0eSA9IFwidXNlcklkXCIgaW4gY3R4ID8gY3R4LnVzZXJJZCA6IGN0eC5zZXJ2aWNlVXNlcklkO1xuICByZXR1cm4geyBjbGllbnQ6IGN0eC5jbGllbnQsIGhvc3QsIGNhY2hlSWRlbnRpdHkgfTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgd2ViLXNlYXJjaC1jYXBhYmxlIG1vZGVsIGFnYWluc3QgdGhlIExJVkUgd29ya3NwYWNlIGNhdGFsb2d1ZSAtIHNvXG4gKiB3ZSBuZXZlciByZXR1cm4gYW4gZW5kcG9pbnQgaWQgdGhhdCBpc24ndCBhY3R1YWxseSBkZXBsb3llZCAodGhlIFwiZW5kcG9pbnRcbiAqIGRvZXMgbm90IGV4aXN0XCIgZmFpbHVyZSBhIGhhcmRjb2RlZCBmYWxsYmFjayBpZCB3b3VsZCBjYXVzZSkuIFJldXNlc1xuICogYEBkYngtdG9vbHMvbW9kZWxgJ3MgZXhpc3RpbmcgY2F0YWxvZ3VlICsgcmFua2VyIHJhdGhlciB0aGFuIGEgY3VzdG9tXG4gKiBsb29rdXA6IHtAbGluayBsaXN0U2VydmluZ0VuZHBvaW50c30gbGlzdHMgdGhlIGVuZHBvaW50cyAoY2FjaGVkKSwgYW5kIHdlXG4gKiByZXN0cmljdCB0aGUgY2FuZGlkYXRlIHNldCB0aHJvdWdoIG1vZGVsLW93bmVkIGNhcGFiaWxpdHkgbWV0YWRhdGEgYmVmb3JlXG4gKiB7QGxpbmsgbG9va3VwTW9kZWxzfSByYW5rcyB3aXRoaW4gaXQuXG4gKlxuICogVGhlIGhpZ2hlc3QtcmFua2VkIEdlbWluaSBtb2RlbCB3aW5zLiBXaXRob3V0IEdlbWluaSwgYSBHUFQgcmVxdWVzdCBtYXRjaGluZ1xuICogdGhlIGNhbGxpbmcvY29uZmlndXJlZCBtb2RlbCB3aW5zLCBmb2xsb3dlZCBieSB0aGUgaGlnaGVzdC1yYW5rZWQgR1BUIG1vZGVsXG4gKiBhbmQgdGhlbiBhbnkgYWRkaXRpb25hbCBjb25maWd1cmVkIHNlYXJjaGVzLlxuICovXG5hc3luYyBmdW5jdGlvbiByZXNvbHZlV2ViU2VhcmNoTW9kZWwoXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgcmVxdWVzdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsPiB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBydW50aW1lO1xuICBjb25zdCBlbmRwb2ludHMgPSBhd2FpdCBsaXN0U2VydmluZ0VuZHBvaW50cyhjdHguY2xpZW50LCBjdHguaG9zdCwge1xuICAgIC4uLihjdHguY2FjaGVJZGVudGl0eSA/IHsgY2FjaGVJZGVudGl0eTogY3R4LmNhY2hlSWRlbnRpdHkgfSA6IHt9KSxcbiAgfSk7XG4gIHJldHVybiBzZWxlY3RXZWJTZWFyY2hFbmRwb2ludChlbmRwb2ludHMsIHJlcXVlc3RlZCwgY29uZmlnLCBhY3RpdmVGYW1pbHlDb29sZG93bnMocnVudGltZSkpO1xufVxuXG4vKiogU2VsZWN0IG9uZSBkZXBsb3llZCB3ZWItc2VhcmNoIGVuZHBvaW50IHVzaW5nIGZhbWlseSBhbmQgY2FwYWJpbGl0eSBwb2xpY3kuICovXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0V2ViU2VhcmNoRW5kcG9pbnQoXG4gIGVuZHBvaW50czogcmVhZG9ubHkgU2VydmluZ0VuZHBvaW50U3VtbWFyeVtdLFxuICByZXF1ZXN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29uZmlnOiBXZWJTZWFyY2hNb2RlbFNlbGVjdGlvbk9wdGlvbnMsXG4gIHN1cHByZXNzZWRGYW1pbGllczogUmVhZG9ubHlTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PiA9IG5ldyBTZXQoKSxcbik6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkgfCBudWxsIHtcbiAgLy8gT25seSBkZXBsb3llZCwgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50cyBhcmUgY2FuZGlkYXRlcy5cbiAgY29uc3QgY2FwYWJsZSA9IGVuZHBvaW50cy5maWx0ZXIoKGVuZHBvaW50KSA9PiB7XG4gICAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICAgIHJldHVybiBzdXBwb3J0c1dlYlNlYXJjaChlbmRwb2ludCkgJiYgKCFmYW1pbHkgfHwgIXN1cHByZXNzZWRGYW1pbGllcy5oYXMoZmFtaWx5KSk7XG4gIH0pO1xuICBjb25zdCBnZW1pbmkgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSxcbiAgICBsaW1pdDogMSxcbiAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgfSlbMF0/LmVuZHBvaW50O1xuICBpZiAoZ2VtaW5pKSByZXR1cm4gZ2VtaW5pO1xuICBjb25zdCBncHQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgIHNlYXJjaDogcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCxcbiAgICBsaW1pdDogNTAsXG4gICAgdGhyZXNob2xkOiBjb25maWcuZnV6enlUaHJlc2hvbGQsXG4gIH0pLm1hcCgoeyBlbmRwb2ludCB9KSA9PiBlbmRwb2ludCk7XG5cbiAgY29uc3QgcHJlZmVycmVkID0gcmVxdWVzdGVkID8/IGNvbmZpZy5tb2RlbDtcbiAgaWYgKHByZWZlcnJlZCAmJiBwb2xpY3kubW9kZWxGYW1pbHkocHJlZmVycmVkKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdCkge1xuICAgIGNvbnN0IG1hdGNoZWQgPSBjb25maWcuZnV6enlcbiAgICAgID8gbG9va3VwTW9kZWxzKGdwdCwge1xuICAgICAgICAgIHNlYXJjaDogcHJlZmVycmVkLFxuICAgICAgICAgIGxpbWl0OiAxLFxuICAgICAgICAgIHRocmVzaG9sZDogY29uZmlnLmZ1enp5VGhyZXNob2xkLFxuICAgICAgICB9KVswXT8uZW5kcG9pbnRcbiAgICAgIDogZ3B0LmZpbmQoKGVuZHBvaW50KSA9PiBlbmRwb2ludC5uYW1lID09PSBwcmVmZXJyZWQpO1xuICAgIGlmIChtYXRjaGVkKSByZXR1cm4gbWF0Y2hlZDtcbiAgfVxuICBpZiAoZ3B0WzBdKSByZXR1cm4gZ3B0WzBdO1xuXG4gIGZvciAoY29uc3Qgc2VhcmNoIG9mIGNvbmZpZy5tb2RlbEZhbGxiYWNrcykge1xuICAgIGlmIChcbiAgICAgIHNlYXJjaC50b0xvd2VyQ2FzZSgpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgICBzZWFyY2gudG9Mb3dlckNhc2UoKSA9PT0gcG9saWN5Lk1vZGVsRmFtaWx5LkdwdFxuICAgICkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGNvbnN0IG1hdGNoZWQgPSBsb29rdXBNb2RlbHMoY2FwYWJsZSwge1xuICAgICAgc2VhcmNoLFxuICAgICAgbGltaXQ6IDEsXG4gICAgICB0aHJlc2hvbGQ6IGNvbmZpZy5mdXp6eVRocmVzaG9sZCxcbiAgICB9KVswXT8uZW5kcG9pbnQ7XG4gICAgaWYgKG1hdGNoZWQpIHJldHVybiBtYXRjaGVkO1xuICB9XG5cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBSZXR1cm4gb25lIGVuZHBvaW50J3MgbW9kZWwtb3duZWQgZmFtaWx5IGlkZW50aXR5LiAqL1xuZnVuY3Rpb24gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQ6IFNlcnZpbmdFbmRwb2ludFN1bW1hcnkpOiBwb2xpY3kuTW9kZWxGYW1pbHkgfCB1bmRlZmluZWQge1xuICByZXR1cm4gcG9saWN5Lm1vZGVsRmFtaWx5KGVuZHBvaW50Lm1vZGVsU2VydmljZU5hbWUgPz8gZW5kcG9pbnQubmFtZSk7XG59XG5cbi8qKiBEcm9wIGV4cGlyZWQgZmFtaWx5IGNvb2xkb3ducyBhbmQgcmV0dXJuIHRoZSBjdXJyZW50bHkgc3VwcHJlc3NlZCBzZXQuICovXG5mdW5jdGlvbiBhY3RpdmVGYW1pbHlDb29sZG93bnMoXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIG5vdyA9IERhdGUubm93KCksXG4pOiBSZWFkb25seVNldDxwb2xpY3kuTW9kZWxGYW1pbHk+IHtcbiAgZm9yIChjb25zdCBbZmFtaWx5LCBleHBpcmVzQXRdIG9mIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zKSB7XG4gICAgaWYgKGV4cGlyZXNBdCA8PSBub3cpIHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmRlbGV0ZShmYW1pbHkpO1xuICB9XG4gIHJldHVybiBuZXcgU2V0KHJ1bnRpbWUuZmFtaWx5Q29vbGRvd25zLmtleXMoKSk7XG59XG5cbi8qKlxuICogUE9TVCBhIHNlcnZpbmcgcmVxdWVzdCBhcyB0aGUgT0JPIGNhbGxlciBhbmQgcmV0dXJuIHRoZSBwYXJzZWQgSlNPTiBib2R5LlxuICpcbiAqIEF1dGggaGVhZGVycyBhcmUgbWludGVkIHBlciBjYWxsIGZyb20gdGhlIE9CTyBjbGllbnQncyBTREsgY29uZmlnLCB3aGljaFxuICogcmVmcmVzaGVzIHRoZSB0b2tlbiB3aGVuIGl0IGlzIGNsb3NlIHRvIGV4cGlyeSwgc28gdGhlIHJlcXVlc3QgY2FycmllcyB0aGVcbiAqIHJlcXVlc3RpbmcgdXNlcidzIGlkZW50aXR5LlxuICpcbiAqIFRoaXMgaXMgdGhlIG9uZSBEYXRhYnJpY2tzIGNhbGwgaW4gdGhlIHJlcG8gdGhhdCBkb2VzIG5vdCBnbyB0aHJvdWdoXG4gKiBgYXBpQ2xpZW50LnJlcXVlc3RgICsgYGRhdGFicmlja3MudG9Db250ZXh0YCAod2hpY2ggZG9lcyBmb3J3YXJkXG4gKiBjYW5jZWxsYXRpb24pLiBSZXRyeSBjbGFzc2lmaWNhdGlvbiBoZXJlIGhhcyB0byBkaXN0aW5ndWlzaCBhIGxvYWQtc2hlZCBvclxuICogc2VydmVyIGZhdWx0IGZyb20gdGhpcyByZXF1ZXN0J3Mgb3duIDR4eCwgYW5kIGBmZXRjaGAgZXhwb3NlcyB0aGUgSFRUUCBzdGF0dXNcbiAqIGRpcmVjdGx5OyB0aGUgU0RLIHJhaXNlcyBhbiBgQXBpRXJyb3JgIHRoYXQgY2FycmllcyB0aGUgc3RhdHVzIHVuZGVyXG4gKiBpbmNvbnNpc3RlbnQga2V5cywgd2hpY2ggaXMgZ3Vlc3N3b3JrIGJ5IGNvbXBhcmlzb24uXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHBvc3RTZXJ2aW5nKFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIHVybDogc3RyaW5nLFxuICBib2R5OiB1bmtub3duLFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjYWNoZUtleTogcmVhZG9ubHkgKHN0cmluZyB8IG51bWJlcilbXSxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IHBheWxvYWQgPSBhd2FpdCBleGVjdXRlUmVhZChcbiAgICBydW50aW1lLFxuICAgIFwic2VydmluZy1yZXF1ZXN0XCIsXG4gICAgdG9DYWxsU2V0dGluZ3Mod2ViU2VhcmNoRXhlY3V0ZURlZmF1bHRzLCBjb25maWcudGltZW91dE1zLCBjYWNoZUtleSksXG4gICAgYXN5bmMgKGV4ZWN1dGVTaWduYWwpOiBQcm9taXNlPHVua25vd24+ID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgICAgIG1ldGhvZDogXCJQT1NUXCIsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAuLi4oYXdhaXQgaW52b2tlLmF1dGhIZWFkZXJzKGN0eC5jbGllbnQpKSxcbiAgICAgICAgICBBY2NlcHQ6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICAgIFwiQ29udGVudC1UeXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiLFxuICAgICAgICB9LFxuICAgICAgICBib2R5OiBKU09OLnN0cmluZ2lmeShib2R5KSxcbiAgICAgICAgLi4uKGV4ZWN1dGVTaWduYWwgPyB7IHNpZ25hbDogZXhlY3V0ZVNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBpZiAoIXJlc3BvbnNlLm9rKSB7XG4gICAgICAgIGNvbnN0IHJlc3BvbnNlQm9keSA9IGF3YWl0IHJlc3BvbnNlLnRleHQoKTtcbiAgICAgICAgY29uc3QgbW9kZWwgPVxuICAgICAgICAgIG9iamVjdC5pc1JlY29yZChib2R5KSAmJiB0eXBlb2YgYm9keS5tb2RlbCA9PT0gXCJzdHJpbmdcIiA/IGJvZHkubW9kZWwgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGNyb3NzUmVnaW9uRGlzYWJsZWQgPVxuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyA9PT0gNDAwICYmXG4gICAgICAgICAgbW9kZWwgJiZcbiAgICAgICAgICBwb2xpY3kubW9kZWxGYW1pbHkobW9kZWwpID09PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pICYmXG4gICAgICAgICAgR0VNSU5JX0NST1NTX1JFR0lPTl9ESVNBQkxFRC50ZXN0KHJlc3BvbnNlQm9keSk7XG4gICAgICAgIGlmIChjcm9zc1JlZ2lvbkRpc2FibGVkKSB7XG4gICAgICAgICAgY29uc3QgZXhwaXJlc0F0ID0gRGF0ZS5ub3coKSArIEdFTUlOSV9DUk9TU19SRUdJT05fQ09PTERPV05fTVM7XG4gICAgICAgICAgcnVudGltZS5mYW1pbHlDb29sZG93bnMuc2V0KHBvbGljeS5Nb2RlbEZhbWlseS5HZW1pbmksIGV4cGlyZXNBdCk7XG4gICAgICAgICAgcnVudGltZS5hdmFpbGFibGVGYW1pbGllcy5kZWxldGUocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbG9nZ2VyLmVycm9yKFwic2VydmluZy1yZXF1ZXN0LXJlamVjdGVkXCIsIHtcbiAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgYXBpOiB1cmwuZW5kc1dpdGgoXCIvcmVzcG9uc2VzXCIpID8gXCJyZXNwb25zZXNcIiA6IFwiY2hhdFwiLFxuICAgICAgICAgICAgdXJsLFxuICAgICAgICAgICAgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMsXG4gICAgICAgICAgICByZXNwb25zZUJvZHksXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTG9hZC1zaGVkZGluZyBhbmQgc2VydmVyIGZhdWx0cyBhcmUgd29ydGggYW5vdGhlciBhdHRlbXB0OyBhIDR4eCBpc1xuICAgICAgICAvLyB0aGlzIHJlcXVlc3QncyBvd24gcHJvYmxlbSwgc28gaXQgbXVzdCBub3QgYmUgcmV0cmllZC5cbiAgICAgICAgY29uc3QgcmV0cnlhYmxlID1cbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMgPj0gU0VSVkVSX0VSUk9SX1NUQVRVUyB8fCByZXNwb25zZS5zdGF0dXMgPT09IFJBVEVfTElNSVRFRF9TVEFUVVM7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBgd2ViLXNlYXJjaDogTW9kZWwgU2VydmluZyByZWplY3RlZCB0aGUgc2VhcmNoIHJlcXVlc3QgKEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9KWA7XG4gICAgICAgIHRocm93IHJldHJ5YWJsZVxuICAgICAgICAgID8gbmV3IENvbm5lY3Rpb25FcnJvcihtZXNzYWdlLCB7IGNvbnRleHQ6IHsgc3RhdHVzOiByZXNwb25zZS5zdGF0dXMgfSB9KVxuICAgICAgICAgIDogbmV3IEV4ZWN1dGlvbkVycm9yKG1lc3NhZ2UsIHsgY29udGV4dDogeyBzdGF0dXM6IHJlc3BvbnNlLnN0YXR1cyB9IH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyaXRlUHJvZ3Jlc3MgJiZcbiAgICAgICAgcmVzcG9uc2UuYm9keSAmJlxuICAgICAgICByZXNwb25zZS5oZWFkZXJzLmdldChcImNvbnRlbnQtdHlwZVwiKT8uaW5jbHVkZXMoXCJ0ZXh0L2V2ZW50LXN0cmVhbVwiKVxuICAgICAgICA/IHJlYWRTdHJlYW1pbmdSZXNwb25zZShyZXNwb25zZSwgd3JpdGVQcm9ncmVzcylcbiAgICAgICAgOiByZXNwb25zZS5qc29uKCk7XG4gICAgfSxcbiAgICBzaWduYWwsXG4gICAgZmFsc2UsXG4gICk7XG4gIHJldHVybiBvYmplY3QuaXNSZWNvcmQocGF5bG9hZCkgPyBwYXlsb2FkIDoge307XG59XG5cbi8qKiBDb25zdW1lIGFuIE9wZW5BSSBSZXNwb25zZXMgU1NFIHN0cmVhbSBhbmQgcmV0YWluIGl0cyBjb21wbGV0ZWQgcmVzcG9uc2UuICovXG5hc3luYyBmdW5jdGlvbiByZWFkU3RyZWFtaW5nUmVzcG9uc2UoXG4gIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgd3JpdGVQcm9ncmVzczogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIHVua25vd24+PiB7XG4gIGNvbnN0IHJlYWRlciA9IHJlc3BvbnNlLmJvZHkhLmdldFJlYWRlcigpO1xuICBjb25zdCBkZWNvZGVyID0gbmV3IFRleHREZWNvZGVyKCk7XG4gIGxldCBidWZmZXIgPSBcIlwiO1xuICBsZXQgY29tcGxldGVkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgY29uc3VtZSA9IGFzeW5jIChmcmFtZTogc3RyaW5nKSA9PiB7XG4gICAgY29uc3QgZGF0YSA9IGZyYW1lXG4gICAgICAuc3BsaXQoXCJcXG5cIilcbiAgICAgIC5maWx0ZXIoKGxpbmUpID0+IGxpbmUuc3RhcnRzV2l0aChcImRhdGE6XCIpKVxuICAgICAgLm1hcCgobGluZSkgPT4gbGluZS5zbGljZSg1KS50cmltU3RhcnQoKSlcbiAgICAgIC5qb2luKFwiXFxuXCIpO1xuICAgIGlmICghZGF0YSB8fCBkYXRhID09PSBcIltET05FXVwiKSByZXR1cm47XG4gICAgY29uc3QgZXZlbnQgPSBKU09OLnBhcnNlKGRhdGEpIGFzIHVua25vd247XG4gICAgaWYgKCFvYmplY3QuaXNSZWNvcmQoZXZlbnQpIHx8IHR5cGVvZiBldmVudC50eXBlICE9PSBcInN0cmluZ1wiKSByZXR1cm47XG4gICAgYXdhaXQgZW1pdFdlYlNlYXJjaFByb2dyZXNzKGV2ZW50LCB3cml0ZVByb2dyZXNzKTtcbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJyZXNwb25zZS5jb21wbGV0ZWRcIiAmJiBvYmplY3QuaXNSZWNvcmQoZXZlbnQucmVzcG9uc2UpKSB7XG4gICAgICBjb21wbGV0ZWQgPSBldmVudC5yZXNwb25zZTtcbiAgICB9XG4gICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzcG9uc2UuZmFpbGVkXCIpIHtcbiAgICAgIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIndlYi1zZWFyY2g6IHN0cmVhbWluZyByZXNwb25zZSBmYWlsZWRcIiwge1xuICAgICAgICBjb250ZXh0OiB7IHJlc3BvbnNlOiBldmVudC5yZXNwb25zZSB9LFxuICAgICAgfSk7XG4gICAgfVxuICB9O1xuXG4gIGZvciAoOzspIHtcbiAgICBjb25zdCB7IGRvbmUsIHZhbHVlIH0gPSBhd2FpdCByZWFkZXIucmVhZCgpO1xuICAgIGJ1ZmZlciArPSBkZWNvZGVyLmRlY29kZSh2YWx1ZSwgeyBzdHJlYW06ICFkb25lIH0pO1xuICAgIGJ1ZmZlciA9IGJ1ZmZlci5yZXBsYWNlQWxsKFwiXFxyXFxuXCIsIFwiXFxuXCIpO1xuICAgIGxldCBib3VuZGFyeSA9IGJ1ZmZlci5pbmRleE9mKFwiXFxuXFxuXCIpO1xuICAgIHdoaWxlIChib3VuZGFyeSA+PSAwKSB7XG4gICAgICBhd2FpdCBjb25zdW1lKGJ1ZmZlci5zbGljZSgwLCBib3VuZGFyeSkpO1xuICAgICAgYnVmZmVyID0gYnVmZmVyLnNsaWNlKGJvdW5kYXJ5ICsgMik7XG4gICAgICBib3VuZGFyeSA9IGJ1ZmZlci5pbmRleE9mKFwiXFxuXFxuXCIpO1xuICAgIH1cbiAgICBpZiAoZG9uZSkgYnJlYWs7XG4gIH1cbiAgaWYgKGJ1ZmZlci50cmltKCkpIGF3YWl0IGNvbnN1bWUoYnVmZmVyKTtcbiAgaWYgKCFjb21wbGV0ZWQpIHRocm93IG5ldyBFeGVjdXRpb25FcnJvcihcIndlYi1zZWFyY2g6IHN0cmVhbWluZyByZXNwb25zZSBkaWQgbm90IGNvbXBsZXRlXCIpO1xuICByZXR1cm4gY29tcGxldGVkO1xufVxuXG4vKiogUHVibGlzaCBuYXRpdmUgd2ViLXNlYXJjaCBsaWZlY3ljbGUgZXZlbnRzIGFzIGNvbW1vbiB0b29sIHByb2dyZXNzLiAqL1xuYXN5bmMgZnVuY3Rpb24gZW1pdFdlYlNlYXJjaFByb2dyZXNzKFxuICBldmVudDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIHdyaXRlUHJvZ3Jlc3M6IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGlmIChldmVudC50eXBlICE9PSBcInJlc3BvbnNlLm91dHB1dF9pdGVtLmRvbmVcIiB8fCAhb2JqZWN0LmlzUmVjb3JkKGV2ZW50Lml0ZW0pKSByZXR1cm47XG4gIGNvbnN0IGFjdGlvbiA9IG9iamVjdC5pc1JlY29yZChldmVudC5pdGVtLmFjdGlvbikgPyBldmVudC5pdGVtLmFjdGlvbiA6IHVuZGVmaW5lZDtcbiAgaWYgKCFhY3Rpb24gfHwgYWN0aW9uLnR5cGUgIT09IFwic2VhcmNoXCIpIHJldHVybjtcbiAgY29uc3QgcXVlcnkgPSB0eXBlb2YgYWN0aW9uLnF1ZXJ5ID09PSBcInN0cmluZ1wiID8gYWN0aW9uLnF1ZXJ5IDogdW5kZWZpbmVkO1xuICBjb25zdCBxdWVyaWVzID0gQXJyYXkuaXNBcnJheShhY3Rpb24ucXVlcmllcylcbiAgICA/IGFjdGlvbi5xdWVyaWVzLmZpbHRlcigodmFsdWUpOiB2YWx1ZSBpcyBzdHJpbmcgPT4gdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiKVxuICAgIDogW107XG4gIGNvbnN0IGdyb3VwSWQgPVxuICAgIHR5cGVvZiBldmVudC5pdGVtLmlkID09PSBcInN0cmluZ1wiXG4gICAgICA/IGV2ZW50Lml0ZW0uaWRcbiAgICAgIDogYHNlYXJjaC0ke1N0cmluZyhldmVudC5zZXF1ZW5jZV9udW1iZXIgPz8gcXVlcnkgPz8gXCJ1bmtub3duXCIpfWA7XG4gIGNvbnN0IHJlc3VsdENvdW50ID0gcXVlcmllcy5sZW5ndGggPiAwID8gcXVlcmllcy5sZW5ndGggOiBxdWVyeSA/IDEgOiAwO1xuICBhd2FpdCB3cml0ZVByb2dyZXNzKHtcbiAgICB0eXBlOiBcInRvb2xfc3RhdHVzXCIsXG4gICAgc3RhdHVzOiBcInNlYXJjaFwiLFxuICAgIG1lc3NhZ2U6IHF1ZXJ5ID8/IFwidGhlIHdlYlwiLFxuICAgIGdyb3VwSWQsXG4gIH0pO1xuICBhd2FpdCB3cml0ZVByb2dyZXNzKHtcbiAgICB0eXBlOiBcInRvb2xfc3RhdHVzXCIsXG4gICAgc3RhdHVzOiBcInJlc3VsdFwiLFxuICAgIG1lc3NhZ2U6IFwiUmVzdWx0XCIsXG4gICAgZ3JvdXBJZCxcbiAgICAuLi4ocmVzdWx0Q291bnQgPiAwXG4gICAgICA/IHsgZGV0YWlsOiBgJHtyZXN1bHRDb3VudH0gJHtyZXN1bHRDb3VudCA9PT0gMSA/IFwicmVzdWx0XCIgOiBcInJlc3VsdHNcIn1gIH1cbiAgICAgIDoge30pLFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlc3BvbnNlIGV4dHJhY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRXh0cmFjdCBhbnN3ZXIgdGV4dCBhbmQgY2l0YXRpb25zIGZyb20gYW4gT3BlbkFJIFJlc3BvbnNlcyBBUEkgcGF5bG9hZC5cbiAqL1xuZnVuY3Rpb24gZnJvbVJlc3BvbnNlc1BheWxvYWQocGF5bG9hZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pOiB7XG4gIGFuc3dlcjogc3RyaW5nO1xuICBjaXRhdGlvbnM6IFdlYlNlYXJjaENpdGF0aW9uW107XG59IHtcbiAgY29uc3Qgb3V0cHV0ID0gQXJyYXkuaXNBcnJheShwYXlsb2FkLm91dHB1dCkgPyBwYXlsb2FkLm91dHB1dCA6IFtdO1xuICBjb25zdCB0ZXh0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBpdGVtIG9mIG91dHB1dCkge1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKGl0ZW0pKSBjb250aW51ZTtcbiAgICBjb25zdCBwYXJ0cyA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRQYXJ0cyhpdGVtLmNvbnRlbnQpO1xuICAgIGlmICghcGFydHMpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3QgcGFydCBvZiBwYXJ0cykge1xuICAgICAgaWYgKCFvYmplY3QuaXNSZWNvcmQocGFydCkpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgdGV4dCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHBhcnQudGV4dCk7XG4gICAgICBpZiAodGV4dCkgdGV4dHMucHVzaCh0ZXh0KTtcbiAgICAgIGNvbnN0IGFubm90YXRpb25zID0gQXJyYXkuaXNBcnJheShwYXJ0LmFubm90YXRpb25zKSA/IHBhcnQuYW5ub3RhdGlvbnMgOiBbXTtcbiAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykge1xuICAgICAgICBpZiAoIW9iamVjdC5pc1JlY29yZChhbm5vdGF0aW9uKSkgY29udGludWU7XG4gICAgICAgIGNvbnN0IHVybCA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KGFubm90YXRpb24udXJsKTtcbiAgICAgICAgaWYgKCF1cmwgfHwgc2Vlbi5oYXModXJsKSkgY29udGludWU7XG4gICAgICAgIHNlZW4uYWRkKHVybCk7XG4gICAgICAgIGNvbnN0IHRpdGxlID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkoYW5ub3RhdGlvbi50aXRsZSk7XG4gICAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IGFuc3dlciA9IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHBheWxvYWQub3V0cHV0X3RleHQpIHx8IHRleHRzLmpvaW4oXCJcXG5cIikudHJpbSgpO1xuICByZXR1cm4geyBhbnN3ZXIsIGNpdGF0aW9ucyB9O1xufVxuXG4vKipcbiAqIEV4dHJhY3QgYW5zd2VyIHRleHQgKyBjaXRhdGlvbnMgZnJvbSBhIENoYXQgQ29tcGxldGlvbnMgcGF5bG9hZCAoR2VtaW5pIHZpYVxuICogYGdvb2dsZV9zZWFyY2hgKS4gVGhlIGFuc3dlciBpcyBgY2hvaWNlc1swXS5tZXNzYWdlLmNvbnRlbnRgOyBncm91bmRpbmdcbiAqIHNvdXJjZXMsIHdoZW4gcHJlc2VudCwgc3VyZmFjZSB1bmRlciBgY2hvaWNlc1swXS5tZXNzYWdlYCBncm91bmRpbmdcbiAqIG1ldGFkYXRhIChiZXN0LWVmZm9ydCAtIHNoYXBlcyB2YXJ5LCBzbyB3ZSBzY2FuIGZvciB1cmwtYmVhcmluZyBlbnRyaWVzKS5cbiAqL1xuZnVuY3Rpb24gZnJvbUNoYXRQYXlsb2FkKHBheWxvYWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+KToge1xuICBhbnN3ZXI6IHN0cmluZztcbiAgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdO1xufSB7XG4gIGNvbnN0IGNob2ljZXMgPSBBcnJheS5pc0FycmF5KHBheWxvYWQuY2hvaWNlcykgPyBwYXlsb2FkLmNob2ljZXMgOiBbXTtcbiAgY29uc3QgZmlyc3QgPSBjaG9pY2VzWzBdO1xuICBjb25zdCBtZXNzYWdlID0gb2JqZWN0LmlzUmVjb3JkKGZpcnN0KSAmJiBvYmplY3QuaXNSZWNvcmQoZmlyc3QubWVzc2FnZSkgPyBmaXJzdC5tZXNzYWdlIDoge307XG4gIGNvbnN0IGFuc3dlciA9IG9wZW5haUNoYXQuY2hhdENvbnRlbnRUb1RleHQobWVzc2FnZS5jb250ZW50KTtcbiAgY29uc3QgY2l0YXRpb25zOiBXZWJTZWFyY2hDaXRhdGlvbltdID0gW107XG4gIC8vIEJlc3QtZWZmb3J0IGdyb3VuZGluZyBleHRyYWN0aW9uOiB3YWxrIGFueSBuZXN0ZWQgb2JqZWN0IGZvciB7dXJpfHVybCx0aXRsZX0uXG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgdmlzaXQgPSAodjogdW5rbm93biwgZGVwdGg6IG51bWJlcik6IHZvaWQgPT4ge1xuICAgIGlmIChkZXB0aCA+IE1BWF9HUk9VTkRJTkdfV0FMS19ERVBUSCB8fCAhb2JqZWN0LmlzUmVjb3JkKHYpKSByZXR1cm47XG4gICAgY29uc3QgdXJsID0gc3RyaW5nVXRpbHMudHJpbVRvRW1wdHkodi51cmwpIHx8IHN0cmluZ1V0aWxzLnRyaW1Ub0VtcHR5KHYudXJpKTtcbiAgICBpZiAodXJsICYmICFzZWVuLmhhcyh1cmwpKSB7XG4gICAgICBzZWVuLmFkZCh1cmwpO1xuICAgICAgY29uc3QgdGl0bGUgPSBzdHJpbmdVdGlscy50cmltVG9FbXB0eSh2LnRpdGxlKTtcbiAgICAgIGNpdGF0aW9ucy5wdXNoKHsgdXJsLCAuLi4odGl0bGUgPyB7IHRpdGxlIH0gOiB7fSkgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmFsIG9mIE9iamVjdC52YWx1ZXModikpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbCkpIHZhbC5mb3JFYWNoKCh4KSA9PiB2aXNpdCh4LCBkZXB0aCArIDEpKTtcbiAgICAgIGVsc2UgaWYgKHZhbCAmJiB0eXBlb2YgdmFsID09PSBcIm9iamVjdFwiKSB2aXNpdCh2YWwsIGRlcHRoICsgMSk7XG4gICAgfVxuICB9O1xuICB2aXNpdChtZXNzYWdlLmdyb3VuZGluZ19tZXRhZGF0YSA/PyBtZXNzYWdlLmdyb3VuZGluZ01ldGFkYXRhLCAwKTtcbiAgcmV0dXJuIHsgYW5zd2VyLCBjaXRhdGlvbnMgfTtcbn1cblxuLyoqXG4gKiBSdW4gYSB3ZWIgc2VhcmNoLiBQcmVmZXJzIHRoZSBEYXRhYnJpY2tzIG5hdGl2ZSB3ZWItc2VhcmNoIHRvb2wgb24gYVxuICogZGVwbG95ZWQgR1BUL0dlbWluaSBlbmRwb2ludCAoc3ludGhlc2l6ZWQgYW5zd2VyICsgY2l0YXRpb25zKTsgd2hlbiB0aGVcbiAqIHdvcmtzcGFjZSBoYXMgbm8gc3VjaCBlbmRwb2ludCBBTkQgdGhlIHNjcmFwZSBmYWxsYmFjayBpcyBlbmFibGVkLCBmYWxsc1xuICogYmFjayB0byBhIER1Y2tEdWNrR28gc2NyYXBlIHNvIHRoZSB0b29sIHN0aWxsIHJldHVybnMgcmVzdWx0cyBpbnN0ZWFkIG9mXG4gKiBlcnJvcmluZy4gQ2l0YXRpb25zIGFyZSBmaWx0ZXJlZCB0aHJvdWdoIHRoZSBjb25maWd1cmVkIFVSTCBhbGxvdy1saXN0LlxuICpcbiAqIGBzaWduYWxgIGNhbmNlbHMgdGhlIHdob2xlIGNhbGwsIGluY2x1ZGluZyB0aGUgaW4tZmxpZ2h0IHNlcnZpbmcgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldlYlNlYXJjaChcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZU9yQ29uZmlnOiBXZWJTZWFyY2hSdW50aW1lSW5wdXQsXG4gIGN0eDogV2ViU2VhcmNoQ29udGV4dCxcbiAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gIHdyaXRlUHJvZ3Jlc3M/OiBQcm9ncmVzc1dyaXRlcixcbik6IFByb21pc2U8V2ViU2VhcmNoUmVzdWx0PiB7XG4gIGNvbnN0IHJ1bnRpbWUgPSB0b1dlYlNlYXJjaFJ1bnRpbWUocnVudGltZU9yQ29uZmlnKTtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IGVuZHBvaW50ID0gYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaE1vZGVsKGN0eCwgcnVudGltZSwgcmVxdWVzdC5tb2RlbCk7XG5cbiAgaWYgKGVuZHBvaW50ID09PSBudWxsKSB7XG4gICAgLy8gTm8gbmF0aXZlIHdlYi1zZWFyY2ggbW9kZWwgZGVwbG95ZWQgaW4gdGhpcyB3b3Jrc3BhY2UuXG4gICAgaWYgKGNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgbG9nZ2VyLmluZm8oXCJuby1uYXRpdmUtbW9kZWw6c2NyYXBlLWZhbGxiYWNrXCIsIHsgcXVlcnk6IHJlcXVlc3QucXVlcnkgfSk7XG4gICAgICByZXR1cm4gcnVuU2NyYXBlU2VhcmNoKHJlcXVlc3QsIHJ1bnRpbWUsIHNpZ25hbCk7XG4gICAgfVxuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgXCJXZWItc2VhcmNoLWNhcGFibGUgc2VydmluZyBlbmRwb2ludFwiLFxuICAgICAgXCJObyBHUFQvR2VtaW5pIGVuZHBvaW50IGlzIGRlcGxveWVkIGluIHRoaXMgd29ya3NwYWNlIGFuZCB0aGUgc2NyYXBlIGZhbGxiYWNrIGlzIFwiICtcbiAgICAgICAgYGRpc2FibGVkLiBEZXBsb3kgYSBzdXBwb3J0ZWQgZW5kcG9pbnQsIHNldCBtb2RlbCBvciAke01PREVMX0VOVn0sIG9yIGVuYWJsZSB0aGUgYCArXG4gICAgICAgIFwiZmFsbGJhY2sgKFdFQl9TRUFSQ0hfU0NSQVBFX0ZBTExCQUNLPTEpLlwiLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gcnVuU2VsZWN0ZWRXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbn1cblxuLyoqIFJ1biBvbmUgc2VsZWN0ZWQgZmFtaWx5IGFmdGVyIGl0cyBmaXJzdCByZXF1ZXN0IGVzdGFibGlzaGVzIGF2YWlsYWJpbGl0eS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlbGVjdGVkV2ViU2VhcmNoKFxuICByZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgd3JpdGVQcm9ncmVzcz86IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgY29uc3QgZmFtaWx5ID0gZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpO1xuICBpZiAoIWZhbWlseSB8fCBydW50aW1lLmF2YWlsYWJsZUZhbWlsaWVzLmhhcyhmYW1pbHkpKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBhd2FpdCBydW5OYXRpdmVXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHJ1blNlYXJjaEZhbGxiYWNrKHJlcXVlc3QsIHJ1bnRpbWUsIGN0eCwgZW5kcG9pbnQsIGVycm9yLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFjdGl2ZVByb2JlID0gcnVudGltZS5mYW1pbHlQcm9iZXMuZ2V0KGZhbWlseSk7XG4gIGlmIChhY3RpdmVQcm9iZSkge1xuICAgIHNpZ25hbD8udGhyb3dJZkFib3J0ZWQoKTtcbiAgICBhd2FpdCBhY3RpdmVQcm9iZTtcbiAgICBzaWduYWw/LnRocm93SWZBYm9ydGVkKCk7XG4gICAgcmV0dXJuIHJ1bldlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cblxuICBsZXQgcmVsZWFzZVByb2JlITogKCkgPT4gdm9pZDtcbiAgY29uc3QgcHJvYmUgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgIHJlbGVhc2VQcm9iZSA9IHJlc29sdmU7XG4gIH0pO1xuICBydW50aW1lLmZhbWlseVByb2Jlcy5zZXQoZmFtaWx5LCBwcm9iZSk7XG5cbiAgaWYgKHJ1bnRpbWUuYXZhaWxhYmxlRmFtaWxpZXMuaGFzKGZhbWlseSkgfHwgYWN0aXZlRmFtaWx5Q29vbGRvd25zKHJ1bnRpbWUpLmhhcyhmYW1pbHkpKSB7XG4gICAgcnVudGltZS5mYW1pbHlQcm9iZXMuZGVsZXRlKGZhbWlseSk7XG4gICAgcmVsZWFzZVByb2JlKCk7XG4gICAgcmV0dXJuIHJ1bldlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIHNpZ25hbCwgd3JpdGVQcm9ncmVzcyk7XG4gIH1cblxuICBsZXQgZmFpbHVyZTogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBydW5OYXRpdmVXZWJTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgY3R4LCBlbmRwb2ludCwgc2lnbmFsLCB3cml0ZVByb2dyZXNzKTtcbiAgICBydW50aW1lLmF2YWlsYWJsZUZhbWlsaWVzLmFkZChmYW1pbHkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgZmFpbHVyZSA9IGVycm9yO1xuICB9IGZpbmFsbHkge1xuICAgIGlmIChydW50aW1lLmZhbWlseVByb2Jlcy5nZXQoZmFtaWx5KSA9PT0gcHJvYmUpIHJ1bnRpbWUuZmFtaWx5UHJvYmVzLmRlbGV0ZShmYW1pbHkpO1xuICAgIHJlbGVhc2VQcm9iZSgpO1xuICB9XG4gIHJldHVybiBydW5TZWFyY2hGYWxsYmFjayhyZXF1ZXN0LCBydW50aW1lLCBjdHgsIGVuZHBvaW50LCBmYWlsdXJlLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xufVxuXG4vKiogUmVzb2x2ZSBhIGNhY2hlZCBmYW1pbHkgZmFpbHVyZSB0byBhbm90aGVyIG1vZGVsIG9yIHRoZSBzY3JhcGUgZmFsbGJhY2suICovXG5hc3luYyBmdW5jdGlvbiBydW5TZWFyY2hGYWxsYmFjayhcbiAgcmVxdWVzdDogV2ViU2VhcmNoUmVxdWVzdCxcbiAgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSxcbiAgY3R4OiBXZWJTZWFyY2hDb250ZXh0LFxuICBlbmRwb2ludDogU2VydmluZ0VuZHBvaW50U3VtbWFyeSxcbiAgZXJyb3I6IHVua25vd24sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICB3cml0ZVByb2dyZXNzPzogUHJvZ3Jlc3NXcml0ZXIsXG4pOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICBpZiAoXG4gICAgZW5kcG9pbnRGYW1pbHkoZW5kcG9pbnQpICE9PSBwb2xpY3kuTW9kZWxGYW1pbHkuR2VtaW5pIHx8XG4gICAgIWFjdGl2ZUZhbWlseUNvb2xkb3ducyhydW50aW1lKS5oYXMocG9saWN5Lk1vZGVsRmFtaWx5LkdlbWluaSlcbiAgKSB7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgY29uc3QgZmFsbGJhY2sgPSBhd2FpdCByZXNvbHZlV2ViU2VhcmNoTW9kZWwoY3R4LCBydW50aW1lLCByZXF1ZXN0Lm1vZGVsKTtcbiAgaWYgKCFmYWxsYmFjaykge1xuICAgIGlmIChydW50aW1lLmNvbmZpZy5zY3JhcGVGYWxsYmFjaykge1xuICAgICAgbG9nZ2VyLndhcm4oXCJ3ZWItc2VhcmNoLW1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICAgICAgZmFpbGVkTW9kZWw6IGVuZHBvaW50Lm5hbWUsXG4gICAgICAgIGZhbGxiYWNrOiBcInNjcmFwZVwiLFxuICAgICAgICByZWFzb246IFwiY3Jvc3MtcmVnaW9uLWRpc2FibGVkXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBydW5TY3JhcGVTZWFyY2gocmVxdWVzdCwgcnVudGltZSwgc2lnbmFsKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbiAgbG9nZ2VyLndhcm4oXCJ3ZWItc2VhcmNoLW1vZGVsLWZhbGxiYWNrXCIsIHtcbiAgICBmYWlsZWRNb2RlbDogZW5kcG9pbnQubmFtZSxcbiAgICBmYWxsYmFja01vZGVsOiBmYWxsYmFjay5uYW1lLFxuICAgIHJlYXNvbjogXCJjcm9zcy1yZWdpb24tZGlzYWJsZWRcIixcbiAgfSk7XG4gIHJldHVybiBydW5TZWxlY3RlZFdlYlNlYXJjaChyZXF1ZXN0LCBydW50aW1lLCBjdHgsIGZhbGxiYWNrLCBzaWduYWwsIHdyaXRlUHJvZ3Jlc3MpO1xufVxuXG4vKiogRXhlY3V0ZSBvbmUgbmF0aXZlIHByb3ZpZGVyIHJlcXVlc3QgYWdhaW5zdCBhbiBhbHJlYWR5LXNlbGVjdGVkIGVuZHBvaW50LiAqL1xuYXN5bmMgZnVuY3Rpb24gcnVuTmF0aXZlV2ViU2VhcmNoKFxuICByZXF1ZXN0OiBXZWJTZWFyY2hSZXF1ZXN0LFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBjdHg6IFdlYlNlYXJjaENvbnRleHQsXG4gIGVuZHBvaW50OiBTZXJ2aW5nRW5kcG9pbnRTdW1tYXJ5LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgd3JpdGVQcm9ncmVzcz86IFByb2dyZXNzV3JpdGVyLFxuKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+IHtcbiAgY29uc3QgeyBjb25maWcgfSA9IHJ1bnRpbWU7XG4gIGNvbnN0IG1vZGVsSWQgPSBlbmRwb2ludC5uYW1lO1xuICBjb25zdCBwcm92aWRlciA9IHdlYlNlYXJjaFByb3ZpZGVyRm9yRmFtaWx5KFxuICAgIHBvbGljeS5tb2RlbEZhbWlseShlbmRwb2ludC5tb2RlbFNlcnZpY2VOYW1lID8/IGVuZHBvaW50Lm5hbWUpLFxuICApO1xuICBpZiAoIXByb3ZpZGVyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBcIk5hdGl2ZSB3ZWItc2VhcmNoIHByb3ZpZGVyXCIsXG4gICAgICBgTW9kZWwgJHttb2RlbElkfSBoYXMgbm8gc3VwcG9ydGVkIHByb3ZpZGVyIGZhbWlseS5gLFxuICAgICk7XG4gIH1cbiAgY29uc3Qgc3BlYyA9IHdlYlNlYXJjaFRvb2xTcGVjKHByb3ZpZGVyLCBjb25maWcud2ViU2VhcmNoVG9vbHMpO1xuXG4gIGNvbnN0IHVybCA9XG4gICAgc3BlYy5hcGkgPT09IFwicmVzcG9uc2VzXCIgPyBpbnZva2UucmVzcG9uc2VzVXJsKGN0eC5ob3N0KSA6IGludm9rZS5jaGF0Q29tcGxldGlvbnNVcmwoY3R4Lmhvc3QpO1xuICBjb25zdCBib2R5ID1cbiAgICBzcGVjLmFwaSA9PT0gXCJyZXNwb25zZXNcIlxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3BlYy5yZXF1ZXN0LFxuICAgICAgICAgIG1vZGVsOiBtb2RlbElkLFxuICAgICAgICAgIGlucHV0OiBbeyByb2xlOiBcInVzZXJcIiwgY29udGVudDogcmVxdWVzdC5xdWVyeSB9XSxcbiAgICAgICAgICAuLi4od3JpdGVQcm9ncmVzcyA/IHsgc3RyZWFtOiB0cnVlIH0gOiB7fSksXG4gICAgICAgIH1cbiAgICAgIDoge1xuICAgICAgICAgIC4uLnNwZWMucmVxdWVzdCxcbiAgICAgICAgICBtb2RlbDogbW9kZWxJZCxcbiAgICAgICAgICBtZXNzYWdlczogW3sgcm9sZTogXCJ1c2VyXCIsIGNvbnRlbnQ6IHJlcXVlc3QucXVlcnkgfV0sXG4gICAgICAgIH07XG5cbiAgY29uc3QgcGF5bG9hZCA9IGF3YWl0IHBvc3RTZXJ2aW5nKFxuICAgIGN0eCxcbiAgICB1cmwsXG4gICAgYm9keSxcbiAgICBydW50aW1lLFxuICAgIFtcIndlYi1zZWFyY2hcIiwgXCJzZXJ2aW5nXCIsIHNwZWMuYXBpLCBtb2RlbElkLCByZXF1ZXN0LnF1ZXJ5XSxcbiAgICBzaWduYWwsXG4gICAgd3JpdGVQcm9ncmVzcyxcbiAgKTtcblxuICBjb25zdCB7IGFuc3dlciwgY2l0YXRpb25zIH0gPVxuICAgIHNwZWMuYXBpID09PSBcInJlc3BvbnNlc1wiID8gZnJvbVJlc3BvbnNlc1BheWxvYWQocGF5bG9hZCkgOiBmcm9tQ2hhdFBheWxvYWQocGF5bG9hZCk7XG5cbiAgY29uc3QgcGVybWl0dGVkID0gY2l0YXRpb25zLmZpbHRlcigoYykgPT4gY29uZmlnLmFsbG93TGlzdC5hbGxvd3MoYy51cmwpKTtcbiAgY29uc3QgZHJvcHBlZCA9IGNpdGF0aW9ucy5sZW5ndGggLSBwZXJtaXR0ZWQubGVuZ3RoO1xuICBjb25zdCB0cmltbWVkID0gcGVybWl0dGVkLnNsaWNlKDAsIGNvbmZpZy5tYXhDaXRhdGlvbnMpO1xuICBsb2dnZXIuZGVidWcoXCJzZWFyY2hlZFwiLCB7XG4gICAgcXVlcnk6IHJlcXVlc3QucXVlcnksXG4gICAgbW9kZWw6IG1vZGVsSWQsXG4gICAgcHJvdmlkZXIsXG4gICAgY2l0YXRpb25zOiBjaXRhdGlvbnMubGVuZ3RoLFxuICAgIC4uLihkcm9wcGVkID4gMCA/IHsgZmlsdGVyZWQ6IGRyb3BwZWQgfSA6IHt9KSxcbiAgICByZXR1cm5lZDogdHJpbW1lZC5sZW5ndGgsXG4gIH0pO1xuXG4gIHJldHVybiB7IHF1ZXJ5OiByZXF1ZXN0LnF1ZXJ5LCBhbnN3ZXIsIGNpdGF0aW9uczogdHJpbW1lZCwgbW9kZWw6IG1vZGVsSWQgfTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -27,12 +27,12 @@
27
27
  },
28
28
  "dependencies": {
29
29
  "@databricks/appkit": "0.81.0",
30
- "@dbx-tools/appkit": "^0.9.132",
31
- "@dbx-tools/core": "^0.9.132",
32
- "@dbx-tools/model": "^0.9.132",
33
- "@dbx-tools/path": "^0.9.132",
34
- "@dbx-tools/shared-core": "^0.9.132",
35
- "@dbx-tools/shared-model": "^0.9.132",
30
+ "@dbx-tools/appkit": "^0.9.138",
31
+ "@dbx-tools/core": "^0.9.138",
32
+ "@dbx-tools/model": "^0.9.138",
33
+ "@dbx-tools/path": "^0.9.138",
34
+ "@dbx-tools/shared-core": "^0.9.138",
35
+ "@dbx-tools/shared-model": "^0.9.138",
36
36
  "@mastra/core": "1.71.0",
37
37
  "cheerio": "^1.2.0",
38
38
  "entities": "^4.5.0",
@@ -106,7 +106,7 @@
106
106
  "./package.json": "./package.json"
107
107
  }
108
108
  },
109
- "version": "0.9.132",
109
+ "version": "0.9.138",
110
110
  "types": "./lib/index.d.ts",
111
111
  "dbxToolsConfig": {
112
112
  "tags": [
package/src/fetch.ts CHANGED
@@ -20,10 +20,43 @@ import { gotScraping } from "got-scraping";
20
20
  import { assertFetchUrlAllowed } from "./_fetch-url.ts";
21
21
  import { toCallSettings, webFetchExecuteDefaults } from "./defaults.ts";
22
22
  import { decodeHtmlEntities, htmlToText } from "./html-text.ts";
23
- import { executeRead, toWebSearchRuntime, type WebSearchRuntimeInput } from "./runtime.ts";
23
+ import {
24
+ executeRead,
25
+ toWebSearchRuntime,
26
+ type WebSearchRuntime,
27
+ type WebSearchRuntimeInput,
28
+ } from "./runtime.ts";
24
29
  import type { WebFetchRequest, WebFetchResult } from "./schema.ts";
25
30
 
26
31
  const logger = log.logger("web-search/fetch");
32
+ const DEFAULT_IMAGE_MAX_BYTES = 5 * 1024 * 1024;
33
+ const DEFAULT_ASSET_PAGE_MAX_LENGTH = 1_500_000;
34
+
35
+ /** Input for a policy-checked HTML fetch used by in-process asset discovery. */
36
+ export interface WebAssetPageFetchRequest {
37
+ /** Public HTTPS page URL. */
38
+ url: string;
39
+ /** Maximum returned markup length. Defaults to 1.5 million characters. */
40
+ maxLength?: number;
41
+ }
42
+
43
+ /** Input for a policy-checked binary image fetch. */
44
+ export interface WebImageFetchRequest {
45
+ /** Public HTTPS image URL. */
46
+ url: string;
47
+ /** Maximum accepted response size. Defaults to 5 MiB. */
48
+ maxBytes?: number;
49
+ }
50
+
51
+ /** Binary image fetched through the web-search runtime's URL policy. */
52
+ export interface WebImageFetchResult {
53
+ /** Final URL after redirects. */
54
+ url: string;
55
+ /** Image media type returned by the server. */
56
+ contentType: string;
57
+ /** Fetched image bytes. */
58
+ data: Uint8Array;
59
+ }
27
60
 
28
61
  /** The slice of a got-scraping response this module reads. */
29
62
  interface FetchedPage {
@@ -46,38 +79,26 @@ function truncate(text: string, max: number): { content: string; truncated: bool
46
79
  return { content: text.slice(0, max), truncated: true };
47
80
  }
48
81
 
49
- /**
50
- * Fetch a single URL and return its content in the requested format.
51
- *
52
- * Throws when the URL is not permitted by the allow-list (the visible,
53
- * correctable failure the design calls for on the fetch path). The request's
54
- * `maxLength` narrows (never widens) the plugin's `fetchMaxLength` cap.
55
- * `signal` cancels the in-flight fetch.
56
- */
57
- export async function runWebFetch(
58
- request: WebFetchRequest,
59
- runtimeOrConfig: WebSearchRuntimeInput,
82
+ /** Fetch and cache one raw page before caller-specific output reduction. */
83
+ async function fetchPage(
84
+ requestUrl: string,
85
+ runtime: WebSearchRuntime,
60
86
  signal?: AbortSignal,
61
- ): Promise<WebFetchResult> {
62
- const runtime = toWebSearchRuntime(runtimeOrConfig);
87
+ ): Promise<FetchedPage> {
63
88
  const { config } = runtime;
64
- await assertFetchUrlAllowed(request.url, config.allowList);
65
- const cap = Math.min(request.maxLength ?? config.fetchMaxLength, config.fetchMaxLength);
66
-
67
- // The response is cached before the format reduction, so the same page read
68
- // as text and as html shares one network round trip.
89
+ await assertFetchUrlAllowed(requestUrl, config.allowList);
69
90
  const page = await executeRead(
70
91
  runtime,
71
92
  "page-fetch",
72
93
  toCallSettings(webFetchExecuteDefaults, config.timeoutMs, [
73
94
  "web-search",
74
95
  "fetch",
75
- request.url,
96
+ requestUrl,
76
97
  ...config.allowList.patterns,
77
98
  ]),
78
99
  async (executeSignal): Promise<FetchedPage> => {
79
100
  const response = await gotScraping({
80
- url: request.url,
101
+ url: requestUrl,
81
102
  // Bun's node:http2 reports default-port origins with :443 while
82
103
  // http2-wrapper compares them against URL-normalized origins.
83
104
  http2: false,
@@ -96,7 +117,7 @@ export async function runWebFetch(
96
117
  ...(executeSignal ? { signal: executeSignal } : {}),
97
118
  });
98
119
  return {
99
- url: response.url ?? request.url,
120
+ url: response.url ?? requestUrl,
100
121
  statusCode: response.statusCode,
101
122
  contentType: response.headers["content-type"],
102
123
  body: typeof response.body === "string" ? response.body : String(response.body ?? ""),
@@ -105,6 +126,26 @@ export async function runWebFetch(
105
126
  signal,
106
127
  );
107
128
  await assertFetchUrlAllowed(page.url, config.allowList);
129
+ return page;
130
+ }
131
+
132
+ /**
133
+ * Fetch a single URL and return its content in the requested format.
134
+ *
135
+ * Throws when the URL is not permitted by the allow-list (the visible,
136
+ * correctable failure the design calls for on the fetch path). The request's
137
+ * `maxLength` narrows (never widens) the plugin's `fetchMaxLength` cap.
138
+ * `signal` cancels the in-flight fetch.
139
+ */
140
+ export async function runWebFetch(
141
+ request: WebFetchRequest,
142
+ runtimeOrConfig: WebSearchRuntimeInput,
143
+ signal?: AbortSignal,
144
+ ): Promise<WebFetchResult> {
145
+ const runtime = toWebSearchRuntime(runtimeOrConfig);
146
+ const { config } = runtime;
147
+ const cap = Math.min(request.maxLength ?? config.fetchMaxLength, config.fetchMaxLength);
148
+ const page = await fetchPage(request.url, runtime, signal);
108
149
 
109
150
  const isHtml = !page.contentType || /html|xml/i.test(page.contentType);
110
151
  const rawContent = request.format === "html" || !isHtml ? page.body : htmlToText(page.body);
@@ -128,3 +169,91 @@ export async function runWebFetch(
128
169
  truncated,
129
170
  };
130
171
  }
172
+
173
+ /**
174
+ * Fetch bounded raw markup for deterministic in-process asset discovery.
175
+ *
176
+ * This does not widen the model-facing `web_fetch` cap.
177
+ */
178
+ export async function runWebAssetPageFetch(
179
+ request: WebAssetPageFetchRequest,
180
+ runtimeOrConfig: WebSearchRuntimeInput,
181
+ signal?: AbortSignal,
182
+ ): Promise<WebFetchResult> {
183
+ const runtime = toWebSearchRuntime(runtimeOrConfig);
184
+ const cap = Math.min(
185
+ Math.max(1, request.maxLength ?? DEFAULT_ASSET_PAGE_MAX_LENGTH),
186
+ DEFAULT_ASSET_PAGE_MAX_LENGTH,
187
+ );
188
+ const page = await fetchPage(request.url, runtime, signal);
189
+ const { content, truncated } = truncate(page.body, cap);
190
+ const title = extractTitle(page.body);
191
+ return {
192
+ url: page.url,
193
+ status: page.statusCode,
194
+ ...(page.contentType ? { contentType: page.contentType } : {}),
195
+ ...(title ? { title } : {}),
196
+ content,
197
+ truncated,
198
+ };
199
+ }
200
+
201
+ /** Fetch one public image while preserving URL policy, timeout, and redirect checks. */
202
+ export async function runWebImageFetch(
203
+ request: WebImageFetchRequest,
204
+ runtimeOrConfig: WebSearchRuntimeInput,
205
+ signal?: AbortSignal,
206
+ ): Promise<WebImageFetchResult> {
207
+ const runtime = toWebSearchRuntime(runtimeOrConfig);
208
+ const { config } = runtime;
209
+ const maxBytes = Math.max(1, request.maxBytes ?? DEFAULT_IMAGE_MAX_BYTES);
210
+ await assertFetchUrlAllowed(request.url, config.allowList);
211
+ const page = await executeRead(
212
+ runtime,
213
+ "image-fetch",
214
+ {
215
+ default: {
216
+ cache: { enabled: false },
217
+ retry: { enabled: true, attempts: 2 },
218
+ timeout: config.timeoutMs,
219
+ },
220
+ },
221
+ async (executeSignal) => {
222
+ const response = await gotScraping({
223
+ url: request.url,
224
+ responseType: "buffer",
225
+ http2: false,
226
+ timeout: { request: config.timeoutMs },
227
+ throwHttpErrors: true,
228
+ followRedirect: true,
229
+ hooks: {
230
+ beforeRequest: [
231
+ async (options) => {
232
+ await assertFetchUrlAllowed(String(options.url), config.allowList);
233
+ },
234
+ ],
235
+ },
236
+ ...(executeSignal ? { signal: executeSignal } : {}),
237
+ });
238
+ const contentType = String(response.headers["content-type"] ?? "")
239
+ .split(";")[0]!
240
+ .trim()
241
+ .toLowerCase();
242
+ if (!contentType.startsWith("image/")) {
243
+ throw new TypeError(`Expected an image response, received ${contentType || "unknown"}`);
244
+ }
245
+ if (response.body.byteLength > maxBytes) {
246
+ throw new RangeError(`Image response exceeds ${maxBytes} bytes`);
247
+ }
248
+ return {
249
+ url: response.url ?? request.url,
250
+ contentType,
251
+ data: new Uint8Array(response.body),
252
+ };
253
+ },
254
+ signal,
255
+ false,
256
+ );
257
+ await assertFetchUrlAllowed(page.url, config.allowList);
258
+ return page;
259
+ }