@dbx-tools/search 0.9.154 → 0.9.157
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/index.ts +13 -8
- package/lib/index.d.ts +13 -8
- package/lib/index.js +12 -7
- package/lib/src/client.d.ts +1 -2
- package/lib/src/client.js +15 -15
- package/lib/src/config.js +16 -16
- package/lib/src/lakebase-plugin.js +9 -11
- package/lib/src/lakebase.js +9 -11
- package/lib/src/native.js +5 -5
- package/lib/src/plugin.d.ts +5 -5
- package/lib/src/plugin.js +20 -20
- package/lib/src/query.js +4 -4
- package/lib/src/schema.d.ts +0 -66
- package/lib/src/schema.js +7 -20
- package/lib/src/tool.js +14 -16
- package/package.json +9 -105
- package/src/client.ts +14 -17
- package/src/config.ts +16 -44
- package/src/lakebase-plugin.ts +8 -10
- package/src/lakebase.ts +16 -13
- package/src/native.ts +6 -6
- package/src/plugin.ts +31 -24
- package/src/query.ts +3 -3
- package/src/schema.ts +6 -25
- package/src/tool.ts +22 -20
package/lib/src/plugin.js
CHANGED
|
@@ -21,9 +21,9 @@
|
|
|
21
21
|
*/
|
|
22
22
|
import { toPlugin } from "@databricks/appkit";
|
|
23
23
|
import { aiSearch, defineTool } from "@databricks/appkit/beta";
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
26
|
-
import { SEARCH_DEFAULT_BASE_PATH, SEARCH_PLUGIN_NAME, SEARCH_ROUTES,
|
|
24
|
+
import { ToolRegistryPlugin, require } from "@dbx-tools/appkit";
|
|
25
|
+
import { log, toError, errorMessage, trimToNull } from "@dbx-tools/shared-core";
|
|
26
|
+
import { SEARCH_DEFAULT_BASE_PATH, SEARCH_PLUGIN_NAME, SEARCH_ROUTES, searchRequestSchema, universalSearchRequestSchema, searchDocumentSchema, createIndexRequestSchema, syncIndexRequestSchema, } from "@dbx-tools/shared-search";
|
|
27
27
|
import { toSearchOptions, toUniversalSearchOptions } from "./_search-options.js";
|
|
28
28
|
import { SEARCH_CONFIG_SCHEMA, resolveSearchConfig } from "./config.js";
|
|
29
29
|
import { toCreateIndexOptions } from "./index-options.js";
|
|
@@ -93,14 +93,14 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
93
93
|
const registry = {
|
|
94
94
|
search: defineTool({
|
|
95
95
|
description: SEARCH_TOOL_DESCRIPTION,
|
|
96
|
-
schema:
|
|
96
|
+
schema: searchRequestSchema,
|
|
97
97
|
annotations: { effect: "read", requiresUserContext: true },
|
|
98
98
|
autoInheritable: false,
|
|
99
99
|
execute: async (args, signal) => this.runSearch(args, signal),
|
|
100
100
|
}),
|
|
101
101
|
universal_search: defineTool({
|
|
102
102
|
description: UNIVERSAL_SEARCH_TOOL_DESCRIPTION,
|
|
103
|
-
schema:
|
|
103
|
+
schema: universalSearchRequestSchema,
|
|
104
104
|
annotations: { effect: "read", requiresUserContext: true },
|
|
105
105
|
autoInheritable: false,
|
|
106
106
|
execute: async (args, signal) => this.runUniversalSearch(args, signal),
|
|
@@ -109,9 +109,9 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
109
109
|
if (config.allowWrite) {
|
|
110
110
|
registry.add_documents = defineTool({
|
|
111
111
|
description: ADD_DOCUMENTS_TOOL_DESCRIPTION,
|
|
112
|
-
schema:
|
|
112
|
+
schema: searchRequestSchema
|
|
113
113
|
.pick({ index: true })
|
|
114
|
-
.extend({ documents:
|
|
114
|
+
.extend({ documents: searchDocumentSchema.array() }),
|
|
115
115
|
annotations: { effect: "write", requiresUserContext: true },
|
|
116
116
|
autoInheritable: false,
|
|
117
117
|
execute: async (args, signal) => this.runAddDocuments(args, signal),
|
|
@@ -119,14 +119,14 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
119
119
|
if (readBackend?.supportsLifecycle) {
|
|
120
120
|
registry.create_index = defineTool({
|
|
121
121
|
description: CREATE_INDEX_TOOL_DESCRIPTION,
|
|
122
|
-
schema:
|
|
122
|
+
schema: createIndexRequestSchema,
|
|
123
123
|
annotations: { effect: "write", requiresUserContext: true },
|
|
124
124
|
autoInheritable: false,
|
|
125
125
|
execute: async (args, signal) => this.runCreateIndex(args, signal),
|
|
126
126
|
});
|
|
127
127
|
registry.sync_index = defineTool({
|
|
128
128
|
description: SYNC_INDEX_TOOL_DESCRIPTION,
|
|
129
|
-
schema:
|
|
129
|
+
schema: syncIndexRequestSchema,
|
|
130
130
|
annotations: { effect: "write", requiresUserContext: true },
|
|
131
131
|
autoInheritable: false,
|
|
132
132
|
execute: async (args, signal) => this.runSyncIndex(args, signal),
|
|
@@ -160,7 +160,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
160
160
|
}
|
|
161
161
|
/** Resolve the registered AppKit-compatible AI Search provider. */
|
|
162
162
|
resolveProviderBackend() {
|
|
163
|
-
const provider =
|
|
163
|
+
const provider = require(this.context, aiSearch, this).exports();
|
|
164
164
|
return nativeAiSearchBackend(provider, resolveSearchConfig(this.config));
|
|
165
165
|
}
|
|
166
166
|
/**
|
|
@@ -173,7 +173,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
173
173
|
const spec = config.ensureOnSetup;
|
|
174
174
|
if (!spec)
|
|
175
175
|
return;
|
|
176
|
-
const index =
|
|
176
|
+
const index = trimToNull(spec.index) ?? config.defaultIndex;
|
|
177
177
|
if (!index) {
|
|
178
178
|
logger.warn("ensure-skipped", {
|
|
179
179
|
reason: "no index name (set `index` or `ensureOnSetup.index`)",
|
|
@@ -206,7 +206,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
206
206
|
});
|
|
207
207
|
}
|
|
208
208
|
catch (cause) {
|
|
209
|
-
logger.warn("ensure-failed", { index, error:
|
|
209
|
+
logger.warn("ensure-failed", { index, error: toError(cause) });
|
|
210
210
|
}
|
|
211
211
|
}
|
|
212
212
|
/** Build a Vector Search `schema_json` map from a seed document's value types. */
|
|
@@ -244,7 +244,7 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
244
244
|
path: SEARCH_ROUTES.universal,
|
|
245
245
|
handler: async (req, res) => {
|
|
246
246
|
await this.respond(res, "universalSearch", () => {
|
|
247
|
-
const request =
|
|
247
|
+
const request = universalSearchRequestSchema.parse(req.body ?? {});
|
|
248
248
|
return this.asUser(req).runUniversalSearch(request);
|
|
249
249
|
});
|
|
250
250
|
},
|
|
@@ -311,10 +311,10 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
311
311
|
res.json(await run());
|
|
312
312
|
}
|
|
313
313
|
catch (cause) {
|
|
314
|
-
const message =
|
|
314
|
+
const message = errorMessage(cause);
|
|
315
315
|
logger.warn("route-failed", {
|
|
316
316
|
operation,
|
|
317
|
-
error:
|
|
317
|
+
error: toError(cause),
|
|
318
318
|
});
|
|
319
319
|
res.status(500).json({ error: message });
|
|
320
320
|
}
|
|
@@ -351,12 +351,12 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
351
351
|
};
|
|
352
352
|
}
|
|
353
353
|
async runSearch(args, signal) {
|
|
354
|
-
const request =
|
|
354
|
+
const request = searchRequestSchema.parse(args);
|
|
355
355
|
const { client } = this.runtime;
|
|
356
356
|
return client.search(request.query, toSearchOptions(request, signal));
|
|
357
357
|
}
|
|
358
358
|
async runUniversalSearch(args, signal) {
|
|
359
|
-
const request =
|
|
359
|
+
const request = universalSearchRequestSchema.parse(args);
|
|
360
360
|
const { client } = this.runtime;
|
|
361
361
|
return client.universalSearch(request.query, toUniversalSearchOptions(request, signal));
|
|
362
362
|
}
|
|
@@ -368,12 +368,12 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
368
368
|
return client.addDocuments(index, documents, signal);
|
|
369
369
|
}
|
|
370
370
|
async runCreateIndex(args, signal) {
|
|
371
|
-
const request =
|
|
371
|
+
const request = createIndexRequestSchema.parse(args);
|
|
372
372
|
const { client } = this.runtime;
|
|
373
373
|
return client.createIndex(request.name, toCreateIndexOptions(request, signal));
|
|
374
374
|
}
|
|
375
375
|
async runSyncIndex(args, signal) {
|
|
376
|
-
const request =
|
|
376
|
+
const request = syncIndexRequestSchema.parse(args);
|
|
377
377
|
const { client, config } = this.runtime;
|
|
378
378
|
const index = request.index ?? config.defaultIndex ?? "";
|
|
379
379
|
await client.syncIndex(index, signal);
|
|
@@ -406,4 +406,4 @@ export class SearchPlugin extends ToolRegistryPlugin {
|
|
|
406
406
|
* ```
|
|
407
407
|
*/
|
|
408
408
|
export const search = toPlugin(SearchPlugin);
|
|
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==
|
|
409
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFFSCxPQUFPLEVBQUUsUUFBUSxFQUF3QyxNQUFNLG9CQUFvQixDQUFDO0FBQ3BGLE9BQU8sRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDaEYsT0FBTyxFQUNMLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsYUFBYSxFQUViLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsb0JBQW9CLEVBQ3BCLHdCQUF3QixFQUN4QixzQkFBc0IsR0FLdkIsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsZUFBZSxFQUFFLHdCQUF3QixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDakYsT0FBTyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUEyQixNQUFNLGFBQWEsQ0FBQztBQUNqRyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDcEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQXNCLE1BQU0sY0FBYyxDQUFDO0FBQzdGLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsaUNBQWlDLEdBQ2xDLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFB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ICogQXBwS2l0IGV4dGVuc2lvbiBwbHVnaW4gKHJlZ2lzdGVyZWQgbmFtZTogYHNlYXJjaGApIGFyb3VuZCBhIHNpYmxpbmdcbiAqIGBhaVNlYXJjaGAgcHJvdmlkZXIuIE5hdGl2ZSBBcHBLaXQgb3ducyBWZWN0b3IgU2VhcmNoIHF1ZXJ5IGV4ZWN1dGlvbjsgdGhpc1xuICogcGx1Z2luIGFkZHMgdGhlIHN1cmZhY2VzIHRoYXQgcmVtYWluIHVzZWZ1bCBhY3Jvc3MgbmF0aXZlIGFuZCBMYWtlYmFzZVxuICogcHJvdmlkZXJzOlxuICpcbiAqICAgLSBhIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIC8gKG9wdC1pbikgYGFkZF9kb2N1bWVudHNgIHRvb2wgc2V0IGZvclxuICogICAgIGJvdGggTWFzdHJhIGFuZCBBcHBLaXQgYWdlbnRzIChhdXRvY29tcGxldGUgaXMgYSBzbWFsbC1gbGltaXRgIHNlYXJjaCk7XG4gKiAgIC0gZXh0ZW5zaW9uIHJvdXRlcyB1bmRlciBgL2FwaS9zZWFyY2hgIChgUE9TVCAvdW5pdmVyc2FsYCBmZWRlcmF0ZWQsXG4gKiAgICAgYEdFVCAvaW5kZXhlc2AgY2F0YWxvZ3VlLCBhbmQgb3B0LWluIGRvY3VtZW50L2luZGV4IGxpZmVjeWNsZSByb3V0ZXMpO1xuICogICAtIGEgYGNsaWVudENvbmZpZygpYCBwYXlsb2FkIHNvIGEgVUkga25vd3MgdGhlIGluZGV4ZXMsIGRlZmF1bHQsIGFuZCBwYWdlXG4gKiAgICAgc2l6ZSBhdCBib290IHdpdGggbm8gcm91bmQtdHJpcDtcbiAqICAgLSBgZXhwb3J0cygpYCBzbyBhcHAgY29kZSBjYW4gYGFwcGtpdC5zZWFyY2guc2VhcmNoKC4uLilgIGRpcmVjdGx5LlxuICpcbiAqIFZlY3RvciBTZWFyY2ggcmVhZHMgZGVsZWdhdGUgdG8gdGhlIHJlZ2lzdGVyZWQgbmF0aXZlIEFwcEtpdCBgYWlTZWFyY2hgXG4gKiBwbHVnaW4sIHByZXNlcnZpbmcgaXRzIE9CTywgY2FjaGluZywgcmVyYW5raW5nLCBhbmQgcmVzcG9uc2UgaGFuZGxpbmcuIFRoZVxuICogYWx0ZXJuYXRpdmUgYGxha2ViYXNlQWlTZWFyY2hgIHByb3ZpZGVyIHN1cHBsaWVzIHRoZSBzYW1lIHF1ZXJ5IGNvbnRyYWN0XG4gKiBvdmVyIFBvc3RncmVTUUwgZnVsbC10ZXh0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgdG9QbHVnaW4sIHR5cGUgSUFwcFJvdXRlciwgdHlwZSBQbHVnaW5NYW5pZmVzdCB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFpU2VhcmNoLCBkZWZpbmVUb29sLCB0eXBlIFRvb2xSZWdpc3RyeSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXQvYmV0YVwiO1xuaW1wb3J0IHsgVG9vbFJlZ2lzdHJ5UGx1Z2luLCByZXF1aXJlIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBsb2csIHRvRXJyb3IsIGVycm9yTWVzc2FnZSwgdHJpbVRvTnVsbCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQge1xuICBTRUFSQ0hfREVGQVVMVF9CQVNFX1BBVEgsXG4gIFNFQVJDSF9QTFVHSU5fTkFNRSxcbiAgU0VBUkNIX1JPVVRFUyxcbiAgdHlwZSBTZWFyY2hDbGllbnRDb25maWcsXG4gIHNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gIHVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gIHNlYXJjaERvY3VtZW50U2NoZW1hLFxuICBjcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gIHN5bmNJbmRleFJlcXVlc3RTY2hlbWEsXG4gIHR5cGUgU2VhcmNoUmVxdWVzdCxcbiAgdHlwZSBVbml2ZXJzYWxTZWFyY2hSZXF1ZXN0LFxuICB0eXBlIENyZWF0ZUluZGV4UmVxdWVzdCxcbiAgdHlwZSBTeW5jSW5kZXhSZXF1ZXN0LFxufSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyB0b1NlYXJjaE9wdGlvbnMsIHRvVW5pdmVyc2FsU2VhcmNoT3B0aW9ucyB9IGZyb20gXCIuL19zZWFyY2gtb3B0aW9ucy50c1wiO1xuaW1wb3J0IHsgU0VBUkNIX0NPTkZJR19TQ0hFTUEsIHJlc29sdmVTZWFyY2hDb25maWcsIHR5cGUgU2VhcmNoUGx1Z2luQ29uZmlnIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NyZWF0ZUluZGV4T3B0aW9ucyB9IGZyb20gXCIuL2luZGV4LW9wdGlvbnMudHNcIjtcbmltcG9ydCB7IG5hdGl2ZUFpU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL25hdGl2ZS50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGNyZWF0ZVNlYXJjaFJ1bnRpbWUsIHNldFNlYXJjaFJlYWRCYWNrZW5kLCB0eXBlIFNlYXJjaFJ1bnRpbWUgfSBmcm9tIFwiLi9ydW50aW1lLnRzXCI7XG5pbXBvcnQge1xuICBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04sXG4gIENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG59IGZyb20gXCIuL3NjaGVtYS50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwic2VhcmNoXCIpO1xuXG4vKipcbiAqIEFwcEtpdCBleHRlbnNpb24gcGx1Z2luIGZvciBhZ2VudCB0b29scywgZmVkZXJhdGVkIHNlYXJjaCwgYW5kIG9wdGlvbmFsXG4gKiBWZWN0b3IgU2VhcmNoIGxpZmVjeWNsZSBvcGVyYXRpb25zLiBSZWdpc3RlciBgYWlTZWFyY2goKWAgb3JcbiAqIGBsYWtlYmFzZUFpU2VhcmNoKClgIGJlZm9yZSB0aGlzIHBsdWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYWlTZWFyY2ggfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbiAqIGltcG9ydCB7IHNlYXJjaCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NlYXJjaFwiO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICBhaVNlYXJjaCh7XG4gKiAgICAgICBpbmRleGVzOiB7XG4gKiAgICAgICAgIGRvY3M6IHtcbiAqICAgICAgICAgICBpbmRleE5hbWU6IFwibWFpbi5zdXBwb3J0LmRvY3NcIixcbiAqICAgICAgICAgICBjb2x1bW5zOiBbXCJpZFwiLCBcInRpdGxlXCIsIFwiYm9keVwiXSxcbiAqICAgICAgICAgfSxcbiAqICAgICAgIH0sXG4gKiAgICAgfSksXG4gKiAgICAgc2VhcmNoKHtcbiAqICAgICAgIGluZGV4OiBcIm1haW4uc3VwcG9ydC5kb2NzXCIsXG4gKiAgICAgICBpbmRleGVzOiBbeyBuYW1lOiBcIm1haW4uc3VwcG9ydC5kb2NzXCIsIGFsaWFzOiBcImRvY3NcIiB9XSxcbiAqICAgICB9KSxcbiAqICAgXSxcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWFyY2hQbHVnaW4gZXh0ZW5kcyBUb29sUmVnaXN0cnlQbHVnaW48U2VhcmNoUGx1Z2luQ29uZmlnPiB7XG4gIHN0YXRpYyBtYW5pZmVzdCA9IHtcbiAgICBuYW1lOiBTRUFSQ0hfUExVR0lOX05BTUUsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDx0eXBlb2YgU0VBUkNIX1BMVUdJTl9OQU1FPjtcblxuICAvKiogUnVudGltZSBvd25lZCBleGNsdXNpdmVseSBieSB0aGlzIHBsdWdpbiBpbnN0YW5jZS4gKi9cbiAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lOiBTZWFyY2hSdW50aW1lID0gY3JlYXRlU2VhcmNoUnVudGltZSh7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG5cbiAgLyoqIFRoZSBiYXNlIHBhdGggQXBwS2l0IG1vdW50cyB0aGlzIHBsdWdpbidzIHJvdXRlcyB1bmRlci4gKi9cbiAgcHJpdmF0ZSBnZXQgYmFzZVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU0VBUkNIX0RFRkFVTFRfQkFTRV9QQVRIO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSB0b29scyB0aGlzIHBsdWdpbiBvZmZlcnMgdG8gYW4gQXBwS2l0IGFnZW50LiBgc2VhcmNoYCAvXG4gICAqIGB1bml2ZXJzYWxfc2VhcmNoYCBhcmUgcmVhZHM7IGBhZGRfZG9jdW1lbnRzYCAvIGBjcmVhdGVfaW5kZXhgIC9cbiAgICogYHN5bmNfaW5kZXhgIGFyZSBvbmx5IG9mZmVyZWQgd2hlbiB0aGUgd3JpdGUgc3VyZmFjZSBpcyBlbmFibGVkLiBOb25lIGlzXG4gICAqIGF1dG9Jbmhlcml0YWJsZTogZXZlcnkgdG9vbCBydW5zIHVuZGVyIHRoZSBjYWxsZXIncyBpZGVudGl0eSwgc28gaXQgbXVzdCBiZVxuICAgKiBncmFudGVkIGV4cGxpY2l0bHkuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRvb2xSZWdpc3RyeSgpOiBUb29sUmVnaXN0cnkge1xuICAgIGNvbnN0IHsgY29uZmlnLCByZWFkQmFja2VuZCB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IHJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgICBzZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2VhcmNoUmVxdWVzdFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcInJlYWRcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1blNlYXJjaChhcmdzLCBzaWduYWwpLFxuICAgICAgfSksXG4gICAgICB1bml2ZXJzYWxfc2VhcmNoOiBkZWZpbmVUb29sKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgc2NoZW1hOiB1bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIGlmIChjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgcmVnaXN0cnkuYWRkX2RvY3VtZW50cyA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgICAgICAucGljayh7IGluZGV4OiB0cnVlIH0pXG4gICAgICAgICAgLmV4dGVuZCh7IGRvY3VtZW50czogc2VhcmNoRG9jdW1lbnRTY2hlbWEuYXJyYXkoKSB9KSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5BZGREb2N1bWVudHMoYXJncywgc2lnbmFsKSxcbiAgICAgIH0pO1xuICAgICAgaWYgKHJlYWRCYWNrZW5kPy5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgICByZWdpc3RyeS5jcmVhdGVfaW5kZXggPSBkZWZpbmVUb29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgICAgc2NoZW1hOiBjcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQ3JlYXRlSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZ2lzdHJ5LnN5bmNfaW5kZXggPSBkZWZpbmVUb29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc3luY0luZGV4UmVxdWVzdFNjaGVtYSxcbiAgICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TeW5jSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWdpc3RyeTtcbiAgfVxuXG4gIC8qKiBBdHRhY2ggdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXIgYW5kIGxvZyB0aGUgZWZmZWN0aXZlIHBvbGljeSBhdCBib290LiAqL1xuICBvdmVycmlkZSBhc3luYyBzZXR1cCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCByZWFkQmFja2VuZCA9IHRoaXMucmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpO1xuICAgIHNldFNlYXJjaFJlYWRCYWNrZW5kKHRoaXMucnVudGltZSwgcmVhZEJhY2tlbmQpO1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgbG9nZ2VyLmluZm8oXCJyZWFkeVwiLCB7XG4gICAgICBiYWNrZW5kOiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSA/IFwiYXBwa2l0LWFpLXNlYXJjaFwiIDogXCJsYWtlYmFzZS1haS1zZWFyY2hcIixcbiAgICAgIGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIihub25lIC0gcGFzcyBwZXIgcmVxdWVzdClcIixcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaSkgPT4gaS5hbGlhcyksXG4gICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2VTaXplLFxuICAgICAgbW9kZTogY29uZmlnLm1vZGUsXG4gICAgICBhbGxvd1dyaXRlOiBjb25maWcuYWxsb3dXcml0ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgICAgZW5zdXJlT25TZXR1cDogY29uZmlnLmVuc3VyZU9uU2V0dXBcbiAgICAgICAgPyAoY29uZmlnLmVuc3VyZU9uU2V0dXAuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleClcbiAgICAgICAgOiBcIm9mZlwiLFxuICAgIH0pO1xuICAgIC8vIFByb3Zpc2lvbiBhIHJlYWwgaW5kZXggaW4gdGhlIEJBQ0tHUk9VTkQgc28gYSBzbG93IGZpcnN0LXRpbWUgZW5kcG9pbnQgb3JcbiAgICAvLyBpbmRleCBidWlsZCBuZXZlciBibG9ja3MgdGhlIHNlcnZlciBmcm9tIGNvbWluZyB1cC5cbiAgICBpZiAoY29uZmlnLmVuc3VyZU9uU2V0dXAgJiYgcmVhZEJhY2tlbmQuc3VwcG9ydHNMaWZlY3ljbGUpIHtcbiAgICAgIHZvaWQgdGhpcy5ydW5FbnN1cmVPblNldHVwKGNvbmZpZyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFJlc29sdmUgdGhlIHJlZ2lzdGVyZWQgQXBwS2l0LWNvbXBhdGlibGUgQUkgU2VhcmNoIHByb3ZpZGVyLiAqL1xuICBwcml2YXRlIHJlc29sdmVQcm92aWRlckJhY2tlbmQoKTogUmV0dXJuVHlwZTx0eXBlb2YgbmF0aXZlQWlTZWFyY2hCYWNrZW5kPiB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSByZXF1aXJlKHRoaXMuY29udGV4dCwgYWlTZWFyY2gsIHRoaXMpLmV4cG9ydHMoKTtcbiAgICByZXR1cm4gbmF0aXZlQWlTZWFyY2hCYWNrZW5kKHByb3ZpZGVyLCByZXNvbHZlU2VhcmNoQ29uZmlnKHRoaXMuY29uZmlnKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnOiBTZWFyY2hSdW50aW1lW1wiY29uZmlnXCJdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gdHJpbVRvTnVsbChzcGVjLmluZGV4KSA/PyBjb25maWcuZGVmYXVsdEluZGV4O1xuICAgIGlmICghaW5kZXgpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZW5zdXJlLXNraXBwZWRcIiwge1xuICAgICAgICByZWFzb246IFwibm8gaW5kZXggbmFtZSAoc2V0IGBpbmRleGAgb3IgYGVuc3VyZU9uU2V0dXAuaW5kZXhgKVwiLFxuICAgICAgfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGRvY3VtZW50cyA9IHNwZWMuZG9jdW1lbnRzID8/IFtdO1xuICAgIC8vIEluZmVyIGEgbWFuYWdlZC1kaXJlY3QtYWNjZXNzIHNjaGVtYSBmcm9tIHRoZSBmaXJzdCBzZWVkIHJvdyB3aGVuIG5vdCBnaXZlbi5cbiAgICBjb25zdCBzY2hlbWEgPVxuICAgICAgc3BlYy5zY2hlbWEgPz9cbiAgICAgIChkb2N1bWVudHMubGVuZ3RoID4gMCAmJiAhc3BlYy5zb3VyY2VUYWJsZVxuICAgICAgICA/IHRoaXMuaW5mZXJTY2hlbWEoZG9jdW1lbnRzWzBdLCBzcGVjLnByaW1hcnlLZXkgPz8gXCJpZFwiLCBzcGVjLnRleHRDb2x1bW4gPz8gXCJ0ZXh0XCIpXG4gICAgICAgIDogdW5kZWZpbmVkKTtcbiAgICB0cnkge1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtc3RhcnRcIiwgeyBpbmRleCB9KTtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICBjb25zdCBpbmZvID0gYXdhaXQgY2xpZW50LnByb3Zpc2lvbihpbmRleCwge1xuICAgICAgICAuLi4oc3BlYy5lbmRwb2ludCA/IHsgZW5kcG9pbnQ6IHNwZWMuZW5kcG9pbnQgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMucHJpbWFyeUtleSA/IHsgcHJpbWFyeUtleTogc3BlYy5wcmltYXJ5S2V5IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnRleHRDb2x1bW4gPyB7IGVtYmVkZGluZ1NvdXJjZUNvbHVtbjogc3BlYy50ZXh0Q29sdW1uIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLmVtYmVkZGluZ01vZGVsID8geyBlbWJlZGRpbmdNb2RlbDogc3BlYy5lbWJlZGRpbmdNb2RlbCB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5zb3VyY2VUYWJsZSA/IHsgc291cmNlVGFibGU6IHNwZWMuc291cmNlVGFibGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNjaGVtYSA/IHsgc2NoZW1hIH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnRpbWVvdXRNcyA/IHsgdGltZW91dE1zOiBzcGVjLnRpbWVvdXRNcyB9IDoge30pLFxuICAgICAgICAuLi4oZG9jdW1lbnRzLmxlbmd0aCA+IDAgPyB7IHNlZWQ6IGRvY3VtZW50cyB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICBsb2dnZXIuaW5mbyhcImVuc3VyZS1yZWFkeVwiLCB7XG4gICAgICAgIGluZGV4OiBpbmZvLm5hbWUsXG4gICAgICAgIHJlYWR5OiBpbmZvLnJlYWR5LFxuICAgICAgICByb3dDb3VudDogaW5mby5yb3dDb3VudCA/PyAwLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGxvZ2dlci53YXJuKFwiZW5zdXJlLWZhaWxlZFwiLCB7IGluZGV4LCBlcnJvcjogdG9FcnJvcihjYXVzZSkgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEJ1aWxkIGEgVmVjdG9yIFNlYXJjaCBgc2NoZW1hX2pzb25gIG1hcCBmcm9tIGEgc2VlZCBkb2N1bWVudCdzIHZhbHVlIHR5cGVzLiAqL1xuICBwcml2YXRlIGluZmVyU2NoZW1hKFxuICAgIGRvYzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcHJpbWFyeUtleTogc3RyaW5nLFxuICAgIHRleHRDb2x1bW46IHN0cmluZyxcbiAgKTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiB7XG4gICAgY29uc3Qgc2NoZW1hOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0geyBbcHJpbWFyeUtleV06IFwic3RyaW5nXCIsIFt0ZXh0Q29sdW1uXTogXCJzdHJpbmdcIiB9O1xuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKGRvYykpIHtcbiAgICAgIGlmIChrZXkgaW4gc2NoZW1hKSBjb250aW51ZTtcbiAgICAgIHNjaGVtYVtrZXldID1cbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSBcIm51bWJlclwiXG4gICAgICAgICAgPyBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKVxuICAgICAgICAgICAgPyBcImludFwiXG4gICAgICAgICAgICA6IFwiZG91YmxlXCJcbiAgICAgICAgICA6IHR5cGVvZiB2YWx1ZSA9PT0gXCJib29sZWFuXCJcbiAgICAgICAgICAgID8gXCJib29sZWFuXCJcbiAgICAgICAgICAgIDogXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgcmV0dXJuIHNjaGVtYTtcbiAgfVxuXG4gIC8qKiBSZWxlYXNlIHRoaXMgcGx1Z2luJ3MgaW5zdGFuY2Utb3duZWQgcnVudGltZS4gKi9cbiAgc2h1dGRvd24oKTogdm9pZCB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IGV4dGVuc2lvbiByb3V0ZXMgdW5kZXIgYC9hcGkvc2VhcmNoYC4gU2luZ2xlLWluZGV4IHF1ZXJpZXMgc3RheSBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBuYXRpdmUgYC9hcGkvYWktc2VhcmNoLzphbGlhcy9xdWVyeWAgc3VyZmFjZS5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJ1bml2ZXJzYWxTZWFyY2hcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBTRUFSQ0hfUk9VVEVTLnVuaXZlcnNhbCxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcInVuaXZlcnNhbFNlYXJjaFwiLCAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UocmVxLmJvZHkgPz8ge30pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmFzVXNlcihyZXEpLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImluZGV4ZXNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IFNFQVJDSF9ST1VURVMuaW5kZXhlcyxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmpzb24odGhpcy5jbGllbnRDb25maWcoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRvY3VtZW50c1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFNFQVJDSF9ST1VURVMuZG9jdW1lbnRzLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBkb2N1bWVudCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwiYWRkRG9jdW1lbnRzXCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5BZGREb2N1bWVudHMocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJjcmVhdGVJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IFNFQVJDSF9ST1VURVMuaW5kZXgsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUgfHwgIXJlYWRCYWNrZW5kPy5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJjcmVhdGVJbmRleFwiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQ3JlYXRlSW5kZXgocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzeW5jSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBTRUFSQ0hfUk9VVEVTLmluZGV4U3luYyxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgcmVhZEJhY2tlbmQgfSA9IHRoaXMucnVudGltZTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSB8fCAhcmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcInN5bmNJbmRleFwiLCAoKSA9PiB0aGlzLmFzVXNlcihyZXEpLnJ1blN5bmNJbmRleChyZXEuYm9keSA/PyB7fSkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW4gYSByb3V0ZSBib2R5LCB0dXJuaW5nIGEgZmFpbHVyZSBpbnRvIGEgSlNPTiBlcnJvciByZXNwb25zZS5cbiAgICpcbiAgICogQXBwS2l0J3MgYHJvdXRlKClgIHJlZ2lzdGVycyB0aGUgaGFuZGxlciBhcy1pcywgc28gYSByZWplY3Rpb24gZXNjYXBlcyBhc1xuICAgKiBhbiB1bmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24gYW5kIHRha2VzIHRoZSB3aG9sZSBwcm9jZXNzIGRvd24gcmF0aGVyIHRoYW5cbiAgICogZmFpbGluZyB0aGUgb25lIHJlcXVlc3QuIEV2ZXJ5IHJvdXRlIGhlcmUgZ29lcyB0aHJvdWdoIHRoaXMsIHNvIGEgYmFkIGluZGV4XG4gICAqIG5hbWUgb3IgYSBWZWN0b3IgU2VhcmNoIEFQSSBlcnJvciByZXR1cm5zIDUwMCB3aXRoIGEgbWVzc2FnZSBpbnN0ZWFkIG9mXG4gICAqIGtpbGxpbmcgdGhlIHNlcnZlci5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgcmVzcG9uZChcbiAgICByZXM6IFBhcmFtZXRlcnM8UGFyYW1ldGVyczxJQXBwUm91dGVyW1wicG9zdFwiXT5bMV0+WzFdLFxuICAgIG9wZXJhdGlvbjogc3RyaW5nLFxuICAgIHJ1bjogKCkgPT4gUHJvbWlzZTx1bmtub3duPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdHJ5IHtcbiAgICAgIHJlcy5qc29uKGF3YWl0IHJ1bigpKTtcbiAgICB9IGNhdGNoIChjYXVzZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVycm9yTWVzc2FnZShjYXVzZSk7XG4gICAgICBsb2dnZXIud2FybihcInJvdXRlLWZhaWxlZFwiLCB7XG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgZXJyb3I6IHRvRXJyb3IoY2F1c2UpLFxuICAgICAgfSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBtZXNzYWdlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdXJmYWNlIHRoZSBpbmRleCBjYXRhbG9ndWUgKyBkZWZhdWx0cyBzbyBhIHNlYXJjaCBib3ggbmVlZHMgbm8gcm91bmQtdHJpcC4gKi9cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaENsaWVudENvbmZpZyA9IHtcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgLi4uKGluZGV4LnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4LmNvbHVtbnMgPyB7IGNvbHVtbnM6IGluZGV4LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4Lm5hbWUgPT09IGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGlzRGVmYXVsdDogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKiBTZWFyY2ggb25lIGluZGV4IChkZWZhdWx0IHdoZW4gb21pdHRlZCkuIFJ1bnMgYXMgdGhlIGN1cnJlbnQgY29udGV4dCB1c2VyLiAqL1xuICAgICAgc2VhcmNoOiAocmVxdWVzdDogU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+IHRoaXMucnVuU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU2VhcmNoIGFjcm9zcyBldmVyeSBjb25maWd1cmVkIGluZGV4IGFuZCBtZXJnZSB0aGUgaGl0cy4gKi9cbiAgICAgIHVuaXZlcnNhbFNlYXJjaDogKHJlcXVlc3Q6IFVuaXZlcnNhbFNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBpbmRleCAodGhyb3dzIHdoZW4gd3JpdGVzIGFyZSBkaXNhYmxlZCkuICovXG4gICAgICBhZGREb2N1bWVudHM6IChyZXF1ZXN0OiB7IGluZGV4Pzogc3RyaW5nOyBkb2N1bWVudHM6IHVua25vd24gfSwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQWRkRG9jdW1lbnRzKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQ3JlYXRlIGEgVmVjdG9yIFNlYXJjaCBpbmRleCAodGhyb3dzIHdoZW4gd3JpdGVzIGFyZSBkaXNhYmxlZCkuICovXG4gICAgICBjcmVhdGVJbmRleDogKHJlcXVlc3Q6IENyZWF0ZUluZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQ3JlYXRlSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTeW5jIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUgKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgc3luY0luZGV4OiAocmVxdWVzdDogU3luY0luZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuU3luY0luZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU2VhcmNoKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IHRoaXMucnVudGltZTtcbiAgICByZXR1cm4gY2xpZW50LnNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB0b1NlYXJjaE9wdGlvbnMocmVxdWVzdCwgc2lnbmFsKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blVuaXZlcnNhbFNlYXJjaChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB1bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC51bml2ZXJzYWxTZWFyY2gocmVxdWVzdC5xdWVyeSwgdG9Vbml2ZXJzYWxTZWFyY2hPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5BZGREb2N1bWVudHMoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZWNvcmQgPSAoYXJncyA/PyB7fSkgYXMgeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH07XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gdGhpcy5ydW50aW1lO1xuICAgIGNvbnN0IGRvY3VtZW50cyA9IHRvRG9jdW1lbnRBcnJheShyZWNvcmQuZG9jdW1lbnRzKTtcbiAgICBjb25zdCBpbmRleCA9IHJlY29yZC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgcmV0dXJuIGNsaWVudC5hZGREb2N1bWVudHMoaW5kZXgsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQ3JlYXRlSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gY3JlYXRlSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50IH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgcmV0dXJuIGNsaWVudC5jcmVhdGVJbmRleChyZXF1ZXN0Lm5hbWUsIHRvQ3JlYXRlSW5kZXhPcHRpb25zKHJlcXVlc3QsIHNpZ25hbCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TeW5jSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc3luY0luZGV4UmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnIH0gPSB0aGlzLnJ1bnRpbWU7XG4gICAgY29uc3QgaW5kZXggPSByZXF1ZXN0LmluZGV4ID8/IGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gXCJcIjtcbiAgICBhd2FpdCBjbGllbnQuc3luY0luZGV4KGluZGV4LCBzaWduYWwpO1xuICAgIHJldHVybiB7IGluZGV4LCBzeW5jZWQ6IHRydWUgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBBSSBTZWFyY2ggcGx1Z2luIHdpdGggQXBwS2l0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBzZWFyY2ggfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqIGltcG9ydCB7IGFnZW50cywgbWFzdHJhIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IHN1cHBvcnQgPSBhZ2VudHMuY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiQW5zd2VyIGZyb20gdGhlIGRvY3M7IHVzZSBgc2VhcmNoYCB0byBmaW5kIHRoZW0uXCIsXG4gKiAgIGFzeW5jIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi4oYXdhaXQgcGx1Z2lucy5zZWFyY2gudG9vbGtpdCgpKSB9O1xuICogICB9LFxuICogfSk7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIHNlYXJjaCh7IGluZGV4OiBcIm1haW4uc3VwcG9ydC5kb2NzXCIgfSksXG4gKiAgICAgbWFzdHJhKHsgYWdlbnRzOiBzdXBwb3J0IH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaCA9IHRvUGx1Z2luKFNlYXJjaFBsdWdpbik7XG4iXX0=
|
package/lib/src/query.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/** Request-shape helpers for search extension write routes and tools. */
|
|
2
2
|
import { ValidationError } from "@databricks/appkit";
|
|
3
|
-
import {
|
|
3
|
+
import { parse, isRecord } from "@dbx-tools/shared-core";
|
|
4
4
|
/**
|
|
5
5
|
* Parse a JSON document payload the model / a route supplied for a write.
|
|
6
6
|
* Accepts an already-parsed array/object or a JSON string, and always returns
|
|
@@ -8,11 +8,11 @@ import { json, object } from "@dbx-tools/shared-core";
|
|
|
8
8
|
* {@link ValidationError} on unparseable input so the caller can surface it.
|
|
9
9
|
*/
|
|
10
10
|
export function toDocumentArray(input) {
|
|
11
|
-
const value = typeof input === "string" ?
|
|
11
|
+
const value = typeof input === "string" ? parse(input, undefined) : input;
|
|
12
12
|
if (value === undefined) {
|
|
13
13
|
throw new ValidationError("documents must be a JSON object, array, or string");
|
|
14
14
|
}
|
|
15
15
|
const list = Array.isArray(value) ? value : [value];
|
|
16
|
-
return list.filter(
|
|
16
|
+
return list.filter(isRecord);
|
|
17
17
|
}
|
|
18
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVlcnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEseUVBQXlFO0FBRXpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXpEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxLQUFjO0lBQzVDLE1BQU0sS0FBSyxHQUFHLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzFFLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxlQUFlLENBQUMsbURBQW1ELENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqIFJlcXVlc3Qtc2hhcGUgaGVscGVycyBmb3Igc2VhcmNoIGV4dGVuc2lvbiB3cml0ZSByb3V0ZXMgYW5kIHRvb2xzLiAqL1xuXG5pbXBvcnQgeyBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwYXJzZSwgaXNSZWNvcmQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKipcbiAqIFBhcnNlIGEgSlNPTiBkb2N1bWVudCBwYXlsb2FkIHRoZSBtb2RlbCAvIGEgcm91dGUgc3VwcGxpZWQgZm9yIGEgd3JpdGUuXG4gKiBBY2NlcHRzIGFuIGFscmVhZHktcGFyc2VkIGFycmF5L29iamVjdCBvciBhIEpTT04gc3RyaW5nLCBhbmQgYWx3YXlzIHJldHVybnNcbiAqIGFuIGFycmF5IHNvIGEgc2luZ2xlIGRvY3VtZW50IGFuZCBhIGJhdGNoIGFyZSBoYW5kbGVkIHRoZSBzYW1lIHdheS4gVGhyb3dzIGFcbiAqIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9IG9uIHVucGFyc2VhYmxlIGlucHV0IHNvIHRoZSBjYWxsZXIgY2FuIHN1cmZhY2UgaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0RvY3VtZW50QXJyYXkoaW5wdXQ6IHVua25vd24pOiBBcnJheTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4ge1xuICBjb25zdCB2YWx1ZSA9IHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIiA/IHBhcnNlKGlucHV0LCB1bmRlZmluZWQpIDogaW5wdXQ7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcImRvY3VtZW50cyBtdXN0IGJlIGEgSlNPTiBvYmplY3QsIGFycmF5LCBvciBzdHJpbmdcIik7XG4gIH1cbiAgY29uc3QgbGlzdCA9IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdO1xuICByZXR1cm4gbGlzdC5maWx0ZXIoaXNSZWNvcmQpO1xufVxuIl19
|
package/lib/src/schema.d.ts
CHANGED
|
@@ -16,69 +16,3 @@ export declare const ADD_DOCUMENTS_TOOL_DESCRIPTION: string;
|
|
|
16
16
|
export declare const CREATE_INDEX_TOOL_DESCRIPTION: string;
|
|
17
17
|
/** Description the model reads for the `sync_index` tool. */
|
|
18
18
|
export declare const SYNC_INDEX_TOOL_DESCRIPTION: string;
|
|
19
|
-
/** Schema for the `search` tool input (the shared request schema). */
|
|
20
|
-
export declare const searchToolSchema: import("zod").ZodObject<{
|
|
21
|
-
query: import("zod").ZodString;
|
|
22
|
-
index: import("zod").ZodOptional<import("zod").ZodString>;
|
|
23
|
-
limit: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
24
|
-
mode: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
25
|
-
hybrid: "hybrid";
|
|
26
|
-
vector: "vector";
|
|
27
|
-
keyword: "keyword";
|
|
28
|
-
}>>;
|
|
29
|
-
columns: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
30
|
-
filter: import("zod").ZodOptional<import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber, import("zod").ZodBoolean, import("zod").ZodArray<import("zod").ZodUnion<readonly [import("zod").ZodString, import("zod").ZodNumber]>>]>>>;
|
|
31
|
-
scoreThreshold: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
32
|
-
}, import("zod/v4/core").$strip>;
|
|
33
|
-
/** Schema for the `universal_search` tool input. */
|
|
34
|
-
export declare const universalSearchToolSchema: import("zod").ZodObject<{
|
|
35
|
-
query: import("zod").ZodString;
|
|
36
|
-
indexes: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
37
|
-
limit: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
38
|
-
mode: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
39
|
-
hybrid: "hybrid";
|
|
40
|
-
vector: "vector";
|
|
41
|
-
keyword: "keyword";
|
|
42
|
-
}>>;
|
|
43
|
-
}, import("zod/v4/core").$strip>;
|
|
44
|
-
/** Schema for the `search` / `universal_search` tool output. */
|
|
45
|
-
export declare const searchResultSchema: import("zod").ZodObject<{
|
|
46
|
-
query: import("zod").ZodString;
|
|
47
|
-
hits: import("zod").ZodArray<import("zod").ZodObject<{
|
|
48
|
-
id: import("zod").ZodString;
|
|
49
|
-
score: import("zod").ZodNumber;
|
|
50
|
-
fields: import("zod").ZodRecord<import("zod").ZodString, import("zod").ZodUnknown>;
|
|
51
|
-
index: import("zod").ZodOptional<import("zod").ZodString>;
|
|
52
|
-
}, import("zod/v4/core").$strip>>;
|
|
53
|
-
index: import("zod").ZodOptional<import("zod").ZodString>;
|
|
54
|
-
count: import("zod").ZodNumber;
|
|
55
|
-
}, import("zod/v4/core").$strip>;
|
|
56
|
-
/** Schema for the `create_index` tool input. */
|
|
57
|
-
export declare const createIndexToolSchema: import("zod").ZodObject<{
|
|
58
|
-
name: import("zod").ZodString;
|
|
59
|
-
sourceTable: import("zod").ZodOptional<import("zod").ZodString>;
|
|
60
|
-
primaryKey: import("zod").ZodOptional<import("zod").ZodString>;
|
|
61
|
-
embeddingSourceColumn: import("zod").ZodOptional<import("zod").ZodString>;
|
|
62
|
-
embeddingModel: import("zod").ZodOptional<import("zod").ZodString>;
|
|
63
|
-
endpoint: import("zod").ZodOptional<import("zod").ZodString>;
|
|
64
|
-
embeddingDimension: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
65
|
-
pipelineType: import("zod").ZodOptional<import("zod").ZodEnum<{
|
|
66
|
-
TRIGGERED: "TRIGGERED";
|
|
67
|
-
CONTINUOUS: "CONTINUOUS";
|
|
68
|
-
}>>;
|
|
69
|
-
columnsToSync: import("zod").ZodOptional<import("zod").ZodArray<import("zod").ZodString>>;
|
|
70
|
-
}, import("zod/v4/core").$strip>;
|
|
71
|
-
/** Schema for the `create_index` tool output (a resolved index definition). */
|
|
72
|
-
export declare const indexInfoSchema: import("zod").ZodObject<{
|
|
73
|
-
name: import("zod").ZodString;
|
|
74
|
-
endpoint: import("zod").ZodOptional<import("zod").ZodString>;
|
|
75
|
-
primaryKey: import("zod").ZodOptional<import("zod").ZodString>;
|
|
76
|
-
columns: import("zod").ZodArray<import("zod").ZodString>;
|
|
77
|
-
ready: import("zod").ZodBoolean;
|
|
78
|
-
rowCount: import("zod").ZodOptional<import("zod").ZodNumber>;
|
|
79
|
-
directAccess: import("zod").ZodOptional<import("zod").ZodBoolean>;
|
|
80
|
-
}, import("zod/v4/core").$strip>;
|
|
81
|
-
/** Schema for the `sync_index` tool input. */
|
|
82
|
-
export declare const syncIndexToolSchema: import("zod").ZodObject<{
|
|
83
|
-
index: import("zod").ZodOptional<import("zod").ZodString>;
|
|
84
|
-
}, import("zod/v4/core").$strip>;
|
package/lib/src/schema.js
CHANGED
|
@@ -6,10 +6,9 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
import {
|
|
10
|
-
import { searchSchemas } from "@dbx-tools/shared-search";
|
|
9
|
+
import { toDescription } from "@dbx-tools/shared-core";
|
|
11
10
|
/** Description the model reads for the `search` tool. */
|
|
12
|
-
export const SEARCH_TOOL_DESCRIPTION =
|
|
11
|
+
export const SEARCH_TOOL_DESCRIPTION = toDescription(`
|
|
13
12
|
Search a Databricks AI Search (Vector Search) index for the documents most
|
|
14
13
|
relevant to a query. Pass a natural-language question or keywords; hybrid
|
|
15
14
|
matching combines semantic similarity with keyword ranking, so exact terms
|
|
@@ -19,21 +18,21 @@ export const SEARCH_TOOL_DESCRIPTION = stringUtils.toDescription(`
|
|
|
19
18
|
indexed content before answering.
|
|
20
19
|
`);
|
|
21
20
|
/** Description the model reads for the `universal_search` tool. */
|
|
22
|
-
export const UNIVERSAL_SEARCH_TOOL_DESCRIPTION =
|
|
21
|
+
export const UNIVERSAL_SEARCH_TOOL_DESCRIPTION = toDescription(`
|
|
23
22
|
Search across every configured AI Search index at once and return the best
|
|
24
23
|
matches from all of them, merged and ranked. Use it when the right index
|
|
25
24
|
isn't known in advance or when an answer may live in any of several
|
|
26
25
|
collections (docs, tickets, products).
|
|
27
26
|
`);
|
|
28
27
|
/** Description the model reads for the `add_documents` tool. */
|
|
29
|
-
export const ADD_DOCUMENTS_TOOL_DESCRIPTION =
|
|
28
|
+
export const ADD_DOCUMENTS_TOOL_DESCRIPTION = toDescription(`
|
|
30
29
|
Add or update documents in a direct-access AI Search index. Pass an array of
|
|
31
30
|
documents as JSON objects; each MUST include the index's primary-key column.
|
|
32
31
|
Only available when the app enables the write surface. Use it to index new
|
|
33
32
|
content the user provides.
|
|
34
33
|
`);
|
|
35
34
|
/** Description the model reads for the `create_index` tool. */
|
|
36
|
-
export const CREATE_INDEX_TOOL_DESCRIPTION =
|
|
35
|
+
export const CREATE_INDEX_TOOL_DESCRIPTION = toDescription(`
|
|
37
36
|
Create a Databricks AI Search (Vector Search) index. For the common case pass
|
|
38
37
|
a Delta source table (catalog.schema.table): Databricks computes embeddings
|
|
39
38
|
from its text column and keeps the index synced. To create a direct-access
|
|
@@ -44,21 +43,9 @@ export const CREATE_INDEX_TOOL_DESCRIPTION = stringUtils.toDescription(`
|
|
|
44
43
|
explicitly asks to set up a new index.
|
|
45
44
|
`);
|
|
46
45
|
/** Description the model reads for the `sync_index` tool. */
|
|
47
|
-
export const SYNC_INDEX_TOOL_DESCRIPTION =
|
|
46
|
+
export const SYNC_INDEX_TOOL_DESCRIPTION = toDescription(`
|
|
48
47
|
Refresh a Delta Sync AI Search index from its source table so newly added or
|
|
49
48
|
changed rows become searchable. Optionally name the index (defaults to the
|
|
50
49
|
app's default index). Only available when the app enables the write surface.
|
|
51
50
|
`);
|
|
52
|
-
|
|
53
|
-
export const searchToolSchema = searchSchemas.searchRequestSchema;
|
|
54
|
-
/** Schema for the `universal_search` tool input. */
|
|
55
|
-
export const universalSearchToolSchema = searchSchemas.universalSearchRequestSchema;
|
|
56
|
-
/** Schema for the `search` / `universal_search` tool output. */
|
|
57
|
-
export const searchResultSchema = searchSchemas.searchResultSchema;
|
|
58
|
-
/** Schema for the `create_index` tool input. */
|
|
59
|
-
export const createIndexToolSchema = searchSchemas.createIndexRequestSchema;
|
|
60
|
-
/** Schema for the `create_index` tool output (a resolved index definition). */
|
|
61
|
-
export const indexInfoSchema = searchSchemas.indexInfoSchema;
|
|
62
|
-
/** Schema for the `sync_index` tool input. */
|
|
63
|
-
export const syncIndexToolSchema = searchSchemas.syncIndexRequestSchema;
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3JELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUV6RCx5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7Q0FRaEUsQ0FBQyxDQUFDO0FBRUgsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLGlDQUFpQyxHQUFHLFdBQVcsQ0FBQyxhQUFhLENBQUM7Ozs7O0NBSzFFLENBQUMsQ0FBQztBQUVILGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDOzs7OztDQUt2RSxDQUFDLENBQUM7QUFFSCwrREFBK0Q7QUFDL0QsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsV0FBVyxDQUFDLGFBQWEsQ0FBQzs7Ozs7Ozs7O0NBU3RFLENBQUMsQ0FBQztBQUVILDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxXQUFXLENBQUMsYUFBYSxDQUFDOzs7O0NBSXBFLENBQUMsQ0FBQztBQUVILHNFQUFzRTtBQUN0RSxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUMsbUJBQW1CLENBQUM7QUFFbEUsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFHLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQztBQUVwRixnRUFBZ0U7QUFDaEUsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDLGtCQUFrQixDQUFDO0FBRW5FLGdEQUFnRDtBQUNoRCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsd0JBQXdCLENBQUM7QUFFNUUsK0VBQStFO0FBQy9FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxhQUFhLENBQUMsZUFBZSxDQUFDO0FBRTdELDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLENBQUMsc0JBQXNCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFRvb2wtZmFjaW5nIGRlc2NyaXB0aW9ucyBhbmQgdGhlIHJlcXVlc3Qgc2NoZW1hcyB0aGUgTWFzdHJhIHRvb2xzICsgQXBwS2l0XG4gKiB0b29sIHByb3ZpZGVyIHZhbGlkYXRlIGFnYWluc3QuIFRoZSB3aXJlIHNoYXBlcyB0aGVtc2VsdmVzIGxpdmUgaW5cbiAqIGBAZGJ4LXRvb2xzL3NoYXJlZC1zZWFyY2hgOyB0aGlzIG1vZHVsZSBhZGRzIHRoZSBtb2RlbC1yZWFkYWJsZVxuICogZGVzY3JpcHRpb25zIHNvIGJvdGggaG9zdHMgZGVzY3JpYmUgdGhlIHRvb2xzIGlkZW50aWNhbGx5LlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQgeyBzdHJpbmdVdGlscyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBzZWFyY2hTY2hlbWFzIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaFwiO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHNlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTiA9IHN0cmluZ1V0aWxzLnRvRGVzY3JpcHRpb24oYFxuICBTZWFyY2ggYSBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggZm9yIHRoZSBkb2N1bWVudHMgbW9zdFxuICByZWxldmFudCB0byBhIHF1ZXJ5LiBQYXNzIGEgbmF0dXJhbC1sYW5ndWFnZSBxdWVzdGlvbiBvciBrZXl3b3JkczsgaHlicmlkXG4gIG1hdGNoaW5nIGNvbWJpbmVzIHNlbWFudGljIHNpbWlsYXJpdHkgd2l0aCBrZXl3b3JkIHJhbmtpbmcsIHNvIGV4YWN0IHRlcm1zXG4gIChwcm9kdWN0IG5hbWVzLCBlcnJvciBjb2RlcykgYW5kIHBhcmFwaHJhc2VzIGJvdGggd29yay4gT3B0aW9uYWxseSBuYW1lIGFuXG4gIGluZGV4IChkZWZhdWx0cyB0byB0aGUgYXBwJ3MgY29uZmlndXJlZCBpbmRleCksIGEgcmVzdWx0IGxpbWl0LCBhbmQgYXR0cmlidXRlXG4gIGZpbHRlcnMuIFVzZSBpdCB0byBsb29rIHVwIGRvY3MsIGtub3dsZWRnZS1iYXNlIGFydGljbGVzLCBwcm9kdWN0cywgb3IgYW55XG4gIGluZGV4ZWQgY29udGVudCBiZWZvcmUgYW5zd2VyaW5nLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgdW5pdmVyc2FsX3NlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04gPSBzdHJpbmdVdGlscy50b0Rlc2NyaXB0aW9uKGBcbiAgU2VhcmNoIGFjcm9zcyBldmVyeSBjb25maWd1cmVkIEFJIFNlYXJjaCBpbmRleCBhdCBvbmNlIGFuZCByZXR1cm4gdGhlIGJlc3RcbiAgbWF0Y2hlcyBmcm9tIGFsbCBvZiB0aGVtLCBtZXJnZWQgYW5kIHJhbmtlZC4gVXNlIGl0IHdoZW4gdGhlIHJpZ2h0IGluZGV4XG4gIGlzbid0IGtub3duIGluIGFkdmFuY2Ugb3Igd2hlbiBhbiBhbnN3ZXIgbWF5IGxpdmUgaW4gYW55IG9mIHNldmVyYWxcbiAgY29sbGVjdGlvbnMgKGRvY3MsIHRpY2tldHMsIHByb2R1Y3RzKS5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYGFkZF9kb2N1bWVudHNgIHRvb2wuICovXG5leHBvcnQgY29uc3QgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBBSSBTZWFyY2ggaW5kZXguIFBhc3MgYW4gYXJyYXkgb2ZcbiAgZG9jdW1lbnRzIGFzIEpTT04gb2JqZWN0czsgZWFjaCBNVVNUIGluY2x1ZGUgdGhlIGluZGV4J3MgcHJpbWFyeS1rZXkgY29sdW1uLlxuICBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS4gVXNlIGl0IHRvIGluZGV4IG5ld1xuICBjb250ZW50IHRoZSB1c2VyIHByb3ZpZGVzLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIENyZWF0ZSBhIERhdGFicmlja3MgQUkgU2VhcmNoIChWZWN0b3IgU2VhcmNoKSBpbmRleC4gRm9yIHRoZSBjb21tb24gY2FzZSBwYXNzXG4gIGEgRGVsdGEgc291cmNlIHRhYmxlIChjYXRhbG9nLnNjaGVtYS50YWJsZSk6IERhdGFicmlja3MgY29tcHV0ZXMgZW1iZWRkaW5nc1xuICBmcm9tIGl0cyB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVG8gY3JlYXRlIGEgZGlyZWN0LWFjY2Vzc1xuICBpbmRleCB5b3Ugd3JpdGUgdmVjdG9ycyB0byB5b3Vyc2VsZiwgcGFzcyBhbiBlbWJlZGRpbmcgZGltZW5zaW9uIGluc3RlYWQgb2YgYVxuICBzb3VyY2UgdGFibGUuIFRoZSBlbmRwb2ludCwgZW1iZWRkaW5nIG1vZGVsLCBwcmltYXJ5IGtleSwgYW5kIHRleHQgY29sdW1uIGFyZVxuICBpbmZlcnJlZCB3aGVuIG9taXR0ZWQuIE9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIGFwcCBlbmFibGVzIHRoZSB3cml0ZSBzdXJmYWNlLlxuICBDcmVhdGluZyBhbiBpbmRleCBwcm92aXNpb25zIGluZnJhc3RydWN0dXJlIC0gZG8gdGhpcyBvbmx5IHdoZW4gdGhlIHVzZXJcbiAgZXhwbGljaXRseSBhc2tzIHRvIHNldCB1cCBhIG5ldyBpbmRleC5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wuICovXG5leHBvcnQgY29uc3QgU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gc3RyaW5nVXRpbHMudG9EZXNjcmlwdGlvbihgXG4gIFJlZnJlc2ggYSBEZWx0YSBTeW5jIEFJIFNlYXJjaCBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUgc28gbmV3bHkgYWRkZWQgb3JcbiAgY2hhbmdlZCByb3dzIGJlY29tZSBzZWFyY2hhYmxlLiBPcHRpb25hbGx5IG5hbWUgdGhlIGluZGV4IChkZWZhdWx0cyB0byB0aGVcbiAgYXBwJ3MgZGVmYXVsdCBpbmRleCkuIE9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIGFwcCBlbmFibGVzIHRoZSB3cml0ZSBzdXJmYWNlLlxuYCk7XG5cbi8qKiBTY2hlbWEgZm9yIHRoZSBgc2VhcmNoYCB0b29sIGlucHV0ICh0aGUgc2hhcmVkIHJlcXVlc3Qgc2NoZW1hKS4gKi9cbmV4cG9ydCBjb25zdCBzZWFyY2hUb29sU2NoZW1hID0gc2VhcmNoU2NoZW1hcy5zZWFyY2hSZXF1ZXN0U2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wgaW5wdXQuICovXG5leHBvcnQgY29uc3QgdW5pdmVyc2FsU2VhcmNoVG9vbFNjaGVtYSA9IHNlYXJjaFNjaGVtYXMudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBzZWFyY2hgIC8gYHVuaXZlcnNhbF9zZWFyY2hgIHRvb2wgb3V0cHV0LiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaFJlc3VsdFNjaGVtYSA9IHNlYXJjaFNjaGVtYXMuc2VhcmNoUmVzdWx0U2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYGNyZWF0ZV9pbmRleGAgdG9vbCBpbnB1dC4gKi9cbmV4cG9ydCBjb25zdCBjcmVhdGVJbmRleFRvb2xTY2hlbWEgPSBzZWFyY2hTY2hlbWFzLmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYTtcblxuLyoqIFNjaGVtYSBmb3IgdGhlIGBjcmVhdGVfaW5kZXhgIHRvb2wgb3V0cHV0IChhIHJlc29sdmVkIGluZGV4IGRlZmluaXRpb24pLiAqL1xuZXhwb3J0IGNvbnN0IGluZGV4SW5mb1NjaGVtYSA9IHNlYXJjaFNjaGVtYXMuaW5kZXhJbmZvU2NoZW1hO1xuXG4vKiogU2NoZW1hIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wgaW5wdXQuICovXG5leHBvcnQgY29uc3Qgc3luY0luZGV4VG9vbFNjaGVtYSA9IHNlYXJjaFNjaGVtYXMuc3luY0luZGV4UmVxdWVzdFNjaGVtYTtcbiJdfQ==
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjaGVtYS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7OztHQU9HO0FBRUgsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRXZELHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxhQUFhLENBQUM7Ozs7Ozs7O0NBUXBELENBQUMsQ0FBQztBQUVILG1FQUFtRTtBQUNuRSxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxhQUFhLENBQUM7Ozs7O0NBSzlELENBQUMsQ0FBQztBQUVILGdFQUFnRTtBQUNoRSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRyxhQUFhLENBQUM7Ozs7O0NBSzNELENBQUMsQ0FBQztBQUVILCtEQUErRDtBQUMvRCxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBRyxhQUFhLENBQUM7Ozs7Ozs7OztDQVMxRCxDQUFDLENBQUM7QUFFSCw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsYUFBYSxDQUFDOzs7O0NBSXhELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogVG9vbC1mYWNpbmcgZGVzY3JpcHRpb25zIGFuZCB0aGUgcmVxdWVzdCBzY2hlbWFzIHRoZSBNYXN0cmEgdG9vbHMgKyBBcHBLaXRcbiAqIHRvb2wgcHJvdmlkZXIgdmFsaWRhdGUgYWdhaW5zdC4gVGhlIHdpcmUgc2hhcGVzIHRoZW1zZWx2ZXMgbGl2ZSBpblxuICogYEBkYngtdG9vbHMvc2hhcmVkLXNlYXJjaGA7IHRoaXMgbW9kdWxlIGFkZHMgdGhlIG1vZGVsLXJlYWRhYmxlXG4gKiBkZXNjcmlwdGlvbnMgc28gYm90aCBob3N0cyBkZXNjcmliZSB0aGUgdG9vbHMgaWRlbnRpY2FsbHkuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7IHRvRGVzY3JpcHRpb24gfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHNlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBTRUFSQ0hfVE9PTF9ERVNDUklQVElPTiA9IHRvRGVzY3JpcHRpb24oYFxuICBTZWFyY2ggYSBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggZm9yIHRoZSBkb2N1bWVudHMgbW9zdFxuICByZWxldmFudCB0byBhIHF1ZXJ5LiBQYXNzIGEgbmF0dXJhbC1sYW5ndWFnZSBxdWVzdGlvbiBvciBrZXl3b3JkczsgaHlicmlkXG4gIG1hdGNoaW5nIGNvbWJpbmVzIHNlbWFudGljIHNpbWlsYXJpdHkgd2l0aCBrZXl3b3JkIHJhbmtpbmcsIHNvIGV4YWN0IHRlcm1zXG4gIChwcm9kdWN0IG5hbWVzLCBlcnJvciBjb2RlcykgYW5kIHBhcmFwaHJhc2VzIGJvdGggd29yay4gT3B0aW9uYWxseSBuYW1lIGFuXG4gIGluZGV4IChkZWZhdWx0cyB0byB0aGUgYXBwJ3MgY29uZmlndXJlZCBpbmRleCksIGEgcmVzdWx0IGxpbWl0LCBhbmQgYXR0cmlidXRlXG4gIGZpbHRlcnMuIFVzZSBpdCB0byBsb29rIHVwIGRvY3MsIGtub3dsZWRnZS1iYXNlIGFydGljbGVzLCBwcm9kdWN0cywgb3IgYW55XG4gIGluZGV4ZWQgY29udGVudCBiZWZvcmUgYW5zd2VyaW5nLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgdW5pdmVyc2FsX3NlYXJjaGAgdG9vbC4gKi9cbmV4cG9ydCBjb25zdCBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04gPSB0b0Rlc2NyaXB0aW9uKGBcbiAgU2VhcmNoIGFjcm9zcyBldmVyeSBjb25maWd1cmVkIEFJIFNlYXJjaCBpbmRleCBhdCBvbmNlIGFuZCByZXR1cm4gdGhlIGJlc3RcbiAgbWF0Y2hlcyBmcm9tIGFsbCBvZiB0aGVtLCBtZXJnZWQgYW5kIHJhbmtlZC4gVXNlIGl0IHdoZW4gdGhlIHJpZ2h0IGluZGV4XG4gIGlzbid0IGtub3duIGluIGFkdmFuY2Ugb3Igd2hlbiBhbiBhbnN3ZXIgbWF5IGxpdmUgaW4gYW55IG9mIHNldmVyYWxcbiAgY29sbGVjdGlvbnMgKGRvY3MsIHRpY2tldHMsIHByb2R1Y3RzKS5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYGFkZF9kb2N1bWVudHNgIHRvb2wuICovXG5leHBvcnQgY29uc3QgQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OID0gdG9EZXNjcmlwdGlvbihgXG4gIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBBSSBTZWFyY2ggaW5kZXguIFBhc3MgYW4gYXJyYXkgb2ZcbiAgZG9jdW1lbnRzIGFzIEpTT04gb2JqZWN0czsgZWFjaCBNVVNUIGluY2x1ZGUgdGhlIGluZGV4J3MgcHJpbWFyeS1rZXkgY29sdW1uLlxuICBPbmx5IGF2YWlsYWJsZSB3aGVuIHRoZSBhcHAgZW5hYmxlcyB0aGUgd3JpdGUgc3VyZmFjZS4gVXNlIGl0IHRvIGluZGV4IG5ld1xuICBjb250ZW50IHRoZSB1c2VyIHByb3ZpZGVzLlxuYCk7XG5cbi8qKiBEZXNjcmlwdGlvbiB0aGUgbW9kZWwgcmVhZHMgZm9yIHRoZSBgY3JlYXRlX2luZGV4YCB0b29sLiAqL1xuZXhwb3J0IGNvbnN0IENSRUFURV9JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gdG9EZXNjcmlwdGlvbihgXG4gIENyZWF0ZSBhIERhdGFicmlja3MgQUkgU2VhcmNoIChWZWN0b3IgU2VhcmNoKSBpbmRleC4gRm9yIHRoZSBjb21tb24gY2FzZSBwYXNzXG4gIGEgRGVsdGEgc291cmNlIHRhYmxlIChjYXRhbG9nLnNjaGVtYS50YWJsZSk6IERhdGFicmlja3MgY29tcHV0ZXMgZW1iZWRkaW5nc1xuICBmcm9tIGl0cyB0ZXh0IGNvbHVtbiBhbmQga2VlcHMgdGhlIGluZGV4IHN5bmNlZC4gVG8gY3JlYXRlIGEgZGlyZWN0LWFjY2Vzc1xuICBpbmRleCB5b3Ugd3JpdGUgdmVjdG9ycyB0byB5b3Vyc2VsZiwgcGFzcyBhbiBlbWJlZGRpbmcgZGltZW5zaW9uIGluc3RlYWQgb2YgYVxuICBzb3VyY2UgdGFibGUuIFRoZSBlbmRwb2ludCwgZW1iZWRkaW5nIG1vZGVsLCBwcmltYXJ5IGtleSwgYW5kIHRleHQgY29sdW1uIGFyZVxuICBpbmZlcnJlZCB3aGVuIG9taXR0ZWQuIE9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIGFwcCBlbmFibGVzIHRoZSB3cml0ZSBzdXJmYWNlLlxuICBDcmVhdGluZyBhbiBpbmRleCBwcm92aXNpb25zIGluZnJhc3RydWN0dXJlIC0gZG8gdGhpcyBvbmx5IHdoZW4gdGhlIHVzZXJcbiAgZXhwbGljaXRseSBhc2tzIHRvIHNldCB1cCBhIG5ldyBpbmRleC5cbmApO1xuXG4vKiogRGVzY3JpcHRpb24gdGhlIG1vZGVsIHJlYWRzIGZvciB0aGUgYHN5bmNfaW5kZXhgIHRvb2wuICovXG5leHBvcnQgY29uc3QgU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OID0gdG9EZXNjcmlwdGlvbihgXG4gIFJlZnJlc2ggYSBEZWx0YSBTeW5jIEFJIFNlYXJjaCBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUgc28gbmV3bHkgYWRkZWQgb3JcbiAgY2hhbmdlZCByb3dzIGJlY29tZSBzZWFyY2hhYmxlLiBPcHRpb25hbGx5IG5hbWUgdGhlIGluZGV4IChkZWZhdWx0cyB0byB0aGVcbiAgYXBwJ3MgZGVmYXVsdCBpbmRleCkuIE9ubHkgYXZhaWxhYmxlIHdoZW4gdGhlIGFwcCBlbmFibGVzIHRoZSB3cml0ZSBzdXJmYWNlLlxuYCk7XG4iXX0=
|