@dbx-tools/search 0.6.108 → 0.6.112
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 +96 -110
- package/index.ts +6 -2
- package/lib/index.d.ts +6 -2
- package/lib/index.js +4 -1
- package/lib/src/client.d.ts +23 -43
- package/lib/src/client.js +51 -114
- package/lib/src/lakebase-plugin.d.ts +73 -0
- package/lib/src/lakebase-plugin.js +191 -0
- package/lib/src/lakebase.d.ts +6 -4
- package/lib/src/lakebase.js +45 -13
- package/lib/src/native.d.ts +18 -0
- package/lib/src/native.js +79 -0
- package/lib/src/plugin.d.ts +31 -59
- package/lib/src/plugin.js +63 -130
- package/lib/src/query.d.ts +1 -57
- package/lib/src/query.js +2 -93
- package/lib/src/runtime.d.ts +4 -11
- package/lib/src/runtime.js +3 -7
- package/lib/src/schema.d.ts +1 -1
- package/lib/src/tool.d.ts +1 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +9 -9
- package/src/client.ts +69 -137
- package/src/lakebase-plugin.ts +258 -0
- package/src/lakebase.ts +56 -15
- package/src/native.ts +117 -0
- package/src/plugin.ts +63 -148
- package/src/query.ts +1 -109
- package/src/runtime.ts +6 -16
package/lib/src/plugin.js
CHANGED
|
@@ -1,40 +1,37 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AppKit plugin (registered name: `search`)
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* AppKit extension plugin (registered name: `search`) around a sibling
|
|
3
|
+
* `aiSearch` provider. Native AppKit owns Vector Search query execution; this
|
|
4
|
+
* plugin adds the surfaces that remain useful across native and Lakebase
|
|
5
|
+
* providers:
|
|
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
|
-
* -
|
|
9
|
+
* - compatibility and extension routes under `/api/search`
|
|
10
10
|
* (`POST /` search, `POST /universal` federated, `GET /indexes` catalogue,
|
|
11
11
|
* and `POST /documents` when writes are enabled);
|
|
12
12
|
* - a `clientConfig()` payload so a UI knows the indexes, default, and page
|
|
13
13
|
* size at boot with no round-trip;
|
|
14
14
|
* - `exports()` so app code can `appkit.search.search(...)` directly.
|
|
15
15
|
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* first search.
|
|
16
|
+
* Vector Search reads delegate to the registered native AppKit `aiSearch`
|
|
17
|
+
* plugin, preserving its OBO, caching, reranking, and response handling. The
|
|
18
|
+
* alternative `lakebaseAiSearch` provider supplies the same query contract
|
|
19
|
+
* over PostgreSQL full-text search.
|
|
21
20
|
*
|
|
22
21
|
* @module
|
|
23
22
|
*/
|
|
24
|
-
import {
|
|
25
|
-
import { defineTool, executeFromRegistry, toolsFromRegistry, } from "@databricks/appkit/beta";
|
|
23
|
+
import { Plugin, toPlugin } from "@databricks/appkit";
|
|
24
|
+
import { aiSearch, defineTool, executeFromRegistry, toolsFromRegistry, } from "@databricks/appkit/beta";
|
|
26
25
|
import { plugin as appkitPlugin } from "@dbx-tools/appkit";
|
|
27
26
|
import { error as sharedError, log, string } from "@dbx-tools/shared-core";
|
|
28
27
|
import { search as sharedSearch } from "@dbx-tools/shared-search";
|
|
29
|
-
import { SEARCH_CONFIG_SCHEMA,
|
|
28
|
+
import { SEARCH_CONFIG_SCHEMA, resolveSearchConfig } from "./config.js";
|
|
30
29
|
import { toCreateIndexOptions } from "./index-tools.js";
|
|
31
|
-
import {
|
|
30
|
+
import { nativeAiSearchBackend } from "./native.js";
|
|
32
31
|
import { toDocumentArray } from "./query.js";
|
|
33
32
|
import { getSearchRuntime, resetSearchRuntime } 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 (under `/api/search`) for a single-index search. */
|
|
37
|
-
const SEARCH_ROUTE = "/";
|
|
38
35
|
/** Mount-relative route for a universal (federated) search across indexes. */
|
|
39
36
|
const UNIVERSAL_ROUTE = "/universal";
|
|
40
37
|
/** Mount-relative route serving the index catalogue a search box reads. */
|
|
@@ -46,50 +43,31 @@ const INDEX_ROUTE = "/index";
|
|
|
46
43
|
/** Mount-relative route for syncing a Delta Sync index from its source table. */
|
|
47
44
|
const INDEX_SYNC_ROUTE = "/index/sync";
|
|
48
45
|
/**
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*/
|
|
53
|
-
const INDEX_RESOURCE = {
|
|
54
|
-
type: ResourceType.VECTOR_SEARCH_INDEX,
|
|
55
|
-
alias: "AI Search Index",
|
|
56
|
-
resourceKey: "search-index",
|
|
57
|
-
description: "Databricks AI Search (Vector Search) index the app searches by default " +
|
|
58
|
-
"(catalog.schema.index). Optional: a request may name any index the caller can read.",
|
|
59
|
-
permission: "SELECT",
|
|
60
|
-
fields: {
|
|
61
|
-
name: {
|
|
62
|
-
env: INDEX_ENV,
|
|
63
|
-
description: `Default AI Search index. ${DATABRICKS_INDEX_ENV} is also honored.`,
|
|
64
|
-
discovery: {
|
|
65
|
-
type: "cli",
|
|
66
|
-
cliCommand: "databricks vector-search-indexes list-indexes --endpoint-name <ENDPOINT> --output json",
|
|
67
|
-
selectField: ".name",
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
},
|
|
71
|
-
};
|
|
72
|
-
/**
|
|
73
|
-
* AppKit plugin exposing AI Search as a search box, an agent tool set, and a
|
|
74
|
-
* direct API.
|
|
46
|
+
* AppKit extension plugin for agent tools, federated search, and optional
|
|
47
|
+
* Vector Search lifecycle operations. Register `aiSearch()` or
|
|
48
|
+
* `lakebaseAiSearch()` before this plugin.
|
|
75
49
|
*
|
|
76
50
|
* @example
|
|
77
51
|
* ```ts
|
|
78
52
|
* import { createApp, server } from "@databricks/appkit";
|
|
53
|
+
* import { aiSearch } from "@databricks/appkit/beta";
|
|
79
54
|
* import { plugin as searchPlugin } from "@dbx-tools/search";
|
|
80
55
|
*
|
|
81
56
|
* await createApp({
|
|
82
57
|
* plugins: [
|
|
83
58
|
* server(),
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
90
|
-
*
|
|
91
|
-
*
|
|
92
|
-
*
|
|
59
|
+
* aiSearch({
|
|
60
|
+
* indexes: {
|
|
61
|
+
* docs: {
|
|
62
|
+
* indexName: "main.support.docs",
|
|
63
|
+
* columns: ["id", "title", "body"],
|
|
64
|
+
* },
|
|
65
|
+
* },
|
|
66
|
+
* }),
|
|
67
|
+
* searchPlugin.search({
|
|
68
|
+
* index: "main.support.docs",
|
|
69
|
+
* indexes: [{ name: "main.support.docs", alias: "docs" }],
|
|
70
|
+
* }),
|
|
93
71
|
* ],
|
|
94
72
|
* });
|
|
95
73
|
* ```
|
|
@@ -103,7 +81,7 @@ export class SearchPlugin extends Plugin {
|
|
|
103
81
|
stability: "beta",
|
|
104
82
|
resources: {
|
|
105
83
|
required: [],
|
|
106
|
-
optional: [
|
|
84
|
+
optional: [],
|
|
107
85
|
},
|
|
108
86
|
config: { schema: SEARCH_CONFIG_SCHEMA },
|
|
109
87
|
};
|
|
@@ -111,16 +89,6 @@ export class SearchPlugin extends Plugin {
|
|
|
111
89
|
get basePath() {
|
|
112
90
|
return `/api/${SearchPlugin.manifest.name}`;
|
|
113
91
|
}
|
|
114
|
-
/**
|
|
115
|
-
* Promote the index to a required resource once a deployment pins a default,
|
|
116
|
-
* through plugin config or either environment name.
|
|
117
|
-
*/
|
|
118
|
-
static getResourceRequirements(config) {
|
|
119
|
-
const pinned = string.trimToNull(config.index) ??
|
|
120
|
-
string.trimToNull(process.env[INDEX_ENV]) ??
|
|
121
|
-
string.trimToNull(process.env[DATABRICKS_INDEX_ENV]);
|
|
122
|
-
return pinned === null ? [] : [{ ...INDEX_RESOURCE, required: true }];
|
|
123
|
-
}
|
|
124
92
|
/**
|
|
125
93
|
* The tools this plugin offers to an AppKit agent. `search` /
|
|
126
94
|
* `universal_search` are reads; `add_documents` / `create_index` /
|
|
@@ -129,7 +97,7 @@ export class SearchPlugin extends Plugin {
|
|
|
129
97
|
* granted explicitly.
|
|
130
98
|
*/
|
|
131
99
|
get tools() {
|
|
132
|
-
const { config } = getSearchRuntime({ config: this.config });
|
|
100
|
+
const { config, readBackend } = getSearchRuntime({ config: this.config });
|
|
133
101
|
const registry = {
|
|
134
102
|
search: defineTool({
|
|
135
103
|
description: SEARCH_TOOL_DESCRIPTION,
|
|
@@ -156,39 +124,37 @@ export class SearchPlugin extends Plugin {
|
|
|
156
124
|
autoInheritable: false,
|
|
157
125
|
execute: async (args, signal) => this.runAddDocuments(args, signal),
|
|
158
126
|
});
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
127
|
+
if (readBackend?.supportsLifecycle) {
|
|
128
|
+
registry.create_index = defineTool({
|
|
129
|
+
description: CREATE_INDEX_TOOL_DESCRIPTION,
|
|
130
|
+
schema: sharedSearch.createIndexRequestSchema,
|
|
131
|
+
annotations: { effect: "write", requiresUserContext: true },
|
|
132
|
+
autoInheritable: false,
|
|
133
|
+
execute: async (args, signal) => this.runCreateIndex(args, signal),
|
|
134
|
+
});
|
|
135
|
+
registry.sync_index = defineTool({
|
|
136
|
+
description: SYNC_INDEX_TOOL_DESCRIPTION,
|
|
137
|
+
schema: sharedSearch.syncIndexRequestSchema,
|
|
138
|
+
annotations: { effect: "write", requiresUserContext: true },
|
|
139
|
+
autoInheritable: false,
|
|
140
|
+
execute: async (args, signal) => this.runSyncIndex(args, signal),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
173
143
|
}
|
|
174
144
|
return registry;
|
|
175
145
|
}
|
|
176
146
|
/** Prime the shared runtime from config and log the effective policy at boot. */
|
|
177
147
|
async setup() {
|
|
178
|
-
|
|
179
|
-
// endpoint is configured but the AppKit `lakebase` plugin is registered,
|
|
180
|
-
// fall back to a Postgres full-text index. Both answer with the identical
|
|
181
|
-
// shape, so this choice is invisible to tools, routes, and the UI.
|
|
182
|
-
const lakebaseBackend = this.resolveLakebaseBackend();
|
|
148
|
+
const readBackend = this.resolveProviderBackend();
|
|
183
149
|
// The runtime may already have been built (config-only) when `tools()` ran
|
|
184
150
|
// during registration; rebuild it so it carries the chosen backend.
|
|
185
151
|
resetSearchRuntime();
|
|
186
152
|
const { config } = getSearchRuntime({
|
|
187
153
|
config: this.config,
|
|
188
|
-
|
|
154
|
+
readBackend,
|
|
189
155
|
});
|
|
190
156
|
logger.info("ready", {
|
|
191
|
-
backend:
|
|
157
|
+
backend: readBackend.supportsLifecycle ? "appkit-ai-search" : "lakebase-ai-search",
|
|
192
158
|
defaultIndex: config.defaultIndex ?? "(none - pass per request)",
|
|
193
159
|
indexes: config.indexes.map((i) => i.alias),
|
|
194
160
|
pageSize: config.pageSize,
|
|
@@ -201,34 +167,14 @@ export class SearchPlugin extends Plugin {
|
|
|
201
167
|
});
|
|
202
168
|
// Provision a real index in the BACKGROUND so a slow first-time endpoint or
|
|
203
169
|
// index build never blocks the server from coming up.
|
|
204
|
-
if (config.ensureOnSetup)
|
|
170
|
+
if (config.ensureOnSetup && readBackend.supportsLifecycle) {
|
|
205
171
|
void this.runEnsureOnSetup(config);
|
|
172
|
+
}
|
|
206
173
|
}
|
|
207
|
-
/**
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
* `DATABRICKS_VECTOR_SEARCH_ENDPOINT`) AND the sibling AppKit `lakebase`
|
|
212
|
-
* plugin is registered. The pg pool is built from that plugin's
|
|
213
|
-
* service-principal config exactly like `@dbx-tools/appkit-mastra`'s memory
|
|
214
|
-
* pool - no auth is re-implemented here.
|
|
215
|
-
*/
|
|
216
|
-
resolveLakebaseBackend() {
|
|
217
|
-
const config = resolveSearchConfig(this.config);
|
|
218
|
-
const hasEndpoint = config.endpoint !== undefined ||
|
|
219
|
-
string.trimToNull(process.env[ENDPOINT_ENV]) !== null ||
|
|
220
|
-
string.trimToNull(process.env.DATABRICKS_VECTOR_SEARCH_ENDPOINT) !== null;
|
|
221
|
-
if (hasEndpoint)
|
|
222
|
-
return undefined;
|
|
223
|
-
const lake = appkitPlugin.instance(this.context, lakebase);
|
|
224
|
-
if (!lake)
|
|
225
|
-
return undefined;
|
|
226
|
-
logger.info("backend-lakebase", {
|
|
227
|
-
reason: "no Vector Search endpoint configured; using the Lakebase full-text fallback",
|
|
228
|
-
});
|
|
229
|
-
// `getPgConfig()` must be read OUTSIDE any asUser scope (as it is here at
|
|
230
|
-
// setup) so it carries the SP connection target + token-refresh callback.
|
|
231
|
-
return new LakebaseSearchBackend(() => lake.exports().getPgConfig());
|
|
174
|
+
/** Resolve the registered AppKit-compatible AI Search provider. */
|
|
175
|
+
resolveProviderBackend() {
|
|
176
|
+
const provider = appkitPlugin.require(this.context, aiSearch, this).exports();
|
|
177
|
+
return nativeAiSearchBackend(provider, resolveSearchConfig(this.config));
|
|
232
178
|
}
|
|
233
179
|
/**
|
|
234
180
|
* Ensure the endpoint + index exist and seed them, honoring `ensureOnSetup`.
|
|
@@ -302,23 +248,10 @@ export class SearchPlugin extends Plugin {
|
|
|
302
248
|
void this.shutdown();
|
|
303
249
|
}
|
|
304
250
|
/**
|
|
305
|
-
* Mount
|
|
306
|
-
*
|
|
307
|
-
* Unity Catalog ACLs apply. `GET /indexes` needs no user scope - it just
|
|
308
|
-
* echoes the configured catalogue.
|
|
251
|
+
* Mount extension routes under `/api/search`. Single-index queries stay on
|
|
252
|
+
* the provider's native `/api/ai-search/:alias/query` surface.
|
|
309
253
|
*/
|
|
310
254
|
injectRoutes(router) {
|
|
311
|
-
this.route(router, {
|
|
312
|
-
name: "search",
|
|
313
|
-
method: "post",
|
|
314
|
-
path: SEARCH_ROUTE,
|
|
315
|
-
handler: async (req, res) => {
|
|
316
|
-
await this.respond(res, "search", () => {
|
|
317
|
-
const request = sharedSearch.searchRequestSchema.parse(req.body ?? {});
|
|
318
|
-
return this.asUser(req).runSearch(request);
|
|
319
|
-
});
|
|
320
|
-
},
|
|
321
|
-
});
|
|
322
255
|
this.route(router, {
|
|
323
256
|
name: "universalSearch",
|
|
324
257
|
method: "post",
|
|
@@ -356,8 +289,8 @@ export class SearchPlugin extends Plugin {
|
|
|
356
289
|
method: "post",
|
|
357
290
|
path: INDEX_ROUTE,
|
|
358
291
|
handler: async (req, res) => {
|
|
359
|
-
const { config } = getSearchRuntime();
|
|
360
|
-
if (!config.allowWrite) {
|
|
292
|
+
const { config, readBackend } = getSearchRuntime();
|
|
293
|
+
if (!config.allowWrite || !readBackend?.supportsLifecycle) {
|
|
361
294
|
res.status(403).json({ error: "the index write surface is disabled" });
|
|
362
295
|
return;
|
|
363
296
|
}
|
|
@@ -369,8 +302,8 @@ export class SearchPlugin extends Plugin {
|
|
|
369
302
|
method: "post",
|
|
370
303
|
path: INDEX_SYNC_ROUTE,
|
|
371
304
|
handler: async (req, res) => {
|
|
372
|
-
const { config } = getSearchRuntime();
|
|
373
|
-
if (!config.allowWrite) {
|
|
305
|
+
const { config, readBackend } = getSearchRuntime();
|
|
306
|
+
if (!config.allowWrite || !readBackend?.supportsLifecycle) {
|
|
374
307
|
res.status(403).json({ error: "the index write surface is disabled" });
|
|
375
308
|
return;
|
|
376
309
|
}
|
|
@@ -503,4 +436,4 @@ export class SearchPlugin extends Plugin {
|
|
|
503
436
|
* ```
|
|
504
437
|
*/
|
|
505
438
|
export const search = toPlugin(SearchPlugin);
|
|
506
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUVILE9BQU8sRUFDTCxRQUFRLEVBQ1IsTUFBTSxFQUNOLFlBQVksRUFDWixRQUFRLEdBSVQsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQ0wsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixpQkFBaUIsR0FJbEIsTUFBTSx5QkFBeUIsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxLQUFLLElBQUksV0FBVyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRSxPQUFPLEVBQUUsTUFBTSxJQUFJLFlBQVksRUFBMkIsTUFBTSwwQkFBMEIsQ0FBQztBQUMzRixPQUFPLEVBQ0wsb0JBQW9CLEVBQ3BCLG9CQUFvQixFQUNwQixZQUFZLEVBQ1osU0FBUyxFQUNULG1CQUFtQixHQUVwQixNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDcEUsT0FBTyxFQUNMLDhCQUE4QixFQUM5Qiw2QkFBNkIsRUFDN0IsdUJBQXVCLEVBQ3ZCLDJCQUEyQixFQUMzQixpQ0FBaUMsR0FDbEMsTUFBTSxhQUFhLENBQUM7QUFFckIsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUVwQyw0RUFBNEU7QUFD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QztRQUNqQixJQUFJLENBQUM7WUFDSCxNQUFNLENBQUMsSUFBSSxDQUFDLGNBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7WUFDdkMsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7WUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRTtnQkFDekMsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUNyRCxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzNELEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUN0RSxHQUFHLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3ZFLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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QztJQUVPLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFBYSxFQUFFLE1BQW9CO1FBQzVELE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLElBQUksTUFBTSxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDekQsTUFBTSxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUN0QyxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUNqQyxDQUFDOztBQUdIOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQXBwS2l0IHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgc2VhcmNoYCkgdGhhdCB0dXJucyBhIERhdGFicmlja3MgQUlcbiAqIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggaW50byBhIGJhdHRlcmllcy1pbmNsdWRlZCBzZWFyY2ggc3VyZmFjZS4gSXQgaXNcbiAqIHRoZSBcInNob3J0Y3V0XCIgaGFsZiBvZiB0aGlzIHBhY2thZ2U6IHJlZ2lzdGVyIGl0IHdpdGggbm90aGluZyBidXQgYW4gaW5kZXhcbiAqIG5hbWUgYW5kIHlvdSBnZXQsIGFsbCBhdCBvbmNlIC1cbiAqXG4gKiAgIC0gYSBgc2VhcmNoYCAvIGB1bml2ZXJzYWxfc2VhcmNoYCAvIChvcHQtaW4pIGBhZGRfZG9jdW1lbnRzYCB0b29sIHNldCBmb3JcbiAqICAgICBib3RoIE1hc3RyYSBhbmQgQXBwS2l0IGFnZW50cyAoYXV0b2NvbXBsZXRlIGlzIGEgc21hbGwtYGxpbWl0YCBzZWFyY2gpO1xuICogICAtIEhUVFAgcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAgYSBicm93c2VyIHNlYXJjaCBib3ggY2FsbHMgZGlyZWN0bHlcbiAqICAgICAoYFBPU1QgL2Agc2VhcmNoLCBgUE9TVCAvdW5pdmVyc2FsYCBmZWRlcmF0ZWQsIGBHRVQgL2luZGV4ZXNgIGNhdGFsb2d1ZSxcbiAqICAgICBhbmQgYFBPU1QgL2RvY3VtZW50c2Agd2hlbiB3cml0ZXMgYXJlIGVuYWJsZWQpO1xuICogICAtIGEgYGNsaWVudENvbmZpZygpYCBwYXlsb2FkIHNvIGEgVUkga25vd3MgdGhlIGluZGV4ZXMsIGRlZmF1bHQsIGFuZCBwYWdlXG4gKiAgICAgc2l6ZSBhdCBib290IHdpdGggbm8gcm91bmQtdHJpcDtcbiAqICAgLSBgZXhwb3J0cygpYCBzbyBhcHAgY29kZSBjYW4gYGFwcGtpdC5zZWFyY2guc2VhcmNoKC4uLilgIGRpcmVjdGx5LlxuICpcbiAqIEV2ZXJ5dGhpbmcgcnVucyB1bmRlciB0aGUgY2FsbGVyJ3MgT0JPIGlkZW50aXR5IChyb3V0ZXMgd3JhcCBpbiBgYXNVc2VyYCksXG4gKiBzbyBVbml0eSBDYXRhbG9nIEFDTHMgb24gdGhlIGluZGV4IGFwcGx5LiBSZWdpc3RlcmluZyB0aGUgcGx1Z2luIHJlc29sdmVzXG4gKiBhbmQgbG9ncyB0aGUgZWZmZWN0aXZlIGNvbmZpZyAoZGVmYXVsdCBpbmRleCwga25vd24gaW5kZXhlcywgcGFnZSBzaXplLFxuICogbW9kZSkgc28gYSBtaXNjb25maWd1cmF0aW9uIHNob3dzIHVwIGluIHRoZSBib290IGxvZyByYXRoZXIgdGhhbiBvbiB0aGVcbiAqIGZpcnN0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHtcbiAgbGFrZWJhc2UsXG4gIFBsdWdpbixcbiAgUmVzb3VyY2VUeXBlLFxuICB0b1BsdWdpbixcbiAgdHlwZSBJQXBwUm91dGVyLFxuICB0eXBlIFBsdWdpbk1hbmlmZXN0LFxuICB0eXBlIFJlc291cmNlUmVxdWlyZW1lbnQsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7XG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgYXBwa2l0UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciBhcyBzaGFyZWRFcnJvciwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc2VhcmNoIGFzIHNoYXJlZFNlYXJjaCwgdHlwZSBTZWFyY2hDbGllbnRDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQge1xuICBTRUFSQ0hfQ09ORklHX1NDSEVNQSxcbiAgREFUQUJSSUNLU19JTkRFWF9FTlYsXG4gIEVORFBPSU5UX0VOVixcbiAgSU5ERVhfRU5WLFxuICByZXNvbHZlU2VhcmNoQ29uZmlnLFxuICB0eXBlIFNlYXJjaFBsdWdpbkNvbmZpZyxcbn0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyB0b0NyZWF0ZUluZGV4T3B0aW9ucyB9IGZyb20gXCIuL2luZGV4LXRvb2xzLnRzXCI7XG5pbXBvcnQgeyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfSBmcm9tIFwiLi9sYWtlYmFzZS50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGdldFNlYXJjaFJ1bnRpbWUsIHJlc2V0U2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7XG4gIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2hcIik7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSAodW5kZXIgYC9hcGkvc2VhcmNoYCkgZm9yIGEgc2luZ2xlLWluZGV4IHNlYXJjaC4gKi9cbmNvbnN0IFNFQVJDSF9ST1VURSA9IFwiL1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGEgdW5pdmVyc2FsIChmZWRlcmF0ZWQpIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcy4gKi9cbmNvbnN0IFVOSVZFUlNBTF9ST1VURSA9IFwiL3VuaXZlcnNhbFwiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgc2VydmluZyB0aGUgaW5kZXggY2F0YWxvZ3VlIGEgc2VhcmNoIGJveCByZWFkcy4gKi9cbmNvbnN0IElOREVYRVNfUk9VVEUgPSBcIi9pbmRleGVzXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYWRkaW5nIGRvY3VtZW50cyB0byBhIGRpcmVjdC1hY2Nlc3MgaW5kZXguICovXG5jb25zdCBET0NVTUVOVFNfUk9VVEUgPSBcIi9kb2N1bWVudHNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBjcmVhdGluZyBhIFZlY3RvciBTZWFyY2ggaW5kZXguICovXG5jb25zdCBJTkRFWF9ST1VURSA9IFwiL2luZGV4XCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3Igc3luY2luZyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlLiAqL1xuY29uc3QgSU5ERVhfU1lOQ19ST1VURSA9IFwiL2luZGV4L3N5bmNcIjtcblxuLyoqXG4gKiBUaGUgQUkgU2VhcmNoIGluZGV4IHJlc291cmNlLiBEZWNsYXJlZCBvcHRpb25hbCBiZWNhdXNlIHRoZSBwbHVnaW4gaXMgaGFwcHlcbiAqIHdpdGggbm8gZGVmYXVsdCBpbmRleCAoYSBjYWxsZXIgY2FuIG5hbWUgb25lIHBlciByZXF1ZXN0KTsgaXQgaXMgcHJvbW90ZWQgdG9cbiAqIHJlcXVpcmVkIG9uY2UgYSBkZXBsb3ltZW50IHBpbnMgb25lLiBgU0VMRUNUYCBpcyB0aGUgcGVybWlzc2lvbiBhIHF1ZXJ5IG5lZWRzLlxuICovXG5jb25zdCBJTkRFWF9SRVNPVVJDRSA9IHtcbiAgdHlwZTogUmVzb3VyY2VUeXBlLlZFQ1RPUl9TRUFSQ0hfSU5ERVgsXG4gIGFsaWFzOiBcIkFJIFNlYXJjaCBJbmRleFwiLFxuICByZXNvdXJjZUtleTogXCJzZWFyY2gtaW5kZXhcIixcbiAgZGVzY3JpcHRpb246XG4gICAgXCJEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXggdGhlIGFwcCBzZWFyY2hlcyBieSBkZWZhdWx0IFwiICtcbiAgICBcIihjYXRhbG9nLnNjaGVtYS5pbmRleCkuIE9wdGlvbmFsOiBhIHJlcXVlc3QgbWF5IG5hbWUgYW55IGluZGV4IHRoZSBjYWxsZXIgY2FuIHJlYWQuXCIsXG4gIHBlcm1pc3Npb246IFwiU0VMRUNUXCIsXG4gIGZpZWxkczoge1xuICAgIG5hbWU6IHtcbiAgICAgIGVudjogSU5ERVhfRU5WLFxuICAgICAgZGVzY3JpcHRpb246IGBEZWZhdWx0IEFJIFNlYXJjaCBpbmRleC4gJHtEQVRBQlJJQ0tTX0lOREVYX0VOVn0gaXMgYWxzbyBob25vcmVkLmAsXG4gICAgICBkaXNjb3Zlcnk6IHtcbiAgICAgICAgdHlwZTogXCJjbGlcIixcbiAgICAgICAgY2xpQ29tbWFuZDpcbiAgICAgICAgICBcImRhdGFicmlja3MgdmVjdG9yLXNlYXJjaC1pbmRleGVzIGxpc3QtaW5kZXhlcyAtLWVuZHBvaW50LW5hbWUgPEVORFBPSU5UPiAtLW91dHB1dCBqc29uXCIsXG4gICAgICAgIHNlbGVjdEZpZWxkOiBcIi5uYW1lXCIsXG4gICAgICB9LFxuICAgIH0sXG4gIH0sXG59IHNhdGlzZmllcyBPbWl0PFJlc291cmNlUmVxdWlyZW1lbnQsIFwicmVxdWlyZWRcIj47XG5cbi8qKlxuICogQXBwS2l0IHBsdWdpbiBleHBvc2luZyBBSSBTZWFyY2ggYXMgYSBzZWFyY2ggYm94LCBhbiBhZ2VudCB0b29sIHNldCwgYW5kIGFcbiAqIGRpcmVjdCBBUEkuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgLy8gemVyby1jb25maWc6IHJlYWRzIERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9JTkRFWFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goKSxcbiAqICAgICAvLyBvciBnbyBkZWVwZXI6XG4gKiAgICAgLy8gc2VhcmNoUGx1Z2luLnNlYXJjaCh7XG4gKiAgICAgLy8gICBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiLFxuICogICAgIC8vICAgaW5kZXhlczogW1wibWFpbi5zdXBwb3J0LmRvY3NcIiwgXCJtYWluLmNhdGFsb2cucHJvZHVjdHNcIl0sXG4gKiAgICAgLy8gICBjb2x1bW5zOiBbXCJ0aXRsZVwiLCBcInVybFwiLCBcImJvZHlcIl0sXG4gKiAgICAgLy8gICBtb2RlOiBcImh5YnJpZFwiLFxuICogICAgIC8vIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW0lOREVYX1JFU09VUkNFXSxcbiAgICB9LFxuICAgIGNvbmZpZzogeyBzY2hlbWE6IFNFQVJDSF9DT05GSUdfU0NIRU1BIH0sXG4gIH0gc2F0aXNmaWVzIFBsdWdpbk1hbmlmZXN0PFwic2VhcmNoXCI+O1xuXG4gIC8qKiBUaGUgYmFzZSBwYXRoIEFwcEtpdCBtb3VudHMgdGhpcyBwbHVnaW4ncyByb3V0ZXMgdW5kZXIuICovXG4gIHByaXZhdGUgZ2V0IGJhc2VQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAvYXBpLyR7U2VhcmNoUGx1Z2luLm1hbmlmZXN0Lm5hbWV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9tb3RlIHRoZSBpbmRleCB0byBhIHJlcXVpcmVkIHJlc291cmNlIG9uY2UgYSBkZXBsb3ltZW50IHBpbnMgYSBkZWZhdWx0LFxuICAgKiB0aHJvdWdoIHBsdWdpbiBjb25maWcgb3IgZWl0aGVyIGVudmlyb25tZW50IG5hbWUuXG4gICAqL1xuICBzdGF0aWMgZ2V0UmVzb3VyY2VSZXF1aXJlbWVudHMoY29uZmlnOiBTZWFyY2hQbHVnaW5Db25maWcpOiBSZXNvdXJjZVJlcXVpcmVtZW50W10ge1xuICAgIGNvbnN0IHBpbm5lZCA9XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChjb25maWcuaW5kZXgpID8/XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltJTkRFWF9FTlZdKSA/P1xuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnZbREFUQUJSSUNLU19JTkRFWF9FTlZdKTtcbiAgICByZXR1cm4gcGlubmVkID09PSBudWxsID8gW10gOiBbeyAuLi5JTkRFWF9SRVNPVVJDRSwgcmVxdWlyZWQ6IHRydWUgfV07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHRvb2xzKCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIGNvbnN0IHJlZ2lzdHJ5OiBUb29sUmVnaXN0cnkgPSB7XG4gICAgICBzZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5TZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgICAgdW5pdmVyc2FsX3NlYXJjaDogZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBVTklWRVJTQUxfU0VBUkNIX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJyZWFkXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5Vbml2ZXJzYWxTZWFyY2goYXJncywgc2lnbmFsKSxcbiAgICAgIH0pLFxuICAgIH07XG4gICAgaWYgKGNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICByZWdpc3RyeS5hZGRfZG9jdW1lbnRzID0gZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBBRERfRE9DVU1FTlRTX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWFcbiAgICAgICAgICAucGljayh7IGluZGV4OiB0cnVlIH0pXG4gICAgICAgICAgLmV4dGVuZCh7IGRvY3VtZW50czogc2hhcmVkU2VhcmNoLnNlYXJjaERvY3VtZW50U2NoZW1hLmFycmF5KCkgfSksXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQWRkRG9jdW1lbnRzKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICAgIHJlZ2lzdHJ5LmNyZWF0ZV9pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYSxcbiAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgYXV0b0luaGVyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MsIHNpZ25hbCkgPT4gdGhpcy5ydW5DcmVhdGVJbmRleChhcmdzLCBzaWduYWwpLFxuICAgICAgfSk7XG4gICAgICByZWdpc3RyeS5zeW5jX2luZGV4ID0gZGVmaW5lVG9vbCh7XG4gICAgICAgIGRlc2NyaXB0aW9uOiBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnN5bmNJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgIGFubm90YXRpb25zOiB7IGVmZmVjdDogXCJ3cml0ZVwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU3luY0luZGV4KGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlZ2lzdHJ5O1xuICB9XG5cbiAgLyoqIFByaW1lIHRoZSBzaGFyZWQgcnVudGltZSBmcm9tIGNvbmZpZyBhbmQgbG9nIHRoZSBlZmZlY3RpdmUgcG9saWN5IGF0IGJvb3QuICovXG4gIG92ZXJyaWRlIGFzeW5jIHNldHVwKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIC8vIENob29zZSBhIGJhY2tlbmQuIFZlY3RvciBTZWFyY2ggaXMgcHJpbWFyeTsgd2hlbiBOTyBWZWN0b3IgU2VhcmNoXG4gICAgLy8gZW5kcG9pbnQgaXMgY29uZmlndXJlZCBidXQgdGhlIEFwcEtpdCBgbGFrZWJhc2VgIHBsdWdpbiBpcyByZWdpc3RlcmVkLFxuICAgIC8vIGZhbGwgYmFjayB0byBhIFBvc3RncmVzIGZ1bGwtdGV4dCBpbmRleC4gQm90aCBhbnN3ZXIgd2l0aCB0aGUgaWRlbnRpY2FsXG4gICAgLy8gc2hhcGUsIHNvIHRoaXMgY2hvaWNlIGlzIGludmlzaWJsZSB0byB0b29scywgcm91dGVzLCBhbmQgdGhlIFVJLlxuICAgIGNvbnN0IGxha2ViYXNlQmFja2VuZCA9IHRoaXMucmVzb2x2ZUxha2ViYXNlQmFja2VuZCgpO1xuICAgIC8vIFRoZSBydW50aW1lIG1heSBhbHJlYWR5IGhhdmUgYmVlbiBidWlsdCAoY29uZmlnLW9ubHkpIHdoZW4gYHRvb2xzKClgIHJhblxuICAgIC8vIGR1cmluZyByZWdpc3RyYXRpb247IHJlYnVpbGQgaXQgc28gaXQgY2FycmllcyB0aGUgY2hvc2VuIGJhY2tlbmQuXG4gICAgcmVzZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoe1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIC4uLihsYWtlYmFzZUJhY2tlbmQgPyB7IGxha2ViYXNlOiBsYWtlYmFzZUJhY2tlbmQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IGxha2ViYXNlQmFja2VuZCA/IFwibGFrZWJhc2VcIiA6IFwidmVjdG9yLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCkgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCB0aGUgTGFrZWJhc2UgRkFMTEJBQ0sgYmFja2VuZCwgb3IgcmV0dXJuIGB1bmRlZmluZWRgIHdoZW4gVmVjdG9yXG4gICAqIFNlYXJjaCBzaG91bGQgYmUgdXNlZC4gRmFsbHMgYmFjayBvbmx5IHdoZW4gdGhlcmUgaXMgTk8gVmVjdG9yIFNlYXJjaFxuICAgKiBlbmRwb2ludCBjb25maWd1cmVkIChwbHVnaW4gY29uZmlnIG9yIGBTRUFSQ0hfRU5EUE9JTlRgIC9cbiAgICogYERBVEFCUklDS1NfVkVDVE9SX1NFQVJDSF9FTkRQT0lOVGApIEFORCB0aGUgc2libGluZyBBcHBLaXQgYGxha2ViYXNlYFxuICAgKiBwbHVnaW4gaXMgcmVnaXN0ZXJlZC4gVGhlIHBnIHBvb2wgaXMgYnVpbHQgZnJvbSB0aGF0IHBsdWdpbidzXG4gICAqIHNlcnZpY2UtcHJpbmNpcGFsIGNvbmZpZyBleGFjdGx5IGxpa2UgYEBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYWAncyBtZW1vcnlcbiAgICogcG9vbCAtIG5vIGF1dGggaXMgcmUtaW1wbGVtZW50ZWQgaGVyZS5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUxha2ViYXNlQmFja2VuZCgpOiBMYWtlYmFzZVNlYXJjaEJhY2tlbmQgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbmZpZyA9IHJlc29sdmVTZWFyY2hDb25maWcodGhpcy5jb25maWcpO1xuICAgIGNvbnN0IGhhc0VuZHBvaW50ID1cbiAgICAgIGNvbmZpZy5lbmRwb2ludCAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBzdHJpbmcudHJpbVRvTnVsbChwcm9jZXNzLmVudltFTkRQT0lOVF9FTlZdKSAhPT0gbnVsbCB8fFxuICAgICAgc3RyaW5nLnRyaW1Ub051bGwocHJvY2Vzcy5lbnYuREFUQUJSSUNLU19WRUNUT1JfU0VBUkNIX0VORFBPSU5UKSAhPT0gbnVsbDtcbiAgICBpZiAoaGFzRW5kcG9pbnQpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgY29uc3QgbGFrZSA9IGFwcGtpdFBsdWdpbi5pbnN0YW5jZSh0aGlzLmNvbnRleHQsIGxha2ViYXNlKTtcbiAgICBpZiAoIWxha2UpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgbG9nZ2VyLmluZm8oXCJiYWNrZW5kLWxha2ViYXNlXCIsIHtcbiAgICAgIHJlYXNvbjogXCJubyBWZWN0b3IgU2VhcmNoIGVuZHBvaW50IGNvbmZpZ3VyZWQ7IHVzaW5nIHRoZSBMYWtlYmFzZSBmdWxsLXRleHQgZmFsbGJhY2tcIixcbiAgICB9KTtcbiAgICAvLyBgZ2V0UGdDb25maWcoKWAgbXVzdCBiZSByZWFkIE9VVFNJREUgYW55IGFzVXNlciBzY29wZSAoYXMgaXQgaXMgaGVyZSBhdFxuICAgIC8vIHNldHVwKSBzbyBpdCBjYXJyaWVzIHRoZSBTUCBjb25uZWN0aW9uIHRhcmdldCArIHRva2VuLXJlZnJlc2ggY2FsbGJhY2suXG4gICAgcmV0dXJuIG5ldyBMYWtlYmFzZVNlYXJjaEJhY2tlbmQoKCkgPT4gbGFrZS5leHBvcnRzKCkuZ2V0UGdDb25maWcoKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoXG4gICAgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRTZWFyY2hSdW50aW1lPltcImNvbmZpZ1wiXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nLnRyaW1Ub051bGwoc3BlYy5pbmRleCkgPz8gY29uZmlnLmRlZmF1bHRJbmRleDtcbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1za2lwcGVkXCIsIHtcbiAgICAgICAgcmVhc29uOiBcIm5vIGluZGV4IG5hbWUgKHNldCBgaW5kZXhgIG9yIGBlbnN1cmVPblNldHVwLmluZGV4YClcIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkb2N1bWVudHMgPSBzcGVjLmRvY3VtZW50cyA/PyBbXTtcbiAgICAvLyBJbmZlciBhIG1hbmFnZWQtZGlyZWN0LWFjY2VzcyBzY2hlbWEgZnJvbSB0aGUgZmlyc3Qgc2VlZCByb3cgd2hlbiBub3QgZ2l2ZW4uXG4gICAgY29uc3Qgc2NoZW1hID1cbiAgICAgIHNwZWMuc2NoZW1hID8/XG4gICAgICAoZG9jdW1lbnRzLmxlbmd0aCA+IDAgJiYgIXNwZWMuc291cmNlVGFibGVcbiAgICAgICAgPyB0aGlzLmluZmVyU2NoZW1hKGRvY3VtZW50c1swXSwgc3BlYy5wcmltYXJ5S2V5ID8/IFwiaWRcIiwgc3BlYy50ZXh0Q29sdW1uID8/IFwidGV4dFwiKVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXN0YXJ0XCIsIHsgaW5kZXggfSk7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5wcm92aXNpb24oaW5kZXgsIHtcbiAgICAgICAgLi4uKHNwZWMuZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBzcGVjLmVuZHBvaW50IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IHNwZWMucHJpbWFyeUtleSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50ZXh0Q29sdW1uID8geyBlbWJlZGRpbmdTb3VyY2VDb2x1bW46IHNwZWMudGV4dENvbHVtbiB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5lbWJlZGRpbmdNb2RlbCA/IHsgZW1iZWRkaW5nTW9kZWw6IHNwZWMuZW1iZWRkaW5nTW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuc291cmNlVGFibGUgPyB7IHNvdXJjZVRhYmxlOiBzcGVjLnNvdXJjZVRhYmxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzY2hlbWEgPyB7IHNjaGVtYSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50aW1lb3V0TXMgPyB7IHRpbWVvdXRNczogc3BlYy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRvY3VtZW50cy5sZW5ndGggPiAwID8geyBzZWVkOiBkb2N1bWVudHMgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtcmVhZHlcIiwge1xuICAgICAgICBpbmRleDogaW5mby5uYW1lLFxuICAgICAgICByZWFkeTogaW5mby5yZWFkeSxcbiAgICAgICAgcm93Q291bnQ6IGluZm8ucm93Q291bnQgPz8gMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1mYWlsZWRcIiwgeyBpbmRleCwgbWVzc2FnZTogc2hhcmVkRXJyb3IuZXJyb3JNZXNzYWdlKGNhdXNlKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgYSBWZWN0b3IgU2VhcmNoIGBzY2hlbWFfanNvbmAgbWFwIGZyb20gYSBzZWVkIGRvY3VtZW50J3MgdmFsdWUgdHlwZXMuICovXG4gIHByaXZhdGUgaW5mZXJTY2hlbWEoXG4gICAgZG9jOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBwcmltYXJ5S2V5OiBzdHJpbmcsXG4gICAgdGV4dENvbHVtbjogc3RyaW5nLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IFtwcmltYXJ5S2V5XTogXCJzdHJpbmdcIiwgW3RleHRDb2x1bW5dOiBcInN0cmluZ1wiIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZG9jKSkge1xuICAgICAgaWYgKGtleSBpbiBzY2hlbWEpIGNvbnRpbnVlO1xuICAgICAgc2NoZW1hW2tleV0gPVxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IE51bWJlci5pc0ludGVnZXIodmFsdWUpXG4gICAgICAgICAgICA/IFwiaW50XCJcbiAgICAgICAgICAgIDogXCJkb3VibGVcIlxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBcImJvb2xlYW5cIlxuICAgICAgICAgICAgOiBcInN0cmluZ1wiO1xuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHNoYXJlZCBydW50aW1lIHNvIGEgcmVzdGFydGVkIGFwcCByZS1yZXNvbHZlcyBjb25maWcuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlc2V0U2VhcmNoUnVudGltZSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IHRoZSBzZWFyY2ggcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGAuIEVhY2ggaXMgd3JhcHBlZCBpblxuICAgKiBgYXNVc2VyKHJlcSlgIHNvIHRoZSBxdWVyeSBydW5zIGFzIHRoZSByZXF1ZXN0aW5nIHVzZXIgYW5kIHRoZSBpbmRleCdzXG4gICAqIFVuaXR5IENhdGFsb2cgQUNMcyBhcHBseS4gYEdFVCAvaW5kZXhlc2AgbmVlZHMgbm8gdXNlciBzY29wZSAtIGl0IGp1c3RcbiAgICogZWNob2VzIHRoZSBjb25maWd1cmVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzZWFyY2hcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBTRUFSQ0hfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJzZWFyY2hcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2guc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwidW5pdmVyc2FsU2VhcmNoXCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogVU5JVkVSU0FMX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwidW5pdmVyc2FsU2VhcmNoXCIsICgpID0+IHtcbiAgICAgICAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UocmVxLmJvZHkgPz8ge30pO1xuICAgICAgICAgIHJldHVybiB0aGlzLmFzVXNlcihyZXEpLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0KTtcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImluZGV4ZXNcIixcbiAgICAgIG1ldGhvZDogXCJnZXRcIixcbiAgICAgIHBhdGg6IElOREVYRVNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAoX3JlcSwgcmVzKSA9PiB7XG4gICAgICAgIHJlcy5qc29uKHRoaXMuY2xpZW50Q29uZmlnKCkpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJkb2N1bWVudHNcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBET0NVTUVOVFNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGRvY3VtZW50IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJhZGREb2N1bWVudHNcIiwgKCkgPT5cbiAgICAgICAgICB0aGlzLmFzVXNlcihyZXEpLnJ1bkFkZERvY3VtZW50cyhyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImNyZWF0ZUluZGV4XCIsXG4gICAgICBtZXRob2Q6IFwicG9zdFwiLFxuICAgICAgcGF0aDogSU5ERVhfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJjcmVhdGVJbmRleFwiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQ3JlYXRlSW5kZXgocmVxLmJvZHkgPz8ge30pLFxuICAgICAgICApO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJzeW5jSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9TWU5DX1JPVVRFLFxuICAgICAgaGFuZGxlcjogYXN5bmMgKHJlcSwgcmVzKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgY29uZmlnIH0gPSBnZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUpIHtcbiAgICAgICAgICByZXMuc3RhdHVzKDQwMykuanNvbih7IGVycm9yOiBcInRoZSBpbmRleCB3cml0ZSBzdXJmYWNlIGlzIGRpc2FibGVkXCIgfSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IHRoaXMucmVzcG9uZChyZXMsIFwic3luY0luZGV4XCIsICgpID0+IHRoaXMuYXNVc2VyKHJlcSkucnVuU3luY0luZGV4KHJlcS5ib2R5ID8/IHt9KSk7XG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1biBhIHJvdXRlIGJvZHksIHR1cm5pbmcgYSBmYWlsdXJlIGludG8gYSBKU09OIGVycm9yIHJlc3BvbnNlLlxuICAgKlxuICAgKiBBcHBLaXQncyBgcm91dGUoKWAgcmVnaXN0ZXJzIHRoZSBoYW5kbGVyIGFzLWlzLCBzbyBhIHJlamVjdGlvbiBlc2NhcGVzIGFzXG4gICAqIGFuIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbiBhbmQgdGFrZXMgdGhlIHdob2xlIHByb2Nlc3MgZG93biByYXRoZXIgdGhhblxuICAgKiBmYWlsaW5nIHRoZSBvbmUgcmVxdWVzdC4gRXZlcnkgcm91dGUgaGVyZSBnb2VzIHRocm91Z2ggdGhpcywgc28gYSBiYWQgaW5kZXhcbiAgICogbmFtZSBvciBhIFZlY3RvciBTZWFyY2ggQVBJIGVycm9yIHJldHVybnMgNTAwIHdpdGggYSBtZXNzYWdlIGluc3RlYWQgb2ZcbiAgICoga2lsbGluZyB0aGUgc2VydmVyLlxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXNwb25kKFxuICAgIHJlczogUGFyYW1ldGVyczxQYXJhbWV0ZXJzPElBcHBSb3V0ZXJbXCJwb3N0XCJdPlsxXT5bMV0sXG4gICAgb3BlcmF0aW9uOiBzdHJpbmcsXG4gICAgcnVuOiAoKSA9PiBQcm9taXNlPHVua25vd24+LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgcmVzLmpzb24oYXdhaXQgcnVuKCkpO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gc2hhcmVkRXJyb3IuZXJyb3JNZXNzYWdlKGNhdXNlKTtcbiAgICAgIGxvZ2dlci53YXJuKFwicm91dGUtZmFpbGVkXCIsIHsgb3BlcmF0aW9uLCBtZXNzYWdlIH0pO1xuICAgICAgcmVzLnN0YXR1cyg1MDApLmpzb24oeyBlcnJvcjogbWVzc2FnZSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogU3VyZmFjZSB0aGUgaW5kZXggY2F0YWxvZ3VlICsgZGVmYXVsdHMgc28gYSBzZWFyY2ggYm94IG5lZWRzIG5vIHJvdW5kLXRyaXAuICovXG4gIG92ZXJyaWRlIGNsaWVudENvbmZpZygpOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gICAgY29uc3QgeyBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoeyBjb25maWc6IHRoaXMuY29uZmlnIH0pO1xuICAgIGNvbnN0IHBheWxvYWQ6IFNlYXJjaENsaWVudENvbmZpZyA9IHtcbiAgICAgIGluZGV4ZXM6IGNvbmZpZy5pbmRleGVzLm1hcCgoaW5kZXgpID0+ICh7XG4gICAgICAgIG5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIGFsaWFzOiBpbmRleC5hbGlhcyxcbiAgICAgICAgLi4uKGluZGV4LnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IGluZGV4LnByaW1hcnlLZXkgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4LmNvbHVtbnMgPyB7IGNvbHVtbnM6IGluZGV4LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4Lm5hbWUgPT09IGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGlzRGVmYXVsdDogdHJ1ZSB9IDoge30pLFxuICAgICAgfSkpLFxuICAgICAgLi4uKGNvbmZpZy5kZWZhdWx0SW5kZXggPyB7IGRlZmF1bHRJbmRleDogY29uZmlnLmRlZmF1bHRJbmRleCB9IDoge30pLFxuICAgICAgcGFnZVNpemU6IGNvbmZpZy5wYWdlU2l6ZSxcbiAgICAgIGJhc2VQYXRoOiB0aGlzLmJhc2VQYXRoLFxuICAgIH07XG4gICAgcmV0dXJuIHBheWxvYWQgYXMgdW5rbm93biBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHRoZSB0b29sIGRlZmluaXRpb25zIG9mZmVyZWQgdG8gYW4gYWdlbnQuICovXG4gIGdldEFnZW50VG9vbHMoKTogQWdlbnRUb29sRGVmaW5pdGlvbltdIHtcbiAgICByZXR1cm4gdG9vbHNGcm9tUmVnaXN0cnkodGhpcy50b29scyk7XG4gIH1cblxuICAvKiogQXBwS2l0IGBUb29sUHJvdmlkZXJgOiBydW4gb25lIHRvb2wgY2FsbCwgdmFsaWRhdGluZyBpbnB1dCBhZ2FpbnN0IGl0cyBzY2hlbWEuICovXG4gIGFzeW5jIGV4ZWN1dGVBZ2VudFRvb2wobmFtZTogc3RyaW5nLCBhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCk6IFByb21pc2U8dW5rbm93bj4ge1xuICAgIHJldHVybiBleGVjdXRlRnJvbVJlZ2lzdHJ5KHRoaXMudG9vbHMsIG5hbWUsIGFyZ3MsIHNpZ25hbCk7XG4gIH1cblxuICBvdmVycmlkZSBleHBvcnRzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAvKiogU2VhcmNoIG9uZSBpbmRleCAoZGVmYXVsdCB3aGVuIG9taXR0ZWQpLiBSdW5zIGFzIHRoZSBjdXJyZW50IGNvbnRleHQgdXNlci4gKi9cbiAgICAgIHNlYXJjaDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5TZWFyY2hSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TZWFyY2gocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTZWFyY2ggYWNyb3NzIGV2ZXJ5IGNvbmZpZ3VyZWQgaW5kZXggYW5kIG1lcmdlIHRoZSBoaXRzLiAqL1xuICAgICAgdW5pdmVyc2FsU2VhcmNoOiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLlVuaXZlcnNhbFNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIEFkZCBvciB1cGRhdGUgZG9jdW1lbnRzIGluIGEgZGlyZWN0LWFjY2VzcyBpbmRleCAodGhyb3dzIHdoZW4gd3JpdGVzIGFyZSBkaXNhYmxlZCkuICovXG4gICAgICBhZGREb2N1bWVudHM6IChyZXF1ZXN0OiB7IGluZGV4Pzogc3RyaW5nOyBkb2N1bWVudHM6IHVua25vd24gfSwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQWRkRG9jdW1lbnRzKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQ3JlYXRlIGEgVmVjdG9yIFNlYXJjaCBpbmRleCAodGhyb3dzIHdoZW4gd3JpdGVzIGFyZSBkaXNhYmxlZCkuICovXG4gICAgICBjcmVhdGVJbmRleDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5DcmVhdGVJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1bkNyZWF0ZUluZGV4KHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogU3luYyBhIERlbHRhIFN5bmMgaW5kZXggZnJvbSBpdHMgc291cmNlIHRhYmxlICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIHN5bmNJbmRleDogKHJlcXVlc3Q6IHNoYXJlZFNlYXJjaC5TeW5jSW5kZXhSZXF1ZXN0LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5TeW5jSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5TZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLnNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICByZXR1cm4gY2xpZW50LnNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB7XG4gICAgICAuLi4ocmVxdWVzdC5pbmRleCA/IHsgaW5kZXg6IHJlcXVlc3QuaW5kZXggfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmxpbWl0ID8geyBsaW1pdDogcmVxdWVzdC5saW1pdCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubW9kZSA/IHsgbW9kZTogcmVxdWVzdC5tb2RlIH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5jb2x1bW5zID8geyBjb2x1bW5zOiByZXF1ZXN0LmNvbHVtbnMgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmZpbHRlciA/IHsgZmlsdGVyOiByZXF1ZXN0LmZpbHRlciB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3Quc2NvcmVUaHJlc2hvbGQgIT09IHVuZGVmaW5lZCA/IHsgc2NvcmVUaHJlc2hvbGQ6IHJlcXVlc3Quc2NvcmVUaHJlc2hvbGQgfSA6IHt9KSxcbiAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5Vbml2ZXJzYWxTZWFyY2goYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLnVuaXZlcnNhbFNlYXJjaFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICByZXR1cm4gY2xpZW50LnVuaXZlcnNhbFNlYXJjaChyZXF1ZXN0LnF1ZXJ5LCB7XG4gICAgICAuLi4ocmVxdWVzdC5pbmRleGVzID8geyBpbmRleGVzOiByZXF1ZXN0LmluZGV4ZXMgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmxpbWl0ID8geyBsaW1pdDogcmVxdWVzdC5saW1pdCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubW9kZSA/IHsgbW9kZTogcmVxdWVzdC5tb2RlIH0gOiB7fSksXG4gICAgICAuLi4oc2lnbmFsID8geyBzaWduYWwgfSA6IHt9KSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQWRkRG9jdW1lbnRzKGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVjb3JkID0gKGFyZ3MgPz8ge30pIGFzIHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9O1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICBjb25zdCBkb2N1bWVudHMgPSB0b0RvY3VtZW50QXJyYXkocmVjb3JkLmRvY3VtZW50cyk7XG4gICAgY29uc3QgaW5kZXggPSByZWNvcmQuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIHJldHVybiBjbGllbnQuYWRkRG9jdW1lbnRzKGluZGV4LCBkb2N1bWVudHMsIHNpZ25hbCk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1bkNyZWF0ZUluZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNoYXJlZFNlYXJjaC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEucGFyc2UoYXJncyk7XG4gICAgY29uc3QgeyBjbGllbnQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICByZXR1cm4gY2xpZW50LmNyZWF0ZUluZGV4KHJlcXVlc3QubmFtZSwgdG9DcmVhdGVJbmRleE9wdGlvbnMocmVxdWVzdCwgc2lnbmFsKSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blN5bmNJbmRleChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2guc3luY0luZGV4UmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnIH0gPSBnZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgY29uc3QgaW5kZXggPSByZXF1ZXN0LmluZGV4ID8/IGNvbmZpZy5kZWZhdWx0SW5kZXggPz8gXCJcIjtcbiAgICBhd2FpdCBjbGllbnQuc3luY0luZGV4KGluZGV4LCBzaWduYWwpO1xuICAgIHJldHVybiB7IGluZGV4LCBzeW5jZWQ6IHRydWUgfTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ2lzdGVyIHRoZSBBSSBTZWFyY2ggcGx1Z2luIHdpdGggQXBwS2l0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogaW1wb3J0IHsgY3JlYXRlQXBwLCBzZXJ2ZXIgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG4gKiBpbXBvcnQgeyBwbHVnaW4gYXMgc2VhcmNoUGx1Z2luLCB0b29sIGFzIHNlYXJjaFRvb2xBcGkgfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqIGltcG9ydCB7IGFnZW50cywgcGx1Z2luIGFzIG1hc3RyYVBsdWdpbiB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdC1tYXN0cmFcIjtcbiAqXG4gKiBjb25zdCBzdXBwb3J0ID0gYWdlbnRzLmNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBcIkFuc3dlciBmcm9tIHRoZSBkb2NzOyB1c2UgYHNlYXJjaGAgdG8gZmluZCB0aGVtLlwiLFxuICogICB0b29sczogKCkgPT4gKHsgc2VhcmNoOiBzZWFyY2hUb29sQXBpLnNlYXJjaFRvb2woKSB9KSxcbiAqIH0pO1xuICpcbiAqIGF3YWl0IGNyZWF0ZUFwcCh7XG4gKiAgIHBsdWdpbnM6IFtcbiAqICAgICBzZXJ2ZXIoKSxcbiAqICAgICBzZWFyY2hQbHVnaW4uc2VhcmNoKHsgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiB9KSxcbiAqICAgICBtYXN0cmFQbHVnaW4ubWFzdHJhKHsgYWdlbnRzOiBzdXBwb3J0IH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IHNlYXJjaCA9IHRvUGx1Z2luKFNlYXJjaFBsdWdpbik7XG4iXX0=
|
|
439
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQXdDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUYsT0FBTyxFQUNMLFFBQVEsRUFDUixVQUFVLEVBQ1YsbUJBQW1CLEVBQ25CLGlCQUFpQixHQUlsQixNQUFNLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sRUFBRSxNQUFNLElBQUksWUFBWSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDM0QsT0FBTyxFQUFFLEtBQUssSUFBSSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzNFLE9BQU8sRUFBRSxNQUFNLElBQUksWUFBWSxFQUEyQixNQUFNLDBCQUEwQixDQUFDO0FBQzNGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxtQkFBbUIsRUFBMkIsTUFBTSxhQUFhLENBQUM7QUFDakcsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDeEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3BELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3BFLE9BQU8sRUFDTCw4QkFBOEIsRUFDOUIsNkJBQTZCLEVBQzdCLHVCQUF1QixFQUN2QiwyQkFBMkIsRUFDM0IsaUNBQWlDLEdBQ2xDLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFFcEMsOEVBQThFO0FBQzlFLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztBQUVyQywyRUFBMkU7QUFDM0UsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDO0FBRWpDLDBFQUEwRTtBQUMxRSxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7QUFFckMsK0RBQStEO0FBQy9ELE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUU3QixpRkFBaUY7QUFDakYsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7QUFFdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxNQUEwQjtJQUMxRCxNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUFFLFdBQVc7UUFDeEIsV0FBVyxFQUNULHNGQUFzRjtZQUN0RixvRkFBb0Y7UUFDdEYsU0FBUyxFQUFFLE1BQU07UUFDakIsU0FBUyxFQUFFO1lBQ1QsUUFBUSxFQUFFLEVBQUU7WUFDWixRQUFRLEVBQUUsRUFBRTtTQUNiO1FBQ0QsTUFBTSxFQUFFLEVBQUUsTUFBTSxFQUFFLG9CQUFvQixFQUFFO0tBQ04sQ0FBQztJQUVyQyw4REFBOEQ7SUFDOUQsSUFBWSxRQUFRO1FBQ2xCLE9BQU8sUUFBUSxZQUFZLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFZLEtBQUs7UUFDZixNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLGdCQUFnQixDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sUUFBUSxHQUFpQjtZQUM3QixNQUFNLEVBQUUsVUFBVSxDQUFDO2dCQUNqQixXQUFXLEVBQUUsdUJBQXVCO2dCQUNwQyxNQUFNLEVBQUUsWUFBWSxDQUFDLG1CQUFtQjtnQkFDeEMsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUU7Z0JBQzFELGVBQWUsRUFBRSxLQUFLO2dCQUN0QixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUM5RCxDQUFDO1lBQ0YsZ0JBQWdCLEVBQUUsVUFBVSxDQUFDO2dCQUMzQixXQUFXLEVBQUUsaUNBQWlDO2dCQUM5QyxNQUFNLEVBQUUsWUFBWSxDQUFDLDRCQUE0QjtnQkFDakQsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUU7Z0JBQzFELGVBQWUsRUFBRSxLQUFLO2dCQUN0QixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDO2FBQ3ZFLENBQUM7U0FDSCxDQUFDO1FBQ0YsSUFBSSxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDdEIsUUFBUSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7Z0JBQ2xDLFdBQVcsRUFBRSw4QkFBOEI7Z0JBQzNDLE1BQU0sRUFBRSxZQUFZLENBQUMsbUJBQW1CO3FCQUNyQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLENBQUM7cUJBQ3JCLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsb0JBQW9CLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDbkUsV0FBVyxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxJQUFJLEVBQUU7Z0JBQzNELGVBQWUsRUFBRSxLQUFLO2dCQUN0QixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQzthQUNwRSxDQUFDLENBQUM7WUFDSCxJQUFJLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxDQUFDO2dCQUNuQyxRQUFRLENBQUMsWUFBWSxHQUFHLFVBQVUsQ0FBQztvQkFDakMsV0FBVyxFQUFFLDZCQUE2QjtvQkFDMUMsTUFBTSxFQUFFLFlBQVksQ0FBQyx3QkFBd0I7b0JBQzdDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO29CQUMzRCxlQUFlLEVBQUUsS0FBSztvQkFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7aUJBQ25FLENBQUMsQ0FBQztnQkFDSCxRQUFRLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztvQkFDL0IsV0FBVyxFQUFFLDJCQUEyQjtvQkFDeEMsTUFBTSxFQUFFLFlBQVksQ0FBQyxzQkFBc0I7b0JBQzNDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsSUFBSSxFQUFFO29CQUMzRCxlQUFlLEVBQUUsS0FBSztvQkFDdEIsT0FBTyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUM7aUJBQ2pFLENBQUMsQ0FBQztZQUNMLENBQUM7UUFDSCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUVELGlGQUFpRjtJQUN4RSxLQUFLLENBQUMsS0FBSztRQUNsQixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztRQUNsRCwyRUFBMkU7UUFDM0Usb0VBQW9FO1FBQ3BFLGtCQUFrQixFQUFFLENBQUM7UUFDckIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixDQUFDO1lBQ2xDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixXQUFXO1NBQ1osQ0FBQyxDQUFDO1FBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDbkIsT0FBTyxFQUFFLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLG9CQUFvQjtZQUNsRixZQUFZLEVBQUUsTUFBTSxDQUFDLFlBQVksSUFBSSwyQkFBMkI7WUFDaEUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQzNDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO1lBQzdCLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixhQUFhLEVBQUUsTUFBTSxDQUFDLGFBQWE7Z0JBQ2pDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsS0FBSyxJQUFJLE1BQU0sQ0FBQyxZQUFZLENBQUM7Z0JBQ3JELENBQUMsQ0FBQyxLQUFLO1NBQ1YsQ0FBQyxDQUFDO1FBQ0gsNEVBQTRFO1FBQzVFLHNEQUFzRDtRQUN0RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLElBQUksV0FBVyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDMUQsS0FBSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDckMsQ0FBQztJQUNILENBQUM7SUFFRCxtRUFBbUU7SUFDM0Qsc0JBQXNCO1FBQzVCLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDOUUsT0FBTyxxQkFBcUIsQ0FBQyxRQUFRLEVBQUUsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssS0FBSyxDQUFDLGdCQUFnQixDQUM1QixNQUFxRDtRQUVyRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsYUFBYSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUNsQixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ25FLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7Z0JBQzVCLE1BQU0sRUFBRSxzREFBc0Q7YUFDL0QsQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNULENBQUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN2QywrRUFBK0U7UUFDL0UsTUFBTSxNQUFNLEdBQ1YsSUFBSSxDQUFDLE1BQU07WUFDWCxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVc7Z0JBQ3hDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxJQUFJLE1BQU0sQ0FBQztnQkFDcEYsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2pCLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQztZQUN2QyxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztZQUN0QyxNQUFNLElBQUksR0FBRyxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFO2dCQUN6QyxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JELEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDM0QsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RFLEdBQUcsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLGNBQWMsRUFBRSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDdkUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM5RCxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQzdCLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDeEQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2FBQ3JELENBQUMsQ0FBQztZQUNILE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFO2dCQUMxQixLQUFLLEVBQUUsSUFBSSxDQUFDLElBQUk7Z0JBQ2hCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLElBQUksQ0FBQzthQUM3QixDQUFDLENBQUM7UUFDTCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNwRixDQUFDO0lBQ0gsQ0FBQztJQUVELGtGQUFrRjtJQUMxRSxXQUFXLENBQ2pCLEdBQTRCLEVBQzVCLFVBQWtCLEVBQ2xCLFVBQWtCO1FBRWxCLE1BQU0sTUFBTSxHQUEyQixFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUM7UUFDMUYsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLEdBQUcsSUFBSSxNQUFNO2dCQUFFLFNBQVM7WUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQztnQkFDVCxPQUFPLEtBQUssS0FBSyxRQUFRO29CQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUM7d0JBQ3ZCLENBQUMsQ0FBQyxLQUFLO3dCQUNQLENBQUMsQ0FBQyxRQUFRO29CQUNaLENBQUMsQ0FBQyxPQUFPLEtBQUssS0FBSyxTQUFTO3dCQUMxQixDQUFDLENBQUMsU0FBUzt3QkFDWCxDQUFDLENBQUMsUUFBUSxDQUFDO1FBQ25CLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLEtBQUssQ0FBQyxRQUFRO1FBQ1osa0JBQWtCLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRVEscUJBQXFCO1FBQzVCLEtBQUssQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzlCLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDTSxZQUFZLENBQUMsTUFBa0I7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxFQUFFLGlCQUFpQjtZQUN2QixNQUFNLEVBQUUsTUFBTTtZQUNkLElBQUksRUFBRSxlQUFlO1lBQ3JCLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMxQixNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRTtvQkFDOUMsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNoRixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsa0JBQWtCLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQ3RELENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksRUFBRSxTQUFTO1lBQ2YsTUFBTSxFQUFFLEtBQUs7WUFDYixJQUFJLEVBQUUsYUFBYTtZQUNuQixPQUFPLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDM0IsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQztZQUNoQyxDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxFQUFFLFdBQVc7WUFDakIsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsZUFBZTtZQUNyQixPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3ZCLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLHdDQUF3QyxFQUFFLENBQUMsQ0FBQztvQkFDMUUsT0FBTztnQkFDVCxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUMzQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUNqRCxDQUFDO1lBQ0osQ0FBQztTQUNGLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ2pCLElBQUksRUFBRSxhQUFhO1lBQ25CLE1BQU0sRUFBRSxNQUFNO1lBQ2QsSUFBSSxFQUFFLFdBQVc7WUFDakIsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQzFCLE1BQU0sRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztnQkFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLElBQUksQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsQ0FBQztvQkFDMUQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUscUNBQXFDLEVBQUUsQ0FBQyxDQUFDO29CQUN2RSxPQUFPO2dCQUNULENBQUM7Z0JBQ0QsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQzFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQ2hELENBQUM7WUFDSixDQUFDO1NBQ0YsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDakIsSUFBSSxFQUFFLFdBQVc7WUFDakIsTUFBTSxFQUFFLE1BQU07WUFDZCxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLE9BQU8sRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUMxQixNQUFNLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25ELElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxJQUFJLENBQUMsV0FBVyxFQUFFLGlCQUFpQixFQUFFLENBQUM7b0JBQzFELEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxFQUFFLHFDQUFxQyxFQUFFLENBQUMsQ0FBQztvQkFDdkUsT0FBTztnQkFDVCxDQUFDO2dCQUNELE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztZQUM1RixDQUFDO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssS0FBSyxDQUFDLE9BQU8sQ0FDbkIsR0FBcUQsRUFDckQsU0FBaUIsRUFDakIsR0FBMkI7UUFFM0IsSUFBSSxDQUFDO1lBQ0gsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUM7UUFDeEIsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLE9BQU8sR0FBRyxXQUFXLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2hELE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7WUFDcEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMzQyxDQUFDO0lBQ0gsQ0FBQztJQUVELGtGQUFrRjtJQUN6RSxZQUFZO1FBQ25CLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUM3RCxNQUFNLE9BQU8sR0FBdUI7WUFDbEMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO2dCQUN0QyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7Z0JBQ2hCLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO2dCQUM3RCxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDbkUsQ0FBQyxDQUFDO1lBQ0gsR0FBRyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JFLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7U0FDeEIsQ0FBQztRQUNGLE9BQU8sT0FBNkMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsdUVBQXVFO0lBQ3ZFLGFBQWE7UUFDWCxPQUFPLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQscUZBQXFGO0lBQ3JGLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFZLEVBQUUsSUFBYSxFQUFFLE1BQW9CO1FBQ3RFLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFUSxPQUFPO1FBQ2QsT0FBTztZQUNMLGlGQUFpRjtZQUNqRixNQUFNLEVBQUUsQ0FBQyxPQUFtQyxFQUFFLE1BQW9CLEVBQUUsRUFBRSxDQUNwRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFDakMsK0RBQStEO1lBQy9ELGVBQWUsRUFBRSxDQUFDLE9BQTRDLEVBQUUsTUFBb0IsRUFBRSxFQUFFLENBQ3RGLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO1lBQzFDLDBGQUEwRjtZQUMxRixZQUFZLEVBQUUsQ0FBQyxPQUErQyxFQUFFLE1BQW9CLEVBQUUsRUFBRSxDQUN0RixJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUM7WUFDdkMsc0VBQXNFO1lBQ3RFLFdBQVcsRUFBRSxDQUFDLE9BQXdDLEVBQUUsTUFBb0IsRUFBRSxFQUFFLENBQzlFLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQztZQUN0Qyx1RkFBdUY7WUFDdkYsU0FBUyxFQUFFLENBQUMsT0FBc0MsRUFBRSxNQUFvQixFQUFFLEVBQUUsQ0FDMUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDO1NBQ3JDLENBQUM7SUFDSixDQUFDO0lBRU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFhLEVBQUUsTUFBb0I7UUFDekQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3RCxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRTtZQUNsQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2xELEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUMvQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEQsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3JELEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDM0YsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBYSxFQUFFLE1BQW9CO1FBQ2xFLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDdEMsT0FBTyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUU7WUFDM0MsR0FBRyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ3hELEdBQUcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsRCxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0MsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1NBQzlCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTyxLQUFLLENBQUMsZUFBZSxDQUFDLElBQWEsRUFBRSxNQUFvQjtRQUMvRCxNQUFNLE1BQU0sR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQTJDLENBQUM7UUFDdEUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlDLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN4RCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRU8sS0FBSyxDQUFDLGNBQWMsQ0FBQyxJQUFhLEVBQUUsTUFBb0I7UUFDOUQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLHdCQUF3QixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRSxNQUFNLEVBQUUsTUFBTSxFQUFFLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztRQUN0QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRU8sS0FBSyxDQUFDLFlBQVksQ0FBQyxJQUFhLEVBQUUsTUFBb0I7UUFDNUQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDOUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztRQUN6RCxNQUFNLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDO0lBQ2pDLENBQUM7O0FBR0g7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBBcHBLaXQgZXh0ZW5zaW9uIHBsdWdpbiAocmVnaXN0ZXJlZCBuYW1lOiBgc2VhcmNoYCkgYXJvdW5kIGEgc2libGluZ1xuICogYGFpU2VhcmNoYCBwcm92aWRlci4gTmF0aXZlIEFwcEtpdCBvd25zIFZlY3RvciBTZWFyY2ggcXVlcnkgZXhlY3V0aW9uOyB0aGlzXG4gKiBwbHVnaW4gYWRkcyB0aGUgc3VyZmFjZXMgdGhhdCByZW1haW4gdXNlZnVsIGFjcm9zcyBuYXRpdmUgYW5kIExha2ViYXNlXG4gKiBwcm92aWRlcnM6XG4gKlxuICogICAtIGEgYHNlYXJjaGAgLyBgdW5pdmVyc2FsX3NlYXJjaGAgLyAob3B0LWluKSBgYWRkX2RvY3VtZW50c2AgdG9vbCBzZXQgZm9yXG4gKiAgICAgYm90aCBNYXN0cmEgYW5kIEFwcEtpdCBhZ2VudHMgKGF1dG9jb21wbGV0ZSBpcyBhIHNtYWxsLWBsaW1pdGAgc2VhcmNoKTtcbiAqICAgLSBjb21wYXRpYmlsaXR5IGFuZCBleHRlbnNpb24gcm91dGVzIHVuZGVyIGAvYXBpL3NlYXJjaGBcbiAqICAgICAoYFBPU1QgL2Agc2VhcmNoLCBgUE9TVCAvdW5pdmVyc2FsYCBmZWRlcmF0ZWQsIGBHRVQgL2luZGV4ZXNgIGNhdGFsb2d1ZSxcbiAqICAgICBhbmQgYFBPU1QgL2RvY3VtZW50c2Agd2hlbiB3cml0ZXMgYXJlIGVuYWJsZWQpO1xuICogICAtIGEgYGNsaWVudENvbmZpZygpYCBwYXlsb2FkIHNvIGEgVUkga25vd3MgdGhlIGluZGV4ZXMsIGRlZmF1bHQsIGFuZCBwYWdlXG4gKiAgICAgc2l6ZSBhdCBib290IHdpdGggbm8gcm91bmQtdHJpcDtcbiAqICAgLSBgZXhwb3J0cygpYCBzbyBhcHAgY29kZSBjYW4gYGFwcGtpdC5zZWFyY2guc2VhcmNoKC4uLilgIGRpcmVjdGx5LlxuICpcbiAqIFZlY3RvciBTZWFyY2ggcmVhZHMgZGVsZWdhdGUgdG8gdGhlIHJlZ2lzdGVyZWQgbmF0aXZlIEFwcEtpdCBgYWlTZWFyY2hgXG4gKiBwbHVnaW4sIHByZXNlcnZpbmcgaXRzIE9CTywgY2FjaGluZywgcmVyYW5raW5nLCBhbmQgcmVzcG9uc2UgaGFuZGxpbmcuIFRoZVxuICogYWx0ZXJuYXRpdmUgYGxha2ViYXNlQWlTZWFyY2hgIHByb3ZpZGVyIHN1cHBsaWVzIHRoZSBzYW1lIHF1ZXJ5IGNvbnRyYWN0XG4gKiBvdmVyIFBvc3RncmVTUUwgZnVsbC10ZXh0IHNlYXJjaC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgUGx1Z2luLCB0b1BsdWdpbiwgdHlwZSBJQXBwUm91dGVyLCB0eXBlIFBsdWdpbk1hbmlmZXN0IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHtcbiAgYWlTZWFyY2gsXG4gIGRlZmluZVRvb2wsXG4gIGV4ZWN1dGVGcm9tUmVnaXN0cnksXG4gIHRvb2xzRnJvbVJlZ2lzdHJ5LFxuICB0eXBlIEFnZW50VG9vbERlZmluaXRpb24sXG4gIHR5cGUgVG9vbFByb3ZpZGVyLFxuICB0eXBlIFRvb2xSZWdpc3RyeSxcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdC9iZXRhXCI7XG5pbXBvcnQgeyBwbHVnaW4gYXMgYXBwa2l0UGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBlcnJvciBhcyBzaGFyZWRFcnJvciwgbG9nLCBzdHJpbmcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHsgc2VhcmNoIGFzIHNoYXJlZFNlYXJjaCwgdHlwZSBTZWFyY2hDbGllbnRDb25maWcgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtc2VhcmNoXCI7XG5pbXBvcnQgeyBTRUFSQ0hfQ09ORklHX1NDSEVNQSwgcmVzb2x2ZVNlYXJjaENvbmZpZywgdHlwZSBTZWFyY2hQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IHRvQ3JlYXRlSW5kZXhPcHRpb25zIH0gZnJvbSBcIi4vaW5kZXgtdG9vbHMudHNcIjtcbmltcG9ydCB7IG5hdGl2ZUFpU2VhcmNoQmFja2VuZCB9IGZyb20gXCIuL25hdGl2ZS50c1wiO1xuaW1wb3J0IHsgdG9Eb2N1bWVudEFycmF5IH0gZnJvbSBcIi4vcXVlcnkudHNcIjtcbmltcG9ydCB7IGdldFNlYXJjaFJ1bnRpbWUsIHJlc2V0U2VhcmNoUnVudGltZSB9IGZyb20gXCIuL3J1bnRpbWUudHNcIjtcbmltcG9ydCB7XG4gIEFERF9ET0NVTUVOVFNfVE9PTF9ERVNDUklQVElPTixcbiAgQ1JFQVRFX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICBTWU5DX0lOREVYX1RPT0xfREVTQ1JJUFRJT04sXG4gIFVOSVZFUlNBTF9TRUFSQ0hfVE9PTF9ERVNDUklQVElPTixcbn0gZnJvbSBcIi4vc2NoZW1hLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJzZWFyY2hcIik7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBmb3IgYSB1bml2ZXJzYWwgKGZlZGVyYXRlZCkgc2VhcmNoIGFjcm9zcyBpbmRleGVzLiAqL1xuY29uc3QgVU5JVkVSU0FMX1JPVVRFID0gXCIvdW5pdmVyc2FsXCI7XG5cbi8qKiBNb3VudC1yZWxhdGl2ZSByb3V0ZSBzZXJ2aW5nIHRoZSBpbmRleCBjYXRhbG9ndWUgYSBzZWFyY2ggYm94IHJlYWRzLiAqL1xuY29uc3QgSU5ERVhFU19ST1VURSA9IFwiL2luZGV4ZXNcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBhZGRpbmcgZG9jdW1lbnRzIHRvIGEgZGlyZWN0LWFjY2VzcyBpbmRleC4gKi9cbmNvbnN0IERPQ1VNRU5UU19ST1VURSA9IFwiL2RvY3VtZW50c1wiO1xuXG4vKiogTW91bnQtcmVsYXRpdmUgcm91dGUgZm9yIGNyZWF0aW5nIGEgVmVjdG9yIFNlYXJjaCBpbmRleC4gKi9cbmNvbnN0IElOREVYX1JPVVRFID0gXCIvaW5kZXhcIjtcblxuLyoqIE1vdW50LXJlbGF0aXZlIHJvdXRlIGZvciBzeW5jaW5nIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUuICovXG5jb25zdCBJTkRFWF9TWU5DX1JPVVRFID0gXCIvaW5kZXgvc3luY1wiO1xuXG4vKipcbiAqIEFwcEtpdCBleHRlbnNpb24gcGx1Z2luIGZvciBhZ2VudCB0b29scywgZmVkZXJhdGVkIHNlYXJjaCwgYW5kIG9wdGlvbmFsXG4gKiBWZWN0b3IgU2VhcmNoIGxpZmVjeWNsZSBvcGVyYXRpb25zLiBSZWdpc3RlciBgYWlTZWFyY2goKWAgb3JcbiAqIGBsYWtlYmFzZUFpU2VhcmNoKClgIGJlZm9yZSB0aGlzIHBsdWdpbi5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHNcbiAqIGltcG9ydCB7IGNyZWF0ZUFwcCwgc2VydmVyIH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuICogaW1wb3J0IHsgYWlTZWFyY2ggfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0L2JldGFcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9zZWFyY2hcIjtcbiAqXG4gKiBhd2FpdCBjcmVhdGVBcHAoe1xuICogICBwbHVnaW5zOiBbXG4gKiAgICAgc2VydmVyKCksXG4gKiAgICAgYWlTZWFyY2goe1xuICogICAgICAgaW5kZXhlczoge1xuICogICAgICAgICBkb2NzOiB7XG4gKiAgICAgICAgICAgaW5kZXhOYW1lOiBcIm1haW4uc3VwcG9ydC5kb2NzXCIsXG4gKiAgICAgICAgICAgY29sdW1uczogW1wiaWRcIiwgXCJ0aXRsZVwiLCBcImJvZHlcIl0sXG4gKiAgICAgICAgIH0sXG4gKiAgICAgICB9LFxuICogICAgIH0pLFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goe1xuICogICAgICAgaW5kZXg6IFwibWFpbi5zdXBwb3J0LmRvY3NcIixcbiAqICAgICAgIGluZGV4ZXM6IFt7IG5hbWU6IFwibWFpbi5zdXBwb3J0LmRvY3NcIiwgYWxpYXM6IFwiZG9jc1wiIH1dLFxuICogICAgIH0pLFxuICogICBdLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFNlYXJjaFBsdWdpbiBleHRlbmRzIFBsdWdpbjxTZWFyY2hQbHVnaW5Db25maWc+IGltcGxlbWVudHMgVG9vbFByb3ZpZGVyIHtcbiAgc3RhdGljIG1hbmlmZXN0ID0ge1xuICAgIG5hbWU6IFwic2VhcmNoXCIsXG4gICAgZGlzcGxheU5hbWU6IFwiQUkgU2VhcmNoXCIsXG4gICAgZGVzY3JpcHRpb246XG4gICAgICBcIlNlYXJjaCBEYXRhYnJpY2tzIEFJIFNlYXJjaCAoVmVjdG9yIFNlYXJjaCkgaW5kZXhlczogYWdlbnQgdG9vbHMsIEhUVFAgcm91dGVzIGZvciBhIFwiICtcbiAgICAgIFwic2VhcmNoIGJveCwgdW5pdmVyc2FsIHNlYXJjaCBhY3Jvc3MgaW5kZXhlcywgYW5kIGFuIG9wdC1pbiBkb2N1bWVudCB3cml0ZSBzdXJmYWNlLlwiLFxuICAgIHN0YWJpbGl0eTogXCJiZXRhXCIsXG4gICAgcmVzb3VyY2VzOiB7XG4gICAgICByZXF1aXJlZDogW10sXG4gICAgICBvcHRpb25hbDogW10sXG4gICAgfSxcbiAgICBjb25maWc6IHsgc2NoZW1hOiBTRUFSQ0hfQ09ORklHX1NDSEVNQSB9LFxuICB9IHNhdGlzZmllcyBQbHVnaW5NYW5pZmVzdDxcInNlYXJjaFwiPjtcblxuICAvKiogVGhlIGJhc2UgcGF0aCBBcHBLaXQgbW91bnRzIHRoaXMgcGx1Z2luJ3Mgcm91dGVzIHVuZGVyLiAqL1xuICBwcml2YXRlIGdldCBiYXNlUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgL2FwaS8ke1NlYXJjaFBsdWdpbi5tYW5pZmVzdC5uYW1lfWA7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRvb2xzIHRoaXMgcGx1Z2luIG9mZmVycyB0byBhbiBBcHBLaXQgYWdlbnQuIGBzZWFyY2hgIC9cbiAgICogYHVuaXZlcnNhbF9zZWFyY2hgIGFyZSByZWFkczsgYGFkZF9kb2N1bWVudHNgIC8gYGNyZWF0ZV9pbmRleGAgL1xuICAgKiBgc3luY19pbmRleGAgYXJlIG9ubHkgb2ZmZXJlZCB3aGVuIHRoZSB3cml0ZSBzdXJmYWNlIGlzIGVuYWJsZWQuIE5vbmUgaXNcbiAgICogYXV0b0luaGVyaXRhYmxlOiBldmVyeSB0b29sIHJ1bnMgdW5kZXIgdGhlIGNhbGxlcidzIGlkZW50aXR5LCBzbyBpdCBtdXN0IGJlXG4gICAqIGdyYW50ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByaXZhdGUgZ2V0IHRvb2xzKCk6IFRvb2xSZWdpc3RyeSB7XG4gICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSBnZXRTZWFyY2hSdW50aW1lKHsgY29uZmlnOiB0aGlzLmNvbmZpZyB9KTtcbiAgICBjb25zdCByZWdpc3RyeTogVG9vbFJlZ2lzdHJ5ID0ge1xuICAgICAgc2VhcmNoOiBkZWZpbmVUb29sKHtcbiAgICAgICAgZGVzY3JpcHRpb246IFNFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNoYXJlZFNlYXJjaC5zZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICAgIHVuaXZlcnNhbF9zZWFyY2g6IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogVU5JVkVSU0FMX1NFQVJDSF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNoYXJlZFNlYXJjaC51bml2ZXJzYWxTZWFyY2hSZXF1ZXN0U2NoZW1hLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwicmVhZFwiLCByZXF1aXJlc1VzZXJDb250ZXh0OiB0cnVlIH0sXG4gICAgICAgIGF1dG9Jbmhlcml0YWJsZTogZmFsc2UsXG4gICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKGFyZ3MsIHNpZ25hbCksXG4gICAgICB9KSxcbiAgICB9O1xuICAgIGlmIChjb25maWcuYWxsb3dXcml0ZSkge1xuICAgICAgcmVnaXN0cnkuYWRkX2RvY3VtZW50cyA9IGRlZmluZVRvb2woe1xuICAgICAgICBkZXNjcmlwdGlvbjogQUREX0RPQ1VNRU5UU19UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICBzY2hlbWE6IHNoYXJlZFNlYXJjaC5zZWFyY2hSZXF1ZXN0U2NoZW1hXG4gICAgICAgICAgLnBpY2soeyBpbmRleDogdHJ1ZSB9KVxuICAgICAgICAgIC5leHRlbmQoeyBkb2N1bWVudHM6IHNoYXJlZFNlYXJjaC5zZWFyY2hEb2N1bWVudFNjaGVtYS5hcnJheSgpIH0pLFxuICAgICAgICBhbm5vdGF0aW9uczogeyBlZmZlY3Q6IFwid3JpdGVcIiwgcmVxdWlyZXNVc2VyQ29udGV4dDogdHJ1ZSB9LFxuICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICBleGVjdXRlOiBhc3luYyAoYXJncywgc2lnbmFsKSA9PiB0aGlzLnJ1bkFkZERvY3VtZW50cyhhcmdzLCBzaWduYWwpLFxuICAgICAgfSk7XG4gICAgICBpZiAocmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgIHJlZ2lzdHJ5LmNyZWF0ZV9pbmRleCA9IGRlZmluZVRvb2woe1xuICAgICAgICAgIGRlc2NyaXB0aW9uOiBDUkVBVEVfSU5ERVhfVE9PTF9ERVNDUklQVElPTixcbiAgICAgICAgICBzY2hlbWE6IHNoYXJlZFNlYXJjaC5jcmVhdGVJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuQ3JlYXRlSW5kZXgoYXJncywgc2lnbmFsKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJlZ2lzdHJ5LnN5bmNfaW5kZXggPSBkZWZpbmVUb29sKHtcbiAgICAgICAgICBkZXNjcmlwdGlvbjogU1lOQ19JTkRFWF9UT09MX0RFU0NSSVBUSU9OLFxuICAgICAgICAgIHNjaGVtYTogc2hhcmVkU2VhcmNoLnN5bmNJbmRleFJlcXVlc3RTY2hlbWEsXG4gICAgICAgICAgYW5ub3RhdGlvbnM6IHsgZWZmZWN0OiBcIndyaXRlXCIsIHJlcXVpcmVzVXNlckNvbnRleHQ6IHRydWUgfSxcbiAgICAgICAgICBhdXRvSW5oZXJpdGFibGU6IGZhbHNlLFxuICAgICAgICAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzLCBzaWduYWwpID0+IHRoaXMucnVuU3luY0luZGV4KGFyZ3MsIHNpZ25hbCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVnaXN0cnk7XG4gIH1cblxuICAvKiogUHJpbWUgdGhlIHNoYXJlZCBydW50aW1lIGZyb20gY29uZmlnIGFuZCBsb2cgdGhlIGVmZmVjdGl2ZSBwb2xpY3kgYXQgYm9vdC4gKi9cbiAgb3ZlcnJpZGUgYXN5bmMgc2V0dXAoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcmVhZEJhY2tlbmQgPSB0aGlzLnJlc29sdmVQcm92aWRlckJhY2tlbmQoKTtcbiAgICAvLyBUaGUgcnVudGltZSBtYXkgYWxyZWFkeSBoYXZlIGJlZW4gYnVpbHQgKGNvbmZpZy1vbmx5KSB3aGVuIGB0b29scygpYCByYW5cbiAgICAvLyBkdXJpbmcgcmVnaXN0cmF0aW9uOyByZWJ1aWxkIGl0IHNvIGl0IGNhcnJpZXMgdGhlIGNob3NlbiBiYWNrZW5kLlxuICAgIHJlc2V0U2VhcmNoUnVudGltZSgpO1xuICAgIGNvbnN0IHsgY29uZmlnIH0gPSBnZXRTZWFyY2hSdW50aW1lKHtcbiAgICAgIGNvbmZpZzogdGhpcy5jb25maWcsXG4gICAgICByZWFkQmFja2VuZCxcbiAgICB9KTtcbiAgICBsb2dnZXIuaW5mbyhcInJlYWR5XCIsIHtcbiAgICAgIGJhY2tlbmQ6IHJlYWRCYWNrZW5kLnN1cHBvcnRzTGlmZWN5Y2xlID8gXCJhcHBraXQtYWktc2VhcmNoXCIgOiBcImxha2ViYXNlLWFpLXNlYXJjaFwiLFxuICAgICAgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiKG5vbmUgLSBwYXNzIHBlciByZXF1ZXN0KVwiLFxuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpKSA9PiBpLmFsaWFzKSxcbiAgICAgIHBhZ2VTaXplOiBjb25maWcucGFnZVNpemUsXG4gICAgICBtb2RlOiBjb25maWcubW9kZSxcbiAgICAgIGFsbG93V3JpdGU6IGNvbmZpZy5hbGxvd1dyaXRlLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgICBlbnN1cmVPblNldHVwOiBjb25maWcuZW5zdXJlT25TZXR1cFxuICAgICAgICA/IChjb25maWcuZW5zdXJlT25TZXR1cC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4KVxuICAgICAgICA6IFwib2ZmXCIsXG4gICAgfSk7XG4gICAgLy8gUHJvdmlzaW9uIGEgcmVhbCBpbmRleCBpbiB0aGUgQkFDS0dST1VORCBzbyBhIHNsb3cgZmlyc3QtdGltZSBlbmRwb2ludCBvclxuICAgIC8vIGluZGV4IGJ1aWxkIG5ldmVyIGJsb2NrcyB0aGUgc2VydmVyIGZyb20gY29taW5nIHVwLlxuICAgIGlmIChjb25maWcuZW5zdXJlT25TZXR1cCAmJiByZWFkQmFja2VuZC5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgdm9pZCB0aGlzLnJ1bkVuc3VyZU9uU2V0dXAoY29uZmlnKTtcbiAgICB9XG4gIH1cblxuICAvKiogUmVzb2x2ZSB0aGUgcmVnaXN0ZXJlZCBBcHBLaXQtY29tcGF0aWJsZSBBSSBTZWFyY2ggcHJvdmlkZXIuICovXG4gIHByaXZhdGUgcmVzb2x2ZVByb3ZpZGVyQmFja2VuZCgpOiBSZXR1cm5UeXBlPHR5cGVvZiBuYXRpdmVBaVNlYXJjaEJhY2tlbmQ+IHtcbiAgICBjb25zdCBwcm92aWRlciA9IGFwcGtpdFBsdWdpbi5yZXF1aXJlKHRoaXMuY29udGV4dCwgYWlTZWFyY2gsIHRoaXMpLmV4cG9ydHMoKTtcbiAgICByZXR1cm4gbmF0aXZlQWlTZWFyY2hCYWNrZW5kKHByb3ZpZGVyLCByZXNvbHZlU2VhcmNoQ29uZmlnKHRoaXMuY29uZmlnKSk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoZSBlbmRwb2ludCArIGluZGV4IGV4aXN0IGFuZCBzZWVkIHRoZW0sIGhvbm9yaW5nIGBlbnN1cmVPblNldHVwYC5cbiAgICogVXNlcyBib290LXRpbWUgU0RLIGF1dGggKGVudiAvIGNvbmZpZyBwcm9maWxlKSB2aWEgdGhlIGNsaWVudCdzXG4gICAqIG91dC1vZi1yZXF1ZXN0IGZhbGxiYWNrLiBGYWlsdXJlcyBhcmUgbG9nZ2VkLCBuZXZlciB0aHJvd24gLSBhIHNlYXJjaCBhcHBcbiAgICogc2hvdWxkIHN0aWxsIHN0YXJ0IGV2ZW4gaWYgcHJvdmlzaW9uaW5nIGlzIHNsb3cgb3IgYSBwZXJtaXNzaW9uIGlzIG1pc3NpbmcuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJ1bkVuc3VyZU9uU2V0dXAoXG4gICAgY29uZmlnOiBSZXR1cm5UeXBlPHR5cGVvZiBnZXRTZWFyY2hSdW50aW1lPltcImNvbmZpZ1wiXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc3BlYyA9IGNvbmZpZy5lbnN1cmVPblNldHVwO1xuICAgIGlmICghc3BlYykgcmV0dXJuO1xuICAgIGNvbnN0IGluZGV4ID0gc3RyaW5nLnRyaW1Ub051bGwoc3BlYy5pbmRleCkgPz8gY29uZmlnLmRlZmF1bHRJbmRleDtcbiAgICBpZiAoIWluZGV4KSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1za2lwcGVkXCIsIHtcbiAgICAgICAgcmVhc29uOiBcIm5vIGluZGV4IG5hbWUgKHNldCBgaW5kZXhgIG9yIGBlbnN1cmVPblNldHVwLmluZGV4YClcIixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBkb2N1bWVudHMgPSBzcGVjLmRvY3VtZW50cyA/PyBbXTtcbiAgICAvLyBJbmZlciBhIG1hbmFnZWQtZGlyZWN0LWFjY2VzcyBzY2hlbWEgZnJvbSB0aGUgZmlyc3Qgc2VlZCByb3cgd2hlbiBub3QgZ2l2ZW4uXG4gICAgY29uc3Qgc2NoZW1hID1cbiAgICAgIHNwZWMuc2NoZW1hID8/XG4gICAgICAoZG9jdW1lbnRzLmxlbmd0aCA+IDAgJiYgIXNwZWMuc291cmNlVGFibGVcbiAgICAgICAgPyB0aGlzLmluZmVyU2NoZW1hKGRvY3VtZW50c1swXSwgc3BlYy5wcmltYXJ5S2V5ID8/IFwiaWRcIiwgc3BlYy50ZXh0Q29sdW1uID8/IFwidGV4dFwiKVxuICAgICAgICA6IHVuZGVmaW5lZCk7XG4gICAgdHJ5IHtcbiAgICAgIGxvZ2dlci5pbmZvKFwiZW5zdXJlLXN0YXJ0XCIsIHsgaW5kZXggfSk7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgY29uc3QgaW5mbyA9IGF3YWl0IGNsaWVudC5wcm92aXNpb24oaW5kZXgsIHtcbiAgICAgICAgLi4uKHNwZWMuZW5kcG9pbnQgPyB7IGVuZHBvaW50OiBzcGVjLmVuZHBvaW50IH0gOiB7fSksXG4gICAgICAgIC4uLihzcGVjLnByaW1hcnlLZXkgPyB7IHByaW1hcnlLZXk6IHNwZWMucHJpbWFyeUtleSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50ZXh0Q29sdW1uID8geyBlbWJlZGRpbmdTb3VyY2VDb2x1bW46IHNwZWMudGV4dENvbHVtbiB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy5lbWJlZGRpbmdNb2RlbCA/IHsgZW1iZWRkaW5nTW9kZWw6IHNwZWMuZW1iZWRkaW5nTW9kZWwgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwZWMuc291cmNlVGFibGUgPyB7IHNvdXJjZVRhYmxlOiBzcGVjLnNvdXJjZVRhYmxlIH0gOiB7fSksXG4gICAgICAgIC4uLihzY2hlbWEgPyB7IHNjaGVtYSB9IDoge30pLFxuICAgICAgICAuLi4oc3BlYy50aW1lb3V0TXMgPyB7IHRpbWVvdXRNczogc3BlYy50aW1lb3V0TXMgfSA6IHt9KSxcbiAgICAgICAgLi4uKGRvY3VtZW50cy5sZW5ndGggPiAwID8geyBzZWVkOiBkb2N1bWVudHMgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgbG9nZ2VyLmluZm8oXCJlbnN1cmUtcmVhZHlcIiwge1xuICAgICAgICBpbmRleDogaW5mby5uYW1lLFxuICAgICAgICByZWFkeTogaW5mby5yZWFkeSxcbiAgICAgICAgcm93Q291bnQ6IGluZm8ucm93Q291bnQgPz8gMCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2ggKGNhdXNlKSB7XG4gICAgICBsb2dnZXIud2FybihcImVuc3VyZS1mYWlsZWRcIiwgeyBpbmRleCwgbWVzc2FnZTogc2hhcmVkRXJyb3IuZXJyb3JNZXNzYWdlKGNhdXNlKSB9KTtcbiAgICB9XG4gIH1cblxuICAvKiogQnVpbGQgYSBWZWN0b3IgU2VhcmNoIGBzY2hlbWFfanNvbmAgbWFwIGZyb20gYSBzZWVkIGRvY3VtZW50J3MgdmFsdWUgdHlwZXMuICovXG4gIHByaXZhdGUgaW5mZXJTY2hlbWEoXG4gICAgZG9jOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICBwcmltYXJ5S2V5OiBzdHJpbmcsXG4gICAgdGV4dENvbHVtbjogc3RyaW5nLFxuICApOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICBjb25zdCBzY2hlbWE6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7IFtwcmltYXJ5S2V5XTogXCJzdHJpbmdcIiwgW3RleHRDb2x1bW5dOiBcInN0cmluZ1wiIH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZG9jKSkge1xuICAgICAgaWYgKGtleSBpbiBzY2hlbWEpIGNvbnRpbnVlO1xuICAgICAgc2NoZW1hW2tleV0gPVxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwibnVtYmVyXCJcbiAgICAgICAgICA/IE51bWJlci5pc0ludGVnZXIodmFsdWUpXG4gICAgICAgICAgICA/IFwiaW50XCJcbiAgICAgICAgICAgIDogXCJkb3VibGVcIlxuICAgICAgICAgIDogdHlwZW9mIHZhbHVlID09PSBcImJvb2xlYW5cIlxuICAgICAgICAgICAgPyBcImJvb2xlYW5cIlxuICAgICAgICAgICAgOiBcInN0cmluZ1wiO1xuICAgIH1cbiAgICByZXR1cm4gc2NoZW1hO1xuICB9XG5cbiAgLyoqIERyb3AgdGhlIHNoYXJlZCBydW50aW1lIHNvIGEgcmVzdGFydGVkIGFwcCByZS1yZXNvbHZlcyBjb25maWcuICovXG4gIGFzeW5jIHNodXRkb3duKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJlc2V0U2VhcmNoUnVudGltZSgpO1xuICB9XG5cbiAgb3ZlcnJpZGUgYWJvcnRBY3RpdmVPcGVyYXRpb25zKCk6IHZvaWQge1xuICAgIHN1cGVyLmFib3J0QWN0aXZlT3BlcmF0aW9ucygpO1xuICAgIHZvaWQgdGhpcy5zaHV0ZG93bigpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdW50IGV4dGVuc2lvbiByb3V0ZXMgdW5kZXIgYC9hcGkvc2VhcmNoYC4gU2luZ2xlLWluZGV4IHF1ZXJpZXMgc3RheSBvblxuICAgKiB0aGUgcHJvdmlkZXIncyBuYXRpdmUgYC9hcGkvYWktc2VhcmNoLzphbGlhcy9xdWVyeWAgc3VyZmFjZS5cbiAgICovXG4gIG92ZXJyaWRlIGluamVjdFJvdXRlcyhyb3V0ZXI6IElBcHBSb3V0ZXIpOiB2b2lkIHtcbiAgICB0aGlzLnJvdXRlKHJvdXRlciwge1xuICAgICAgbmFtZTogXCJ1bml2ZXJzYWxTZWFyY2hcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBVTklWRVJTQUxfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJ1bml2ZXJzYWxTZWFyY2hcIiwgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShyZXEuYm9keSA/PyB7fSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuYXNVc2VyKHJlcSkucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QpO1xuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiaW5kZXhlc1wiLFxuICAgICAgbWV0aG9kOiBcImdldFwiLFxuICAgICAgcGF0aDogSU5ERVhFU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChfcmVxLCByZXMpID0+IHtcbiAgICAgICAgcmVzLmpzb24odGhpcy5jbGllbnRDb25maWcoKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcImRvY3VtZW50c1wiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IERPQ1VNRU5UU19ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgICAgICBpZiAoIWNvbmZpZy5hbGxvd1dyaXRlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgZG9jdW1lbnQgd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImFkZERvY3VtZW50c1wiLCAoKSA9PlxuICAgICAgICAgIHRoaXMuYXNVc2VyKHJlcSkucnVuQWRkRG9jdW1lbnRzKHJlcS5ib2R5ID8/IHt9KSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgdGhpcy5yb3V0ZShyb3V0ZXIsIHtcbiAgICAgIG5hbWU6IFwiY3JlYXRlSW5kZXhcIixcbiAgICAgIG1ldGhvZDogXCJwb3N0XCIsXG4gICAgICBwYXRoOiBJTkRFWF9ST1VURSxcbiAgICAgIGhhbmRsZXI6IGFzeW5jIChyZXEsIHJlcykgPT4ge1xuICAgICAgICBjb25zdCB7IGNvbmZpZywgcmVhZEJhY2tlbmQgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICAgICAgaWYgKCFjb25maWcuYWxsb3dXcml0ZSB8fCAhcmVhZEJhY2tlbmQ/LnN1cHBvcnRzTGlmZWN5Y2xlKSB7XG4gICAgICAgICAgcmVzLnN0YXR1cyg0MDMpLmpzb24oeyBlcnJvcjogXCJ0aGUgaW5kZXggd3JpdGUgc3VyZmFjZSBpcyBkaXNhYmxlZFwiIH0pO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCB0aGlzLnJlc3BvbmQocmVzLCBcImNyZWF0ZUluZGV4XCIsICgpID0+XG4gICAgICAgICAgdGhpcy5hc1VzZXIocmVxKS5ydW5DcmVhdGVJbmRleChyZXEuYm9keSA/PyB7fSksXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHRoaXMucm91dGUocm91dGVyLCB7XG4gICAgICBuYW1lOiBcInN5bmNJbmRleFwiLFxuICAgICAgbWV0aG9kOiBcInBvc3RcIixcbiAgICAgIHBhdGg6IElOREVYX1NZTkNfUk9VVEUsXG4gICAgICBoYW5kbGVyOiBhc3luYyAocmVxLCByZXMpID0+IHtcbiAgICAgICAgY29uc3QgeyBjb25maWcsIHJlYWRCYWNrZW5kIH0gPSBnZXRTZWFyY2hSdW50aW1lKCk7XG4gICAgICAgIGlmICghY29uZmlnLmFsbG93V3JpdGUgfHwgIXJlYWRCYWNrZW5kPy5zdXBwb3J0c0xpZmVjeWNsZSkge1xuICAgICAgICAgIHJlcy5zdGF0dXMoNDAzKS5qc29uKHsgZXJyb3I6IFwidGhlIGluZGV4IHdyaXRlIHN1cmZhY2UgaXMgZGlzYWJsZWRcIiB9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgdGhpcy5yZXNwb25kKHJlcywgXCJzeW5jSW5kZXhcIiwgKCkgPT4gdGhpcy5hc1VzZXIocmVxKS5ydW5TeW5jSW5kZXgocmVxLmJvZHkgPz8ge30pKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUnVuIGEgcm91dGUgYm9keSwgdHVybmluZyBhIGZhaWx1cmUgaW50byBhIEpTT04gZXJyb3IgcmVzcG9uc2UuXG4gICAqXG4gICAqIEFwcEtpdCdzIGByb3V0ZSgpYCByZWdpc3RlcnMgdGhlIGhhbmRsZXIgYXMtaXMsIHNvIGEgcmVqZWN0aW9uIGVzY2FwZXMgYXNcbiAgICogYW4gdW5oYW5kbGVkIHByb21pc2UgcmVqZWN0aW9uIGFuZCB0YWtlcyB0aGUgd2hvbGUgcHJvY2VzcyBkb3duIHJhdGhlciB0aGFuXG4gICAqIGZhaWxpbmcgdGhlIG9uZSByZXF1ZXN0LiBFdmVyeSByb3V0ZSBoZXJlIGdvZXMgdGhyb3VnaCB0aGlzLCBzbyBhIGJhZCBpbmRleFxuICAgKiBuYW1lIG9yIGEgVmVjdG9yIFNlYXJjaCBBUEkgZXJyb3IgcmV0dXJucyA1MDAgd2l0aCBhIG1lc3NhZ2UgaW5zdGVhZCBvZlxuICAgKiBraWxsaW5nIHRoZSBzZXJ2ZXIuXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIHJlc3BvbmQoXG4gICAgcmVzOiBQYXJhbWV0ZXJzPFBhcmFtZXRlcnM8SUFwcFJvdXRlcltcInBvc3RcIl0+WzFdPlsxXSxcbiAgICBvcGVyYXRpb246IHN0cmluZyxcbiAgICBydW46ICgpID0+IFByb21pc2U8dW5rbm93bj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICByZXMuanNvbihhd2FpdCBydW4oKSk7XG4gICAgfSBjYXRjaCAoY2F1c2UpIHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBzaGFyZWRFcnJvci5lcnJvck1lc3NhZ2UoY2F1c2UpO1xuICAgICAgbG9nZ2VyLndhcm4oXCJyb3V0ZS1mYWlsZWRcIiwgeyBvcGVyYXRpb24sIG1lc3NhZ2UgfSk7XG4gICAgICByZXMuc3RhdHVzKDUwMCkuanNvbih7IGVycm9yOiBtZXNzYWdlIH0pO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBTdXJmYWNlIHRoZSBpbmRleCBjYXRhbG9ndWUgKyBkZWZhdWx0cyBzbyBhIHNlYXJjaCBib3ggbmVlZHMgbm8gcm91bmQtdHJpcC4gKi9cbiAgb3ZlcnJpZGUgY2xpZW50Q29uZmlnKCk6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgICBjb25zdCB7IGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSh7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gICAgY29uc3QgcGF5bG9hZDogU2VhcmNoQ2xpZW50Q29uZmlnID0ge1xuICAgICAgaW5kZXhlczogY29uZmlnLmluZGV4ZXMubWFwKChpbmRleCkgPT4gKHtcbiAgICAgICAgbmFtZTogaW5kZXgubmFtZSxcbiAgICAgICAgYWxpYXM6IGluZGV4LmFsaWFzLFxuICAgICAgICAuLi4oaW5kZXgucHJpbWFyeUtleSA/IHsgcHJpbWFyeUtleTogaW5kZXgucHJpbWFyeUtleSB9IDoge30pLFxuICAgICAgICAuLi4oaW5kZXguY29sdW1ucyA/IHsgY29sdW1uczogaW5kZXguY29sdW1ucyB9IDoge30pLFxuICAgICAgICAuLi4oaW5kZXgubmFtZSA9PT0gY29uZmlnLmRlZmF1bHRJbmRleCA/IHsgaXNEZWZhdWx0OiB0cnVlIH0gOiB7fSksXG4gICAgICB9KSksXG4gICAgICAuLi4oY29uZmlnLmRlZmF1bHRJbmRleCA/IHsgZGVmYXVsdEluZGV4OiBjb25maWcuZGVmYXVsdEluZGV4IH0gOiB7fSksXG4gICAgICBwYWdlU2l6ZTogY29uZmlnLnBhZ2VTaXplLFxuICAgICAgYmFzZVBhdGg6IHRoaXMuYmFzZVBhdGgsXG4gICAgfTtcbiAgICByZXR1cm4gcGF5bG9hZCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICB9XG5cbiAgLyoqIEFwcEtpdCBgVG9vbFByb3ZpZGVyYDogdGhlIHRvb2wgZGVmaW5pdGlvbnMgb2ZmZXJlZCB0byBhbiBhZ2VudC4gKi9cbiAgZ2V0QWdlbnRUb29scygpOiBBZ2VudFRvb2xEZWZpbml0aW9uW10ge1xuICAgIHJldHVybiB0b29sc0Zyb21SZWdpc3RyeSh0aGlzLnRvb2xzKTtcbiAgfVxuXG4gIC8qKiBBcHBLaXQgYFRvb2xQcm92aWRlcmA6IHJ1biBvbmUgdG9vbCBjYWxsLCB2YWxpZGF0aW5nIGlucHV0IGFnYWluc3QgaXRzIHNjaGVtYS4gKi9cbiAgYXN5bmMgZXhlY3V0ZUFnZW50VG9vbChuYW1lOiBzdHJpbmcsIGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKTogUHJvbWlzZTx1bmtub3duPiB7XG4gICAgcmV0dXJuIGV4ZWN1dGVGcm9tUmVnaXN0cnkodGhpcy50b29scywgbmFtZSwgYXJncywgc2lnbmFsKTtcbiAgfVxuXG4gIG92ZXJyaWRlIGV4cG9ydHMoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC8qKiBTZWFyY2ggb25lIGluZGV4IChkZWZhdWx0IHdoZW4gb21pdHRlZCkuIFJ1bnMgYXMgdGhlIGN1cnJlbnQgY29udGV4dCB1c2VyLiAqL1xuICAgICAgc2VhcmNoOiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLlNlYXJjaFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blNlYXJjaChyZXF1ZXN0LCBzaWduYWwpLFxuICAgICAgLyoqIFNlYXJjaCBhY3Jvc3MgZXZlcnkgY29uZmlndXJlZCBpbmRleCBhbmQgbWVyZ2UgdGhlIGhpdHMuICovXG4gICAgICB1bml2ZXJzYWxTZWFyY2g6IChyZXF1ZXN0OiBzaGFyZWRTZWFyY2guVW5pdmVyc2FsU2VhcmNoUmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuVW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QsIHNpZ25hbCksXG4gICAgICAvKiogQWRkIG9yIHVwZGF0ZSBkb2N1bWVudHMgaW4gYSBkaXJlY3QtYWNjZXNzIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGFkZERvY3VtZW50czogKHJlcXVlc3Q6IHsgaW5kZXg/OiBzdHJpbmc7IGRvY3VtZW50czogdW5rbm93biB9LCBzaWduYWw/OiBBYm9ydFNpZ25hbCkgPT5cbiAgICAgICAgdGhpcy5ydW5BZGREb2N1bWVudHMocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBDcmVhdGUgYSBWZWN0b3IgU2VhcmNoIGluZGV4ICh0aHJvd3Mgd2hlbiB3cml0ZXMgYXJlIGRpc2FibGVkKS4gKi9cbiAgICAgIGNyZWF0ZUluZGV4OiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLkNyZWF0ZUluZGV4UmVxdWVzdCwgc2lnbmFsPzogQWJvcnRTaWduYWwpID0+XG4gICAgICAgIHRoaXMucnVuQ3JlYXRlSW5kZXgocmVxdWVzdCwgc2lnbmFsKSxcbiAgICAgIC8qKiBTeW5jIGEgRGVsdGEgU3luYyBpbmRleCBmcm9tIGl0cyBzb3VyY2UgdGFibGUgKHRocm93cyB3aGVuIHdyaXRlcyBhcmUgZGlzYWJsZWQpLiAqL1xuICAgICAgc3luY0luZGV4OiAocmVxdWVzdDogc2hhcmVkU2VhcmNoLlN5bmNJbmRleFJlcXVlc3QsIHNpZ25hbD86IEFib3J0U2lnbmFsKSA9PlxuICAgICAgICB0aGlzLnJ1blN5bmNJbmRleChyZXF1ZXN0LCBzaWduYWwpLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blNlYXJjaChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2guc2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIHJldHVybiBjbGllbnQuc2VhcmNoKHJlcXVlc3QucXVlcnksIHtcbiAgICAgIC4uLihyZXF1ZXN0LmluZGV4ID8geyBpbmRleDogcmVxdWVzdC5pbmRleCB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubGltaXQgPyB7IGxpbWl0OiByZXF1ZXN0LmxpbWl0IH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5tb2RlID8geyBtb2RlOiByZXF1ZXN0Lm1vZGUgfSA6IHt9KSxcbiAgICAgIC4uLihyZXF1ZXN0LmNvbHVtbnMgPyB7IGNvbHVtbnM6IHJlcXVlc3QuY29sdW1ucyB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QuZmlsdGVyID8geyBmaWx0ZXI6IHJlcXVlc3QuZmlsdGVyIH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5zY29yZVRocmVzaG9sZCAhPT0gdW5kZWZpbmVkID8geyBzY29yZVRocmVzaG9sZDogcmVxdWVzdC5zY29yZVRocmVzaG9sZCB9IDoge30pLFxuICAgICAgLi4uKHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB7fSksXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHJ1blVuaXZlcnNhbFNlYXJjaChhcmdzOiB1bmtub3duLCBzaWduYWw/OiBBYm9ydFNpZ25hbCkge1xuICAgIGNvbnN0IHJlcXVlc3QgPSBzaGFyZWRTZWFyY2gudW5pdmVyc2FsU2VhcmNoUmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIHJldHVybiBjbGllbnQudW5pdmVyc2FsU2VhcmNoKHJlcXVlc3QucXVlcnksIHtcbiAgICAgIC4uLihyZXF1ZXN0LmluZGV4ZXMgPyB7IGluZGV4ZXM6IHJlcXVlc3QuaW5kZXhlcyB9IDoge30pLFxuICAgICAgLi4uKHJlcXVlc3QubGltaXQgPyB7IGxpbWl0OiByZXF1ZXN0LmxpbWl0IH0gOiB7fSksXG4gICAgICAuLi4ocmVxdWVzdC5tb2RlID8geyBtb2RlOiByZXF1ZXN0Lm1vZGUgfSA6IHt9KSxcbiAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBydW5BZGREb2N1bWVudHMoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZWNvcmQgPSAoYXJncyA/PyB7fSkgYXMgeyBpbmRleD86IHN0cmluZzsgZG9jdW1lbnRzOiB1bmtub3duIH07XG4gICAgY29uc3QgeyBjbGllbnQsIGNvbmZpZyB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIGNvbnN0IGRvY3VtZW50cyA9IHRvRG9jdW1lbnRBcnJheShyZWNvcmQuZG9jdW1lbnRzKTtcbiAgICBjb25zdCBpbmRleCA9IHJlY29yZC5pbmRleCA/PyBjb25maWcuZGVmYXVsdEluZGV4ID8/IFwiXCI7XG4gICAgcmV0dXJuIGNsaWVudC5hZGREb2N1bWVudHMoaW5kZXgsIGRvY3VtZW50cywgc2lnbmFsKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuQ3JlYXRlSW5kZXgoYXJnczogdW5rbm93biwgc2lnbmFsPzogQWJvcnRTaWduYWwpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gc2hhcmVkU2VhcmNoLmNyZWF0ZUluZGV4UmVxdWVzdFNjaGVtYS5wYXJzZShhcmdzKTtcbiAgICBjb25zdCB7IGNsaWVudCB9ID0gZ2V0U2VhcmNoUnVudGltZSgpO1xuICAgIHJldHVybiBjbGllbnQuY3JlYXRlSW5kZXgocmVxdWVzdC5uYW1lLCB0b0NyZWF0ZUluZGV4T3B0aW9ucyhyZXF1ZXN0LCBzaWduYWwpKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcnVuU3luY0luZGV4KGFyZ3M6IHVua25vd24sIHNpZ25hbD86IEFib3J0U2lnbmFsKSB7XG4gICAgY29uc3QgcmVxdWVzdCA9IHNoYXJlZFNlYXJjaC5zeW5jSW5kZXhSZXF1ZXN0U2NoZW1hLnBhcnNlKGFyZ3MpO1xuICAgIGNvbnN0IHsgY2xpZW50LCBjb25maWcgfSA9IGdldFNlYXJjaFJ1bnRpbWUoKTtcbiAgICBjb25zdCBpbmRleCA9IHJlcXVlc3QuaW5kZXggPz8gY29uZmlnLmRlZmF1bHRJbmRleCA/PyBcIlwiO1xuICAgIGF3YWl0IGNsaWVudC5zeW5jSW5kZXgoaW5kZXgsIHNpZ25hbCk7XG4gICAgcmV0dXJuIHsgaW5kZXgsIHN5bmNlZDogdHJ1ZSB9O1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgdGhlIEFJIFNlYXJjaCBwbHVnaW4gd2l0aCBBcHBLaXQuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBjcmVhdGVBcHAsIHNlcnZlciB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbiAqIGltcG9ydCB7IHBsdWdpbiBhcyBzZWFyY2hQbHVnaW4sIHRvb2wgYXMgc2VhcmNoVG9vbEFwaSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NlYXJjaFwiO1xuICogaW1wb3J0IHsgYWdlbnRzLCBwbHVnaW4gYXMgbWFzdHJhUGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0LW1hc3RyYVwiO1xuICpcbiAqIGNvbnN0IHN1cHBvcnQgPSBhZ2VudHMuY3JlYXRlQWdlbnQoe1xuICogICBpbnN0cnVjdGlvbnM6IFwiQW5zd2VyIGZyb20gdGhlIGRvY3M7IHVzZSBgc2VhcmNoYCB0byBmaW5kIHRoZW0uXCIsXG4gKiAgIHRvb2xzOiAoKSA9PiAoeyBzZWFyY2g6IHNlYXJjaFRvb2xBcGkuc2VhcmNoVG9vbCgpIH0pLFxuICogfSk7XG4gKlxuICogYXdhaXQgY3JlYXRlQXBwKHtcbiAqICAgcGx1Z2luczogW1xuICogICAgIHNlcnZlcigpLFxuICogICAgIHNlYXJjaFBsdWdpbi5zZWFyY2goeyBpbmRleDogXCJtYWluLnN1cHBvcnQuZG9jc1wiIH0pLFxuICogICAgIG1hc3RyYVBsdWdpbi5tYXN0cmEoeyBhZ2VudHM6IHN1cHBvcnQgfSksXG4gKiAgIF0sXG4gKiB9KTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3Qgc2VhcmNoID0gdG9QbHVnaW4oU2VhcmNoUGx1Z2luKTtcbiJdfQ==
|
package/lib/src/query.d.ts
CHANGED
|
@@ -1,60 +1,4 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Translation between the browser-safe search contract and the Databricks
|
|
3
|
-
* Vector Search query API, kept in one place so the client, the tools, and the
|
|
4
|
-
* routes never hand-roll a `filters_json` string or unpack a `data_array` by
|
|
5
|
-
* hand.
|
|
6
|
-
*
|
|
7
|
-
* - {@link toQueryType} maps the friendly {@link SearchMode} onto the API's
|
|
8
|
-
* `query_type` (`HYBRID` / `ANN`). Keyword-only search rides on `ANN` with
|
|
9
|
-
* text but no vector, which Databricks answers with its BM25 path.
|
|
10
|
-
* - {@link compileFilter} turns the `{ column: value }` filter object (with
|
|
11
|
-
* optional operator maps like `{ ">=": 10 }`) into the `filters_json`
|
|
12
|
-
* string the API expects, so a caller never learns Databricks' filter
|
|
13
|
-
* spelling.
|
|
14
|
-
* - {@link toHits} unpacks the columnar `{ manifest, result }` response into
|
|
15
|
-
* `{ id, score, fields }` hits, pulling the score out of the reserved
|
|
16
|
-
* `__db_score` / `score` column and the id out of the primary-key column.
|
|
17
|
-
*
|
|
18
|
-
* @module
|
|
19
|
-
*/
|
|
20
|
-
import type { SearchHit, SearchMode } from "@dbx-tools/shared-search";
|
|
21
|
-
/** Map a {@link SearchMode} onto the serving API `query_type`. */
|
|
22
|
-
export declare function toQueryType(mode: SearchMode): string;
|
|
23
|
-
/**
|
|
24
|
-
* Compile a `{ column: value }` filter object into the `filters_json` string
|
|
25
|
-
* the query API expects. A scalar becomes an equality; an array becomes an
|
|
26
|
-
* IN-style match; an operator map (`{ ">=": 10, "<": 20 }`) expands to the
|
|
27
|
-
* `column operator` keys Databricks uses. Returns `undefined` for an empty
|
|
28
|
-
* filter so the field is omitted rather than sent as `{}`.
|
|
29
|
-
*/
|
|
30
|
-
export declare function compileFilter(filter: Record<string, unknown> | undefined): string | undefined;
|
|
31
|
-
/** A minimal structural view of the Vector Search query response. */
|
|
32
|
-
export interface QueryResponseLike {
|
|
33
|
-
manifest?: {
|
|
34
|
-
columns?: Array<{
|
|
35
|
-
name?: string;
|
|
36
|
-
}>;
|
|
37
|
-
};
|
|
38
|
-
result?: {
|
|
39
|
-
data_array?: Array<Array<unknown>>;
|
|
40
|
-
};
|
|
41
|
-
next_page_token?: string;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Unpack a columnar query response into {@link SearchHit}s. The manifest names
|
|
45
|
-
* the columns in order; each row is a positional array. The score comes from
|
|
46
|
-
* the reserved score column and the id from `primaryKey` (falling back to the
|
|
47
|
-
* first column when the key is unknown). The score column is stripped from
|
|
48
|
-
* `fields` so a hit's fields are just the document.
|
|
49
|
-
*/
|
|
50
|
-
export declare function toHits(response: QueryResponseLike, primaryKey: string | undefined, indexName?: string): SearchHit[];
|
|
51
|
-
/**
|
|
52
|
-
* The columns to request from an index for a search. When neither the request
|
|
53
|
-
* nor the index config names columns, the score column alone is requested and
|
|
54
|
-
* the primary key is appended so a hit always has an id. Callers that want the
|
|
55
|
-
* whole document should pass the index's own column list.
|
|
56
|
-
*/
|
|
57
|
-
export declare function toRequestColumns(requested: readonly string[] | undefined, fallback: readonly string[] | undefined, primaryKey: string | undefined): string[];
|
|
1
|
+
/** Request-shape helpers for search extension write routes and tools. */
|
|
58
2
|
/**
|
|
59
3
|
* Parse a JSON document payload the model / a route supplied for a write.
|
|
60
4
|
* Accepts an already-parsed array/object or a JSON string, and always returns
|