@dbx-tools/search 0.9.138 → 0.9.139
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/README.md +4 -4
- package/index.ts +2 -2
- package/lib/index.d.ts +2 -2
- package/lib/index.js +3 -3
- package/lib/src/client.js +1 -2
- package/lib/src/config.d.ts +2 -5
- package/lib/src/config.js +3 -6
- package/lib/src/lakebase.d.ts +1 -1
- package/lib/src/lakebase.js +2 -2
- package/lib/src/plugin.d.ts +2 -3
- package/lib/src/plugin.js +11 -22
- package/package.json +8 -8
- package/src/client.ts +0 -1
- package/src/config.ts +2 -7
- package/src/lakebase.ts +1 -1
- package/src/plugin.ts +17 -27
package/lib/src/plugin.js
CHANGED
|
@@ -6,9 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* - a `search` / `universal_search` / (opt-in) `add_documents` tool set for
|
|
8
8
|
* both Mastra and AppKit agents (autocomplete is a small-`limit` search);
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* and `POST /documents` when writes are enabled);
|
|
9
|
+
* - extension routes under `/api/search` (`POST /universal` federated,
|
|
10
|
+
* `GET /indexes` catalogue, and opt-in document/index lifecycle routes);
|
|
12
11
|
* - a `clientConfig()` payload so a UI knows the indexes, default, and page
|
|
13
12
|
* size at boot with no round-trip;
|
|
14
13
|
* - `exports()` so app code can `appkit.search.search(...)` directly.
|
|
@@ -24,7 +23,7 @@ import { toPlugin } from "@databricks/appkit";
|
|
|
24
23
|
import { aiSearch, defineTool } from "@databricks/appkit/beta";
|
|
25
24
|
import { pluginRegistry, ToolRegistryPlugin } from "@dbx-tools/appkit";
|
|
26
25
|
import { errorUtils, log, stringUtils } from "@dbx-tools/shared-core";
|
|
27
|
-
import { searchSchemas } from "@dbx-tools/shared-search";
|
|
26
|
+
import { SEARCH_DEFAULT_BASE_PATH, SEARCH_PLUGIN_NAME, SEARCH_ROUTES, searchSchemas, } from "@dbx-tools/shared-search";
|
|
28
27
|
import { toSearchOptions, toUniversalSearchOptions } from "./_search-options.js";
|
|
29
28
|
import { SEARCH_CONFIG_SCHEMA, resolveSearchConfig } from "./config.js";
|
|
30
29
|
import { toCreateIndexOptions } from "./index-options.js";
|
|
@@ -33,16 +32,6 @@ import { toDocumentArray } from "./query.js";
|
|
|
33
32
|
import { createSearchRuntime, setSearchReadBackend } from "./runtime.js";
|
|
34
33
|
import { ADD_DOCUMENTS_TOOL_DESCRIPTION, CREATE_INDEX_TOOL_DESCRIPTION, SEARCH_TOOL_DESCRIPTION, SYNC_INDEX_TOOL_DESCRIPTION, UNIVERSAL_SEARCH_TOOL_DESCRIPTION, } from "./schema.js";
|
|
35
34
|
const logger = log.logger("search");
|
|
36
|
-
/** Mount-relative route for a universal (federated) search across indexes. */
|
|
37
|
-
const UNIVERSAL_ROUTE = "/universal";
|
|
38
|
-
/** Mount-relative route serving the index catalogue a search box reads. */
|
|
39
|
-
const INDEXES_ROUTE = "/indexes";
|
|
40
|
-
/** Mount-relative route for adding documents to a direct-access index. */
|
|
41
|
-
const DOCUMENTS_ROUTE = "/documents";
|
|
42
|
-
/** Mount-relative route for creating a Vector Search index. */
|
|
43
|
-
const INDEX_ROUTE = "/index";
|
|
44
|
-
/** Mount-relative route for syncing a Delta Sync index from its source table. */
|
|
45
|
-
const INDEX_SYNC_ROUTE = "/index/sync";
|
|
46
35
|
/**
|
|
47
36
|
* AppKit extension plugin for agent tools, federated search, and optional
|
|
48
37
|
* Vector Search lifecycle operations. Register `aiSearch()` or
|
|
@@ -75,7 +64,7 @@ const INDEX_SYNC_ROUTE = "/index/sync";
|
|
|
75
64
|
*/
|
|
76
65
|
export class SearchPlugin extends ToolRegistryPlugin {
|
|
77
66
|
static manifest = {
|
|
78
|
-
name:
|
|
67
|
+
name: SEARCH_PLUGIN_NAME,
|
|
79
68
|
displayName: "AI Search",
|
|
80
69
|
description: "Search Databricks AI Search (Vector Search) indexes: agent tools, HTTP routes for a " +
|
|
81
70
|
"search box, universal search across indexes, and an opt-in document write surface.",
|
|
@@ -90,7 +79,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
90
79
|
runtime = createSearchRuntime({ config: this.config });
|
|
91
80
|
/** The base path AppKit mounts this plugin's routes under. */
|
|
92
81
|
get basePath() {
|
|
93
|
-
return
|
|
82
|
+
return SEARCH_DEFAULT_BASE_PATH;
|
|
94
83
|
}
|
|
95
84
|
/**
|
|
96
85
|
* The tools this plugin offers to an AppKit agent. `search` /
|
|
@@ -252,7 +241,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
252
241
|
this.route(router, {
|
|
253
242
|
name: "universalSearch",
|
|
254
243
|
method: "post",
|
|
255
|
-
path:
|
|
244
|
+
path: SEARCH_ROUTES.universal,
|
|
256
245
|
handler: async (req, res) => {
|
|
257
246
|
await this.respond(res, "universalSearch", () => {
|
|
258
247
|
const request = searchSchemas.universalSearchRequestSchema.parse(req.body ?? {});
|
|
@@ -263,7 +252,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
263
252
|
this.route(router, {
|
|
264
253
|
name: "indexes",
|
|
265
254
|
method: "get",
|
|
266
|
-
path:
|
|
255
|
+
path: SEARCH_ROUTES.indexes,
|
|
267
256
|
handler: async (_req, res) => {
|
|
268
257
|
res.json(this.clientConfig());
|
|
269
258
|
},
|
|
@@ -271,7 +260,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
271
260
|
this.route(router, {
|
|
272
261
|
name: "documents",
|
|
273
262
|
method: "post",
|
|
274
|
-
path:
|
|
263
|
+
path: SEARCH_ROUTES.documents,
|
|
275
264
|
handler: async (req, res) => {
|
|
276
265
|
const { config } = this.runtime;
|
|
277
266
|
if (!config.allowWrite) {
|
|
@@ -284,7 +273,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
284
273
|
this.route(router, {
|
|
285
274
|
name: "createIndex",
|
|
286
275
|
method: "post",
|
|
287
|
-
path:
|
|
276
|
+
path: SEARCH_ROUTES.index,
|
|
288
277
|
handler: async (req, res) => {
|
|
289
278
|
const { config, readBackend } = this.runtime;
|
|
290
279
|
if (!config.allowWrite || !readBackend?.supportsLifecycle) {
|
|
@@ -297,7 +286,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
297
286
|
this.route(router, {
|
|
298
287
|
name: "syncIndex",
|
|
299
288
|
method: "post",
|
|
300
|
-
path:
|
|
289
|
+
path: SEARCH_ROUTES.indexSync,
|
|
301
290
|
handler: async (req, res) => {
|
|
302
291
|
const { config, readBackend } = this.runtime;
|
|
303
292
|
if (!config.allowWrite || !readBackend?.supportsLifecycle) {
|
|
@@ -417,4 +406,4 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
417
406
|
* ```
|
|
418
407
|
*/
|
|
419
408
|
export const search = toPlugin(SearchPlugin);
|
|
420
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBd0MsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRixPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBcUIsTUFBTSx5QkFBeUIsQ0FBQztBQUNsRixPQUFPLEVBQUUsY0FBYyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDdkUsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBMkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRixPQUFPLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUNqRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQXNCLE1BQU0sY0FBYyxDQUFDO0FBQzdGLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsaUNBQWlDLEdBQ2xDLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUVyQywyRUFBMkU7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QU0sQ0FBQyxZQUFZLElBQUksRUFBRSxDQUFDO1FBQ3pELE1BQU0sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDdEMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUM7SUFDakMsQ0FBQzs7QUFHSDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IGV4dGVuc2lvbiBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYHNlYXJjaGApIGFyb3VuZCBhIHNpYmxpbmdcbiAqIGBhaVNlYXJjaGAgcHJvdmlkZXIuIE5hdGl2ZSBBcHBLaXQgb3ducyBWZWN0b3IgU2VhcmNoIHF1ZXJ5IGV4ZWN1dGlvbjsgdGhpc1xuICogcGx1Z2luIGFkZHMgdGhlIHN1cmZhY2VzIHRoYXQgcmVtYWluIHVzZWZ1bCBhY3Jvc3MgbmF0aXZlIGFuZCBMYWtlYmFzZVxuICogcHJvdmlkZXJzOlxuICpcbiAqICAgLSBhIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIC8gKG9wdC1pbikgYGFkZF9kb2N1bWVudHNgIHRvb2wgc2V0IGZvclxuICogICAgIGJvdGggTWFzdHJhIGFuZCBBcHBLaXQgYWdlbnRzIChhdXRvY29tcGxldGUgaXMgYSBzbWFsbC1gbGltaXRgIHNlYXJjaCk7XG4gKiAgIC0gY29tcGF0aWJpbGl0eSBhbmQgZXh0ZW5zaW9uIHJvdXRlcyB1bmRlciBgL2FwaS9zZWFyY2hgXG4gKiAgICAgKGBQT1NUIC9gIHNlYXJjaCwgYFBPU1QgL3VuaXZlcnNhbGAgZmVkZXJhdGVkLCBgR0VUIC9pbmRleGVzYCBjYXRhbG9ndWUsXG4gKiAgICAgYW5kIGBQT1NUIC9kb2N1bWVudHNgIHdoZW4gd3JpdGVzIGFyZSBlbmFibGVkKTtcbiAqICAgLSBhIGBjbGllbnRDb25maWcoKWAgcGF5bG9hZCBzbyBhIFVJIGtub3dzIHRoZSBpbmRleGVzLCBkZWZhdWx0LCBhbmQgcGFnZVxuICogICAgIHNpemUgYXQgYm9vdCB3aXRoIG5vIHJvdW5kLXRyaXA7XG4gKiAgIC0gYGV4cG9ydHMoKWAgc28gYXBwIGNvZGUgY2FuIGBhcHBraXQuc2VhcmNoLnNlYXJjaCguLi4pYCBkaXJlY3RseS5cbiAqXG4gKiBWZWN0b3IgU2VhcmNoIHJlYWRzIGRlbGVnYXRlIHRvIHRoZSByZWdpc3RlcmVkIG5hdGl2ZSBBcHBLaXQgYGFpU2VhcmNoYFxuICogcGx1Z2luLCBwcmVzZXJ2aW5nIGl0cyBPQk8sIGNhY2hpbmcsIHJlcmFua2luZywgYW5kIHJlc3BvbnNlIGhhbmRsaW5nLiBUaGVcbiAqIGFsdGVybmF0aXZlIGBsYWtlYmFzZUFpU2VhcmNoYCBwcm92aWRlciBzdXBwbGllcyB0aGUgc2FtZSBxdWVyeSBjb250cmFjdFxuICogb3ZlciBQb3N0Z3JlU1FMIGZ1bGwtdGV4dCBzZWFyY2guXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHRvUGx1Z2luLCB0eXBlIElBcHBSb3V0ZXIsIHR5cGUgUGx1Z2luTWFuaWZlc3QgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhaVNlYXJjaCwgZGVmaW5lVG9vbCwgdHlwZSBUb29sUmVnaXN0cnkgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbmltcG9ydCB7IHBsdWdpblJlZ2lzdHJ5LCBUb29sUmVnaXN0cnlQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGVycm9yVXRpbHMsIGxvZywgc3RyaW5nVXRpbHMgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc2VhcmNoU2NoZW1hcywgdHlwZSBTZWFyY2hDbGllbnRDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyB0b1NlYXJjaE9wdGlvbnMsIHRvVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyB9IGZyb20gXCIuL19zZWFyY2gtb3B0aW9ucy50c1wiO1xuaW1wb3J0IHsgU0VBUkNIX0NPTkZJR19TQ0hFTUEsIHJlc29sdmVTZWFyY2hDb25maWcsIHR5cGUgU2VhcmNoUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NyZWF0ZUluZGV4T3B0aW9ucyB9IGZyb20gXCIuL2luZGV4LW9wdGlvbnMudHNcIjtcbmltcG9ydCB7IG5hdGl2ZUFpU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL25hdGl2ZS50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGNyZWF0ZVNlYXJjaFJ1bnRpbWUsIHNldFNlYXJjaFJlYWRCYWNrZW5kLCB0eXBlIFNlYXJjaFJ1bnRpbWUgfSBmcm9tIFwiLi9ydW50aW1lLnRzXCI7XG5pbXBvcnQge1xuICBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04sXG4gIENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG59IGZyb20gXCIuL3NjaGVtYS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoXCIpO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcy4gKi9cbmNvbnN0IFVOSVZFUlNBTF9ST1VURSA9IFwiL3VuaXZlcnNhbFwiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgc2VydmluZyB0aGUgaW5kZXggY2F0YWxvZ3VlIGEgc2VhcmNoIGJveCByZWFkcy4gKi9cbmNvbnN0IElOREVYRVNfUk9VVEUgPSBcIi9pbmRleGVzXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYWRkaW5nIGRvY3VtZW50cyB0byBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG5jb25zdCBET0NVTUVOVFNfUk9VVEUgPSBcIi9kb2N1bWVudHNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBjcmVhdGluZyBhIFZlY3RvciBTZWFyY2ggaW5kZXguICovXG5jb25zdCBJTkRFWF9ST1VURSA9IFwiL2luZGV4XCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3Igc3luY2luZyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuY29uc3QgSU5ERVhfU1lOQ19ST1VURSA9IFwiL2luZGV4L3N5bmNcIjtcblxuLyoqXG4gKiBBcHBLaXQgZXh0ZW5zaW9uIHBsdWdpbiBmb3IgYWdlbnQgdG9vbHMsIGZlZGVyYXRlZCBzZWFyY2gsIGFuZCBvcHRpb25hbFxuICogVmVjdG9yIFNlYXJjaCBsaWZlY3ljbGUgb3BlcmF0aW9ucy4gUmVnaXN0ZXIgYGFpU2VhcmNoKClgIG9yXG4gKiBgbGFrZWJhc2VBaVNlYXJjaCgpYCBiZWZvcmUgdGhpcyBwbHVnaW4uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IGFpU2VhcmNoIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG4gKiBpbXBvcnQgeyBzZWFyY2ggfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgYWlTZWFyY2goe1xuICogICAgICAgaW5kZXhlczoge1xuICogICAgICAgICBkb2NzOiB7XG4gKiAgICAgICAgICAgaW5kZXhOYW1lOiBcIm1haW4uc3VwcG9ydC5kb2NzXCIsXG4gKiAgICAgICAgICAgY29sdW1uczogW1wiaWRcIiwgXCJ0aXRsZVwiLCBcImJvZHlcIl0sXG4gKiAgICAgICAgIH0sXG4gKiAgICAgICB9LFxuICogICAgIH0pLFxuICogICAgIHNlYXJjaCh7XG4gKiAgICAgICBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgICAgaW5kZXhlczogW3sgbmFtZTogXCJtYWluLnN1cHBvcnQuZG9jc1wiLCBhbGlhczogXCJkb2NzXCIgfV0sXG4gKiAgICAgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgU2VhcmNoUGx1Z2luIGV4dGVuZHMgVG9vbFJlZ2lzdHJ5UGx1Z2luPFNlYXJjaFBsdWdpbkNvbmZpZz4ge1xuICBzdGF0aWMgbWFuaWZlc3QgPSB7XG4gICAgbmFtZTogXCJzZWFyY2hcIixcbiAgICBkaXNwbGF5TmFtZTogXCJBSSBTZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoIERhdGFicmlja3MgQUkgU2VhcmNoIChWZWN0b3IgU2VhcmNoKSBpbmRleGVzOiBhZ2VudCB0b29scywgSFRUUCByb3V0ZXMgZm9yIGEgXCIgK1xuICAgICAgXCJzZWFyY2ggYm94LCB1bml2ZXJzYWwgc2VhcmNoIGFjcm9zcyBpbmRleGVzLCBhbmQgYW4gb3B0LWluIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFNFQVJDSF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwic2VhcmNoXCI+O1xuXG4gIC8qKiBSdW50aW1lIG93bmVkIGV4Y2x1c2l2ZWx5IGJ5IHRoaXMgcGx1Z2luIGluc3RhbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFNlYXJjaFJ1bnRpbWUgPSBjcmVhdGVTZWFyY2hSdW50aW1lKHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcblxuICAvKiogVGhlIGJhc2UgcGF0aCBBcHBLaXQgbW91bnRzIHRoaXMgcGx1Z2luJ3Mgcm91dGVzIHVuZGVyLiAqL1xuICBwcml2YXRlIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgL2FwaS8ke1NlYXJjaFBsdWdpbi5tYW5pZmVzdC5uYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdG9vbFJlZ2lzdHJ5KCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgY29uc3QgcmVnaXN0cnk6IFRvb2xSZWdpc3RyeSA9IHtcbiAgICAgIHNlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hTY2hlbWFzLnNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgICAgdW5pdmVyc2FsX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIGlmIChjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgcmVnaXN0cnkuYWRkX2RvY3VtZW50cyA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMuc2VhcmNoUmVxdWVzdFNjaGVtYVxuICAgICAgICAgIC5waWNrKHsgaW5kZXg6IHRydWUgfSlcbiAgICAgICAgICAuZXh0ZW5kKHsgZG9jdW1lbnRzOiBzZWFyY2hTY2hlbWFzLnNlYXJjaERvY3VtZW50U2NoZW1hLmFycmF5KCkgfSksXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQWRkRG9jdW1lbnRzKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZWFkQmFja2VuZD8uc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgICAgcmVnaXN0cnkuY3JlYXRlX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQ3JlYXRlSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZ2lzdHJ5LnN5bmNfaW5kZXggPSBkZWZpbmVUb29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLFxuICAgICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1blN5bmNJbmRleChhcmdzLCBzaWduYWwpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIEF0dGFjaCB0aGUgcmVnaXN0ZXJlZCBwcm92aWRlciBhbmQgbG9nIHRoZSBlZmZlY3RpdmUgcG9saWN5IGF0IGJvb3QuICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlYWRCYWNrZW5kID0gdGhpcy5yZXNvbHZlUHJvdmlkZXJCYWNrZW5kKCk7XG4gICAgc2V0U2VhcmNoUmVhZEJhY2tlbmQodGhpcy5ydW50aW1lLCByZWFkQmFja2VuZCk7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IHJlYWRCYWNrZW5kLnN1cHBvcnRzTGlmZWN5Y2xlID8gXCJhcHBraXQtYWktc2VhcmNoXCIgOiBcImxha2ViYXNlLWFpLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCAmJiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQtY29tcGF0aWJsZSBBSSBTZWFyY2ggcHJvdmlkZXIuICovXG4gIHByaXZhdGUgcmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQ+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHBsdWdpblJlZ2lzdHJ5LnJlcXVpcmUodGhpcy5jb250ZXh0LCBhaVNlYXJjaCwgdGhpcykuZXhwb3J0cygpO1xuICAgIHJldHVybiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQocHJvdmlkZXIsIHJlc29sdmVTZWFyY2hDb25maWcodGhpcy5jb25maWcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIGVuZHBvaW50ICsgaW5kZXggZXhpc3QgYW5kIHNlZWQgdGhlbSwgaG9ub3JpbmcgYGVuc3VyZU9uU2V0dXBgLlxuICAgKiBVc2VzIGJvb3QtdGltZSBTREsgYXV0aCAoZW52IC8gY29uZmlnIHByb2ZpbGUpIHZpYSB0aGUgY2xpZW50J3NcbiAgICogb3V0LW9mLXJlcXVlc3QgZmFsbGJhY2suIEZhaWx1cmVzIGFyZSBsb2dnZWQsIG5ldmVyIHRocm93biAtIGEgc2VhcmNoIGFwcFxuICAgKiBzaG91bGQgc3RpbGwgc3RhcnQgZXZlbiBpZiBwcm92aXNpb25pbmcgaXMgc2xvdyBvciBhIHBlcm1pc3Npb24gaXMgbWlzc2luZy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuRW5zdXJlT25TZXR1cChjb25maWc6IFNlYXJjaFJ1bnRpbWVbXCJjb25maWdcIl0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzcGVjID0gY29uZmlnLmVuc3VyZU9uU2V0dXA7XG4gICAgaWYgKCFzcGVjKSByZXR1cm47XG4gICAgY29uc3QgaW5kZXggPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHNwZWMuaW5kZXgpID8/IGNvbmZpZy5kZWZhdWx0SW5kZXg7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJlbnN1cmUtc2tpcHBlZFwiLCB7XG4gICAgICAgIHJlYXNvbjogXCJubyBpbmRleCBuYW1lIChzZXQgYGluZGV4YCBvciBgZW5zdXJlT25TZXR1cC5pbmRleGApXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZG9jdW1lbnRzID0gc3BlYy5kb2N1bWVudHMgPz8gW107XG4gICAgLy8gSW5mZXIgYSBtYW5hZ2VkLWRpcmVjdC1hY2Nlc3Mgc2NoZW1hIGZyb20gdGhlIGZpcnN0IHNlZWQgcm93IHdoZW4gbm90IGdpdmVuLlxuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBzcGVjLnNjaGVtYSA/P1xuICAgICAgKGRvY3VtZW50cy5sZW5ndGggPiAwICYmICFzcGVjLnNvdXJjZVRhYmxlXG4gICAgICAgID8gdGhpcy5pbmZlclNjaGVtYShkb2N1bWVudHNbMF0sIHNwZWMucHJpbWFyeUtleSA/PyBcImlkXCIsIHNwZWMudGV4dENvbHVtbiA/PyBcInRleHRcIilcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbyhcImVuc3VyZS1zdGFydFwiLCB7IGluZGV4IH0pO1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBjbGllbnQucHJvdmlzaW9uKGluZGV4LCB7XG4gICAgICAgIC4uLihzcGVjLmVuZHBvaW50ID8geyBlbmRwb2ludDogc3BlYy5lbmRwb2ludCB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiBzcGVjLnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMudGV4dENvbHVtbiA/IHsgZW1iZWRkaW5nU291cmNlQ29sdW1uOiBzcGVjLnRleHRDb2x1bW4gfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuZW1iZWRkaW5nTW9kZWwgPyB7IGVtYmVkZGluZ01vZGVsOiBzcGVjLmVtYmVkZGluZ01vZGVsIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnNvdXJjZVRhYmxlID8geyBzb3VyY2VUYWJsZTogc3BlYy5zb3VyY2VUYWJsZSB9IDoge30pLFxuICAgICAgICAuLi4oc2NoZW1hID8geyBzY2hlbWEgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMudGltZW91dE1zID8geyB0aW1lb3V0TXM6IHNwZWMudGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgIC4uLihkb2N1bWVudHMubGVuZ3RoID4gMCA/IHsgc2VlZDogZG9jdW1lbnRzIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXJlYWR5XCIsIHtcbiAgICAgICAgaW5kZXg6IGluZm8ubmFtZSxcbiAgICAgICAgcmVhZHk6IGluZm8ucmVhZHksXG4gICAgICAgIHJvd0NvdW50OiBpbmZvLnJvd0NvdW50ID8/IDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJlbnN1cmUtZmFpbGVkXCIsIHsgaW5kZXgsIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoY2F1c2UpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCBhIFZlY3RvciBTZWFyY2ggYHNjaGVtYV9qc29uYCBtYXAgZnJvbSBhIHNlZWQgZG9jdW1lbnQncyB2YWx1ZSB0eXBlcy4gKi9cbiAgcHJpdmF0ZSBpbmZlclNjaGVtYShcbiAgICBkb2M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHByaW1hcnlLZXk6IHN0cmluZyxcbiAgICB0ZXh0Q29sdW1uOiBzdHJpbmcsXG4gICk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNjaGVtYTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgW3ByaW1hcnlLZXldOiBcInN0cmluZ1wiLCBbdGV4dENvbHVtbl06IFwic3RyaW5nXCIgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkb2MpKSB7XG4gICAgICBpZiAoa2V5IGluIHNjaGVtYSkgY29udGludWU7XG4gICAgICBzY2hlbWFba2V5XSA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgID8gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSlcbiAgICAgICAgICAgID8gXCJpbnRcIlxuICAgICAgICAgICAgOiBcImRvdWJsZVwiXG4gICAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA6IFwic3RyaW5nXCI7XG4gICAgfVxuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICAvKiogUmVsZWFzZSB0aGlzIHBsdWdpbidzIGluc3RhbmNlLW93bmVkIHJ1bnRpbWUuICovXG4gIHNodXRkb3duKCk6IHZvaWQge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCBleHRlbnNpb24gcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAuIFNpbmdsZS1pbmRleCBxdWVyaWVzIHN0YXkgb25cbiAgICogdGhlIHByb3ZpZGVyJ3MgbmF0aXZlIGAvYXBpL2FpLXNlYXJjaC86YWxpYXMvcXVlcnlgIHN1cmZhY2UuXG4gICAqL1xuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwidW5pdmVyc2FsU2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogVU5JVkVSU0FMX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwidW5pdmVyc2FsU2VhcmNoXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKHJlcS5ib2R5ID8/IHt9KTtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hc1VzZXIocmVxKS5ydW5Vbml2ZXJzYWxTZWFyY2gocmVxdWVzdCk7XG4gICAgICAgIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJpbmRleGVzXCIsXG4gICAgICBtZXRob2Q6IFwiZ2V0XCIsXG4gICAgICBwYXRoOiBJTkRFWEVTX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKF9yZXEsIHJlcykgPT4ge1xuICAgICAgICByZXMuanNvbih0aGlzLmNsaWVudENvbmZpZygpKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiZG9jdW1lbnRzXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogRE9DVU1FTlRTX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBkb2N1bWVudCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwiYWRkRG9jdW1lbnRzXCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5BZGREb2N1bWVudHMocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJjcmVhdGVJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IElOREVYX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnLCByZWFkQmFja2VuZCB9ID0gdGhpcy5ydW50aW1lO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlIHx8ICFyZWFkQmFja2VuZD8uc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBpbmRleCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwiY3JlYXRlSW5kZXhcIiwgKCkgPT5cbiAgICAgICAgICB0aGlzLmFzVXNlcihyZXEpLnJ1bkNyZWF0ZUluZGV4KHJlcS5ib2R5ID8/IHt9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwic3luY0luZGV4XCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogSU5ERVhfU1lOQ19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgcmVhZEJhY2tlbmQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSB8fCAhcmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcInN5bmNJbmRleFwiLCAoKSA9PiB0aGlzLmFzVXNlcihyZXEpLnJ1blN5bmNJbmRleChyZXEuYm9keSA/PyB7fSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByb3V0ZSBib2R5LCB0dXJuaW5nIGEgZmFpbHVyZSBpbnRvIGEgSlNPTiBlcnJvciByZXNwb25zZS5cbiAgICpcbiAgICogQXBwS2l0J3MgYHJvdXRlKClgIHJlZ2lzdGVycyB0aGUgaGFuZGxlciBhcy1pcywgc28gYSByZWplY3Rpb24gZXNjYXBlcyBhc1xuICAgKiBhbiB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gYW5kIHRha2VzIHRoZSB3aG9sZSBwcm9jZXNzIGRvd24gcmF0aGVyIHRoYW5cbiAgICogZmFpbGluZyB0aGUgb25lIHJlcXVlc3QuIEV2ZXJ5IHJvdXRlIGhlcmUgZ29lcyB0aHJvdWdoIHRoaXMsIHNvIGEgYmFkIGluZGV4XG4gICAqIG5hbWUgb3IgYSBWZWN0b3IgU2VhcmNoIEFQSSBlcnJvciByZXR1cm5zIDUwMCB3aXRoIGEgbWVzc2FnZSBpbnN0ZWFkIG9mXG4gICAqIGtpbGxpbmcgdGhlIHNlcnZlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzcG9uZChcbiAgICByZXM6IFBhcmFtZXRlcnM8UGFyYW1ldGVyczxJQXBwUm91dGVyW1wicG9zdFwiXT5bMV0+WzFdLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHJ1bjogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcy5qc29uKGF3YWl0IHJ1bigpKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicm91dGUtZmFpbGVkXCIsIHtcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3VyZmFjZSB0aGUgaW5kZXggY2F0YWxvZ3VlICsgZGVmYXVsdHMgc28gYSBzZWFyY2ggYm94IG5lZWRzIG5vIHJvdW5kLXRyaXAuICovXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBwYXlsb2FkOiBTZWFyY2hDbGllbnRDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBjb25maWcuaW5kZXhlcy5tYXAoKGluZGV4KSA9PiAoe1xuICAgICAgICBuYW1lOiBpbmRleC5uYW1lLFxuICAgICAgICBhbGlhczogaW5kZXguYWxpYXMsXG4gICAgICAgIC4uLihpbmRleC5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiBpbmRleC5wcmltYXJ5S2V5IH0gOiB7fSksXG4gICAgICAgIC4uLihpbmRleC5jb2x1bW5zID8geyBjb2x1bW5zOiBpbmRleC5jb2x1bW5zIH0gOiB7fSksXG4gICAgICAgIC4uLihpbmRleC5uYW1lID09PSBjb25maWcuZGVmYXVsdEluZGV4ID8geyBpc0RlZmF1bHQ6IHRydWUgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICAgIC4uLihjb25maWcuZGVmYXVsdEluZGV4ID8geyBkZWZhdWx0SW5kZXg6IGNvbmZpZy5kZWZhdWx0SW5kZXggfSA6IHt9KSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBiYXNlUGF0aDogdGhpcy5iYXNlUGF0aCxcbiAgICB9O1xuICAgIHJldHVybiBwYXlsb2FkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKiogU2VhcmNoIG9uZSBpbmRleCAoZGVmYXVsdCB3aGVuIG9taXR0ZWQpLiBSdW5zIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgdXNlci4gKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU2VhcmNoIGFjcm9zcyBldmVyeSBjb25maWd1cmVkIGluZGV4IGFuZCBtZXJnZSB0aGUgaGl0cy4gKi9cbiAgICAgIHVuaXZlcnNhbFNlYXJjaDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuVW5pdmVyc2FsU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGFkZERvY3VtZW50czogKHJlcXVlc3Q6IHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5BZGREb2N1bWVudHMocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBDcmVhdGUgYSBWZWN0b3IgU2VhcmNoIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGNyZWF0ZUluZGV4OiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5DcmVhdGVJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkNyZWF0ZUluZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU3luYyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIHN5bmNJbmRleDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuU3luY0luZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuU3luY0luZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMuc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIHJldHVybiBjbGllbnQuc2VhcmNoKHJlcXVlc3QucXVlcnksIHRvU2VhcmNoT3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIHJldHVybiBjbGllbnQudW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QucXVlcnksIHRvVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWRkRG9jdW1lbnRzKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVjb3JkID0gKGFyZ3MgPz8ge30pIGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSB0b0RvY3VtZW50QXJyYXkocmVjb3JkLmRvY3VtZW50cyk7XG4gICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZUluZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMuY3JlYXRlSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC5jcmVhdGVJbmRleChyZXF1ZXN0Lm5hbWUsIHRvQ3JlYXRlSW5kZXhPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TeW5jSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBpbmRleCA9IHJlcXVlc3QuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIGF3YWl0IGNsaWVudC5zeW5jSW5kZXgoaW5kZXgsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIHN5bmNlZDogdHJ1ZSB9O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIEFJIFNlYXJjaCBwbHVnaW4gd2l0aCBBcHBLaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHNlYXJjaCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NlYXJjaFwiO1xuICogaW1wb3J0IHsgYWdlbnRzLCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3Qgc3VwcG9ydCA9IGFnZW50cy5jcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCJBbnN3ZXIgZnJvbSB0aGUgZG9jczsgdXNlIGBzZWFyY2hgIHRvIGZpbmQgdGhlbS5cIixcbiAqICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7IC4uLihhd2FpdCBwbHVnaW5zLnNlYXJjaC50b29sa2l0KCkpIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgc2VhcmNoKHsgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiB9KSxcbiAqICAgICBtYXN0cmEoeyBhZ2VudHM6IHN1cHBvcnQgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2VhcmNoID0gdG9QbHVnaW4oU2VhcmNoUGx1Z2luKTtcbiJdfQ==
|
|
409
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUF3QyxNQUFNLG9CQUFvQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RSxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN0RSxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3hCLGtCQUFrQixFQUNsQixhQUFhLEVBQ2IsYUFBYSxHQUVkLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBMkIsTUFBTSxhQUFhLENBQUM7QUFDakcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDMUQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFzQixNQUFNLGNBQWMsQ0FBQztBQUM3RixPQUFPLEVBQ0wsOEJBQThCLEVBQzlCLDZCQUE2QixFQUM3Qix1QkFBdUIsRUFDdkIsMkJBQTJCLEVBQzNCLGlDQUFpQyxHQUNsQyxNQUFNLGFBQWEsQ0FBQztBQUVyQixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7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Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IGV4dGVuc2lvbiBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYHNlYXJjaGApIGFyb3VuZCBhIHNpYmxpbmdcbiAqIGBhaVNlYXJjaGAgcHJvdmlkZXIuIE5hdGl2ZSBBcHBLaXQgb3ducyBWZWN0b3IgU2VhcmNoIHF1ZXJ5IGV4ZWN1dGlvbjsgdGhpc1xuICogcGx1Z2luIGFkZHMgdGhlIHN1cmZhY2VzIHRoYXQgcmVtYWluIHVzZWZ1bCBhY3Jvc3MgbmF0aXZlIGFuZCBMYWtlYmFzZVxuICogcHJvdmlkZXJzOlxuICpcbiAqICAgLSBhIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIC8gKG9wdC1pbikgYGFkZF9kb2N1bWVudHNgIHRvb2wgc2V0IGZvclxuICogICAgIGJvdGggTWFzdHJhIGFuZCBBcHBLaXQgYWdlbnRzIChhdXRvY29tcGxldGUgaXMgYSBzbWFsbC1gbGltaXRgIHNlYXJjaCk7XG4gKiAgIC0gZXh0ZW5zaW9uIHJvdXRlcyB1bmRlciBgL2FwaS9zZWFyY2hgIChgUE9TVCAvdW5pdmVyc2FsYCBmZWRlcmF0ZWQsXG4gKiAgICAgYEdFVCAvaW5kZXhlc2AgY2F0YWxvZ3VlLCBhbmQgb3B0LWluIGRvY3VtZW50L2luZGV4IGxpZmVjeWNsZSByb3V0ZXMpO1xuICogICAtIGEgYGNsaWVudENvbmZpZygpYCBwYXlsb2FkIHNvIGEgVUkga25vd3MgdGhlIGluZGV4ZXMsIGRlZmF1bHQsIGFuZCBwYWdlXG4gKiAgICAgc2l6ZSBhdCBib290IHdpdGggbm8gcm91bmQtdHJpcDtcbiAqICAgLSBgZXhwb3J0cygpYCBzbyBhcHAgY29kZSBjYW4gYGFwcGtpdC5zZWFyY2guc2VhcmNoKC4uLilgIGRpcmVjdGx5LlxuICpcbiAqIFZlY3RvciBTZWFyY2ggcmVhZHMgZGVsZWdhdGUgdG8gdGhlIHJlZ2lzdGVyZWQgbmF0aXZlIEFwcEtpdCBgYWlTZWFyY2hgXG4gKiBwbHVnaW4sIHByZXNlcnZpbmcgaXRzIE9CTywgY2FjaGluZywgcmVyYW5raW5nLCBhbmQgcmVzcG9uc2UgaGFuZGxpbmcuIFRoZVxuICogYWx0ZXJuYXRpdmUgYGxha2ViYXNlQWlTZWFyY2hgIHByb3ZpZGVyIHN1cHBsaWVzIHRoZSBzYW1lIHF1ZXJ5IGNvbnRyYWN0XG4gKiBvdmVyIFBvc3RncmVTUUwgZnVsbC10ZXh0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdG9QbHVnaW4sIHR5cGUgSUFwcFJvdXRlciwgdHlwZSBQbHVnaW5NYW5pZmVzdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFpU2VhcmNoLCBkZWZpbmVUb29sLCB0eXBlIFRvb2xSZWdpc3RyeSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgcGx1Z2luUmVnaXN0cnksIFRvb2xSZWdpc3RyeVBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZXJyb3JVdGlscywgbG9nLCBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBTRUFSQ0hfREVGQVVMVF9CQVNFX1BBVEgsXG4gIFNFQVJDSF9QTFVHSU5fTkFNRSxcbiAgU0VBUkNIX1JPVVRFUyxcbiAgc2VhcmNoU2NoZW1hcyxcbiAgdHlwZSBTZWFyY2hDbGllbnRDb25maWcsXG59IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hcIjtcbmltcG9ydCB7IHRvU2VhcmNoT3B0aW9ucywgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zIH0gZnJvbSBcIi4vX3NlYXJjaC1vcHRpb25zLnRzXCI7XG5pbXBvcnQgeyBTRUFSQ0hfQ09ORklHX1NDSEVNQSwgcmVzb2x2ZVNlYXJjaENvbmZpZywgdHlwZSBTZWFyY2hQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHRvQ3JlYXRlSW5kZXhPcHRpb25zIH0gZnJvbSBcIi4vaW5kZXgtb3B0aW9ucy50c1wiO1xuaW1wb3J0IHsgbmF0aXZlQWlTZWFyY2hCYWNrZW5kIH0gZnJvbSBcIi4vbmF0aXZlLnRzXCI7XG5pbXBvcnQgeyB0b0RvY3VtZW50QXJyYXkgfSBmcm9tIFwiLi9xdWVyeS50c1wiO1xuaW1wb3J0IHsgY3JlYXRlU2VhcmNoUnVudGltZSwgc2V0U2VhcmNoUmVhZEJhY2tlbmQsIHR5cGUgU2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7XG4gIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2hcIik7XG5cbi8qKlxuICogQXBwS2l0IGV4dGVuc2lvbiBwbHVnaW4gZm9yIGFnZW50IHRvb2xzLCBmZWRlcmF0ZWQgc2VhcmNoLCBhbmQgb3B0aW9uYWxcbiAqIFZlY3RvciBTZWFyY2ggbGlmZWN5Y2xlIG9wZXJhdGlvbnMuIFJlZ2lzdGVyIGBhaVNlYXJjaCgpYCBvclxuICogYGxha2ViYXNlQWlTZWFyY2goKWAgYmVmb3JlIHRoaXMgcGx1Z2luLlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBhaVNlYXJjaCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuICogaW1wb3J0IHsgc2VhcmNoIH0gZnJvbSBcIkBkYngtdG9vbHMvc2VhcmNoXCI7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIGFpU2VhcmNoKHtcbiAqICAgICAgIGluZGV4ZXM6IHtcbiAqICAgICAgICAgZG9jczoge1xuICogICAgICAgICAgIGluZGV4TmFtZTogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgICAgICAgIGNvbHVtbnM6IFtcImlkXCIsIFwidGl0bGVcIiwgXCJib2R5XCJdLFxuICogICAgICAgICB9LFxuICogICAgICAgfSxcbiAqICAgICB9KSxcbiAqICAgICBzZWFyY2goe1xuICogICAgICAgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIixcbiAqICAgICAgIGluZGV4ZXM6IFt7IG5hbWU6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiwgYWxpYXM6IFwiZG9jc1wiIH1dLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFRvb2xSZWdpc3RyeVBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFNFQVJDSF9QTFVHSU5fTkFNRSxcbiAgICBkaXNwbGF5TmFtZTogXCJBSSBTZWFyY2hcIixcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgIFwiU2VhcmNoIERhdGFicmlja3MgQUkgU2VhcmNoIChWZWN0b3IgU2VhcmNoKSBpbmRleGVzOiBhZ2VudCB0b29scywgSFRUUCByb3V0ZXMgZm9yIGEgXCIgK1xuICAgICAgXCJzZWFyY2ggYm94LCB1bml2ZXJzYWwgc2VhcmNoIGFjcm9zcyBpbmRleGVzLCBhbmQgYW4gb3B0LWluIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UuXCIsXG4gICAgc3RhYmlsaXR5OiBcImJldGFcIixcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHJlcXVpcmVkOiBbXSxcbiAgICAgIG9wdGlvbmFsOiBbXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFNFQVJDSF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PHR5cGVvZiBTRUFSQ0hfUExVR0lOX05BTUU+O1xuXG4gIC8qKiBSdW50aW1lIG93bmVkIGV4Y2x1c2l2ZWx5IGJ5IHRoaXMgcGx1Z2luIGluc3RhbmNlLiAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHJ1bnRpbWU6IFNlYXJjaFJ1bnRpbWUgPSBjcmVhdGVTZWFyY2hSdW50aW1lKHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcblxuICAvKiogVGhlIGJhc2UgcGF0aCBBcHBLaXQgbW91bnRzIHRoaXMgcGx1Z2luJ3Mgcm91dGVzIHVuZGVyLiAqL1xuICBwcml2YXRlIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTRUFSQ0hfREVGQVVMVF9CQVNFX1BBVEg7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByb3RlY3RlZCBnZXQgdG9vbFJlZ2lzdHJ5KCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgY29uc3QgcmVnaXN0cnk6IFRvb2xSZWdpc3RyeSA9IHtcbiAgICAgIHNlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiBzZWFyY2hTY2hlbWFzLnNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgICAgdW5pdmVyc2FsX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIGlmIChjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgcmVnaXN0cnkuYWRkX2RvY3VtZW50cyA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaFNjaGVtYXMuc2VhcmNoUmVxdWVzdFNjaGVtYVxuICAgICAgICAgIC5waWNrKHsgaW5kZXg6IHRydWUgfSlcbiAgICAgICAgICAuZXh0ZW5kKHsgZG9jdW1lbnRzOiBzZWFyY2hTY2hlbWFzLnNlYXJjaERvY3VtZW50U2NoZW1hLmFycmF5KCkgfSksXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQWRkRG9jdW1lbnRzKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICAgIGlmIChyZWFkQmFja2VuZD8uc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgICAgcmVnaXN0cnkuY3JlYXRlX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgICAgZGVzY3JpcHRpb246IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQ3JlYXRlSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZ2lzdHJ5LnN5bmNfaW5kZXggPSBkZWZpbmVUb29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2VhcmNoU2NoZW1hcy5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLFxuICAgICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1blN5bmNJbmRleChhcmdzLCBzaWduYWwpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIEF0dGFjaCB0aGUgcmVnaXN0ZXJlZCBwcm92aWRlciBhbmQgbG9nIHRoZSBlZmZlY3RpdmUgcG9saWN5IGF0IGJvb3QuICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHJlYWRCYWNrZW5kID0gdGhpcy5yZXNvbHZlUHJvdmlkZXJCYWNrZW5kKCk7XG4gICAgc2V0U2VhcmNoUmVhZEJhY2tlbmQodGhpcy5ydW50aW1lLCByZWFkQmFja2VuZCk7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IHJlYWRCYWNrZW5kLnN1cHBvcnRzTGlmZWN5Y2xlID8gXCJhcHBraXQtYWktc2VhcmNoXCIgOiBcImxha2ViYXNlLWFpLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCAmJiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQtY29tcGF0aWJsZSBBSSBTZWFyY2ggcHJvdmlkZXIuICovXG4gIHByaXZhdGUgcmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQ+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IHBsdWdpblJlZ2lzdHJ5LnJlcXVpcmUodGhpcy5jb250ZXh0LCBhaVNlYXJjaCwgdGhpcykuZXhwb3J0cygpO1xuICAgIHJldHVybiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQocHJvdmlkZXIsIHJlc29sdmVTZWFyY2hDb25maWcodGhpcy5jb25maWcpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnN1cmUgdGhlIGVuZHBvaW50ICsgaW5kZXggZXhpc3QgYW5kIHNlZWQgdGhlbSwgaG9ub3JpbmcgYGVuc3VyZU9uU2V0dXBgLlxuICAgKiBVc2VzIGJvb3QtdGltZSBTREsgYXV0aCAoZW52IC8gY29uZmlnIHByb2ZpbGUpIHZpYSB0aGUgY2xpZW50J3NcbiAgICogb3V0LW9mLXJlcXVlc3QgZmFsbGJhY2suIEZhaWx1cmVzIGFyZSBsb2dnZWQsIG5ldmVyIHRocm93biAtIGEgc2VhcmNoIGFwcFxuICAgKiBzaG91bGQgc3RpbGwgc3RhcnQgZXZlbiBpZiBwcm92aXNpb25pbmcgaXMgc2xvdyBvciBhIHBlcm1pc3Npb24gaXMgbWlzc2luZy5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcnVuRW5zdXJlT25TZXR1cChjb25maWc6IFNlYXJjaFJ1bnRpbWVbXCJjb25maWdcIl0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzcGVjID0gY29uZmlnLmVuc3VyZU9uU2V0dXA7XG4gICAgaWYgKCFzcGVjKSByZXR1cm47XG4gICAgY29uc3QgaW5kZXggPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHNwZWMuaW5kZXgpID8/IGNvbmZpZy5kZWZhdWx0SW5kZXg7XG4gICAgaWYgKCFpbmRleCkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJlbnN1cmUtc2tpcHBlZFwiLCB7XG4gICAgICAgIHJlYXNvbjogXCJubyBpbmRleCBuYW1lIChzZXQgYGluZGV4YCBvciBgZW5zdXJlT25TZXR1cC5pbmRleGApXCIsXG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZG9jdW1lbnRzID0gc3BlYy5kb2N1bWVudHMgPz8gW107XG4gICAgLy8gSW5mZXIgYSBtYW5hZ2VkLWRpcmVjdC1hY2Nlc3Mgc2NoZW1hIGZyb20gdGhlIGZpcnN0IHNlZWQgcm93IHdoZW4gbm90IGdpdmVuLlxuICAgIGNvbnN0IHNjaGVtYSA9XG4gICAgICBzcGVjLnNjaGVtYSA/P1xuICAgICAgKGRvY3VtZW50cy5sZW5ndGggPiAwICYmICFzcGVjLnNvdXJjZVRhYmxlXG4gICAgICAgID8gdGhpcy5pbmZlclNjaGVtYShkb2N1bWVudHNbMF0sIHNwZWMucHJpbWFyeUtleSA/PyBcImlkXCIsIHNwZWMudGV4dENvbHVtbiA/PyBcInRleHRcIilcbiAgICAgICAgOiB1bmRlZmluZWQpO1xuICAgIHRyeSB7XG4gICAgICBsb2dnZXIuaW5mbyhcImVuc3VyZS1zdGFydFwiLCB7IGluZGV4IH0pO1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgIGNvbnN0IGluZm8gPSBhd2FpdCBjbGllbnQucHJvdmlzaW9uKGluZGV4LCB7XG4gICAgICAgIC4uLihzcGVjLmVuZHBvaW50ID8geyBlbmRwb2ludDogc3BlYy5lbmRwb2ludCB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiBzcGVjLnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMudGV4dENvbHVtbiA/IHsgZW1iZWRkaW5nU291cmNlQ29sdW1uOiBzcGVjLnRleHRDb2x1bW4gfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuZW1iZWRkaW5nTW9kZWwgPyB7IGVtYmVkZGluZ01vZGVsOiBzcGVjLmVtYmVkZGluZ01vZGVsIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnNvdXJjZVRhYmxlID8geyBzb3VyY2VUYWJsZTogc3BlYy5zb3VyY2VUYWJsZSB9IDoge30pLFxuICAgICAgICAuLi4oc2NoZW1hID8geyBzY2hlbWEgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMudGltZW91dE1zID8geyB0aW1lb3V0TXM6IHNwZWMudGltZW91dE1zIH0gOiB7fSksXG4gICAgICAgIC4uLihkb2N1bWVudHMubGVuZ3RoID4gMCA/IHsgc2VlZDogZG9jdW1lbnRzIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXJlYWR5XCIsIHtcbiAgICAgICAgaW5kZXg6IGluZm8ubmFtZSxcbiAgICAgICAgcmVhZHk6IGluZm8ucmVhZHksXG4gICAgICAgIHJvd0NvdW50OiBpbmZvLnJvd0NvdW50ID8/IDAsXG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgbG9nZ2VyLndhcm4oXCJlbnN1cmUtZmFpbGVkXCIsIHsgaW5kZXgsIGVycm9yOiBlcnJvclV0aWxzLnRvRXJyb3IoY2F1c2UpIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBCdWlsZCBhIFZlY3RvciBTZWFyY2ggYHNjaGVtYV9qc29uYCBtYXAgZnJvbSBhIHNlZWQgZG9jdW1lbnQncyB2YWx1ZSB0eXBlcy4gKi9cbiAgcHJpdmF0ZSBpbmZlclNjaGVtYShcbiAgICBkb2M6IFJlY29yZDxzdHJpbmcsIHVua25vd24+LFxuICAgIHByaW1hcnlLZXk6IHN0cmluZyxcbiAgICB0ZXh0Q29sdW1uOiBzdHJpbmcsXG4gICk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4ge1xuICAgIGNvbnN0IHNjaGVtYTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHsgW3ByaW1hcnlLZXldOiBcInN0cmluZ1wiLCBbdGV4dENvbHVtbl06IFwic3RyaW5nXCIgfTtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhkb2MpKSB7XG4gICAgICBpZiAoa2V5IGluIHNjaGVtYSkgY29udGludWU7XG4gICAgICBzY2hlbWFba2V5XSA9XG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gXCJudW1iZXJcIlxuICAgICAgICAgID8gTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSlcbiAgICAgICAgICAgID8gXCJpbnRcIlxuICAgICAgICAgICAgOiBcImRvdWJsZVwiXG4gICAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA/IFwiYm9vbGVhblwiXG4gICAgICAgICAgICA6IFwic3RyaW5nXCI7XG4gICAgfVxuICAgIHJldHVybiBzY2hlbWE7XG4gIH1cblxuICAvKiogUmVsZWFzZSB0aGlzIHBsdWdpbidzIGluc3RhbmNlLW93bmVkIHJ1bnRpbWUuICovXG4gIHNodXRkb3duKCk6IHZvaWQge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIG92ZXJyaWRlIGFib3J0QWN0aXZlT3BlcmF0aW9ucygpOiB2b2lkIHtcbiAgICBzdXBlci5hYm9ydEFjdGl2ZU9wZXJhdGlvbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3VudCBleHRlbnNpb24gcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAuIFNpbmdsZS1pbmRleCBxdWVyaWVzIHN0YXkgb25cbiAgICogdGhlIHByb3ZpZGVyJ3MgbmF0aXZlIGAvYXBpL2FpLXNlYXJjaC86YWxpYXMvcXVlcnlgIHN1cmZhY2UuXG4gICAqL1xuICBvdmVycmlkZSBpbmplY3RSb3V0ZXMocm91dGVyOiBJQXBwUm91dGVyKTogdm9pZCB7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwidW5pdmVyc2FsU2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogU0VBUkNIX1JPVVRFUy51bml2ZXJzYWwsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJ1bml2ZXJzYWxTZWFyY2hcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzZWFyY2hTY2hlbWFzLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UocmVxLmJvZHkgPz8ge30pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmFzVXNlcihyZXEpLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImluZGV4ZXNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IFNFQVJDSF9ST1VURVMuaW5kZXhlcyxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmpzb24odGhpcy5jbGllbnRDb25maWcoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRvY3VtZW50c1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFNFQVJDSF9ST1VURVMuZG9jdW1lbnRzLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBkb2N1bWVudCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwiYWRkRG9jdW1lbnRzXCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5BZGREb2N1bWVudHMocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJjcmVhdGVJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFNFQVJDSF9ST1VURVMuaW5kZXgsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUgfHwgIXJlYWRCYWNrZW5kPy5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJjcmVhdGVJbmRleFwiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQ3JlYXRlSW5kZXgocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzeW5jSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBTRUFSQ0hfUk9VVEVTLmluZGV4U3luYyxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgcmVhZEJhY2tlbmQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSB8fCAhcmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcInN5bmNJbmRleFwiLCAoKSA9PiB0aGlzLmFzVXNlcihyZXEpLnJ1blN5bmNJbmRleChyZXEuYm9keSA/PyB7fSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByb3V0ZSBib2R5LCB0dXJuaW5nIGEgZmFpbHVyZSBpbnRvIGEgSlNPTiBlcnJvciByZXNwb25zZS5cbiAgICpcbiAgICogQXBwS2l0J3MgYHJvdXRlKClgIHJlZ2lzdGVycyB0aGUgaGFuZGxlciBhcy1pcywgc28gYSByZWplY3Rpb24gZXNjYXBlcyBhc1xuICAgKiBhbiB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gYW5kIHRha2VzIHRoZSB3aG9sZSBwcm9jZXNzIGRvd24gcmF0aGVyIHRoYW5cbiAgICogZmFpbGluZyB0aGUgb25lIHJlcXVlc3QuIEV2ZXJ5IHJvdXRlIGhlcmUgZ29lcyB0aHJvdWdoIHRoaXMsIHNvIGEgYmFkIGluZGV4XG4gICAqIG5hbWUgb3IgYSBWZWN0b3IgU2VhcmNoIEFQSSBlcnJvciByZXR1cm5zIDUwMCB3aXRoIGEgbWVzc2FnZSBpbnN0ZWFkIG9mXG4gICAqIGtpbGxpbmcgdGhlIHNlcnZlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzcG9uZChcbiAgICByZXM6IFBhcmFtZXRlcnM8UGFyYW1ldGVyczxJQXBwUm91dGVyW1wicG9zdFwiXT5bMV0+WzFdLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHJ1bjogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcy5qc29uKGF3YWl0IHJ1bigpKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicm91dGUtZmFpbGVkXCIsIHtcbiAgICAgICAgb3BlcmF0aW9uLFxuICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGNhdXNlKSxcbiAgICAgIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3VyZmFjZSB0aGUgaW5kZXggY2F0YWxvZ3VlICsgZGVmYXVsdHMgc28gYSBzZWFyY2ggYm94IG5lZWRzIG5vIHJvdW5kLXRyaXAuICovXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBwYXlsb2FkOiBTZWFyY2hDbGllbnRDb25maWcgPSB7XG4gICAgICBpbmRleGVzOiBjb25maWcuaW5kZXhlcy5tYXAoKGluZGV4KSA9PiAoe1xuICAgICAgICBuYW1lOiBpbmRleC5uYW1lLFxuICAgICAgICBhbGlhczogaW5kZXguYWxpYXMsXG4gICAgICAgIC4uLihpbmRleC5wcmltYXJ5S2V5ID8geyBwcmltYXJ5S2V5OiBpbmRleC5wcmltYXJ5S2V5IH0gOiB7fSksXG4gICAgICAgIC4uLihpbmRleC5jb2x1bW5zID8geyBjb2x1bW5zOiBpbmRleC5jb2x1bW5zIH0gOiB7fSksXG4gICAgICAgIC4uLihpbmRleC5uYW1lID09PSBjb25maWcuZGVmYXVsdEluZGV4ID8geyBpc0RlZmF1bHQ6IHRydWUgfSA6IHt9KSxcbiAgICAgIH0pKSxcbiAgICAgIC4uLihjb25maWcuZGVmYXVsdEluZGV4ID8geyBkZWZhdWx0SW5kZXg6IGNvbmZpZy5kZWZhdWx0SW5kZXggfSA6IHt9KSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBiYXNlUGF0aDogdGhpcy5iYXNlUGF0aCxcbiAgICB9O1xuICAgIHJldHVybiBwYXlsb2FkIGFzIHVua25vd24gYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKiogU2VhcmNoIG9uZSBpbmRleCAoZGVmYXVsdCB3aGVuIG9taXR0ZWQpLiBSdW5zIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgdXNlci4gKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU2VhcmNoIGFjcm9zcyBldmVyeSBjb25maWd1cmVkIGluZGV4IGFuZCBtZXJnZSB0aGUgaGl0cy4gKi9cbiAgICAgIHVuaXZlcnNhbFNlYXJjaDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuVW5pdmVyc2FsU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGFkZERvY3VtZW50czogKHJlcXVlc3Q6IHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5BZGREb2N1bWVudHMocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBDcmVhdGUgYSBWZWN0b3IgU2VhcmNoIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGNyZWF0ZUluZGV4OiAocmVxdWVzdDogc2VhcmNoU2NoZW1hcy5DcmVhdGVJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkNyZWF0ZUluZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU3luYyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIHN5bmNJbmRleDogKHJlcXVlc3Q6IHNlYXJjaFNjaGVtYXMuU3luY0luZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuU3luY0luZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMuc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIHJldHVybiBjbGllbnQuc2VhcmNoKHJlcXVlc3QucXVlcnksIHRvU2VhcmNoT3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIHJldHVybiBjbGllbnQudW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QucXVlcnksIHRvVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWRkRG9jdW1lbnRzKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVjb3JkID0gKGFyZ3MgPz8ge30pIGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSB0b0RvY3VtZW50QXJyYXkocmVjb3JkLmRvY3VtZW50cyk7XG4gICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZUluZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFNjaGVtYXMuY3JlYXRlSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC5jcmVhdGVJbmRleChyZXF1ZXN0Lm5hbWUsIHRvQ3JlYXRlSW5kZXhPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TeW5jSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2VhcmNoU2NoZW1hcy5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IHRoaXMucnVudGltZTtcbiAgICBjb25zdCBpbmRleCA9IHJlcXVlc3QuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIGF3YWl0IGNsaWVudC5zeW5jSW5kZXgoaW5kZXgsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIHN5bmNlZDogdHJ1ZSB9O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIEFJIFNlYXJjaCBwbHVnaW4gd2l0aCBBcHBLaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHNlYXJjaCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NlYXJjaFwiO1xuICogaW1wb3J0IHsgYWdlbnRzLCBtYXN0cmEgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG4gKlxuICogY29uc3Qgc3VwcG9ydCA9IGFnZW50cy5jcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogXCJBbnN3ZXIgZnJvbSB0aGUgZG9jczsgdXNlIGBzZWFyY2hgIHRvIGZpbmQgdGhlbS5cIixcbiAqICAgYXN5bmMgdG9vbHMocGx1Z2lucykge1xuICogICAgIHJldHVybiB7IC4uLihhd2FpdCBwbHVnaW5zLnNlYXJjaC50b29sa2l0KCkpIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgc2VhcmNoKHsgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiB9KSxcbiAqICAgICBtYXN0cmEoeyBhZ2VudHM6IHN1cHBvcnQgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2VhcmNoID0gdG9QbHVnaW4oU2VhcmNoUGx1Z2luKTtcbiJdfQ==
|
package/package.json
CHANGED
|
@@ -28,13 +28,13 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@databricks/appkit": "0.81.0",
|
|
30
30
|
"@databricks/sdk-experimental": "^0.17.0",
|
|
31
|
-
"@dbx-tools/appkit": "^0.9.
|
|
32
|
-
"@dbx-tools/core": "^0.9.
|
|
33
|
-
"@dbx-tools/model": "^0.9.
|
|
34
|
-
"@dbx-tools/postgres": "^0.9.
|
|
35
|
-
"@dbx-tools/shared-core": "^0.9.
|
|
36
|
-
"@dbx-tools/shared-model": "^0.9.
|
|
37
|
-
"@dbx-tools/shared-search": "^0.9.
|
|
31
|
+
"@dbx-tools/appkit": "^0.9.139",
|
|
32
|
+
"@dbx-tools/core": "^0.9.139",
|
|
33
|
+
"@dbx-tools/model": "^0.9.139",
|
|
34
|
+
"@dbx-tools/postgres": "^0.9.139",
|
|
35
|
+
"@dbx-tools/shared-core": "^0.9.139",
|
|
36
|
+
"@dbx-tools/shared-model": "^0.9.139",
|
|
37
|
+
"@dbx-tools/shared-search": "^0.9.139",
|
|
38
38
|
"@mastra/core": "1.71.0",
|
|
39
39
|
"pg": "^8.22.0",
|
|
40
40
|
"zod": "4.3.6"
|
|
@@ -101,7 +101,7 @@
|
|
|
101
101
|
"./package.json": "./package.json"
|
|
102
102
|
}
|
|
103
103
|
},
|
|
104
|
-
"version": "0.9.
|
|
104
|
+
"version": "0.9.139",
|
|
105
105
|
"types": "./lib/index.d.ts",
|
|
106
106
|
"dbxToolsConfig": {
|
|
107
107
|
"tags": [
|
package/src/client.ts
CHANGED
package/src/config.ts
CHANGED
|
@@ -7,8 +7,8 @@
|
|
|
7
7
|
*
|
|
8
8
|
* The design goal is "one index, zero config": name a default index (or set
|
|
9
9
|
* `DATABRICKS_VECTOR_SEARCH_INDEX`) and everything else - the columns to
|
|
10
|
-
* return, the page size, the match mode, the
|
|
11
|
-
*
|
|
10
|
+
* return, the page size, the match mode, and the embedding model used when
|
|
11
|
+
* creating an index - has a sensible default that can be
|
|
12
12
|
* overridden when a deployment needs to go deeper.
|
|
13
13
|
*
|
|
14
14
|
* Which index / endpoint is used follows the standard precedence: explicit
|
|
@@ -46,9 +46,6 @@ export const DEFAULT_PAGE_SIZE = 10;
|
|
|
46
46
|
/** Default per-call timeout for a search / index operation. */
|
|
47
47
|
export const DEFAULT_TIMEOUT_MS = 30_000;
|
|
48
48
|
|
|
49
|
-
/** Base path the plugin mounts its routes under, unless overridden. */
|
|
50
|
-
export const DEFAULT_BASE_PATH = "/api/search";
|
|
51
|
-
|
|
52
49
|
/**
|
|
53
50
|
* A configured index the plugin knows about ahead of time. Only `name` (or
|
|
54
51
|
* `alias`) is required; the rest is resolved from the live index definition
|
|
@@ -142,7 +139,6 @@ export interface ResolvedSearchConfig {
|
|
|
142
139
|
pageSize: number;
|
|
143
140
|
mode: SearchMode;
|
|
144
141
|
embeddingModel?: string;
|
|
145
|
-
basePath: string;
|
|
146
142
|
timeoutMs: number;
|
|
147
143
|
allowWrite: boolean;
|
|
148
144
|
ensureOnSetup?: EnsureOnSetupConfig;
|
|
@@ -316,7 +312,6 @@ export function resolveSearchConfig(config: SearchPluginConfig = {}): ResolvedSe
|
|
|
316
312
|
"embeddingModel",
|
|
317
313
|
configUtils.string(config.embeddingModel, "SEARCH_EMBEDDING_MODEL", configUtils.ENV_ONLY),
|
|
318
314
|
),
|
|
319
|
-
basePath: DEFAULT_BASE_PATH,
|
|
320
315
|
timeoutMs: configUtils.positiveInt(
|
|
321
316
|
config.timeoutMs,
|
|
322
317
|
"SEARCH_TIMEOUT_MS",
|
package/src/lakebase.ts
CHANGED
|
@@ -49,7 +49,7 @@ const RESERVED_COLUMNS = new Set(["id", "search_text", "document", "search_vecto
|
|
|
49
49
|
* `store intelligence`. Postgres indexes a hyphenated word as the compound
|
|
50
50
|
* lexeme PLUS each of its parts, but compiles a hyphenated QUERY to the
|
|
51
51
|
* compound alone - so `store-intelligence` demands a `store-intellig` lexeme
|
|
52
|
-
* that a document titled `
|
|
52
|
+
* that a document titled `sample-store-intelligence` does not have, and the
|
|
53
53
|
* search silently returns nothing while `store intelligence` returns
|
|
54
54
|
* everything. Same for `.` and `_` in a table reference.
|
|
55
55
|
*
|
package/src/plugin.ts
CHANGED
|
@@ -6,9 +6,8 @@
|
|
|
6
6
|
*
|
|
7
7
|
* - a `search` / `universal_search` / (opt-in) `add_documents` tool set for
|
|
8
8
|
* both Mastra and AppKit agents (autocomplete is a small-`limit` search);
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* and `POST /documents` when writes are enabled);
|
|
9
|
+
* - extension routes under `/api/search` (`POST /universal` federated,
|
|
10
|
+
* `GET /indexes` catalogue, and opt-in document/index lifecycle routes);
|
|
12
11
|
* - a `clientConfig()` payload so a UI knows the indexes, default, and page
|
|
13
12
|
* size at boot with no round-trip;
|
|
14
13
|
* - `exports()` so app code can `appkit.search.search(...)` directly.
|
|
@@ -25,7 +24,13 @@ import { toPlugin, type IAppRouter, type PluginManifest } from "@databricks/appk
|
|
|
25
24
|
import { aiSearch, defineTool, type ToolRegistry } from "@databricks/appkit/beta";
|
|
26
25
|
import { pluginRegistry, ToolRegistryPlugin } from "@dbx-tools/appkit";
|
|
27
26
|
import { errorUtils, log, stringUtils } from "@dbx-tools/shared-core";
|
|
28
|
-
import {
|
|
27
|
+
import {
|
|
28
|
+
SEARCH_DEFAULT_BASE_PATH,
|
|
29
|
+
SEARCH_PLUGIN_NAME,
|
|
30
|
+
SEARCH_ROUTES,
|
|
31
|
+
searchSchemas,
|
|
32
|
+
type SearchClientConfig,
|
|
33
|
+
} from "@dbx-tools/shared-search";
|
|
29
34
|
import { toSearchOptions, toUniversalSearchOptions } from "./_search-options.ts";
|
|
30
35
|
import { SEARCH_CONFIG_SCHEMA, resolveSearchConfig, type SearchPluginConfig } from "./config.ts";
|
|
31
36
|
import { toCreateIndexOptions } from "./index-options.ts";
|
|
@@ -42,21 +47,6 @@ import {
|
|
|
42
47
|
|
|
43
48
|
const logger = log.logger("search");
|
|
44
49
|
|
|
45
|
-
/** Mount-relative route for a universal (federated) search across indexes. */
|
|
46
|
-
const UNIVERSAL_ROUTE = "/universal";
|
|
47
|
-
|
|
48
|
-
/** Mount-relative route serving the index catalogue a search box reads. */
|
|
49
|
-
const INDEXES_ROUTE = "/indexes";
|
|
50
|
-
|
|
51
|
-
/** Mount-relative route for adding documents to a direct-access index. */
|
|
52
|
-
const DOCUMENTS_ROUTE = "/documents";
|
|
53
|
-
|
|
54
|
-
/** Mount-relative route for creating a Vector Search index. */
|
|
55
|
-
const INDEX_ROUTE = "/index";
|
|
56
|
-
|
|
57
|
-
/** Mount-relative route for syncing a Delta Sync index from its source table. */
|
|
58
|
-
const INDEX_SYNC_ROUTE = "/index/sync";
|
|
59
|
-
|
|
60
50
|
/**
|
|
61
51
|
* AppKit extension plugin for agent tools, federated search, and optional
|
|
62
52
|
* Vector Search lifecycle operations. Register `aiSearch()` or
|
|
@@ -89,7 +79,7 @@ const INDEX_SYNC_ROUTE = "/index/sync";
|
|
|
89
79
|
*/
|
|
90
80
|
export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
|
|
91
81
|
static manifest = {
|
|
92
|
-
name:
|
|
82
|
+
name: SEARCH_PLUGIN_NAME,
|
|
93
83
|
displayName: "AI Search",
|
|
94
84
|
description:
|
|
95
85
|
"Search Databricks AI Search (Vector Search) indexes: agent tools, HTTP routes for a " +
|
|
@@ -100,14 +90,14 @@ export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
|
|
|
100
90
|
optional: [],
|
|
101
91
|
},
|
|
102
92
|
config: { schema: SEARCH_CONFIG_SCHEMA },
|
|
103
|
-
} satisfies PluginManifest<
|
|
93
|
+
} satisfies PluginManifest<typeof SEARCH_PLUGIN_NAME>;
|
|
104
94
|
|
|
105
95
|
/** Runtime owned exclusively by this plugin instance. */
|
|
106
96
|
private readonly runtime: SearchRuntime = createSearchRuntime({ config: this.config });
|
|
107
97
|
|
|
108
98
|
/** The base path AppKit mounts this plugin's routes under. */
|
|
109
99
|
private get basePath(): string {
|
|
110
|
-
return
|
|
100
|
+
return SEARCH_DEFAULT_BASE_PATH;
|
|
111
101
|
}
|
|
112
102
|
|
|
113
103
|
/**
|
|
@@ -279,7 +269,7 @@ export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
|
|
|
279
269
|
this.route(router, {
|
|
280
270
|
name: "universalSearch",
|
|
281
271
|
method: "post",
|
|
282
|
-
path:
|
|
272
|
+
path: SEARCH_ROUTES.universal,
|
|
283
273
|
handler: async (req, res) => {
|
|
284
274
|
await this.respond(res, "universalSearch", () => {
|
|
285
275
|
const request = searchSchemas.universalSearchRequestSchema.parse(req.body ?? {});
|
|
@@ -290,7 +280,7 @@ export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
|
|
|
290
280
|
this.route(router, {
|
|
291
281
|
name: "indexes",
|
|
292
282
|
method: "get",
|
|
293
|
-
path:
|
|
283
|
+
path: SEARCH_ROUTES.indexes,
|
|
294
284
|
handler: async (_req, res) => {
|
|
295
285
|
res.json(this.clientConfig());
|
|
296
286
|
},
|
|
@@ -298,7 +288,7 @@ export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
|
|
|
298
288
|
this.route(router, {
|
|
299
289
|
name: "documents",
|
|
300
290
|
method: "post",
|
|
301
|
-
path:
|
|
291
|
+
path: SEARCH_ROUTES.documents,
|
|
302
292
|
handler: async (req, res) => {
|
|
303
293
|
const { config } = this.runtime;
|
|
304
294
|
if (!config.allowWrite) {
|
|
@@ -313,7 +303,7 @@ export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
|
|
|
313
303
|
this.route(router, {
|
|
314
304
|
name: "createIndex",
|
|
315
305
|
method: "post",
|
|
316
|
-
path:
|
|
306
|
+
path: SEARCH_ROUTES.index,
|
|
317
307
|
handler: async (req, res) => {
|
|
318
308
|
const { config, readBackend } = this.runtime;
|
|
319
309
|
if (!config.allowWrite || !readBackend?.supportsLifecycle) {
|
|
@@ -328,7 +318,7 @@ export class SearchPlugin extends ToolRegistryPlugin<SearchPluginConfig> {
|
|
|
328
318
|
this.route(router, {
|
|
329
319
|
name: "syncIndex",
|
|
330
320
|
method: "post",
|
|
331
|
-
path:
|
|
321
|
+
path: SEARCH_ROUTES.indexSync,
|
|
332
322
|
handler: async (req, res) => {
|
|
333
323
|
const { config, readBackend } = this.runtime;
|
|
334
324
|
if (!config.allowWrite || !readBackend?.supportsLifecycle) {
|