@dbx-tools/appkit-web-search 0.9.131 → 0.9.136

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/plugin.js CHANGED
@@ -19,7 +19,7 @@ import { defineTool } from "@databricks/appkit/beta";
19
19
  import { ToolRegistryPlugin } from "@dbx-tools/appkit";
20
20
  import { log, stringUtils } from "@dbx-tools/shared-core";
21
21
  import { MODEL_ENV, SERVING_ENDPOINT_ENV, WEB_SEARCH_CONFIG_SCHEMA, } from "./config.js";
22
- import { runWebFetch } from "./fetch.js";
22
+ import { runWebAssetPageFetch, runWebFetch, runWebImageFetch, } from "./fetch.js";
23
23
  import { createWebSearchRuntime } from "./runtime.js";
24
24
  import { webFetchRequestSchema, webSearchToolRequestSchema, WEB_FETCH_TOOL_DESCRIPTION, WEB_SEARCH_TOOL_DESCRIPTION, } from "./schema.js";
25
25
  import { resolveWebSearchContext, runWebSearch } from "./search.js";
@@ -181,6 +181,10 @@ export class WebSearchPlugin extends ToolRegistryPlugin {
181
181
  * configured URL policy.
182
182
  */
183
183
  fetch: (request, signal) => this.fetch(request, signal),
184
+ /** Fetch expanded HTML for in-process asset discovery. */
185
+ fetchAssetPage: (request, signal) => runWebAssetPageFetch(request, this.runtime, signal),
186
+ /** Fetch one image for in-process visual research. */
187
+ fetchImage: (request, signal) => runWebImageFetch(request, this.runtime, signal),
184
188
  };
185
189
  }
186
190
  async search(request, signal, writeProgress) {
@@ -216,4 +220,4 @@ export class WebSearchPlugin extends ToolRegistryPlugin {
216
220
  * ```
217
221
  */
218
222
  export const webSearch = toPlugin(WebSearchPlugin);
219
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsR0FHVCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixFQUNwQix3QkFBd0IsR0FFekIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsc0JBQXNCLEVBQXlCLE1BQU0sY0FBYyxDQUFDO0FBQzdFLE9BQU8sRUFDTCxxQkFBcUIsRUFDckIsMEJBQTBCLEVBQzFCLDBCQUEwQixFQUMxQiwyQkFBMkIsR0FDNUIsTUFBTSxhQUFhLENBQUM7QUFPckIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFlBQVksRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRXhDOzs7Ozs7R0FNRztBQUNILE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsSUFBSSxFQUFFLFlBQVksQ0FBQyxnQkFBZ0I7SUFDbkMsS0FBSyxFQUFFLHFCQUFxQjtJQUM1QixXQUFXLEVBQUUscUJBQXFCO0lBQ2xDLFdBQVcsRUFDVCx5RkFBeUY7UUFDekYsb0VBQW9FO0lBQ3RFLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLE1BQU0sRUFBRTtRQUNOLElBQUksRUFBRTtZQUNKLEdBQUcsRUFBRSxvQkFBb0I7WUFDekIsV0FBVyxFQUFFLHlDQUF5QyxTQUFTLGdCQUFnQjtZQUMvRSxTQUFTLEVBQUU7Z0JBQ1QsSUFBSSxFQUFFLEtBQUs7Z0JBQ1gsVUFBVSxFQUFFLHFFQUFxRTtnQkFDakYsV0FBVyxFQUFFLE9BQU87YUFDckI7U0FDRjtLQUNGO0NBQzhDLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxPQUFPLGVBQWdCLFNBQVEsa0JBQXlDO0lBQzVFLE1BQU0sQ0FBQyxRQUFRLEdBQUc7UUFDaEIsSUFBSSxFQUFFLFlBQVk7UUFDbEIsV0FBVyxFQUFFLFlBQVk7UUFDekIsV0FBVyxFQUNULDRFQUE0RTtZQUM1RSw4RUFBOEU7WUFDOUUsdURBQXVEO1FBQ3pELFNBQVMsRUFBRSxNQUFNO1FBQ2pCLFNBQVMsRUFBRTtZQUNULFFBQVEsRUFBRSxFQUFFO1lBQ1osUUFBUSxFQUFFLENBQUMseUJBQXlCLENBQUM7U0FDdEM7UUFDRCxNQUFNLEVBQUUsRUFBRSxNQUFNLEVBQUUsd0JBQXdCLEVBQUU7S0FDTixDQUFDO0lBRXpDLHlEQUF5RDtJQUN4QyxPQUFPLEdBQXFCLHNCQUFzQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsQ0FDaEcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQzNCLENBQUM7SUFFRjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxNQUE2QjtRQUMxRCxNQUFNLE1BQU0sR0FDVixXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDcEMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlDLFdBQVcsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7UUFDNUQsT0FBTyxNQUFNLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLHlCQUF5QixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ25GLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ2dCLFlBQVksR0FBaUI7UUFDOUMsVUFBVSxFQUFFLFVBQVUsQ0FBQztZQUNyQixXQUFXLEVBQUUsMkJBQTJCO1lBQ3hDLE1BQU0sRUFBRSwwQkFBMEI7WUFDbEMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUU7WUFDMUQsZUFBZSxFQUFFLEtBQUs7WUFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLDBCQUEwQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxNQUFNLENBQUM7U0FDN0YsQ0FBQztRQUNGLFNBQVMsRUFBRSxVQUFVLENBQUM7WUFDcEIsV0FBVyxFQUFFLDBCQUEwQjtZQUN2QyxNQUFNLEVBQUUscUJBQXFCO1lBQzdCLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO1lBQzFELGVBQWUsRUFBRSxLQUFLO1lBQ3RCLE9BQU8sRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsTUFBTSxDQUFDO1NBQ3ZGLENBQUM7S0FDSCxDQUFDO0lBRUYsOEVBQThFO0lBQ3JFLGdCQUFnQixDQUN2QixJQUFZLEVBQ1osSUFBYSxFQUNiLE1BQW9CLEVBQ3BCLE9BQW1DO1FBRW5DLElBQUksSUFBSSxLQUFLLFlBQVk7WUFBRSxPQUFPLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN0RixNQUFNLE9BQU8sR0FBRywwQkFBMEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkQsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUNoQjtZQUNFLEdBQUcsT0FBTztZQUNWLEdBQUcsQ0FBQyxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztTQUNwRCxFQUNELE1BQU0sRUFDTixPQUFPLEVBQUUsYUFBYSxDQUN2QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDTSxLQUFLLENBQUMsS0FBSztRQUNsQixNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUNoQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNuQixLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssSUFBSSxjQUFjLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ3hFLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztZQUMvQixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7WUFDM0IsR0FBRyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEYsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZO1lBQ2pDLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYztZQUNyQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJO1lBQzlCLGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYztTQUN0QyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsUUFBUTtRQUNOLE9BQU87SUFDVCxDQUFDO0lBRUQsMERBQTBEO0lBQ2pELHFCQUFxQjtRQUM1QixLQUFLLENBQUMscUJBQXFCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRVEsT0FBTztRQUNkLE9BQU87WUFDTDs7OztlQUlHO1lBQ0gsTUFBTSxFQUFFLENBQUMsT0FBeUIsRUFBRSxNQUFvQixFQUE0QixFQUFFLENBQ3BGLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztZQUM5Qjs7O2VBR0c7WUFDSCxLQUFLLEVBQUUsQ0FBQyxPQUF3QixFQUFFLE1BQW9CLEVBQTJCLEVBQUUsQ0FDakYsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO1NBQzlCLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLE1BQU0sQ0FDbEIsT0FBeUIsRUFDekIsTUFBb0IsRUFDcEIsYUFBMEQ7UUFFMUQsT0FBTyxZQUFZLENBQ2pCLE9BQU8sRUFDUCxJQUFJLENBQUMsT0FBTyxFQUNaLE1BQU0sdUJBQXVCLEVBQUUsRUFDL0IsTUFBTSxFQUNOLGFBQWEsQ0FDZCxDQUFDO0lBQ0osQ0FBQztJQUVPLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBd0IsRUFBRSxNQUFvQjtRQUNoRSxPQUFPLFdBQVcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDOztBQUdIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLGVBQWUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGB3ZWItc2VhcmNoYCkgdGhhdCBvd25zIHRoZSByZXNvbHZlZFxuICogd2ViLXNlYXJjaCBydW50aW1lIC0gdGhlIFVSTCBwb2xpY3ksIHJlc3VsdCAvIGxlbmd0aCBjYXBzLCB0aW1lb3V0LCBhbmRcbiAqIGRlZmF1bHQgYXBwcm92YWwgZ2F0ZSBpdHMgdG9vbHMgcmVhZC4gUmVnaXN0ZXJpbmcgaXQgcmVzb2x2ZXMgYW5kIGxvZ3MgdGhlXG4gKiBlZmZlY3RpdmUgY29uZmlnICh3aGljaCBVUkwgcG9saWN5IGlzIGluIGZvcmNlLCB0aGUgY2Fwcykgc28gYVxuICogbWlzY29uZmlndXJhdGlvbiBpcyB2aXNpYmxlIGluIHRoZSBib290IGxvZ3MgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0XG4gKiBzZWFyY2guIFRoZSBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBpcyBjYXB0dXJlZCBieSBpdHMgb3duIHJ1bnRpbWUgc28gZXZlcnlcbiAqIG91dGJvdW5kIGNhbGwgcGlja3MgdXAgQXBwS2l0J3MgY2FjaGUgLyByZXRyeSAvIHRpbWVvdXQgLyB0ZWxlbWV0cnkgY2hhaW4uXG4gKlxuICogVGhlIHBsdWdpbiBhbHNvIGltcGxlbWVudHMgQXBwS2l0J3MgYFRvb2xQcm92aWRlcmAsIHNvIGFuIEFwcEtpdCBhZ2VudCBnZXRzXG4gKiBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB3aXRob3V0IGdvaW5nIHRocm91Z2ggTWFzdHJhLiBBcHAtaW50ZWdyYXRlZFxuICogTWFzdHJhIGFnZW50cyBjb25zdW1lIHRoaXMgcHJvdmlkZXIgdGhyb3VnaCBgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpYDtcbiAqIHN0YW5kYWxvbmUgZmFjdG9yaWVzIGluIGB0b29sLnRzYCB1c2UgdGhlaXIgb3duIGV4cGxpY2l0IHJ1bnRpbWUgb3IgY29uZmlnLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBSZXNvdXJjZVR5cGUsXG4gIHRvUGx1Z2luLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRlZmluZVRvb2wsIHR5cGUgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBUb29sUmVnaXN0cnlQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC90b29sLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2csIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1PREVMX0VOVixcbiAgU0VSVklOR19FTkRQT0lOVF9FTlYsXG4gIFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgdHlwZSBXZWJTZWFyY2hQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHsgcnVuV2ViRmV0Y2ggfSBmcm9tIFwiLi9mZXRjaC50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV2ViU2VhcmNoUnVudGltZSwgdHlwZSBXZWJTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgd2ViRmV0Y2hSZXF1ZXN0U2NoZW1hLFxuICB3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYSxcbiAgV0VCX0ZFVENIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFdFQl9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFdlYkZldGNoUmVxdWVzdCxcbiAgV2ViRmV0Y2hSZXN1bHQsXG4gIFdlYlNlYXJjaFJlcXVlc3QsXG4gIFdlYlNlYXJjaFJlc3VsdCxcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCwgcnVuV2ViU2VhcmNoIH0gZnJvbSBcIi4vc2VhcmNoLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoXCIpO1xuXG4vKipcbiAqIFRoZSBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IHRoZSBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIHJ1bnMgb24uIERlY2xhcmVkXG4gKiBvcHRpb25hbCBiZWNhdXNlIHRoZSBwbHVnaW4gcmVzb2x2ZXMgYSB3ZWItc2VhcmNoLWNhcGFibGUgZW5kcG9pbnQgZnJvbSB0aGVcbiAqIGxpdmUgY2F0YWxvZ3VlIHdoZW4gbm90aGluZyBpcyBwaW5uZWQ7IHtAbGluayBXZWJTZWFyY2hQbHVnaW4uZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHN9XG4gKiBwcm9tb3RlcyBpdCB0byByZXF1aXJlZCBvbmNlIGEgZGVwbG95bWVudCBuYW1lcyBvbmUuIGBDQU5fUVVFUllgIGlzIHRoZVxuICogd2Vha2VzdCBwZXJtaXNzaW9uIHRoYXQgY2FuIGludm9rZSBhbiBlbmRwb2ludC5cbiAqL1xuY29uc3QgU0VSVklOR19FTkRQT0lOVF9SRVNPVVJDRSA9IHtcbiAgdHlwZTogUmVzb3VyY2VUeXBlLlNFUlZJTkdfRU5EUE9JTlQsXG4gIGFsaWFzOiBcIldlYiBTZWFyY2ggRW5kcG9pbnRcIixcbiAgcmVzb3VyY2VLZXk6IFwid2ViLXNlYXJjaC1lbmRwb2ludFwiLFxuICBkZXNjcmlwdGlvbjpcbiAgICBcIk1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgcnVubmluZyB0aGUgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbC4gT3B0aW9uYWw6IHJlc29sdmVkIGZyb20gdGhlIFwiICtcbiAgICBcIndvcmtzcGFjZSBjYXRhbG9ndWUgKEdlbWluaSwgdGhlbiBHUFQpIHdoZW4gbm8gZW5kcG9pbnQgaXMgcGlubmVkLlwiLFxuICBwZXJtaXNzaW9uOiBcIkNBTl9RVUVSWVwiLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICBlbnY6IFNFUlZJTkdfRU5EUE9JTlRfRU5WLFxuICAgICAgZGVzY3JpcHRpb246IGBTZXJ2aW5nIGVuZHBvaW50IG5hbWUgZm9yIHdlYiBzZWFyY2guICR7TU9ERUxfRU5WfSBvdmVycmlkZXMgaXQuYCxcbiAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICB0eXBlOiBcImNsaVwiLFxuICAgICAgICBjbGlDb21tYW5kOiBcImRhdGFicmlja3Mgc2VydmluZy1lbmRwb2ludHMgbGlzdCAtLXByb2ZpbGUgPFBST0ZJTEU+IC0tb3V0cHV0IGpzb25cIixcbiAgICAgICAgc2VsZWN0RmllbGQ6IFwiLm5hbWVcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gc2F0aXNmaWVzIE9taXQ8UmVzb3VyY2VSZXF1aXJlbWVudCwgXCJyZXF1aXJlZFwiPjtcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgcmVzb2x2ZXMgYW5kIGhvbGRzIHRoZSB3ZWItc2VhcmNoIHJ1bnRpbWUgY29uZmlnIHVzZWRcbiAqIGJ5IHRoZSBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB0b29scy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgd2ViU2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgd2ViU2VhcmNoKHtcbiAqICAgICAgIG1vZGVsOiBcImdlbWluaVwiLFxuICogICAgICAgdXJsUG9saWN5OiBcImFsbG93bGlzdFwiLFxuICogICAgICAgYWxsb3dlZFVybHM6IFtcIiouZGF0YWJyaWNrcy5jb21cIl0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV2ViU2VhcmNoUGx1Z2luIGV4dGVuZHMgVG9vbFJlZ2lzdHJ5UGx1Z2luPFdlYlNlYXJjaFBsdWdpbkNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJ3ZWItc2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiV2ViIFNlYXJjaFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJTZWFyY2hlcyB0aGUgd2ViIHRocm91Z2ggdGhlIERhdGFicmlja3MgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbCBvbiBpdHMgb3duIFwiICtcbiAgICAgIFwid2ViLWNhcGFibGUgc2VydmluZyBlbmRwb2ludCwgYW5kIGZldGNoZXMgcGFnZXMgdmlhIGdvdC1zY3JhcGluZywgYmVoaW5kIGFuIFwiICtcbiAgICAgIFwib3B0aW9uYWwgVVJMIGFsbG93LWxpc3QgYW5kIHBlci10b29sIGFwcHJvdmFsIGdhdGluZy5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtTRVJWSU5HX0VORFBPSU5UX1JFU09VUkNFXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcIndlYi1zZWFyY2hcIj47XG5cbiAgLyoqIFJ1bnRpbWUgb3duZWQgZXhjbHVzaXZlbHkgYnkgdGhpcyBwbHVnaW4gaW5zdGFuY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSA9IGNyZWF0ZVdlYlNlYXJjaFJ1bnRpbWUodGhpcy5jb25maWcsIChmbiwgc2V0dGluZ3MpID0+XG4gICAgdGhpcy5leGVjdXRlKGZuLCBzZXR0aW5ncyksXG4gICk7XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdGhlIHNlcnZpbmcgZW5kcG9pbnQgdG8gYSByZXF1aXJlZCByZXNvdXJjZSBvbmNlIGEgZGVwbG95bWVudFxuICAgKiBwaW5zIG9uZSwgdGhyb3VnaCBwbHVnaW4gY29uZmlnIG9yIGVpdGhlciBlbnZpcm9ubWVudCBuYW1lLiBMZWZ0IG9wdGlvbmFsXG4gICAqIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUgcGx1Z2luIHBpY2tzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IG91dCBvZlxuICAgKiB0aGUgbGl2ZSBjYXRhbG9ndWUgb24gaXRzIG93bi5cbiAgICovXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyk6IFJlc291cmNlUmVxdWlyZW1lbnRbXSB7XG4gICAgY29uc3QgcGlubmVkID1cbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoY29uZmlnLm1vZGVsKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudltNT0RFTF9FTlZdKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudltTRVJWSU5HX0VORFBPSU5UX0VOVl0pO1xuICAgIHJldHVybiBwaW5uZWQgPT09IG51bGwgPyBbXSA6IFt7IC4uLlNFUlZJTkdfRU5EUE9JTlRfUkVTT1VSQ0UsIHJlcXVpcmVkOiB0cnVlIH1dO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b29scyB0aGlzIHBsdWdpbiBvZmZlcnMgdG8gYW4gQXBwS2l0IGFnZW50LiBCb3RoIGFyZSByZWFkcyBhbmQgYm90aFxuICAgKiBydW4gdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LlxuICAgKlxuICAgKiBOZWl0aGVyIGlzIGBhdXRvSW5oZXJpdGFibGVgLiBgd2ViX2ZldGNoYCByZWFjaGVzIGEgVVJMIHRoZSBtb2RlbCBjaG9zZSxcbiAgICogd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gaW5zaWRlIHRoZSB3b3Jrc3BhY2UgbmV0d29yaywgc28gaXQgbXVzdCBvbmx5XG4gICAqIGFwcGVhciBpbiBhbiBhZ2VudCB0aGF0IGFza2VkIGZvciBpdCBhbmQgYWNjZXB0ZWQgdGhlIFVSTCBwb2xpY3kgdGhhdFxuICAgKiBjb21lcyB3aXRoIGl0LiBgd2ViX3NlYXJjaGAgaXMgc2FmZXIgYnV0IHN0aWxsIHNwZW5kcyBzZXJ2aW5nIHRva2VucyBvblxuICAgKiBldmVyeSBjYWxsLCBzbyBpdCBpcyBvcHQtaW4gZm9yIGNvc3QgcmF0aGVyIHRoYW4gZm9yIHNhZmV0eS5cbiAgICpcbiAgICogYGV4ZWN1dGVgIHJlLXBhcnNlcyBpdHMgYXJndW1lbnRzIHdpdGggdGhlIGxvY2FsIHNjaGVtYTogQXBwS2l0IHZhbGlkYXRlc1xuICAgKiBhZ2FpbnN0IHRoZSBzYW1lIHNjaGVtYSBmaXJzdCwgYnV0IHJlLXBhcnNpbmcgaXMgd2hhdCBnaXZlcyB0aGUgYm9keSB0eXBlZFxuICAgKiBhcmd1bWVudHMgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9vbFJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgd2ViX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICBkZXNjcmlwdGlvbjogV0VCX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgc2NoZW1hOiB3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYSxcbiAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnNlYXJjaCh3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKSwgc2lnbmFsKSxcbiAgICB9KSxcbiAgICB3ZWJfZmV0Y2g6IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFdFQl9GRVRDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgc2NoZW1hOiB3ZWJGZXRjaFJlcXVlc3RTY2hlbWEsXG4gICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5mZXRjaCh3ZWJGZXRjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyksIHNpZ25hbCksXG4gICAgfSksXG4gIH07XG5cbiAgLyoqIERpc3BhdGNoIHdpdGggdGhlIGFjdHVhbCBjYWxsaW5nIG1vZGVsIGFuZCBvcHRpb25hbCBob3N0IHByb2dyZXNzIHNpbmsuICovXG4gIG92ZXJyaWRlIGV4ZWN1dGVBZ2VudFRvb2woXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgY29udGV4dD86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmIChuYW1lICE9PSBcIndlYl9zZWFyY2hcIikgcmV0dXJuIHN1cGVyLmV4ZWN1dGVBZ2VudFRvb2wobmFtZSwgYXJncywgc2lnbmFsLCBjb250ZXh0KTtcbiAgICBjb25zdCByZXF1ZXN0ID0gd2ViU2VhcmNoVG9vbFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoKFxuICAgICAge1xuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICAuLi4oY29udGV4dD8ubW9kZWwgPyB7IG1vZGVsOiBjb250ZXh0Lm1vZGVsIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgICAgY29udGV4dD8ud3JpdGVQcm9ncmVzcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBzbyBhbiBhY3RpdmUgYWxsb3ctbGlzdCBhbmQgY2FwcyBhcmUgb2J2aW91cyBhdFxuICAgKiBib290LiBSdW50aW1lIGNvbnN0cnVjdGlvbiBhbHJlYWR5IHJlc29sdmVkIGNvbmZpZyBhbmQgY2FwdHVyZWQgdGhpc1xuICAgKiBwbHVnaW4ncyBpbnRlcmNlcHRvciBjaGFpbi5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBtb2RlbDogY29uZmlnLm1vZGVsID8/IGBmYWxsYmFja3M6WyR7Y29uZmlnLm1vZGVsRmFsbGJhY2tzLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIG1vZGVsU291cmNlOiBjb25maWcubW9kZWxTb3VyY2UsXG4gICAgICB1cmxQb2xpY3k6IGNvbmZpZy51cmxQb2xpY3ksXG4gICAgICAuLi4oY29uZmlnLmFsbG93TGlzdC5yZXN0cmljdGVkID8geyBhbGxvd2VkVXJsczogY29uZmlnLmFsbG93TGlzdC5wYXR0ZXJucyB9IDoge30pLFxuICAgICAgbWF4Q2l0YXRpb25zOiBjb25maWcubWF4Q2l0YXRpb25zLFxuICAgICAgZmV0Y2hNYXhMZW5ndGg6IGNvbmZpZy5mZXRjaE1heExlbmd0aCxcbiAgICAgIGFwcHJvdmFsOiBjb25maWcuYXBwcm92YWwubW9kZSxcbiAgICAgIHNjcmFwZUZhbGxiYWNrOiBjb25maWcuc2NyYXBlRmFsbGJhY2ssXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTm8gcnVudGltZSByZXNvdXJjZXMgcmVxdWlyZSBkcmFpbmluZy4gVGhlIGluc3RhbmNlLW93bmVkIGNvbmZpZyBhbmRcbiAgICogZXhlY3V0b3IgYmVjb21lIHVucmVhY2hhYmxlIHdpdGggdGhpcyBwbHVnaW4uXG4gICAqL1xuICBzaHV0ZG93bigpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiogQWJvcnQgaW4tZmxpZ2h0IHdvcmsgb3duZWQgYnkgdGhpcyBwbHVnaW4gaW5zdGFuY2UuICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogUnVuIGEgd2ViIHNlYXJjaCBkaXJlY3RseSAoYnlwYXNzaW5nIHRoZSBhZ2VudCB0b29sKS4gUmVzb2x2ZXMgdGhlXG4gICAgICAgKiBPQk8gY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBleGVjdXRpb24gY29udGV4dCBhbmQgcmVhZHMgdGhpcyBwbHVnaW4nc1xuICAgICAgICogcnVudGltZSBjb25maWcuXG4gICAgICAgKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+ID0+XG4gICAgICAgIHRoaXMuc2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKipcbiAgICAgICAqIEZldGNoIG9uZSBVUkwgZGlyZWN0bHkgKGJ5cGFzc2luZyB0aGUgYWdlbnQgdG9vbCkuIEVuZm9yY2VzIHRoZVxuICAgICAgICogY29uZmlndXJlZCBVUkwgcG9saWN5LlxuICAgICAgICovXG4gICAgICBmZXRjaDogKHJlcXVlc3Q6IFdlYkZldGNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFdlYkZldGNoUmVzdWx0PiA9PlxuICAgICAgICB0aGlzLmZldGNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoKFxuICAgIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgd3JpdGVQcm9ncmVzcz86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdLFxuICApOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiBydW5XZWJTZWFyY2goXG4gICAgICByZXF1ZXN0LFxuICAgICAgdGhpcy5ydW50aW1lLFxuICAgICAgYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaENvbnRleHQoKSxcbiAgICAgIHNpZ25hbCxcbiAgICAgIHdyaXRlUHJvZ3Jlc3MsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2gocmVxdWVzdDogV2ViRmV0Y2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViRmV0Y2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gcnVuV2ViRmV0Y2gocmVxdWVzdCwgdGhpcy5ydW50aW1lLCBzaWduYWwpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIHdlYi1zZWFyY2ggcnVudGltZSB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgd2ViU2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqIGltcG9ydCB7IGFnZW50cywgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IHJlc2VhcmNoZXIgPSBhZ2VudHMuY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiUmVzZWFyY2ggcXVlc3Rpb25zIHdpdGggd2ViX3NlYXJjaCwgdGhlbiByZWFkIHNvdXJjZXMgd2l0aCB3ZWJfZmV0Y2guXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpKSB9O1xuICogICB9LFxuICogfSk7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIHdlYlNlYXJjaCh7IG1vZGVsOiBcImdlbWluaVwiIH0pLFxuICogICAgIG1hc3RyYSh7IGFnZW50czogcmVzZWFyY2hlciB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3ZWJTZWFyY2ggPSB0b1BsdWdpbihXZWJTZWFyY2hQbHVnaW4pO1xuIl19
223
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQ0wsWUFBWSxFQUNaLFFBQVEsR0FHVCxNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxVQUFVLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQ0wsU0FBUyxFQUNULG9CQUFvQixFQUNwQix3QkFBd0IsR0FFekIsTUFBTSxhQUFhLENBQUM7QUFDckIsT0FBTyxFQUNMLG9CQUFvQixFQUNwQixXQUFXLEVBQ1gsZ0JBQWdCLEdBSWpCLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxzQkFBc0IsRUFBeUIsTUFBTSxjQUFjLENBQUM7QUFDN0UsT0FBTyxFQUNMLHFCQUFxQixFQUNyQiwwQkFBMEIsRUFDMUIsMEJBQTBCLEVBQzFCLDJCQUEyQixHQUM1QixNQUFNLGFBQWEsQ0FBQztBQU9yQixPQUFPLEVBQUUsdUJBQXVCLEVBQUUsWUFBWSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRXBFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFeEM7Ozs7OztHQU1HO0FBQ0gsTUFBTSx5QkFBeUIsR0FBRztJQUNoQyxJQUFJLEVBQUUsWUFBWSxDQUFDLGdCQUFnQjtJQUNuQyxLQUFLLEVBQUUscUJBQXFCO0lBQzVCLFdBQVcsRUFBRSxxQkFBcUI7SUFDbEMsV0FBVyxFQUNULHlGQUF5RjtRQUN6RixvRUFBb0U7SUFDdEUsVUFBVSxFQUFFLFdBQVc7SUFDdkIsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFO1lB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QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgcGx1Z2luIChyZWdpc3RlcmVkIG5hbWU6IGB3ZWItc2VhcmNoYCkgdGhhdCBvd25zIHRoZSByZXNvbHZlZFxuICogd2ViLXNlYXJjaCBydW50aW1lIC0gdGhlIFVSTCBwb2xpY3ksIHJlc3VsdCAvIGxlbmd0aCBjYXBzLCB0aW1lb3V0LCBhbmRcbiAqIGRlZmF1bHQgYXBwcm92YWwgZ2F0ZSBpdHMgdG9vbHMgcmVhZC4gUmVnaXN0ZXJpbmcgaXQgcmVzb2x2ZXMgYW5kIGxvZ3MgdGhlXG4gKiBlZmZlY3RpdmUgY29uZmlnICh3aGljaCBVUkwgcG9saWN5IGlzIGluIGZvcmNlLCB0aGUgY2Fwcykgc28gYVxuICogbWlzY29uZmlndXJhdGlvbiBpcyB2aXNpYmxlIGluIHRoZSBib290IGxvZ3MgcmF0aGVyIHRoYW4gb24gdGhlIGZpcnN0XG4gKiBzZWFyY2guIFRoZSBwbHVnaW4ncyBgZXhlY3V0ZSgpYCBpcyBjYXB0dXJlZCBieSBpdHMgb3duIHJ1bnRpbWUgc28gZXZlcnlcbiAqIG91dGJvdW5kIGNhbGwgcGlja3MgdXAgQXBwS2l0J3MgY2FjaGUgLyByZXRyeSAvIHRpbWVvdXQgLyB0ZWxlbWV0cnkgY2hhaW4uXG4gKlxuICogVGhlIHBsdWdpbiBhbHNvIGltcGxlbWVudHMgQXBwS2l0J3MgYFRvb2xQcm92aWRlcmAsIHNvIGFuIEFwcEtpdCBhZ2VudCBnZXRzXG4gKiBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB3aXRob3V0IGdvaW5nIHRocm91Z2ggTWFzdHJhLiBBcHAtaW50ZWdyYXRlZFxuICogTWFzdHJhIGFnZW50cyBjb25zdW1lIHRoaXMgcHJvdmlkZXIgdGhyb3VnaCBgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpYDtcbiAqIHN0YW5kYWxvbmUgZmFjdG9yaWVzIGluIGB0b29sLnRzYCB1c2UgdGhlaXIgb3duIGV4cGxpY2l0IHJ1bnRpbWUgb3IgY29uZmlnLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBSZXNvdXJjZVR5cGUsXG4gIHRvUGx1Z2luLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGRlZmluZVRvb2wsIHR5cGUgVG9vbFJlZ2lzdHJ5IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBUb29sUmVnaXN0cnlQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgQWdlbnRUb29sRXhlY3V0aW9uQ29udGV4dCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC90b29sLXByb3ZpZGVyXCI7XG5pbXBvcnQgeyBsb2csIHN0cmluZ1V0aWxzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7XG4gIE1PREVMX0VOVixcbiAgU0VSVklOR19FTkRQT0lOVF9FTlYsXG4gIFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgdHlwZSBXZWJTZWFyY2hQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHtcbiAgcnVuV2ViQXNzZXRQYWdlRmV0Y2gsXG4gIHJ1bldlYkZldGNoLFxuICBydW5XZWJJbWFnZUZldGNoLFxuICB0eXBlIFdlYkFzc2V0UGFnZUZldGNoUmVxdWVzdCxcbiAgdHlwZSBXZWJJbWFnZUZldGNoUmVxdWVzdCxcbiAgdHlwZSBXZWJJbWFnZUZldGNoUmVzdWx0LFxufSBmcm9tIFwiLi9mZXRjaC50c1wiO1xuaW1wb3J0IHsgY3JlYXRlV2ViU2VhcmNoUnVudGltZSwgdHlwZSBXZWJTZWFyY2hSdW50aW1lIH0gZnJvbSBcIi4vcnVudGltZS50c1wiO1xuaW1wb3J0IHtcbiAgd2ViRmV0Y2hSZXF1ZXN0U2NoZW1hLFxuICB3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYSxcbiAgV0VCX0ZFVENIX1RPT0xfREVTQ1JJUFRJT04sXG4gIFdFQl9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgdHlwZSB7XG4gIFdlYkZldGNoUmVxdWVzdCxcbiAgV2ViRmV0Y2hSZXN1bHQsXG4gIFdlYlNlYXJjaFJlcXVlc3QsXG4gIFdlYlNlYXJjaFJlc3VsdCxcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5pbXBvcnQgeyByZXNvbHZlV2ViU2VhcmNoQ29udGV4dCwgcnVuV2ViU2VhcmNoIH0gZnJvbSBcIi4vc2VhcmNoLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoXCIpO1xuXG4vKipcbiAqIFRoZSBNb2RlbCBTZXJ2aW5nIGVuZHBvaW50IHRoZSBuYXRpdmUgd2ViLXNlYXJjaCB0b29sIHJ1bnMgb24uIERlY2xhcmVkXG4gKiBvcHRpb25hbCBiZWNhdXNlIHRoZSBwbHVnaW4gcmVzb2x2ZXMgYSB3ZWItc2VhcmNoLWNhcGFibGUgZW5kcG9pbnQgZnJvbSB0aGVcbiAqIGxpdmUgY2F0YWxvZ3VlIHdoZW4gbm90aGluZyBpcyBwaW5uZWQ7IHtAbGluayBXZWJTZWFyY2hQbHVnaW4uZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHN9XG4gKiBwcm9tb3RlcyBpdCB0byByZXF1aXJlZCBvbmNlIGEgZGVwbG95bWVudCBuYW1lcyBvbmUuIGBDQU5fUVVFUllgIGlzIHRoZVxuICogd2Vha2VzdCBwZXJtaXNzaW9uIHRoYXQgY2FuIGludm9rZSBhbiBlbmRwb2ludC5cbiAqL1xuY29uc3QgU0VSVklOR19FTkRQT0lOVF9SRVNPVVJDRSA9IHtcbiAgdHlwZTogUmVzb3VyY2VUeXBlLlNFUlZJTkdfRU5EUE9JTlQsXG4gIGFsaWFzOiBcIldlYiBTZWFyY2ggRW5kcG9pbnRcIixcbiAgcmVzb3VyY2VLZXk6IFwid2ViLXNlYXJjaC1lbmRwb2ludFwiLFxuICBkZXNjcmlwdGlvbjpcbiAgICBcIk1vZGVsIFNlcnZpbmcgZW5kcG9pbnQgcnVubmluZyB0aGUgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbC4gT3B0aW9uYWw6IHJlc29sdmVkIGZyb20gdGhlIFwiICtcbiAgICBcIndvcmtzcGFjZSBjYXRhbG9ndWUgKEdlbWluaSwgdGhlbiBHUFQpIHdoZW4gbm8gZW5kcG9pbnQgaXMgcGlubmVkLlwiLFxuICBwZXJtaXNzaW9uOiBcIkNBTl9RVUVSWVwiLFxuICBmaWVsZHM6IHtcbiAgICBuYW1lOiB7XG4gICAgICBlbnY6IFNFUlZJTkdfRU5EUE9JTlRfRU5WLFxuICAgICAgZGVzY3JpcHRpb246IGBTZXJ2aW5nIGVuZHBvaW50IG5hbWUgZm9yIHdlYiBzZWFyY2guICR7TU9ERUxfRU5WfSBvdmVycmlkZXMgaXQuYCxcbiAgICAgIGRpc2NvdmVyeToge1xuICAgICAgICB0eXBlOiBcImNsaVwiLFxuICAgICAgICBjbGlDb21tYW5kOiBcImRhdGFicmlja3Mgc2VydmluZy1lbmRwb2ludHMgbGlzdCAtLXByb2ZpbGUgPFBST0ZJTEU+IC0tb3V0cHV0IGpzb25cIixcbiAgICAgICAgc2VsZWN0RmllbGQ6IFwiLm5hbWVcIixcbiAgICAgIH0sXG4gICAgfSxcbiAgfSxcbn0gc2F0aXNmaWVzIE9taXQ8UmVzb3VyY2VSZXF1aXJlbWVudCwgXCJyZXF1aXJlZFwiPjtcblxuLyoqXG4gKiBBcHBLaXQgcGx1Z2luIHRoYXQgcmVzb2x2ZXMgYW5kIGhvbGRzIHRoZSB3ZWItc2VhcmNoIHJ1bnRpbWUgY29uZmlnIHVzZWRcbiAqIGJ5IHRoZSBgd2ViX3NlYXJjaGAgLyBgd2ViX2ZldGNoYCB0b29scy5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgd2ViU2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgd2ViU2VhcmNoKHtcbiAqICAgICAgIG1vZGVsOiBcImdlbWluaVwiLFxuICogICAgICAgdXJsUG9saWN5OiBcImFsbG93bGlzdFwiLFxuICogICAgICAgYWxsb3dlZFVybHM6IFtcIiouZGF0YWJyaWNrcy5jb21cIl0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgV2ViU2VhcmNoUGx1Z2luIGV4dGVuZHMgVG9vbFJlZ2lzdHJ5UGx1Z2luPFdlYlNlYXJjaFBsdWdpbkNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJ3ZWItc2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiV2ViIFNlYXJjaFwiLFxuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgXCJTZWFyY2hlcyB0aGUgd2ViIHRocm91Z2ggdGhlIERhdGFicmlja3MgbmF0aXZlIHdlYi1zZWFyY2ggdG9vbCBvbiBpdHMgb3duIFwiICtcbiAgICAgIFwid2ViLWNhcGFibGUgc2VydmluZyBlbmRwb2ludCwgYW5kIGZldGNoZXMgcGFnZXMgdmlhIGdvdC1zY3JhcGluZywgYmVoaW5kIGFuIFwiICtcbiAgICAgIFwib3B0aW9uYWwgVVJMIGFsbG93LWxpc3QgYW5kIHBlci10b29sIGFwcHJvdmFsIGdhdGluZy5cIixcbiAgICBzdGFiaWxpdHk6IFwiYmV0YVwiLFxuICAgIHJlc291cmNlczoge1xuICAgICAgcmVxdWlyZWQ6IFtdLFxuICAgICAgb3B0aW9uYWw6IFtTRVJWSU5HX0VORFBPSU5UX1JFU09VUkNFXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFdFQl9TRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcIndlYi1zZWFyY2hcIj47XG5cbiAgLyoqIFJ1bnRpbWUgb3duZWQgZXhjbHVzaXZlbHkgYnkgdGhpcyBwbHVnaW4gaW5zdGFuY2UuICovXG4gIHByaXZhdGUgcmVhZG9ubHkgcnVudGltZTogV2ViU2VhcmNoUnVudGltZSA9IGNyZWF0ZVdlYlNlYXJjaFJ1bnRpbWUodGhpcy5jb25maWcsIChmbiwgc2V0dGluZ3MpID0+XG4gICAgdGhpcy5leGVjdXRlKGZuLCBzZXR0aW5ncyksXG4gICk7XG5cbiAgLyoqXG4gICAqIFByb21vdGUgdGhlIHNlcnZpbmcgZW5kcG9pbnQgdG8gYSByZXF1aXJlZCByZXNvdXJjZSBvbmNlIGEgZGVwbG95bWVudFxuICAgKiBwaW5zIG9uZSwgdGhyb3VnaCBwbHVnaW4gY29uZmlnIG9yIGVpdGhlciBlbnZpcm9ubWVudCBuYW1lLiBMZWZ0IG9wdGlvbmFsXG4gICAqIG90aGVyd2lzZSwgYmVjYXVzZSB0aGUgcGx1Z2luIHBpY2tzIGEgd2ViLXNlYXJjaC1jYXBhYmxlIGVuZHBvaW50IG91dCBvZlxuICAgKiB0aGUgbGl2ZSBjYXRhbG9ndWUgb24gaXRzIG93bi5cbiAgICovXG4gIHN0YXRpYyBnZXRSZXNvdXJjZVJlcXVpcmVtZW50cyhjb25maWc6IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyk6IFJlc291cmNlUmVxdWlyZW1lbnRbXSB7XG4gICAgY29uc3QgcGlubmVkID1cbiAgICAgIHN0cmluZ1V0aWxzLnRyaW1Ub051bGwoY29uZmlnLm1vZGVsKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudltNT0RFTF9FTlZdKSA/P1xuICAgICAgc3RyaW5nVXRpbHMudHJpbVRvTnVsbChwcm9jZXNzLmVudltTRVJWSU5HX0VORFBPSU5UX0VOVl0pO1xuICAgIHJldHVybiBwaW5uZWQgPT09IG51bGwgPyBbXSA6IFt7IC4uLlNFUlZJTkdfRU5EUE9JTlRfUkVTT1VSQ0UsIHJlcXVpcmVkOiB0cnVlIH1dO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b29scyB0aGlzIHBsdWdpbiBvZmZlcnMgdG8gYW4gQXBwS2l0IGFnZW50LiBCb3RoIGFyZSByZWFkcyBhbmQgYm90aFxuICAgKiBydW4gdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LlxuICAgKlxuICAgKiBOZWl0aGVyIGlzIGBhdXRvSW5oZXJpdGFibGVgLiBgd2ViX2ZldGNoYCByZWFjaGVzIGEgVVJMIHRoZSBtb2RlbCBjaG9zZSxcbiAgICogd2hpY2ggaXMgcmVhY2hhYmxlIGZyb20gaW5zaWRlIHRoZSB3b3Jrc3BhY2UgbmV0d29yaywgc28gaXQgbXVzdCBvbmx5XG4gICAqIGFwcGVhciBpbiBhbiBhZ2VudCB0aGF0IGFza2VkIGZvciBpdCBhbmQgYWNjZXB0ZWQgdGhlIFVSTCBwb2xpY3kgdGhhdFxuICAgKiBjb21lcyB3aXRoIGl0LiBgd2ViX3NlYXJjaGAgaXMgc2FmZXIgYnV0IHN0aWxsIHNwZW5kcyBzZXJ2aW5nIHRva2VucyBvblxuICAgKiBldmVyeSBjYWxsLCBzbyBpdCBpcyBvcHQtaW4gZm9yIGNvc3QgcmF0aGVyIHRoYW4gZm9yIHNhZmV0eS5cbiAgICpcbiAgICogYGV4ZWN1dGVgIHJlLXBhcnNlcyBpdHMgYXJndW1lbnRzIHdpdGggdGhlIGxvY2FsIHNjaGVtYTogQXBwS2l0IHZhbGlkYXRlc1xuICAgKiBhZ2FpbnN0IHRoZSBzYW1lIHNjaGVtYSBmaXJzdCwgYnV0IHJlLXBhcnNpbmcgaXMgd2hhdCBnaXZlcyB0aGUgYm9keSB0eXBlZFxuICAgKiBhcmd1bWVudHMgaW5zdGVhZCBvZiBgdW5rbm93bmAuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG9vbFJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgd2ViX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICBkZXNjcmlwdGlvbjogV0VCX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgc2NoZW1hOiB3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYSxcbiAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnNlYXJjaCh3ZWJTZWFyY2hUb29sUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKSwgc2lnbmFsKSxcbiAgICB9KSxcbiAgICB3ZWJfZmV0Y2g6IGRlZmluZVRvb2woe1xuICAgICAgZGVzY3JpcHRpb246IFdFQl9GRVRDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgc2NoZW1hOiB3ZWJGZXRjaFJlcXVlc3RTY2hlbWEsXG4gICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5mZXRjaCh3ZWJGZXRjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyksIHNpZ25hbCksXG4gICAgfSksXG4gIH07XG5cbiAgLyoqIERpc3BhdGNoIHdpdGggdGhlIGFjdHVhbCBjYWxsaW5nIG1vZGVsIGFuZCBvcHRpb25hbCBob3N0IHByb2dyZXNzIHNpbmsuICovXG4gIG92ZXJyaWRlIGV4ZWN1dGVBZ2VudFRvb2woXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIGFyZ3M6IHVua25vd24sXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgY29udGV4dD86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHQsXG4gICk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIGlmIChuYW1lICE9PSBcIndlYl9zZWFyY2hcIikgcmV0dXJuIHN1cGVyLmV4ZWN1dGVBZ2VudFRvb2wobmFtZSwgYXJncywgc2lnbmFsLCBjb250ZXh0KTtcbiAgICBjb25zdCByZXF1ZXN0ID0gd2ViU2VhcmNoVG9vbFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuc2VhcmNoKFxuICAgICAge1xuICAgICAgICAuLi5yZXF1ZXN0LFxuICAgICAgICAuLi4oY29udGV4dD8ubW9kZWwgPyB7IG1vZGVsOiBjb250ZXh0Lm1vZGVsIH0gOiB7fSksXG4gICAgICB9LFxuICAgICAgc2lnbmFsLFxuICAgICAgY29udGV4dD8ud3JpdGVQcm9ncmVzcyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBzbyBhbiBhY3RpdmUgYWxsb3ctbGlzdCBhbmQgY2FwcyBhcmUgb2J2aW91cyBhdFxuICAgKiBib290LiBSdW50aW1lIGNvbnN0cnVjdGlvbiBhbHJlYWR5IHJlc29sdmVkIGNvbmZpZyBhbmQgY2FwdHVyZWQgdGhpc1xuICAgKiBwbHVnaW4ncyBpbnRlcmNlcHRvciBjaGFpbi5cbiAgICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBtb2RlbDogY29uZmlnLm1vZGVsID8/IGBmYWxsYmFja3M6WyR7Y29uZmlnLm1vZGVsRmFsbGJhY2tzLmpvaW4oXCIsIFwiKX1dYCxcbiAgICAgIG1vZGVsU291cmNlOiBjb25maWcubW9kZWxTb3VyY2UsXG4gICAgICB1cmxQb2xpY3k6IGNvbmZpZy51cmxQb2xpY3ksXG4gICAgICAuLi4oY29uZmlnLmFsbG93TGlzdC5yZXN0cmljdGVkID8geyBhbGxvd2VkVXJsczogY29uZmlnLmFsbG93TGlzdC5wYXR0ZXJucyB9IDoge30pLFxuICAgICAgbWF4Q2l0YXRpb25zOiBjb25maWcubWF4Q2l0YXRpb25zLFxuICAgICAgZmV0Y2hNYXhMZW5ndGg6IGNvbmZpZy5mZXRjaE1heExlbmd0aCxcbiAgICAgIGFwcHJvdmFsOiBjb25maWcuYXBwcm92YWwubW9kZSxcbiAgICAgIHNjcmFwZUZhbGxiYWNrOiBjb25maWcuc2NyYXBlRmFsbGJhY2ssXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTm8gcnVudGltZSByZXNvdXJjZXMgcmVxdWlyZSBkcmFpbmluZy4gVGhlIGluc3RhbmNlLW93bmVkIGNvbmZpZyBhbmRcbiAgICogZXhlY3V0b3IgYmVjb21lIHVucmVhY2hhYmxlIHdpdGggdGhpcyBwbHVnaW4uXG4gICAqL1xuICBzaHV0ZG93bigpOiB2b2lkIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvKiogQWJvcnQgaW4tZmxpZ2h0IHdvcmsgb3duZWQgYnkgdGhpcyBwbHVnaW4gaW5zdGFuY2UuICovXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKlxuICAgICAgICogUnVuIGEgd2ViIHNlYXJjaCBkaXJlY3RseSAoYnlwYXNzaW5nIHRoZSBhZ2VudCB0b29sKS4gUmVzb2x2ZXMgdGhlXG4gICAgICAgKiBPQk8gY2xpZW50IGZyb20gdGhlIGFjdGl2ZSBleGVjdXRpb24gY29udGV4dCBhbmQgcmVhZHMgdGhpcyBwbHVnaW4nc1xuICAgICAgICogcnVudGltZSBjb25maWcuXG4gICAgICAgKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTxXZWJTZWFyY2hSZXN1bHQ+ID0+XG4gICAgICAgIHRoaXMuc2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKipcbiAgICAgICAqIEZldGNoIG9uZSBVUkwgZGlyZWN0bHkgKGJ5cGFzc2luZyB0aGUgYWdlbnQgdG9vbCkuIEVuZm9yY2VzIHRoZVxuICAgICAgICogY29uZmlndXJlZCBVUkwgcG9saWN5LlxuICAgICAgICovXG4gICAgICBmZXRjaDogKHJlcXVlc3Q6IFdlYkZldGNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpOiBQcm9taXNlPFdlYkZldGNoUmVzdWx0PiA9PlxuICAgICAgICB0aGlzLmZldGNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogRmV0Y2ggZXhwYW5kZWQgSFRNTCBmb3IgaW4tcHJvY2VzcyBhc3NldCBkaXNjb3ZlcnkuICovXG4gICAgICBmZXRjaEFzc2V0UGFnZTogKFxuICAgICAgICByZXF1ZXN0OiBXZWJBc3NldFBhZ2VGZXRjaFJlcXVlc3QsXG4gICAgICAgIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICAgICAgKTogUHJvbWlzZTxXZWJGZXRjaFJlc3VsdD4gPT4gcnVuV2ViQXNzZXRQYWdlRmV0Y2gocmVxdWVzdCwgdGhpcy5ydW50aW1lLCBzaWduYWwpLFxuICAgICAgLyoqIEZldGNoIG9uZSBpbWFnZSBmb3IgaW4tcHJvY2VzcyB2aXN1YWwgcmVzZWFyY2guICovXG4gICAgICBmZXRjaEltYWdlOiAoXG4gICAgICAgIHJlcXVlc3Q6IFdlYkltYWdlRmV0Y2hSZXF1ZXN0LFxuICAgICAgICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbiAgICAgICk6IFByb21pc2U8V2ViSW1hZ2VGZXRjaFJlc3VsdD4gPT4gcnVuV2ViSW1hZ2VGZXRjaChyZXF1ZXN0LCB0aGlzLnJ1bnRpbWUsIHNpZ25hbCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgc2VhcmNoKFxuICAgIHJlcXVlc3Q6IFdlYlNlYXJjaFJlcXVlc3QsXG4gICAgc2lnbmFsPzogQWJvcnRTaWduYWwsXG4gICAgd3JpdGVQcm9ncmVzcz86IEFnZW50VG9vbEV4ZWN1dGlvbkNvbnRleHRbXCJ3cml0ZVByb2dyZXNzXCJdLFxuICApOiBQcm9taXNlPFdlYlNlYXJjaFJlc3VsdD4ge1xuICAgIHJldHVybiBydW5XZWJTZWFyY2goXG4gICAgICByZXF1ZXN0LFxuICAgICAgdGhpcy5ydW50aW1lLFxuICAgICAgYXdhaXQgcmVzb2x2ZVdlYlNlYXJjaENvbnRleHQoKSxcbiAgICAgIHNpZ25hbCxcbiAgICAgIHdyaXRlUHJvZ3Jlc3MsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZmV0Y2gocmVxdWVzdDogV2ViRmV0Y2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8V2ViRmV0Y2hSZXN1bHQ+IHtcbiAgICByZXR1cm4gcnVuV2ViRmV0Y2gocmVxdWVzdCwgdGhpcy5ydW50aW1lLCBzaWduYWwpO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIHdlYi1zZWFyY2ggcnVudGltZSB3aXRoIEFwcEtpdC5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgd2ViU2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LXdlYi1zZWFyY2hcIjtcbiAqIGltcG9ydCB7IGFnZW50cywgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IHJlc2VhcmNoZXIgPSBhZ2VudHMuY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiUmVzZWFyY2ggcXVlc3Rpb25zIHdpdGggd2ViX3NlYXJjaCwgdGhlbiByZWFkIHNvdXJjZXMgd2l0aCB3ZWJfZmV0Y2guXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2luc1tcIndlYi1zZWFyY2hcIl0udG9vbGtpdCgpKSB9O1xuICogICB9LFxuICogfSk7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIHdlYlNlYXJjaCh7IG1vZGVsOiBcImdlbWluaVwiIH0pLFxuICogICAgIG1hc3RyYSh7IGFnZW50czogcmVzZWFyY2hlciB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCB3ZWJTZWFyY2ggPSB0b1BsdWdpbihXZWJTZWFyY2hQbHVnaW4pO1xuIl19
@@ -23,6 +23,10 @@ export interface WebSearchRuntime {
23
23
  execute: WebSearchExecutor;
24
24
  /** Provider-family cooldown deadlines learned from workspace failures. */
25
25
  familyCooldowns: Map<policy.ModelFamily, number>;
26
+ /** Provider families that completed a native search successfully. */
27
+ availableFamilies: Set<policy.ModelFamily>;
28
+ /** First native request currently establishing one family's availability. */
29
+ familyProbes: Map<policy.ModelFamily, Promise<void>>;
26
30
  }
27
31
  /** Runtime-aware operation input, retaining resolved-config compatibility. */
28
32
  export type WebSearchRuntimeInput = WebSearchRuntime | ResolvedWebSearchConfig;
@@ -44,4 +48,4 @@ export declare function setWebSearchExecutor(runtime: WebSearchRuntime, execute:
44
48
  * run, a request teardown); it is merged with the signal the timeout
45
49
  * interceptor supplies so either one unwinds the I/O.
46
50
  */
47
- export declare function executeRead<T>(runtime: WebSearchRuntime, operation: string, settings: WebSearchExecutionSettings, fn: (signal?: AbortSignal) => Promise<T>, signal?: AbortSignal): Promise<T>;
51
+ export declare function executeRead<T>(runtime: WebSearchRuntime, operation: string, settings: WebSearchExecutionSettings, fn: (signal?: AbortSignal) => Promise<T>, signal?: AbortSignal, logFailure?: boolean): Promise<T>;
@@ -19,11 +19,23 @@ const logger = log.logger("web-search/runtime");
19
19
  const directExecute = execution.directExecutor();
20
20
  /** Build an isolated runtime for one plugin instance or standalone tool set. */
21
21
  export function createWebSearchRuntime(overrides, execute = directExecute) {
22
- return { config: resolveWebSearchConfig(overrides), execute, familyCooldowns: new Map() };
22
+ return {
23
+ config: resolveWebSearchConfig(overrides),
24
+ execute,
25
+ familyCooldowns: new Map(),
26
+ availableFamilies: new Set(),
27
+ familyProbes: new Map(),
28
+ };
23
29
  }
24
30
  /** Build an isolated runtime from config that has already been resolved. */
25
31
  export function createResolvedWebSearchRuntime(config, execute = directExecute) {
26
- return { config, execute, familyCooldowns: new Map() };
32
+ return {
33
+ config,
34
+ execute,
35
+ familyCooldowns: new Map(),
36
+ availableFamilies: new Set(),
37
+ familyProbes: new Map(),
38
+ };
27
39
  }
28
40
  /** Normalize an explicit runtime or legacy resolved config for one operation. */
29
41
  export function toWebSearchRuntime(input) {
@@ -43,10 +55,10 @@ export function setWebSearchExecutor(runtime, execute) {
43
55
  * run, a request teardown); it is merged with the signal the timeout
44
56
  * interceptor supplies so either one unwinds the I/O.
45
57
  */
46
- export async function executeRead(runtime, operation, settings, fn, signal) {
58
+ export async function executeRead(runtime, operation, settings, fn, signal, logFailure = true) {
47
59
  return pluginExecution.runPluginExecution({
48
60
  plugin: "web-search",
49
- logger,
61
+ logger: logFailure ? logger : { warn() { } },
50
62
  operation,
51
63
  settings,
52
64
  execute: runtime.execute,
@@ -54,4 +66,4 @@ export async function executeRead(runtime, operation, settings, fn, signal) {
54
66
  signal,
55
67
  });
56
68
  }
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBR0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUNMLHNCQUFzQixHQUd2QixNQUFNLGFBQWEsQ0FBQztBQUdyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUF1QmhEOzs7O0dBSUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUE4QixDQUFDO0FBRTdFLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFNBQWlDLEVBQ2pDLFVBQTZCLGFBQWE7SUFFMUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLElBQUksR0FBRyxFQUFFLEVBQUUsQ0FBQztBQUM1RixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sVUFBVSw4QkFBOEIsQ0FDNUMsTUFBK0IsRUFDL0IsVUFBNkIsYUFBYTtJQUUxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsSUFBSSxHQUFHLEVBQUUsRUFBRSxDQUFDO0FBQ3pELENBQUM7QUFFRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQTRCO0lBQzdELE9BQU8sU0FBUyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsa0RBQWtEO0FBQ2xELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxPQUF5QixFQUFFLE9BQTBCO0lBQ3hGLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsT0FBeUIsRUFDekIsU0FBaUIsRUFDakIsUUFBb0MsRUFDcEMsRUFBd0MsRUFDeEMsTUFBb0I7SUFFcEIsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUM7UUFDeEMsTUFBTSxFQUFFLFlBQVk7UUFDcEIsTUFBTTtRQUNOLFNBQVM7UUFDVCxRQUFRO1FBQ1IsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO1FBQ3hCLEVBQUU7UUFDRixNQUFNO0tBQ1AsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViLXNlYXJjaCBydW50aW1lIGNvbnN0cnVjdGlvbiBhbmQgZXhlY3V0aW9uIGhlbHBlcnMuXG4gKlxuICogRWFjaCBwbHVnaW4gaW5zdGFuY2Ugb3ducyBvbmUgcnVudGltZS4gU3RhbmRhbG9uZSB0b29sIGZhY3RvcmllcyBjcmVhdGUgdGhlaXJcbiAqIG93biBydW50aW1lLCBzbyBzZXBhcmF0ZSBhcHBzIGFuZCBkaXJlY3QgY29uc3VtZXJzIGNhbm5vdCBvdmVyd3JpdGUgZWFjaFxuICogb3RoZXIncyBwb2xpY3kgb3IgZXhlY3V0b3IuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB0eXBlIHsgRXhlY3V0aW9uUmVzdWx0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luRXhlY3V0aW9uIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBwb2xpY3kgfSBmcm9tIFwiQGRieC10b29scy9tb2RlbFwiO1xuaW1wb3J0IHsgZXhlY3V0aW9uLCBsb2cgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHtcbiAgcmVzb2x2ZVdlYlNlYXJjaENvbmZpZyxcbiAgdHlwZSBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZyxcbiAgdHlwZSBXZWJTZWFyY2hQbHVnaW5Db25maWcsXG59IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHR5cGUgeyBXZWJTZWFyY2hFeGVjdXRpb25TZXR0aW5ncyB9IGZyb20gXCIuL2RlZmF1bHRzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJ3ZWItc2VhcmNoL3J1bnRpbWVcIik7XG5cbi8qKlxuICogUnVucyBvbmUgb3V0Ym91bmQgY2FsbCB0aHJvdWdoIEFwcEtpdCdzIGludGVyY2VwdG9yIGNoYWluLiBNYXRjaGVzXG4gKiBgUGx1Z2luLmV4ZWN1dGUoKWAsIHdoaWNoIG5ldmVyIHRocm93czogYSBmYWlsdXJlIGNvbWVzIGJhY2sgYXNcbiAqIGB7IG9rOiBmYWxzZSB9YC5cbiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoRXhlY3V0b3IgPSA8VD4oXG4gIGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD4sXG4gIHNldHRpbmdzOiBXZWJTZWFyY2hFeGVjdXRpb25TZXR0aW5ncyxcbikgPT4gUHJvbWlzZTxFeGVjdXRpb25SZXN1bHQ8VD4+O1xuXG4vKiogVGhlIHJlc29sdmVkIGNvbmZpZyBwbHVzIHRoZSBleGVjdXRvciBvdXRib3VuZCBjYWxscyBydW4gdGhyb3VnaC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV2ViU2VhcmNoUnVudGltZSB7XG4gIGNvbmZpZzogUmVzb2x2ZWRXZWJTZWFyY2hDb25maWc7XG4gIGV4ZWN1dGU6IFdlYlNlYXJjaEV4ZWN1dG9yO1xuICAvKiogUHJvdmlkZXItZmFtaWx5IGNvb2xkb3duIGRlYWRsaW5lcyBsZWFybmVkIGZyb20gd29ya3NwYWNlIGZhaWx1cmVzLiAqL1xuICBmYW1pbHlDb29sZG93bnM6IE1hcDxwb2xpY3kuTW9kZWxGYW1pbHksIG51bWJlcj47XG59XG5cbi8qKiBSdW50aW1lLWF3YXJlIG9wZXJhdGlvbiBpbnB1dCwgcmV0YWluaW5nIHJlc29sdmVkLWNvbmZpZyBjb21wYXRpYmlsaXR5LiAqL1xuZXhwb3J0IHR5cGUgV2ViU2VhcmNoUnVudGltZUlucHV0ID0gV2ViU2VhcmNoUnVudGltZSB8IFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnO1xuXG4vKipcbiAqIEV4ZWN1dG9yIHVzZWQgYnkgc3RhbmRhbG9uZSBydW50aW1lczogcnVuIHRoZSBjYWxsIGRpcmVjdGx5LCBtYXBwaW5nIGEgdGhyb3dcbiAqIG9udG8gdGhlIHNhbWUge0BsaW5rIEV4ZWN1dGlvblJlc3VsdH0gc2hhcGUgc28gY2FsbCBzaXRlcyBicmFuY2ggb24gYG9rYFxuICogZWl0aGVyIHdheS5cbiAqL1xuY29uc3QgZGlyZWN0RXhlY3V0ZSA9IGV4ZWN1dGlvbi5kaXJlY3RFeGVjdXRvcjxXZWJTZWFyY2hFeGVjdXRpb25TZXR0aW5ncz4oKTtcblxuLyoqIEJ1aWxkIGFuIGlzb2xhdGVkIHJ1bnRpbWUgZm9yIG9uZSBwbHVnaW4gaW5zdGFuY2Ugb3Igc3RhbmRhbG9uZSB0b29sIHNldC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTZWFyY2hSdW50aW1lKFxuICBvdmVycmlkZXM/OiBXZWJTZWFyY2hQbHVnaW5Db25maWcsXG4gIGV4ZWN1dGU6IFdlYlNlYXJjaEV4ZWN1dG9yID0gZGlyZWN0RXhlY3V0ZSxcbik6IFdlYlNlYXJjaFJ1bnRpbWUge1xuICByZXR1cm4geyBjb25maWc6IHJlc29sdmVXZWJTZWFyY2hDb25maWcob3ZlcnJpZGVzKSwgZXhlY3V0ZSwgZmFtaWx5Q29vbGRvd25zOiBuZXcgTWFwKCkgfTtcbn1cblxuLyoqIEJ1aWxkIGFuIGlzb2xhdGVkIHJ1bnRpbWUgZnJvbSBjb25maWcgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVJlc29sdmVkV2ViU2VhcmNoUnVudGltZShcbiAgY29uZmlnOiBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZyxcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3IgPSBkaXJlY3RFeGVjdXRlLFxuKTogV2ViU2VhcmNoUnVudGltZSB7XG4gIHJldHVybiB7IGNvbmZpZywgZXhlY3V0ZSwgZmFtaWx5Q29vbGRvd25zOiBuZXcgTWFwKCkgfTtcbn1cblxuLyoqIE5vcm1hbGl6ZSBhbiBleHBsaWNpdCBydW50aW1lIG9yIGxlZ2FjeSByZXNvbHZlZCBjb25maWcgZm9yIG9uZSBvcGVyYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gdG9XZWJTZWFyY2hSdW50aW1lKGlucHV0OiBXZWJTZWFyY2hSdW50aW1lSW5wdXQpOiBXZWJTZWFyY2hSdW50aW1lIHtcbiAgcmV0dXJuIFwiZXhlY3V0ZVwiIGluIGlucHV0ID8gaW5wdXQgOiBjcmVhdGVSZXNvbHZlZFdlYlNlYXJjaFJ1bnRpbWUoaW5wdXQpO1xufVxuXG4vKiogSW5zdGFsbCBhbiBleGVjdXRvciBvbiBhbiBleHBsaWNpdCBydW50aW1lLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldFdlYlNlYXJjaEV4ZWN1dG9yKHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsIGV4ZWN1dGU6IFdlYlNlYXJjaEV4ZWN1dG9yKTogdm9pZCB7XG4gIHJ1bnRpbWUuZXhlY3V0ZSA9IGV4ZWN1dGU7XG59XG5cbi8qKlxuICogUnVuIG9uZSBpZGVtcG90ZW50IHJlYWQgdGhyb3VnaCB0aGUgcnVudGltZSBleGVjdXRvciBhbmQgdW53cmFwIGl0LlxuICpcbiAqIGBleGVjdXRlKClgIG5ldmVyIHRocm93cywgc28gYSBmYWlsZWQgY2FsbCBhcnJpdmVzIGFzIGB7IG9rOiBmYWxzZSB9YCB3aXRoXG4gKiBhIHN0YXR1cyB0aGUgaW50ZXJjZXB0b3JzIGFscmVhZHkgc2FuaXRpemVkOyBpdCBpcyBsb2dnZWQgaGVyZSBhbmQgcmUtcmFpc2VkXG4gKiBhcyBhIHN0YWJsZSB7QGxpbmsgRXhlY3V0aW9uRXJyb3J9IHNvIGFuIHVwc3RyZWFtIG1lc3NhZ2UgbmV2ZXIgYmVjb21lcyB0aGVcbiAqIGNhbGxlcidzIGVycm9yIHRleHQuIGBzaWduYWxgIGlzIHRoZSBjYWxsZXIncyBvd24gY2FuY2VsbGF0aW9uIChhbiBhZ2VudFxuICogcnVuLCBhIHJlcXVlc3QgdGVhcmRvd24pOyBpdCBpcyBtZXJnZWQgd2l0aCB0aGUgc2lnbmFsIHRoZSB0aW1lb3V0XG4gKiBpbnRlcmNlcHRvciBzdXBwbGllcyBzbyBlaXRoZXIgb25lIHVud2luZHMgdGhlIEkvTy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWN1dGVSZWFkPFQ+KFxuICBydW50aW1lOiBXZWJTZWFyY2hSdW50aW1lLFxuICBvcGVyYXRpb246IHN0cmluZyxcbiAgc2V0dGluZ3M6IFdlYlNlYXJjaEV4ZWN1dGlvblNldHRpbmdzLFxuICBmbjogKHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PiBQcm9taXNlPFQ+LFxuICBzaWduYWw/OiBBYm9ydFNpZ25hbCxcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gcGx1Z2luRXhlY3V0aW9uLnJ1blBsdWdpbkV4ZWN1dGlvbih7XG4gICAgcGx1Z2luOiBcIndlYi1zZWFyY2hcIixcbiAgICBsb2dnZXIsXG4gICAgb3BlcmF0aW9uLFxuICAgIHNldHRpbmdzLFxuICAgIGV4ZWN1dGU6IHJ1bnRpbWUuZXhlY3V0ZSxcbiAgICBmbixcbiAgICBzaWduYWwsXG4gIH0pO1xufVxuIl19
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBR0gsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUNMLHNCQUFzQixHQUd2QixNQUFNLGFBQWEsQ0FBQztBQUdyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLG9CQUFvQixDQUFDLENBQUM7QUEyQmhEOzs7O0dBSUc7QUFDSCxNQUFNLGFBQWEsR0FBRyxTQUFTLENBQUMsY0FBYyxFQUE4QixDQUFDO0FBRTdFLGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsc0JBQXNCLENBQ3BDLFNBQWlDLEVBQ2pDLFVBQTZCLGFBQWE7SUFFMUMsT0FBTztRQUNMLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxTQUFTLENBQUM7UUFDekMsT0FBTztRQUNQLGVBQWUsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUMxQixpQkFBaUIsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM1QixZQUFZLEVBQUUsSUFBSSxHQUFHLEVBQUU7S0FDeEIsQ0FBQztBQUNKLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLDhCQUE4QixDQUM1QyxNQUErQixFQUMvQixVQUE2QixhQUFhO0lBRTFDLE9BQU87UUFDTCxNQUFNO1FBQ04sT0FBTztRQUNQLGVBQWUsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUMxQixpQkFBaUIsRUFBRSxJQUFJLEdBQUcsRUFBRTtRQUM1QixZQUFZLEVBQUUsSUFBSSxHQUFHLEVBQUU7S0FDeEIsQ0FBQztBQUNKLENBQUM7QUFFRCxpRkFBaUY7QUFDakYsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQTRCO0lBQzdELE9BQU8sU0FBUyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyw4QkFBOEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsa0RBQWtEO0FBQ2xELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxPQUF5QixFQUFFLE9BQTBCO0lBQ3hGLE9BQU8sQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0FBQzVCLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDL0IsT0FBeUIsRUFDekIsU0FBaUIsRUFDakIsUUFBb0MsRUFDcEMsRUFBd0MsRUFDeEMsTUFBb0IsRUFDcEIsVUFBVSxHQUFHLElBQUk7SUFFakIsT0FBTyxlQUFlLENBQUMsa0JBQWtCLENBQUM7UUFDeEMsTUFBTSxFQUFFLFlBQVk7UUFDcEIsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksS0FBSSxDQUFDLEVBQUU7UUFDM0MsU0FBUztRQUNULFFBQVE7UUFDUixPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU87UUFDeEIsRUFBRTtRQUNGLE1BQU07S0FDUCxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBXZWItc2VhcmNoIHJ1bnRpbWUgY29uc3RydWN0aW9uIGFuZCBleGVjdXRpb24gaGVscGVycy5cbiAqXG4gKiBFYWNoIHBsdWdpbiBpbnN0YW5jZSBvd25zIG9uZSBydW50aW1lLiBTdGFuZGFsb25lIHRvb2wgZmFjdG9yaWVzIGNyZWF0ZSB0aGVpclxuICogb3duIHJ1bnRpbWUsIHNvIHNlcGFyYXRlIGFwcHMgYW5kIGRpcmVjdCBjb25zdW1lcnMgY2Fubm90IG92ZXJ3cml0ZSBlYWNoXG4gKiBvdGhlcidzIHBvbGljeSBvciBleGVjdXRvci5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHR5cGUgeyBFeGVjdXRpb25SZXN1bHQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW5FeGVjdXRpb24gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IHBvbGljeSB9IGZyb20gXCJAZGJ4LXRvb2xzL21vZGVsXCI7XG5pbXBvcnQgeyBleGVjdXRpb24sIGxvZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICByZXNvbHZlV2ViU2VhcmNoQ29uZmlnLFxuICB0eXBlIFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnLFxuICB0eXBlIFdlYlNlYXJjaFBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgdHlwZSB7IFdlYlNlYXJjaEV4ZWN1dGlvblNldHRpbmdzIH0gZnJvbSBcIi4vZGVmYXVsdHMudHNcIjtcblxuY29uc3QgbG9nZ2VyID0gbG9nLmxvZ2dlcihcIndlYi1zZWFyY2gvcnVudGltZVwiKTtcblxuLyoqXG4gKiBSdW5zIG9uZSBvdXRib3VuZCBjYWxsIHRocm91Z2ggQXBwS2l0J3MgaW50ZXJjZXB0b3IgY2hhaW4uIE1hdGNoZXNcbiAqIGBQbHVnaW4uZXhlY3V0ZSgpYCwgd2hpY2ggbmV2ZXIgdGhyb3dzOiBhIGZhaWx1cmUgY29tZXMgYmFjayBhc1xuICogYHsgb2s6IGZhbHNlIH1gLlxuICovXG5leHBvcnQgdHlwZSBXZWJTZWFyY2hFeGVjdXRvciA9IDxUPihcbiAgZm46IChzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT4gUHJvbWlzZTxUPixcbiAgc2V0dGluZ3M6IFdlYlNlYXJjaEV4ZWN1dGlvblNldHRpbmdzLFxuKSA9PiBQcm9taXNlPEV4ZWN1dGlvblJlc3VsdDxUPj47XG5cbi8qKiBUaGUgcmVzb2x2ZWQgY29uZmlnIHBsdXMgdGhlIGV4ZWN1dG9yIG91dGJvdW5kIGNhbGxzIHJ1biB0aHJvdWdoLiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJTZWFyY2hSdW50aW1lIHtcbiAgY29uZmlnOiBSZXNvbHZlZFdlYlNlYXJjaENvbmZpZztcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3I7XG4gIC8qKiBQcm92aWRlci1mYW1pbHkgY29vbGRvd24gZGVhZGxpbmVzIGxlYXJuZWQgZnJvbSB3b3Jrc3BhY2UgZmFpbHVyZXMuICovXG4gIGZhbWlseUNvb2xkb3duczogTWFwPHBvbGljeS5Nb2RlbEZhbWlseSwgbnVtYmVyPjtcbiAgLyoqIFByb3ZpZGVyIGZhbWlsaWVzIHRoYXQgY29tcGxldGVkIGEgbmF0aXZlIHNlYXJjaCBzdWNjZXNzZnVsbHkuICovXG4gIGF2YWlsYWJsZUZhbWlsaWVzOiBTZXQ8cG9saWN5Lk1vZGVsRmFtaWx5PjtcbiAgLyoqIEZpcnN0IG5hdGl2ZSByZXF1ZXN0IGN1cnJlbnRseSBlc3RhYmxpc2hpbmcgb25lIGZhbWlseSdzIGF2YWlsYWJpbGl0eS4gKi9cbiAgZmFtaWx5UHJvYmVzOiBNYXA8cG9saWN5Lk1vZGVsRmFtaWx5LCBQcm9taXNlPHZvaWQ+Pjtcbn1cblxuLyoqIFJ1bnRpbWUtYXdhcmUgb3BlcmF0aW9uIGlucHV0LCByZXRhaW5pbmcgcmVzb2x2ZWQtY29uZmlnIGNvbXBhdGliaWxpdHkuICovXG5leHBvcnQgdHlwZSBXZWJTZWFyY2hSdW50aW1lSW5wdXQgPSBXZWJTZWFyY2hSdW50aW1lIHwgUmVzb2x2ZWRXZWJTZWFyY2hDb25maWc7XG5cbi8qKlxuICogRXhlY3V0b3IgdXNlZCBieSBzdGFuZGFsb25lIHJ1bnRpbWVzOiBydW4gdGhlIGNhbGwgZGlyZWN0bHksIG1hcHBpbmcgYSB0aHJvd1xuICogb250byB0aGUgc2FtZSB7QGxpbmsgRXhlY3V0aW9uUmVzdWx0fSBzaGFwZSBzbyBjYWxsIHNpdGVzIGJyYW5jaCBvbiBgb2tgXG4gKiBlaXRoZXIgd2F5LlxuICovXG5jb25zdCBkaXJlY3RFeGVjdXRlID0gZXhlY3V0aW9uLmRpcmVjdEV4ZWN1dG9yPFdlYlNlYXJjaEV4ZWN1dGlvblNldHRpbmdzPigpO1xuXG4vKiogQnVpbGQgYW4gaXNvbGF0ZWQgcnVudGltZSBmb3Igb25lIHBsdWdpbiBpbnN0YW5jZSBvciBzdGFuZGFsb25lIHRvb2wgc2V0LiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNlYXJjaFJ1bnRpbWUoXG4gIG92ZXJyaWRlcz86IFdlYlNlYXJjaFBsdWdpbkNvbmZpZyxcbiAgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3IgPSBkaXJlY3RFeGVjdXRlLFxuKTogV2ViU2VhcmNoUnVudGltZSB7XG4gIHJldHVybiB7XG4gICAgY29uZmlnOiByZXNvbHZlV2ViU2VhcmNoQ29uZmlnKG92ZXJyaWRlcyksXG4gICAgZXhlY3V0ZSxcbiAgICBmYW1pbHlDb29sZG93bnM6IG5ldyBNYXAoKSxcbiAgICBhdmFpbGFibGVGYW1pbGllczogbmV3IFNldCgpLFxuICAgIGZhbWlseVByb2JlczogbmV3IE1hcCgpLFxuICB9O1xufVxuXG4vKiogQnVpbGQgYW4gaXNvbGF0ZWQgcnVudGltZSBmcm9tIGNvbmZpZyB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUmVzb2x2ZWRXZWJTZWFyY2hSdW50aW1lKFxuICBjb25maWc6IFJlc29sdmVkV2ViU2VhcmNoQ29uZmlnLFxuICBleGVjdXRlOiBXZWJTZWFyY2hFeGVjdXRvciA9IGRpcmVjdEV4ZWN1dGUsXG4pOiBXZWJTZWFyY2hSdW50aW1lIHtcbiAgcmV0dXJuIHtcbiAgICBjb25maWcsXG4gICAgZXhlY3V0ZSxcbiAgICBmYW1pbHlDb29sZG93bnM6IG5ldyBNYXAoKSxcbiAgICBhdmFpbGFibGVGYW1pbGllczogbmV3IFNldCgpLFxuICAgIGZhbWlseVByb2JlczogbmV3IE1hcCgpLFxuICB9O1xufVxuXG4vKiogTm9ybWFsaXplIGFuIGV4cGxpY2l0IHJ1bnRpbWUgb3IgbGVnYWN5IHJlc29sdmVkIGNvbmZpZyBmb3Igb25lIG9wZXJhdGlvbi4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1dlYlNlYXJjaFJ1bnRpbWUoaW5wdXQ6IFdlYlNlYXJjaFJ1bnRpbWVJbnB1dCk6IFdlYlNlYXJjaFJ1bnRpbWUge1xuICByZXR1cm4gXCJleGVjdXRlXCIgaW4gaW5wdXQgPyBpbnB1dCA6IGNyZWF0ZVJlc29sdmVkV2ViU2VhcmNoUnVudGltZShpbnB1dCk7XG59XG5cbi8qKiBJbnN0YWxsIGFuIGV4ZWN1dG9yIG9uIGFuIGV4cGxpY2l0IHJ1bnRpbWUuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViU2VhcmNoRXhlY3V0b3IocnVudGltZTogV2ViU2VhcmNoUnVudGltZSwgZXhlY3V0ZTogV2ViU2VhcmNoRXhlY3V0b3IpOiB2b2lkIHtcbiAgcnVudGltZS5leGVjdXRlID0gZXhlY3V0ZTtcbn1cblxuLyoqXG4gKiBSdW4gb25lIGlkZW1wb3RlbnQgcmVhZCB0aHJvdWdoIHRoZSBydW50aW1lIGV4ZWN1dG9yIGFuZCB1bndyYXAgaXQuXG4gKlxuICogYGV4ZWN1dGUoKWAgbmV2ZXIgdGhyb3dzLCBzbyBhIGZhaWxlZCBjYWxsIGFycml2ZXMgYXMgYHsgb2s6IGZhbHNlIH1gIHdpdGhcbiAqIGEgc3RhdHVzIHRoZSBpbnRlcmNlcHRvcnMgYWxyZWFkeSBzYW5pdGl6ZWQ7IGl0IGlzIGxvZ2dlZCBoZXJlIGFuZCByZS1yYWlzZWRcbiAqIGFzIGEgc3RhYmxlIHtAbGluayBFeGVjdXRpb25FcnJvcn0gc28gYW4gdXBzdHJlYW0gbWVzc2FnZSBuZXZlciBiZWNvbWVzIHRoZVxuICogY2FsbGVyJ3MgZXJyb3IgdGV4dC4gYHNpZ25hbGAgaXMgdGhlIGNhbGxlcidzIG93biBjYW5jZWxsYXRpb24gKGFuIGFnZW50XG4gKiBydW4sIGEgcmVxdWVzdCB0ZWFyZG93bik7IGl0IGlzIG1lcmdlZCB3aXRoIHRoZSBzaWduYWwgdGhlIHRpbWVvdXRcbiAqIGludGVyY2VwdG9yIHN1cHBsaWVzIHNvIGVpdGhlciBvbmUgdW53aW5kcyB0aGUgSS9PLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZVJlYWQ8VD4oXG4gIHJ1bnRpbWU6IFdlYlNlYXJjaFJ1bnRpbWUsXG4gIG9wZXJhdGlvbjogc3RyaW5nLFxuICBzZXR0aW5nczogV2ViU2VhcmNoRXhlY3V0aW9uU2V0dGluZ3MsXG4gIGZuOiAoc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IFByb21pc2U8VD4sXG4gIHNpZ25hbD86IEFib3J0U2lnbmFsLFxuICBsb2dGYWlsdXJlID0gdHJ1ZSxcbik6IFByb21pc2U8VD4ge1xuICByZXR1cm4gcGx1Z2luRXhlY3V0aW9uLnJ1blBsdWdpbkV4ZWN1dGlvbih7XG4gICAgcGx1Z2luOiBcIndlYi1zZWFyY2hcIixcbiAgICBsb2dnZXI6IGxvZ0ZhaWx1cmUgPyBsb2dnZXIgOiB7IHdhcm4oKSB7fSB9LFxuICAgIG9wZXJhdGlvbixcbiAgICBzZXR0aW5ncyxcbiAgICBleGVjdXRlOiBydW50aW1lLmV4ZWN1dGUsXG4gICAgZm4sXG4gICAgc2lnbmFsLFxuICB9KTtcbn1cbiJdfQ==
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==