@dbx-tools/appkit-mastra 0.6.212 → 0.6.213
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 +13 -0
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/config.d.ts +7 -0
- package/lib/src/config.js +5 -1
- package/lib/src/genie.js +20 -13
- package/package.json +13 -13
- package/src/config.ts +12 -0
- package/src/genie.ts +25 -13
package/README.md
CHANGED
|
@@ -408,6 +408,14 @@ thread's reusable Genie conversation while overlapping invocations use isolated
|
|
|
408
408
|
conversations, preventing concurrent messages from colliding in one Genie
|
|
409
409
|
conversation. Sequential calls continue to reuse conversation context.
|
|
410
410
|
|
|
411
|
+
`ask_genie` uses the Genie Agent Mode SSE API by default, projecting reasoning,
|
|
412
|
+
SQL function calls, query output, and the synthesized answer into the existing
|
|
413
|
+
writer events and terminal `GenieMessage`. Set `genieAgentMode: false` on
|
|
414
|
+
`mastra(...)` to force the legacy Conversation API polling flow. A pre-stream
|
|
415
|
+
`FEATURE_DISABLED` or preview-toggle error falls back to polling automatically.
|
|
416
|
+
Agent Mode carries query results inline as Markdown; use polling when a workflow
|
|
417
|
+
specifically requires legacy `statement_id`-backed chart or data embeds.
|
|
418
|
+
|
|
411
419
|
```ts
|
|
412
420
|
const agent = agents.createAgent({
|
|
413
421
|
instructions: `${baseInstructions}\n\n${genie.GENIE_INSTRUCTIONS}`,
|
|
@@ -452,6 +460,8 @@ const resolved = await chart.fetchChart(chartId, { userKey });
|
|
|
452
460
|
Agents can return `[chart:<id>]` and `[data:<statement_id>]` markers in prose.
|
|
453
461
|
The embed route resolves them later, which avoids forcing the language model to
|
|
454
462
|
inline large tables or wait for chart planning before continuing its answer.
|
|
463
|
+
Genie supplies those statement ids through the legacy polling transport; Agent
|
|
464
|
+
Mode returns inline Markdown and structured table metadata instead.
|
|
455
465
|
|
|
456
466
|
### Chart Types And Hand-Written Charts
|
|
457
467
|
|
|
@@ -760,6 +770,9 @@ requiring callers to assemble a Mastra server by hand.
|
|
|
760
770
|
suggestions, and chart/data workflows. An alias present with no space id is a
|
|
761
771
|
wiring contradiction and fails at construction rather than silently
|
|
762
772
|
registering no Genie tools.
|
|
773
|
+
- `genieAgentMode` defaults to `true` for the streaming Agent Mode API. Set it
|
|
774
|
+
to `false` to force legacy polling. Pre-stream feature-disabled or
|
|
775
|
+
preview-toggle responses fall back automatically.
|
|
763
776
|
- `defaultModel`, `modelOverride`, and `modelFuzzyMatch` control how loose model
|
|
764
777
|
names are resolved through Databricks Model Serving.
|
|
765
778
|
- `feedback` controls whether MLflow feedback routes are exposed. The automatic
|
package/index.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
|
|
5
5
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
|
|
6
|
-
export const PACKAGE_VERSION = "0.6.
|
|
6
|
+
export const PACKAGE_VERSION = "0.6.213";
|
|
7
7
|
export * as agents from "./src/agents.ts";
|
|
8
8
|
export * as chart from "./src/chart.ts";
|
|
9
9
|
export * as config from "./src/config.ts";
|
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export declare const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
|
|
2
|
-
export declare const PACKAGE_VERSION = "0.6.
|
|
2
|
+
export declare const PACKAGE_VERSION = "0.6.213";
|
|
3
3
|
export * as agents from "./src/agents.ts";
|
|
4
4
|
export * as chart from "./src/chart.ts";
|
|
5
5
|
export * as config from "./src/config.ts";
|
package/lib/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// Regenerated from the exporting modules in ./src.
|
|
3
3
|
// Hand edits are overwritten on the next watch; this file is read-only.
|
|
4
4
|
export const PACKAGE_IDENTIFIER = "@dbx-tools/appkit-mastra";
|
|
5
|
-
export const PACKAGE_VERSION = "0.6.
|
|
5
|
+
export const PACKAGE_VERSION = "0.6.213";
|
|
6
6
|
export * as agents from "./src/agents.js";
|
|
7
7
|
export * as chart from "./src/chart.js";
|
|
8
8
|
export * as config from "./src/config.js";
|
|
@@ -53,4 +53,4 @@ export { TYPOGRAPHY_RULE } from "./src/style.js";
|
|
|
53
53
|
export { TITLE_INSTRUCTIONS } from "./src/summarize.js";
|
|
54
54
|
export { TRACE_IO_LIMIT, MLFLOW_SPAN_INPUTS_ATTR, MLFLOW_SPAN_OUTPUTS_ATTR } from "./src/trace-io.js";
|
|
55
55
|
export { DEFAULT_SKILL_FOLDERS } from "./src/workspaces.js";
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSwwQkFBMEIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNMLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RKLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdqTCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFLaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc3RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMjEyXCI7XG5leHBvcnQgKiBhcyBhZ2VudHMgZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0ICogYXMgY2hhcnQgZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlc3lzdGVtcyBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMgaGlzdG9yeSBmcm9tIFwiLi9zcmMvaGlzdG9yeS50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBtY3AgZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0ICogYXMgbWVtb3J5IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCAqIGFzIG1sZmxvdyBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbCBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCAqIGFzIG9ic2VydmFiaWxpdHkgZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9jZXNzb3JzIGZyb20gXCIuL3NyYy9wcm9jZXNzb3JzLnRzXCI7XG5leHBvcnQgKiBhcyByZW1vdGVTa2lsbHMgZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCAqIGFzIHJlc3QgZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZlciBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nIGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nU2FuaXRpemUgZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxsUGF0aHMgZnJvbSBcIi4vc3JjL3NraWxsLXBhdGhzLnRzXCI7XG5leHBvcnQgKiBhcyBzdGF0ZW1lbnQgZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0ICogYXMgc3RvcmFnZVNjaGVtYSBmcm9tIFwiLi9zcmMvc3RvcmFnZS1zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHN0eWxlIGZyb20gXCIuL3NyYy9zdHlsZS50c1wiO1xuZXhwb3J0ICogYXMgc3VtbWFyaXplIGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCAqIGFzIHRocmVhZHMgZnJvbSBcIi4vc3JjL3RocmVhZHMudHNcIjtcbmV4cG9ydCAqIGFzIHRyYWNlSW8gZnJvbSBcIi4vc3JjL3RyYWNlLWlvLnRzXCI7XG5leHBvcnQgKiBhcyB2YWxpZGF0aW9uIGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2VzIGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgKiBhcyB3cml0ZXIgZnJvbSBcIi4vc3JjL3dyaXRlci50c1wiO1xuZXhwb3J0IHsgRkFMTEJBQ0tfQUdFTlRfSUQsIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMsIEFwcEtpdFRvb2xPcHRpb25zLCBUb29sa2l0T3B0aW9ucywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyLCBNYXN0cmFQbHVnaW5zLCBNYXN0cmFUb29sc0ZuLCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyLCBNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEJ1aWx0QWdlbnRzIH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHsgY2hhcnRQbGFuU2NoZW1hLCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhcnRQbGFubmVyUmVxdWVzdCwgQ2hhcnRUb29sT3V0cHV0LCBQcmVwYXJlQ2hhcnRPcHRpb25zLCBGZXRjaENoYXJ0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfUkVRVUVTVF9JRF9LRVksIE1BU1RSQV9TQ09QRVNfS0VZLCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUywgTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFVzZXIsIE1hc3RyYU1lbW9yeUNvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9hZEhpc3RvcnlPcHRpb25zLCBDbGVhckhpc3RvcnlPcHRpb25zLCBIaXN0b3J5Um91dGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2hpc3RvcnkudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE1vZGVsT3ZlcnJpZGVzIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBQZXJQYWdlQm91bmRzIH0gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCB7IE1hc3RyYVBsdWdpbiwgbWFzdHJhIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciwgUmVzdWx0UHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgTWFzdHJhU2VydmVyIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdHRyaWJ1dGVkSWRlbnRpdHksIE1hc3RyYUFwaUdhdGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsT3ZlcnJpZGVSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmluZ0NoYXRNZXNzYWdlIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEggfSBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IExpc3RUaHJlYWRzT3B0aW9ucywgRGVsZXRlVGhyZWFkT3B0aW9ucywgUmVuYW1lVGhyZWFkT3B0aW9ucywgVGhyZWFkc1JvdXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90aHJlYWRzLnRzXCI7XG5leHBvcnQgeyBUUkFDRV9JT19MSU1JVCwgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIsIE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiB9IGZyb20gXCIuL3NyYy90cmFjZS1pby50c1wiO1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFJc3N1ZXMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9TS0lMTF9GT0xERVJTIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlTW91bnRDb250ZXh0LCBTa2lsbEZvbGRlclZhbHVlLCBTa2lsbEZvbGRlck9wdGlvbnMsIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uLCBXb3Jrc3BhY2VNb3VudFJlc29sdmVyLCBEZWZhdWx0U2tpbGxGb2xkZXJOYW1lLCBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbiJdfQ==
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQ0FBMkM7QUFDM0MsbURBQW1EO0FBQ25ELHdFQUF3RTtBQUV4RSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztBQUM3RCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsU0FBUyxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxRQUFRLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssS0FBSyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLFFBQVEsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEtBQUssR0FBRyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEtBQUssTUFBTSxNQUFNLGlCQUFpQixDQUFDO0FBQzFDLE9BQU8sS0FBSyxNQUFNLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxZQUFZLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxLQUFLLElBQUksTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sS0FBSyxlQUFlLE1BQU0sMkJBQTJCLENBQUM7QUFDN0QsT0FBTyxLQUFLLFVBQVUsTUFBTSxzQkFBc0IsQ0FBQztBQUNuRCxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLEtBQUssTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEtBQUssU0FBUyxNQUFNLG9CQUFvQixDQUFDO0FBQ2hELE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxLQUFLLE1BQU0sTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RyxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkcsT0FBTyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSwwQkFBMEIsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTNMLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ3RKLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRS9ELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pFLE9BQU8sRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLHFCQUFxQixFQUFFLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSxhQUFhLEVBQUUsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdqTCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFLaEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUseUJBQXlCLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDakYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBR3hELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUc3RCxPQUFPLEVBQUUsNEJBQTRCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHeEQsT0FBTyxFQUFFLGNBQWMsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRXRHLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gR0VORVJBVEVEIGJ5IHByb2plbiB3YXRjaCAtIERPIE5PVCBFRElULlxuLy8gUmVnZW5lcmF0ZWQgZnJvbSB0aGUgZXhwb3J0aW5nIG1vZHVsZXMgaW4gLi9zcmMuXG4vLyBIYW5kIGVkaXRzIGFyZSBvdmVyd3JpdHRlbiBvbiB0aGUgbmV4dCB3YXRjaDsgdGhpcyBmaWxlIGlzIHJlYWQtb25seS5cblxuZXhwb3J0IGNvbnN0IFBBQ0tBR0VfSURFTlRJRklFUiA9IFwiQGRieC10b29scy9hcHBraXQtbWFzdHJhXCI7XG5leHBvcnQgY29uc3QgUEFDS0FHRV9WRVJTSU9OID0gXCIwLjYuMjEzXCI7XG5leHBvcnQgKiBhcyBhZ2VudHMgZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0ICogYXMgY2hhcnQgZnJvbSBcIi4vc3JjL2NoYXJ0LnRzXCI7XG5leHBvcnQgKiBhcyBjb25maWcgZnJvbSBcIi4vc3JjL2NvbmZpZy50c1wiO1xuZXhwb3J0ICogYXMgZGVmYXVsdHMgZnJvbSBcIi4vc3JjL2RlZmF1bHRzLnRzXCI7XG5leHBvcnQgKiBhcyBmaWxlc3lzdGVtcyBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCAqIGFzIGdlbmllIGZyb20gXCIuL3NyYy9nZW5pZS50c1wiO1xuZXhwb3J0ICogYXMgaGlzdG9yeSBmcm9tIFwiLi9zcmMvaGlzdG9yeS50c1wiO1xuZXhwb3J0ICogYXMgaWRlbnRpdHkgZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgKiBhcyBtY3AgZnJvbSBcIi4vc3JjL21jcC50c1wiO1xuZXhwb3J0ICogYXMgbWVtb3J5IGZyb20gXCIuL3NyYy9tZW1vcnkudHNcIjtcbmV4cG9ydCAqIGFzIG1sZmxvdyBmcm9tIFwiLi9zcmMvbWxmbG93LnRzXCI7XG5leHBvcnQgKiBhcyBtb2RlbCBmcm9tIFwiLi9zcmMvbW9kZWwudHNcIjtcbmV4cG9ydCAqIGFzIG9ic2VydmFiaWxpdHkgZnJvbSBcIi4vc3JjL29ic2VydmFiaWxpdHkudHNcIjtcbmV4cG9ydCAqIGFzIHBhZ2luYXRpb24gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCAqIGFzIHBsdWdpbiBmcm9tIFwiLi9zcmMvcGx1Z2luLnRzXCI7XG5leHBvcnQgKiBhcyBwcm9jZXNzb3JzIGZyb20gXCIuL3NyYy9wcm9jZXNzb3JzLnRzXCI7XG5leHBvcnQgKiBhcyByZW1vdGVTa2lsbHMgZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCAqIGFzIHJlc3QgZnJvbSBcIi4vc3JjL3Jlc3QudHNcIjtcbmV4cG9ydCAqIGFzIHNlcnZlciBmcm9tIFwiLi9zcmMvc2VydmVyLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nIGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgKiBhcyBzZXJ2aW5nU2FuaXRpemUgZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCAqIGFzIHNraWxsUGF0aHMgZnJvbSBcIi4vc3JjL3NraWxsLXBhdGhzLnRzXCI7XG5leHBvcnQgKiBhcyBzdGF0ZW1lbnQgZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0ICogYXMgc3RvcmFnZVNjaGVtYSBmcm9tIFwiLi9zcmMvc3RvcmFnZS1zY2hlbWEudHNcIjtcbmV4cG9ydCAqIGFzIHN0eWxlIGZyb20gXCIuL3NyYy9zdHlsZS50c1wiO1xuZXhwb3J0ICogYXMgc3VtbWFyaXplIGZyb20gXCIuL3NyYy9zdW1tYXJpemUudHNcIjtcbmV4cG9ydCAqIGFzIHRocmVhZHMgZnJvbSBcIi4vc3JjL3RocmVhZHMudHNcIjtcbmV4cG9ydCAqIGFzIHRyYWNlSW8gZnJvbSBcIi4vc3JjL3RyYWNlLWlvLnRzXCI7XG5leHBvcnQgKiBhcyB2YWxpZGF0aW9uIGZyb20gXCIuL3NyYy92YWxpZGF0aW9uLnRzXCI7XG5leHBvcnQgKiBhcyB3b3Jrc3BhY2VzIGZyb20gXCIuL3NyYy93b3Jrc3BhY2VzLnRzXCI7XG5leHBvcnQgKiBhcyB3cml0ZXIgZnJvbSBcIi4vc3JjL3dyaXRlci50c1wiO1xuZXhwb3J0IHsgRkFMTEJBQ0tfQUdFTlRfSUQsIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTLCBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OUyB9IGZyb20gXCIuL3NyYy9hZ2VudHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMsIEFwcEtpdFRvb2xPcHRpb25zLCBUb29sa2l0T3B0aW9ucywgTWFzdHJhUGx1Z2luVG9vbGtpdFByb3ZpZGVyLCBNYXN0cmFQbHVnaW5zLCBNYXN0cmFUb29sc0ZuLCBNYXN0cmFBZ2VudFdvcmtzcGFjZVJlc29sdmVyLCBNYXN0cmFBZ2VudERlZmluaXRpb24sIE1hc3RyYVN0b3JhZ2VDb25maWdPdmVycmlkZSwgTWFzdHJhTWVtb3J5Q29uZmlnT3ZlcnJpZGUsIEJ1aWx0QWdlbnRzIH0gZnJvbSBcIi4vc3JjL2FnZW50cy50c1wiO1xuZXhwb3J0IHsgY2hhcnRQbGFuU2NoZW1hLCBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLCBjaGFydFRvb2xPdXRwdXRTY2hlbWEgfSBmcm9tIFwiLi9zcmMvY2hhcnQudHNcIjtcbmV4cG9ydCB0eXBlIHsgQ2hhcnRQbGFubmVyUmVxdWVzdCwgQ2hhcnRUb29sT3V0cHV0LCBQcmVwYXJlQ2hhcnRPcHRpb25zLCBGZXRjaENoYXJ0T3B0aW9ucyB9IGZyb20gXCIuL3NyYy9jaGFydC50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCBNQVNUUkFfVVNFUl9OQU1FX0tFWSwgTUFTVFJBX1VTRVJfRU1BSUxfS0VZLCBNQVNUUkFfUkVRVUVTVF9JRF9LRVksIE1BU1RSQV9TQ09QRVNfS0VZLCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUywgTUFTVFJBX0NPTkZJR19TQ0hFTUEgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgdHlwZSB7IFVzZXIsIE1hc3RyYU1lbW9yeUNvbmZpZywgTWFzdHJhTWNwQ29uZmlnLCBNYXN0cmFQbHVnaW5Db25maWcgfSBmcm9tIFwiLi9zcmMvY29uZmlnLnRzXCI7XG5leHBvcnQgeyBtb2RlbENhdGFsb2d1ZURlZmF1bHRzLCBnZW5pZVN1Z2dlc3Rpb25EZWZhdWx0cywgc3RhdGVtZW50RGF0YURlZmF1bHRzLCBjaGFydEZldGNoRGVmYXVsdHMsIGZlZWRiYWNrV3JpdGVEZWZhdWx0cyB9IGZyb20gXCIuL3NyYy9kZWZhdWx0cy50c1wiO1xuZXhwb3J0IHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXIgfSBmcm9tIFwiLi9zcmMvZmlsZXN5c3RlbXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgTWFzdHJhRmlsZVN5c3RlbUFkYXB0ZXJPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2ZpbGVzeXN0ZW1zLnRzXCI7XG5leHBvcnQgeyBERUZBVUxUX0dFTklFX0FMSUFTLCBHRU5JRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgR2VuaWVTcGFjZUNvbmZpZywgR2VuaWVTcGFjZXNDb25maWcgfSBmcm9tIFwiLi9zcmMvZ2VuaWUudHNcIjtcbmV4cG9ydCB0eXBlIHsgTG9hZEhpc3RvcnlPcHRpb25zLCBDbGVhckhpc3RvcnlPcHRpb25zLCBIaXN0b3J5Um91dGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL2hpc3RvcnkudHNcIjtcbmV4cG9ydCB7IElERU5USVRZX0VOViwgSURFTlRJVFlfTU9ERVMsIERFRkFVTFRfSURFTlRJVFlfTU9ERSwgVVNFUl9JRF9IRUFERVIsIFVTRVJfRU1BSUxfSEVBREVSLCByZXF1ZXN0VXNlcklkLCByZXF1ZXN0VXNlckVtYWlsLCB1c2VTZXJ2aWNlUHJpbmNpcGFsIH0gZnJvbSBcIi4vc3JjL2lkZW50aXR5LnRzXCI7XG5leHBvcnQgdHlwZSB7IE1hc3RyYUlkZW50aXR5TW9kZSB9IGZyb20gXCIuL3NyYy9pZGVudGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBSZXNvbHZlZE1jcCB9IGZyb20gXCIuL3NyYy9tY3AudHNcIjtcbmV4cG9ydCB7IE1lbW9yeUJ1aWxkZXIgfSBmcm9tIFwiLi9zcmMvbWVtb3J5LnRzXCI7XG5leHBvcnQgdHlwZSB7IExvZ0ZlZWRiYWNrUGFyYW1zIH0gZnJvbSBcIi4vc3JjL21sZmxvdy50c1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZE1vZGVsT3ZlcnJpZGVzIH0gZnJvbSBcIi4vc3JjL21vZGVsLnRzXCI7XG5leHBvcnQgdHlwZSB7IEJ1aWxkT2JzZXJ2YWJpbGl0eU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvb2JzZXJ2YWJpbGl0eS50c1wiO1xuZXhwb3J0IHR5cGUgeyBQZXJQYWdlQm91bmRzIH0gZnJvbSBcIi4vc3JjL3BhZ2luYXRpb24udHNcIjtcbmV4cG9ydCB7IE1hc3RyYVBsdWdpbiwgbWFzdHJhIH0gZnJvbSBcIi4vc3JjL3BsdWdpbi50c1wiO1xuZXhwb3J0IHsgc3RyaXBTdGFsZUNoYXJ0c1Byb2Nlc3NvciwgUmVzdWx0UHJvY2Vzc29yIH0gZnJvbSBcIi4vc3JjL3Byb2Nlc3NvcnMudHNcIjtcbmV4cG9ydCB7IEFJVE9PTFNfU09VUkNFIH0gZnJvbSBcIi4vc3JjL3JlbW90ZS1za2lsbHMudHNcIjtcbmV4cG9ydCB0eXBlIHsgQWlUb29sc1NvdXJjZSwgUmVtb3RlU2tpbGxTb3VyY2VPcHRpb25zLCBSZW1vdGVTa2lsbFNvdXJjZSwgUmVtb3RlU2tpbGxzT3B0aW9uLCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLCBQcm92aXNpb25lZFJlbW90ZVNraWxscywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5LCBSZW1vdGVTa2lsbHNNZXRhZGF0YSB9IGZyb20gXCIuL3NyYy9yZW1vdGUtc2tpbGxzLnRzXCI7XG5leHBvcnQgdHlwZSB7IERhdGFicmlja3NGZXRjaEluaXQgfSBmcm9tIFwiLi9zcmMvcmVzdC50c1wiO1xuZXhwb3J0IHsgTWFzdHJhU2VydmVyIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHR5cGUgeyBBdHRyaWJ1dGVkSWRlbnRpdHksIE1hc3RyYUFwaUdhdGVPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3NlcnZlci50c1wiO1xuZXhwb3J0IHsgTUFTVFJBX01PREVMX09WRVJSSURFX0tFWSB9IGZyb20gXCIuL3NyYy9zZXJ2aW5nLnRzXCI7XG5leHBvcnQgdHlwZSB7IE1vZGVsT3ZlcnJpZGVSZXF1ZXN0IH0gZnJvbSBcIi4vc3JjL3NlcnZpbmcudHNcIjtcbmV4cG9ydCB0eXBlIHsgU2VydmluZ0NoYXRNZXNzYWdlIH0gZnJvbSBcIi4vc3JjL3NlcnZpbmctc2FuaXRpemUudHNcIjtcbmV4cG9ydCB7IEFTU0lTVEFOVF9TSEFSRURfU0tJTExTX1BBVEggfSBmcm9tIFwiLi9zcmMvc2tpbGwtcGF0aHMudHNcIjtcbmV4cG9ydCB7IFNUQVRFTUVOVF9ST1dfQ0FQIH0gZnJvbSBcIi4vc3JjL3N0YXRlbWVudC50c1wiO1xuZXhwb3J0IHsgVFlQT0dSQVBIWV9SVUxFIH0gZnJvbSBcIi4vc3JjL3N0eWxlLnRzXCI7XG5leHBvcnQgeyBUSVRMRV9JTlNUUlVDVElPTlMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IFN1bW1hcml6ZU9wdGlvbnMgfSBmcm9tIFwiLi9zcmMvc3VtbWFyaXplLnRzXCI7XG5leHBvcnQgdHlwZSB7IExpc3RUaHJlYWRzT3B0aW9ucywgRGVsZXRlVGhyZWFkT3B0aW9ucywgUmVuYW1lVGhyZWFkT3B0aW9ucywgVGhyZWFkc1JvdXRlT3B0aW9ucyB9IGZyb20gXCIuL3NyYy90aHJlYWRzLnRzXCI7XG5leHBvcnQgeyBUUkFDRV9JT19MSU1JVCwgTUxGTE9XX1NQQU5fSU5QVVRTX0FUVFIsIE1MRkxPV19TUEFOX09VVFBVVFNfQVRUUiB9IGZyb20gXCIuL3NyYy90cmFjZS1pby50c1wiO1xuZXhwb3J0IHR5cGUgeyBTY2hlbWFJc3N1ZXMgfSBmcm9tIFwiLi9zcmMvdmFsaWRhdGlvbi50c1wiO1xuZXhwb3J0IHsgREVGQVVMVF9TS0lMTF9GT0xERVJTIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbmV4cG9ydCB0eXBlIHsgV29ya3NwYWNlTW91bnRDb250ZXh0LCBTa2lsbEZvbGRlclZhbHVlLCBTa2lsbEZvbGRlck9wdGlvbnMsIFdvcmtzcGFjZU1vdW50Q29udHJpYnV0aW9uLCBXb3Jrc3BhY2VNb3VudFJlc29sdmVyLCBEZWZhdWx0U2tpbGxGb2xkZXJOYW1lLCBDcmVhdGVXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3dvcmtzcGFjZXMudHNcIjtcbiJdfQ==
|
package/lib/src/config.d.ts
CHANGED
|
@@ -351,6 +351,13 @@ export interface MastraPluginConfig extends BasePluginConfig {
|
|
|
351
351
|
* spaces config in two places.
|
|
352
352
|
*/
|
|
353
353
|
genieSpaces?: GenieSpacesConfig;
|
|
354
|
+
/**
|
|
355
|
+
* Use the streaming Genie Agent Mode API for `ask_genie`. Defaults to `true`.
|
|
356
|
+
* Set `false` to force the legacy Conversation API polling driver. A
|
|
357
|
+
* pre-stream feature-disabled or preview-toggle response falls back
|
|
358
|
+
* automatically.
|
|
359
|
+
*/
|
|
360
|
+
genieAgentMode?: boolean;
|
|
354
361
|
/**
|
|
355
362
|
* TTL for the in-memory Genie space metadata cache, in
|
|
356
363
|
* milliseconds. Defaults to 5 minutes. The Genie agent calls
|
package/lib/src/config.js
CHANGED
|
@@ -175,6 +175,10 @@ export const MASTRA_CONFIG_SCHEMA = {
|
|
|
175
175
|
additionalProperties: { type: ["string", "object"] },
|
|
176
176
|
description: "Genie spaces the agents can delegate to, keyed by alias (the tool-name suffix). Each value is a space id or `{ spaceId, hint }`. Falls back to the `genie` plugin's own `spaces` config, then DATABRICKS_GENIE_SPACE_ID under the `default` alias.",
|
|
177
177
|
},
|
|
178
|
+
genieAgentMode: {
|
|
179
|
+
type: "boolean",
|
|
180
|
+
description: "Use the streaming Genie Agent Mode API for ask_genie. Defaults to true; false forces legacy polling. Feature-disabled or preview-toggle responses fall back automatically before streaming.",
|
|
181
|
+
},
|
|
178
182
|
genieSpaceCacheTtlMs: {
|
|
179
183
|
type: "number",
|
|
180
184
|
description: "TTL in ms for the Genie space metadata cache. Defaults to 5 minutes.",
|
|
@@ -221,4 +225,4 @@ export const MASTRA_CONFIG_SCHEMA = {
|
|
|
221
225
|
},
|
|
222
226
|
},
|
|
223
227
|
};
|
|
224
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUs1RixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUd4RTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0FBRXpEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQXNCO0lBQzNELHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFB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QUNILElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7WUFDM0IsV0FBVyxFQUNULDRKQUE0SjtTQUMvSjtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsMkVBQTJFO1lBQzNFLDBFQUEwRTtZQUMxRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUN6QixXQUFXLEVBQ1QsNmZBQTZmO1NBQ2hnQjtRQUNELFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN4QixXQUFXLEVBQ1QscU9BQXFPO1NBQ3hPO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsMElBQTBJO1NBQzdJO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgc2hhcmVkIGBSZXF1ZXN0Q29udGV4dGAga2V5cy5cbiAqXG4gKiBPd25zIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdFxuICogY29uZmlnKSBhbmQge0BsaW5rIE1BU1RSQV9DT05GSUdfU0NIRU1BfSwgdGhlIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdFxuICogcHVibGlzaGVzIGZvciBpdCBzbyBzY2FmZm9sZGluZyB0b29scyBhbmQgYWdlbnRzIGNhbiByZWFkIHRoZSBvcHRpb24gc2V0LlxuICpcbiAqIFByZWNlZGVuY2UgcGVyIGZpZWxkIGlzIGV4cGxpY2l0IHBsdWdpbiBjb25maWcsIHRoZW4gdGhlIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZSBuYW1lZCBvbiB0aGUgZmllbGQsIHRoZW4gYSBidWlsdC1pbiBkZWZhdWx0LlxuICpcbiAqIEtlcHQgaW4gYSBsZWFmIG1vZHVsZSBzbyBgcGx1Z2luLnRzYCwgYHNlcnZlci50c2AsIGBtb2RlbC50c2AsIGFuZFxuICogYG1lbW9yeS50c2AgY2FuIGltcG9ydCB0aGVtIHdpdGhvdXQgY3JlYXRpbmcgYSBjeWNsZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIENvbmZpZ1NjaGVtYSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFUb29scyB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgeyBJREVOVElUWV9NT0RFUywgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVTa2lsbHNPcHRpb24gfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgdW5kZXIgd2hpY2gge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RvcmVzIHRoZVxuICogcmVzb2x2ZWQgQXBwS2l0IHVzZXIuIGBtb2RlbC50c2AgcmVhZHMgaXQgdG8gbWludCB1c2VyLXNjb3BlZFxuICogRGF0YWJyaWNrcyB0b2tlbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9LRVkgPSBcIm1hc3RyYV9fdXNlclwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5cyBmb3IgQXBwS2l0IHVzZXIgbWV0YWRhdGEgc3RhbXBlZCBieVxuICoge0BsaW5rIE1hc3RyYVNlcnZlcn0uIFN1cmZhY2VkIGFzIHRyYWNlIG1ldGFkYXRhIHZpYVxuICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBzbyB0cmFjZXMgYXJlIGZpbHRlcmFibGUgYnkgd2hvXG4gKiBpc3N1ZWQgdGhlIHJlcXVlc3Qgd2l0aG91dCBsZWFraW5nIHRoZSBmdWxsIHVzZXIgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfTkFNRV9LRVkgPSBcIm1hc3RyYV9fdXNlck5hbWVcIjtcbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9FTUFJTF9LRVkgPSBcIm1hc3RyYV9fdXNlckVtYWlsXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgZm9yIHRoZSBwZXItSFRUUC1yZXF1ZXN0IGlkIHN0YW1wZWQgYnlcbiAqIHtAbGluayBNYXN0cmFTZXJ2ZXJ9LiBSZWFkcyBgWC1SZXF1ZXN0LUlkYCBmcm9tIHRoZSBpbmNvbWluZ1xuICogaGVhZGVycyB3aGVuIHByZXNlbnQgKHNvIGFuIHVwc3RyZWFtIGxvYWQgYmFsYW5jZXIgLyBBUEkgZ2F0ZXdheVxuICogY2FuIGtlZXAgaXRzIHRyYWNlIGNvcnJlbGF0aW9uKSwgZmFsbHMgYmFjayB0byBhIGZyZXNobHkgbWludGVkXG4gKiBVVUlELiBFY2hvZWQgYmFjayBvbiB0aGUgcmVzcG9uc2UgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IHNwYW4gdmlhXG4gKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IHNvIGxvZ3MgYW5kIHRyYWNlcyBzaGFyZSBhXG4gKiBqb2luIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9SRVFVRVNUX0lEX0tFWSA9IFwibWFzdHJhX19yZXF1ZXN0SWRcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSBmb3IgT0F1dGggc2NvcGVzIHBhcnNlZCBmcm9tIHRoZSBmb3J3YXJkZWRcbiAqIGFjY2VzcyB0b2tlbiBieSB7QGxpbmsgTWFzdHJhU2VydmVyLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzfS5cbiAqIFdvcmtzcGFjZSBtb3VudHMgdGhhdCB0b3VjaCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcyByZXF1aXJlXG4gKiBgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIGluIHRoaXMgbGlzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9TQ09QRVNfS0VZID0gXCJtYXN0cmFfX3Njb3Blc1wiO1xuXG4vKipcbiAqIENhbm9uaWNhbCBsaXN0IG9mIGBSZXF1ZXN0Q29udGV4dGAga2V5cyB3ZSB3YW50IE1hc3RyYSB0byBleHRyYWN0XG4gKiBhcyBtZXRhZGF0YSBvbiBldmVyeSBvYnNlcnZhYmlsaXR5IHNwYW4gKGFnZW50IHJ1bnMsIG1vZGVsIGNhbGxzLFxuICogdG9vbCBpbnZvY2F0aW9ucywgd29ya2Zsb3cgc3RlcHMpLlxuICpcbiAqIE1pcnJvcnMge0BsaW5rIGh0dHBzOi8vbWFzdHJhLmFpL2RvY3Mvb2JzZXJ2YWJpbGl0eS90cmFjaW5nL292ZXJ2aWV3I2F1dG9tYXRpYy1tZXRhZGF0YS1mcm9tLXJlcXVlc3Rjb250ZXh0fTpcbiAqIHBhc3NlZCB2ZXJiYXRpbSBpbnRvIGBPYnNlcnZhYmlsaXR5LmNvbmZpZ3NbKl0ucmVxdWVzdENvbnRleHRLZXlzYCxcbiAqIHNvIGFueSBrZXkgbGlzdGVkIGhlcmUgaXMgcmVhZCBmcm9tIGBSZXF1ZXN0Q29udGV4dGAgYXQgdHJhY2VcbiAqIHN0YXJ0IGFuZCBhdHRhY2hlZCBhcyBzY2FsYXIgc3BhbiBtZXRhZGF0YS4gS2VlcCB0aGUgc2V0IHRvIHBsYWluXG4gKiBzY2FsYXJzIC0gbmV2ZXIgaW5jbHVkZSB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSAoaXQgY2FycmllcyB0aGVcbiAqIGZ1bGwgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggYSBgV29ya3NwYWNlQ2xpZW50YCByZWZlcmVuY2UpLlxuICpcbiAqIE9yZGVyIGlzIHB1cmVseSBjb3NtZXRpYzsgTWFzdHJhIGRlLWR1cGVzIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIC8vIE1vZGVsIG92ZXJyaWRlIGtleSBpcyBvd25lZCBieSBgc2VydmluZy50c2A7IHNwZWxsZWQgaW5saW5lIGhlcmVcbiAgLy8gc28gdGhpcyBtb2R1bGUgc3RheXMgbGVhZi1sZXZlbCAobm8gY3ljbGVzIHdpdGggYHNlcnZpbmcudHNgKS5cbiAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG5dO1xuXG4vKiogQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHBsdXMgdGhlIGNhbm9uaWNhbCB1c2VyIGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgaWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBpZGVudGl0eSBmb3IgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0OiB0aGUgT0JPIHVzZXIgaWQgb24gYVxuICogdXNlci1zY29wZWQgY2FsbCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkO1xufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgd2hpY2ggaXMgbm90IGFsd2F5cyB3aG9zZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWxcbiAqIHJ1bnMgaXQuIEFuIE9CTyBjb250ZXh0J3Mgb3duIHVzZXIgaWQgaXMgYXV0aG9yaXRhdGl2ZS4gVW5kZXIgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCwgZXZlcnkgY2FsbGVyIHNoYXJlcyBvbmUgY3JlZGVudGlhbCwgc28gdGhlIGZvcndhcmRlZCB1c2VyIGlkIGlzXG4gKiB3aGF0IGtlZXBzIG1lbW9yeSB0aHJlYWRzIGFuZCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2VzIGRpc3RpbmN0OyB0aGUgc2VydmljZVxuICogcHJpbmNpcGFsIGlkIGlzIHRoZSBmbG9vciB3aGVuIG5vIHVzZXIgd2FzIGZvcndhcmRlZC5cbiAqXG4gKiBUaGlzIHJ1bGUgaGFzIHRvIGJlIGlkZW50aWNhbCBldmVyeXdoZXJlIGEgY2FjaGUga2V5IGlzIGJ1aWx0LCBzbyBib3RoIHRoZVxuICogd3JpdGUgc2lkZSAodGhlIGBSZXF1ZXN0Q29udGV4dGAgdXNlciBzdGFtcGVkIGJ5IGBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcmApXG4gKiBhbmQgdGhlIHJlYWQgc2lkZSAodGhlIHBsdWdpbidzIG93biBBcHBLaXQgcm91dGVzLCB3aGljaCBoYXZlIGEgcmVxdWVzdCBidXRcbiAqIG5vIGBSZXF1ZXN0Q29udGV4dGApIGRlcml2ZSB0aGVpciBrZXkgZnJvbSB0aGlzIG9uZSBmdW5jdGlvbi4gV2hlbiB0aGUgdHdvXG4gKiBkaXNhZ3JlZWQsIGEgY2hhcnQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgd2FzIHJlYWQgYmFjayB1bmRlclxuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIGFuZCB0aGUgZW1iZWQgcm91dGUgYW5zd2VyZWQgNDA0LCB3aGljaCB0aGUgY2hhdCBVSVxuICogcmVuZGVycyBhcyBhbiBleHBpcmVkIGNoYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlZFVzZXJJZChcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlLFxuICBmb3J3YXJkZWRVc2VySWQ/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBpZiAoXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCkgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCk7XG4gIHJldHVybiBmb3J3YXJkZWRVc2VySWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChleGVjdXRpb25Db250ZXh0KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBldmVyeSBwZXItdXNlciBjYWNoZSBlbnRyeSBpcyBuYW1lc3BhY2VkIHVuZGVyLCBzbyBhbiBPQk8gcmVzdWx0XG4gKiBjYW5ub3QgYmUgcmVhZCBiYWNrIGJ5IGFub3RoZXIgY2FsbGVyLlxuICpcbiAqIFByZWZlcnMgdGhlIHtAbGluayBVc2VyfSB0aGF0IHtAbGluayBNYXN0cmFTZXJ2ZXJ9IHN0YW1wcyBvbiB0aGUgcmVxdWVzdFxuICogY29udGV4dCwgd2hvc2UgaWQgYWxyZWFkeSBmb2xsb3dzIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfS4gVGhlIE1DUCB0cmFuc3BvcnRcbiAqIHJvdXRlcyBkbyBub3QgdGhyZWFkIHRoYXQgY29udGV4dCBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyB0aG9zZSBmYWxsIGJhY2sgdG9cbiAqIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0ICh0aGUgYWN0aXZlIE9CTyBzY29wZSwgb3IgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCkuIEEgY2FsbGVyIGhvbGRpbmcgYW4gZXhwcmVzcyByZXF1ZXN0IHNob3VsZCBidWlsZCBpdHMga2V5IGZyb21cbiAqIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSBpbnN0ZWFkLCBzbyB0aGUgZm9yd2FyZGVkIHVzZXIgaXMgbm90IGxvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdXNlcj8uaWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCkpO1xufVxuXG4vKiogUGdWZWN0b3IgY29uZmlnIHdpdGggYW4gb3B0aW9uYWwgTWFzdHJhIHN0b3JlIGlkLiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnID0gUGdWZWN0b3JDb25maWcgJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXIgZXhwb3N1cmVcbiAqICh7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLm1jcH0pLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbDsgdGhlIG9iamVjdFxuICogZm9ybSBvbmx5IG5lZWRzIHRvIHNldCB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhTWNwQ29uZmlnIHtcbiAgLyoqXG4gICAqIFNlcnZlciBpZCB1c2VkIGluIHRoZSByb3V0ZSBwYXRoIChgL21jcC88c2VydmVySWQ+Ly4uLmApIGFuZCBhcyB0aGVcbiAgICogTUNQIHJlZ2lzdHJ5IGlkLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKi9cbiAgc2VydmVySWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gRGVmYXVsdHMgdG8gYFwiPGRpc3BsYXlOYW1lPiBNQ1BcImAuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTZW1hbnRpYyB2ZXJzaW9uIGFkdmVydGlzZWQgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGBcIjEuMC4wXCJgLiAqL1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHBvc2UgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBhcyBhbiBgYXNrXzxhZ2VudElkPmAgTUNQIHRvb2wuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYCAtIHRoaXMgaXMgdGhlIFwibGV2ZXJhZ2UgdGhlIE1hc3RyYSBhZ2VudHMgb3ZlclxuICAgKiBNQ1BcIiBiZWhhdmlvciBtb3N0IGNhbGxlcnMgd2FudC5cbiAgICovXG4gIGFnZW50cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbHNvIGV4cG9zZSB0aGUgcGx1Z2luJ3MgYW1iaWVudCB0b29scyAodGhlIGJ1aWx0LWluIGByZW5kZXJfZGF0YWBcbiAgICogcGx1cyBhbnl0aGluZyBpbiBgY29uZmlnLnRvb2xzYCkgYXMgTUNQIHRvb2xzLiBEZWZhdWx0cyB0byBgZmFsc2VgOlxuICAgKiB0aGUgYW1iaWVudCB0b29scyBhc3N1bWUgYW4gaW4tcHJvY2VzcyBjaGF0IHR1cm4gKHRoZXkgcHVibGlzaFxuICAgKiB3cml0ZXIgZXZlbnRzIHRoZSBjaGF0IFVJIGNvbnN1bWVzKSwgc28gdGhleSBhcmVuJ3QgdXNlZnVsIHRvIGFcbiAgICogc3RhbmRhbG9uZSBNQ1AgY2xpZW50LiBUdXJuIHRoaXMgb24gb25seSB3aGVuIHRob3NlIHRvb2xzIGFyZSBzYWZlXG4gICAqIHRvIGNhbGwgb3V0LW9mLWJhbmQuXG4gICAqL1xuICB0b29scz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFeHRyYSB0b29scyB0byBleHBvc2Ugb3ZlciBNQ1AgYmV5b25kIHRoZSBhZ2VudCAvIGFtYmllbnQgc2V0cy5cbiAgICogVXNlIHRoaXMgZm9yIHRvb2xzIHdyaXR0ZW4gc3BlY2lmaWNhbGx5IGZvciBNQ1AgY29uc3VtZXJzLlxuICAgKi9cbiAgZXh0cmFUb29scz86IE1hc3RyYVRvb2xzO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBhY2NlcHRlZCBieSB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogTWFzdHJhIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGlkLiBEZWZhdWx0cyB0byBgXCJkYXRhYnJpY2tzXCJgOyBubyBlbnYgZmFsbGJhY2suICovXG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQb3N0Z3Jlc1N0b3JlIGZvciBNYXN0cmEgdGhyZWFkcy9tZXNzYWdlcy4gYHRydWVgIHJldXNlcyB0aGVcbiAgICogYGxha2ViYXNlYCBwbHVnaW4ncyBwb29sOyBhbiBvYmplY3Qgb3BlbnMgYSBkZWRpY2F0ZWQgc3RvcmUuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IFBvc3RncmVzU3RvcmVDb25maWc7XG4gIC8qKlxuICAgKiBQZ1ZlY3RvciBzdG9yZSBmb3IgTWFzdHJhIG1lbW9yeSByZWNhbGwuIGB0cnVlYCByZXVzZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZztcbiAgLyoqXG4gICAqIENvZGUtZGVmaW5lZCBhZ2VudHMuIEFjY2VwdHMgdGhyZWUgc2hhcGVzIGZvciBjb252ZW5pZW5jZTpcbiAgICpcbiAgICogLSAqKlJlY29yZCoqOiBgeyBhbmFseXN0OiBkZWYsIGhlbHBlcjogZGVmIH1gIC0ga2V5cyBiZWNvbWUgdGhlXG4gICAqICAgcmVnaXN0ZXJlZCBpZHMgYW5kIHRoZSBmaXJzdCBrZXkgaXMgdGhlIGRlZmF1bHQuXG4gICAqIC0gKipTaW5nbGUgZGVmaW5pdGlvbioqOiBgZGVmYCAtIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgXCJkZWZhdWx0XCJgIHdoZW4gYG5hbWVgIGlzIG9taXR0ZWQpIGFuZFxuICAgKiAgIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHRoZSBkZWZhdWx0IGFnZW50LlxuICAgKiAtICoqQXJyYXkqKjogYFtkZWYxLCBkZWYyXWAgLSBlYWNoIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgYWdlbnRfJHtpfWAgd2hlbiBgbmFtZWAgaXMgb21pdHRlZCk7XG4gICAqICAgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBFYWNoIGVudHJ5IGJlY29tZXMgYSBNYXN0cmEgYEFnZW50YCByZWFjaGFibGUgYXRcbiAgICogYC9hcGkvPHBsdWdpbj4vcm91dGUvY2hhdC88aWQ+YCAodGhlIGNoYXQgcm91dGUgYWxzbyBtYXRjaGVzXG4gICAqIGA6YWdlbnRJZGApLiBXaGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHksIHRoZSBwbHVnaW5cbiAgICogcmVnaXN0ZXJzIGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlXG4gICAqIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nIGNoYXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBleGFtcGxlIFNpbmdsZS1hZ2VudCBzaG9ydGhhbmRcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIEFycmF5XG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiBbXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiYW5hbHlzdFwiLCBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiaGVscGVyXCIsIGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICBdLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFJlY29yZCAoZXhwbGljaXQgaWRzKVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czoge1xuICAgKiAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgIH0sXG4gICAqICAgZGVmYXVsdEFnZW50OiBcImFuYWx5c3RcIixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWdlbnRzPzogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbltdO1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzcHJlYWQgaW50byBldmVyeSByZWdpc3RlcmVkIGFnZW50J3MgdG9vbHMgcmVjb3JkO1xuICAgKiBwZXItYWdlbnQgdG9vbHMgd2luIG9uIGtleSBjb2xsaXNpb24uIFVzZSBmb3IgYSBzbWFsbCBzaGFyZWRcbiAgICogbGlicmFyeTsgZm9yIHBlci1hZ2VudCB0b29scyBzZXQgYGFnZW50c1tpZF0udG9vbHNgIGluc3RlYWQuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzO1xuICAvKipcbiAgICogQWdlbnQgaWQgdXNlZCB3aGVuIHRoZSBjbGllbnQgZG9lc24ndCBzcGVjaWZ5IG9uZSAodGhlIGJhcmUsXG4gICAqIHVuLXN1ZmZpeGVkIGhpc3RvcnkgLyBzdWdnZXN0aW9ucyByb3V0ZXMgcmVzb2x2ZSB0byBpdCkuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBrZXkgaW4gYGFnZW50c2AgKG9yIGBcImRlZmF1bHRcImAgd2hlblxuICAgKiBgYWdlbnRzYCBpcyBvbWl0dGVkKS4gTXVzdCBtYXRjaCBhbiBpZCBpbiBgYWdlbnRzYCB3aGVuIGJvdGggYXJlXG4gICAqIHNldDsgYSBtaXNtYXRjaCB0aHJvd3MgYXQgc2V0dXAgd2l0aCB0aGUgYXZhaWxhYmxlIGNhbmRpZGF0ZXMuXG4gICAqL1xuICBkZWZhdWx0QWdlbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbHVnaW4tbGV2ZWwgZGVmYXVsdCBtb2RlbCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzXG4gICAqIG93biBgbW9kZWxgLiBNaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICAgKlxuICAgKiAtIGBzdHJpbmdgOiBzaG9ydGhhbmQgZm9yIFwidXNlIHRoZSBPQk8gYXV0by1yZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCJgKS5cbiAgICogLSBBbnkgb3RoZXIgTWFzdHJhIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YDogcGFzc2VkXG4gICAqICAgdGhyb3VnaCB2ZXJiYXRpbS4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsIGNvbnRyb2wgb3ZlciBhdXRoXG4gICAqICAgb3IgYHByb3ZpZGVySWRgLlxuICAgKlxuICAgKiBSZXNvbHV0aW9uIG9yZGVyIHBlciBhZ2VudDogYGRlZi5tb2RlbGAg4oaSIGBkZWZhdWx0TW9kZWxgIOKGklxuICAgKiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIOKGkiBidWlsdC1pbiBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICAgKiByZXNvbHZlci5cbiAgICovXG4gIGRlZmF1bHRNb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyAoYFwiY2xhdWRlIHNvbm5ldFwiYCkgYWdhaW5zdCB0aGUgd29ya3NwYWNlJ3NcbiAgICogTW9kZWwgU2VydmluZyBlbmRwb2ludHMuIERlZmF1bHRzIHRvIGB0cnVlYDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBTZXQgYGZhbHNlYCB0byByZXF1aXJlIGV4YWN0IGVuZHBvaW50IG5hbWVzIGV2ZXJ5d2hlcmUuXG4gICAqL1xuICBtb2RlbEZ1enp5TWF0Y2g/OiBib29sZWFuO1xuICAvKipcbiAgICogRnVzZS5qcyBzY29yZSB0aHJlc2hvbGQgZm9yIHRoZSBmdXp6eSBtYXRjaGVyLCAwIChleGFjdCkgdG8gMSAoYW55dGhpbmcpLlxuICAgKiBEZWZhdWx0cyB0byBgMC40YDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBMb3dlciB2YWx1ZXMgcmVqZWN0IGxvb3NlIG1hdGNoZXM7IHJhaXNlIGl0IGlmIHlvdSBoYXZlIGEgc3ByYXdsaW5nXG4gICAqIGVuZHBvaW50IGNhdGFsb2d1ZSB3aXRoIHNpbWlsYXItbG9va2luZyBuYW1lcy5cbiAgICovXG4gIG1vZGVsRnV6enlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBEZWZhdWx0cyB0byA1IG1pbnV0ZXM7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogVGhlIGNhY2hlIGlzIHBlciB3b3Jrc3BhY2UgaG9zdCBhbmQgc2hhcmVkIGFjcm9zcyB1c2VyczsgY29uY3VycmVudFxuICAgKiBjYWxsZXJzIGNvYWxlc2NlIG9uIGEgc2luZ2xlIGluLWZsaWdodCBmZXRjaC5cbiAgICovXG4gIG1vZGVsQ2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIExldCBjbGllbnRzIHBpY2sgdGhlIGJhY2tpbmcgZW5kcG9pbnQgcGVyIHJlcXVlc3QuIERlZmF1bHRzIHRvIGB0cnVlYDtcbiAgICogbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBSZWFkcyB0aGUgYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXIsIHRoZSBgP21vZGVsPWAgcXVlcnkgc3RyaW5nLCBvciBhXG4gICAqIGBtb2RlbGAgYm9keSBmaWVsZCwgaW4gdGhhdCBvcmRlci4gRGlzYWJsZSB3aGVuIHJ1bm5pbmcgbXVsdGktdGVuYW50XG4gICAqIHdoZXJlIHVudHJ1c3RlZCBjbGllbnRzIHNob3VsZG4ndCBjaG9vc2UgdGhlIGVuZHBvaW50LlxuICAgKi9cbiAgbW9kZWxPdmVycmlkZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcmlvcml0eS1vcmRlcmVkIGxpc3Qgb2YgZW5kcG9pbnQgbmFtZXMgdHJpZWQgKmZpcnN0KiB3aGVuIG5vXG4gICAqIGFnZW50IC8gcGx1Z2luIC8gZW52IC8gcmVxdWVzdC1vdmVycmlkZSBtb2RlbCBpZCBpcyBzZXQsIGFoZWFkIG9mXG4gICAqIHRoZSBkeW5hbWljIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlLiBUaGUgcmVzb2x2ZXIgcGlja3MgdGhlXG4gICAqIGZpcnN0IGlkIHRoYXQgaXMgYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgd29ya3NwYWNlJ3NcbiAgICogYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZy5cbiAgICpcbiAgICogV2hlbiB1bnNldCwgcmVzb2x1dGlvbiBpcyBkcml2ZW4gYnkgdGhlIGxpdmUgRm91bmRhdGlvbiBNb2RlbCBBUElcbiAgICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXM6IGVuZHBvaW50cyBhcmUgY2xhc3NpZmllZCBpbnRvXG4gICAqIGNoYXQgY2xhc3NlcyAoYGNsYXNzaWZ5RW5kcG9pbnRzYCkgYW5kIHdhbGtlZCBiZXN0LWZpcnN0XG4gICAqIChDaGF0VGhpbmtpbmcgLT4gQ2hhdEJhbGFuY2VkIC0+IENoYXRGYXN0KSwgd2l0aCB0aGUgc21hbGwgYnVpbHQtaW5cbiAgICogYEZBTExCQUNLX01PREVMX0lEU2AgbGlzdCBhcyB0aGUgZmxvb3Igd2hlbiB0aGUgY2F0YWxvZ3VlIGNhbid0IGJlXG4gICAqIHJlYWQuIFNldCB0aGlzIHRvXG4gICAqIHBpbiBhIHJlZ3VsYXRlZCB3b3Jrc3BhY2UgdG8gYW4gYXBwcm92ZWQgc3Vic2V0LCBvciB0byBwdXQgY3VzdG9tXG4gICAqIGVuZHBvaW50cyBpbiBmcm9udCBvZiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbEZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKGRlZmF1bHQpLCBldmVyeSBhZ2VudCBnZXRzIGEgYnVpbHQtaW4gaW5wdXRcbiAgICogcHJvY2Vzc29yIHRoYXQgc3RyaXBzIGBjaGFydElkYCBmaWVsZHMgZnJvbSBwcmlvciBhc3Npc3RhbnRcbiAgICogdG9vbC1pbnZvY2F0aW9uIHJlc3VsdHMgYmVmb3JlIHRoZXkgcmVhY2ggdGhlIG1vZGVsLiBUaGlzXG4gICAqIHByZXZlbnRzIHRoZSBtb2RlbCBmcm9tIHJldXNpbmcgdHVybi1zY29wZWQgY2hhcnRJZHMgaXQgc2Vlc1xuICAgKiBpbiBtZW1vcnkgcmVjYWxsICh3aGljaCB3b3VsZCBsZWF2ZSBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzXG4gICAqIHBvaW50aW5nIGF0IHdyaXRlciBldmVudHMgdGhhdCBubyBsb25nZXIgZXhpc3QpLlxuICAgKlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBvcHQgb3V0IC0gdXNlZnVsIGlmIGEgbm9uLWRlZmF1bHQgYWdlbnRcbiAgICogbmVlZHMgZnVsbCB2aXNpYmlsaXR5IGludG8gcHJpb3IgY2hhcnRJZHMgKGUuZy4gYW4gYXVkaXRcbiAgICogYWdlbnQgcmVhc29uaW5nIGFib3V0IGNoYXJ0IGxpbmVhZ2UpLlxuICAgKi9cbiAgc3RyaXBTdGFsZUNoYXJ0cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICAgKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCB0aHJvd2F3YXlcbiAgICogY2xvc2VycywgZXhjZXNzaXZlIGhlZGdpbmcpLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogdXNlIHRoZSBidWlsdC1pblxuICAgKiAgIGBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OU2AgZnJvbSBgYWdlbnRzLnRzYC5cbiAgICogLSBgc3RyaW5nYDogcmVwbGFjZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSBzdXBwbGllZCBibG9jay5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIGVudGlyZWx5IChhZ2VudHMgc2VlIG9ubHkgdGhlaXIgYmVzcG9rZVxuICAgKiAgIGBpbnN0cnVjdGlvbnNgKS5cbiAgICpcbiAgICogQXBwZW5kZWQgKG5vdCBwcmVwZW5kZWQpIHNvIHRoZSBhZ2VudCdzIHJvbGUgYW5kIHJ1bGVzIGNvbWUgZmlyc3RcbiAgICogYW5kIHRoZSBzdHlsZSBibG9jayBsZWFucyBvbiB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMuXG4gICAqL1xuICBzdHlsZUluc3RydWN0aW9ucz86IHN0cmluZyB8IGZhbHNlO1xuICAvKipcbiAgICogR2VuaWUgc3BhY2VzIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIGNhbiBkZWxlZ2F0ZSB0by4gT25lIE1hc3RyYVxuICAgKiB0b29sIGlzIHJlZ2lzdGVyZWQgcGVyIGFsaWFzIChgZ2VuaWVgIGZvciB0aGUgd2VsbC1rbm93blxuICAgKiBgZGVmYXVsdGAgYWxpYXMsIGBnZW5pZV88YWxpYXM+YCBvdGhlcndpc2UpLiBFYWNoIHRvb2wgc3BpbnNcbiAgICogdXAgYSBwZXItcXVlc3Rpb24gR2VuaWUgc3ViLWFnZW50IHRoYXQgcnVucyBEYXRhYnJpY2tzXG4gICAqIFwiYWdlbnQgbW9kZVwiIGFnYWluc3QgdGhlIHNwYWNlLCBicm9hZGNhc3RzIHdpcmUgZXZlbnRzIHRvIHRoZVxuICAgKiBVSSwgZmV0Y2hlcyBzdGF0ZW1lbnQgcm93cyBmb3Igbm9uLWVtcHR5IHJlc3VsdHMsIGFuZCByZXR1cm5zXG4gICAqIGEgYChzdHJpbmcgfCBkYXRhIHwgY2hhcnQpW11gIHN1bW1hcnkgdGhlIGhvc3QgVUkgcmVuZGVyc1xuICAgKiBpbmxpbmUuXG4gICAqXG4gICAqIEVudHJpZXMgYWNjZXB0IGVpdGhlciBhIGZ1bGwge0BsaW5rIEdlbmllU3BhY2VDb25maWd9IG9iamVjdFxuICAgKiBvciBhIGJhcmUgYHNwYWNlX2lkYCBzdHJpbmcgd2hlbiBubyBleHRyYXMgYXJlIG5lZWRlZDpcbiAgICpcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBnZW5pZVNwYWNlczoge1xuICAgKiAgICAgZGVmYXVsdDogXCIwMWVmMGQzYzBlMWIxZjRhOGQyYzNlNGY1YTZiN2M4ZFwiLFxuICAgKiAgICAgZm9yZWNhc3RzOiB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiLCBoaW50OiBcIndlZWtseSBkZW1hbmQgZm9yZWNhc3RzXCIgfSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJlYWNoIHRoZSBzcGFjZXMgZnJvbSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgdmlhXG4gICAqIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgOyB0aGUgcmVzdWx0aW5nIHRvb2xzIGFjY2VwdFxuICAgKiBgeyBjb250ZW50LCBjb252ZXJzYXRpb25JZD8gfWAgYW5kIHJldHVybiBhIGh5ZHJhdGVkIHN1bW1hcnkuXG4gICAqXG4gICAqICoqRmFsbGJhY2sgZGlzY292ZXJ5KiogKGhpZ2hlc3QgcHJlY2VkZW5jZSBmaXJzdCk6IGlmIHRoaXNcbiAgICogZmllbGQgaXMgb21pdHRlZCwgdGhlIEdlbmllIGFnZW50IGFsc28gcGlja3MgdXAgc3BhY2VzIGZyb21cbiAgICogKDEpIHRoZSBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2VcbiAgICogd2hlbiByZWdpc3RlcmVkLCBhbmQgKDIpIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGBcbiAgICogZW52IHZhciAocmVnaXN0ZXJlZCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzKS4gVGhpcyBrZWVwc1xuICAgKiBleGlzdGluZyBBcHBLaXQgZGVwbG95bWVudHMgd29ya2luZyB3aXRob3V0IHJlc3RhdGluZyB0aGVcbiAgICogc3BhY2VzIGNvbmZpZyBpbiB0d28gcGxhY2VzLlxuICAgKi9cbiAgZ2VuaWVTcGFjZXM/OiBHZW5pZVNwYWNlc0NvbmZpZztcbiAgLyoqXG4gICAqIFRUTCBmb3IgdGhlIGluLW1lbW9yeSBHZW5pZSBzcGFjZSBtZXRhZGF0YSBjYWNoZSwgaW5cbiAgICogbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuIFRoZSBHZW5pZSBhZ2VudCBjYWxsc1xuICAgKiBgY2xpZW50LmdlbmllLmdldFNwYWNlKC4uLilgIG9uIGV2ZXJ5IGNvbGQtc3RhcnQgdG8gZ2V0IHRoZVxuICAgKiB0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkOyBjYWNoZWQgcmVzcG9uc2VzIHNraXAgdGhlXG4gICAqIHJvdW5kLXRyaXAgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZVxuICAgKiBpbi1mbGlnaHQgZmV0Y2guIERyb3AgdG8gYSBzbWFsbGVyIHZhbHVlIHdoZW4gYW5hbHlzdHMgYXJlXG4gICAqIGFjdGl2ZWx5IGVkaXRpbmcgc3BhY2UgbWV0YWRhdGEgYW5kIHlvdSB3YW50IGNoYW5nZXMgdmlzaWJsZVxuICAgKiB3aXRoaW4gc2Vjb25kczsgcmFpc2UgaXQgdG8gYW1vcnRpc2UgdGhlIHJvdW5kLXRyaXAgd2hlblxuICAgKiBzcGFjZSBtZXRhZGF0YSBpcyBlZmZlY3RpdmVseSBmcm96ZW4uXG4gICAqXG4gICAqIEJhY2tlZCBieSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYCwgc28gdGhlIGNhY2hlIHBhcnRpY2lwYXRlc1xuICAgKiBpbiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSBhbmQgYmVuZWZpdHMgZnJvbVxuICAgKiBMYWtlYmFzZSBwZXJzaXN0ZW5jZSB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAgICovXG4gIGdlbmllU3BhY2VDYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuLiBPbmUgc3RlcCA9IG9uZVxuICAgKiByb3VuZC10cmlwIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIChhIHRvb2wgY2FsbCBjb25zdW1lcyBhXG4gICAqIHN0ZXAsIHRoZSBmaW5hbC10ZXh0IHJlcGx5IGNvbnN1bWVzIG9uZSB0b28pLiBBcHBsaWVzIHRvXG4gICAqIGV2ZXJ5IGFnZW50IHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50c31cbiAgICogLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFyZW4ndCBzdXJmYWNlZCB5ZXQgYmVjYXVzZSB0aGUgc2FtZVxuICAgKiBjZWlsaW5nIGhhcyBiZWVuIHN1ZmZpY2llbnQgYWNyb3NzIGV2ZXJ5IHdvcmtsb2FkIHdlJ3ZlIHJ1bi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTfSAoMjUpLCBzaXplZCB0byBmaXRcbiAgICogYSBkZWNvbXBvc2VkIEdlbmllIHR1cm4gKGdyb3VuZGluZyArIHNldmVyYWwgYGFza19nZW5pZWAgY2FsbHNcbiAgICogKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICAgKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gICAqIGFuc3dlcmluZy4gTWFzdHJhJ3Mgb3duIGBhZ2VudC5nZW5lcmF0ZWAgZGVmYXVsdCBvZiA1IHdvdWxkXG4gICAqIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIGFmdGVyIDItMyB0b29sIGNhbGxzLCBzb1xuICAgKiBleHBsaWNpdGx5IHJhaXNpbmcgdGhlIGNlaWxpbmcgaGVyZSBpcyB3aGF0IGxldHMgdGhlXG4gICAqIGFnZW50LW1vZGUgbG9vcCBwbGF5IG91dC5cbiAgICpcbiAgICogTG93ZXIgd2hlbiBhbiB1bnVzdWFsbHkgc2xvdyBvciBleHBlbnNpdmUgbW9kZWwgbWFrZXMgbG9uZ1xuICAgKiB0dXJucyB1bmFmZm9yZGFibGU7IHJhaXNlIGZvciBleHBsb3JhdG9yeSB3b3JrbG9hZHMgdGhhdCBuZWVkXG4gICAqIHRvIGRyaWxsIGRlZXAgaW50byBhIGRhdGFzZXQgd2l0aGluIGEgc2luZ2xlIHR1cm4uXG4gICAqL1xuICBhZ2VudE1heFN0ZXBzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2lyZSBNYXN0cmEgc3BhbnMgaW50byBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSB2aWFcbiAgICogYEBtYXN0cmEvb3RlbC1icmlkZ2VgLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogb24gb25seSB3aGVuXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgb3JcbiAgICogICBgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVGAgaXMgc2V0LiBXaGVuIHVuc2V0LCB0aGVcbiAgICogICBicmlkZ2UgaXMgc2tpcHBlZCBzbyBNYXN0cmEgZG9lcyBub3QgbG9nXG4gICAqICAgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW4gZm91bmRgIG9uIHRoZSBub29wIHRyYWNlci5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uIGV2ZW4gd2l0aG91dCBhbiBPVExQIGVuZHBvaW50LlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi5cbiAgICovXG4gIG9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuICAvKipcbiAgICogTG9nIHVzZXIgZmVlZGJhY2sgKHRodW1icyB1cC9kb3duICsgZnJlZWZvcm0gY29tbWVudHMpIHRvIE1MZmxvdyBhc1xuICAgKiB0cmFjZSBhc3Nlc3NtZW50cywgYW5kIHN1cmZhY2UgdGhlIGZlZWRiYWNrIGNvbnRyb2xzIGluIHRoZSBjaGF0IFVJLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogZW5hYmxlZCBvbmx5IHdoZW4gTUxmbG93IHRyYWNpbmcgaXNcbiAgICogICB3aXJlZCAtIGFuIE9UTFAgZXhwb3J0ZXIgZW5kcG9pbnQgaXMgc2V0IGFuZCBhbiBNTGZsb3cgZXhwZXJpbWVudFxuICAgKiAgIGlzIG5hbWVkICh0aGUgc2FtZSBzaWduYWxzIHRoZSBvYnNlcnZhYmlsaXR5IHBpcGVsaW5lIG5lZWRzIHRvXG4gICAqICAgc2hpcCB0cmFjZXMgdG8gTUxmbG93KS4gT3RoZXJ3aXNlIG9mZiwgc2luY2UgdGhlcmUnZCBiZSBubyB0cmFjZVxuICAgKiAgIHRvIGF0dGFjaCBmZWVkYmFjayB0by5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uLiBGZWVkYmFjayBjb250cm9scyBzaG93IGFuZCB3cml0ZXMgYXJlIGF0dGVtcHRlZFxuICAgKiAgIHJlZ2FyZGxlc3Mgb2YgZW52IGRldGVjdGlvbiAodXNlIHdoZW4gdGhlIGVudiBpcyBjb25maWd1cmVkIGluIGFcbiAgICogICB3YXkgdGhlIGF1dG8tcHJvYmUgZG9lc24ndCByZWNvZ25pemUpLlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi4gTm8gdHJhY2UtaWQgaGVhZGVyLCBubyBmZWVkYmFjayByb3V0ZSwgbm8gVUkuXG4gICAqXG4gICAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHVybidzIE1MZmxvdyB0cmFjZSB2aWEgdGhlIE9wZW5UZWxlbWV0cnlcbiAgICogdHJhY2UgaWQgdGhlIHNlcnZlciBzdGFtcHMgb24gZWFjaCByZXNwb25zZTsgc2VlIGBtbGZsb3cudHNgLlxuICAgKi9cbiAgZmVlZGJhY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogRXhwb3NlIHRoZSBwbHVnaW4ncyBhZ2VudHMgKGFuZCBvcHRpb25hbGx5IHRvb2xzKSBhcyBhIE1hc3RyYSBNQ1BcbiAgICogc2VydmVyIHNvIGV4dGVybmFsIE1DUCBjbGllbnRzIC0gQ2xhdWRlIERlc2t0b3AsIEN1cnNvciwgdGhlIE1hc3RyYVxuICAgKiBwbGF5Z3JvdW5kLCBvciBhbm90aGVyIGFnZW50IC0gY2FuIGNhbGwgdGhlbSBvdmVyIHRoZSBzdGFuZGFyZCBNQ1BcbiAgICogdHJhbnNwb3J0cy4gRW5hYmxlZCBieSBkZWZhdWx0IChhZ2VudHMgb25seSk6IHdyYXBwaW5nIHRoZVxuICAgKiBhbHJlYWR5LXJlZ2lzdGVyZWQgYWdlbnRzIGNvc3RzIG5vdGhpbmcgZXh0cmEsIHNvIHRoZSBlbmRwb2ludCBpcyBvblxuICAgKiBvdXQgb2YgdGhlIGJveDsgb25seSB0aGUgYW1iaWVudCB0b29scyAod2hpY2ggYXNzdW1lIGFuIGluLXByb2Nlc3NcbiAgICogY2hhdCB0dXJuKSBzdGF5IG9mZiB1bmxlc3MgZXhwbGljaXRseSBvcHRlZCBpbi5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCkgLyBgdHJ1ZWA6IGV4cG9zZSBldmVyeSByZWdpc3RlcmVkIGFnZW50IGFzXG4gICAqICAgYW4gYGFza188YWdlbnRJZD5gIE1DUCB0b29sIHVuZGVyIGEgc2VydmVyIHdob3NlIGlkIGlzIHRoZSBwbHVnaW5cbiAgICogICBuYW1lLlxuICAgKiAtIGBmYWxzZWA6IG5vIE1DUCBlbmRwb2ludHMuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1jcENvbmZpZ306IGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIHNlcnZlciBpZCxcbiAgICogICBhZHZlcnRpc2VkIG1ldGFkYXRhLCBhbmQgd2hpY2ggYWdlbnRzIC8gdG9vbHMgYXJlIGV4cG9zZWQuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIHN0b2NrIE1hc3RyYSBNQ1Agcm91dGVzIG1vdW50IHVuZGVyIHRoZSBwbHVnaW4nc1xuICAgKiBiYXNlIHBhdGggKG5vIGJlc3Bva2Ugcm91dGUgaXMgYWRkZWQgLSB0aGUgc2VydmVyIGlzIGhhbmRlZCB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdmlhIGBtY3BTZXJ2ZXJzYCwgd2hpY2ggYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzKTpcbiAgICpcbiAgICogLSBTdHJlYW1hYmxlIEhUVFA6IGBQT1NUIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vbWNwYFxuICAgKiAtIFNTRSAobGVnYWN5KTogICAgYEdFVCAgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9zc2VgXG4gICAqICAgICAgICAgICAgICAgICAgICBgUE9TVCAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L21lc3NhZ2VzYFxuICAgKlxuICAgKiBSZXF1ZXN0cyBydW4gdW5kZXIgdGhlIHNhbWUgQXBwS2l0IE9CTyBzY29wZSBhcyB0aGUgY2hhdCByb3V0ZXMsIHNvXG4gICAqIGFuIGFnZW50IGludm9rZWQgb3ZlciBNQ1AgcmVzb2x2ZXMgaXRzIG1vZGVsIGFuZCB0b29scyBhcyB0aGVcbiAgICogY2FsbGluZyB1c2VyLlxuICAgKi9cbiAgbWNwPzogYm9vbGVhbiB8IE1hc3RyYU1jcENvbmZpZztcbiAgLyoqXG4gICAqIEhvdyBtdWNoIG9mIHRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBtYW5hZ2VtZW50IEFQSSBpcyByZWFjaGFibGVcbiAgICogdGhyb3VnaCB0aGUgcGx1Z2luIG1vdW50LiBgQG1hc3RyYS9leHByZXNzYCByZWdpc3RlcnMgaXRzIGZ1bGwgcm91dGVcbiAgICogdGFibGUgKGFnZW50IGluZmVyZW5jZSBwbHVzIGFkbWluIC8gbXV0YXRpbmcgcm91dGVzOiBkaXJlY3QgdG9vbFxuICAgKiBleGVjdXRpb24sIHdvcmtmbG93IGNvbnRyb2wsIHJhdyBtZW1vcnkgcmVhZC93cml0ZSwgdGVsZW1ldHJ5LCBsb2dzLFxuICAgKiBzY29yZXMpLiBBcHBLaXQgYWxyZWFkeSBhdXRoZW50aWNhdGVzIGV2ZXJ5IHJlcXVlc3QgYXMgdGhlIE9CTyB1c2VyLFxuICAgKiBidXQgbm90aGluZyB0aGVyZSByZXN0cmljdHMgKndoaWNoKiBvZiB0aG9zZSBvcGVyYXRpb25zIHRoZSBicm93c2VyXG4gICAqIGNsaWVudCBtYXkgaW52b2tlLlxuICAgKlxuICAgKiAtIGBcInNjb3BlZFwiYCAoZGVmYXVsdCk6IG9ubHkgdGhlIHJvdXRlcyB0aGUgY2hhdCBjbGllbnQgbGVnaXRpbWF0ZWx5XG4gICAqICAgbmVlZHMgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhIC0gYWdlbnQgaW5mZXJlbmNlXG4gICAqICAgKGBzdHJlYW1gIC8gYGdlbmVyYXRlYCAvIGBuZXR3b3JrYCksIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpc1xuICAgKiAgIHBsdWdpbidzIG93biBPQk8tIGFuZCByZXNvdXJjZS1zY29wZWQgYC9yb3V0ZS8qYCByb3V0ZXMgKGhpc3RvcnkgL1xuICAgKiAgIHRocmVhZHMpLCBhbmQsIHdoZW4ge0BsaW5rIG1jcH0gaXMgZW5hYmxlZCwgdGhlIE1DUCB0cmFuc3BvcnQuXG4gICAqICAgRXZlcnl0aGluZyBlbHNlICh0b29sIGV4ZWN1dGlvbiwgd29ya2Zsb3cgY29udHJvbCwgcmF3IG1lbW9yeSxcbiAgICogICB0ZWxlbWV0cnksIGxvZ3MsIHNjb3JlcywgYW5kIG90aGVyIG11dGF0aW9ucykgaXMgcmVqZWN0ZWQgd2l0aFxuICAgKiAgIGA0MDNgIGJlZm9yZSBpdCByZWFjaGVzIE1hc3RyYS5cbiAgICogLSBgXCJmdWxsXCJgOiBkaXNwYXRjaCB0aGUgZW50aXJlIHN0b2NrIE1hc3RyYSBBUEkuIFVzZSBvbmx5IGZvciBhXG4gICAqICAgdHJ1c3RlZCBmaXJzdC1wYXJ0eSBjb25zb2xlIHRoYXQgZ2VudWluZWx5IG5lZWRzIHRoZSBtYW5hZ2VtZW50XG4gICAqICAgc3VyZmFjZS5cbiAgICovXG4gIGFwaUFjY2Vzcz86IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqXG4gICAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgdGhlIGFnZW50cycgd29ya3NwYWNlIGNhbGxzIHJ1biBhczogdGhlXG4gICAqIHNlcnZpbmctZW5kcG9pbnQgY2F0YWxvZ3VlIGJlaGluZCB0aGUgbW9kZWwgcGlja2VyLCBHZW5pZSBzdWdnZXN0aW9ucyxcbiAgICogYGFza19nZW5pZWAsIGFuZCB0aGUgU3RhdGVtZW50IEV4ZWN1dGlvbiBmZXRjaCBiZWhpbmQgYSBgW2RhdGE6PGlkPl1gXG4gICAqIGVtYmVkLiBGYWxscyBiYWNrIHRvIGBNQVNUUkFfR0VOSUVfSURFTlRJVFlgLCB0aGVuIGBcInVzZXJcImAuXG4gICAqXG4gICAqIE9uLWJlaGFsZi1vZiAoT0JPKSBhdXRoIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBtZW1iZXIgb2YgdGhlXG4gICAqIFdPUktTUEFDRSwgbm90IGp1c3Qgb2YgdGhlIERhdGFicmlja3MgYWNjb3VudC4gQW4gYXBwIHNoYXJlZCB3aXRoIGFuXG4gICAqIGFjY291bnQtbGV2ZWwgZ3JvdXAgY2FuIGJlIG9wZW5lZCBieSBzb21lb25lIHdob3NlIHRva2VuIGlzIHZhbGlkIGJ1dCB3aG9zZVxuICAgKiBldmVyeSB3b3Jrc3BhY2UgY2FsbCBmYWlscyB3aXRoIGBVbmF1dGhvcml6ZWQgYWNjZXNzIHRvIE9yZzogPGlkPmAgLSBhbmRcbiAgICogZ3JhbnRpbmcgd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwgc2luY2UgYSB3b3Jrc3BhY2VcbiAgICogY2FwcyBtZW1iZXJzaGlwIHdlbGwgYmVsb3cgdGhlIHNpemUgb2YgYSBsYXJnZSBhY2NvdW50J3MgdXNlciBncm91cC4gVGhlXG4gICAqIGFwcCdzIHNlcnZpY2UgcHJpbmNpcGFsIGFscmVhZHkgaG9sZHMgdGhlIGdyYW50cyB0aGUgYXBwIHdhcyBkZXBsb3llZCB3aXRoLlxuICAgKlxuICAgKiAtIGBcInVzZXJcImAgKGRlZmF1bHQpOiBhbHdheXMgT0JPLiBQZXItdXNlciBhdHRyaWJ1dGlvbiwgYW5kIEdlbmllIC8gVW5pdHlcbiAgICogICBDYXRhbG9nIHJvdyBmaWx0ZXJzIGFwcGx5IHBlciB1c2VyLiBDb3JyZWN0IHdoZW4gZXZlcnkgY2FsbGVyIGlzIGFcbiAgICogICB3b3Jrc3BhY2UgbWVtYmVyLlxuICAgKiAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgOiBhbHdheXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbC4gTmVlZHMgbm8gT0JPXG4gICAqICAgc2NvcGVzIGFuZCB3b3JrcyBmb3IgYW55IGNhbGxlciB3aG8gY2FuIG9wZW4gdGhlIGFwcCwgYXQgdGhlIGNvc3Qgb2ZcbiAgICogICBwZXItdXNlciBhdHRyaWJ1dGlvbiBpbiBHZW5pZSAvIFVuaXR5IENhdGFsb2cuXG4gICAqIC0gYFwiYXV0b1wiYDogT0JPIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBhbiBPQk8gdG9rZW4sIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICAgKiAgIHdoZW4gaXQgZG9lcyBub3QuIEZvciBhbiBhcHAgc2VydmluZyBCT1RIIHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yIGFuZCBhXG4gICAqICAgZG9vciB0aGF0IGhhcyBubyB0b2tlbiB0byBmb3J3YXJkIC0gYSBgQGRieC10b29scy90dW5uZWxgIGdhdGUsIGFcbiAgICogICBUZWFtcyBjaGFubmVsIC0gd2hlcmUgQXBwS2l0J3MgYGFzVXNlcmAgd291bGQgb3RoZXJ3aXNlIHRocm93XG4gICAqICAgYEF1dGhlbnRpY2F0aW9uRXJyb3JgIG91dHNpZGUgYE5PREVfRU5WPWRldmVsb3BtZW50YC5cbiAgICpcbiAgICogVGhlIHNlcnZpY2UtcHJpbmNpcGFsIHBhdGggY2hhbmdlcyBvbmx5IHRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwuIE1lbW9yeVxuICAgKiB0aHJlYWRzLCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdHJhY2UgbWV0YWRhdGEgc3RpbGwga2V5IG9mZiB0aGVcbiAgICogZm9yd2FyZGVkIHVzZXIsIHNvIGNhbGxlcnMgc2hhcmluZyB0aGUgc2VydmljZSBwcmluY2lwYWwncyBkYXRhIGFjY2VzcyBrZWVwXG4gICAqIHNlcGFyYXRlIGNvbnZlcnNhdGlvbnMgYW5kIGNhbm5vdCByZWFkIGVhY2ggb3RoZXIncyB0aHJlYWRzIG9yIGNoYXJ0cy5cbiAgICpcbiAgICogQGV4YW1wbGUgQW4gYXBwIGFueSBhY2NvdW50IHVzZXIgY2FuIG9wZW5cbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJzZXJ2aWNlLXByaW5jaXBhbFwiLCBnZW5pZVNwYWNlczogeyBkZWZhdWx0OiBzcGFjZUlkIH0gfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBPbmUgYXBwIGJlaGluZCBib3RoIHRoZSBmcm9udCBkb29yIGFuZCBhIHB1YmxpYyB0dW5uZWxcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJhdXRvXCIsIGdlbmllU3BhY2VzOiB7IGRlZmF1bHQ6IHNwYWNlSWQgfSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBnZW5pZUlkZW50aXR5PzogTWFzdHJhSWRlbnRpdHlNb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGNoYXJ0cyBwcm9kdWNlZCBieSB0aGUgYnVpbHQtaW5cbiAgICogYHJlbmRlcl9kYXRhYCAvIGBwcmVwYXJlX2NoYXJ0YCB0b29scy4gV2hlbiBzZXQsIHRoZSBjaGFydCBwbGFubmVyJ3NcbiAgICogRWNoYXJ0cyBvdXRwdXQgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3MgcGFsZXR0ZSAoc2VyaWVzIGNvbG9ycyBkZXJpdmVkXG4gICAqIGZyb20gYGNvbG9ycy5wcmltYXJ5YCAvIGBjb2xvcnMuYWNjZW50YCkgYW5kIHNhbnMgZm9udFxuICAgKiAoYHR5cG9ncmFwaHkuc2Fuc2ApIGluc3RlYWQgb2YgRWNoYXJ0cycgZGVmYXVsdHMuIE9taXQgZm9yIHRoZSBkZWZhdWx0XG4gICAqIEVjaGFydHMgbG9vay5cbiAgICpcbiAgICogUGFzcyB0aGUgcG9ydGFibGUge0BsaW5rIEJyYW5kQ29udGV4dH0gc2hhcmVkIGFjcm9zcyB0aGUgVUkgYW5kXG4gICAqIGxpYnJhcmllcyAoZS5nLiBgYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dGAgZnJvbSBgQGRieC10b29scy9zaGFyZWQtY29yZWAsXG4gICAqIG9yIGEgY3VzdG9tZXIgYnJhbmQpIC0gdGhlIHNhbWUgb2JqZWN0IHRoZSBlbWFpbCBhZGQtb24gYW5kIHRoZSBVSVxuICAgKiBgQnJhbmRQcm92aWRlcmAgY29uc3VtZSwgc28gYSBob3N0IHRoZW1lcyBjaGFydHMsIGVtYWlsLCBhbmQgVUkgZnJvbSBvbmVcbiAgICogc291cmNlLlxuICAgKi9cbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQ7XG4gIC8qKlxuICAgKiBSZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBtYXRlcmlhbGl6ZWQgb25jZSBhdCBhcHAgc3RhcnR1cC4gQSBzaW5nbGVcbiAgICogc291cmNlLCBhIGxpc3QsIG9yIGEgYHsgc291cmNlcywgZmFpbE9uRXJyb3I/LCAuLi4gfWAgYmFnLlxuICAgKlxuICAgKiBFYWNoIHNvdXJjZSBpcyBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGEgZ2l0IC8gR2l0TGFiIFVSTCwgb3IgYSBkaXJlY3RcbiAgICogYFNLSUxMLm1kYCAvIGFyY2hpdmUgZG93bmxvYWQgVVJMLiBSZXNvbHV0aW9uIHByZWZlcnMgdGhlIE9QVElPTkFMIGBza2lsbHNgXG4gICAqIG5wbSBDTEkgKGEgcGVlciBkZXApIHdoaWNoIGlzIGNvcGllZCBpbnRvIGEgdGVtcCBkaXIgYW5kIHRoZW4gcGVyc2lzdGVkO1xuICAgKiB3aXRob3V0IGl0LCBhIFVSTCBzb3VyY2UgaXMgZmV0Y2hlZCBkaXJlY3RseS4gQSBzb3VyY2UgdGhhdCByZXNvbHZlc1xuICAgKiB0aHJvdWdoIG5laXRoZXIgZmFpbHMgc3RhcnR1cCB1bmxlc3MgYGZhaWxPbkVycm9yOiBmYWxzZWAuXG4gICAqXG4gICAqIFByb3Zpc2lvbmVkIHNraWxscyBhcmUgd3JpdHRlbiB0byB0aGUgRGF0YWJyaWNrcyB1c2VyJ3MgQXNzaXN0YW50IHNraWxsc1xuICAgKiBmb2xkZXIgKGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2AsIHRoZSBcInNhdmUgdGhpcyBhcyBhIHNraWxsXCJcbiAgICogdGFyZ2V0KSBzbyB0aGV5IHBlcnNpc3QgYW5kIGFyZSBwaWNrZWQgdXAgYnkgdGhlIGJ1aWx0LWluIEFzc2lzdGFudC1za2lsbHNcbiAgICogbW91bnQuIFdpdGggbm8gd3JpdGFibGUgd29ya3NwYWNlLCB0aGV5IGdvIHRvIGEgbG9jYWwgdGVtcCBkaXIgaW5zdGVhZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgcmVtb3RlU2tpbGxzOiBcInZlcmNlbC1sYWJzL2FnZW50LXNraWxsc1wiIH0pO1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIHJlbW90ZVNraWxsczoge1xuICAgKiAgICAgc291cmNlczogW1widmVyY2VsLWxhYnMvYWdlbnQtc2tpbGxzXCIsIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9za2lsbC5tZFwiXSxcbiAgICogICAgIGZhaWxPbkVycm9yOiBmYWxzZSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICByZW1vdGVTa2lsbHM/OiBSZW1vdGVTa2lsbHNPcHRpb247XG59XG5cbi8qKlxuICogSlNPTiBTY2hlbWEgcHVibGlzaGVkIG9uIHRoZSBtYW5pZmVzdCdzIGBjb25maWcuc2NoZW1hYCwgbWlycm9yaW5nIHRoZVxuICogZG9jdW1lbnRlZCBkZWZhdWx0cyBhbmQgZW52aXJvbm1lbnQgZmFsbGJhY2tzIG9mIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWd9LlxuICpcbiAqIENvdmVycyB0aGUgSlNPTi1leHByZXNzaWJsZSBvcHRpb25zIG9ubHkuIGBhZ2VudHNgLCBgdG9vbHNgLCBhbmQgYVxuICogYGRlZmF1bHRNb2RlbGAgcGFzc2VkIGFzIGEgTWFzdHJhIGBEeW5hbWljQXJndW1lbnRgIGFyZSBjb2RlLWRlZmluZWRcbiAqIChmdW5jdGlvbnMgLyBjbGFzcyBpbnN0YW5jZXMpLCBzbyB0aGV5IGNhcnJ5IG5vIHNjaGVtYSBlbnRyeTsgdGhlXG4gKiBgZGVmYXVsdE1vZGVsYCBwcm9wZXJ0eSBiZWxvdyBkZXNjcmliZXMgaXRzIHN0cmluZyBmb3JtLlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX0NPTkZJR19TQ0hFTUE6IENvbmZpZ1NjaGVtYSA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgcHJvcGVydGllczoge1xuICAgIHByb3ZpZGVySWQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogJ01hc3RyYSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBpZC4gRGVmYXVsdHMgdG8gXCJkYXRhYnJpY2tzXCIuJyxcbiAgICB9LFxuICAgIHJlbW90ZVNraWxsczoge1xuICAgICAgdHlwZTogW1wic3RyaW5nXCIsIFwiYXJyYXlcIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1JlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIHByb3Zpc2lvbmVkIGF0IHN0YXJ0dXA6IFwiYWl0b29sc1wiIGZvciBEYXRhYnJpY2tzXFwnIG93biBza2lsbCBzZXQgKHJlYWQgZnJvbSB0aGUgcHVibGljIGRhdGFicmlja3MvZGF0YWJyaWNrcy1hZ2VudC1za2lsbHMgcmVwbywgbm8gQ0xJIG5lZWRlZCksIGEgR2l0SHViIG93bmVyL3JlcG8sIGEgZ2l0L0dpdExhYiBVUkwsIG9yIGEgZGlyZWN0IFNLSUxMLm1kL2FyY2hpdmUgVVJMLiBOb24tYWl0b29scyBzb3VyY2VzIHByZWZlciB0aGUgb3B0aW9uYWwgYHNraWxsc2AgbnBtIENMSSwgZWxzZSBhIGRpcmVjdCBmZXRjaDsgZmFpbHMgc3RhcnR1cCBvbiBlcnJvciB1bmxlc3MgZmFpbE9uRXJyb3I6ZmFsc2UuIFdyaXR0ZW4gdG8gdGhlIERhdGFicmlja3MgdXNlciBBc3Npc3RhbnQgc2tpbGxzIGZvbGRlciwgb3IgYSBsb2NhbCB0ZW1wIGRpciB3aGVuIG5vIHdvcmtzcGFjZSBpcyB3cml0YWJsZS4nLFxuICAgIH0sXG4gICAgc3RvcmFnZToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBvc3RncmVzU3RvcmUgZm9yIE1hc3RyYSB0aHJlYWRzIC8gbWVzc2FnZXMuIGB0cnVlYCByZXVzZXMgdGhlIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbCwgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLiBBdXRvLWVuYWJsZWQgd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC5cIixcbiAgICB9LFxuICAgIG1lbW9yeToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBnVmVjdG9yIHN0b3JlIGZvciBNYXN0cmEgc2VtYW50aWMgcmVjYWxsLiBgdHJ1ZWAgcmV1c2VzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbidzIHBvb2wsIGFuIG9iamVjdCBvcGVucyBhIGRlZGljYXRlZCBzdG9yZS4gQXV0by1lbmFibGVkIHdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0QWdlbnQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBZ2VudCBpZCB1c2VkIHdoZW4gdGhlIGNsaWVudCBuYW1lcyBub25lLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBhZ2VudCwgZWxzZSB0aGUgYnVpbHQtaW4gYGRlZmF1bHRgLlwiLFxuICAgIH0sXG4gICAgZGVmYXVsdE1vZGVsOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU2VydmluZyBlbmRwb2ludCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzIG93biBtb2RlbC4gRmFsbHMgYmFjayB0byBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRSwgdGhlbiB0aGUgYXV0by1yZXNvbHZlZCBjYXRhbG9ndWUuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0TW9kZWxGYWxsYmFja3M6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByaW9yaXR5LW9yZGVyZWQgZW5kcG9pbnQgbmFtZXMgdHJpZWQgYmVmb3JlIHRoZSBzY29yZS1jbGFzc2lmaWVkIGNhdGFsb2d1ZSB3aGVuIG5vdGhpbmcgZWxzZSBwaW5zIGEgbW9kZWwuXCIsXG4gICAgfSxcbiAgICBtb2RlbEZ1enp5TWF0Y2g6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRnV6enktbWF0Y2ggbG9vc2UgbW9kZWwgbmFtZXMgYWdhaW5zdCB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZS4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIG1vZGVsRnV6enlUaHJlc2hvbGQ6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXNlLmpzIHNjb3JlIHRocmVzaG9sZCBmb3IgdGhlIGZ1enp5IG1hdGNoZXIsIDAgKGV4YWN0KSB0byAxIChhbnl0aGluZykuIERlZmF1bHRzIHRvIDAuNC5cIixcbiAgICB9LFxuICAgIG1vZGVsQ2FjaGVUdGxNczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlRUTCBpbiBtcyBmb3IgdGhlIHNlcnZpbmctZW5kcG9pbnRzIGxpc3QgY2FjaGUsIHBlciB3b3Jrc3BhY2UgaG9zdC4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLlwiLFxuICAgIH0sXG4gICAgbW9kZWxPdmVycmlkZToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIb25vciBhIHBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlIGZyb20gdGhlIFgtTWFzdHJhLU1vZGVsIGhlYWRlciwgP21vZGVsPSBxdWVyeSwgb3IgYSBgbW9kZWxgIGJvZHkgZmllbGQuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBnZW5pZVNwYWNlczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7IHR5cGU6IFtcInN0cmluZ1wiLCBcIm9iamVjdFwiXSB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiR2VuaWUgc3BhY2VzIHRoZSBhZ2VudHMgY2FuIGRlbGVnYXRlIHRvLCBrZXllZCBieSBhbGlhcyAodGhlIHRvb2wtbmFtZSBzdWZmaXgpLiBFYWNoIHZhbHVlIGlzIGEgc3BhY2UgaWQgb3IgYHsgc3BhY2VJZCwgaGludCB9YC4gRmFsbHMgYmFjayB0byB0aGUgYGdlbmllYCBwbHVnaW4ncyBvd24gYHNwYWNlc2AgY29uZmlnLCB0aGVuIERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQgdW5kZXIgdGhlIGBkZWZhdWx0YCBhbGlhcy5cIixcbiAgICB9LFxuICAgIGdlbmllU3BhY2VDYWNoZVR0bE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVFRMIGluIG1zIGZvciB0aGUgR2VuaWUgc3BhY2UgbWV0YWRhdGEgY2FjaGUuIERlZmF1bHRzIHRvIDUgbWludXRlcy5cIixcbiAgICB9LFxuICAgIGFnZW50TWF4U3RlcHM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNYXhpbXVtIExMTSBzdGVwcyBlYWNoIGFnZW50IGdldHMgcGVyIHR1cm4gKGEgdG9vbCBjYWxsIGFuZCB0aGUgZmluYWwgcmVwbHkgZWFjaCBjb25zdW1lIG9uZSkuIERlZmF1bHRzIHRvIDI1LlwiLFxuICAgIH0sXG4gICAgc3RyaXBTdGFsZUNoYXJ0czoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTdHJpcCBjaGFydElkcyBmcm9tIHJlY2FsbGVkIGFzc2lzdGFudCB0b29sIHJlc3VsdHMgc28gdGhlIG1vZGVsIGNhbm5vdCByZXVzZSBhIHR1cm4tc2NvcGVkIGNoYXJ0IG1hcmtlci4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIHN0eWxlSW5zdHJ1Y3Rpb25zOiB7XG4gICAgICB0eXBlOiBbXCJzdHJpbmdcIiwgXCJib29sZWFuXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy4gQSBzdHJpbmcgcmVwbGFjZXMgdGhlIGJ1aWx0LWluIGJsb2NrLCBgZmFsc2VgIGRpc2FibGVzIGl0LlwiLFxuICAgIH0sXG4gICAgb2JzZXJ2YWJpbGl0eToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJCcmlkZ2UgTWFzdHJhIHNwYW5zIGludG8gQXBwS2l0J3MgT1RlbCBwaXBlbGluZS4gRGVmYXVsdHMgdG8gb24gb25seSB3aGVuIE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVCBvciBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UIGlzIHNldC5cIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkxvZyB0aHVtYnMgLyBjb21tZW50IGFzc2Vzc21lbnRzIHRvIE1MZmxvdyBhbmQgc3VyZmFjZSB0aGUgZmVlZGJhY2sgY29udHJvbHMuIERlZmF1bHRzIHRvIG9uIG9ubHkgd2hlbiBhbiBPVExQIGVuZHBvaW50IGFuZCBNTEZMT1dfRVhQRVJJTUVOVF9JRCBvciBNTEZMT1dfRVhQRVJJTUVOVF9OQU1FIGFyZSBzZXQuXCIsXG4gICAgfSxcbiAgICBtY3A6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFeHBvc2UgdGhlIHJlZ2lzdGVyZWQgYWdlbnRzIG92ZXIgTUNQLiBEZWZhdWx0cyB0byBhZ2VudHMtb25seTsgYW4gb2JqZWN0IHR1bmVzIHRoZSBzZXJ2ZXIgaWQsIGFkdmVydGlzZWQgbWV0YWRhdGEsIGFuZCB3aGV0aGVyIGFtYmllbnQgdG9vbHMgYXJlIGV4cG9zZWQuXCIsXG4gICAgfSxcbiAgICBnZW5pZUlkZW50aXR5OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgLy8gRGVyaXZlZCBmcm9tIHRoZSByZXNvbHZlcidzIG93biBsaXN0LCBzbyBhIG1vZGUgY2FuIG5ldmVyIGJlIGFjY2VwdGVkIGF0XG4gICAgICAvLyBydW50aW1lIHdoaWxlIHRoZSBwdWJsaXNoZWQgc2NoZW1hIChhbmQgdGhlIFVJIGJ1aWx0IGZyb20gaXQpIG9taXRzIGl0LlxuICAgICAgZW51bTogWy4uLklERU5USVRZX01PREVTXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnV2hpY2ggRGF0YWJyaWNrcyBpZGVudGl0eSB0aGUgYWdlbnRzXFwnIHdvcmtzcGFjZSBjYWxscyAoc2VydmluZyBjYXRhbG9ndWUsIEdlbmllLCBzdGF0ZW1lbnQgZXhlY3V0aW9uKSBydW4gYXMuIFwidXNlclwiIChkZWZhdWx0KSBpcyBhbHdheXMgT0JPLCBzbyBjYWxsZXJzIG11c3QgYmUgd29ya3NwYWNlIG1lbWJlcnM7IFwic2VydmljZS1wcmluY2lwYWxcIiBhbHdheXMgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLCBzbyBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwIHdvcmtzLCBhdCB0aGUgY29zdCBvZiBwZXItdXNlciBhdHRyaWJ1dGlvbjsgXCJhdXRvXCIgdXNlcyBPQk8gd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIGFuIE9CTyB0b2tlbiBhbmQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIHdoZW4gaXQgZG9lcyBub3QsIGZvciBhbiBhcHAgdGhhdCBhbHNvIHNlcnZlcyBhIHR1bm5lbCBvciB3ZWJob29rIGRvb3IuIEZhbGxzIGJhY2sgdG8gTUFTVFJBX0dFTklFX0lERU5USVRZLicsXG4gICAgfSxcbiAgICBhcGlBY2Nlc3M6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJzY29wZWRcIiwgXCJmdWxsXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdIb3cgbXVjaCBvZiB0aGUgc3RvY2sgQG1hc3RyYS9leHByZXNzIEFQSSBpcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbW91bnQuIFwic2NvcGVkXCIgKGRlZmF1bHQpIGFsbG93cyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpcyBwbHVnaW5cXCdzIG93biByb3V0ZXMsIGFuZCBNQ1A7IFwiZnVsbFwiIGRpc3BhdGNoZXMgdGhlIGVudGlyZSBtYW5hZ2VtZW50IHN1cmZhY2UuJyxcbiAgICB9LFxuICAgIGJyYW5kOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9ydGFibGUgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGdlbmVyYXRlZCBjaGFydHMgKHNlcmllcyBwYWxldHRlIGZyb20gY29sb3JzLnByaW1hcnkgLyBjb2xvcnMuYWNjZW50LCBiYXNlIGZvbnQgZnJvbSB0eXBvZ3JhcGh5LnNhbnMpLlwiLFxuICAgIH0sXG4gIH0sXG59O1xuIl19
|
|
228
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUVILE9BQU8sRUFBRSxtQkFBbUIsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUtuRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUs1RixPQUFPLEVBQUUsY0FBYyxFQUEyQixNQUFNLGVBQWUsQ0FBQztBQUd4RTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLGNBQWMsQ0FBQztBQUU5Qzs7Ozs7R0FLRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUFDO0FBQ3ZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLG1CQUFtQixDQUFDO0FBRXpEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsbUJBQW1CLENBQUM7QUFFekQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQztBQUVsRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQXNCO0lBQzNELHNCQUFzQjtJQUN0QixvQkFBb0I7SUFDcEIscUJBQXFCO0lBQ3JCLG9CQUFvQjtJQUNwQixxQkFBcUI7SUFDckIsbUVBQW1FO0lBQ25FLGlFQUFpRTtJQUNqRSx3QkFBd0I7Q0FDekIsQ0FBQztBQVFGOzs7R0FHRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxPQUFvQztJQUN6RSxPQUFPLFFBQVEsSUFBSSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUM7QUFDdEUsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFB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QUNSLElBQUksRUFBRSxTQUFTO1lBQ2YsV0FBVyxFQUNULHFMQUFxTDtTQUN4TDtRQUNELEdBQUcsRUFBRTtZQUNILElBQUksRUFBRSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUM7WUFDM0IsV0FBVyxFQUNULDRKQUE0SjtTQUMvSjtRQUNELGFBQWEsRUFBRTtZQUNiLElBQUksRUFBRSxRQUFRO1lBQ2QsMkVBQTJFO1lBQzNFLDBFQUEwRTtZQUMxRSxJQUFJLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztZQUN6QixXQUFXLEVBQ1QsNmZBQTZmO1NBQ2hnQjtRQUNELFNBQVMsRUFBRTtZQUNULElBQUksRUFBRSxRQUFRO1lBQ2QsSUFBSSxFQUFFLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQztZQUN4QixXQUFXLEVBQ1QscU9BQXFPO1NBQ3hPO1FBQ0QsS0FBSyxFQUFFO1lBQ0wsSUFBSSxFQUFFLFFBQVE7WUFDZCxXQUFXLEVBQ1QsMElBQTBJO1NBQzdJO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBQbHVnaW4gY29uZmlndXJhdGlvbiB0eXBlcyBhbmQgc2hhcmVkIGBSZXF1ZXN0Q29udGV4dGAga2V5cy5cbiAqXG4gKiBPd25zIHRoZSB0eXBlZCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnfSAodGhlIHBsdWdpbidzIHNsaWNlIG9mIEFwcEtpdFxuICogY29uZmlnKSBhbmQge0BsaW5rIE1BU1RSQV9DT05GSUdfU0NIRU1BfSwgdGhlIEpTT04gU2NoZW1hIHRoZSBtYW5pZmVzdFxuICogcHVibGlzaGVzIGZvciBpdCBzbyBzY2FmZm9sZGluZyB0b29scyBhbmQgYWdlbnRzIGNhbiByZWFkIHRoZSBvcHRpb24gc2V0LlxuICpcbiAqIFByZWNlZGVuY2UgcGVyIGZpZWxkIGlzIGV4cGxpY2l0IHBsdWdpbiBjb25maWcsIHRoZW4gdGhlIGVudmlyb25tZW50XG4gKiB2YXJpYWJsZSBuYW1lZCBvbiB0aGUgZmllbGQsIHRoZW4gYSBidWlsdC1pbiBkZWZhdWx0LlxuICpcbiAqIEtlcHQgaW4gYSBsZWFmIG1vZHVsZSBzbyBgcGx1Z2luLnRzYCwgYHNlcnZlci50c2AsIGBtb2RlbC50c2AsIGFuZFxuICogYG1lbW9yeS50c2AgY2FuIGltcG9ydCB0aGVtIHdpdGhvdXQgY3JlYXRpbmcgYSBjeWNsZS5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgZ2V0RXhlY3V0aW9uQ29udGV4dCwgdHlwZSBCYXNlUGx1Z2luQ29uZmlnLCB0eXBlIENvbmZpZ1NjaGVtYSB9IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB7IGFwcGtpdCB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBCcmFuZENvbnRleHQgfSBmcm9tIFwiQGRieC10b29scy9zaGFyZWQtY29yZVwiO1xuaW1wb3J0IHR5cGUgeyBBZ2VudENvbmZpZyB9IGZyb20gXCJAbWFzdHJhL2NvcmUvYWdlbnRcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTUFTVFJBX1JFU09VUkNFX0lEX0tFWSwgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHR5cGUgeyBQZ1ZlY3RvckNvbmZpZywgUG9zdGdyZXNTdG9yZUNvbmZpZyB9IGZyb20gXCJAbWFzdHJhL3BnXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhQWdlbnREZWZpbml0aW9uLCBNYXN0cmFUb29scyB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHR5cGUgeyBHZW5pZVNwYWNlc0NvbmZpZyB9IGZyb20gXCIuL2dlbmllLnRzXCI7XG5pbXBvcnQgeyBJREVOVElUWV9NT0RFUywgdHlwZSBNYXN0cmFJZGVudGl0eU1vZGUgfSBmcm9tIFwiLi9pZGVudGl0eS50c1wiO1xuaW1wb3J0IHR5cGUgeyBSZW1vdGVTa2lsbHNPcHRpb24gfSBmcm9tIFwiLi9yZW1vdGUtc2tpbGxzLnRzXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgdW5kZXIgd2hpY2gge0BsaW5rIE1hc3RyYVNlcnZlcn0gc3RvcmVzIHRoZVxuICogcmVzb2x2ZWQgQXBwS2l0IHVzZXIuIGBtb2RlbC50c2AgcmVhZHMgaXQgdG8gbWludCB1c2VyLXNjb3BlZFxuICogRGF0YWJyaWNrcyB0b2tlbnMuXG4gKi9cbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9LRVkgPSBcIm1hc3RyYV9fdXNlclwiO1xuXG4vKipcbiAqIGBSZXF1ZXN0Q29udGV4dGAga2V5cyBmb3IgQXBwS2l0IHVzZXIgbWV0YWRhdGEgc3RhbXBlZCBieVxuICoge0BsaW5rIE1hc3RyYVNlcnZlcn0uIFN1cmZhY2VkIGFzIHRyYWNlIG1ldGFkYXRhIHZpYVxuICoge0BsaW5rIFRSQUNFX1JFUVVFU1RfQ09OVEVYVF9LRVlTfSBzbyB0cmFjZXMgYXJlIGZpbHRlcmFibGUgYnkgd2hvXG4gKiBpc3N1ZWQgdGhlIHJlcXVlc3Qgd2l0aG91dCBsZWFraW5nIHRoZSBmdWxsIHVzZXIgb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX1VTRVJfTkFNRV9LRVkgPSBcIm1hc3RyYV9fdXNlck5hbWVcIjtcbmV4cG9ydCBjb25zdCBNQVNUUkFfVVNFUl9FTUFJTF9LRVkgPSBcIm1hc3RyYV9fdXNlckVtYWlsXCI7XG5cbi8qKlxuICogYFJlcXVlc3RDb250ZXh0YCBrZXkgZm9yIHRoZSBwZXItSFRUUC1yZXF1ZXN0IGlkIHN0YW1wZWQgYnlcbiAqIHtAbGluayBNYXN0cmFTZXJ2ZXJ9LiBSZWFkcyBgWC1SZXF1ZXN0LUlkYCBmcm9tIHRoZSBpbmNvbWluZ1xuICogaGVhZGVycyB3aGVuIHByZXNlbnQgKHNvIGFuIHVwc3RyZWFtIGxvYWQgYmFsYW5jZXIgLyBBUEkgZ2F0ZXdheVxuICogY2FuIGtlZXAgaXRzIHRyYWNlIGNvcnJlbGF0aW9uKSwgZmFsbHMgYmFjayB0byBhIGZyZXNobHkgbWludGVkXG4gKiBVVUlELiBFY2hvZWQgYmFjayBvbiB0aGUgcmVzcG9uc2UgYW5kIHN1cmZhY2VkIG9uIGV2ZXJ5IHNwYW4gdmlhXG4gKiB7QGxpbmsgVFJBQ0VfUkVRVUVTVF9DT05URVhUX0tFWVN9IHNvIGxvZ3MgYW5kIHRyYWNlcyBzaGFyZSBhXG4gKiBqb2luIGtleS5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9SRVFVRVNUX0lEX0tFWSA9IFwibWFzdHJhX19yZXF1ZXN0SWRcIjtcblxuLyoqXG4gKiBgUmVxdWVzdENvbnRleHRgIGtleSBmb3IgT0F1dGggc2NvcGVzIHBhcnNlZCBmcm9tIHRoZSBmb3J3YXJkZWRcbiAqIGFjY2VzcyB0b2tlbiBieSB7QGxpbmsgTWFzdHJhU2VydmVyLmNvbmZpZ3VyZVJlcXVlc3RDb250ZXh0U2NvcGVzfS5cbiAqIFdvcmtzcGFjZSBtb3VudHMgdGhhdCB0b3VjaCBEYXRhYnJpY2tzIHdvcmtzcGFjZSBmaWxlcyByZXF1aXJlXG4gKiBgd29ya3NwYWNlYCBvciBgYWxsLWFwaXNgIGluIHRoaXMgbGlzdC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1BU1RSQV9TQ09QRVNfS0VZID0gXCJtYXN0cmFfX3Njb3Blc1wiO1xuXG4vKipcbiAqIENhbm9uaWNhbCBsaXN0IG9mIGBSZXF1ZXN0Q29udGV4dGAga2V5cyB3ZSB3YW50IE1hc3RyYSB0byBleHRyYWN0XG4gKiBhcyBtZXRhZGF0YSBvbiBldmVyeSBvYnNlcnZhYmlsaXR5IHNwYW4gKGFnZW50IHJ1bnMsIG1vZGVsIGNhbGxzLFxuICogdG9vbCBpbnZvY2F0aW9ucywgd29ya2Zsb3cgc3RlcHMpLlxuICpcbiAqIE1pcnJvcnMge0BsaW5rIGh0dHBzOi8vbWFzdHJhLmFpL2RvY3Mvb2JzZXJ2YWJpbGl0eS90cmFjaW5nL292ZXJ2aWV3I2F1dG9tYXRpYy1tZXRhZGF0YS1mcm9tLXJlcXVlc3Rjb250ZXh0fTpcbiAqIHBhc3NlZCB2ZXJiYXRpbSBpbnRvIGBPYnNlcnZhYmlsaXR5LmNvbmZpZ3NbKl0ucmVxdWVzdENvbnRleHRLZXlzYCxcbiAqIHNvIGFueSBrZXkgbGlzdGVkIGhlcmUgaXMgcmVhZCBmcm9tIGBSZXF1ZXN0Q29udGV4dGAgYXQgdHJhY2VcbiAqIHN0YXJ0IGFuZCBhdHRhY2hlZCBhcyBzY2FsYXIgc3BhbiBtZXRhZGF0YS4gS2VlcCB0aGUgc2V0IHRvIHBsYWluXG4gKiBzY2FsYXJzIC0gbmV2ZXIgaW5jbHVkZSB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfSAoaXQgY2FycmllcyB0aGVcbiAqIGZ1bGwgQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHdpdGggYSBgV29ya3NwYWNlQ2xpZW50YCByZWZlcmVuY2UpLlxuICpcbiAqIE9yZGVyIGlzIHB1cmVseSBjb3NtZXRpYzsgTWFzdHJhIGRlLWR1cGVzIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCBjb25zdCBUUkFDRV9SRVFVRVNUX0NPTlRFWFRfS0VZUzogcmVhZG9ubHkgc3RyaW5nW10gPSBbXG4gIE1BU1RSQV9SRVNPVVJDRV9JRF9LRVksXG4gIE1BU1RSQV9USFJFQURfSURfS0VZLFxuICBNQVNUUkFfUkVRVUVTVF9JRF9LRVksXG4gIE1BU1RSQV9VU0VSX05BTUVfS0VZLFxuICBNQVNUUkFfVVNFUl9FTUFJTF9LRVksXG4gIC8vIE1vZGVsIG92ZXJyaWRlIGtleSBpcyBvd25lZCBieSBgc2VydmluZy50c2A7IHNwZWxsZWQgaW5saW5lIGhlcmVcbiAgLy8gc28gdGhpcyBtb2R1bGUgc3RheXMgbGVhZi1sZXZlbCAobm8gY3ljbGVzIHdpdGggYHNlcnZpbmcudHNgKS5cbiAgXCJtYXN0cmFfX21vZGVsX292ZXJyaWRlXCIsXG5dO1xuXG4vKiogQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0IHBsdXMgdGhlIGNhbm9uaWNhbCB1c2VyIGlkLiAqL1xuZXhwb3J0IGludGVyZmFjZSBVc2VyIHtcbiAgaWQ6IHN0cmluZztcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlO1xufVxuXG4vKipcbiAqIENhbm9uaWNhbCBpZGVudGl0eSBmb3IgYW4gQXBwS2l0IGV4ZWN1dGlvbiBjb250ZXh0OiB0aGUgT0JPIHVzZXIgaWQgb24gYVxuICogdXNlci1zY29wZWQgY2FsbCwgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoY29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlKTogc3RyaW5nIHtcbiAgcmV0dXJuIFwidXNlcklkXCIgaW4gY29udGV4dCA/IGNvbnRleHQudXNlcklkIDogY29udGV4dC5zZXJ2aWNlVXNlcklkO1xufVxuXG4vKipcbiAqIFdobyBhIHR1cm4gaXMgQVRUUklCVVRFRCB0bywgd2hpY2ggaXMgbm90IGFsd2F5cyB3aG9zZSBEYXRhYnJpY2tzIGNyZWRlbnRpYWxcbiAqIHJ1bnMgaXQuIEFuIE9CTyBjb250ZXh0J3Mgb3duIHVzZXIgaWQgaXMgYXV0aG9yaXRhdGl2ZS4gVW5kZXIgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCwgZXZlcnkgY2FsbGVyIHNoYXJlcyBvbmUgY3JlZGVudGlhbCwgc28gdGhlIGZvcndhcmRlZCB1c2VyIGlkIGlzXG4gKiB3aGF0IGtlZXBzIG1lbW9yeSB0aHJlYWRzIGFuZCBwZXItdXNlciBjYWNoZSBuYW1lc3BhY2VzIGRpc3RpbmN0OyB0aGUgc2VydmljZVxuICogcHJpbmNpcGFsIGlkIGlzIHRoZSBmbG9vciB3aGVuIG5vIHVzZXIgd2FzIGZvcndhcmRlZC5cbiAqXG4gKiBUaGlzIHJ1bGUgaGFzIHRvIGJlIGlkZW50aWNhbCBldmVyeXdoZXJlIGEgY2FjaGUga2V5IGlzIGJ1aWx0LCBzbyBib3RoIHRoZVxuICogd3JpdGUgc2lkZSAodGhlIGBSZXF1ZXN0Q29udGV4dGAgdXNlciBzdGFtcGVkIGJ5IGBzdGFtcFJlcXVlc3RDb250ZXh0VXNlcmApXG4gKiBhbmQgdGhlIHJlYWQgc2lkZSAodGhlIHBsdWdpbidzIG93biBBcHBLaXQgcm91dGVzLCB3aGljaCBoYXZlIGEgcmVxdWVzdCBidXRcbiAqIG5vIGBSZXF1ZXN0Q29udGV4dGApIGRlcml2ZSB0aGVpciBrZXkgZnJvbSB0aGlzIG9uZSBmdW5jdGlvbi4gV2hlbiB0aGUgdHdvXG4gKiBkaXNhZ3JlZWQsIGEgY2hhcnQgd3JpdHRlbiB1bmRlciB0aGUgZm9yd2FyZGVkIHVzZXIgaWQgd2FzIHJlYWQgYmFjayB1bmRlclxuICogdGhlIHNlcnZpY2UgcHJpbmNpcGFsIGlkIGFuZCB0aGUgZW1iZWQgcm91dGUgYW5zd2VyZWQgNDA0LCB3aGljaCB0aGUgY2hhdCBVSVxuICogcmVuZGVycyBhcyBhbiBleHBpcmVkIGNoYXJ0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXR0cmlidXRlZFVzZXJJZChcbiAgZXhlY3V0aW9uQ29udGV4dDogYXBwa2l0LkV4ZWN1dGlvbkNvbnRleHRMaWtlLFxuICBmb3J3YXJkZWRVc2VySWQ/OiBzdHJpbmcsXG4pOiBzdHJpbmcge1xuICBpZiAoXCJpc1VzZXJDb250ZXh0XCIgaW4gZXhlY3V0aW9uQ29udGV4dCkgcmV0dXJuIGV4ZWN1dGlvbkNvbnRleHRVc2VySWQoZXhlY3V0aW9uQ29udGV4dCk7XG4gIHJldHVybiBmb3J3YXJkZWRVc2VySWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChleGVjdXRpb25Db250ZXh0KTtcbn1cblxuLyoqXG4gKiBJZGVudGl0eSBldmVyeSBwZXItdXNlciBjYWNoZSBlbnRyeSBpcyBuYW1lc3BhY2VkIHVuZGVyLCBzbyBhbiBPQk8gcmVzdWx0XG4gKiBjYW5ub3QgYmUgcmVhZCBiYWNrIGJ5IGFub3RoZXIgY2FsbGVyLlxuICpcbiAqIFByZWZlcnMgdGhlIHtAbGluayBVc2VyfSB0aGF0IHtAbGluayBNYXN0cmFTZXJ2ZXJ9IHN0YW1wcyBvbiB0aGUgcmVxdWVzdFxuICogY29udGV4dCwgd2hvc2UgaWQgYWxyZWFkeSBmb2xsb3dzIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfS4gVGhlIE1DUCB0cmFuc3BvcnRcbiAqIHJvdXRlcyBkbyBub3QgdGhyZWFkIHRoYXQgY29udGV4dCBpbnRvIHRvb2wgZXhlY3V0aW9uLCBzbyB0aG9zZSBmYWxsIGJhY2sgdG9cbiAqIHRoZSBhbWJpZW50IGV4ZWN1dGlvbiBjb250ZXh0ICh0aGUgYWN0aXZlIE9CTyBzY29wZSwgb3IgdGhlIHNlcnZpY2VcbiAqIHByaW5jaXBhbCkuIEEgY2FsbGVyIGhvbGRpbmcgYW4gZXhwcmVzcyByZXF1ZXN0IHNob3VsZCBidWlsZCBpdHMga2V5IGZyb21cbiAqIHtAbGluayBhdHRyaWJ1dGVkVXNlcklkfSBpbnN0ZWFkLCBzbyB0aGUgZm9yd2FyZGVkIHVzZXIgaXMgbm90IGxvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dD86IFJlcXVlc3RDb250ZXh0KTogc3RyaW5nIHtcbiAgY29uc3QgdXNlciA9IHJlcXVlc3RDb250ZXh0Py5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICByZXR1cm4gdXNlcj8uaWQgPz8gZXhlY3V0aW9uQ29udGV4dFVzZXJJZChnZXRFeGVjdXRpb25Db250ZXh0KCkpO1xufVxuXG4vKiogUGdWZWN0b3IgY29uZmlnIHdpdGggYW4gb3B0aW9uYWwgTWFzdHJhIHN0b3JlIGlkLiAqL1xuZXhwb3J0IHR5cGUgTWFzdHJhTWVtb3J5Q29uZmlnID0gUGdWZWN0b3JDb25maWcgJiB7XG4gIGlkPzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiBGaW5lLWdyYWluZWQgY29udHJvbCBmb3IgdGhlIG9wdGlvbmFsIE1DUCBzZXJ2ZXIgZXhwb3N1cmVcbiAqICh7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLm1jcH0pLiBFdmVyeSBmaWVsZCBpcyBvcHRpb25hbDsgdGhlIG9iamVjdFxuICogZm9ybSBvbmx5IG5lZWRzIHRvIHNldCB3aGF0IGRpZmZlcnMgZnJvbSB0aGUgZGVmYXVsdHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFzdHJhTWNwQ29uZmlnIHtcbiAgLyoqXG4gICAqIFNlcnZlciBpZCB1c2VkIGluIHRoZSByb3V0ZSBwYXRoIChgL21jcC88c2VydmVySWQ+Ly4uLmApIGFuZCBhcyB0aGVcbiAgICogTUNQIHJlZ2lzdHJ5IGlkLiBEZWZhdWx0cyB0byB0aGUgcGx1Z2luJ3MgcmVnaXN0ZXJlZCBuYW1lLlxuICAgKi9cbiAgc2VydmVySWQ/OiBzdHJpbmc7XG4gIC8qKiBEaXNwbGF5IG5hbWUgYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gRGVmYXVsdHMgdG8gYFwiPGRpc3BsYXlOYW1lPiBNQ1BcImAuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBTZW1hbnRpYyB2ZXJzaW9uIGFkdmVydGlzZWQgb3ZlciBNQ1AuIERlZmF1bHRzIHRvIGBcIjEuMC4wXCJgLiAqL1xuICB2ZXJzaW9uPzogc3RyaW5nO1xuICAvKiogT3B0aW9uYWwgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gYWR2ZXJ0aXNlZCBvdmVyIE1DUC4gKi9cbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHBvc2UgZXZlcnkgcmVnaXN0ZXJlZCBhZ2VudCBhcyBhbiBgYXNrXzxhZ2VudElkPmAgTUNQIHRvb2wuXG4gICAqIERlZmF1bHRzIHRvIGB0cnVlYCAtIHRoaXMgaXMgdGhlIFwibGV2ZXJhZ2UgdGhlIE1hc3RyYSBhZ2VudHMgb3ZlclxuICAgKiBNQ1BcIiBiZWhhdmlvciBtb3N0IGNhbGxlcnMgd2FudC5cbiAgICovXG4gIGFnZW50cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBBbHNvIGV4cG9zZSB0aGUgcGx1Z2luJ3MgYW1iaWVudCB0b29scyAodGhlIGJ1aWx0LWluIGByZW5kZXJfZGF0YWBcbiAgICogcGx1cyBhbnl0aGluZyBpbiBgY29uZmlnLnRvb2xzYCkgYXMgTUNQIHRvb2xzLiBEZWZhdWx0cyB0byBgZmFsc2VgOlxuICAgKiB0aGUgYW1iaWVudCB0b29scyBhc3N1bWUgYW4gaW4tcHJvY2VzcyBjaGF0IHR1cm4gKHRoZXkgcHVibGlzaFxuICAgKiB3cml0ZXIgZXZlbnRzIHRoZSBjaGF0IFVJIGNvbnN1bWVzKSwgc28gdGhleSBhcmVuJ3QgdXNlZnVsIHRvIGFcbiAgICogc3RhbmRhbG9uZSBNQ1AgY2xpZW50LiBUdXJuIHRoaXMgb24gb25seSB3aGVuIHRob3NlIHRvb2xzIGFyZSBzYWZlXG4gICAqIHRvIGNhbGwgb3V0LW9mLWJhbmQuXG4gICAqL1xuICB0b29scz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBFeHRyYSB0b29scyB0byBleHBvc2Ugb3ZlciBNQ1AgYmV5b25kIHRoZSBhZ2VudCAvIGFtYmllbnQgc2V0cy5cbiAgICogVXNlIHRoaXMgZm9yIHRvb2xzIHdyaXR0ZW4gc3BlY2lmaWNhbGx5IGZvciBNQ1AgY29uc3VtZXJzLlxuICAgKi9cbiAgZXh0cmFUb29scz86IE1hc3RyYVRvb2xzO1xufVxuXG4vKiogQ29uZmlndXJhdGlvbiBhY2NlcHRlZCBieSB0aGUgTWFzdHJhIEFwcEtpdCBwbHVnaW4uICovXG5leHBvcnQgaW50ZXJmYWNlIE1hc3RyYVBsdWdpbkNvbmZpZyBleHRlbmRzIEJhc2VQbHVnaW5Db25maWcge1xuICAvKiogTWFzdHJhIE9wZW5BSS1jb21wYXRpYmxlIHByb3ZpZGVyIGlkLiBEZWZhdWx0cyB0byBgXCJkYXRhYnJpY2tzXCJgOyBubyBlbnYgZmFsbGJhY2suICovXG4gIHByb3ZpZGVySWQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQb3N0Z3Jlc1N0b3JlIGZvciBNYXN0cmEgdGhyZWFkcy9tZXNzYWdlcy4gYHRydWVgIHJldXNlcyB0aGVcbiAgICogYGxha2ViYXNlYCBwbHVnaW4ncyBwb29sOyBhbiBvYmplY3Qgb3BlbnMgYSBkZWRpY2F0ZWQgc3RvcmUuXG4gICAqL1xuICBzdG9yYWdlPzogYm9vbGVhbiB8IFBvc3RncmVzU3RvcmVDb25maWc7XG4gIC8qKlxuICAgKiBQZ1ZlY3RvciBzdG9yZSBmb3IgTWFzdHJhIG1lbW9yeSByZWNhbGwuIGB0cnVlYCByZXVzZXMgdGhlXG4gICAqIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbDsgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLlxuICAgKi9cbiAgbWVtb3J5PzogYm9vbGVhbiB8IE1hc3RyYU1lbW9yeUNvbmZpZztcbiAgLyoqXG4gICAqIENvZGUtZGVmaW5lZCBhZ2VudHMuIEFjY2VwdHMgdGhyZWUgc2hhcGVzIGZvciBjb252ZW5pZW5jZTpcbiAgICpcbiAgICogLSAqKlJlY29yZCoqOiBgeyBhbmFseXN0OiBkZWYsIGhlbHBlcjogZGVmIH1gIC0ga2V5cyBiZWNvbWUgdGhlXG4gICAqICAgcmVnaXN0ZXJlZCBpZHMgYW5kIHRoZSBmaXJzdCBrZXkgaXMgdGhlIGRlZmF1bHQuXG4gICAqIC0gKipTaW5nbGUgZGVmaW5pdGlvbioqOiBgZGVmYCAtIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgXCJkZWZhdWx0XCJgIHdoZW4gYG5hbWVgIGlzIG9taXR0ZWQpIGFuZFxuICAgKiAgIGF1dG9tYXRpY2FsbHkgbWFya2VkIGFzIHRoZSBkZWZhdWx0IGFnZW50LlxuICAgKiAtICoqQXJyYXkqKjogYFtkZWYxLCBkZWYyXWAgLSBlYWNoIHJlZ2lzdGVyZWQgdW5kZXJcbiAgICogICBgc2x1Z2lmeShkZWYubmFtZSlgIChvciBgYWdlbnRfJHtpfWAgd2hlbiBgbmFtZWAgaXMgb21pdHRlZCk7XG4gICAqICAgdGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBFYWNoIGVudHJ5IGJlY29tZXMgYSBNYXN0cmEgYEFnZW50YCByZWFjaGFibGUgYXRcbiAgICogYC9hcGkvPHBsdWdpbj4vcm91dGUvY2hhdC88aWQ+YCAodGhlIGNoYXQgcm91dGUgYWxzbyBtYXRjaGVzXG4gICAqIGA6YWdlbnRJZGApLiBXaGVuIGBhZ2VudHNgIGlzIG9taXR0ZWQgZW50aXJlbHksIHRoZSBwbHVnaW5cbiAgICogcmVnaXN0ZXJzIGEgc2luZ2xlIGJ1aWx0LWluIGBkZWZhdWx0YCBhbmFseXN0IHNvIHRoZSBiYXJlXG4gICAqIGBtYXN0cmEoKWAgY2FsbCBzdGlsbCBtb3VudHMgYSB3b3JraW5nIGNoYXQgZW5kcG9pbnQuXG4gICAqXG4gICAqIEBleGFtcGxlIFNpbmdsZS1hZ2VudCBzaG9ydGhhbmRcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBhZ2VudHM6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIEFycmF5XG4gICAqIGBgYHRzXG4gICAqIG1hc3RyYSh7XG4gICAqICAgYWdlbnRzOiBbXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiYW5hbHlzdFwiLCBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBjcmVhdGVBZ2VudCh7IG5hbWU6IFwiaGVscGVyXCIsIGluc3RydWN0aW9uczogXCIuLi5cIiB9KSxcbiAgICogICBdLFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBleGFtcGxlIFJlY29yZCAoZXhwbGljaXQgaWRzKVxuICAgKiBgYGB0c1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIGFnZW50czoge1xuICAgKiAgICAgYW5hbHlzdDogY3JlYXRlQWdlbnQoeyBpbnN0cnVjdGlvbnM6IFwiLi4uXCIgfSksXG4gICAqICAgICBoZWxwZXI6IGNyZWF0ZUFnZW50KHsgaW5zdHJ1Y3Rpb25zOiBcIi4uLlwiIH0pLFxuICAgKiAgIH0sXG4gICAqICAgZGVmYXVsdEFnZW50OiBcImFuYWx5c3RcIixcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWdlbnRzPzogUmVjb3JkPHN0cmluZywgTWFzdHJhQWdlbnREZWZpbml0aW9uPiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbiB8IE1hc3RyYUFnZW50RGVmaW5pdGlvbltdO1xuICAvKipcbiAgICogQW1iaWVudCB0b29scyBzcHJlYWQgaW50byBldmVyeSByZWdpc3RlcmVkIGFnZW50J3MgdG9vbHMgcmVjb3JkO1xuICAgKiBwZXItYWdlbnQgdG9vbHMgd2luIG9uIGtleSBjb2xsaXNpb24uIFVzZSBmb3IgYSBzbWFsbCBzaGFyZWRcbiAgICogbGlicmFyeTsgZm9yIHBlci1hZ2VudCB0b29scyBzZXQgYGFnZW50c1tpZF0udG9vbHNgIGluc3RlYWQuXG4gICAqL1xuICB0b29scz86IE1hc3RyYVRvb2xzO1xuICAvKipcbiAgICogQWdlbnQgaWQgdXNlZCB3aGVuIHRoZSBjbGllbnQgZG9lc24ndCBzcGVjaWZ5IG9uZSAodGhlIGJhcmUsXG4gICAqIHVuLXN1ZmZpeGVkIGhpc3RvcnkgLyBzdWdnZXN0aW9ucyByb3V0ZXMgcmVzb2x2ZSB0byBpdCkuXG4gICAqIERlZmF1bHRzIHRvIHRoZSBmaXJzdCBrZXkgaW4gYGFnZW50c2AgKG9yIGBcImRlZmF1bHRcImAgd2hlblxuICAgKiBgYWdlbnRzYCBpcyBvbWl0dGVkKS4gTXVzdCBtYXRjaCBhbiBpZCBpbiBgYWdlbnRzYCB3aGVuIGJvdGggYXJlXG4gICAqIHNldDsgYSBtaXNtYXRjaCB0aHJvd3MgYXQgc2V0dXAgd2l0aCB0aGUgYXZhaWxhYmxlIGNhbmRpZGF0ZXMuXG4gICAqL1xuICBkZWZhdWx0QWdlbnQ/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQbHVnaW4tbGV2ZWwgZGVmYXVsdCBtb2RlbCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzXG4gICAqIG93biBgbW9kZWxgLiBNaXJyb3JzIEFwcEtpdCdzIGBhZ2VudHMoeyBkZWZhdWx0TW9kZWwgfSlgLlxuICAgKlxuICAgKiAtIGBzdHJpbmdgOiBzaG9ydGhhbmQgZm9yIFwidXNlIHRoZSBPQk8gYXV0by1yZXNvbHZlciBidXQgc3dhcCB0aGVcbiAgICogICBgbW9kZWxJZGBcIiAoZS5nLiBgXCJkYXRhYnJpY2tzLWNsYXVkZS1zb25uZXQtNC02XCJgKS5cbiAgICogLSBBbnkgb3RoZXIgTWFzdHJhIGBEeW5hbWljQXJndW1lbnQ8TWFzdHJhTW9kZWxDb25maWc+YDogcGFzc2VkXG4gICAqICAgdGhyb3VnaCB2ZXJiYXRpbS4gVXNlIHRoaXMgd2hlbiB5b3UgbmVlZCBmdWxsIGNvbnRyb2wgb3ZlciBhdXRoXG4gICAqICAgb3IgYHByb3ZpZGVySWRgLlxuICAgKlxuICAgKiBSZXNvbHV0aW9uIG9yZGVyIHBlciBhZ2VudDogYGRlZi5tb2RlbGAg4oaSIGBkZWZhdWx0TW9kZWxgIOKGklxuICAgKiBgREFUQUJSSUNLU19TRVJWSU5HX0VORFBPSU5UX05BTUVgIOKGkiBidWlsdC1pbiBgL3NlcnZpbmctZW5kcG9pbnRzYFxuICAgKiByZXNvbHZlci5cbiAgICovXG4gIGRlZmF1bHRNb2RlbD86IEFnZW50Q29uZmlnW1wibW9kZWxcIl0gfCBzdHJpbmc7XG4gIC8qKlxuICAgKiBGdXp6eS1tYXRjaCBsb29zZSBtb2RlbCBuYW1lcyAoYFwiY2xhdWRlIHNvbm5ldFwiYCkgYWdhaW5zdCB0aGUgd29ya3NwYWNlJ3NcbiAgICogTW9kZWwgU2VydmluZyBlbmRwb2ludHMuIERlZmF1bHRzIHRvIGB0cnVlYDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBTZXQgYGZhbHNlYCB0byByZXF1aXJlIGV4YWN0IGVuZHBvaW50IG5hbWVzIGV2ZXJ5d2hlcmUuXG4gICAqL1xuICBtb2RlbEZ1enp5TWF0Y2g/OiBib29sZWFuO1xuICAvKipcbiAgICogRnVzZS5qcyBzY29yZSB0aHJlc2hvbGQgZm9yIHRoZSBmdXp6eSBtYXRjaGVyLCAwIChleGFjdCkgdG8gMSAoYW55dGhpbmcpLlxuICAgKiBEZWZhdWx0cyB0byBgMC40YDsgbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBMb3dlciB2YWx1ZXMgcmVqZWN0IGxvb3NlIG1hdGNoZXM7IHJhaXNlIGl0IGlmIHlvdSBoYXZlIGEgc3ByYXdsaW5nXG4gICAqIGVuZHBvaW50IGNhdGFsb2d1ZSB3aXRoIHNpbWlsYXItbG9va2luZyBuYW1lcy5cbiAgICovXG4gIG1vZGVsRnV6enlUaHJlc2hvbGQ/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUVEwgZm9yIHRoZSBpbi1tZW1vcnkgc2VydmluZy1lbmRwb2ludHMgbGlzdCBjYWNoZSwgaW4gbWlsbGlzZWNvbmRzLlxuICAgKiBEZWZhdWx0cyB0byA1IG1pbnV0ZXM7IG5vIGVudiBmYWxsYmFjay5cbiAgICpcbiAgICogVGhlIGNhY2hlIGlzIHBlciB3b3Jrc3BhY2UgaG9zdCBhbmQgc2hhcmVkIGFjcm9zcyB1c2VyczsgY29uY3VycmVudFxuICAgKiBjYWxsZXJzIGNvYWxlc2NlIG9uIGEgc2luZ2xlIGluLWZsaWdodCBmZXRjaC5cbiAgICovXG4gIG1vZGVsQ2FjaGVUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIExldCBjbGllbnRzIHBpY2sgdGhlIGJhY2tpbmcgZW5kcG9pbnQgcGVyIHJlcXVlc3QuIERlZmF1bHRzIHRvIGB0cnVlYDtcbiAgICogbm8gZW52IGZhbGxiYWNrLlxuICAgKlxuICAgKiBSZWFkcyB0aGUgYFgtTWFzdHJhLU1vZGVsYCBoZWFkZXIsIHRoZSBgP21vZGVsPWAgcXVlcnkgc3RyaW5nLCBvciBhXG4gICAqIGBtb2RlbGAgYm9keSBmaWVsZCwgaW4gdGhhdCBvcmRlci4gRGlzYWJsZSB3aGVuIHJ1bm5pbmcgbXVsdGktdGVuYW50XG4gICAqIHdoZXJlIHVudHJ1c3RlZCBjbGllbnRzIHNob3VsZG4ndCBjaG9vc2UgdGhlIGVuZHBvaW50LlxuICAgKi9cbiAgbW9kZWxPdmVycmlkZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBQcmlvcml0eS1vcmRlcmVkIGxpc3Qgb2YgZW5kcG9pbnQgbmFtZXMgdHJpZWQgKmZpcnN0KiB3aGVuIG5vXG4gICAqIGFnZW50IC8gcGx1Z2luIC8gZW52IC8gcmVxdWVzdC1vdmVycmlkZSBtb2RlbCBpZCBpcyBzZXQsIGFoZWFkIG9mXG4gICAqIHRoZSBkeW5hbWljIHNjb3JlLWNsYXNzaWZpZWQgY2F0YWxvZ3VlLiBUaGUgcmVzb2x2ZXIgcGlja3MgdGhlXG4gICAqIGZpcnN0IGlkIHRoYXQgaXMgYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgd29ya3NwYWNlJ3NcbiAgICogYC9zZXJ2aW5nLWVuZHBvaW50c2AgbGlzdGluZy5cbiAgICpcbiAgICogV2hlbiB1bnNldCwgcmVzb2x1dGlvbiBpcyBkcml2ZW4gYnkgdGhlIGxpdmUgRm91bmRhdGlvbiBNb2RlbCBBUElcbiAgICogYHF1YWxpdHlgIC8gYHNwZWVkYCAvIGBjb3N0YCBzY29yZXM6IGVuZHBvaW50cyBhcmUgY2xhc3NpZmllZCBpbnRvXG4gICAqIGNoYXQgY2xhc3NlcyAoYGNsYXNzaWZ5RW5kcG9pbnRzYCkgYW5kIHdhbGtlZCBiZXN0LWZpcnN0XG4gICAqIChDaGF0VGhpbmtpbmcgLT4gQ2hhdEJhbGFuY2VkIC0+IENoYXRGYXN0KSwgd2l0aCB0aGUgc21hbGwgYnVpbHQtaW5cbiAgICogYEZBTExCQUNLX01PREVMX0lEU2AgbGlzdCBhcyB0aGUgZmxvb3Igd2hlbiB0aGUgY2F0YWxvZ3VlIGNhbid0IGJlXG4gICAqIHJlYWQuIFNldCB0aGlzIHRvXG4gICAqIHBpbiBhIHJlZ3VsYXRlZCB3b3Jrc3BhY2UgdG8gYW4gYXBwcm92ZWQgc3Vic2V0LCBvciB0byBwdXQgY3VzdG9tXG4gICAqIGVuZHBvaW50cyBpbiBmcm9udCBvZiB0aGUgYXV0by1jbGFzc2lmaWVkIGNhdGFsb2d1ZS5cbiAgICovXG4gIGRlZmF1bHRNb2RlbEZhbGxiYWNrcz86IHJlYWRvbmx5IHN0cmluZ1tdO1xuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKGRlZmF1bHQpLCBldmVyeSBhZ2VudCBnZXRzIGEgYnVpbHQtaW4gaW5wdXRcbiAgICogcHJvY2Vzc29yIHRoYXQgc3RyaXBzIGBjaGFydElkYCBmaWVsZHMgZnJvbSBwcmlvciBhc3Npc3RhbnRcbiAgICogdG9vbC1pbnZvY2F0aW9uIHJlc3VsdHMgYmVmb3JlIHRoZXkgcmVhY2ggdGhlIG1vZGVsLiBUaGlzXG4gICAqIHByZXZlbnRzIHRoZSBtb2RlbCBmcm9tIHJldXNpbmcgdHVybi1zY29wZWQgY2hhcnRJZHMgaXQgc2Vlc1xuICAgKiBpbiBtZW1vcnkgcmVjYWxsICh3aGljaCB3b3VsZCBsZWF2ZSBgW2NoYXJ0OjxpZD5dYCBtYXJrZXJzXG4gICAqIHBvaW50aW5nIGF0IHdyaXRlciBldmVudHMgdGhhdCBubyBsb25nZXIgZXhpc3QpLlxuICAgKlxuICAgKiBTZXQgdG8gYGZhbHNlYCB0byBvcHQgb3V0IC0gdXNlZnVsIGlmIGEgbm9uLWRlZmF1bHQgYWdlbnRcbiAgICogbmVlZHMgZnVsbCB2aXNpYmlsaXR5IGludG8gcHJpb3IgY2hhcnRJZHMgKGUuZy4gYW4gYXVkaXRcbiAgICogYWdlbnQgcmVhc29uaW5nIGFib3V0IGNoYXJ0IGxpbmVhZ2UpLlxuICAgKi9cbiAgc3RyaXBTdGFsZUNoYXJ0cz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBTdHlsZSBndWFyZHJhaWxzIGFwcGVuZGVkIHRvIGV2ZXJ5IGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG8gY3VyYlxuICAgKiBjb21tb24gTExNLWlzbXMgKGVtIGRhc2hlcywgZW1vamlzLCBzeWNvcGhhbnRpYyBvcGVuZXJzLCB0aHJvd2F3YXlcbiAgICogY2xvc2VycywgZXhjZXNzaXZlIGhlZGdpbmcpLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0KTogdXNlIHRoZSBidWlsdC1pblxuICAgKiAgIGBERUZBVUxUX1NUWUxFX0lOU1RSVUNUSU9OU2AgZnJvbSBgYWdlbnRzLnRzYC5cbiAgICogLSBgc3RyaW5nYDogcmVwbGFjZSB0aGUgZGVmYXVsdCB3aXRoIHRoZSBzdXBwbGllZCBibG9jay5cbiAgICogLSBgZmFsc2VgOiBkaXNhYmxlIGVudGlyZWx5IChhZ2VudHMgc2VlIG9ubHkgdGhlaXIgYmVzcG9rZVxuICAgKiAgIGBpbnN0cnVjdGlvbnNgKS5cbiAgICpcbiAgICogQXBwZW5kZWQgKG5vdCBwcmVwZW5kZWQpIHNvIHRoZSBhZ2VudCdzIHJvbGUgYW5kIHJ1bGVzIGNvbWUgZmlyc3RcbiAgICogYW5kIHRoZSBzdHlsZSBibG9jayBsZWFucyBvbiB0aGUgbW9kZWwncyByZWNlbmN5IGJpYXMuXG4gICAqL1xuICBzdHlsZUluc3RydWN0aW9ucz86IHN0cmluZyB8IGZhbHNlO1xuICAvKipcbiAgICogR2VuaWUgc3BhY2VzIHRoaXMgcGx1Z2luJ3MgYWdlbnRzIGNhbiBkZWxlZ2F0ZSB0by4gT25lIE1hc3RyYVxuICAgKiB0b29sIGlzIHJlZ2lzdGVyZWQgcGVyIGFsaWFzIChgZ2VuaWVgIGZvciB0aGUgd2VsbC1rbm93blxuICAgKiBgZGVmYXVsdGAgYWxpYXMsIGBnZW5pZV88YWxpYXM+YCBvdGhlcndpc2UpLiBFYWNoIHRvb2wgc3BpbnNcbiAgICogdXAgYSBwZXItcXVlc3Rpb24gR2VuaWUgc3ViLWFnZW50IHRoYXQgcnVucyBEYXRhYnJpY2tzXG4gICAqIFwiYWdlbnQgbW9kZVwiIGFnYWluc3QgdGhlIHNwYWNlLCBicm9hZGNhc3RzIHdpcmUgZXZlbnRzIHRvIHRoZVxuICAgKiBVSSwgZmV0Y2hlcyBzdGF0ZW1lbnQgcm93cyBmb3Igbm9uLWVtcHR5IHJlc3VsdHMsIGFuZCByZXR1cm5zXG4gICAqIGEgYChzdHJpbmcgfCBkYXRhIHwgY2hhcnQpW11gIHN1bW1hcnkgdGhlIGhvc3QgVUkgcmVuZGVyc1xuICAgKiBpbmxpbmUuXG4gICAqXG4gICAqIEVudHJpZXMgYWNjZXB0IGVpdGhlciBhIGZ1bGwge0BsaW5rIEdlbmllU3BhY2VDb25maWd9IG9iamVjdFxuICAgKiBvciBhIGJhcmUgYHNwYWNlX2lkYCBzdHJpbmcgd2hlbiBubyBleHRyYXMgYXJlIG5lZWRlZDpcbiAgICpcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHtcbiAgICogICBnZW5pZVNwYWNlczoge1xuICAgKiAgICAgZGVmYXVsdDogXCIwMWVmMGQzYzBlMWIxZjRhOGQyYzNlNGY1YTZiN2M4ZFwiLFxuICAgKiAgICAgZm9yZWNhc3RzOiB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiLCBoaW50OiBcIndlZWtseSBkZW1hbmQgZm9yZWNhc3RzXCIgfSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJlYWNoIHRoZSBzcGFjZXMgZnJvbSBhbiBhZ2VudCdzIGB0b29scyhwbHVnaW5zKWAgY2FsbGJhY2sgdmlhXG4gICAqIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgOyB0aGUgcmVzdWx0aW5nIHRvb2xzIGFjY2VwdFxuICAgKiBgeyBjb250ZW50LCBjb252ZXJzYXRpb25JZD8gfWAgYW5kIHJldHVybiBhIGh5ZHJhdGVkIHN1bW1hcnkuXG4gICAqXG4gICAqICoqRmFsbGJhY2sgZGlzY292ZXJ5KiogKGhpZ2hlc3QgcHJlY2VkZW5jZSBmaXJzdCk6IGlmIHRoaXNcbiAgICogZmllbGQgaXMgb21pdHRlZCwgdGhlIEdlbmllIGFnZW50IGFsc28gcGlja3MgdXAgc3BhY2VzIGZyb21cbiAgICogKDEpIHRoZSBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2VcbiAgICogd2hlbiByZWdpc3RlcmVkLCBhbmQgKDIpIHRoZSBgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRGBcbiAgICogZW52IHZhciAocmVnaXN0ZXJlZCB1bmRlciB0aGUgYGRlZmF1bHRgIGFsaWFzKS4gVGhpcyBrZWVwc1xuICAgKiBleGlzdGluZyBBcHBLaXQgZGVwbG95bWVudHMgd29ya2luZyB3aXRob3V0IHJlc3RhdGluZyB0aGVcbiAgICogc3BhY2VzIGNvbmZpZyBpbiB0d28gcGxhY2VzLlxuICAgKi9cbiAgZ2VuaWVTcGFjZXM/OiBHZW5pZVNwYWNlc0NvbmZpZztcbiAgLyoqXG4gICAqIFVzZSB0aGUgc3RyZWFtaW5nIEdlbmllIEFnZW50IE1vZGUgQVBJIGZvciBgYXNrX2dlbmllYC4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKiBTZXQgYGZhbHNlYCB0byBmb3JjZSB0aGUgbGVnYWN5IENvbnZlcnNhdGlvbiBBUEkgcG9sbGluZyBkcml2ZXIuIEFcbiAgICogcHJlLXN0cmVhbSBmZWF0dXJlLWRpc2FibGVkIG9yIHByZXZpZXctdG9nZ2xlIHJlc3BvbnNlIGZhbGxzIGJhY2tcbiAgICogYXV0b21hdGljYWxseS5cbiAgICovXG4gIGdlbmllQWdlbnRNb2RlPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIFRUTCBmb3IgdGhlIGluLW1lbW9yeSBHZW5pZSBzcGFjZSBtZXRhZGF0YSBjYWNoZSwgaW5cbiAgICogbWlsbGlzZWNvbmRzLiBEZWZhdWx0cyB0byA1IG1pbnV0ZXMuIFRoZSBHZW5pZSBhZ2VudCBjYWxsc1xuICAgKiBgY2xpZW50LmdlbmllLmdldFNwYWNlKC4uLilgIG9uIGV2ZXJ5IGNvbGQtc3RhcnQgdG8gZ2V0IHRoZVxuICAgKiB0aXRsZSAvIGRlc2NyaXB0aW9uIC8gd2FyZWhvdXNlIGlkOyBjYWNoZWQgcmVzcG9uc2VzIHNraXAgdGhlXG4gICAqIHJvdW5kLXRyaXAgYW5kIGNvbmN1cnJlbnQgY2FsbGVycyBjb2FsZXNjZSBvbiBhIHNpbmdsZVxuICAgKiBpbi1mbGlnaHQgZmV0Y2guIERyb3AgdG8gYSBzbWFsbGVyIHZhbHVlIHdoZW4gYW5hbHlzdHMgYXJlXG4gICAqIGFjdGl2ZWx5IGVkaXRpbmcgc3BhY2UgbWV0YWRhdGEgYW5kIHlvdSB3YW50IGNoYW5nZXMgdmlzaWJsZVxuICAgKiB3aXRoaW4gc2Vjb25kczsgcmFpc2UgaXQgdG8gYW1vcnRpc2UgdGhlIHJvdW5kLXRyaXAgd2hlblxuICAgKiBzcGFjZSBtZXRhZGF0YSBpcyBlZmZlY3RpdmVseSBmcm96ZW4uXG4gICAqXG4gICAqIEJhY2tlZCBieSBBcHBLaXQncyBgQ2FjaGVNYW5hZ2VyYCwgc28gdGhlIGNhY2hlIHBhcnRpY2lwYXRlc1xuICAgKiBpbiB0ZWxlbWV0cnkgc3BhbnMgKGBjYWNoZS5nZXRPckV4ZWN1dGVgKSBhbmQgYmVuZWZpdHMgZnJvbVxuICAgKiBMYWtlYmFzZSBwZXJzaXN0ZW5jZSB3aGVuIHRoZSBgbGFrZWJhc2VgIHBsdWdpbiBpcyB3aXJlZCB1cC5cbiAgICovXG4gIGdlbmllU3BhY2VDYWNoZVR0bE1zPzogbnVtYmVyO1xuICAvKipcbiAgICogTWF4aW11bSBMTE0gc3RlcHMgZWFjaCBhZ2VudCBnZXRzIHBlciB0dXJuLiBPbmUgc3RlcCA9IG9uZVxuICAgKiByb3VuZC10cmlwIHRvIHRoZSB1bmRlcmx5aW5nIG1vZGVsIChhIHRvb2wgY2FsbCBjb25zdW1lcyBhXG4gICAqIHN0ZXAsIHRoZSBmaW5hbC10ZXh0IHJlcGx5IGNvbnN1bWVzIG9uZSB0b28pLiBBcHBsaWVzIHRvXG4gICAqIGV2ZXJ5IGFnZW50IHJlZ2lzdGVyZWQgdGhyb3VnaCB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmFnZW50c31cbiAgICogLSBwZXItYWdlbnQgb3ZlcnJpZGVzIGFyZW4ndCBzdXJmYWNlZCB5ZXQgYmVjYXVzZSB0aGUgc2FtZVxuICAgKiBjZWlsaW5nIGhhcyBiZWVuIHN1ZmZpY2llbnQgYWNyb3NzIGV2ZXJ5IHdvcmtsb2FkIHdlJ3ZlIHJ1bi5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8ge0BsaW5rIERFRkFVTFRfQUdFTlRfTUFYX1NURVBTfSAoMjUpLCBzaXplZCB0byBmaXRcbiAgICogYSBkZWNvbXBvc2VkIEdlbmllIHR1cm4gKGdyb3VuZGluZyArIHNldmVyYWwgYGFza19nZW5pZWAgY2FsbHNcbiAgICogKyBgcHJlcGFyZV9jaGFydGAgcGVyIGRhdGFzZXQgKyB0aGUgZmluYWwtdGV4dCByZXBseSkgd2l0aFxuICAgKiBoZWFkcm9vbSBmb3IgdGhlIG1vZGVsIHRvIGNoYWluIGEgY291cGxlIG9mIGZvbGxvdy11cHMgYmVmb3JlXG4gICAqIGFuc3dlcmluZy4gTWFzdHJhJ3Mgb3duIGBhZ2VudC5nZW5lcmF0ZWAgZGVmYXVsdCBvZiA1IHdvdWxkXG4gICAqIGN1dCBtdWx0aS1zdGVwIG9yY2hlc3RyYXRpb24gb2ZmIGFmdGVyIDItMyB0b29sIGNhbGxzLCBzb1xuICAgKiBleHBsaWNpdGx5IHJhaXNpbmcgdGhlIGNlaWxpbmcgaGVyZSBpcyB3aGF0IGxldHMgdGhlXG4gICAqIGFnZW50LW1vZGUgbG9vcCBwbGF5IG91dC5cbiAgICpcbiAgICogTG93ZXIgd2hlbiBhbiB1bnVzdWFsbHkgc2xvdyBvciBleHBlbnNpdmUgbW9kZWwgbWFrZXMgbG9uZ1xuICAgKiB0dXJucyB1bmFmZm9yZGFibGU7IHJhaXNlIGZvciBleHBsb3JhdG9yeSB3b3JrbG9hZHMgdGhhdCBuZWVkXG4gICAqIHRvIGRyaWxsIGRlZXAgaW50byBhIGRhdGFzZXQgd2l0aGluIGEgc2luZ2xlIHR1cm4uXG4gICAqL1xuICBhZ2VudE1heFN0ZXBzPzogbnVtYmVyO1xuICAvKipcbiAgICogV2lyZSBNYXN0cmEgc3BhbnMgaW50byBBcHBLaXQncyBnbG9iYWwgT1RlbCBwaXBlbGluZSB2aWFcbiAgICogYEBtYXN0cmEvb3RlbC1icmlkZ2VgLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogb24gb25seSB3aGVuXG4gICAqICAgYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgb3JcbiAgICogICBgT1RFTF9FWFBPUlRFUl9PVExQX1RSQUNFU19FTkRQT0lOVGAgaXMgc2V0LiBXaGVuIHVuc2V0LCB0aGVcbiAgICogICBicmlkZ2UgaXMgc2tpcHBlZCBzbyBNYXN0cmEgZG9lcyBub3QgbG9nXG4gICAqICAgYFtPdGVsQnJpZGdlXSBObyBPVEVMIHNwYW4gZm91bmRgIG9uIHRoZSBub29wIHRyYWNlci5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uIGV2ZW4gd2l0aG91dCBhbiBPVExQIGVuZHBvaW50LlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi5cbiAgICovXG4gIG9ic2VydmFiaWxpdHk/OiBib29sZWFuO1xuICAvKipcbiAgICogTG9nIHVzZXIgZmVlZGJhY2sgKHRodW1icyB1cC9kb3duICsgZnJlZWZvcm0gY29tbWVudHMpIHRvIE1MZmxvdyBhc1xuICAgKiB0cmFjZSBhc3Nlc3NtZW50cywgYW5kIHN1cmZhY2UgdGhlIGZlZWRiYWNrIGNvbnRyb2xzIGluIHRoZSBjaGF0IFVJLlxuICAgKlxuICAgKiAtIGB1bmRlZmluZWRgIChkZWZhdWx0LCBhdXRvKTogZW5hYmxlZCBvbmx5IHdoZW4gTUxmbG93IHRyYWNpbmcgaXNcbiAgICogICB3aXJlZCAtIGFuIE9UTFAgZXhwb3J0ZXIgZW5kcG9pbnQgaXMgc2V0IGFuZCBhbiBNTGZsb3cgZXhwZXJpbWVudFxuICAgKiAgIGlzIG5hbWVkICh0aGUgc2FtZSBzaWduYWxzIHRoZSBvYnNlcnZhYmlsaXR5IHBpcGVsaW5lIG5lZWRzIHRvXG4gICAqICAgc2hpcCB0cmFjZXMgdG8gTUxmbG93KS4gT3RoZXJ3aXNlIG9mZiwgc2luY2UgdGhlcmUnZCBiZSBubyB0cmFjZVxuICAgKiAgIHRvIGF0dGFjaCBmZWVkYmFjayB0by5cbiAgICogLSBgdHJ1ZWA6IGZvcmNlIG9uLiBGZWVkYmFjayBjb250cm9scyBzaG93IGFuZCB3cml0ZXMgYXJlIGF0dGVtcHRlZFxuICAgKiAgIHJlZ2FyZGxlc3Mgb2YgZW52IGRldGVjdGlvbiAodXNlIHdoZW4gdGhlIGVudiBpcyBjb25maWd1cmVkIGluIGFcbiAgICogICB3YXkgdGhlIGF1dG8tcHJvYmUgZG9lc24ndCByZWNvZ25pemUpLlxuICAgKiAtIGBmYWxzZWA6IGZvcmNlIG9mZi4gTm8gdHJhY2UtaWQgaGVhZGVyLCBubyBmZWVkYmFjayByb3V0ZSwgbm8gVUkuXG4gICAqXG4gICAqIEZlZWRiYWNrIGF0dGFjaGVzIHRvIGEgdHVybidzIE1MZmxvdyB0cmFjZSB2aWEgdGhlIE9wZW5UZWxlbWV0cnlcbiAgICogdHJhY2UgaWQgdGhlIHNlcnZlciBzdGFtcHMgb24gZWFjaCByZXNwb25zZTsgc2VlIGBtbGZsb3cudHNgLlxuICAgKi9cbiAgZmVlZGJhY2s/OiBib29sZWFuO1xuICAvKipcbiAgICogRXhwb3NlIHRoZSBwbHVnaW4ncyBhZ2VudHMgKGFuZCBvcHRpb25hbGx5IHRvb2xzKSBhcyBhIE1hc3RyYSBNQ1BcbiAgICogc2VydmVyIHNvIGV4dGVybmFsIE1DUCBjbGllbnRzIC0gQ2xhdWRlIERlc2t0b3AsIEN1cnNvciwgdGhlIE1hc3RyYVxuICAgKiBwbGF5Z3JvdW5kLCBvciBhbm90aGVyIGFnZW50IC0gY2FuIGNhbGwgdGhlbSBvdmVyIHRoZSBzdGFuZGFyZCBNQ1BcbiAgICogdHJhbnNwb3J0cy4gRW5hYmxlZCBieSBkZWZhdWx0IChhZ2VudHMgb25seSk6IHdyYXBwaW5nIHRoZVxuICAgKiBhbHJlYWR5LXJlZ2lzdGVyZWQgYWdlbnRzIGNvc3RzIG5vdGhpbmcgZXh0cmEsIHNvIHRoZSBlbmRwb2ludCBpcyBvblxuICAgKiBvdXQgb2YgdGhlIGJveDsgb25seSB0aGUgYW1iaWVudCB0b29scyAod2hpY2ggYXNzdW1lIGFuIGluLXByb2Nlc3NcbiAgICogY2hhdCB0dXJuKSBzdGF5IG9mZiB1bmxlc3MgZXhwbGljaXRseSBvcHRlZCBpbi5cbiAgICpcbiAgICogLSBgdW5kZWZpbmVkYCAoZGVmYXVsdCkgLyBgdHJ1ZWA6IGV4cG9zZSBldmVyeSByZWdpc3RlcmVkIGFnZW50IGFzXG4gICAqICAgYW4gYGFza188YWdlbnRJZD5gIE1DUCB0b29sIHVuZGVyIGEgc2VydmVyIHdob3NlIGlkIGlzIHRoZSBwbHVnaW5cbiAgICogICBuYW1lLlxuICAgKiAtIGBmYWxzZWA6IG5vIE1DUCBlbmRwb2ludHMuXG4gICAqIC0ge0BsaW5rIE1hc3RyYU1jcENvbmZpZ306IGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIHNlcnZlciBpZCxcbiAgICogICBhZHZlcnRpc2VkIG1ldGFkYXRhLCBhbmQgd2hpY2ggYWdlbnRzIC8gdG9vbHMgYXJlIGV4cG9zZWQuXG4gICAqXG4gICAqIFdoZW4gZW5hYmxlZCwgdGhlIHN0b2NrIE1hc3RyYSBNQ1Agcm91dGVzIG1vdW50IHVuZGVyIHRoZSBwbHVnaW4nc1xuICAgKiBiYXNlIHBhdGggKG5vIGJlc3Bva2Ugcm91dGUgaXMgYWRkZWQgLSB0aGUgc2VydmVyIGlzIGhhbmRlZCB0byB0aGVcbiAgICogYE1hc3RyYWAgaW5zdGFuY2UgdmlhIGBtY3BTZXJ2ZXJzYCwgd2hpY2ggYEBtYXN0cmEvZXhwcmVzc2Agc2VydmVzKTpcbiAgICpcbiAgICogLSBTdHJlYW1hYmxlIEhUVFA6IGBQT1NUIC9hcGkvPHBsdWdpbj4vbWNwLzxzZXJ2ZXJJZD4vbWNwYFxuICAgKiAtIFNTRSAobGVnYWN5KTogICAgYEdFVCAgL2FwaS88cGx1Z2luPi9tY3AvPHNlcnZlcklkPi9zc2VgXG4gICAqICAgICAgICAgICAgICAgICAgICBgUE9TVCAvYXBpLzxwbHVnaW4+L21jcC88c2VydmVySWQ+L21lc3NhZ2VzYFxuICAgKlxuICAgKiBSZXF1ZXN0cyBydW4gdW5kZXIgdGhlIHNhbWUgQXBwS2l0IE9CTyBzY29wZSBhcyB0aGUgY2hhdCByb3V0ZXMsIHNvXG4gICAqIGFuIGFnZW50IGludm9rZWQgb3ZlciBNQ1AgcmVzb2x2ZXMgaXRzIG1vZGVsIGFuZCB0b29scyBhcyB0aGVcbiAgICogY2FsbGluZyB1c2VyLlxuICAgKi9cbiAgbWNwPzogYm9vbGVhbiB8IE1hc3RyYU1jcENvbmZpZztcbiAgLyoqXG4gICAqIEhvdyBtdWNoIG9mIHRoZSBzdG9jayBgQG1hc3RyYS9leHByZXNzYCBtYW5hZ2VtZW50IEFQSSBpcyByZWFjaGFibGVcbiAgICogdGhyb3VnaCB0aGUgcGx1Z2luIG1vdW50LiBgQG1hc3RyYS9leHByZXNzYCByZWdpc3RlcnMgaXRzIGZ1bGwgcm91dGVcbiAgICogdGFibGUgKGFnZW50IGluZmVyZW5jZSBwbHVzIGFkbWluIC8gbXV0YXRpbmcgcm91dGVzOiBkaXJlY3QgdG9vbFxuICAgKiBleGVjdXRpb24sIHdvcmtmbG93IGNvbnRyb2wsIHJhdyBtZW1vcnkgcmVhZC93cml0ZSwgdGVsZW1ldHJ5LCBsb2dzLFxuICAgKiBzY29yZXMpLiBBcHBLaXQgYWxyZWFkeSBhdXRoZW50aWNhdGVzIGV2ZXJ5IHJlcXVlc3QgYXMgdGhlIE9CTyB1c2VyLFxuICAgKiBidXQgbm90aGluZyB0aGVyZSByZXN0cmljdHMgKndoaWNoKiBvZiB0aG9zZSBvcGVyYXRpb25zIHRoZSBicm93c2VyXG4gICAqIGNsaWVudCBtYXkgaW52b2tlLlxuICAgKlxuICAgKiAtIGBcInNjb3BlZFwiYCAoZGVmYXVsdCk6IG9ubHkgdGhlIHJvdXRlcyB0aGUgY2hhdCBjbGllbnQgbGVnaXRpbWF0ZWx5XG4gICAqICAgbmVlZHMgYXJlIGRpc3BhdGNoZWQgdG8gTWFzdHJhIC0gYWdlbnQgaW5mZXJlbmNlXG4gICAqICAgKGBzdHJlYW1gIC8gYGdlbmVyYXRlYCAvIGBuZXR3b3JrYCksIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpc1xuICAgKiAgIHBsdWdpbidzIG93biBPQk8tIGFuZCByZXNvdXJjZS1zY29wZWQgYC9yb3V0ZS8qYCByb3V0ZXMgKGhpc3RvcnkgL1xuICAgKiAgIHRocmVhZHMpLCBhbmQsIHdoZW4ge0BsaW5rIG1jcH0gaXMgZW5hYmxlZCwgdGhlIE1DUCB0cmFuc3BvcnQuXG4gICAqICAgRXZlcnl0aGluZyBlbHNlICh0b29sIGV4ZWN1dGlvbiwgd29ya2Zsb3cgY29udHJvbCwgcmF3IG1lbW9yeSxcbiAgICogICB0ZWxlbWV0cnksIGxvZ3MsIHNjb3JlcywgYW5kIG90aGVyIG11dGF0aW9ucykgaXMgcmVqZWN0ZWQgd2l0aFxuICAgKiAgIGA0MDNgIGJlZm9yZSBpdCByZWFjaGVzIE1hc3RyYS5cbiAgICogLSBgXCJmdWxsXCJgOiBkaXNwYXRjaCB0aGUgZW50aXJlIHN0b2NrIE1hc3RyYSBBUEkuIFVzZSBvbmx5IGZvciBhXG4gICAqICAgdHJ1c3RlZCBmaXJzdC1wYXJ0eSBjb25zb2xlIHRoYXQgZ2VudWluZWx5IG5lZWRzIHRoZSBtYW5hZ2VtZW50XG4gICAqICAgc3VyZmFjZS5cbiAgICovXG4gIGFwaUFjY2Vzcz86IFwic2NvcGVkXCIgfCBcImZ1bGxcIjtcbiAgLyoqXG4gICAqIFdoaWNoIERhdGFicmlja3MgaWRlbnRpdHkgdGhlIGFnZW50cycgd29ya3NwYWNlIGNhbGxzIHJ1biBhczogdGhlXG4gICAqIHNlcnZpbmctZW5kcG9pbnQgY2F0YWxvZ3VlIGJlaGluZCB0aGUgbW9kZWwgcGlja2VyLCBHZW5pZSBzdWdnZXN0aW9ucyxcbiAgICogYGFza19nZW5pZWAsIGFuZCB0aGUgU3RhdGVtZW50IEV4ZWN1dGlvbiBmZXRjaCBiZWhpbmQgYSBgW2RhdGE6PGlkPl1gXG4gICAqIGVtYmVkLiBGYWxscyBiYWNrIHRvIGBNQVNUUkFfR0VOSUVfSURFTlRJVFlgLCB0aGVuIGBcInVzZXJcImAuXG4gICAqXG4gICAqIE9uLWJlaGFsZi1vZiAoT0JPKSBhdXRoIHJlcXVpcmVzIHRoZSBjYWxsZXIgdG8gYmUgYSBtZW1iZXIgb2YgdGhlXG4gICAqIFdPUktTUEFDRSwgbm90IGp1c3Qgb2YgdGhlIERhdGFicmlja3MgYWNjb3VudC4gQW4gYXBwIHNoYXJlZCB3aXRoIGFuXG4gICAqIGFjY291bnQtbGV2ZWwgZ3JvdXAgY2FuIGJlIG9wZW5lZCBieSBzb21lb25lIHdob3NlIHRva2VuIGlzIHZhbGlkIGJ1dCB3aG9zZVxuICAgKiBldmVyeSB3b3Jrc3BhY2UgY2FsbCBmYWlscyB3aXRoIGBVbmF1dGhvcml6ZWQgYWNjZXNzIHRvIE9yZzogPGlkPmAgLSBhbmRcbiAgICogZ3JhbnRpbmcgd29ya3NwYWNlIG1lbWJlcnNoaXAgaXMgbm90IGFsd2F5cyBwb3NzaWJsZSwgc2luY2UgYSB3b3Jrc3BhY2VcbiAgICogY2FwcyBtZW1iZXJzaGlwIHdlbGwgYmVsb3cgdGhlIHNpemUgb2YgYSBsYXJnZSBhY2NvdW50J3MgdXNlciBncm91cC4gVGhlXG4gICAqIGFwcCdzIHNlcnZpY2UgcHJpbmNpcGFsIGFscmVhZHkgaG9sZHMgdGhlIGdyYW50cyB0aGUgYXBwIHdhcyBkZXBsb3llZCB3aXRoLlxuICAgKlxuICAgKiAtIGBcInVzZXJcImAgKGRlZmF1bHQpOiBhbHdheXMgT0JPLiBQZXItdXNlciBhdHRyaWJ1dGlvbiwgYW5kIEdlbmllIC8gVW5pdHlcbiAgICogICBDYXRhbG9nIHJvdyBmaWx0ZXJzIGFwcGx5IHBlciB1c2VyLiBDb3JyZWN0IHdoZW4gZXZlcnkgY2FsbGVyIGlzIGFcbiAgICogICB3b3Jrc3BhY2UgbWVtYmVyLlxuICAgKiAtIGBcInNlcnZpY2UtcHJpbmNpcGFsXCJgOiBhbHdheXMgdGhlIGFwcCBzZXJ2aWNlIHByaW5jaXBhbC4gTmVlZHMgbm8gT0JPXG4gICAqICAgc2NvcGVzIGFuZCB3b3JrcyBmb3IgYW55IGNhbGxlciB3aG8gY2FuIG9wZW4gdGhlIGFwcCwgYXQgdGhlIGNvc3Qgb2ZcbiAgICogICBwZXItdXNlciBhdHRyaWJ1dGlvbiBpbiBHZW5pZSAvIFVuaXR5IENhdGFsb2cuXG4gICAqIC0gYFwiYXV0b1wiYDogT0JPIHdoZW4gdGhlIHJlcXVlc3QgY2FycmllcyBhbiBPQk8gdG9rZW4sIHRoZSBzZXJ2aWNlIHByaW5jaXBhbFxuICAgKiAgIHdoZW4gaXQgZG9lcyBub3QuIEZvciBhbiBhcHAgc2VydmluZyBCT1RIIHRoZSBwbGF0Zm9ybSBmcm9udCBkb29yIGFuZCBhXG4gICAqICAgZG9vciB0aGF0IGhhcyBubyB0b2tlbiB0byBmb3J3YXJkIC0gYSBgQGRieC10b29scy90dW5uZWxgIGdhdGUsIGFcbiAgICogICBUZWFtcyBjaGFubmVsIC0gd2hlcmUgQXBwS2l0J3MgYGFzVXNlcmAgd291bGQgb3RoZXJ3aXNlIHRocm93XG4gICAqICAgYEF1dGhlbnRpY2F0aW9uRXJyb3JgIG91dHNpZGUgYE5PREVfRU5WPWRldmVsb3BtZW50YC5cbiAgICpcbiAgICogVGhlIHNlcnZpY2UtcHJpbmNpcGFsIHBhdGggY2hhbmdlcyBvbmx5IHRoZSBEYXRhYnJpY2tzIENSRURFTlRJQUwuIE1lbW9yeVxuICAgKiB0aHJlYWRzLCB0aGUgcGVyLXVzZXIgY2FjaGUgbmFtZXNwYWNlLCBhbmQgdHJhY2UgbWV0YWRhdGEgc3RpbGwga2V5IG9mZiB0aGVcbiAgICogZm9yd2FyZGVkIHVzZXIsIHNvIGNhbGxlcnMgc2hhcmluZyB0aGUgc2VydmljZSBwcmluY2lwYWwncyBkYXRhIGFjY2VzcyBrZWVwXG4gICAqIHNlcGFyYXRlIGNvbnZlcnNhdGlvbnMgYW5kIGNhbm5vdCByZWFkIGVhY2ggb3RoZXIncyB0aHJlYWRzIG9yIGNoYXJ0cy5cbiAgICpcbiAgICogQGV4YW1wbGUgQW4gYXBwIGFueSBhY2NvdW50IHVzZXIgY2FuIG9wZW5cbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJzZXJ2aWNlLXByaW5jaXBhbFwiLCBnZW5pZVNwYWNlczogeyBkZWZhdWx0OiBzcGFjZUlkIH0gfSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAZXhhbXBsZSBPbmUgYXBwIGJlaGluZCBib3RoIHRoZSBmcm9udCBkb29yIGFuZCBhIHB1YmxpYyB0dW5uZWxcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgZ2VuaWVJZGVudGl0eTogXCJhdXRvXCIsIGdlbmllU3BhY2VzOiB7IGRlZmF1bHQ6IHNwYWNlSWQgfSB9KTtcbiAgICogYGBgXG4gICAqL1xuICBnZW5pZUlkZW50aXR5PzogTWFzdHJhSWRlbnRpdHlNb2RlO1xuICAvKipcbiAgICogT3B0aW9uYWwgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGNoYXJ0cyBwcm9kdWNlZCBieSB0aGUgYnVpbHQtaW5cbiAgICogYHJlbmRlcl9kYXRhYCAvIGBwcmVwYXJlX2NoYXJ0YCB0b29scy4gV2hlbiBzZXQsIHRoZSBjaGFydCBwbGFubmVyJ3NcbiAgICogRWNoYXJ0cyBvdXRwdXQgaXMgdGhlbWVkIHdpdGggdGhlIGJyYW5kJ3MgcGFsZXR0ZSAoc2VyaWVzIGNvbG9ycyBkZXJpdmVkXG4gICAqIGZyb20gYGNvbG9ycy5wcmltYXJ5YCAvIGBjb2xvcnMuYWNjZW50YCkgYW5kIHNhbnMgZm9udFxuICAgKiAoYHR5cG9ncmFwaHkuc2Fuc2ApIGluc3RlYWQgb2YgRWNoYXJ0cycgZGVmYXVsdHMuIE9taXQgZm9yIHRoZSBkZWZhdWx0XG4gICAqIEVjaGFydHMgbG9vay5cbiAgICpcbiAgICogUGFzcyB0aGUgcG9ydGFibGUge0BsaW5rIEJyYW5kQ29udGV4dH0gc2hhcmVkIGFjcm9zcyB0aGUgVUkgYW5kXG4gICAqIGxpYnJhcmllcyAoZS5nLiBgYnJhbmQuZGVmYXVsdEJyYW5kQ29udGV4dGAgZnJvbSBgQGRieC10b29scy9zaGFyZWQtY29yZWAsXG4gICAqIG9yIGEgY3VzdG9tZXIgYnJhbmQpIC0gdGhlIHNhbWUgb2JqZWN0IHRoZSBlbWFpbCBhZGQtb24gYW5kIHRoZSBVSVxuICAgKiBgQnJhbmRQcm92aWRlcmAgY29uc3VtZSwgc28gYSBob3N0IHRoZW1lcyBjaGFydHMsIGVtYWlsLCBhbmQgVUkgZnJvbSBvbmVcbiAgICogc291cmNlLlxuICAgKi9cbiAgYnJhbmQ/OiBCcmFuZENvbnRleHQ7XG4gIC8qKlxuICAgKiBSZW1vdGUgQWdlbnQtU2tpbGwgc291cmNlcyBtYXRlcmlhbGl6ZWQgb25jZSBhdCBhcHAgc3RhcnR1cC4gQSBzaW5nbGVcbiAgICogc291cmNlLCBhIGxpc3QsIG9yIGEgYHsgc291cmNlcywgZmFpbE9uRXJyb3I/LCAuLi4gfWAgYmFnLlxuICAgKlxuICAgKiBFYWNoIHNvdXJjZSBpcyBhIEdpdEh1YiBgb3duZXIvcmVwb2AsIGEgZ2l0IC8gR2l0TGFiIFVSTCwgb3IgYSBkaXJlY3RcbiAgICogYFNLSUxMLm1kYCAvIGFyY2hpdmUgZG93bmxvYWQgVVJMLiBSZXNvbHV0aW9uIHByZWZlcnMgdGhlIE9QVElPTkFMIGBza2lsbHNgXG4gICAqIG5wbSBDTEkgKGEgcGVlciBkZXApIHdoaWNoIGlzIGNvcGllZCBpbnRvIGEgdGVtcCBkaXIgYW5kIHRoZW4gcGVyc2lzdGVkO1xuICAgKiB3aXRob3V0IGl0LCBhIFVSTCBzb3VyY2UgaXMgZmV0Y2hlZCBkaXJlY3RseS4gQSBzb3VyY2UgdGhhdCByZXNvbHZlc1xuICAgKiB0aHJvdWdoIG5laXRoZXIgZmFpbHMgc3RhcnR1cCB1bmxlc3MgYGZhaWxPbkVycm9yOiBmYWxzZWAuXG4gICAqXG4gICAqIFByb3Zpc2lvbmVkIHNraWxscyBhcmUgd3JpdHRlbiB0byB0aGUgRGF0YWJyaWNrcyB1c2VyJ3MgQXNzaXN0YW50IHNraWxsc1xuICAgKiBmb2xkZXIgKGAvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2AsIHRoZSBcInNhdmUgdGhpcyBhcyBhIHNraWxsXCJcbiAgICogdGFyZ2V0KSBzbyB0aGV5IHBlcnNpc3QgYW5kIGFyZSBwaWNrZWQgdXAgYnkgdGhlIGJ1aWx0LWluIEFzc2lzdGFudC1za2lsbHNcbiAgICogbW91bnQuIFdpdGggbm8gd3JpdGFibGUgd29ya3NwYWNlLCB0aGV5IGdvIHRvIGEgbG9jYWwgdGVtcCBkaXIgaW5zdGVhZC5cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogYGBgdHNcbiAgICogbWFzdHJhKHsgcmVtb3RlU2tpbGxzOiBcInZlcmNlbC1sYWJzL2FnZW50LXNraWxsc1wiIH0pO1xuICAgKiBtYXN0cmEoe1xuICAgKiAgIHJlbW90ZVNraWxsczoge1xuICAgKiAgICAgc291cmNlczogW1widmVyY2VsLWxhYnMvYWdlbnQtc2tpbGxzXCIsIFwiaHR0cHM6Ly9leGFtcGxlLmNvbS9za2lsbC5tZFwiXSxcbiAgICogICAgIGZhaWxPbkVycm9yOiBmYWxzZSxcbiAgICogICB9LFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICByZW1vdGVTa2lsbHM/OiBSZW1vdGVTa2lsbHNPcHRpb247XG59XG5cbi8qKlxuICogSlNPTiBTY2hlbWEgcHVibGlzaGVkIG9uIHRoZSBtYW5pZmVzdCdzIGBjb25maWcuc2NoZW1hYCwgbWlycm9yaW5nIHRoZVxuICogZG9jdW1lbnRlZCBkZWZhdWx0cyBhbmQgZW52aXJvbm1lbnQgZmFsbGJhY2tzIG9mIHtAbGluayBNYXN0cmFQbHVnaW5Db25maWd9LlxuICpcbiAqIENvdmVycyB0aGUgSlNPTi1leHByZXNzaWJsZSBvcHRpb25zIG9ubHkuIGBhZ2VudHNgLCBgdG9vbHNgLCBhbmQgYVxuICogYGRlZmF1bHRNb2RlbGAgcGFzc2VkIGFzIGEgTWFzdHJhIGBEeW5hbWljQXJndW1lbnRgIGFyZSBjb2RlLWRlZmluZWRcbiAqIChmdW5jdGlvbnMgLyBjbGFzcyBpbnN0YW5jZXMpLCBzbyB0aGV5IGNhcnJ5IG5vIHNjaGVtYSBlbnRyeTsgdGhlXG4gKiBgZGVmYXVsdE1vZGVsYCBwcm9wZXJ0eSBiZWxvdyBkZXNjcmliZXMgaXRzIHN0cmluZyBmb3JtLlxuICovXG5leHBvcnQgY29uc3QgTUFTVFJBX0NPTkZJR19TQ0hFTUE6IENvbmZpZ1NjaGVtYSA9IHtcbiAgdHlwZTogXCJvYmplY3RcIixcbiAgcHJvcGVydGllczoge1xuICAgIHByb3ZpZGVySWQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjogJ01hc3RyYSBPcGVuQUktY29tcGF0aWJsZSBwcm92aWRlciBpZC4gRGVmYXVsdHMgdG8gXCJkYXRhYnJpY2tzXCIuJyxcbiAgICB9LFxuICAgIHJlbW90ZVNraWxsczoge1xuICAgICAgdHlwZTogW1wic3RyaW5nXCIsIFwiYXJyYXlcIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1JlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIHByb3Zpc2lvbmVkIGF0IHN0YXJ0dXA6IFwiYWl0b29sc1wiIGZvciBEYXRhYnJpY2tzXFwnIG93biBza2lsbCBzZXQgKHJlYWQgZnJvbSB0aGUgcHVibGljIGRhdGFicmlja3MvZGF0YWJyaWNrcy1hZ2VudC1za2lsbHMgcmVwbywgbm8gQ0xJIG5lZWRlZCksIGEgR2l0SHViIG93bmVyL3JlcG8sIGEgZ2l0L0dpdExhYiBVUkwsIG9yIGEgZGlyZWN0IFNLSUxMLm1kL2FyY2hpdmUgVVJMLiBOb24tYWl0b29scyBzb3VyY2VzIHByZWZlciB0aGUgb3B0aW9uYWwgYHNraWxsc2AgbnBtIENMSSwgZWxzZSBhIGRpcmVjdCBmZXRjaDsgZmFpbHMgc3RhcnR1cCBvbiBlcnJvciB1bmxlc3MgZmFpbE9uRXJyb3I6ZmFsc2UuIFdyaXR0ZW4gdG8gdGhlIERhdGFicmlja3MgdXNlciBBc3Npc3RhbnQgc2tpbGxzIGZvbGRlciwgb3IgYSBsb2NhbCB0ZW1wIGRpciB3aGVuIG5vIHdvcmtzcGFjZSBpcyB3cml0YWJsZS4nLFxuICAgIH0sXG4gICAgc3RvcmFnZToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBvc3RncmVzU3RvcmUgZm9yIE1hc3RyYSB0aHJlYWRzIC8gbWVzc2FnZXMuIGB0cnVlYCByZXVzZXMgdGhlIGBsYWtlYmFzZWAgcGx1Z2luJ3MgcG9vbCwgYW4gb2JqZWN0IG9wZW5zIGEgZGVkaWNhdGVkIHN0b3JlLiBBdXRvLWVuYWJsZWQgd2hlbiB0aGUgYGxha2ViYXNlYCBwbHVnaW4gaXMgcmVnaXN0ZXJlZC5cIixcbiAgICB9LFxuICAgIG1lbW9yeToge1xuICAgICAgdHlwZTogW1wiYm9vbGVhblwiLCBcIm9iamVjdFwiXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlBnVmVjdG9yIHN0b3JlIGZvciBNYXN0cmEgc2VtYW50aWMgcmVjYWxsLiBgdHJ1ZWAgcmV1c2VzIHRoZSBgbGFrZWJhc2VgIHBsdWdpbidzIHBvb2wsIGFuIG9iamVjdCBvcGVucyBhIGRlZGljYXRlZCBzdG9yZS4gQXV0by1lbmFibGVkIHdoZW4gdGhlIGBsYWtlYmFzZWAgcGx1Z2luIGlzIHJlZ2lzdGVyZWQuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0QWdlbnQ6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJBZ2VudCBpZCB1c2VkIHdoZW4gdGhlIGNsaWVudCBuYW1lcyBub25lLiBEZWZhdWx0cyB0byB0aGUgZmlyc3QgcmVnaXN0ZXJlZCBhZ2VudCwgZWxzZSB0aGUgYnVpbHQtaW4gYGRlZmF1bHRgLlwiLFxuICAgIH0sXG4gICAgZGVmYXVsdE1vZGVsOiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU2VydmluZyBlbmRwb2ludCBhcHBsaWVkIHRvIGV2ZXJ5IGFnZW50IHRoYXQgb21pdHMgaXRzIG93biBtb2RlbC4gRmFsbHMgYmFjayB0byBEQVRBQlJJQ0tTX1NFUlZJTkdfRU5EUE9JTlRfTkFNRSwgdGhlbiB0aGUgYXV0by1yZXNvbHZlZCBjYXRhbG9ndWUuXCIsXG4gICAgfSxcbiAgICBkZWZhdWx0TW9kZWxGYWxsYmFja3M6IHtcbiAgICAgIHR5cGU6IFwiYXJyYXlcIixcbiAgICAgIGl0ZW1zOiB7IHR5cGU6IFwic3RyaW5nXCIgfSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlByaW9yaXR5LW9yZGVyZWQgZW5kcG9pbnQgbmFtZXMgdHJpZWQgYmVmb3JlIHRoZSBzY29yZS1jbGFzc2lmaWVkIGNhdGFsb2d1ZSB3aGVuIG5vdGhpbmcgZWxzZSBwaW5zIGEgbW9kZWwuXCIsXG4gICAgfSxcbiAgICBtb2RlbEZ1enp5TWF0Y2g6IHtcbiAgICAgIHR5cGU6IFwiYm9vbGVhblwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiRnV6enktbWF0Y2ggbG9vc2UgbW9kZWwgbmFtZXMgYWdhaW5zdCB0aGUgd29ya3NwYWNlIGNhdGFsb2d1ZS4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIG1vZGVsRnV6enlUaHJlc2hvbGQ6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJGdXNlLmpzIHNjb3JlIHRocmVzaG9sZCBmb3IgdGhlIGZ1enp5IG1hdGNoZXIsIDAgKGV4YWN0KSB0byAxIChhbnl0aGluZykuIERlZmF1bHRzIHRvIDAuNC5cIixcbiAgICB9LFxuICAgIG1vZGVsQ2FjaGVUdGxNczoge1xuICAgICAgdHlwZTogXCJudW1iZXJcIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlRUTCBpbiBtcyBmb3IgdGhlIHNlcnZpbmctZW5kcG9pbnRzIGxpc3QgY2FjaGUsIHBlciB3b3Jrc3BhY2UgaG9zdC4gRGVmYXVsdHMgdG8gNSBtaW51dGVzLlwiLFxuICAgIH0sXG4gICAgbW9kZWxPdmVycmlkZToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIb25vciBhIHBlci1yZXF1ZXN0IG1vZGVsIG92ZXJyaWRlIGZyb20gdGhlIFgtTWFzdHJhLU1vZGVsIGhlYWRlciwgP21vZGVsPSBxdWVyeSwgb3IgYSBgbW9kZWxgIGJvZHkgZmllbGQuIERlZmF1bHRzIHRvIHRydWUuXCIsXG4gICAgfSxcbiAgICBnZW5pZVNwYWNlczoge1xuICAgICAgdHlwZTogXCJvYmplY3RcIixcbiAgICAgIGFkZGl0aW9uYWxQcm9wZXJ0aWVzOiB7IHR5cGU6IFtcInN0cmluZ1wiLCBcIm9iamVjdFwiXSB9LFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiR2VuaWUgc3BhY2VzIHRoZSBhZ2VudHMgY2FuIGRlbGVnYXRlIHRvLCBrZXllZCBieSBhbGlhcyAodGhlIHRvb2wtbmFtZSBzdWZmaXgpLiBFYWNoIHZhbHVlIGlzIGEgc3BhY2UgaWQgb3IgYHsgc3BhY2VJZCwgaGludCB9YC4gRmFsbHMgYmFjayB0byB0aGUgYGdlbmllYCBwbHVnaW4ncyBvd24gYHNwYWNlc2AgY29uZmlnLCB0aGVuIERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQgdW5kZXIgdGhlIGBkZWZhdWx0YCBhbGlhcy5cIixcbiAgICB9LFxuICAgIGdlbmllQWdlbnRNb2RlOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIlVzZSB0aGUgc3RyZWFtaW5nIEdlbmllIEFnZW50IE1vZGUgQVBJIGZvciBhc2tfZ2VuaWUuIERlZmF1bHRzIHRvIHRydWU7IGZhbHNlIGZvcmNlcyBsZWdhY3kgcG9sbGluZy4gRmVhdHVyZS1kaXNhYmxlZCBvciBwcmV2aWV3LXRvZ2dsZSByZXNwb25zZXMgZmFsbCBiYWNrIGF1dG9tYXRpY2FsbHkgYmVmb3JlIHN0cmVhbWluZy5cIixcbiAgICB9LFxuICAgIGdlbmllU3BhY2VDYWNoZVR0bE1zOiB7XG4gICAgICB0eXBlOiBcIm51bWJlclwiLFxuICAgICAgZGVzY3JpcHRpb246IFwiVFRMIGluIG1zIGZvciB0aGUgR2VuaWUgc3BhY2UgbWV0YWRhdGEgY2FjaGUuIERlZmF1bHRzIHRvIDUgbWludXRlcy5cIixcbiAgICB9LFxuICAgIGFnZW50TWF4U3RlcHM6IHtcbiAgICAgIHR5cGU6IFwibnVtYmVyXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJNYXhpbXVtIExMTSBzdGVwcyBlYWNoIGFnZW50IGdldHMgcGVyIHR1cm4gKGEgdG9vbCBjYWxsIGFuZCB0aGUgZmluYWwgcmVwbHkgZWFjaCBjb25zdW1lIG9uZSkuIERlZmF1bHRzIHRvIDI1LlwiLFxuICAgIH0sXG4gICAgc3RyaXBTdGFsZUNoYXJ0czoge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJTdHJpcCBjaGFydElkcyBmcm9tIHJlY2FsbGVkIGFzc2lzdGFudCB0b29sIHJlc3VsdHMgc28gdGhlIG1vZGVsIGNhbm5vdCByZXVzZSBhIHR1cm4tc2NvcGVkIGNoYXJ0IG1hcmtlci4gRGVmYXVsdHMgdG8gdHJ1ZS5cIixcbiAgICB9LFxuICAgIHN0eWxlSW5zdHJ1Y3Rpb25zOiB7XG4gICAgICB0eXBlOiBbXCJzdHJpbmdcIiwgXCJib29sZWFuXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiU3R5bGUgZ3VhcmRyYWlscyBhcHBlbmRlZCB0byBldmVyeSBhZ2VudCdzIGluc3RydWN0aW9ucy4gQSBzdHJpbmcgcmVwbGFjZXMgdGhlIGJ1aWx0LWluIGJsb2NrLCBgZmFsc2VgIGRpc2FibGVzIGl0LlwiLFxuICAgIH0sXG4gICAgb2JzZXJ2YWJpbGl0eToge1xuICAgICAgdHlwZTogXCJib29sZWFuXCIsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJCcmlkZ2UgTWFzdHJhIHNwYW5zIGludG8gQXBwS2l0J3MgT1RlbCBwaXBlbGluZS4gRGVmYXVsdHMgdG8gb24gb25seSB3aGVuIE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVCBvciBPVEVMX0VYUE9SVEVSX09UTFBfVFJBQ0VTX0VORFBPSU5UIGlzIHNldC5cIixcbiAgICB9LFxuICAgIGZlZWRiYWNrOiB7XG4gICAgICB0eXBlOiBcImJvb2xlYW5cIixcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkxvZyB0aHVtYnMgLyBjb21tZW50IGFzc2Vzc21lbnRzIHRvIE1MZmxvdyBhbmQgc3VyZmFjZSB0aGUgZmVlZGJhY2sgY29udHJvbHMuIERlZmF1bHRzIHRvIG9uIG9ubHkgd2hlbiBhbiBPVExQIGVuZHBvaW50IGFuZCBNTEZMT1dfRVhQRVJJTUVOVF9JRCBvciBNTEZMT1dfRVhQRVJJTUVOVF9OQU1FIGFyZSBzZXQuXCIsXG4gICAgfSxcbiAgICBtY3A6IHtcbiAgICAgIHR5cGU6IFtcImJvb2xlYW5cIiwgXCJvYmplY3RcIl0sXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJFeHBvc2UgdGhlIHJlZ2lzdGVyZWQgYWdlbnRzIG92ZXIgTUNQLiBEZWZhdWx0cyB0byBhZ2VudHMtb25seTsgYW4gb2JqZWN0IHR1bmVzIHRoZSBzZXJ2ZXIgaWQsIGFkdmVydGlzZWQgbWV0YWRhdGEsIGFuZCB3aGV0aGVyIGFtYmllbnQgdG9vbHMgYXJlIGV4cG9zZWQuXCIsXG4gICAgfSxcbiAgICBnZW5pZUlkZW50aXR5OiB7XG4gICAgICB0eXBlOiBcInN0cmluZ1wiLFxuICAgICAgLy8gRGVyaXZlZCBmcm9tIHRoZSByZXNvbHZlcidzIG93biBsaXN0LCBzbyBhIG1vZGUgY2FuIG5ldmVyIGJlIGFjY2VwdGVkIGF0XG4gICAgICAvLyBydW50aW1lIHdoaWxlIHRoZSBwdWJsaXNoZWQgc2NoZW1hIChhbmQgdGhlIFVJIGJ1aWx0IGZyb20gaXQpIG9taXRzIGl0LlxuICAgICAgZW51bTogWy4uLklERU5USVRZX01PREVTXSxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnV2hpY2ggRGF0YWJyaWNrcyBpZGVudGl0eSB0aGUgYWdlbnRzXFwnIHdvcmtzcGFjZSBjYWxscyAoc2VydmluZyBjYXRhbG9ndWUsIEdlbmllLCBzdGF0ZW1lbnQgZXhlY3V0aW9uKSBydW4gYXMuIFwidXNlclwiIChkZWZhdWx0KSBpcyBhbHdheXMgT0JPLCBzbyBjYWxsZXJzIG11c3QgYmUgd29ya3NwYWNlIG1lbWJlcnM7IFwic2VydmljZS1wcmluY2lwYWxcIiBhbHdheXMgdXNlcyB0aGUgYXBwIHNlcnZpY2UgcHJpbmNpcGFsLCBzbyBhbnkgY2FsbGVyIHdobyBjYW4gb3BlbiB0aGUgYXBwIHdvcmtzLCBhdCB0aGUgY29zdCBvZiBwZXItdXNlciBhdHRyaWJ1dGlvbjsgXCJhdXRvXCIgdXNlcyBPQk8gd2hlbiB0aGUgcmVxdWVzdCBjYXJyaWVzIGFuIE9CTyB0b2tlbiBhbmQgdGhlIHNlcnZpY2UgcHJpbmNpcGFsIHdoZW4gaXQgZG9lcyBub3QsIGZvciBhbiBhcHAgdGhhdCBhbHNvIHNlcnZlcyBhIHR1bm5lbCBvciB3ZWJob29rIGRvb3IuIEZhbGxzIGJhY2sgdG8gTUFTVFJBX0dFTklFX0lERU5USVRZLicsXG4gICAgfSxcbiAgICBhcGlBY2Nlc3M6IHtcbiAgICAgIHR5cGU6IFwic3RyaW5nXCIsXG4gICAgICBlbnVtOiBbXCJzY29wZWRcIiwgXCJmdWxsXCJdLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdIb3cgbXVjaCBvZiB0aGUgc3RvY2sgQG1hc3RyYS9leHByZXNzIEFQSSBpcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbW91bnQuIFwic2NvcGVkXCIgKGRlZmF1bHQpIGFsbG93cyBhZ2VudCBpbmZlcmVuY2UsIHJlYWQtb25seSBhZ2VudCBtZXRhZGF0YSwgdGhpcyBwbHVnaW5cXCdzIG93biByb3V0ZXMsIGFuZCBNQ1A7IFwiZnVsbFwiIGRpc3BhdGNoZXMgdGhlIGVudGlyZSBtYW5hZ2VtZW50IHN1cmZhY2UuJyxcbiAgICB9LFxuICAgIGJyYW5kOiB7XG4gICAgICB0eXBlOiBcIm9iamVjdFwiLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgIFwiUG9ydGFibGUgYnJhbmQgY29udGV4dCBhcHBsaWVkIHRvIGdlbmVyYXRlZCBjaGFydHMgKHNlcmllcyBwYWxldHRlIGZyb20gY29sb3JzLnByaW1hcnkgLyBjb2xvcnMuYWNjZW50LCBiYXNlIGZvbnQgZnJvbSB0eXBvZ3JhcGh5LnNhbnMpLlwiLFxuICAgIH0sXG4gIH0sXG59O1xuIl19
|
package/lib/src/genie.js
CHANGED
|
@@ -279,7 +279,7 @@ function stripSuggestedQuestions(message) {
|
|
|
279
279
|
return { ...message, attachments: filtered };
|
|
280
280
|
}
|
|
281
281
|
function buildAskGenieTool(opts) {
|
|
282
|
-
const { spaceId, alias, hint } = opts;
|
|
282
|
+
const { spaceId, alias, hint, agentMode } = opts;
|
|
283
283
|
const toolId = `ask_genie${aliasSuffix(alias)}`;
|
|
284
284
|
const hintLine = hint ? ` (${hint})` : "";
|
|
285
285
|
return createTool({
|
|
@@ -298,16 +298,17 @@ function buildAskGenieTool(opts) {
|
|
|
298
298
|
Do NOT try to cram a multi-part question into a single
|
|
299
299
|
call; decompose first, then ask each piece.
|
|
300
300
|
|
|
301
|
-
Returns the final \`GenieMessage\`.
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
301
|
+
Returns the final \`GenieMessage\`. Agent Mode includes the
|
|
302
|
+
synthesized answer and can include SQL result values as a
|
|
303
|
+
Markdown text attachment. A legacy polling result instead
|
|
304
|
+
carries a \`statement_id\` (at
|
|
305
|
+
\`message.query_result.statement_id\` or the first
|
|
306
|
+
attachment's \`query.statement_id\`); call
|
|
305
307
|
\`get_statement\` with that id only when you need to read
|
|
306
|
-
the underlying values to reason about them. If you just
|
|
307
|
-
|
|
308
|
-
\`[data:<statement_id>]\` marker in
|
|
309
|
-
|
|
310
|
-
events (status, thinking, sql) stream to the user
|
|
308
|
+
the underlying values to reason about them. If you just want
|
|
309
|
+
to display a legacy result, embed a
|
|
310
|
+
\`[data:<statement_id>]\` marker in prose. Wire events
|
|
311
|
+
(status, reasoning, SQL, query output, answer text) stream
|
|
311
312
|
automatically while the call is in flight.
|
|
312
313
|
`),
|
|
313
314
|
inputSchema: z.object({
|
|
@@ -367,6 +368,7 @@ function buildAskGenieTool(opts) {
|
|
|
367
368
|
let finalMessage;
|
|
368
369
|
for await (const event of chat.genieEventChat(spaceId, question, {
|
|
369
370
|
workspaceClient: client,
|
|
371
|
+
...(agentMode !== undefined ? { agentMode } : {}),
|
|
370
372
|
...(seedConversationId ? { conversationId: seedConversationId } : {}),
|
|
371
373
|
...(signal ? { context: signal } : {}),
|
|
372
374
|
})) {
|
|
@@ -696,8 +698,10 @@ export const GENIE_INSTRUCTIONS = string.toDescription([
|
|
|
696
698
|
`,
|
|
697
699
|
`
|
|
698
700
|
Each \`ask_genie\` call returns the terminal \`GenieMessage\`.
|
|
699
|
-
|
|
700
|
-
|
|
701
|
+
Read Agent Mode's synthesized answer and Markdown query output
|
|
702
|
+
directly from its text attachments. A legacy polling result may
|
|
703
|
+
instead expose a \`statement_id\` at
|
|
704
|
+
\`message.query_result.statement_id\` (or the first
|
|
701
705
|
attachment's \`query.statement_id\`).
|
|
702
706
|
`,
|
|
703
707
|
[
|
|
@@ -874,6 +878,9 @@ export function buildGenieTools(opts) {
|
|
|
874
878
|
const askTool = buildAskGenieTool({
|
|
875
879
|
spaceId: space.spaceId,
|
|
876
880
|
alias,
|
|
881
|
+
...(opts.config.genieAgentMode !== undefined
|
|
882
|
+
? { agentMode: opts.config.genieAgentMode }
|
|
883
|
+
: {}),
|
|
877
884
|
...(space.hint ? { hint: space.hint } : {}),
|
|
878
885
|
});
|
|
879
886
|
const descTool = buildSpaceDescriptionTool({ spaceId: space.spaceId, alias });
|
|
@@ -977,4 +984,4 @@ export async function collectSpaceSuggestions(opts) {
|
|
|
977
984
|
}
|
|
978
985
|
return merged;
|
|
979
986
|
}
|
|
980
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBR3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBR3hCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUM7QUF1QzdDOzs7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QUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN0QixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksS0FBSztnQkFBRSxPQUFPLE1BQU0sQ0FBQztRQUM1QyxDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEdlbmllIHRvb2xzIGZvciBNYXN0cmEuXG4gKlxuICogU3VyZmFjZXMgZWFjaCBjb25maWd1cmVkIEdlbmllIHNwYWNlIGFzIGEgc21hbGwgc2V0IG9mIGZsYXQgTWFzdHJhXG4gKiB0b29scyB0aGUgY2FsbGluZyBhZ2VudCBkcml2ZXMgZGlyZWN0bHkgLSBubyBpbm5lciBvcmNoZXN0cmF0b3JcbiAqIGFnZW50LiBUaGUgY2VudHJhbCBhZ2VudCBkZWNvbXBvc2VzIHVzZXIgcXVlc3Rpb25zLCBwaWNrcyB3aGljaFxuICogc3BhY2UgdG8gYXNrLCBzdHJlYW1zIHRoZSBwZXItdHVybiB3aXJlIGV2ZW50cyAoc3RhdHVzLCB0aGlua2luZyxcbiAqIHNxbCwgcm93cykgdGhyb3VnaCBgY3R4LndyaXRlcmAsIGFuZCBjb21wb3NlcyB0aGUgZmluYWwgcmVwbHkuXG4gKiBSb3dzIGFyZSBuZXZlciBmZXRjaGVkIGVhZ2VybHk6IHRoZSBhZ2VudCByZWFkcyBhIHN0YXRlbWVudCdzXG4gKiB2YWx1ZXMgb25seSB3aGVuIGl0IG5lZWRzIHRvIHJlYXNvbiBhYm91dCB0aGVtLCBvdGhlcndpc2UgaXQgZW1iZWRzXG4gKiBhIGBbZGF0YTo8c3RhdGVtZW50X2lkPl1gIG1hcmtlciBpbiBwcm9zZSBhbmQgbGV0cyB0aGUgaG9zdCBVSVxuICogcmVzb2x2ZSB0aGUgZGF0YS4gQ2hhcnRzIGFyZSBtaW50ZWQgYXN5bmNocm9ub3VzbHkgYW5kIHJlZmVyZW5jZWRcbiAqIGJ5IGBbY2hhcnQ6PGNoYXJ0SWQ+XWAgbWFya2VycyBzbyBwcm9zZSBpc24ndCBibG9ja2VkIG9uIGNoYXJ0XG4gKiBnZW5lcmF0aW9uOyB0aGUgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgc3BlYyBieSBpZCBvbmNlIHJlYWR5LlxuICogU3BhY2UgZGVzY3JpcHRpb24gYW5kIHNlcmlhbGl6ZWQtc3BhY2UgbG9va3VwcyBhcmUgYXZhaWxhYmxlIGZvclxuICogZ3JvdW5kaW5nIHdoZW4gdGhlIGFnZW50IG5lZWRzIHNjaGVtYSBjb250ZXh0LlxuICpcbiAqIEVhY2ggdG9vbCdzIGBleGVjdXRlYCBwdWxscyB0aGUgcGVyLXJlcXVlc3RcbiAqIHtAbGluayBXb3Jrc3BhY2VDbGllbnR9IG9mZiBgY3R4LnJlcXVlc3RDb250ZXh0YCAoc3RhbXBlZCBieVxuICogYE1hc3RyYVNlcnZlcmAgdW5kZXIge0BsaW5rIE1BU1RSQV9VU0VSX0tFWX0pIGFuZCB0aGUgcGVyLWNhbGxcbiAqIGB3cml0ZXJgIC8gYGFib3J0U2lnbmFsYCBvZmYgYGN0eGAsIHNvIHRoZSB0b29scyBhcmUgc3RhdGVsZXNzXG4gKiBhY3Jvc3MgcmVxdWVzdHMgYW5kIHRoZSBjZW50cmFsIGFnZW50IG93bnMgdGhlIGxvb3AuXG4gKlxuICogVGhlIHRvb2xzIHRhbGsgdG8gR2VuaWUgZGlyZWN0bHkgdmlhIGBAZGJ4LXRvb2xzL2dlbmllYFxuICogKGBnZW5pZUV2ZW50Q2hhdGApOyBzdGF0ZW1lbnQtcm93IGZldGNoaW5nIGlzIGRlbGVnYXRlZCB0b1xuICoge0BsaW5rIGZldGNoU3RhdGVtZW50RGF0YX0gZnJvbSBgLi9zdGF0ZW1lbnQuanNgLCB3aGljaCB3cmFwc1xuICogdGhlIHdvcmtzcGFjZSBgc3RhdGVtZW50RXhlY3V0aW9uLmdldFN0YXRlbWVudGAgQVBJLiBBcHBLaXQnc1xuICogc3RvY2sgYGdlbmllYCBwbHVnaW4gaXMgaG9ub3JlZCBvbmx5IGZvciBpdHMgYHNwYWNlc2AgY29uZmlnXG4gKiBzbyBleGlzdGluZyBBcHBLaXQtc3R5bGUgd2lyaW5nIGtlZXBzIHdvcmtpbmcgd2l0aG91dCBjaGFuZ2UuXG4gKlxuICogU3VnZ2VzdGVkIG9yY2hlc3RyYXRpb24gcHJvbXB0IGZvciB0aGUgY2VudHJhbCBhZ2VudCBsaXZlcyBpblxuICoge0BsaW5rIEdFTklFX0lOU1RSVUNUSU9OU307IGNvbXBvc2UgaXQgaW50byB0aGUgYWdlbnQncyBvd25cbiAqIGBpbnN0cnVjdGlvbnNgIHdoZW4geW91IHdhbnQgdGhlIGNhbm9uaWNhbCBcImhvdyB0byBkcml2ZSB0aGVcbiAqIEdlbmllIHRvb2xzXCIgZ3VpZGFuY2UuXG4gKlxuICogQG1vZHVsZVxuICovXG5cbmltcG9ydCB7XG4gIENhY2hlTWFuYWdlcixcbiAgQ29uZmlndXJhdGlvbkVycm9yLFxuICBFeGVjdXRpb25FcnJvcixcbiAgZ2VuaWUsXG4gIFZhbGlkYXRpb25FcnJvcixcbn0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBwbHVnaW4gfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB7IGNoYXQsIHNwYWNlIGFzIGdlbmllU3BhY2UgfSBmcm9tIFwiQGRieC10b29scy9nZW5pZVwiO1xuaW1wb3J0IHsgZXJyb3IsIGxvZywgc3RyaW5nIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IGdlbmllTW9kZWwsIHR5cGUgR2VuaWVNZXNzYWdlIH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWdlbmllXCI7XG5pbXBvcnQgdHlwZSB7IE1hc3RyYVdyaXRlciwgU3RhcnRlZEV2ZW50IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLW1hc3RyYVwiO1xuaW1wb3J0IHR5cGUgeyBSZXF1ZXN0Q29udGV4dCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBNQVNUUkFfVEhSRUFEX0lEX0tFWSB9IGZyb20gXCJAbWFzdHJhL2NvcmUvcmVxdWVzdC1jb250ZXh0XCI7XG5pbXBvcnQgeyBjcmVhdGVUb29sIH0gZnJvbSBcIkBtYXN0cmEvY29yZS90b29sc1wiO1xuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIjtcblxuaW1wb3J0IHR5cGUgeyBNYXN0cmFUb29scyB9IGZyb20gXCIuL2FnZW50cy50c1wiO1xuaW1wb3J0IHsgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYSwgY2hhcnRUb29sT3V0cHV0U2NoZW1hLCBwcmVwYXJlQ2hhcnQgfSBmcm9tIFwiLi9jaGFydC50c1wiO1xuaW1wb3J0IHsgTUFTVFJBX1VTRVJfS0VZLCByZXNvbHZlVXNlcktleSB9IGZyb20gXCIuL2NvbmZpZy50c1wiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFQbHVnaW5Db25maWcsIFVzZXIgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB7IGZldGNoU3RhdGVtZW50RGF0YSB9IGZyb20gXCIuL3N0YXRlbWVudC50c1wiO1xuaW1wb3J0IHsgc2FmZVdyaXRlIH0gZnJvbSBcIi4vd3JpdGVyLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvZ2VuaWVcIik7XG5cbi8qKiBEZWZhdWx0IGFsaWFzIHVzZWQgd2hlbiBhIHNpbmdsZSB1bm5hbWVkIEdlbmllIHNwYWNlIGlzIHdpcmVkIHVwLiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfR0VOSUVfQUxJQVMgPSBcImRlZmF1bHRcIjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbmZpZyB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqIFBlci1zcGFjZSBHZW5pZSBhZ2VudCBjb25maWd1cmF0aW9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBHZW5pZVNwYWNlQ29uZmlnIHtcbiAgLyoqIEdlbmllIGBzcGFjZV9pZGAuIFJlcXVpcmVkOyByZXNvbHZlcyB2aWEgYGNsaWVudC5nZW5pZS5nZXRTcGFjZWAuICovXG4gIHNwYWNlSWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIGFwcGVuZGVkIHRvIHRoZSBwZXItc3BhY2VcbiAgICogdG9vbCBkZXNjcmlwdGlvbnMgc28gdGhlIGNhbGxpbmcgTExNIGhhcyBoaW50cyBhYm91dCAqd2hhdFxuICAgKiBkYXRhKiB0aGlzIHNwYWNlIGNvdmVycyAoZS5nLiBcIm9yZGVycywgcmV0dXJucyxcbiAgICogZnVsZmlsbG1lbnRcIikuIFdoZW4gb21pdHRlZCwgb25seSB0aGUgc3BhY2UncyBvd25cbiAgICogYGRlc2NyaXB0aW9uYCAoZmV0Y2hlZCBvbiBmaXJzdCB1c2Ugb2YgYGdldF9zcGFjZV9kZXNjcmlwdGlvbmApXG4gICAqIGlzIHNob3duLlxuICAgKi9cbiAgaGludD86IHN0cmluZztcbn1cblxuLyoqIE1hcCBvZiBhbGlhcyAtPiBzcGFjZSBjb25maWcuIEFjY2VwdHMgZWl0aGVyIGV4cGxpY2l0IG9iamVjdHMgb3IgYmFyZSBzcGFjZSBpZHMuICovXG5leHBvcnQgdHlwZSBHZW5pZVNwYWNlc0NvbmZpZyA9IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWcgfCBzdHJpbmc+O1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGN0eCBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBOYXJyb3cgdmlldyBvZiB0aGUgc2Vjb25kIGFyZyBNYXN0cmEgcGFzc2VzIHRvIGEgdG9vbCdzXG4gKiBgZXhlY3V0ZShpbnB1dCwgY3R4KWAuIENhcHR1cmVzIHRoZSBmaWVsZHMgdGhlIEdlbmllIHRvb2xzXG4gKiBhY3R1YWxseSByZWFkIC0gYHJlcXVlc3RDb250ZXh0YCAoZm9yIHVzZXIgLyBjb252ZXJzYXRpb25cbiAqIHN0YXRlKSwgYHdyaXRlcmAgKGZvciBzdHJlYW1pbmcgZXZlbnRzIHRvIHRoZSBob3N0IFVJKSwgYW5kXG4gKiBgYWJvcnRTaWduYWxgIChmb3IgcGVyLWNhbGwgY2FuY2VsbGF0aW9uKS5cbiAqL1xudHlwZSBUb29sRXhlY3V0ZUN0eCA9XG4gIHwge1xuICAgICAgcmVxdWVzdENvbnRleHQ/OiBSZXF1ZXN0Q29udGV4dDtcbiAgICAgIHdyaXRlcj86IE1hc3RyYVdyaXRlcjtcbiAgICAgIGFib3J0U2lnbmFsPzogQWJvcnRTaWduYWw7XG4gICAgfVxuICB8IHVuZGVmaW5lZDtcblxuLyoqXG4gKiBQdWxsIHRoZSBwZXItcmVxdWVzdCB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBvZmYgdGhlIGFjdGl2ZVxuICogYFJlcXVlc3RDb250ZXh0YC4gVGhlIE1hc3RyYSBwbHVnaW4ncyBzZXJ2ZXIgbWlkZGxld2FyZSBzdGFtcHNcbiAqIGEge0BsaW5rIFVzZXJ9IG9uIHRoZSBjb250ZXh0IHVuZGVyIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9XG4gKiBmb3IgZXZlcnkgcmVxdWVzdDsgdG9vbHMgZmFpbCBsb3VkbHkgd2hlbiBpdCdzIG1pc3NpbmcgYmVjYXVzZVxuICogdGhhdCBtZWFucyB0aGUgTWFzdHJhIHBsdWdpbiBpc24ndCBydW5uaW5nIChlLmcuIGEgdG9vbCB3YXNcbiAqIGludm9rZWQgb3V0c2lkZSB0aGUgY2hhdCByb3V0ZSkuXG4gKi9cbmZ1bmN0aW9uIHJlcXVpcmVDbGllbnQoXG4gIGN0eDogVG9vbEV4ZWN1dGVDdHgsXG4gIHRvb2xJZDogc3RyaW5nLFxuKToge1xuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudDtcbiAgcmVxdWVzdENvbnRleHQ6IFJlcXVlc3RDb250ZXh0O1xufSB7XG4gIGNvbnN0IHJlcXVlc3RDb250ZXh0ID0gY3R4Py5yZXF1ZXN0Q29udGV4dDtcbiAgaWYgKCFyZXF1ZXN0Q29udGV4dCkge1xuICAgIHRocm93IENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKFxuICAgICAgYCR7dG9vbElkfSByZXF1ZXN0IGNvbnRleHRgLFxuICAgICAgXCJJbnZva2UgdGhlIHRvb2wgZnJvbSBhbiBhZ2VudCB0dXJuIHNlcnZlZCBieSB0aGUgbWFzdHJhIHBsdWdpbi5cIixcbiAgICApO1xuICB9XG4gIGNvbnN0IHVzZXIgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1VTRVJfS0VZKSBhcyBVc2VyIHwgdW5kZWZpbmVkO1xuICBpZiAoIXVzZXIpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGAke3Rvb2xJZH0gdXNlciBjb250ZXh0YCxcbiAgICAgIFwiSW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW4sIHdoaWNoIHN0YW1wcyB0aGUgQXBwS2l0IHVzZXIgb24gdGhlIE1hc3RyYSByZXF1ZXN0IGNvbnRleHQuXCIsXG4gICAgKTtcbiAgfVxuICByZXR1cm4geyBjbGllbnQ6IHVzZXIuZXhlY3V0aW9uQ29udGV4dC5jbGllbnQsIHJlcXVlc3RDb250ZXh0IH07XG59XG5cbi8qKlxuICogTG93ZXJjYXNlZCBwbGFjZWhvbGRlciBzdHJpbmdzIHdlIHJlamVjdCBhdCB0aGUgYGFza19nZW5pZWBcbiAqIGJvdW5kYXJ5IHNvIHRoZSBMTE0gZG9lc24ndCBzcGVuZCBhIEdlbmllIHJvdW5kLXRyaXAgb24gYVxuICogbm9uLXF1ZXN0aW9uLiBHZW5pZSBwb2xpdGVseSBhbnN3ZXJzIGFueSBvZiB0aGVzZSB3aXRoIFwiWW91clxuICogcmVxdWVzdCAnLi4uJyBkb2VzIG5vdCByZWxhdGUgdG8uLi5cIiB3aGljaCBpcyBwdXJlIFVJIG5vaXNlLlxuICogS2VwdCBuYXJyb3cgb24gcHVycG9zZSAtIHJlYWwgcXVlc3Rpb25zIHNvbWV0aW1lcyBzdGFydCB3aXRoXG4gKiBvbmUgb2YgdGhlc2UgdG9rZW5zLCBzbyB3ZSBvbmx5IG1hdGNoIHRoZSBGVUxMIHRyaW1tZWQgc3RyaW5nLlxuICovXG5jb25zdCBQTEFDRUhPTERFUl9RVUVTVElPTlMgPSBuZXcgU2V0KFtcbiAgXCJub29wXCIsXG4gIFwibm8tb3BcIixcbiAgXCJza2lwXCIsXG4gIFwibm9uZVwiLFxuICBcIm4vYVwiLFxuICBcIm5hXCIsXG4gIFwibnVsbFwiLFxuICBcInVuZGVmaW5lZFwiLFxuICBcInRlc3RcIixcbiAgXCJwbGFjZWhvbGRlclwiLFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNvbnZlcnNhdGlvbiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEVzdGltYXRlZCBHZW5pZSBjb252ZXJzYXRpb24gbGlmZXRpbWUgaW4gc2Vjb25kcy4gRGF0YWJyaWNrc1xuICogcHVibGlzaGVzIG5vIG9mZmljaWFsIFRUTCBvbiB0aGUgY29udmVyc2F0aW9uIHJlc291cmNlIGl0c2VsZjtcbiAqIGNvbW11bml0eSBwcm9qZWN0cyAoZS5nLiB0aGUgb3Blbi1zb3VyY2UgRGF0YWJyaWNrcyBHZW5pZSBCb3QpXG4gKiBjb252ZXJnZSBvbiA0IGhvdXJzIG9mIGluYWN0aXZpdHkgYXMgYSBzYWZlIG9wZXJhdGluZyB3aW5kb3cuXG4gKiBUcmVhdCB0aGlzIGFzIGFuIGVzdGltYXRlIHRoYXQgZ2V0cyAqZXh0ZW5kZWQgb24gZXZlcnkgdXNlKiBieVxuICogcmUtc2V0dGluZyB0aGUgY2FjaGUgZW50cnkgYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIHR1cm4gKHNsaWRpbmdcbiAqIFRUTCB2aWEgcmUtYHNldGApLiBXaGVuIHRoZSBlc3RpbWF0ZSBlbmRzIHVwIHdyb25nIChjb252ZXJzYXRpb25cbiAqIGRlbGV0ZWQsIGV4cGlyZWQgdXBzdHJlYW0sIGNyb3NzLXNwYWNlIHJlZmVyZW5jZWQpLCBgYXNrX2dlbmllYFxuICogY2F0Y2hlcyB0aGUgU0RLJ3MgYFJFU09VUkNFX0RPRVNfTk9UX0VYSVNUYC80MDQgYW5kIHRyYW5zcGFyZW50bHlcbiAqIHN0YXJ0cyBhIGZyZXNoIGNvbnZlcnNhdGlvbi5cbiAqL1xuY29uc3QgQ09OVkVSU0FUSU9OX1RUTF9TRUMgPSA0ICogNjAgKiA2MDtcblxuLyoqIENhY2hlIG5hbWVzcGFjZSBwcmVmaXggc28gY29leGlzdGluZyBNYXN0cmEgY2FjaGVzIGRvbid0IGNvbGxpZGUuICovXG5jb25zdCBDT05WRVJTQVRJT05fQ0FDSEVfTkFNRVNQQUNFID0gXCJtYXN0cmE6Z2VuaWU6Y29udmVyc2F0aW9uXCI7XG5cbi8qKlxuICogUGVyLXJlcXVlc3Qgc3RhdGUgZm9yIG9uZSBHZW5pZSBzcGFjZS4gVGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiBpcyByZXNlcnZlZFxuICogYnkgYXQgbW9zdCBvbmUgaW52b2NhdGlvbiBhdCBhIHRpbWUuIEFkZGl0aW9uYWwgY29uY3VycmVudCBpbnZvY2F0aW9ucyB1c2VcbiAqIGlzb2xhdGVkIGNvbnZlcnNhdGlvbnMgc28gTWFzdHJhIGNhbiBleGVjdXRlIHBhcmFsbGVsIHRvb2wgY2FsbHMgd2l0aG91dFxuICogYXBwZW5kaW5nIG11bHRpcGxlIGFjdGl2ZSBtZXNzYWdlcyB0byB0aGUgc2FtZSBHZW5pZSBjb252ZXJzYXRpb24uXG4gKi9cbmludGVyZmFjZSBDb252ZXJzYXRpb25TdGF0ZSB7XG4gIGNvbnZlcnNhdGlvbklkPzogc3RyaW5nO1xuICByZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0OiBib29sZWFuO1xufVxuXG4vKiogQnVpbGQgdGhlIHBlci1yZXF1ZXN0IHtAbGluayBSZXF1ZXN0Q29udGV4dH0ga2V5IGZvciBvbmUgR2VuaWUgc3BhY2UuICovXG5jb25zdCBjb252ZXJzYXRpb25Db250ZXh0S2V5ID0gKHNwYWNlSWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICBgbWFzdHJhX19nZW5pZV9jb252ZXJzYXRpb25fXyR7c3BhY2VJZH1gO1xuXG4vKipcbiAqIFJlYWQgb3IgaW5pdGlhbGl6ZSB0aGUgcGVyLXNwYWNlIGNvbnZlcnNhdGlvbiBzdGF0ZS4gVGhlIHN0cmluZyBicmFuY2hcbiAqIHByZXNlcnZlcyBjb21wYXRpYmlsaXR5IHdpdGggYSBjb250ZXh0IHBvcHVsYXRlZCBieSBhbiBvbGRlciBwYWNrYWdlIGNvcHkuXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnNhdGlvblN0YXRlKHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dCwgc3BhY2VJZDogc3RyaW5nKTogQ29udmVyc2F0aW9uU3RhdGUge1xuICBjb25zdCBrZXkgPSBjb252ZXJzYXRpb25Db250ZXh0S2V5KHNwYWNlSWQpO1xuICBjb25zdCBjdXJyZW50ID0gcmVxdWVzdENvbnRleHQuZ2V0KGtleSkgYXMgQ29udmVyc2F0aW9uU3RhdGUgfCBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGlmIChjdXJyZW50ICYmIHR5cGVvZiBjdXJyZW50ID09PSBcIm9iamVjdFwiKSByZXR1cm4gY3VycmVudDtcbiAgY29uc3Qgc3RhdGU6IENvbnZlcnNhdGlvblN0YXRlID0ge1xuICAgIC4uLih0eXBlb2YgY3VycmVudCA9PT0gXCJzdHJpbmdcIiA/IHsgY29udmVyc2F0aW9uSWQ6IGN1cnJlbnQgfSA6IHt9KSxcbiAgICByZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0OiBmYWxzZSxcbiAgfTtcbiAgcmVxdWVzdENvbnRleHQuc2V0KGtleSwgc3RhdGUpO1xuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogUmVzZXJ2ZSB0aGUgcmV1c2FibGUgY29udmVyc2F0aW9uIHdoZW4gaXQgaXMgaWRsZS4gQSBjYWxsZXIgdGhhdCBjYW5ub3RcbiAqIHJlc2VydmUgaXQgZ2V0cyBhbiBpc29sYXRlZCBjb252ZXJzYXRpb24gYW5kIG1heSBydW4gaW4gcGFyYWxsZWwuXG4gKi9cbmZ1bmN0aW9uIHJlc2VydmVDb252ZXJzYXRpb24oc3RhdGU6IENvbnZlcnNhdGlvblN0YXRlKTogYm9vbGVhbiB7XG4gIGlmIChzdGF0ZS5yZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0KSByZXR1cm4gZmFsc2U7XG4gIHN0YXRlLnJldXNhYmxlQ29udmVyc2F0aW9uSW5GbGlnaHQgPSB0cnVlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY2Fub25pY2FsIGNhY2hlIGtleSBmb3IgYSBgKHNwYWNlSWQsIHRocmVhZElkKWAgcGFpciwgb3duZWQgYnlcbiAqIGB1c2VyS2V5YC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIGB0aHJlYWRJZGAgaXMgbWlzc2luZyAtIGNhbGxlcnMgc2hvdWxkXG4gKiBza2lwIGNhY2hpbmcgZW50aXJlbHkgaW4gdGhhdCBjYXNlIChubyBNYXN0cmEgbWVtb3J5IHdpcmVkIHVwKS5cbiAqXG4gKiBUaGUgaWRlbnRpdHkgaXMgcGFydCBvZiB0aGUga2V5IGJlY2F1c2UgYSBjbGllbnQgcGlja3MgaXRzIG93biBgdGhyZWFkSWRgXG4gKiAodGhlIHRocmVhZC1zZWxlY3Rpb24gaGVhZGVyIC8gYD90aHJlYWRJZD1gKSwgc28gdGhlIGlkIGFsb25lIGRvZXMgbm90XG4gKiBlc3RhYmxpc2ggd2hvIG93bnMgdGhlIEdlbmllIGNvbnZlcnNhdGlvbiBiZWhpbmQgaXQuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbnZlcnNhdGlvbkNhY2hlS2V5KFxuICBzcGFjZUlkOiBzdHJpbmcsXG4gIHRocmVhZElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHVzZXJLZXk6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghdGhyZWFkSWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIHJldHVybiAoYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlKCkpLmdlbmVyYXRlS2V5KFxuICAgIFtDT05WRVJTQVRJT05fQ0FDSEVfTkFNRVNQQUNFLCBzcGFjZUlkLCB0aHJlYWRJZF0sXG4gICAgdXNlcktleSxcbiAgKTtcbn1cblxuLyoqXG4gKiBSZWFkIHRoZSBjYWNoZWQgR2VuaWUgY29udmVyc2F0aW9uIGlkIGZvciBgKHNwYWNlSWQsIHRocmVhZElkKWAuXG4gKiBSZXR1cm5zIGB1bmRlZmluZWRgIG9uIG1pc3MsIG9uIGV4cGlyeSwgb3Igd2hlbiB0aGUgY2FjaGUgbGF5ZXJcbiAqIGlzIHVuaGVhbHRoeSAtIG5ldmVyIHRocm93cy4gVGhlIFRUTCBpcyByZW5ld2VkIHZpYSByZS1gc2V0YFxuICogYWZ0ZXIgZWFjaCBzdWNjZXNzZnVsIHR1cm4gKHNlZSB7QGxpbmsgc2F2ZUNhY2hlZENvbnZlcnNhdGlvbklkfSkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgaWYgKCFjYWNoZUtleSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCB2ID0gYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmdldDxzdHJpbmc+KGNhY2hlS2V5KTtcbiAgICByZXR1cm4gdiA/PyB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOnJlYWQtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJzaXN0IHRoZSBhY3RpdmUgY29udmVyc2F0aW9uIGlkIHVuZGVyIGBjYWNoZUtleWAsIHJlZnJlc2hpbmdcbiAqIGl0cyBUVEwuIElkZW1wb3RlbnQ7IG5vLW9wIHdoZW4gYGNhY2hlS2V5YCBvciBgY29udmVyc2F0aW9uSWRgXG4gKiBpcyBtaXNzaW5nLiBSZS1zZXR0aW5nIHRoZSBzYW1lIGtleSBhY3RzIGFzIGEgc2xpZGluZyBUVEw6IGV2ZXJ5XG4gKiB0dXJuIHRoYXQgdXNlcyB0aGUgY29udmVyc2F0aW9uIGV4dGVuZHMgdGhlIHdpbmRvdyBieSBhbm90aGVyXG4gKiB7QGxpbmsgQ09OVkVSU0FUSU9OX1RUTF9TRUN9IHNlY29uZHMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHNhdmVDYWNoZWRDb252ZXJzYXRpb25JZChcbiAgY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgY29udmVyc2F0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNhY2hlS2V5IHx8ICFjb252ZXJzYXRpb25JZCkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5zZXQoY2FjaGVLZXksIGNvbnZlcnNhdGlvbklkLCB7XG4gICAgICB0dGw6IENPTlZFUlNBVElPTl9UVExfU0VDLFxuICAgIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTp3cml0ZS1lcnJvclwiLCB7XG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqIEZvcmNlLWV2aWN0IGEgY2FjaGVkIGNvbnZlcnNhdGlvbiBpZC4gVXNlZCBvbiB0aGUgc3RhbGUtaWQgcmVjb3ZlcnkgcGF0aC4gKi9cbmFzeW5jIGZ1bmN0aW9uIGV2aWN0Q2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoIWNhY2hlS2V5KSByZXR1cm47XG4gIHRyeSB7XG4gICAgYXdhaXQgQ2FjaGVNYW5hZ2VyLmdldEluc3RhbmNlU3luYygpLmRlbGV0ZShjYWNoZUtleSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiY29udmVyc2F0aW9uLWNhY2hlOmRlbGV0ZS1lcnJvclwiLCB7XG4gICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMYXp5LXNlZWQgdGhlIGFjdGl2ZSBHZW5pZSBgY29udmVyc2F0aW9uX2lkYCBmb3IgYHNwYWNlSWRgIGZyb21cbiAqIHRoZSBjcm9zcy1yZXF1ZXN0IGNhY2hlIG9udG8gdGhlIHBlci1yZXF1ZXN0IGBSZXF1ZXN0Q29udGV4dGAuXG4gKiBOby1vcCB3aGVuIHRoZSBzbG90IGlzIGFscmVhZHkgcG9wdWxhdGVkIChzdWJzZXF1ZW50XG4gKiBgYXNrX2dlbmllYCBjYWxscyBpbiB0aGUgc2FtZSB0dXJuKSBzbyB3ZSBoaXQgdGhlIGNhY2hlIGF0IG1vc3RcbiAqIG9uY2UgcGVyIHJlcXVlc3QgcGVyIHNwYWNlLlxuICovXG5hc3luYyBmdW5jdGlvbiBlbnN1cmVDb252ZXJzYXRpb25TZWVkZWQoXG4gIHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZSxcbiAgY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCxcbik6IFByb21pc2U8dm9pZD4ge1xuICBpZiAoc3RhdGUuY29udmVyc2F0aW9uSWQpIHJldHVybjtcbiAgY29uc3QgY2FjaGVkID0gYXdhaXQgcmVhZENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgaWYgKGNhY2hlZCkgc3RhdGUuY29udmVyc2F0aW9uSWQgPSBjYWNoZWQ7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcmVwYXJlX2NoYXJ0IGlucHV0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIEFnZW50LWZhY2luZyBgcHJlcGFyZV9jaGFydGAgaW5wdXQgc2NoZW1hLiBSZXVzZXNcbiAqIHtAbGluayBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hfSAodGhlIGRhdGFzZXQtZHJpdmVuIHBsYW5uZXJcbiAqIGNvbnRyYWN0KSBidXQgc3dhcHMgdGhlIGlubGluZSBgZGF0YWAgZmllbGQgZm9yIGEgR2VuaWVcbiAqIGBzdGF0ZW1lbnRfaWRgIHRoZSB0b29sIHJlc29sdmVzIGludG8gcm93cyBzZXJ2ZXItc2lkZS5cbiAqIGB0aXRsZWAgaXMgbG9vc2VuZWQgdG8gb3B0aW9uYWwgLSB0aGUgcGxhbm5lciBmYWxscyBiYWNrIHRvIGFcbiAqIGdlbmVyaWMgcGxhY2Vob2xkZXIgd2hlbiB0aGUgYWdlbnQgZG9lc24ndCBzdXBwbHkgb25lLlxuICpcbiAqIFNoYXBlZCB0byBtYXRjaCBHZW5pZSdzIHdpcmUgZm9ybSAtIGBzdGF0ZW1lbnRfaWRgIChzbmFrZSlcbiAqIG1pcnJvcnMgYHF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRgIGFuZCB0aGUgYGdldF9zdGF0ZW1lbnRgXG4gKiB0b29sJ3MgaW5wdXQgZmllbGQgbmFtZSwgc28gdGhlIExMTSBvbmx5IGV2ZXIgc2VlcyBvbmVcbiAqIHNwZWxsaW5nIGZvciB0aGUgc2FtZSBpZGVudGlmaWVyLlxuICovXG5jb25zdCBwcmVwYXJlQ2hhcnRSZXF1ZXN0U2NoZW1hID0gY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYVxuICAub21pdCh7IGRhdGE6IHRydWUsIHRpdGxlOiB0cnVlIH0pXG4gIC5leHRlbmQoe1xuICAgIHN0YXRlbWVudF9pZDogelxuICAgICAgLnN0cmluZygpXG4gICAgICAubWluKDEsIFwic3RhdGVtZW50X2lkIGlzIHJlcXVpcmVkXCIpXG4gICAgICAuZGVzY3JpYmUoXG4gICAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICBHZW5pZSBcXGBzdGF0ZW1lbnRfaWRcXGAgdG8gY2hhcnQuIFJlYWQgZnJvbVxuICAgICAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvclxuICAgICAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIHJldHVybmVkIGJ5XG4gICAgICAgICAgXFxgYXNrX2dlbmllXFxgLlxuICAgICAgICBgKSxcbiAgICAgICksXG4gICAgdGl0bGU6IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEuc2hhcGUudGl0bGUub3B0aW9uYWwoKSxcbiAgfSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHRvb2wgaWRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogU3VmZml4IGFwcGVuZGVkIHRvIHBlci1zcGFjZSB0b29sIGlkcyB3aGVuIHRoZSBhbGlhcyBpc24ndCB0aGVcbiAqIHdlbGwta25vd24gYGRlZmF1bHRgLiBTaW5nbGUtc3BhY2UgZGVwbG95bWVudHMgZ2V0IHRoZSBiYXJlXG4gKiBuYW1lcyAoYGFza19nZW5pZWAsIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCAuLi4pOyBtdWx0aS1zcGFjZVxuICogZGVwbG95bWVudHMgZ2V0IGBhc2tfZ2VuaWVfPGFsaWFzPmAgZXRjLiBzbyBlYWNoIHNwYWNlJ3MgdG9vbHNcbiAqIHN0YXkgZGlzYW1iaWd1YXRlZCBpbiB0aGUgY2VudHJhbCBhZ2VudCdzIHRvb2wgcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGFsaWFzU3VmZml4KGFsaWFzOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoYWxpYXMgPT09IERFRkFVTFRfR0VOSUVfQUxJQVMpIHJldHVybiBcIlwiO1xuICBjb25zdCBzbHVnID0gc3RyaW5nLnRvSWRlbnRpZmllcihhbGlhcyk7XG4gIHJldHVybiBzbHVnID8gYF8ke3NsdWd9YCA6IFwiXCI7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwZXItc3BhY2UgdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRHJvcCBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2AgYXR0YWNobWVudHMgZnJvbSBhIHtAbGluayBHZW5pZU1lc3NhZ2V9XG4gKiBiZWZvcmUgaGFuZGluZyBpdCB0byB0aGUgY2VudHJhbCBMTE0uIFRob3NlIGVudHJpZXMgYWxyZWFkeVxuICogc3VyZmFjZSBpbiB0aGUgVUkgYXMgb25lLXRhcCBwaWxscyB2aWEgdGhlIHdyaXRlcidzXG4gKiBgc3VnZ2VzdGVkX3F1ZXN0aW9uc2AgZXZlbnRzIChzZWUgYGNvbGxlY3RTdWdnZXN0aW9uc2Agb24gdGhlXG4gKiBjbGllbnQpOyBpZiB3ZSBsZXQgdGhlbSByaWRlIGJhY2sgaW4gdGhlIHRvb2wgcmVzdWx0IHRoZSBMTE1cbiAqIHRlbmRzIHRvIHF1b3RlIHRoZW0gaW5saW5lIGluIGl0cyBwcm9zZSwgZG91YmxlLXNob3dpbmcgdGhlXG4gKiBzYW1lIHF1ZXN0aW9ucyBhbmQgc3RlcHBpbmcgb24gdGhlIGRlZGljYXRlZCBzdWdnZXN0aW9uIFVJLlxuICogUXVlcnkgLyB0ZXh0IC8gcm93IGF0dGFjaG1lbnRzIGFyZSBwcmVzZXJ2ZWQgc28gdGhlIG1vZGVsIGNhblxuICogc3RpbGwgcmVhZCBgc3RhdGVtZW50X2lkYCwgU1FMLCBhbmQgdGhlIGFuc3dlciB0ZXh0LlxuICovXG5mdW5jdGlvbiBzdHJpcFN1Z2dlc3RlZFF1ZXN0aW9ucyhtZXNzYWdlOiBHZW5pZU1lc3NhZ2UpOiBHZW5pZU1lc3NhZ2Uge1xuICBjb25zdCBhdHRhY2htZW50cyA9IG1lc3NhZ2UuYXR0YWNobWVudHM7XG4gIGlmICghYXR0YWNobWVudHMgfHwgYXR0YWNobWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gbWVzc2FnZTtcbiAgY29uc3QgZmlsdGVyZWQgPSBhdHRhY2htZW50cy5maWx0ZXIoKGF0dCkgPT4gIWF0dC5zdWdnZXN0ZWRfcXVlc3Rpb25zKTtcbiAgaWYgKGZpbHRlcmVkLmxlbmd0aCA9PT0gYXR0YWNobWVudHMubGVuZ3RoKSByZXR1cm4gbWVzc2FnZTtcbiAgcmV0dXJuIHsgLi4ubWVzc2FnZSwgYXR0YWNobWVudHM6IGZpbHRlcmVkIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkQXNrR2VuaWVUb29sKG9wdHM6IHsgc3BhY2VJZDogc3RyaW5nOyBhbGlhczogc3RyaW5nOyBoaW50Pzogc3RyaW5nIH0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcywgaGludCB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gYGFza19nZW5pZSR7YWxpYXNTdWZmaXgoYWxpYXMpfWA7XG4gIGNvbnN0IGhpbnRMaW5lID0gaGludCA/IGAgKCR7aGludH0pYCA6IFwiXCI7XG4gIHJldHVybiBjcmVhdGVUb29sKHtcbiAgICBpZDogdG9vbElkLFxuICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICBBc2sgdGhlIEdlbmllIHNwYWNlIFwiJHthbGlhc31cIiR7aGludExpbmV9IE9ORSBmb2N1c2VkXG4gICAgICBuYXR1cmFsLWxhbmd1YWdlIHN1Yi1xdWVzdGlvbiBhbmQgd2FpdCBmb3IgdGhlIHR1cm4gdG9cbiAgICAgIGNvbXBsZXRlLiBHZW5pZSBhbnN3ZXJzIGJlc3Qgd2hlbiBlYWNoIGNhbGwgY292ZXJzIGFcbiAgICAgIHNpbmdsZSBtZXRyaWMgLyBkaW1lbnNpb24gLyB0aW1lIHdpbmRvdywgc28gZXhwZWN0IHRvXG4gICAgICBjYWxsIHRoaXMgdG9vbCBNVUxUSVBMRSBUSU1FUyBwZXIgdXNlciB0dXJuICh0eXBpY2FsbHlcbiAgICAgIHR3byB0byBzaXgpLiBJbmRlcGVuZGVudCBzdWItcXVlc3Rpb25zIG1heSBiZSBjYWxsZWQgaW5cbiAgICAgIFBBUkFMTEVMOyBjYWxscyB0aGF0IGRlcGVuZCBvbiBhbiBlYXJsaWVyIGFuc3dlciBzaG91bGQgc3RheVxuICAgICAgc2VxdWVudGlhbC4gUGFyYWxsZWwgY2FsbHMgdXNlIGlzb2xhdGVkIEdlbmllIGNvbnZlcnNhdGlvbnMsXG4gICAgICB3aGlsZSBzZXF1ZW50aWFsIGNhbGxzIHJldGFpbiB0aGUgcmV1c2FibGUgY29udmVyc2F0aW9uIGNvbnRleHQuXG4gICAgICBUaGlzIGlzIHRoZSBub3JtYWwgcGF0dGVybiwgbm90IHRoZSBleGNlcHRpb24uXG4gICAgICBEbyBOT1QgdHJ5IHRvIGNyYW0gYSBtdWx0aS1wYXJ0IHF1ZXN0aW9uIGludG8gYSBzaW5nbGVcbiAgICAgIGNhbGw7IGRlY29tcG9zZSBmaXJzdCwgdGhlbiBhc2sgZWFjaCBwaWVjZS5cblxuICAgICAgUmV0dXJucyB0aGUgZmluYWwgXFxgR2VuaWVNZXNzYWdlXFxgLiBSb3dzIGFyZSBOT1QgaW5jbHVkZWQgLVxuICAgICAgdGhlIEdlbmllIHdpcmUgcmVzcG9uc2UgY2FycmllcyB0aGUgXFxgc3RhdGVtZW50X2lkXFxgIGZvciBhbnlcbiAgICAgIFNRTCB0aGF0IHJhbiAoYXQgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIG9yIHRoZVxuICAgICAgZmlyc3QgYXR0YWNobWVudCdzIFxcYHF1ZXJ5LnN0YXRlbWVudF9pZFxcYCk7IGNhbGxcbiAgICAgIFxcYGdldF9zdGF0ZW1lbnRcXGAgd2l0aCB0aGF0IGlkIG9ubHkgd2hlbiB5b3UgbmVlZCB0byByZWFkXG4gICAgICB0aGUgdW5kZXJseWluZyB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0uIElmIHlvdSBqdXN0XG4gICAgICB3YW50IHRvIGRpc3BsYXkgdGhlIHJvd3MgdG8gdGhlIHVzZXIsIGVtYmVkIGFcbiAgICAgIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCBtYXJrZXIgaW4geW91ciBwcm9zZSBpbnN0ZWFkIC1cbiAgICAgIHRoZSBob3N0IFVJIGZldGNoZXMgYW5kIHJlbmRlcnMgdGhlIHJvd3Mgb24gaXRzIG93bi4gV2lyZVxuICAgICAgZXZlbnRzIChzdGF0dXMsIHRoaW5raW5nLCBzcWwpIHN0cmVhbSB0byB0aGUgdXNlclxuICAgICAgYXV0b21hdGljYWxseSB3aGlsZSB0aGUgY2FsbCBpcyBpbiBmbGlnaHQuXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHF1ZXN0aW9uOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAubWluKDEsIFwicXVlc3Rpb24gaXMgcmVxdWlyZWRcIilcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIE9ORSBmb2N1c2VkIG5hdHVyYWwtbGFuZ3VhZ2UgcXVlc3Rpb24gYWJvdXQgdGhlIGRhdGEgaW4gdGhpc1xuICAgICAgICAgICAgc3BhY2UsIGNvdmVyaW5nIGEgc2luZ2xlIG1ldHJpYyAvIGRpbWVuc2lvbiAvIHRpbWUgd2luZG93XG4gICAgICAgICAgICAoZS5nLiBcIldoYXQgd2FzIFEzIHJldmVudWUgYnkgcmVnaW9uP1wiKS4gRGVjb21wb3NlIGFcbiAgICAgICAgICAgIG11bHRpLXBhcnQgYXNrIGludG8gc2VwYXJhdGUgY2FsbHMgcmF0aGVyIHRoYW4gY29tYmluaW5nIGl0XG4gICAgICAgICAgICBoZXJlLlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgbWVzc2FnZTogZ2VuaWVNb2RlbC5HZW5pZU1lc3NhZ2VTY2hlbWEsXG4gICAgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKHsgcXVlc3Rpb24gfSwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCwgcmVxdWVzdENvbnRleHQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgd3JpdGVyID0gY3R4Py53cml0ZXI7XG4gICAgICBjb25zdCBzaWduYWwgPSBjdHg/LmFib3J0U2lnbmFsO1xuICAgICAgY29uc3QgdGhyZWFkSWQgPSByZXF1ZXN0Q29udGV4dC5nZXQoTUFTVFJBX1RIUkVBRF9JRF9LRVkpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAgICAgLy8gQm91bmNlIHBsYWNlaG9sZGVyIC8gbm8tb3AgcXVlc3Rpb25zIEJFRk9SRSBzcGVuZGluZyBhIEdlbmllXG4gICAgICAvLyByb3VuZC10cmlwIG9uIHRoZW0uIEdlbmllIGFuc3dlcnMgYW55IG9mIHRoZXNlIHdpdGggXCJZb3VyXG4gICAgICAvLyByZXF1ZXN0ICdub29wJyBkb2VzIG5vdCByZWxhdGUgdG8uLi5cIiAtIHVzZWxlc3Mgbm9pc2UgdGhhdFxuICAgICAgLy8gc2hvd3MgdXAgaW4gdGhlIFVJIGFuZCBlYXRzIG9uZSBvZiB0aGUgd29ya3NwYWNlJ3MgNVxuICAgICAgLy8gcXVlc3Rpb25zL21pbnV0ZS4gUmV0dXJuaW5nIGEgY2xlYXIgZXJyb3IgaGVyZSBzdXJmYWNlcyB0aGVcbiAgICAgIC8vIGlzc3VlIHRvIHRoZSBhZ2VudCBsb29wIHNvIHRoZSBtb2RlbCBjb3JyZWN0cyBjb3Vyc2UgaW5zdGVhZFxuICAgICAgLy8gb2Ygd2FzdGluZyBhIHR1cm4uXG4gICAgICBjb25zdCB0cmltbWVkID0gcXVlc3Rpb24udHJpbSgpO1xuICAgICAgaWYgKHRyaW1tZWQubGVuZ3RoID09PSAwIHx8IFBMQUNFSE9MREVSX1FVRVNUSU9OUy5oYXModHJpbW1lZC50b0xvd2VyQ2FzZSgpKSkge1xuICAgICAgICB0aHJvdyBWYWxpZGF0aW9uRXJyb3IuaW52YWxpZFZhbHVlKFxuICAgICAgICAgIGAke3Rvb2xJZH0ucXVlc3Rpb25gLFxuICAgICAgICAgIHF1ZXN0aW9uLFxuICAgICAgICAgIFwiYSByZWFsIG5hdHVyYWwtbGFuZ3VhZ2UgcXVlc3Rpb24sIG5vdCBhIHBsYWNlaG9sZGVyOyBza2lwIHRoZSBjYWxsIGluc3RlYWRcIixcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdGUgPSBjb252ZXJzYXRpb25TdGF0ZShyZXF1ZXN0Q29udGV4dCwgc3BhY2VJZCk7XG4gICAgICBjb25zdCBvd25zUmV1c2FibGVDb252ZXJzYXRpb24gPSByZXNlcnZlQ29udmVyc2F0aW9uKHN0YXRlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIE9ubHkgdGhlIHJlc2VydmVkIGxhbmUgc2VlZHMgYW5kIHVwZGF0ZXMgdGhlIHRocmVhZCdzIHJldXNhYmxlXG4gICAgICAgIC8vIGNvbnZlcnNhdGlvbi4gQ29uY3VycmVudCBsYW5lcyBkZWxpYmVyYXRlbHkgc3RhcnQgZnJlc2ggY29udmVyc2F0aW9ucy5cbiAgICAgICAgY29uc3QgY2FjaGVLZXkgPSBvd25zUmV1c2FibGVDb252ZXJzYXRpb25cbiAgICAgICAgICA/IGF3YWl0IGNvbnZlcnNhdGlvbkNhY2hlS2V5KHNwYWNlSWQsIHRocmVhZElkLCByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dCkpXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHtcbiAgICAgICAgICBhd2FpdCBlbnN1cmVDb252ZXJzYXRpb25TZWVkZWQoc3RhdGUsIGNhY2hlS2V5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVhY2ggaW52b2NhdGlvbiBrZWVwcyBpdHMgY29udmVyc2F0aW9uIGlkIGxvY2FsbHkuIE9ubHkgdGhlIHJldXNhYmxlXG4gICAgICAgIC8vIGxhbmUgcHVibGlzaGVzIHVwZGF0ZXMgdG8gc2hhcmVkIHJlcXVlc3QgYW5kIGNyb3NzLXJlcXVlc3Qgc3RhdGUuXG4gICAgICAgIGxldCBjb252ZXJzYXRpb25JZCA9IG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbiA/IHN0YXRlLmNvbnZlcnNhdGlvbklkIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0ZWRFdmVudDogU3RhcnRlZEV2ZW50ID0ge1xuICAgICAgICAgIHR5cGU6IFwic3RhcnRlZFwiLFxuICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgY29udGVudDogcXVlc3Rpb24sXG4gICAgICAgIH07XG4gICAgICAgIGF3YWl0IHNhZmVXcml0ZShsb2dnZXIsIHdyaXRlciwgc3RhcnRlZEV2ZW50KTtcblxuICAgICAgICBjb25zdCBydW5UdXJuID0gYXN5bmMgKCk6IFByb21pc2U8R2VuaWVNZXNzYWdlPiA9PiB7XG4gICAgICAgICAgY29uc3Qgc2VlZENvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgbGV0IGZpbmFsTWVzc2FnZTogR2VuaWVNZXNzYWdlIHwgdW5kZWZpbmVkO1xuICAgICAgICAgIGZvciBhd2FpdCAoY29uc3QgZXZlbnQgb2YgY2hhdC5nZW5pZUV2ZW50Q2hhdChzcGFjZUlkLCBxdWVzdGlvbiwge1xuICAgICAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgICAgICAuLi4oc2VlZENvbnZlcnNhdGlvbklkID8geyBjb252ZXJzYXRpb25JZDogc2VlZENvbnZlcnNhdGlvbklkIH0gOiB7fSksXG4gICAgICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgICAgICB9KSkge1xuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgIT09IFwibWVzc2FnZVwiKSB7XG4gICAgICAgICAgICAgIGF3YWl0IHNhZmVXcml0ZShsb2dnZXIsIHdyaXRlciwgZXZlbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgZXZlbnRDb252ZXJzYXRpb25JZCA9IGV2ZW50LmNvbnZlcnNhdGlvbl9pZDtcbiAgICAgICAgICAgIGlmIChldmVudENvbnZlcnNhdGlvbklkKSB7XG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkID0gZXZlbnRDb252ZXJzYXRpb25JZDtcbiAgICAgICAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikgc3RhdGUuY29udmVyc2F0aW9uSWQgPSBldmVudENvbnZlcnNhdGlvbklkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09IFwicmVzdWx0XCIpIHtcbiAgICAgICAgICAgICAgZmluYWxNZXNzYWdlID0gZXZlbnQubWVzc2FnZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFmaW5hbE1lc3NhZ2UpIHtcbiAgICAgICAgICAgIHRocm93IEV4ZWN1dGlvbkVycm9yLm1pc3NpbmdEYXRhKFwiR2VuaWUgcmVzdWx0IGV2ZW50XCIpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmluYWxNZXNzYWdlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBmaW5hbE1lc3NhZ2UgPSBhd2FpdCBydW5UdXJuKCk7XG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgIC8vIEEgcmVqZWN0ZWQgY29udmVyc2F0aW9uIGlkIGlzIHN0YWxlIG9yIGluYWNjZXNzaWJsZS4gUmVzZXQgdGhpc1xuICAgICAgICAgIC8vIGxhbmUgYW5kIHJldHJ5IG9uY2Ugd2l0aCBhIGZyZXNoIEdlbmllIGNvbnZlcnNhdGlvbi5cbiAgICAgICAgICBjb25zdCByZWplY3RlZENvbnZlcnNhdGlvbklkID0gY29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgaWYgKHJlamVjdGVkQ29udmVyc2F0aW9uSWQgJiYgZXJyb3IuZXJyb3JDb250ZXh0KGVycikubm90QWNjZXNzaWJsZSkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJjb252ZXJzYXRpb24tY2FjaGU6c3RhbGUsIHJlc2V0dGluZ1wiLCB7XG4gICAgICAgICAgICAgIHNwYWNlSWQsXG4gICAgICAgICAgICAgIGNvbnZlcnNhdGlvbklkOiByZWplY3RlZENvbnZlcnNhdGlvbklkLFxuICAgICAgICAgICAgICBlcnJvcjogZXJyb3IuZXJyb3JNZXNzYWdlKGVyciksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHtcbiAgICAgICAgICAgICAgYXdhaXQgZXZpY3RDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleSk7XG4gICAgICAgICAgICAgIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udmVyc2F0aW9uSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBmaW5hbE1lc3NhZ2UgPSBhd2FpdCBydW5UdXJuKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAob3duc1JldXNhYmxlQ29udmVyc2F0aW9uKSB7XG4gICAgICAgICAgYXdhaXQgc2F2ZUNhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5LCBjb252ZXJzYXRpb25JZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyBtZXNzYWdlOiBzdHJpcFN1Z2dlc3RlZFF1ZXN0aW9ucyhmaW5hbE1lc3NhZ2UpIH07XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAob3duc1JldXNhYmxlQ29udmVyc2F0aW9uKSBzdGF0ZS5yZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0ID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3BhY2VEZXNjcmlwdGlvblRvb2wob3B0czogeyBzcGFjZUlkOiBzdHJpbmc7IGFsaWFzOiBzdHJpbmcgfSkge1xuICBjb25zdCB7IHNwYWNlSWQsIGFsaWFzIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIFJldHVybiB0aGUgR2VuaWUgc3BhY2UgXCIke2FsaWFzfVwiJ3MgdGl0bGUsIGRlc2NyaXB0aW9uLCBhbmRcbiAgICAgIHdhcmVob3VzZSBpZC4gQ2hlYXAgKHNpbmdsZSBSRVNUIGNhbGwsIG5vIExMTSByb3VuZC10cmlwKS5cbiAgICAgIENhbGwgdGhpcyBGSVJTVCBvbiBhbnkgdXNlciB0dXJuIHRoYXQncyBnb2luZyB0byB0b3VjaFxuICAgICAgXFxgYXNrX2dlbmllXFxgLCB1bmxlc3MgdGhlIHNhbWUgZGVzY3JpcHRpb24gYWxyZWFkeSBsYW5kZWRcbiAgICAgIGVhcmxpZXIgaW4gdGhpcyBjb252ZXJzYXRpb24gLSB0aGUgdGl0bGUgKyBkZXNjcmlwdGlvbiB0ZWxsXG4gICAgICB5b3Ugd2hhdCB0YWJsZXMsIG1ldHJpY3MsIGFuZCB0aW1lIHdpbmRvd3MgdGhlIHNwYWNlXG4gICAgICBhY3R1YWxseSBjb3ZlcnMsIHdoaWNoIGlzIHdoYXQgbGV0cyB5b3UgZGVjb21wb3NlIHRoZVxuICAgICAgdXNlcidzIHF1ZXN0aW9uIGludG8gdGhlIHJpZ2h0IFxcYGFza19nZW5pZVxcYCBzdWItcXVlc3Rpb25zLlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7fSksXG4gICAgb3V0cHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzcGFjZUlkOiB6LnN0cmluZygpLFxuICAgICAgdGl0bGU6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIGRlc2NyaXB0aW9uOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICB3YXJlaG91c2VJZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIC8vIFJvdXRlIHRocm91Z2ggdGhlIHBhY2thZ2UncyBjZW50cmFsIEdlbmllIHNwYWNlIGZldGNoLiBUaGVcbiAgICAgIC8vIGRlc2NyaXB0aW9uIHN1cmZhY2UgKHRpdGxlIC8gZGVzY3JpcHRpb24gLyB3YXJlaG91c2UgaWQpIGxpdmVzXG4gICAgICAvLyBvbiB0aGUgZGlyZWN0b3J5LWxpc3Rpbmcgc2hhcGUsIHNvIHNraXAgdGhlIGxhcmdlclxuICAgICAgLy8gYHNlcmlhbGl6ZWRfc3BhY2VgIHBheWxvYWQgaGVyZS5cbiAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgIHNlcmlhbGl6ZWQ6IGZhbHNlLFxuICAgICAgICAuLi4oc2lnbmFsID8geyBjb250ZXh0OiBzaWduYWwgfSA6IHt9KSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgLi4uKHNwYWNlLnRpdGxlID8geyB0aXRsZTogc3BhY2UudGl0bGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwYWNlLmRlc2NyaXB0aW9uID8geyBkZXNjcmlwdGlvbjogc3BhY2UuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgLi4uKHNwYWNlLndhcmVob3VzZV9pZCA/IHsgd2FyZWhvdXNlSWQ6IHNwYWNlLndhcmVob3VzZV9pZCB9IDoge30pLFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTcGFjZVNlcmlhbGl6ZWRUb29sKG9wdHM6IHsgc3BhY2VJZDogc3RyaW5nOyBhbGlhczogc3RyaW5nIH0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcyB9ID0gb3B0cztcbiAgY29uc3QgdG9vbElkID0gYGdldF9zcGFjZV9zZXJpYWxpemVkJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIFJldHVybiB0aGUgZnVsbCBcXGBHZW5pZVNwYWNlXFxgIEpTT04gZm9yIHRoZSBcIiR7YWxpYXN9XCIgc3BhY2UuXG4gICAgICBVc2Ugb25seSB3aGVuIHlvdSBuZWVkIGV4YWN0IGNvbHVtbiAvIHRhYmxlIGlkZW50aWZpZXJzXG4gICAgICBcXGBnZXRfc3BhY2VfZGVzY3JpcHRpb25cXGAgZG9lc24ndCBleHBvc2UuIExhcmdlciBwYXlsb2FkLCBzb1xuICAgICAgcHJlZmVyIHRoZSBkZXNjcmlwdGlvbiB0b29sIHdoZW4gaXQncyBlbm91Z2guXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHt9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHsgc3BhY2U6IHoudW5rbm93bigpIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChfaW5wdXQsIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIC8vIENlbnRyYWwgR2VuaWUgc3BhY2UgZmV0Y2ggd2l0aCB0aGUgb3B0LWluIGBzZXJpYWxpemVkX3NwYWNlYFxuICAgICAgLy8gYmxvYiAoY2F0YWxvZ3MsIHRhYmxlcywgc2FtcGxlIHF1ZXN0aW9ucywgcHJvbXB0cykgdGhhdCB0aGVcbiAgICAgIC8vIHR5cGVkIFNESyBgZ2V0U3BhY2VgIG9taXRzIC0gdGhlIHdob2xlIHBvaW50IG9mIHRoaXMgdG9vbC5cbiAgICAgIGNvbnN0IHNwYWNlID0gYXdhaXQgZ2VuaWVTcGFjZS5nZXRHZW5pZVNwYWNlKHNwYWNlSWQsIHtcbiAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBjbGllbnQsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBzcGFjZSB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gc2hhcmVkIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERlZmF1bHQgcm93IGNhcCBmb3Ige0BsaW5rIGJ1aWxkR2V0U3RhdGVtZW50VG9vbH0gd2hlbiB0aGUgYWdlbnRcbiAqIGRvZXNuJ3Qgc3VwcGx5IGEgYGxpbWl0YC4gU2l6ZWQgdG8ga2VlcCByZXN1bHQgc2V0cyBvdXQgb2YgdGhlXG4gKiBtb2RlbCBjb250ZXh0IHVubGVzcyB0aGUgYWdlbnQgZXhwbGljaXRseSBvcHRzIGludG8gbW9yZSByb3dzIC1cbiAqIHRoZSBjaGVhcCBzaGFwZSAoY29sdW1uIG5hbWVzICsgYSBoYW5kZnVsIG9mIHJlcHJlc2VudGF0aXZlXG4gKiByb3dzKSBpcyB1c3VhbGx5IGVub3VnaCB0byByZWFzb24gYWJvdXQgYSBxdWVyeS5cbiAqL1xuY29uc3QgREVGQVVMVF9TVEFURU1FTlRfTElNSVQgPSA1MDtcblxuZnVuY3Rpb24gYnVpbGRHZXRTdGF0ZW1lbnRUb29sKCkge1xuICBjb25zdCB0b29sSWQgPSBcImdldF9zdGF0ZW1lbnRcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIEZldGNoIHRoZSByb3dzIG9mIGEgR2VuaWUgc3RhdGVtZW50IGJ5IGl0cyBcXGBzdGF0ZW1lbnRfaWRcXGAgKHRoZVxuICAgICAgdmFsdWUgYXQgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIG9yXG4gICAgICBcXGBtZXNzYWdlLmF0dGFjaG1lbnRzWypdLnF1ZXJ5LnN0YXRlbWVudF9pZFxcYCByZXR1cm5lZCBmcm9tXG4gICAgICBcXGBhc2tfZ2VuaWVcXGApLiBVc2UgdGhpcyBPTkxZIHdoZW4geW91IG5lZWQgdG8gcmVhZCB0aGUgdW5kZXJseWluZ1xuICAgICAgdmFsdWVzIHRvIHJlYXNvbiBhYm91dCB0aGVtIGluIHlvdXIgcmVwbHkgLSBlLmcuIG5hbWluZyB0aGVcbiAgICAgIGxhcmdlc3Qgcm93LCBjb21wdXRpbmcgYSBkZWx0YSB0aGUgdmlzdWFsaXphdGlvbiB3b3VsZG4ndCBhbHJlYWR5XG4gICAgICBjb252ZXksIG9yIGZpbHRlcmluZyBkb3duIHRvIGEgc3BlY2lmaWMgcmVjb3JkLiBJZiB5b3UnZCBqdXN0IGJlXG4gICAgICByZWNpdGluZyBudW1iZXJzIHRoZSB1c2VyIHdpbGwgc2VlIGFueXdheSwgc2tpcCB0aGUgY2FsbCBhbmRcbiAgICAgIGVtYmVkIGEgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIG1hcmtlciBpbiB5b3VyIHByb3NlIGluc3RlYWQ7XG4gICAgICB0aGUgaG9zdCBVSSBmZXRjaGVzIGFuZCByZW5kZXJzIHRoZSByb3dzIG9uIGl0cyBvd24uIFxcYGxpbWl0XFxgXG4gICAgICBjYXBzIHRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZCAoZGVmYXVsdHMgdG9cbiAgICAgICR7REVGQVVMVF9TVEFURU1FTlRfTElNSVR9KS4gXFxgcm93Q291bnRcXGAgcmVmbGVjdHMgdGhlIGZ1bGxcbiAgICAgIHVwc3RyZWFtIHRvdGFsIC0gY29tcGFyZSB0byBcXGByb3dzLmxlbmd0aFxcYCB0byBkZXRlY3QgdHJ1bmNhdGlvbi5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgc3RhdGVtZW50X2lkOiB6XG4gICAgICAgIC5zdHJpbmcoKVxuICAgICAgICAubWluKDEsIFwic3RhdGVtZW50X2lkIGlzIHJlcXVpcmVkXCIpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBHZW5pZSBcXGBzdGF0ZW1lbnRfaWRcXGAgd2hvc2Ugcm93cyB0byByZWFkLiBUYWtlIGl0IGZyb21cbiAgICAgICAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvclxuICAgICAgICAgICAgXFxgbWVzc2FnZS5hdHRhY2htZW50c1sqXS5xdWVyeS5zdGF0ZW1lbnRfaWRcXGAgb24gYW5cbiAgICAgICAgICAgIFxcYGFza19nZW5pZVxcYCByZXN1bHQ7IGl0IGlzIG5ldmVyIGEgdmFsdWUgeW91IGNvbnN0cnVjdC5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICAgIGxpbWl0OiB6XG4gICAgICAgIC5udW1iZXIoKVxuICAgICAgICAuaW50KClcbiAgICAgICAgLm5vbm5lZ2F0aXZlKClcbiAgICAgICAgLm9wdGlvbmFsKClcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIFwiTWF4IHJvd3MgdG8gcmV0dXJuLiBEZWZhdWx0cyB0byBhIHNtYWxsIHNhbXBsZTsgcmFpc2Ugb25seSB3aGVuIG1vcmUgcm93cyBhcmUgZ2VudWluZWx5IG5lZWRlZC5cIixcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIGNvbHVtbnM6IHouYXJyYXkoei5zdHJpbmcoKSksXG4gICAgICByb3dzOiB6LmFycmF5KHoucmVjb3JkKHouc3RyaW5nKCksIHoudW5rbm93bigpKSksXG4gICAgICByb3dDb3VudDogei5udW1iZXIoKSxcbiAgICAgIHRydW5jYXRlZDogei5ib29sZWFuKCksXG4gICAgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKHsgc3RhdGVtZW50X2lkLCBsaW1pdCB9LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHNpZ25hbCA9IGN0eD8uYWJvcnRTaWduYWw7XG4gICAgICBjb25zdCBlZmZlY3RpdmVMaW1pdCA9IGxpbWl0ID8/IERFRkFVTFRfU1RBVEVNRU5UX0xJTUlUO1xuICAgICAgY29uc3QgZGF0YSA9IGF3YWl0IGZldGNoU3RhdGVtZW50RGF0YShjbGllbnQsIHN0YXRlbWVudF9pZCwge1xuICAgICAgICBsaW1pdDogZWZmZWN0aXZlTGltaXQsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb2x1bW5zOiBkYXRhLmNvbHVtbnMsXG4gICAgICAgIHJvd3M6IGRhdGEucm93cyxcbiAgICAgICAgcm93Q291bnQ6IGRhdGEucm93Q291bnQsXG4gICAgICAgIHRydW5jYXRlZDogZGF0YS5yb3dzLmxlbmd0aCA8IGRhdGEucm93Q291bnQsXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKipcbiAqIGBwcmVwYXJlX2NoYXJ0YCBNYXN0cmEgdG9vbC4gVGhpbiB3cmFwcGVyIG92ZXJcbiAqIHtAbGluayBwcmVwYXJlQ2hhcnR9IHRoYXQgcmVzb2x2ZXMgdGhlIGRhdGFzZXQgYnkgZmV0Y2hpbmcgdGhlXG4gKiBHZW5pZSBzdGF0ZW1lbnQncyByb3dzIG9uIGRlbWFuZC4gVGhlIHRvb2wgbWludHMgYSBgY2hhcnRJZGBcbiAqIHN5bmNocm9ub3VzbHksIGNhY2hlcyBhbiBlbXB0eSBwbGFjZWhvbGRlciwgYW5kIGtpY2tzIG9mZiB0aGVcbiAqIHBsYW5uZXIgaW4gdGhlIGJhY2tncm91bmQgc28gdGhlIGFnZW50IGxvb3AgbmV2ZXIgYmxvY2tzLiBUaGUgcmVzdWx0IGNhcnJpZXNcbiAqIHRoZSBjb21wbGV0ZSBtYXJrZXIgdG8gY29weTsgdGhlIGhvc3QgVUkgcmVzb2x2ZXMgaXQgYnkgcmVhZGluZyB0aGUgY2FjaGVkXG4gKiB7QGxpbmsgQ2hhcnR9IGVudHJ5ICgxaCBUVEwpLlxuICpcbiAqIFNwYWNlLWFnbm9zdGljOiBhIEdlbmllIGBzdGF0ZW1lbnRfaWRgIGlzIHdvcmtzcGFjZS1zY29wZWQsIHNvXG4gKiBvbmUgc2hhcmVkIGBwcmVwYXJlX2NoYXJ0YCB0b29sIGNvdmVycyBldmVyeSB3aXJlZCBHZW5pZSBzcGFjZS5cbiAqXG4gKiBDYW5jZWxsYXRpb246IGRlbGliZXJhdGVseSBkb2VzIE5PVCBmb3J3YXJkIHRoZSBwZXItY2FsbFxuICogYGFib3J0U2lnbmFsYCB0byB7QGxpbmsgcHJlcGFyZUNoYXJ0fS4gVGhlIHBsYW5uZXIgdGFzayBpc1xuICogZmlyZS1hbmQtZm9yZ2V0IGJhY2tncm91bmQgd29yazsgdGhlIHRvb2wncyBvd24gYGV4ZWN1dGVgXG4gKiByZXNvbHZlcyB0aGUgbW9tZW50IHRoZSBgY2hhcnRJZGAgaXMgbWludGVkLCBzbyB0aGUgcGVyLWNhbGxcbiAqIHNpZ25hbCBhYm9ydHMgdGhlIHNlY29uZCB0aGUgdG9vbCByZXR1cm5zLiBUaGUgMWggY2FjaGUgVFRMXG4gKiBjYXBzIGFiYW5kb25lZCBlbnRyaWVzLlxuICovXG5mdW5jdGlvbiBidWlsZFByZXBhcmVDaGFydFRvb2wob3B0czogeyBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZyB9KSB7XG4gIGNvbnN0IHsgY29uZmlnIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBcInByZXBhcmVfY2hhcnRcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKFtcbiAgICAgIGBcbiAgICAgICAgUXVldWUgYSBjaGFydCBmb3IgdGhlIHJvd3Mgb2YgYSBHZW5pZSBzdGF0ZW1lbnQuIE1pbnRzIGFcbiAgICAgICAgXFxgY2hhcnRJZFxcYCBwbHVzIGl0cyBjb21wbGV0ZSBcXGBtYXJrZXJcXGAgc3luY2hyb25vdXNseSBhbmRcbiAgICAgICAga2lja3Mgb2ZmIGEgQkFDS0dST1VORFxuICAgICAgICB0YXNrIHRoYXQgZmV0Y2hlcyB0aGUgc3RhdGVtZW50J3Mgcm93cywgcnVucyB0aGVcbiAgICAgICAgY2hhcnQtcGxhbm5lciB0byBwaWNrIGEgY2hhcnQgdHlwZSBhbmQgRWNoYXJ0cyBzcGVjLCBhbmRcbiAgICAgICAgY2FjaGVzIHRoZSByZXN1bHQgdW5kZXIgdGhlIFxcYGNoYXJ0SWRcXGAgZm9yIG9uZSBob3VyLiBUaGVcbiAgICAgICAgaG9zdCBVSSBmZXRjaGVzIHRoZSBjYWNoZWQgY2hhcnQgb24gaXRzIG93biBvbmNlIGl0IGxhbmRzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVG8gZGlzcGxheSB0aGUgY2hhcnQgaW4geW91ciByZXBseSwgY29weSB0aGUgcmV0dXJuZWRcbiAgICAgICAgXFxgbWFya2VyXFxgIFZFUkJBVElNIG9udG8gaXRzIG93biBsaW5lIGF0IHRoZSBwb3NpdGlvbiB5b3VcbiAgICAgICAgd2FudCBpdCB0byBhcHBlYXIuIE5ldmVyIGNvbnN0cnVjdCwgYWx0ZXIsIG9yIGludmVudCBhXG4gICAgICAgIG1hcmtlciBmcm9tIFxcYGNoYXJ0SWRcXGAgKGFuZCBuZXZlciB1c2UgdGhlIFxcYHN0YXRlbWVudF9pZFxcYFxuICAgICAgICBvciBhbnkgdmFyaWF0aW9uIG9mIGl0KSAtIG9ubHkgdGhlIGNvbXBsZXRlIHZhbHVlIHJldHVybmVkXG4gICAgICAgIGJ5IHRoaXMgdG9vbCByZXNvbHZlcyB0byBhIHJlYWwgY2hhcnQuIFRoZSB0b29sIHJldHVybnNcbiAgICAgICAgaW1tZWRpYXRlbHkgLSBkbyBOT1Qgd2FpdCBvciBjYWxsIGl0IGFnYWluIHRvXG4gICAgICAgIFwiY2hlY2sgcHJvZ3Jlc3NcIjsgdGhlIGNoYXJ0IHJlc29sdmVzIGFzeW5jaHJvbm91c2x5IG9uIHRoZVxuICAgICAgICBob3N0IFVJJ3Mgc2lkZS5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIFVzZSB0aGlzIG9ubHkgd2hlbiB0aGUgZGF0YSBoYXMgYSBzdG9yeSBhIGNoYXJ0IGNvbnZleXNcbiAgICAgICAgYmV0dGVyIHRoYW4gYSB0YWJsZSAodHJlbmRzLCByYW5raW5ncywgZGlzdHJpYnV0aW9ucyxcbiAgICAgICAgcGFydHMtb2YtYS13aG9sZSkuIEZvciByYXcgcm93cywgZW1iZWRcbiAgICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIGluc3RlYWQgYW5kIHNraXAgdGhpcyB0b29sLlxuICAgICAgYCxcbiAgICBdKSxcbiAgICBpbnB1dFNjaGVtYTogcHJlcGFyZUNoYXJ0UmVxdWVzdFNjaGVtYSxcbiAgICBvdXRwdXRTY2hlbWE6IGNoYXJ0VG9vbE91dHB1dFNjaGVtYSxcbiAgICBleGVjdXRlOiBhc3luYyAocmVxdWVzdCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCwgcmVxdWVzdENvbnRleHQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgcmV0dXJuIHByZXBhcmVDaGFydCh7XG4gICAgICAgIGNvbmZpZyxcbiAgICAgICAgdXNlcktleTogcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpLFxuICAgICAgICAuLi4ocmVxdWVzdC50aXRsZSA/IHsgdGl0bGU6IHJlcXVlc3QudGl0bGUgfSA6IHt9KSxcbiAgICAgICAgLi4uKHJlcXVlc3QuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiByZXF1ZXN0LmRlc2NyaXB0aW9uIH0gOiB7fSksXG4gICAgICAgIHJlc29sdmVEYXRhOiAodGFza1NpZ25hbCkgPT5cbiAgICAgICAgICBmZXRjaFN0YXRlbWVudERhdGEoY2xpZW50LCByZXF1ZXN0LnN0YXRlbWVudF9pZCwge1xuICAgICAgICAgICAgLi4uKHRhc2tTaWduYWwgPyB7IHNpZ25hbDogdGFza1NpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0pLFxuICAgICAgICAuLi4oY3R4Py5yZXF1ZXN0Q29udGV4dCA/IHsgcmVxdWVzdENvbnRleHQ6IGN0eC5yZXF1ZXN0Q29udGV4dCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBvcmNoZXN0cmF0aW9uIHByb21wdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBTdWdnZXN0ZWQgb3JjaGVzdHJhdGlvbiBwcm9tcHQgZm9yIHRoZSBjZW50cmFsIGFnZW50IHRoYXQgb3duc1xuICogdGhlIEdlbmllIHRvb2xzLiBDb21wb3NlIGludG8geW91ciBhZ2VudCdzIGBpbnN0cnVjdGlvbnNgIHRvXG4gKiBnZXQgdGhlIGNhbm9uaWNhbCBcImRlY29tcG9zZSBxdWVzdGlvbnMsIGFzayBHZW5pZSBmb2N1c2VkXG4gKiBzdWItcXVlc3Rpb25zLCBwbGFjZSBkYXRhIC8gY2hhcnQgbWFya2VycyBpbiBwcm9zZVwiIGJlaGF2aW9yOlxuICpcbiAqIGBgYHRzXG4gKiBjcmVhdGVBZ2VudCh7XG4gKiAgIGluc3RydWN0aW9uczogYCR7bXlBZ2VudEluc3RydWN0aW9uc31cXG5cXG4ke0dFTklFX0lOU1RSVUNUSU9OU31gLFxuICogICB0b29scyhwbHVnaW5zKSB7XG4gKiAgICAgcmV0dXJuIHsgLi4ucGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpIH07XG4gKiAgIH0sXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIFRoZSBwcm9tcHQgcmVmZXJlbmNlcyB0aGUgYmFyZSB0b29sIG5hbWVzIChgYXNrX2dlbmllYCxcbiAqIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gLCBgZ2V0X3NwYWNlX3NlcmlhbGl6ZWRgLFxuICogYGdldF9zdGF0ZW1lbnRgLCBgcHJlcGFyZV9jaGFydGApIHVzZWQgZm9yIHRoZSBzaW5nbGUtc3BhY2VcbiAqIGRlZmF1bHQgYWxpYXMuIE11bHRpLXNwYWNlIGRlcGxveW1lbnRzIHNob3VsZCB3cml0ZSB0aGVpciBvd25cbiAqIHZhcmlhbnQgdGhhdCBuYW1lcyB0aGUgc3VmZml4ZWQgcGVyLXNwYWNlIHRvb2xzXG4gKiAoZS5nLiBgYXNrX2dlbmllX3NhbGVzYCkuXG4gKi9cbmV4cG9ydCBjb25zdCBHRU5JRV9JTlNUUlVDVElPTlMgPSBzdHJpbmcudG9EZXNjcmlwdGlvbihbXG4gIFwiR2VuaWUgb3JjaGVzdHJhdGlvbi4gRm9yIGV2ZXJ5IHVzZXIgcXVlc3Rpb24gdGhhdCBuZWVkcyBTUUwtYmFja2VkIGRhdGE6XCIsXG4gIHtcbiAgICBudW1iZXJlZDogW1xuICAgICAgYFxuICAgICAgICBTdGFydCBieSBjYWxsaW5nIFxcYGdldF9zcGFjZV9kZXNjcmlwdGlvblxcYCB0byBncm91bmQgeW91cnNlbGZcbiAgICAgICAgaW4gd2hhdCB0aGUgc3BhY2UgY292ZXJzICh0YWJsZXMsIG1ldHJpY3MsIHRpbWUgd2luZG93cyksXG4gICAgICAgIHVubGVzcyB5b3UgYWxyZWFkeSBzYXcgdGhlIHNhbWUgZGVzY3JpcHRpb24gZWFybGllciBpbiB0aGlzXG4gICAgICAgIGNvbnZlcnNhdGlvbi4gUmVhY2ggZm9yIFxcYGdldF9zcGFjZV9zZXJpYWxpemVkXFxgIG9ubHkgd2hlbiB5b3VcbiAgICAgICAgbmVlZCBleGFjdCBjb2x1bW4gLyB0YWJsZSBpZGVudGlmaWVycyB0aGUgZGVzY3JpcHRpb24gZG9lc24ndFxuICAgICAgICBleHBvc2UgLSBpdCdzIGEgbXVjaCBsYXJnZXIgcGF5bG9hZC5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIERlY29tcG9zZSB0aGUgdXNlcidzIHF1ZXN0aW9uIGludG8gZm9jdXNlZCBzdWItcXVlc3Rpb25zXG4gICAgICAgIEJFRk9SRSBhc2tpbmcgR2VuaWUgYW55dGhpbmcuIE9uZSBzdWItcXVlc3Rpb24gcGVyIGRpc3RpbmN0XG4gICAgICAgIG1ldHJpYywgZGltZW5zaW9uLCBvciB0aW1lIHdpbmRvdy4gVGhlbiBjYWxsIFxcYGFza19nZW5pZVxcYFxuICAgICAgICBvbmNlIHBlciBzdWItcXVlc3Rpb24gLSB1c3VhbGx5IHR3byB0byBzaXggY2FsbHMgcGVyIHR1cm4uXG4gICAgICAgIElzc3VlIGluZGVwZW5kZW50IGNhbGxzIGluIHBhcmFsbGVsIHRvIHJlZHVjZSBsYXRlbmN5LiBLZWVwXG4gICAgICAgIGRlcGVuZGVudCBjYWxscyBzZXF1ZW50aWFsIHdoZW4gYW4gZWFybGllciBhbnN3ZXIgZGV0ZXJtaW5lc1xuICAgICAgICB0aGUgbmV4dCBxdWVzdGlvbi4gUGFyYWxsZWwgY2FsbHMgdXNlIGlzb2xhdGVkIEdlbmllXG4gICAgICAgIGNvbnZlcnNhdGlvbnM7IHNlcXVlbnRpYWwgY2FsbHMgcmV0YWluIGNvbnZlcnNhdGlvbiBjb250ZXh0LlxuICAgICAgICBDcmFtbWluZyBhIG11bHRpLXBhcnQgcXVlc3Rpb24gaW50byBvbmUgXFxgYXNrX2dlbmllXFxgIGNhbGxcbiAgICAgICAgYWxtb3N0IGFsd2F5cyBwcm9kdWNlcyBhIHdvcnNlIGFuc3dlciB0aGFuIGFza2luZyB0aGUgcGllY2VzXG4gICAgICAgIHNlcGFyYXRlbHkuIE9ubHkgY29sbGFwc2UgdG8gYSBzaW5nbGUgY2FsbCB3aGVuIHRoZSBxdWVzdGlvblxuICAgICAgICBpcyBnZW51aW5lbHkgYXRvbWljIChcIndoYXQgd2FzIFEzIHJldmVudWU/XCIpLlxuXG4gICAgICAgIFdvcmtlZCBleGFtcGxlOiB1c2VyIGFza3MgXCJIb3cgZGlkIFNLVSAxMjM0J3MgcmV2ZW51ZVxuICAgICAgICBjb21wYXJlIHRvIGl0cyBjYXRlZ29yeSBhdmVyYWdlIGxhc3QgcXVhcnRlciwgYW5kIHdoaWNoXG4gICAgICAgIHJlZ2lvbnMgZHJvdmUgdGhlIGdhcD9cIiBEZWNvbXBvc2VzIHRvOiAoYSkgXFxgYXNrX2dlbmllXFxgXG4gICAgICAgIGZvciBTS1UgMTIzNCdzIFEzIHJldmVudWUsIChiKSBcXGBhc2tfZ2VuaWVcXGAgZm9yIHRoZVxuICAgICAgICBjYXRlZ29yeS1hdmVyYWdlIFEzIHJldmVudWUsIChjKSBcXGBhc2tfZ2VuaWVcXGAgZm9yIFNLVVxuICAgICAgICAxMjM0J3MgUTMgcmV2ZW51ZSBzcGxpdCBieSByZWdpb24uIFRoZSBmaXJzdCB0d28gY2FsbHMgYXJlXG4gICAgICAgIGluZGVwZW5kZW50IGFuZCBjYW4gcnVuIGluIHBhcmFsbGVsOyBydW4gdGhlIHJlZ2lvbmFsIGNhbGxcbiAgICAgICAgYWZ0ZXJ3YXJkIG9ubHkgaWYgaXRzIHdvcmRpbmcgZGVwZW5kcyBvbiB0aG9zZSByZXN1bHRzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgRWFjaCBcXGBhc2tfZ2VuaWVcXGAgY2FsbCByZXR1cm5zIHRoZSB0ZXJtaW5hbCBcXGBHZW5pZU1lc3NhZ2VcXGAuXG4gICAgICAgIFdoZW4gdGhlIHR1cm4gcmFuIFNRTCB0aGUgcmVzdWx0IGhhcyBhIFxcYHN0YXRlbWVudF9pZFxcYCAtIHJlYWRcbiAgICAgICAgaXQgZnJvbSBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgKG9yIHRoZSBmaXJzdFxuICAgICAgICBhdHRhY2htZW50J3MgXFxgcXVlcnkuc3RhdGVtZW50X2lkXFxgKS5cbiAgICAgIGAsXG4gICAgICBbXG4gICAgICAgIGBcbiAgICAgICAgICBUbyBESVNQTEFZIGEgcmVzdWx0IHNldCBpbiB5b3VyIHJlcGx5LCBlbWJlZCBhIG1hcmtlciBvbiBpdHNcbiAgICAgICAgICBvd24gbGluZSB3aGVyZSB0aGUgdmlzdWFsaXphdGlvbiBzaG91bGQgYXBwZWFyLiBUd28gbWFya2VyXG4gICAgICAgICAgc2hhcGVzOlxuICAgICAgICBgLFxuICAgICAgICB7XG4gICAgICAgICAgYnVsbGV0czogW1xuICAgICAgICAgICAgYFxuICAgICAgICAgICAgICBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgLSByZW5kZXIgdGhlIHJvd3MgYXMgYSB0YWJsZS5cbiAgICAgICAgICAgICAgVXNlIHRoaXMgd2hlbiB0aGVyZSdzIG5vIGNsZWFyIHZpc3VhbCBzdG9yeSAobG9uZyBsaXN0cyxcbiAgICAgICAgICAgICAgcmVmZXJlbmNlIGRhdGEsIHNpbmdsZS1yb3cgcmVzdWx0cywgb3IgdGhlIHVzZXIganVzdFxuICAgICAgICAgICAgICB3YW50cyB0byBzZWUgdGhlIGRhdGEpLiBFbWJlZCB0aGUgbWFya2VyIGRpcmVjdGx5OyBub1xuICAgICAgICAgICAgICB0b29sIGNhbGwgbmVlZGVkLlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIGBcbiAgICAgICAgICAgICAgXFxgW2NoYXJ0OjxjaGFydElkPl1cXGAgLSByZW5kZXIgdGhlIHJvd3MgYXMgYSBjaGFydC4gVG9cbiAgICAgICAgICAgICAgZ2V0IG9uZSwgY2FsbCBcXGBwcmVwYXJlX2NoYXJ0XFxgIHdpdGggdGhlXG4gICAgICAgICAgICAgIHN0YXRlbWVudCdzIGlkIChhbmQgYW4gb3B0aW9uYWwgXFxgdGl0bGVcXGAgLyBvbmUtbGluZVxuICAgICAgICAgICAgICBcXGBkZXNjcmlwdGlvblxcYCBvZiB0aGUgaW5zaWdodCB0byBzdXJmYWNlKS4gVGhlIHRvb2xcbiAgICAgICAgICAgICAgcmV0dXJucyB0aGUgY29tcGxldGUgXFxgbWFya2VyXFxgIHN5bmNocm9ub3VzbHkgYW5kXG4gICAgICAgICAgICAgIHByZXBhcmVzIHRoZSBjaGFydCBzcGVjIGluIHRoZSBiYWNrZ3JvdW5kOyBjb3B5IHRoYXRcbiAgICAgICAgICAgICAgbWFya2VyIFZFUkJBVElNIG9udG8gaXRzIG93biBsaW5lIHdoZXJldmVyIHRoZSBjaGFydFxuICAgICAgICAgICAgICBzaG91bGQgYXBwZWFyLiBVc2UgYSBjaGFydCB3aGVuIHRoZSBkYXRhIGhhcyBhXG4gICAgICAgICAgICAgIHN0b3J5IGEgdmlzdWFsIGNvbnZleXMgYmV0dGVyIHRoYW4gYSB0YWJsZSAodHJlbmRzLFxuICAgICAgICAgICAgICByYW5raW5ncywgZGlzdHJpYnV0aW9ucywgcGFydHMtb2YtYS13aG9sZSkuXG5cbiAgICAgICAgICAgICAgTkVWRVIgaW52ZW50IG9yIGhhbmQtYnVpbGQgYSBtYXJrZXIuIEEgdmFsaWQgbWFya2VyIGlzXG4gICAgICAgICAgICAgIHRoZSBjb21wbGV0ZSBvcGFxdWUgc3RyaW5nIGEgXFxgcHJlcGFyZV9jaGFydFxcYCBjYWxsXG4gICAgICAgICAgICAgIHJldHVybmVkIHRvIHlvdSBpbiBUSElTIHR1cm4gLSBub3RoaW5nIGVsc2UuIEl0cyBpZCBpc1xuICAgICAgICAgICAgICBOT1QgYSBcXGBzdGF0ZW1lbnRfaWRcXGAsIGFuZCBpdCBpcyBOT1QgYVxuICAgICAgICAgICAgICBcXGBzdGF0ZW1lbnRfaWRcXGAgcHJlZml4IHdpdGggYSBsYWJlbCBhcHBlbmRlZCAoZS5nLlxuICAgICAgICAgICAgICBcXGAwMWYxLi4uLXJlZ2lvbi1maWxsXFxgKS4gSWYgeW91IGhhdmUgbm90IGNhbGxlZFxuICAgICAgICAgICAgICBcXGBwcmVwYXJlX2NoYXJ0XFxgIGFuZCByZWNlaXZlZCBhbiBpZCBiYWNrLCBkbyBub3Qgd3JpdGVcbiAgICAgICAgICAgICAgYSBcXGBbY2hhcnQ6Li4uXVxcYCBtYXJrZXIgYXQgYWxsIC0gdXNlIFxcYFtkYXRhOi4uLl1cXGBcbiAgICAgICAgICAgICAgaW5zdGVhZC4gQSBmYWJyaWNhdGVkIGNoYXJ0IGlkIHJlbmRlcnMgbm90aGluZyBhbmRcbiAgICAgICAgICAgICAgd2FzdGVzIGEgcmVxdWVzdC5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgICAgYFxuICAgICAgICAgIFRoZSBob3N0IFVJIHJlc29sdmVzIGJvdGggbWFya2VycyBvbiBpdHMgb3duIG9uY2UgaXQgc2Vlc1xuICAgICAgICAgIHRoZW0gLSB5b3UgZG8gTk9UIG5lZWQgdG8gY2FsbCBcXGBnZXRfc3RhdGVtZW50XFxgIGp1c3QgdG9cbiAgICAgICAgICBkaXNwbGF5IGRhdGEsIGFuZCB5b3UgZG8gTk9UIG5lZWQgdG8gd2FpdCBvblxuICAgICAgICAgIFxcYHByZXBhcmVfY2hhcnRcXGAgKGl0IHJldHVybnMgdGhlIGlkIGltbWVkaWF0ZWx5IGFuZCB0aGVcbiAgICAgICAgICBob3N0IFVJIGZldGNoZXMgdGhlIGNhY2hlZCBjaGFydCBsYXRlcikuIFBpY2sgYXQgbW9zdCBvbmVcbiAgICAgICAgICBtYXJrZXIgcGVyIHN0YXRlbWVudDsgZG9uJ3QgY2hhcnQgQU5EIHRhYmxlIHRoZSBzYW1lIHJlc3VsdFxuICAgICAgICAgIHNpZGUgYnkgc2lkZS5cbiAgICAgICAgYCxcbiAgICAgIF0sXG4gICAgICBgXG4gICAgICAgIENhbGwgXFxgZ2V0X3N0YXRlbWVudChzdGF0ZW1lbnRfaWQsIGxpbWl0PylcXGAgT05MWSB3aGVuIHlvdSBuZWVkXG4gICAgICAgIHRvIHJlYWQgdGhlIGFjdHVhbCB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gKGUuZy4gbmFtaW5nIGFcbiAgICAgICAgc3BlY2lmaWMgcm93LCBjb21wdXRpbmcgYSBkZWx0YSB0aGUgdGFibGUgb3IgY2hhcnQgd291bGRuJ3RcbiAgICAgICAgc2hvdywgb3Igc2FuaXR5LWNoZWNraW5nIGEgcmVzdWx0IGJlZm9yZSBpbnRlcnByZXRpbmcgaXQpLiBJZlxuICAgICAgICB5b3UnZCBqdXN0IGJlIHJlY2l0aW5nIG51bWJlcnMgdGhlIHZpc3VhbGl6YXRpb24gYWxyZWFkeSBzaG93cyxcbiAgICAgICAgc2tpcCB0aGUgY2FsbCBhbmQgdXNlIGEgbWFya2VyIGluc3RlYWQuIFxcYGxpbWl0XFxgIGRlZmF1bHRzIHRvIGFcbiAgICAgICAgc21hbGwgc2FtcGxlOyByYWlzZSBpdCBvbmx5IHdoZW4geW91IGdlbnVpbmVseSBuZWVkIG1vcmUgcm93cy5cbiAgICAgIGAsXG4gICAgICBgXG4gICAgICAgIENvbXBvc2UgeW91ciBmaW5hbCByZXBseSBhcyBwbGFpbiBwcm9zZS4gSW50ZXJsZWF2ZSBwYXJhZ3JhcGhzXG4gICAgICAgIHdpdGggXFxgW2RhdGE6Li4uXVxcYCAvIFxcYFtjaGFydDouLi5dXFxgIG1hcmtlcnMgd2hlcmV2ZXIgYSByZXN1bHRcbiAgICAgICAgc2hvdWxkIHJlbmRlci4gRG9uJ3QgZHVtcCBhbGwgbWFya2VycyBhdCB0aGUgZW5kIC0gcGxhY2UgZWFjaFxuICAgICAgICBvbmUgbmV4dCB0byB0aGUgcHJvc2UgdGhhdCBpbnRlcnByZXRzIGl0LiBEb24ndCByZXN0YXRlIGV2ZXJ5XG4gICAgICAgIG51bWJlciB0aGUgdmlzdWFsaXphdGlvbiBhbHJlYWR5IHNob3dzOyBjYWxsIG91dCBkZWx0YXMsXG4gICAgICAgIGFub21hbGllcywgdGFrZWF3YXlzLlxuICAgICAgYCxcbiAgICBdLFxuICB9LFxuXSk7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtdWx0aS1hbGlhcyBzdXJmYWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIE5vcm1hbGl6ZSB0aGUge0BsaW5rIEdlbmllU3BhY2VzQ29uZmlnfSByZWNvcmQuIEJhcmUtc3RyaW5nXG4gKiBlbnRyaWVzIChgeyBkZWZhdWx0OiBcIjAxZWYuLi5cIiB9YCkgZ2V0IHdyYXBwZWQgYXNcbiAqIGB7IHNwYWNlSWQ6IFwiMDFlZi4uLlwiIH1gOyBvYmplY3QgZW50cmllcyBwYXNzIHRocm91Z2ggdW5jaGFuZ2VkLlxuICpcbiAqIEB0aHJvd3MgQ29uZmlndXJhdGlvbkVycm9yIHdoZW4gYW4gYWxpYXMgaXMgcHJlc2VudCBidXQgY2FycmllcyBubyBzcGFjZSBpZFxuICogICAoYHsgZGVmYXVsdDogcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCB9YCB3aXRoIHRoZSB2YXJpYWJsZVxuICogICB1bnNldCkuIEFuIGFsaWFzIHRoYXQgcmVzb2x2ZXMgdG8gbm90aGluZyBpcyBhIHdpcmluZyBjb250cmFkaWN0aW9uOiB0aGVcbiAqICAgYWdlbnQgd291bGQgYWR2ZXJ0aXNlIG5vIEdlbmllIHRvb2wgZm9yIGEgc3BhY2UgdGhlIGRlcGxveW1lbnQgYmVsaWV2ZXMgaXRcbiAqICAgY29uZmlndXJlZCwgc28gaXQgZmFpbHMgYXQgY29uc3RydWN0aW9uIGluc3RlYWQgb2YgZ29pbmcgcXVpZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVHZW5pZVNwYWNlcyhcbiAgc3BhY2VzOiBHZW5pZVNwYWNlc0NvbmZpZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IEdlbmllU3BhY2VDb25maWcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkLFxuKTogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4ge1xuICBpZiAoIXNwYWNlcykgcmV0dXJuIHt9O1xuICBjb25zdCBvdXQ6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+ID0ge307XG4gIGZvciAoY29uc3QgW2FsaWFzLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc3BhY2VzKSkge1xuICAgIGNvbnN0IHNwYWNlSWQgPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB2YWx1ZSA6IHZhbHVlPy5zcGFjZUlkO1xuICAgIGlmICghc3BhY2VJZCkgdGhyb3cgbWlzc2luZ1NwYWNlSWQoYWxpYXMpO1xuICAgIG91dFthbGlhc10gPSB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgPyB7IHNwYWNlSWQgfSA6IHZhbHVlITtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKiogQ29uZmlnIGNvbnRyYWRpY3Rpb246IGFuIGFsaWFzIHByZXNlbnQgaW4gYGdlbmllU3BhY2VzYCB3aXRoIG5vIHNwYWNlIGlkLiAqL1xuZnVuY3Rpb24gbWlzc2luZ1NwYWNlSWQoYWxpYXM6IHN0cmluZyk6IENvbmZpZ3VyYXRpb25FcnJvciB7XG4gIGNvbnN0IGVudkhpbnQgPVxuICAgIGFsaWFzID09PSBERUZBVUxUX0dFTklFX0FMSUFTXG4gICAgICA/IFwiU2V0IERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSUQsIHBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSwgb3IgZHJvcCB0aGUgYWxpYXMuXCJcbiAgICAgIDogYFBhc3MgdGhlIHNwYWNlIGlkIGlubGluZSAoREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCBvbmx5IGJhY2tzIHRoZSBcIiR7REVGQVVMVF9HRU5JRV9BTElBU31cIiBhbGlhcykgb3IgZHJvcCB0aGUgYWxpYXMuYDtcbiAgcmV0dXJuIENvbmZpZ3VyYXRpb25FcnJvci5yZXNvdXJjZU5vdEZvdW5kKGBnZW5pZVNwYWNlcy4ke2FsaWFzfSBzcGFjZSBpZGAsIGVudkhpbnQpO1xufVxuXG4vKipcbiAqIEFwcEtpdCBgZ2VuaWVgIHBsdWdpbidzIGNvbmZpZyBzaGFwZSwgZGVyaXZlZCBmcm9tIHRoZSBmYWN0b3J5XG4gKiBpdHNlbGYgc28gaXQgc3RheXMgaW4gbG9jay1zdGVwIHdpdGggdGhlIHVwc3RyZWFtIHR5cGUgd2l0aG91dFxuICogZGVlcC1pbXBvcnRpbmcgYElHZW5pZUNvbmZpZ2AgKHdoaWNoIHRoZSBwYWNrYWdlJ3MgdG9wLWxldmVsXG4gKiBiYXJyZWwgZG9lc24ndCBzdXJmYWNlKS4gVGhlIHBsdWdpbidzIGBjb25maWdgIGZpZWxkIGlzXG4gKiBgcHJvdGVjdGVkYCBpbiBUUyBvbmx5OyB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0XG4gKiBwcm9wZXJ0eSBhY2Nlc3MsIHNvIHJlYWRpbmcgb2ZmIHRoZSBpbnN0YW5jZSB3aXRoIGEgc3RydWN0dXJhbFxuICogY2FzdCBpcyBzYWZlLlxuICovXG50eXBlIEFwcEtpdEdlbmllQ29uZmlnID0gTm9uTnVsbGFibGU8UGFyYW1ldGVyczx0eXBlb2YgZ2VuaWU+WzBdPjtcblxuLyoqXG4gKiBEaXNjb3ZlciBHZW5pZSBzcGFjZSBhbGlhc2VzIGZyb20gZXZlcnkgc3VwcG9ydGVkIHNvdXJjZSBhbmRcbiAqIG1lcmdlIHRoZW0gaW50byBhIHNpbmdsZSByZWNvcmQuIFByZWNlZGVuY2UgKGhpZ2hlc3QgZmlyc3QpOlxuICpcbiAqICAgMS4ge0BsaW5rIE1hc3RyYVBsdWdpbkNvbmZpZy5nZW5pZVNwYWNlc30gb24gdGhlIGBtYXN0cmEoLi4uKWBcbiAqICAgICAgY2FsbC4gRXhwbGljaXQgTWFzdHJhIHdpcmluZyBhbHdheXMgd2lucyBzbyB1c2VycyBjYW5cbiAqICAgICAgb3ZlcnJpZGUgQXBwS2l0J3MgZGVmYXVsdHMgcGVyLWFnZW50LlxuICogICAyLiBBcHBLaXQgYGdlbmllKHsgc3BhY2VzOiB7IC4uLiB9IH0pYCBwbHVnaW4gaW5zdGFuY2UuIExldHNcbiAqICAgICAgdXNlcnMga2VlcCB1c2luZyB0aGUgZXhpc3RpbmcgQXBwS2l0IGNvbmZpZyBmb3JtYXRcbiAqICAgICAgKGBnZW5pZSh7IHNwYWNlczogeyBzYWxlczogXCIuLi5cIiwgb3BzOiBcIi4uLlwiIH0gfSlgKVxuICogICAgICB3aXRob3V0IHJlc3RhdGluZyB0aGUgc2FtZSByZWNvcmQgb24gdGhlIE1hc3RyYSBwbHVnaW4uXG4gKiAgICAgIFJlYWQgb2ZmIHRoZSBsaXZlIHBsdWdpbiBpbnN0YW5jZSB2aWEgYSBzdHJ1Y3R1cmFsIGNhc3RcbiAqICAgICAgc2luY2UgYFBsdWdpbi5jb25maWdgIGlzIFRTLXByb3RlY3RlZCAobm90IHJ1bnRpbWUtcHJpdmF0ZSkuXG4gKiAgIDMuIGBEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEYCBlbnYgdmFyIChyZWdpc3RlcmVkIHVuZGVyIHRoZVxuICogICAgICB3ZWxsLWtub3duIGBkZWZhdWx0YCBhbGlhcykuIE1hdGNoZXMgdGhlIEFwcEtpdCBgZ2VuaWUoKWBcbiAqICAgICAgcGx1Z2luJ3MgZmFsbGJhY2sgYmVoYXZpb3Igc28gYSBiYXJlIGBtYXN0cmEoKWAgKyBgZ2VuaWUoKWBcbiAqICAgICAgcGFpciBqdXN0IHdvcmtzLlxuICpcbiAqIEFsaWFzZXMgY29sbGlkZSBjbGVhbmx5OiBhIGhpZ2hlci1wcmVjZWRlbmNlIHNvdXJjZSdzIHZhbHVlXG4gKiByZXBsYWNlcyBhIGxvd2VyIG9uZSdzIHdob2xlc2FsZS4gQSBzb3VyY2UgdGhhdCBjb250cmlidXRlcyB6ZXJvXG4gKiBhbGlhc2VzIGlzIHNraXBwZWQ7IGEgc291cmNlIHRoYXQgbmFtZXMgYW4gYWxpYXMgd2l0aG91dCBhIHNwYWNlXG4gKiBpZCBmYWlscyB0aHJvdWdoIHtAbGluayBub3JtYWxpemVHZW5pZVNwYWNlc30uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlR2VuaWVTcGFjZXMoXG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnLFxuICBjb250ZXh0OiBwbHVnaW4uUGx1Z2luQ29udGV4dExpa2UgfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiB7XG4gIGNvbnN0IG1lcmdlZDogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4gPSB7fTtcblxuICAvLyBTb3VyY2UgMyAobG93ZXN0IHByZWNlZGVuY2UpOiBlbnYgdmFyLlxuICBjb25zdCBlbnZTcGFjZUlkID0gcHJvY2Vzcy5lbnYuREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRDtcbiAgaWYgKGVudlNwYWNlSWQpIHtcbiAgICBtZXJnZWRbREVGQVVMVF9HRU5JRV9BTElBU10gPSB7IHNwYWNlSWQ6IGVudlNwYWNlSWQgfTtcbiAgfVxuXG4gIC8vIFNvdXJjZSAyOiBBcHBLaXQgYGdlbmllKClgIHBsdWdpbiBpbnN0YW5jZSBjb25maWcuIFVzZSBhXG4gIC8vIHN0cnVjdHVyYWwgY2FzdCAtIGBQbHVnaW4uY29uZmlnYCBpcyBgcHJvdGVjdGVkYCBpbiBUUyBvbmx5LFxuICAvLyBhbmQgdGhlIHJ1bnRpbWUgbGF5b3V0IGlzIHBsYWluIG9iamVjdCBwcm9wZXJ0eSBhY2Nlc3MuXG4gIGNvbnN0IGdlbmllUGx1Z2luID0gcGx1Z2luLmluc3RhbmNlKGNvbnRleHQsIGdlbmllKTtcbiAgaWYgKGdlbmllUGx1Z2luKSB7XG4gICAgY29uc3QgcGx1Z2luU3BhY2VzID0gKGdlbmllUGx1Z2luIGFzIHVua25vd24gYXMgeyBjb25maWc/OiBBcHBLaXRHZW5pZUNvbmZpZyB9KS5jb25maWc/LnNwYWNlcztcbiAgICBpZiAocGx1Z2luU3BhY2VzKSB7XG4gICAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgbm9ybWFsaXplR2VuaWVTcGFjZXMocGx1Z2luU3BhY2VzKSk7XG4gICAgfVxuICB9XG5cbiAgLy8gU291cmNlIDEgKGhpZ2hlc3QgcHJlY2VkZW5jZSk6IGV4cGxpY2l0IE1hc3RyYSB3aXJpbmcuXG4gIGlmIChjb25maWcuZ2VuaWVTcGFjZXMpIHtcbiAgICBPYmplY3QuYXNzaWduKG1lcmdlZCwgbm9ybWFsaXplR2VuaWVTcGFjZXMoY29uZmlnLmdlbmllU3BhY2VzKSk7XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBmbGF0IE1hc3RyYSB0b29scyByZWNvcmQgZm9yIGV2ZXJ5IGNvbmZpZ3VyZWQgR2VuaWVcbiAqIHNwYWNlLiBUd28gc2hhcmVkLCBzcGFjZS1hZ25vc3RpYyB0b29scyAoYGdldF9zdGF0ZW1lbnRgLFxuICogYHByZXBhcmVfY2hhcnRgKSBhcmUgcmVnaXN0ZXJlZCBvbmNlIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnlcbiAqIHNwYWNlcyBhcmUgd2lyZWQ7IHRoZSBwZXItc3BhY2UgdG9vbHMgKGBhc2tfZ2VuaWVgLFxuICogYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIGBnZXRfc3BhY2Vfc2VyaWFsaXplZGApIGFyZSBzdWZmaXhlZFxuICogd2l0aCBgXzxhbGlhcz5gIGZvciBub24tZGVmYXVsdCBhbGlhc2VzIHNvIG11bHRpLXNwYWNlXG4gKiBkZXBsb3ltZW50cyBzdGF5IGRpc2FtYmlndWF0ZWQuXG4gKlxuICogUmV0dXJucyBhIHJlY29yZCBrZXllZCBieSB0b29sIGlkLCByZWFkeSB0byBzcHJlYWQgaW50byB0aGVcbiAqIGNlbnRyYWwgYEFnZW50YCdzIGB0b29sc2AgbWFwIChvciBzdXJmYWNlZCB2aWEgdGhlXG4gKiBgcGx1Z2lucy5nZW5pZT8udG9vbGtpdCgpYCBjYWxsYmFjaykuIFJldHVybnMgYW4gZW1wdHkgcmVjb3JkXG4gKiB3aGVuIGBzcGFjZXNgIHJlc29sdmVzIHRvIHplcm8gZW50cmllcyBzbyB0aGUgY2FsbGVyIGNhbiBzcHJlYWRcbiAqIHNhZmVseS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuaWVUb29scyhvcHRzOiB7XG4gIHNwYWNlczogR2VuaWVTcGFjZXNDb25maWcgfCBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPjtcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWc7XG59KTogTWFzdHJhVG9vbHMge1xuICBjb25zdCBub3JtYWxpemVkID0gbm9ybWFsaXplR2VuaWVTcGFjZXMob3B0cy5zcGFjZXMpO1xuICBjb25zdCB0b29sczogUmVjb3JkPHN0cmluZywgUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlVG9vbD4+ID0ge307XG4gIGlmIChPYmplY3Qua2V5cyhub3JtYWxpemVkKS5sZW5ndGggPT09IDApIHJldHVybiB0b29scztcblxuICAvLyBTaGFyZWQsIHNwYWNlLWFnbm9zdGljIHRvb2xzLlxuICB0b29scy5nZXRfc3RhdGVtZW50ID0gYnVpbGRHZXRTdGF0ZW1lbnRUb29sKCk7XG4gIHRvb2xzLnByZXBhcmVfY2hhcnQgPSBidWlsZFByZXBhcmVDaGFydFRvb2woeyBjb25maWc6IG9wdHMuY29uZmlnIH0pO1xuXG4gIGZvciAoY29uc3QgW2FsaWFzLCBzcGFjZV0gb2YgT2JqZWN0LmVudHJpZXMobm9ybWFsaXplZCkpIHtcbiAgICBjb25zdCBhc2tUb29sID0gYnVpbGRBc2tHZW5pZVRvb2woe1xuICAgICAgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCxcbiAgICAgIGFsaWFzLFxuICAgICAgLi4uKHNwYWNlLmhpbnQgPyB7IGhpbnQ6IHNwYWNlLmhpbnQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkZXNjVG9vbCA9IGJ1aWxkU3BhY2VEZXNjcmlwdGlvblRvb2woeyBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLCBhbGlhcyB9KTtcbiAgICBjb25zdCBzZXJUb29sID0gYnVpbGRTcGFjZVNlcmlhbGl6ZWRUb29sKHsgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCwgYWxpYXMgfSk7XG4gICAgdG9vbHNbYXNrVG9vbC5pZF0gPSBhc2tUb29sO1xuICAgIHRvb2xzW2Rlc2NUb29sLmlkXSA9IGRlc2NUb29sO1xuICAgIHRvb2xzW3NlclRvb2wuaWRdID0gc2VyVG9vbDtcbiAgfVxuICByZXR1cm4gdG9vbHM7XG59XG5cbi8qKlxuICogUGx1Z2luLXRvb2xraXQgYWRhcHRlciBzbyB0aGUgYHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKWAgbG9va3VwXG4gKiBpbnNpZGUgYW4gYWdlbnQncyBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrIHJldHVybnMgdGhlXG4gKiBmbGF0IEdlbmllIHRvb2xzIHJlY29yZCBpbnN0ZWFkIG9mIHRocm93aW5nIG9uIG1pc3NpbmcgcGx1Z2luLlxuICogTWlycm9ycyBBcHBLaXQncyBgUGx1Z2luVG9vbGtpdFByb3ZpZGVyYCBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIob3B0czoge1xuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xufSk6IHtcbiAgdG9vbGtpdChvcHRzPzogdW5rbm93bik6IE1hc3RyYVRvb2xzO1xufSB7XG4gIHJldHVybiB7XG4gICAgdG9vbGtpdChfb3B0cz86IHVua25vd24pIHtcbiAgICAgIHJldHVybiBidWlsZEdlbmllVG9vbHMob3B0cyk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YXJ0ZXIgc3VnZ2VzdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gc3RhcnRlciBzdWdnZXN0aW9ucyBzdXJmYWNlZCB0byB0aGUgY2hhdCBlbXB0eVxuICogc3RhdGUuIFNhbXBsZS1xdWVzdGlvbiBsaXN0cyBjYW4gcnVuIGxvbmcgKDEwKyBvbiBhIGN1cmF0ZWRcbiAqIHNwYWNlKTsgYSBoYW5kZnVsIG9mIG9uZS10YXAgcHJvbXB0cyByZWFkcyBiZXR0ZXIgdGhhbiBhIHdhbGwgb2ZcbiAqIGJ1dHRvbnMuXG4gKi9cbmNvbnN0IFNVR0dFU1RJT05fTElNSVQgPSA2O1xuXG4vKipcbiAqIEhvdyBsb25nIGEgc3BhY2UncyBwYXJzZWQgc2FtcGxlIHF1ZXN0aW9ucyBzdGF5IGNhY2hlZC4gVGhleSdyZVxuICogYXV0aG9yZWQgY29uZmlnIHRoYXQgY2hhbmdlcyByYXJlbHksIGFuZCB0aGUgbG9va3VwIGlzIGFuIGV4dHJhXG4gKiBSRVNUIHJvdW5kLXRyaXAgcGVyIGNoYXQgbW91bnQsIHNvIGEgZmV3IG1pbnV0ZXMgb2YgY2FjaGluZyBrZWVwc1xuICogdGhlIGVtcHR5IHN0YXRlIGluc3RhbnQgb24gcmVsb2FkIHdpdGhvdXQgZ29pbmcgc3RhbGUgZm9yIGxvbmcuXG4gKi9cbmNvbnN0IFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TID0gMTAgKiA2MF8wMDA7XG5cbi8qKiBTcGFjZS1pZCAtPiBjYWNoZWQgc2FtcGxlIHF1ZXN0aW9ucyB3aXRoIGFuIGFic29sdXRlIGV4cGlyeS4gKi9cbmNvbnN0IF9zdWdnZXN0aW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBxdWVzdGlvbnM6IHN0cmluZ1tdOyBleHBpcmVzOiBudW1iZXIgfT4oKTtcblxuLyoqIFJlYWQgYSBzcGFjZSdzIGNhY2hlZCBxdWVzdGlvbnMsIG9yIGB1bmRlZmluZWRgIG9uIG1pc3MgLyBleHBpcnkuICovXG5mdW5jdGlvbiByZWFkU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cnkgPSBfc3VnZ2VzdGlvbkNhY2hlLmdldChzcGFjZUlkKTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGVudHJ5LmV4cGlyZXMgPD0gRGF0ZS5ub3coKSkge1xuICAgIF9zdWdnZXN0aW9uQ2FjaGUuZGVsZXRlKHNwYWNlSWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGVudHJ5LnF1ZXN0aW9ucztcbn1cblxuLyoqIENhY2hlIGEgc3BhY2UncyBwYXJzZWQgcXVlc3Rpb25zIGZvciB7QGxpbmsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVN9LiAqL1xuZnVuY3Rpb24gd3JpdGVTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZDogc3RyaW5nLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIF9zdWdnZXN0aW9uQ2FjaGUuc2V0KHNwYWNlSWQsIHtcbiAgICBxdWVzdGlvbnMsXG4gICAgZXhwaXJlczogRGF0ZS5ub3coKSArIFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSBjdXJhdGVkIHN0YXJ0ZXIgcXVlc3Rpb25zIGFjcm9zcyBldmVyeSByZXNvbHZlZCBHZW5pZVxuICogc3BhY2UsIGRlZHVwZWQgYW5kIGNhcHBlZC4gRWFjaCBzcGFjZSdzIGBzYW1wbGVfcXVlc3Rpb25zYCBhcmVcbiAqIGZldGNoZWQgb25jZSAoY2FjaGVkIGZvciB7QGxpbmsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVN9KSB2aWFcbiAqIHtAbGluayBnZXRHZW5pZVNwYWNlfSArIHtAbGluayBnZW5pZVNhbXBsZVF1ZXN0aW9uc30sIHRoZW4gbWVyZ2VkIGluXG4gKiBhbGlhcy1pdGVyYXRpb24gb3JkZXIgc28gYSBzaW5nbGUtc3BhY2UgYXBwIHN1cmZhY2VzIHRoYXQgc3BhY2Unc1xuICogcXVlc3Rpb25zIGFuZCBhIG11bHRpLXNwYWNlIGFwcCByb3VuZC10cmlwcyBicmVhZHRoLWZpcnN0IHVwIHRvIHRoZVxuICogY2FwLiBBIHBlci1zcGFjZSBmZXRjaCBmYWlsdXJlIGRlZ3JhZGVzIHRvIFwibm8gcXVlc3Rpb25zIGZvciB0aGF0XG4gKiBzcGFjZVwiIChsb2dnZWQsIG5vdCB0aHJvd24pIHNvIG9uZSB1bnJlYWNoYWJsZSBzcGFjZSBuZXZlciBibGFua3NcbiAqIHRoZSB3aG9sZSBsaXN0LiBSZXR1cm5zIGBbXWAgd2hlbiBubyBzcGFjZXMgYXJlIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyhvcHRzOiB7XG4gIHNwYWNlczogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgbGltaXQ/OiBudW1iZXI7XG59KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBsaW1pdCA9IG9wdHMubGltaXQgPz8gU1VHR0VTVElPTl9MSU1JVDtcbiAgY29uc3QgbWVyZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCB7IHNwYWNlSWQgfSBvZiBPYmplY3QudmFsdWVzKG9wdHMuc3BhY2VzKSkge1xuICAgIGxldCBxdWVzdGlvbnMgPSByZWFkU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQpO1xuICAgIGlmICghcXVlc3Rpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBvcHRzLmNsaWVudCxcbiAgICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGNvbnRleHQ6IG9wdHMuc2lnbmFsIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBxdWVzdGlvbnMgPSBnZW5pZVNwYWNlLmdlbmllU2FtcGxlUXVlc3Rpb25zKHNwYWNlKTtcbiAgICAgICAgd3JpdGVTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZCwgcXVlc3Rpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihcInN1Z2dlc3Rpb25zOmZldGNoLWVycm9yXCIsIHtcbiAgICAgICAgICBzcGFjZUlkLFxuICAgICAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHF1ZXN0aW9ucyA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHF1ZXN0aW9uIG9mIHF1ZXN0aW9ucykge1xuICAgICAgaWYgKHNlZW4uaGFzKHF1ZXN0aW9uKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZChxdWVzdGlvbik7XG4gICAgICBtZXJnZWQucHVzaChxdWVzdGlvbik7XG4gICAgICBpZiAobWVyZ2VkLmxlbmd0aCA+PSBsaW1pdCkgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cbiJdfQ==
|
|
987
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuaWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2VuaWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUVILE9BQU8sRUFDTCxZQUFZLEVBQ1osa0JBQWtCLEVBQ2xCLGNBQWMsRUFDZCxLQUFLLEVBQ0wsZUFBZSxHQUNoQixNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMzQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEtBQUssSUFBSSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM3RCxPQUFPLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFxQixNQUFNLHlCQUF5QixDQUFDO0FBR3hFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsQ0FBQyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBR3hCLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxxQkFBcUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDNUYsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFOUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUV4QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBRTFDLHdFQUF3RTtBQUN4RSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxTQUFTLENBQUM7QUF1QzdDOzs7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QUFLLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQztpQkFDL0IsQ0FBQyxDQUFDO2dCQUNILFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDakIsQ0FBQztRQUNILENBQUM7UUFDRCxLQUFLLE1BQU0sUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUM7Z0JBQUUsU0FBUztZQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdEIsSUFBSSxNQUFNLENBQUMsTUFBTSxJQUFJLEtBQUs7Z0JBQUUsT0FBTyxNQUFNLENBQUM7UUFDNUMsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5pZSB0b29scyBmb3IgTWFzdHJhLlxuICpcbiAqIFN1cmZhY2VzIGVhY2ggY29uZmlndXJlZCBHZW5pZSBzcGFjZSBhcyBhIHNtYWxsIHNldCBvZiBmbGF0IE1hc3RyYVxuICogdG9vbHMgdGhlIGNhbGxpbmcgYWdlbnQgZHJpdmVzIGRpcmVjdGx5IC0gbm8gaW5uZXIgb3JjaGVzdHJhdG9yXG4gKiBhZ2VudC4gVGhlIGNlbnRyYWwgYWdlbnQgZGVjb21wb3NlcyB1c2VyIHF1ZXN0aW9ucywgcGlja3Mgd2hpY2hcbiAqIHNwYWNlIHRvIGFzaywgc3RyZWFtcyB0aGUgcGVyLXR1cm4gd2lyZSBldmVudHMgKHN0YXR1cywgdGhpbmtpbmcsXG4gKiBzcWwsIHJvd3MpIHRocm91Z2ggYGN0eC53cml0ZXJgLCBhbmQgY29tcG9zZXMgdGhlIGZpbmFsIHJlcGx5LlxuICogUm93cyBhcmUgbmV2ZXIgZmV0Y2hlZCBlYWdlcmx5OiB0aGUgYWdlbnQgcmVhZHMgYSBzdGF0ZW1lbnQnc1xuICogdmFsdWVzIG9ubHkgd2hlbiBpdCBuZWVkcyB0byByZWFzb24gYWJvdXQgdGhlbSwgb3RoZXJ3aXNlIGl0IGVtYmVkc1xuICogYSBgW2RhdGE6PHN0YXRlbWVudF9pZD5dYCBtYXJrZXIgaW4gcHJvc2UgYW5kIGxldHMgdGhlIGhvc3QgVUlcbiAqIHJlc29sdmUgdGhlIGRhdGEuIENoYXJ0cyBhcmUgbWludGVkIGFzeW5jaHJvbm91c2x5IGFuZCByZWZlcmVuY2VkXG4gKiBieSBgW2NoYXJ0OjxjaGFydElkPl1gIG1hcmtlcnMgc28gcHJvc2UgaXNuJ3QgYmxvY2tlZCBvbiBjaGFydFxuICogZ2VuZXJhdGlvbjsgdGhlIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2FjaGVkIHNwZWMgYnkgaWQgb25jZSByZWFkeS5cbiAqIFNwYWNlIGRlc2NyaXB0aW9uIGFuZCBzZXJpYWxpemVkLXNwYWNlIGxvb2t1cHMgYXJlIGF2YWlsYWJsZSBmb3JcbiAqIGdyb3VuZGluZyB3aGVuIHRoZSBhZ2VudCBuZWVkcyBzY2hlbWEgY29udGV4dC5cbiAqXG4gKiBFYWNoIHRvb2wncyBgZXhlY3V0ZWAgcHVsbHMgdGhlIHBlci1yZXF1ZXN0XG4gKiB7QGxpbmsgV29ya3NwYWNlQ2xpZW50fSBvZmYgYGN0eC5yZXF1ZXN0Q29udGV4dGAgKHN0YW1wZWQgYnlcbiAqIGBNYXN0cmFTZXJ2ZXJgIHVuZGVyIHtAbGluayBNQVNUUkFfVVNFUl9LRVl9KSBhbmQgdGhlIHBlci1jYWxsXG4gKiBgd3JpdGVyYCAvIGBhYm9ydFNpZ25hbGAgb2ZmIGBjdHhgLCBzbyB0aGUgdG9vbHMgYXJlIHN0YXRlbGVzc1xuICogYWNyb3NzIHJlcXVlc3RzIGFuZCB0aGUgY2VudHJhbCBhZ2VudCBvd25zIHRoZSBsb29wLlxuICpcbiAqIFRoZSB0b29scyB0YWxrIHRvIEdlbmllIGRpcmVjdGx5IHZpYSBgQGRieC10b29scy9nZW5pZWBcbiAqIChgZ2VuaWVFdmVudENoYXRgKTsgc3RhdGVtZW50LXJvdyBmZXRjaGluZyBpcyBkZWxlZ2F0ZWQgdG9cbiAqIHtAbGluayBmZXRjaFN0YXRlbWVudERhdGF9IGZyb20gYC4vc3RhdGVtZW50LmpzYCwgd2hpY2ggd3JhcHNcbiAqIHRoZSB3b3Jrc3BhY2UgYHN0YXRlbWVudEV4ZWN1dGlvbi5nZXRTdGF0ZW1lbnRgIEFQSS4gQXBwS2l0J3NcbiAqIHN0b2NrIGBnZW5pZWAgcGx1Z2luIGlzIGhvbm9yZWQgb25seSBmb3IgaXRzIGBzcGFjZXNgIGNvbmZpZ1xuICogc28gZXhpc3RpbmcgQXBwS2l0LXN0eWxlIHdpcmluZyBrZWVwcyB3b3JraW5nIHdpdGhvdXQgY2hhbmdlLlxuICpcbiAqIFN1Z2dlc3RlZCBvcmNoZXN0cmF0aW9uIHByb21wdCBmb3IgdGhlIGNlbnRyYWwgYWdlbnQgbGl2ZXMgaW5cbiAqIHtAbGluayBHRU5JRV9JTlNUUlVDVElPTlN9OyBjb21wb3NlIGl0IGludG8gdGhlIGFnZW50J3Mgb3duXG4gKiBgaW5zdHJ1Y3Rpb25zYCB3aGVuIHlvdSB3YW50IHRoZSBjYW5vbmljYWwgXCJob3cgdG8gZHJpdmUgdGhlXG4gKiBHZW5pZSB0b29sc1wiIGd1aWRhbmNlLlxuICpcbiAqIEBtb2R1bGVcbiAqL1xuXG5pbXBvcnQge1xuICBDYWNoZU1hbmFnZXIsXG4gIENvbmZpZ3VyYXRpb25FcnJvcixcbiAgRXhlY3V0aW9uRXJyb3IsXG4gIGdlbmllLFxuICBWYWxpZGF0aW9uRXJyb3IsXG59IGZyb20gXCJAZGF0YWJyaWNrcy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50IH0gZnJvbSBcIkBkYXRhYnJpY2tzL2FwcGtpdFwiO1xuaW1wb3J0IHsgcGx1Z2luIH0gZnJvbSBcIkBkYngtdG9vbHMvYXBwa2l0XCI7XG5pbXBvcnQgeyBjaGF0LCBzcGFjZSBhcyBnZW5pZVNwYWNlIH0gZnJvbSBcIkBkYngtdG9vbHMvZ2VuaWVcIjtcbmltcG9ydCB7IGVycm9yLCBsb2csIHN0cmluZyB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1jb3JlXCI7XG5pbXBvcnQgeyBnZW5pZU1vZGVsLCB0eXBlIEdlbmllTWVzc2FnZSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1nZW5pZVwiO1xuaW1wb3J0IHR5cGUgeyBNYXN0cmFXcml0ZXIsIFN0YXJ0ZWRFdmVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1tYXN0cmFcIjtcbmltcG9ydCB0eXBlIHsgUmVxdWVzdENvbnRleHQgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgTUFTVFJBX1RIUkVBRF9JRF9LRVkgfSBmcm9tIFwiQG1hc3RyYS9jb3JlL3JlcXVlc3QtY29udGV4dFwiO1xuaW1wb3J0IHsgY3JlYXRlVG9vbCB9IGZyb20gXCJAbWFzdHJhL2NvcmUvdG9vbHNcIjtcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCI7XG5cbmltcG9ydCB0eXBlIHsgTWFzdHJhVG9vbHMgfSBmcm9tIFwiLi9hZ2VudHMudHNcIjtcbmltcG9ydCB7IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWEsIGNoYXJ0VG9vbE91dHB1dFNjaGVtYSwgcHJlcGFyZUNoYXJ0IH0gZnJvbSBcIi4vY2hhcnQudHNcIjtcbmltcG9ydCB7IE1BU1RSQV9VU0VSX0tFWSwgcmVzb2x2ZVVzZXJLZXkgfSBmcm9tIFwiLi9jb25maWcudHNcIjtcbmltcG9ydCB0eXBlIHsgTWFzdHJhUGx1Z2luQ29uZmlnLCBVc2VyIH0gZnJvbSBcIi4vY29uZmlnLnRzXCI7XG5pbXBvcnQgeyBmZXRjaFN0YXRlbWVudERhdGEgfSBmcm9tIFwiLi9zdGF0ZW1lbnQudHNcIjtcbmltcG9ydCB7IHNhZmVXcml0ZSB9IGZyb20gXCIuL3dyaXRlci50c1wiO1xuXG5jb25zdCBsb2dnZXIgPSBsb2cubG9nZ2VyKFwibWFzdHJhL2dlbmllXCIpO1xuXG4vKiogRGVmYXVsdCBhbGlhcyB1c2VkIHdoZW4gYSBzaW5nbGUgdW5uYW1lZCBHZW5pZSBzcGFjZSBpcyB3aXJlZCB1cC4gKi9cbmV4cG9ydCBjb25zdCBERUZBVUxUX0dFTklFX0FMSUFTID0gXCJkZWZhdWx0XCI7XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb25maWcgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKiBQZXItc3BhY2UgR2VuaWUgYWdlbnQgY29uZmlndXJhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2VuaWVTcGFjZUNvbmZpZyB7XG4gIC8qKiBHZW5pZSBgc3BhY2VfaWRgLiBSZXF1aXJlZDsgcmVzb2x2ZXMgdmlhIGBjbGllbnQuZ2VuaWUuZ2V0U3BhY2VgLiAqL1xuICBzcGFjZUlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBhcHBlbmRlZCB0byB0aGUgcGVyLXNwYWNlXG4gICAqIHRvb2wgZGVzY3JpcHRpb25zIHNvIHRoZSBjYWxsaW5nIExMTSBoYXMgaGludHMgYWJvdXQgKndoYXRcbiAgICogZGF0YSogdGhpcyBzcGFjZSBjb3ZlcnMgKGUuZy4gXCJvcmRlcnMsIHJldHVybnMsXG4gICAqIGZ1bGZpbGxtZW50XCIpLiBXaGVuIG9taXR0ZWQsIG9ubHkgdGhlIHNwYWNlJ3Mgb3duXG4gICAqIGBkZXNjcmlwdGlvbmAgKGZldGNoZWQgb24gZmlyc3QgdXNlIG9mIGBnZXRfc3BhY2VfZGVzY3JpcHRpb25gKVxuICAgKiBpcyBzaG93bi5cbiAgICovXG4gIGhpbnQ/OiBzdHJpbmc7XG59XG5cbi8qKiBNYXAgb2YgYWxpYXMgLT4gc3BhY2UgY29uZmlnLiBBY2NlcHRzIGVpdGhlciBleHBsaWNpdCBvYmplY3RzIG9yIGJhcmUgc3BhY2UgaWRzLiAqL1xuZXhwb3J0IHR5cGUgR2VuaWVTcGFjZXNDb25maWcgPSBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnIHwgc3RyaW5nPjtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjdHggaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogTmFycm93IHZpZXcgb2YgdGhlIHNlY29uZCBhcmcgTWFzdHJhIHBhc3NlcyB0byBhIHRvb2wnc1xuICogYGV4ZWN1dGUoaW5wdXQsIGN0eClgLiBDYXB0dXJlcyB0aGUgZmllbGRzIHRoZSBHZW5pZSB0b29sc1xuICogYWN0dWFsbHkgcmVhZCAtIGByZXF1ZXN0Q29udGV4dGAgKGZvciB1c2VyIC8gY29udmVyc2F0aW9uXG4gKiBzdGF0ZSksIGB3cml0ZXJgIChmb3Igc3RyZWFtaW5nIGV2ZW50cyB0byB0aGUgaG9zdCBVSSksIGFuZFxuICogYGFib3J0U2lnbmFsYCAoZm9yIHBlci1jYWxsIGNhbmNlbGxhdGlvbikuXG4gKi9cbnR5cGUgVG9vbEV4ZWN1dGVDdHggPVxuICB8IHtcbiAgICAgIHJlcXVlc3RDb250ZXh0PzogUmVxdWVzdENvbnRleHQ7XG4gICAgICB3cml0ZXI/OiBNYXN0cmFXcml0ZXI7XG4gICAgICBhYm9ydFNpZ25hbD86IEFib3J0U2lnbmFsO1xuICAgIH1cbiAgfCB1bmRlZmluZWQ7XG5cbi8qKlxuICogUHVsbCB0aGUgcGVyLXJlcXVlc3Qge0BsaW5rIFdvcmtzcGFjZUNsaWVudH0gb2ZmIHRoZSBhY3RpdmVcbiAqIGBSZXF1ZXN0Q29udGV4dGAuIFRoZSBNYXN0cmEgcGx1Z2luJ3Mgc2VydmVyIG1pZGRsZXdhcmUgc3RhbXBzXG4gKiBhIHtAbGluayBVc2VyfSBvbiB0aGUgY29udGV4dCB1bmRlciB7QGxpbmsgTUFTVFJBX1VTRVJfS0VZfVxuICogZm9yIGV2ZXJ5IHJlcXVlc3Q7IHRvb2xzIGZhaWwgbG91ZGx5IHdoZW4gaXQncyBtaXNzaW5nIGJlY2F1c2VcbiAqIHRoYXQgbWVhbnMgdGhlIE1hc3RyYSBwbHVnaW4gaXNuJ3QgcnVubmluZyAoZS5nLiBhIHRvb2wgd2FzXG4gKiBpbnZva2VkIG91dHNpZGUgdGhlIGNoYXQgcm91dGUpLlxuICovXG5mdW5jdGlvbiByZXF1aXJlQ2xpZW50KFxuICBjdHg6IFRvb2xFeGVjdXRlQ3R4LFxuICB0b29sSWQ6IHN0cmluZyxcbik6IHtcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQ7XG4gIHJlcXVlc3RDb250ZXh0OiBSZXF1ZXN0Q29udGV4dDtcbn0ge1xuICBjb25zdCByZXF1ZXN0Q29udGV4dCA9IGN0eD8ucmVxdWVzdENvbnRleHQ7XG4gIGlmICghcmVxdWVzdENvbnRleHQpIHtcbiAgICB0aHJvdyBDb25maWd1cmF0aW9uRXJyb3IucmVzb3VyY2VOb3RGb3VuZChcbiAgICAgIGAke3Rvb2xJZH0gcmVxdWVzdCBjb250ZXh0YCxcbiAgICAgIFwiSW52b2tlIHRoZSB0b29sIGZyb20gYW4gYWdlbnQgdHVybiBzZXJ2ZWQgYnkgdGhlIG1hc3RyYSBwbHVnaW4uXCIsXG4gICAgKTtcbiAgfVxuICBjb25zdCB1c2VyID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9VU0VSX0tFWSkgYXMgVXNlciB8IHVuZGVmaW5lZDtcbiAgaWYgKCF1c2VyKSB7XG4gICAgdGhyb3cgQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoXG4gICAgICBgJHt0b29sSWR9IHVzZXIgY29udGV4dGAsXG4gICAgICBcIkludm9rZSB0aGUgdG9vbCBmcm9tIGFuIGFnZW50IHR1cm4gc2VydmVkIGJ5IHRoZSBtYXN0cmEgcGx1Z2luLCB3aGljaCBzdGFtcHMgdGhlIEFwcEtpdCB1c2VyIG9uIHRoZSBNYXN0cmEgcmVxdWVzdCBjb250ZXh0LlwiLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHsgY2xpZW50OiB1c2VyLmV4ZWN1dGlvbkNvbnRleHQuY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9O1xufVxuXG4vKipcbiAqIExvd2VyY2FzZWQgcGxhY2Vob2xkZXIgc3RyaW5ncyB3ZSByZWplY3QgYXQgdGhlIGBhc2tfZ2VuaWVgXG4gKiBib3VuZGFyeSBzbyB0aGUgTExNIGRvZXNuJ3Qgc3BlbmQgYSBHZW5pZSByb3VuZC10cmlwIG9uIGFcbiAqIG5vbi1xdWVzdGlvbi4gR2VuaWUgcG9saXRlbHkgYW5zd2VycyBhbnkgb2YgdGhlc2Ugd2l0aCBcIllvdXJcbiAqIHJlcXVlc3QgJy4uLicgZG9lcyBub3QgcmVsYXRlIHRvLi4uXCIgd2hpY2ggaXMgcHVyZSBVSSBub2lzZS5cbiAqIEtlcHQgbmFycm93IG9uIHB1cnBvc2UgLSByZWFsIHF1ZXN0aW9ucyBzb21ldGltZXMgc3RhcnQgd2l0aFxuICogb25lIG9mIHRoZXNlIHRva2Vucywgc28gd2Ugb25seSBtYXRjaCB0aGUgRlVMTCB0cmltbWVkIHN0cmluZy5cbiAqL1xuY29uc3QgUExBQ0VIT0xERVJfUVVFU1RJT05TID0gbmV3IFNldChbXG4gIFwibm9vcFwiLFxuICBcIm5vLW9wXCIsXG4gIFwic2tpcFwiLFxuICBcIm5vbmVcIixcbiAgXCJuL2FcIixcbiAgXCJuYVwiLFxuICBcIm51bGxcIixcbiAgXCJ1bmRlZmluZWRcIixcbiAgXCJ0ZXN0XCIsXG4gIFwicGxhY2Vob2xkZXJcIixcbl0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb252ZXJzYXRpb24gc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBFc3RpbWF0ZWQgR2VuaWUgY29udmVyc2F0aW9uIGxpZmV0aW1lIGluIHNlY29uZHMuIERhdGFicmlja3NcbiAqIHB1Ymxpc2hlcyBubyBvZmZpY2lhbCBUVEwgb24gdGhlIGNvbnZlcnNhdGlvbiByZXNvdXJjZSBpdHNlbGY7XG4gKiBjb21tdW5pdHkgcHJvamVjdHMgKGUuZy4gdGhlIG9wZW4tc291cmNlIERhdGFicmlja3MgR2VuaWUgQm90KVxuICogY29udmVyZ2Ugb24gNCBob3VycyBvZiBpbmFjdGl2aXR5IGFzIGEgc2FmZSBvcGVyYXRpbmcgd2luZG93LlxuICogVHJlYXQgdGhpcyBhcyBhbiBlc3RpbWF0ZSB0aGF0IGdldHMgKmV4dGVuZGVkIG9uIGV2ZXJ5IHVzZSogYnlcbiAqIHJlLXNldHRpbmcgdGhlIGNhY2hlIGVudHJ5IGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCB0dXJuIChzbGlkaW5nXG4gKiBUVEwgdmlhIHJlLWBzZXRgKS4gV2hlbiB0aGUgZXN0aW1hdGUgZW5kcyB1cCB3cm9uZyAoY29udmVyc2F0aW9uXG4gKiBkZWxldGVkLCBleHBpcmVkIHVwc3RyZWFtLCBjcm9zcy1zcGFjZSByZWZlcmVuY2VkKSwgYGFza19nZW5pZWBcbiAqIGNhdGNoZXMgdGhlIFNESydzIGBSRVNPVVJDRV9ET0VTX05PVF9FWElTVGAvNDA0IGFuZCB0cmFuc3BhcmVudGx5XG4gKiBzdGFydHMgYSBmcmVzaCBjb252ZXJzYXRpb24uXG4gKi9cbmNvbnN0IENPTlZFUlNBVElPTl9UVExfU0VDID0gNCAqIDYwICogNjA7XG5cbi8qKiBDYWNoZSBuYW1lc3BhY2UgcHJlZml4IHNvIGNvZXhpc3RpbmcgTWFzdHJhIGNhY2hlcyBkb24ndCBjb2xsaWRlLiAqL1xuY29uc3QgQ09OVkVSU0FUSU9OX0NBQ0hFX05BTUVTUEFDRSA9IFwibWFzdHJhOmdlbmllOmNvbnZlcnNhdGlvblwiO1xuXG4vKipcbiAqIFBlci1yZXF1ZXN0IHN0YXRlIGZvciBvbmUgR2VuaWUgc3BhY2UuIFRoZSByZXVzYWJsZSBjb252ZXJzYXRpb24gaXMgcmVzZXJ2ZWRcbiAqIGJ5IGF0IG1vc3Qgb25lIGludm9jYXRpb24gYXQgYSB0aW1lLiBBZGRpdGlvbmFsIGNvbmN1cnJlbnQgaW52b2NhdGlvbnMgdXNlXG4gKiBpc29sYXRlZCBjb252ZXJzYXRpb25zIHNvIE1hc3RyYSBjYW4gZXhlY3V0ZSBwYXJhbGxlbCB0b29sIGNhbGxzIHdpdGhvdXRcbiAqIGFwcGVuZGluZyBtdWx0aXBsZSBhY3RpdmUgbWVzc2FnZXMgdG8gdGhlIHNhbWUgR2VuaWUgY29udmVyc2F0aW9uLlxuICovXG5pbnRlcmZhY2UgQ29udmVyc2F0aW9uU3RhdGUge1xuICBjb252ZXJzYXRpb25JZD86IHN0cmluZztcbiAgcmV1c2FibGVDb252ZXJzYXRpb25JbkZsaWdodDogYm9vbGVhbjtcbn1cblxuLyoqIEJ1aWxkIHRoZSBwZXItcmVxdWVzdCB7QGxpbmsgUmVxdWVzdENvbnRleHR9IGtleSBmb3Igb25lIEdlbmllIHNwYWNlLiAqL1xuY29uc3QgY29udmVyc2F0aW9uQ29udGV4dEtleSA9IChzcGFjZUlkOiBzdHJpbmcpOiBzdHJpbmcgPT5cbiAgYG1hc3RyYV9fZ2VuaWVfY29udmVyc2F0aW9uX18ke3NwYWNlSWR9YDtcblxuLyoqXG4gKiBSZWFkIG9yIGluaXRpYWxpemUgdGhlIHBlci1zcGFjZSBjb252ZXJzYXRpb24gc3RhdGUuIFRoZSBzdHJpbmcgYnJhbmNoXG4gKiBwcmVzZXJ2ZXMgY29tcGF0aWJpbGl0eSB3aXRoIGEgY29udGV4dCBwb3B1bGF0ZWQgYnkgYW4gb2xkZXIgcGFja2FnZSBjb3B5LlxuICovXG5mdW5jdGlvbiBjb252ZXJzYXRpb25TdGF0ZShyZXF1ZXN0Q29udGV4dDogUmVxdWVzdENvbnRleHQsIHNwYWNlSWQ6IHN0cmluZyk6IENvbnZlcnNhdGlvblN0YXRlIHtcbiAgY29uc3Qga2V5ID0gY29udmVyc2F0aW9uQ29udGV4dEtleShzcGFjZUlkKTtcbiAgY29uc3QgY3VycmVudCA9IHJlcXVlc3RDb250ZXh0LmdldChrZXkpIGFzIENvbnZlcnNhdGlvblN0YXRlIHwgc3RyaW5nIHwgdW5kZWZpbmVkO1xuICBpZiAoY3VycmVudCAmJiB0eXBlb2YgY3VycmVudCA9PT0gXCJvYmplY3RcIikgcmV0dXJuIGN1cnJlbnQ7XG4gIGNvbnN0IHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZSA9IHtcbiAgICAuLi4odHlwZW9mIGN1cnJlbnQgPT09IFwic3RyaW5nXCIgPyB7IGNvbnZlcnNhdGlvbklkOiBjdXJyZW50IH0gOiB7fSksXG4gICAgcmV1c2FibGVDb252ZXJzYXRpb25JbkZsaWdodDogZmFsc2UsXG4gIH07XG4gIHJlcXVlc3RDb250ZXh0LnNldChrZXksIHN0YXRlKTtcbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFJlc2VydmUgdGhlIHJldXNhYmxlIGNvbnZlcnNhdGlvbiB3aGVuIGl0IGlzIGlkbGUuIEEgY2FsbGVyIHRoYXQgY2Fubm90XG4gKiByZXNlcnZlIGl0IGdldHMgYW4gaXNvbGF0ZWQgY29udmVyc2F0aW9uIGFuZCBtYXkgcnVuIGluIHBhcmFsbGVsLlxuICovXG5mdW5jdGlvbiByZXNlcnZlQ29udmVyc2F0aW9uKHN0YXRlOiBDb252ZXJzYXRpb25TdGF0ZSk6IGJvb2xlYW4ge1xuICBpZiAoc3RhdGUucmV1c2FibGVDb252ZXJzYXRpb25JbkZsaWdodCkgcmV0dXJuIGZhbHNlO1xuICBzdGF0ZS5yZXVzYWJsZUNvbnZlcnNhdGlvbkluRmxpZ2h0ID0gdHJ1ZTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGNhbm9uaWNhbCBjYWNoZSBrZXkgZm9yIGEgYChzcGFjZUlkLCB0aHJlYWRJZClgIHBhaXIsIG93bmVkIGJ5XG4gKiBgdXNlcktleWAuIFJldHVybnMgYHVuZGVmaW5lZGAgd2hlbiBgdGhyZWFkSWRgIGlzIG1pc3NpbmcgLSBjYWxsZXJzIHNob3VsZFxuICogc2tpcCBjYWNoaW5nIGVudGlyZWx5IGluIHRoYXQgY2FzZSAobm8gTWFzdHJhIG1lbW9yeSB3aXJlZCB1cCkuXG4gKlxuICogVGhlIGlkZW50aXR5IGlzIHBhcnQgb2YgdGhlIGtleSBiZWNhdXNlIGEgY2xpZW50IHBpY2tzIGl0cyBvd24gYHRocmVhZElkYFxuICogKHRoZSB0aHJlYWQtc2VsZWN0aW9uIGhlYWRlciAvIGA/dGhyZWFkSWQ9YCksIHNvIHRoZSBpZCBhbG9uZSBkb2VzIG5vdFxuICogZXN0YWJsaXNoIHdobyBvd25zIHRoZSBHZW5pZSBjb252ZXJzYXRpb24gYmVoaW5kIGl0LlxuICovXG5hc3luYyBmdW5jdGlvbiBjb252ZXJzYXRpb25DYWNoZUtleShcbiAgc3BhY2VJZDogc3RyaW5nLFxuICB0aHJlYWRJZDogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB1c2VyS2V5OiBzdHJpbmcsXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBpZiAoIXRocmVhZElkKSByZXR1cm4gdW5kZWZpbmVkO1xuICByZXR1cm4gKGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZSgpKS5nZW5lcmF0ZUtleShcbiAgICBbQ09OVkVSU0FUSU9OX0NBQ0hFX05BTUVTUEFDRSwgc3BhY2VJZCwgdGhyZWFkSWRdLFxuICAgIHVzZXJLZXksXG4gICk7XG59XG5cbi8qKlxuICogUmVhZCB0aGUgY2FjaGVkIEdlbmllIGNvbnZlcnNhdGlvbiBpZCBmb3IgYChzcGFjZUlkLCB0aHJlYWRJZClgLlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBvbiBtaXNzLCBvbiBleHBpcnksIG9yIHdoZW4gdGhlIGNhY2hlIGxheWVyXG4gKiBpcyB1bmhlYWx0aHkgLSBuZXZlciB0aHJvd3MuIFRoZSBUVEwgaXMgcmVuZXdlZCB2aWEgcmUtYHNldGBcbiAqIGFmdGVyIGVhY2ggc3VjY2Vzc2Z1bCB0dXJuIChzZWUge0BsaW5rIHNhdmVDYWNoZWRDb252ZXJzYXRpb25JZH0pLlxuICovXG5hc3luYyBmdW5jdGlvbiByZWFkQ2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXk6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGlmICghY2FjaGVLZXkpIHJldHVybiB1bmRlZmluZWQ7XG4gIHRyeSB7XG4gICAgY29uc3QgdiA9IGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5nZXQ8c3RyaW5nPihjYWNoZUtleSk7XG4gICAgcmV0dXJuIHYgPz8gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpyZWFkLWVycm9yXCIsIHtcbiAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICB9KTtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG59XG5cbi8qKlxuICogUGVyc2lzdCB0aGUgYWN0aXZlIGNvbnZlcnNhdGlvbiBpZCB1bmRlciBgY2FjaGVLZXlgLCByZWZyZXNoaW5nXG4gKiBpdHMgVFRMLiBJZGVtcG90ZW50OyBuby1vcCB3aGVuIGBjYWNoZUtleWAgb3IgYGNvbnZlcnNhdGlvbklkYFxuICogaXMgbWlzc2luZy4gUmUtc2V0dGluZyB0aGUgc2FtZSBrZXkgYWN0cyBhcyBhIHNsaWRpbmcgVFRMOiBldmVyeVxuICogdHVybiB0aGF0IHVzZXMgdGhlIGNvbnZlcnNhdGlvbiBleHRlbmRzIHRoZSB3aW5kb3cgYnkgYW5vdGhlclxuICoge0BsaW5rIENPTlZFUlNBVElPTl9UVExfU0VDfSBzZWNvbmRzLlxuICovXG5hc3luYyBmdW5jdGlvbiBzYXZlQ2FjaGVkQ29udmVyc2F0aW9uSWQoXG4gIGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIGNvbnZlcnNhdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjYWNoZUtleSB8fCAhY29udmVyc2F0aW9uSWQpIHJldHVybjtcbiAgdHJ5IHtcbiAgICBhd2FpdCBDYWNoZU1hbmFnZXIuZ2V0SW5zdGFuY2VTeW5jKCkuc2V0KGNhY2hlS2V5LCBjb252ZXJzYXRpb25JZCwge1xuICAgICAgdHRsOiBDT05WRVJTQVRJT05fVFRMX1NFQyxcbiAgICB9KTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgbG9nZ2VyLndhcm4oXCJjb252ZXJzYXRpb24tY2FjaGU6d3JpdGUtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKiBGb3JjZS1ldmljdCBhIGNhY2hlZCBjb252ZXJzYXRpb24gaWQuIFVzZWQgb24gdGhlIHN0YWxlLWlkIHJlY292ZXJ5IHBhdGguICovXG5hc3luYyBmdW5jdGlvbiBldmljdENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKCFjYWNoZUtleSkgcmV0dXJuO1xuICB0cnkge1xuICAgIGF3YWl0IENhY2hlTWFuYWdlci5nZXRJbnN0YW5jZVN5bmMoKS5kZWxldGUoY2FjaGVLZXkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpkZWxldGUtZXJyb3JcIiwge1xuICAgICAgZXJyb3I6IGVycm9yLmVycm9yTWVzc2FnZShlcnIpLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogTGF6eS1zZWVkIHRoZSBhY3RpdmUgR2VuaWUgYGNvbnZlcnNhdGlvbl9pZGAgZm9yIGBzcGFjZUlkYCBmcm9tXG4gKiB0aGUgY3Jvc3MtcmVxdWVzdCBjYWNoZSBvbnRvIHRoZSBwZXItcmVxdWVzdCBgUmVxdWVzdENvbnRleHRgLlxuICogTm8tb3Agd2hlbiB0aGUgc2xvdCBpcyBhbHJlYWR5IHBvcHVsYXRlZCAoc3Vic2VxdWVudFxuICogYGFza19nZW5pZWAgY2FsbHMgaW4gdGhlIHNhbWUgdHVybikgc28gd2UgaGl0IHRoZSBjYWNoZSBhdCBtb3N0XG4gKiBvbmNlIHBlciByZXF1ZXN0IHBlciBzcGFjZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlQ29udmVyc2F0aW9uU2VlZGVkKFxuICBzdGF0ZTogQ29udmVyc2F0aW9uU3RhdGUsXG4gIGNhY2hlS2V5OiBzdHJpbmcgfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgaWYgKHN0YXRlLmNvbnZlcnNhdGlvbklkKSByZXR1cm47XG4gIGNvbnN0IGNhY2hlZCA9IGF3YWl0IHJlYWRDYWNoZWRDb252ZXJzYXRpb25JZChjYWNoZUtleSk7XG4gIGlmIChjYWNoZWQpIHN0YXRlLmNvbnZlcnNhdGlvbklkID0gY2FjaGVkO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJlcGFyZV9jaGFydCBpbnB1dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBBZ2VudC1mYWNpbmcgYHByZXBhcmVfY2hhcnRgIGlucHV0IHNjaGVtYS4gUmV1c2VzXG4gKiB7QGxpbmsgY2hhcnRQbGFubmVyUmVxdWVzdFNjaGVtYX0gKHRoZSBkYXRhc2V0LWRyaXZlbiBwbGFubmVyXG4gKiBjb250cmFjdCkgYnV0IHN3YXBzIHRoZSBpbmxpbmUgYGRhdGFgIGZpZWxkIGZvciBhIEdlbmllXG4gKiBgc3RhdGVtZW50X2lkYCB0aGUgdG9vbCByZXNvbHZlcyBpbnRvIHJvd3Mgc2VydmVyLXNpZGUuXG4gKiBgdGl0bGVgIGlzIGxvb3NlbmVkIHRvIG9wdGlvbmFsIC0gdGhlIHBsYW5uZXIgZmFsbHMgYmFjayB0byBhXG4gKiBnZW5lcmljIHBsYWNlaG9sZGVyIHdoZW4gdGhlIGFnZW50IGRvZXNuJ3Qgc3VwcGx5IG9uZS5cbiAqXG4gKiBTaGFwZWQgdG8gbWF0Y2ggR2VuaWUncyB3aXJlIGZvcm0gLSBgc3RhdGVtZW50X2lkYCAoc25ha2UpXG4gKiBtaXJyb3JzIGBxdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkYCBhbmQgdGhlIGBnZXRfc3RhdGVtZW50YFxuICogdG9vbCdzIGlucHV0IGZpZWxkIG5hbWUsIHNvIHRoZSBMTE0gb25seSBldmVyIHNlZXMgb25lXG4gKiBzcGVsbGluZyBmb3IgdGhlIHNhbWUgaWRlbnRpZmllci5cbiAqL1xuY29uc3QgcHJlcGFyZUNoYXJ0UmVxdWVzdFNjaGVtYSA9IGNoYXJ0UGxhbm5lclJlcXVlc3RTY2hlbWFcbiAgLm9taXQoeyBkYXRhOiB0cnVlLCB0aXRsZTogdHJ1ZSB9KVxuICAuZXh0ZW5kKHtcbiAgICBzdGF0ZW1lbnRfaWQ6IHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLm1pbigxLCBcInN0YXRlbWVudF9pZCBpcyByZXF1aXJlZFwiKVxuICAgICAgLmRlc2NyaWJlKFxuICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgR2VuaWUgXFxgc3RhdGVtZW50X2lkXFxgIHRvIGNoYXJ0LiBSZWFkIGZyb21cbiAgICAgICAgICBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgICAgICBcXGBtZXNzYWdlLmF0dGFjaG1lbnRzWypdLnF1ZXJ5LnN0YXRlbWVudF9pZFxcYCByZXR1cm5lZCBieVxuICAgICAgICAgIFxcYGFza19nZW5pZVxcYC5cbiAgICAgICAgYCksXG4gICAgICApLFxuICAgIHRpdGxlOiBjaGFydFBsYW5uZXJSZXF1ZXN0U2NoZW1hLnNoYXBlLnRpdGxlLm9wdGlvbmFsKCksXG4gIH0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB0b29sIGlkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFN1ZmZpeCBhcHBlbmRlZCB0byBwZXItc3BhY2UgdG9vbCBpZHMgd2hlbiB0aGUgYWxpYXMgaXNuJ3QgdGhlXG4gKiB3ZWxsLWtub3duIGBkZWZhdWx0YC4gU2luZ2xlLXNwYWNlIGRlcGxveW1lbnRzIGdldCB0aGUgYmFyZVxuICogbmFtZXMgKGBhc2tfZ2VuaWVgLCBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uYCwgLi4uKTsgbXVsdGktc3BhY2VcbiAqIGRlcGxveW1lbnRzIGdldCBgYXNrX2dlbmllXzxhbGlhcz5gIGV0Yy4gc28gZWFjaCBzcGFjZSdzIHRvb2xzXG4gKiBzdGF5IGRpc2FtYmlndWF0ZWQgaW4gdGhlIGNlbnRyYWwgYWdlbnQncyB0b29sIHJlZ2lzdHJ5LlxuICovXG5mdW5jdGlvbiBhbGlhc1N1ZmZpeChhbGlhczogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGFsaWFzID09PSBERUZBVUxUX0dFTklFX0FMSUFTKSByZXR1cm4gXCJcIjtcbiAgY29uc3Qgc2x1ZyA9IHN0cmluZy50b0lkZW50aWZpZXIoYWxpYXMpO1xuICByZXR1cm4gc2x1ZyA/IGBfJHtzbHVnfWAgOiBcIlwiO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGVyLXNwYWNlIHRvb2xzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIERyb3AgYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGF0dGFjaG1lbnRzIGZyb20gYSB7QGxpbmsgR2VuaWVNZXNzYWdlfVxuICogYmVmb3JlIGhhbmRpbmcgaXQgdG8gdGhlIGNlbnRyYWwgTExNLiBUaG9zZSBlbnRyaWVzIGFscmVhZHlcbiAqIHN1cmZhY2UgaW4gdGhlIFVJIGFzIG9uZS10YXAgcGlsbHMgdmlhIHRoZSB3cml0ZXInc1xuICogYHN1Z2dlc3RlZF9xdWVzdGlvbnNgIGV2ZW50cyAoc2VlIGBjb2xsZWN0U3VnZ2VzdGlvbnNgIG9uIHRoZVxuICogY2xpZW50KTsgaWYgd2UgbGV0IHRoZW0gcmlkZSBiYWNrIGluIHRoZSB0b29sIHJlc3VsdCB0aGUgTExNXG4gKiB0ZW5kcyB0byBxdW90ZSB0aGVtIGlubGluZSBpbiBpdHMgcHJvc2UsIGRvdWJsZS1zaG93aW5nIHRoZVxuICogc2FtZSBxdWVzdGlvbnMgYW5kIHN0ZXBwaW5nIG9uIHRoZSBkZWRpY2F0ZWQgc3VnZ2VzdGlvbiBVSS5cbiAqIFF1ZXJ5IC8gdGV4dCAvIHJvdyBhdHRhY2htZW50cyBhcmUgcHJlc2VydmVkIHNvIHRoZSBtb2RlbCBjYW5cbiAqIHN0aWxsIHJlYWQgYHN0YXRlbWVudF9pZGAsIFNRTCwgYW5kIHRoZSBhbnN3ZXIgdGV4dC5cbiAqL1xuZnVuY3Rpb24gc3RyaXBTdWdnZXN0ZWRRdWVzdGlvbnMobWVzc2FnZTogR2VuaWVNZXNzYWdlKTogR2VuaWVNZXNzYWdlIHtcbiAgY29uc3QgYXR0YWNobWVudHMgPSBtZXNzYWdlLmF0dGFjaG1lbnRzO1xuICBpZiAoIWF0dGFjaG1lbnRzIHx8IGF0dGFjaG1lbnRzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG1lc3NhZ2U7XG4gIGNvbnN0IGZpbHRlcmVkID0gYXR0YWNobWVudHMuZmlsdGVyKChhdHQpID0+ICFhdHQuc3VnZ2VzdGVkX3F1ZXN0aW9ucyk7XG4gIGlmIChmaWx0ZXJlZC5sZW5ndGggPT09IGF0dGFjaG1lbnRzLmxlbmd0aCkgcmV0dXJuIG1lc3NhZ2U7XG4gIHJldHVybiB7IC4uLm1lc3NhZ2UsIGF0dGFjaG1lbnRzOiBmaWx0ZXJlZCB9O1xufVxuXG5mdW5jdGlvbiBidWlsZEFza0dlbmllVG9vbChvcHRzOiB7XG4gIHNwYWNlSWQ6IHN0cmluZztcbiAgYWxpYXM6IHN0cmluZztcbiAgaGludD86IHN0cmluZztcbiAgYWdlbnRNb2RlPzogYm9vbGVhbjtcbn0pIHtcbiAgY29uc3QgeyBzcGFjZUlkLCBhbGlhcywgaGludCwgYWdlbnRNb2RlIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBgYXNrX2dlbmllJHthbGlhc1N1ZmZpeChhbGlhcyl9YDtcbiAgY29uc3QgaGludExpbmUgPSBoaW50ID8gYCAoJHtoaW50fSlgIDogXCJcIjtcbiAgcmV0dXJuIGNyZWF0ZVRvb2woe1xuICAgIGlkOiB0b29sSWQsXG4gICAgZGVzY3JpcHRpb246IHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgIEFzayB0aGUgR2VuaWUgc3BhY2UgXCIke2FsaWFzfVwiJHtoaW50TGluZX0gT05FIGZvY3VzZWRcbiAgICAgIG5hdHVyYWwtbGFuZ3VhZ2Ugc3ViLXF1ZXN0aW9uIGFuZCB3YWl0IGZvciB0aGUgdHVybiB0b1xuICAgICAgY29tcGxldGUuIEdlbmllIGFuc3dlcnMgYmVzdCB3aGVuIGVhY2ggY2FsbCBjb3ZlcnMgYVxuICAgICAgc2luZ2xlIG1ldHJpYyAvIGRpbWVuc2lvbiAvIHRpbWUgd2luZG93LCBzbyBleHBlY3QgdG9cbiAgICAgIGNhbGwgdGhpcyB0b29sIE1VTFRJUExFIFRJTUVTIHBlciB1c2VyIHR1cm4gKHR5cGljYWxseVxuICAgICAgdHdvIHRvIHNpeCkuIEluZGVwZW5kZW50IHN1Yi1xdWVzdGlvbnMgbWF5IGJlIGNhbGxlZCBpblxuICAgICAgUEFSQUxMRUw7IGNhbGxzIHRoYXQgZGVwZW5kIG9uIGFuIGVhcmxpZXIgYW5zd2VyIHNob3VsZCBzdGF5XG4gICAgICBzZXF1ZW50aWFsLiBQYXJhbGxlbCBjYWxscyB1c2UgaXNvbGF0ZWQgR2VuaWUgY29udmVyc2F0aW9ucyxcbiAgICAgIHdoaWxlIHNlcXVlbnRpYWwgY2FsbHMgcmV0YWluIHRoZSByZXVzYWJsZSBjb252ZXJzYXRpb24gY29udGV4dC5cbiAgICAgIFRoaXMgaXMgdGhlIG5vcm1hbCBwYXR0ZXJuLCBub3QgdGhlIGV4Y2VwdGlvbi5cbiAgICAgIERvIE5PVCB0cnkgdG8gY3JhbSBhIG11bHRpLXBhcnQgcXVlc3Rpb24gaW50byBhIHNpbmdsZVxuICAgICAgY2FsbDsgZGVjb21wb3NlIGZpcnN0LCB0aGVuIGFzayBlYWNoIHBpZWNlLlxuXG4gICAgICBSZXR1cm5zIHRoZSBmaW5hbCBcXGBHZW5pZU1lc3NhZ2VcXGAuIEFnZW50IE1vZGUgaW5jbHVkZXMgdGhlXG4gICAgICBzeW50aGVzaXplZCBhbnN3ZXIgYW5kIGNhbiBpbmNsdWRlIFNRTCByZXN1bHQgdmFsdWVzIGFzIGFcbiAgICAgIE1hcmtkb3duIHRleHQgYXR0YWNobWVudC4gQSBsZWdhY3kgcG9sbGluZyByZXN1bHQgaW5zdGVhZFxuICAgICAgY2FycmllcyBhIFxcYHN0YXRlbWVudF9pZFxcYCAoYXRcbiAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCBvciB0aGUgZmlyc3RcbiAgICAgIGF0dGFjaG1lbnQncyBcXGBxdWVyeS5zdGF0ZW1lbnRfaWRcXGApOyBjYWxsXG4gICAgICBcXGBnZXRfc3RhdGVtZW50XFxgIHdpdGggdGhhdCBpZCBvbmx5IHdoZW4geW91IG5lZWQgdG8gcmVhZFxuICAgICAgdGhlIHVuZGVybHlpbmcgdmFsdWVzIHRvIHJlYXNvbiBhYm91dCB0aGVtLiBJZiB5b3UganVzdCB3YW50XG4gICAgICB0byBkaXNwbGF5IGEgbGVnYWN5IHJlc3VsdCwgZW1iZWQgYVxuICAgICAgXFxgW2RhdGE6PHN0YXRlbWVudF9pZD5dXFxgIG1hcmtlciBpbiBwcm9zZS4gV2lyZSBldmVudHNcbiAgICAgIChzdGF0dXMsIHJlYXNvbmluZywgU1FMLCBxdWVyeSBvdXRwdXQsIGFuc3dlciB0ZXh0KSBzdHJlYW1cbiAgICAgIGF1dG9tYXRpY2FsbHkgd2hpbGUgdGhlIGNhbGwgaXMgaW4gZmxpZ2h0LlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBxdWVzdGlvbjogelxuICAgICAgICAuc3RyaW5nKClcbiAgICAgICAgLm1pbigxLCBcInF1ZXN0aW9uIGlzIHJlcXVpcmVkXCIpXG4gICAgICAgIC5kZXNjcmliZShcbiAgICAgICAgICBzdHJpbmcudG9EZXNjcmlwdGlvbihgXG4gICAgICAgICAgICBPTkUgZm9jdXNlZCBuYXR1cmFsLWxhbmd1YWdlIHF1ZXN0aW9uIGFib3V0IHRoZSBkYXRhIGluIHRoaXNcbiAgICAgICAgICAgIHNwYWNlLCBjb3ZlcmluZyBhIHNpbmdsZSBtZXRyaWMgLyBkaW1lbnNpb24gLyB0aW1lIHdpbmRvd1xuICAgICAgICAgICAgKGUuZy4gXCJXaGF0IHdhcyBRMyByZXZlbnVlIGJ5IHJlZ2lvbj9cIikuIERlY29tcG9zZSBhXG4gICAgICAgICAgICBtdWx0aS1wYXJ0IGFzayBpbnRvIHNlcGFyYXRlIGNhbGxzIHJhdGhlciB0aGFuIGNvbWJpbmluZyBpdFxuICAgICAgICAgICAgaGVyZS5cbiAgICAgICAgICBgKSxcbiAgICAgICAgKSxcbiAgICB9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIG1lc3NhZ2U6IGdlbmllTW9kZWwuR2VuaWVNZXNzYWdlU2NoZW1hLFxuICAgIH0pLFxuICAgIGV4ZWN1dGU6IGFzeW5jICh7IHF1ZXN0aW9uIH0sIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQsIHJlcXVlc3RDb250ZXh0IH0gPSByZXF1aXJlQ2xpZW50KGN0eCwgdG9vbElkKTtcbiAgICAgIGNvbnN0IHdyaXRlciA9IGN0eD8ud3JpdGVyO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIGNvbnN0IHRocmVhZElkID0gcmVxdWVzdENvbnRleHQuZ2V0KE1BU1RSQV9USFJFQURfSURfS0VZKSBhcyBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgICAgIC8vIEJvdW5jZSBwbGFjZWhvbGRlciAvIG5vLW9wIHF1ZXN0aW9ucyBCRUZPUkUgc3BlbmRpbmcgYSBHZW5pZVxuICAgICAgLy8gcm91bmQtdHJpcCBvbiB0aGVtLiBHZW5pZSBhbnN3ZXJzIGFueSBvZiB0aGVzZSB3aXRoIFwiWW91clxuICAgICAgLy8gcmVxdWVzdCAnbm9vcCcgZG9lcyBub3QgcmVsYXRlIHRvLi4uXCIgLSB1c2VsZXNzIG5vaXNlIHRoYXRcbiAgICAgIC8vIHNob3dzIHVwIGluIHRoZSBVSSBhbmQgZWF0cyBvbmUgb2YgdGhlIHdvcmtzcGFjZSdzIDVcbiAgICAgIC8vIHF1ZXN0aW9ucy9taW51dGUuIFJldHVybmluZyBhIGNsZWFyIGVycm9yIGhlcmUgc3VyZmFjZXMgdGhlXG4gICAgICAvLyBpc3N1ZSB0byB0aGUgYWdlbnQgbG9vcCBzbyB0aGUgbW9kZWwgY29ycmVjdHMgY291cnNlIGluc3RlYWRcbiAgICAgIC8vIG9mIHdhc3RpbmcgYSB0dXJuLlxuICAgICAgY29uc3QgdHJpbW1lZCA9IHF1ZXN0aW9uLnRyaW0oKTtcbiAgICAgIGlmICh0cmltbWVkLmxlbmd0aCA9PT0gMCB8fCBQTEFDRUhPTERFUl9RVUVTVElPTlMuaGFzKHRyaW1tZWQudG9Mb3dlckNhc2UoKSkpIHtcbiAgICAgICAgdGhyb3cgVmFsaWRhdGlvbkVycm9yLmludmFsaWRWYWx1ZShcbiAgICAgICAgICBgJHt0b29sSWR9LnF1ZXN0aW9uYCxcbiAgICAgICAgICBxdWVzdGlvbixcbiAgICAgICAgICBcImEgcmVhbCBuYXR1cmFsLWxhbmd1YWdlIHF1ZXN0aW9uLCBub3QgYSBwbGFjZWhvbGRlcjsgc2tpcCB0aGUgY2FsbCBpbnN0ZWFkXCIsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHN0YXRlID0gY29udmVyc2F0aW9uU3RhdGUocmVxdWVzdENvbnRleHQsIHNwYWNlSWQpO1xuICAgICAgY29uc3Qgb3duc1JldXNhYmxlQ29udmVyc2F0aW9uID0gcmVzZXJ2ZUNvbnZlcnNhdGlvbihzdGF0ZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBPbmx5IHRoZSByZXNlcnZlZCBsYW5lIHNlZWRzIGFuZCB1cGRhdGVzIHRoZSB0aHJlYWQncyByZXVzYWJsZVxuICAgICAgICAvLyBjb252ZXJzYXRpb24uIENvbmN1cnJlbnQgbGFuZXMgZGVsaWJlcmF0ZWx5IHN0YXJ0IGZyZXNoIGNvbnZlcnNhdGlvbnMuXG4gICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gb3duc1JldXNhYmxlQ29udmVyc2F0aW9uXG4gICAgICAgICAgPyBhd2FpdCBjb252ZXJzYXRpb25DYWNoZUtleShzcGFjZUlkLCB0aHJlYWRJZCwgcmVzb2x2ZVVzZXJLZXkocmVxdWVzdENvbnRleHQpKVxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAob3duc1JldXNhYmxlQ29udmVyc2F0aW9uKSB7XG4gICAgICAgICAgYXdhaXQgZW5zdXJlQ29udmVyc2F0aW9uU2VlZGVkKHN0YXRlLCBjYWNoZUtleSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFYWNoIGludm9jYXRpb24ga2VlcHMgaXRzIGNvbnZlcnNhdGlvbiBpZCBsb2NhbGx5LiBPbmx5IHRoZSByZXVzYWJsZVxuICAgICAgICAvLyBsYW5lIHB1Ymxpc2hlcyB1cGRhdGVzIHRvIHNoYXJlZCByZXF1ZXN0IGFuZCBjcm9zcy1yZXF1ZXN0IHN0YXRlLlxuICAgICAgICBsZXQgY29udmVyc2F0aW9uSWQgPSBvd25zUmV1c2FibGVDb252ZXJzYXRpb24gPyBzdGF0ZS5jb252ZXJzYXRpb25JZCA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCBzdGFydGVkRXZlbnQ6IFN0YXJ0ZWRFdmVudCA9IHtcbiAgICAgICAgICB0eXBlOiBcInN0YXJ0ZWRcIixcbiAgICAgICAgICBzcGFjZUlkLFxuICAgICAgICAgIGNvbnRlbnQ6IHF1ZXN0aW9uLFxuICAgICAgICB9O1xuICAgICAgICBhd2FpdCBzYWZlV3JpdGUobG9nZ2VyLCB3cml0ZXIsIHN0YXJ0ZWRFdmVudCk7XG5cbiAgICAgICAgY29uc3QgcnVuVHVybiA9IGFzeW5jICgpOiBQcm9taXNlPEdlbmllTWVzc2FnZT4gPT4ge1xuICAgICAgICAgIGNvbnN0IHNlZWRDb252ZXJzYXRpb25JZCA9IGNvbnZlcnNhdGlvbklkO1xuICAgICAgICAgIGxldCBmaW5hbE1lc3NhZ2U6IEdlbmllTWVzc2FnZSB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBmb3IgYXdhaXQgKGNvbnN0IGV2ZW50IG9mIGNoYXQuZ2VuaWVFdmVudENoYXQoc3BhY2VJZCwgcXVlc3Rpb24sIHtcbiAgICAgICAgICAgIHdvcmtzcGFjZUNsaWVudDogY2xpZW50LFxuICAgICAgICAgICAgLi4uKGFnZW50TW9kZSAhPT0gdW5kZWZpbmVkID8geyBhZ2VudE1vZGUgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihzZWVkQ29udmVyc2F0aW9uSWQgPyB7IGNvbnZlcnNhdGlvbklkOiBzZWVkQ29udmVyc2F0aW9uSWQgfSA6IHt9KSxcbiAgICAgICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSAhPT0gXCJtZXNzYWdlXCIpIHtcbiAgICAgICAgICAgICAgYXdhaXQgc2FmZVdyaXRlKGxvZ2dlciwgd3JpdGVyLCBldmVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBldmVudENvbnZlcnNhdGlvbklkID0gZXZlbnQuY29udmVyc2F0aW9uX2lkO1xuICAgICAgICAgICAgaWYgKGV2ZW50Q29udmVyc2F0aW9uSWQpIHtcbiAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQgPSBldmVudENvbnZlcnNhdGlvbklkO1xuICAgICAgICAgICAgICBpZiAob3duc1JldXNhYmxlQ29udmVyc2F0aW9uKSBzdGF0ZS5jb252ZXJzYXRpb25JZCA9IGV2ZW50Q29udmVyc2F0aW9uSWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gXCJyZXN1bHRcIikge1xuICAgICAgICAgICAgICBmaW5hbE1lc3NhZ2UgPSBldmVudC5tZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWZpbmFsTWVzc2FnZSkge1xuICAgICAgICAgICAgdGhyb3cgRXhlY3V0aW9uRXJyb3IubWlzc2luZ0RhdGEoXCJHZW5pZSByZXN1bHQgZXZlbnRcIik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmaW5hbE1lc3NhZ2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGZpbmFsTWVzc2FnZTogR2VuaWVNZXNzYWdlO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGF3YWl0IHJ1blR1cm4oKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgLy8gQSByZWplY3RlZCBjb252ZXJzYXRpb24gaWQgaXMgc3RhbGUgb3IgaW5hY2Nlc3NpYmxlLiBSZXNldCB0aGlzXG4gICAgICAgICAgLy8gbGFuZSBhbmQgcmV0cnkgb25jZSB3aXRoIGEgZnJlc2ggR2VuaWUgY29udmVyc2F0aW9uLlxuICAgICAgICAgIGNvbnN0IHJlamVjdGVkQ29udmVyc2F0aW9uSWQgPSBjb252ZXJzYXRpb25JZDtcbiAgICAgICAgICBpZiAocmVqZWN0ZWRDb252ZXJzYXRpb25JZCAmJiBlcnJvci5lcnJvckNvbnRleHQoZXJyKS5ub3RBY2Nlc3NpYmxlKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcImNvbnZlcnNhdGlvbi1jYWNoZTpzdGFsZSwgcmVzZXR0aW5nXCIsIHtcbiAgICAgICAgICAgICAgc3BhY2VJZCxcbiAgICAgICAgICAgICAgY29udmVyc2F0aW9uSWQ6IHJlamVjdGVkQ29udmVyc2F0aW9uSWQsXG4gICAgICAgICAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKG93bnNSZXVzYWJsZUNvbnZlcnNhdGlvbikge1xuICAgICAgICAgICAgICBhd2FpdCBldmljdENhY2hlZENvbnZlcnNhdGlvbklkKGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgc3RhdGUuY29udmVyc2F0aW9uSWQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb252ZXJzYXRpb25JZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGZpbmFsTWVzc2FnZSA9IGF3YWl0IHJ1blR1cm4oKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHtcbiAgICAgICAgICBhd2FpdCBzYXZlQ2FjaGVkQ29udmVyc2F0aW9uSWQoY2FjaGVLZXksIGNvbnZlcnNhdGlvbklkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IG1lc3NhZ2U6IHN0cmlwU3VnZ2VzdGVkUXVlc3Rpb25zKGZpbmFsTWVzc2FnZSkgfTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIGlmIChvd25zUmV1c2FibGVDb252ZXJzYXRpb24pIHN0YXRlLnJldXNhYmxlQ29udmVyc2F0aW9uSW5GbGlnaHQgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTcGFjZURlc2NyaXB0aW9uVG9vbChvcHRzOiB7IHNwYWNlSWQ6IHN0cmluZzsgYWxpYXM6IHN0cmluZyB9KSB7XG4gIGNvbnN0IHsgc3BhY2VJZCwgYWxpYXMgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IGBnZXRfc3BhY2VfZGVzY3JpcHRpb24ke2FsaWFzU3VmZml4KGFsaWFzKX1gO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgUmV0dXJuIHRoZSBHZW5pZSBzcGFjZSBcIiR7YWxpYXN9XCIncyB0aXRsZSwgZGVzY3JpcHRpb24sIGFuZFxuICAgICAgd2FyZWhvdXNlIGlkLiBDaGVhcCAoc2luZ2xlIFJFU1QgY2FsbCwgbm8gTExNIHJvdW5kLXRyaXApLlxuICAgICAgQ2FsbCB0aGlzIEZJUlNUIG9uIGFueSB1c2VyIHR1cm4gdGhhdCdzIGdvaW5nIHRvIHRvdWNoXG4gICAgICBcXGBhc2tfZ2VuaWVcXGAsIHVubGVzcyB0aGUgc2FtZSBkZXNjcmlwdGlvbiBhbHJlYWR5IGxhbmRlZFxuICAgICAgZWFybGllciBpbiB0aGlzIGNvbnZlcnNhdGlvbiAtIHRoZSB0aXRsZSArIGRlc2NyaXB0aW9uIHRlbGxcbiAgICAgIHlvdSB3aGF0IHRhYmxlcywgbWV0cmljcywgYW5kIHRpbWUgd2luZG93cyB0aGUgc3BhY2VcbiAgICAgIGFjdHVhbGx5IGNvdmVycywgd2hpY2ggaXMgd2hhdCBsZXRzIHlvdSBkZWNvbXBvc2UgdGhlXG4gICAgICB1c2VyJ3MgcXVlc3Rpb24gaW50byB0aGUgcmlnaHQgXFxgYXNrX2dlbmllXFxgIHN1Yi1xdWVzdGlvbnMuXG4gICAgYCksXG4gICAgaW5wdXRTY2hlbWE6IHoub2JqZWN0KHt9KSxcbiAgICBvdXRwdXRTY2hlbWE6IHoub2JqZWN0KHtcbiAgICAgIHNwYWNlSWQ6IHouc3RyaW5nKCksXG4gICAgICB0aXRsZTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgIHdhcmVob3VzZUlkOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCBzaWduYWwgPSBjdHg/LmFib3J0U2lnbmFsO1xuICAgICAgLy8gUm91dGUgdGhyb3VnaCB0aGUgcGFja2FnZSdzIGNlbnRyYWwgR2VuaWUgc3BhY2UgZmV0Y2guIFRoZVxuICAgICAgLy8gZGVzY3JpcHRpb24gc3VyZmFjZSAodGl0bGUgLyBkZXNjcmlwdGlvbiAvIHdhcmVob3VzZSBpZCkgbGl2ZXNcbiAgICAgIC8vIG9uIHRoZSBkaXJlY3RvcnktbGlzdGluZyBzaGFwZSwgc28gc2tpcCB0aGUgbGFyZ2VyXG4gICAgICAvLyBgc2VyaWFsaXplZF9zcGFjZWAgcGF5bG9hZCBoZXJlLlxuICAgICAgY29uc3Qgc3BhY2UgPSBhd2FpdCBnZW5pZVNwYWNlLmdldEdlbmllU3BhY2Uoc3BhY2VJZCwge1xuICAgICAgICB3b3Jrc3BhY2VDbGllbnQ6IGNsaWVudCxcbiAgICAgICAgc2VyaWFsaXplZDogZmFsc2UsXG4gICAgICAgIC4uLihzaWduYWwgPyB7IGNvbnRleHQ6IHNpZ25hbCB9IDoge30pLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBzcGFjZUlkLFxuICAgICAgICAuLi4oc3BhY2UudGl0bGUgPyB7IHRpdGxlOiBzcGFjZS50aXRsZSB9IDoge30pLFxuICAgICAgICAuLi4oc3BhY2UuZGVzY3JpcHRpb24gPyB7IGRlc2NyaXB0aW9uOiBzcGFjZS5kZXNjcmlwdGlvbiB9IDoge30pLFxuICAgICAgICAuLi4oc3BhY2Uud2FyZWhvdXNlX2lkID8geyB3YXJlaG91c2VJZDogc3BhY2Uud2FyZWhvdXNlX2lkIH0gOiB7fSksXG4gICAgICB9O1xuICAgIH0sXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBidWlsZFNwYWNlU2VyaWFsaXplZFRvb2wob3B0czogeyBzcGFjZUlkOiBzdHJpbmc7IGFsaWFzOiBzdHJpbmcgfSkge1xuICBjb25zdCB7IHNwYWNlSWQsIGFsaWFzIH0gPSBvcHRzO1xuICBjb25zdCB0b29sSWQgPSBgZ2V0X3NwYWNlX3NlcmlhbGl6ZWQke2FsaWFzU3VmZml4KGFsaWFzKX1gO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgUmV0dXJuIHRoZSBmdWxsIFxcYEdlbmllU3BhY2VcXGAgSlNPTiBmb3IgdGhlIFwiJHthbGlhc31cIiBzcGFjZS5cbiAgICAgIFVzZSBvbmx5IHdoZW4geW91IG5lZWQgZXhhY3QgY29sdW1uIC8gdGFibGUgaWRlbnRpZmllcnNcbiAgICAgIFxcYGdldF9zcGFjZV9kZXNjcmlwdGlvblxcYCBkb2Vzbid0IGV4cG9zZS4gTGFyZ2VyIHBheWxvYWQsIHNvXG4gICAgICBwcmVmZXIgdGhlIGRlc2NyaXB0aW9uIHRvb2wgd2hlbiBpdCdzIGVub3VnaC5cbiAgICBgKSxcbiAgICBpbnB1dFNjaGVtYTogei5vYmplY3Qoe30pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3QoeyBzcGFjZTogei51bmtub3duKCkgfSksXG4gICAgZXhlY3V0ZTogYXN5bmMgKF9pbnB1dCwgY3R4UmF3KSA9PiB7XG4gICAgICBjb25zdCBjdHggPSBjdHhSYXcgYXMgVG9vbEV4ZWN1dGVDdHg7XG4gICAgICBjb25zdCB7IGNsaWVudCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICBjb25zdCBzaWduYWwgPSBjdHg/LmFib3J0U2lnbmFsO1xuICAgICAgLy8gQ2VudHJhbCBHZW5pZSBzcGFjZSBmZXRjaCB3aXRoIHRoZSBvcHQtaW4gYHNlcmlhbGl6ZWRfc3BhY2VgXG4gICAgICAvLyBibG9iIChjYXRhbG9ncywgdGFibGVzLCBzYW1wbGUgcXVlc3Rpb25zLCBwcm9tcHRzKSB0aGF0IHRoZVxuICAgICAgLy8gdHlwZWQgU0RLIGBnZXRTcGFjZWAgb21pdHMgLSB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyB0b29sLlxuICAgICAgY29uc3Qgc3BhY2UgPSBhd2FpdCBnZW5pZVNwYWNlLmdldEdlbmllU3BhY2Uoc3BhY2VJZCwge1xuICAgICAgICB3b3Jrc3BhY2VDbGllbnQ6IGNsaWVudCxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgY29udGV4dDogc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7IHNwYWNlIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBzaGFyZWQgdG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCByb3cgY2FwIGZvciB7QGxpbmsgYnVpbGRHZXRTdGF0ZW1lbnRUb29sfSB3aGVuIHRoZSBhZ2VudFxuICogZG9lc24ndCBzdXBwbHkgYSBgbGltaXRgLiBTaXplZCB0byBrZWVwIHJlc3VsdCBzZXRzIG91dCBvZiB0aGVcbiAqIG1vZGVsIGNvbnRleHQgdW5sZXNzIHRoZSBhZ2VudCBleHBsaWNpdGx5IG9wdHMgaW50byBtb3JlIHJvd3MgLVxuICogdGhlIGNoZWFwIHNoYXBlIChjb2x1bW4gbmFtZXMgKyBhIGhhbmRmdWwgb2YgcmVwcmVzZW50YXRpdmVcbiAqIHJvd3MpIGlzIHVzdWFsbHkgZW5vdWdoIHRvIHJlYXNvbiBhYm91dCBhIHF1ZXJ5LlxuICovXG5jb25zdCBERUZBVUxUX1NUQVRFTUVOVF9MSU1JVCA9IDUwO1xuXG5mdW5jdGlvbiBidWlsZEdldFN0YXRlbWVudFRvb2woKSB7XG4gIGNvbnN0IHRvb2xJZCA9IFwiZ2V0X3N0YXRlbWVudFwiO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLnRvRGVzY3JpcHRpb24oYFxuICAgICAgRmV0Y2ggdGhlIHJvd3Mgb2YgYSBHZW5pZSBzdGF0ZW1lbnQgYnkgaXRzIFxcYHN0YXRlbWVudF9pZFxcYCAodGhlXG4gICAgICB2YWx1ZSBhdCBcXGBtZXNzYWdlLnF1ZXJ5X3Jlc3VsdC5zdGF0ZW1lbnRfaWRcXGAgb3JcbiAgICAgIFxcYG1lc3NhZ2UuYXR0YWNobWVudHNbKl0ucXVlcnkuc3RhdGVtZW50X2lkXFxgIHJldHVybmVkIGZyb21cbiAgICAgIFxcYGFza19nZW5pZVxcYCkuIFVzZSB0aGlzIE9OTFkgd2hlbiB5b3UgbmVlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nXG4gICAgICB2YWx1ZXMgdG8gcmVhc29uIGFib3V0IHRoZW0gaW4geW91ciByZXBseSAtIGUuZy4gbmFtaW5nIHRoZVxuICAgICAgbGFyZ2VzdCByb3csIGNvbXB1dGluZyBhIGRlbHRhIHRoZSB2aXN1YWxpemF0aW9uIHdvdWxkbid0IGFscmVhZHlcbiAgICAgIGNvbnZleSwgb3IgZmlsdGVyaW5nIGRvd24gdG8gYSBzcGVjaWZpYyByZWNvcmQuIElmIHlvdSdkIGp1c3QgYmVcbiAgICAgIHJlY2l0aW5nIG51bWJlcnMgdGhlIHVzZXIgd2lsbCBzZWUgYW55d2F5LCBza2lwIHRoZSBjYWxsIGFuZFxuICAgICAgZW1iZWQgYSBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgbWFya2VyIGluIHlvdXIgcHJvc2UgaW5zdGVhZDtcbiAgICAgIHRoZSBob3N0IFVJIGZldGNoZXMgYW5kIHJlbmRlcnMgdGhlIHJvd3Mgb24gaXRzIG93bi4gXFxgbGltaXRcXGBcbiAgICAgIGNhcHMgdGhlIG51bWJlciBvZiByb3dzIHJldHVybmVkIChkZWZhdWx0cyB0b1xuICAgICAgJHtERUZBVUxUX1NUQVRFTUVOVF9MSU1JVH0pLiBcXGByb3dDb3VudFxcYCByZWZsZWN0cyB0aGUgZnVsbFxuICAgICAgdXBzdHJlYW0gdG90YWwgLSBjb21wYXJlIHRvIFxcYHJvd3MubGVuZ3RoXFxgIHRvIGRldGVjdCB0cnVuY2F0aW9uLlxuICAgIGApLFxuICAgIGlucHV0U2NoZW1hOiB6Lm9iamVjdCh7XG4gICAgICBzdGF0ZW1lbnRfaWQ6IHpcbiAgICAgICAgLnN0cmluZygpXG4gICAgICAgIC5taW4oMSwgXCJzdGF0ZW1lbnRfaWQgaXMgcmVxdWlyZWRcIilcbiAgICAgICAgLmRlc2NyaWJlKFxuICAgICAgICAgIHN0cmluZy50b0Rlc2NyaXB0aW9uKGBcbiAgICAgICAgICAgIEdlbmllIFxcYHN0YXRlbWVudF9pZFxcYCB3aG9zZSByb3dzIHRvIHJlYWQuIFRha2UgaXQgZnJvbVxuICAgICAgICAgICAgXFxgbWVzc2FnZS5xdWVyeV9yZXN1bHQuc3RhdGVtZW50X2lkXFxgIG9yXG4gICAgICAgICAgICBcXGBtZXNzYWdlLmF0dGFjaG1lbnRzWypdLnF1ZXJ5LnN0YXRlbWVudF9pZFxcYCBvbiBhblxuICAgICAgICAgICAgXFxgYXNrX2dlbmllXFxgIHJlc3VsdDsgaXQgaXMgbmV2ZXIgYSB2YWx1ZSB5b3UgY29uc3RydWN0LlxuICAgICAgICAgIGApLFxuICAgICAgICApLFxuICAgICAgbGltaXQ6IHpcbiAgICAgICAgLm51bWJlcigpXG4gICAgICAgIC5pbnQoKVxuICAgICAgICAubm9ubmVnYXRpdmUoKVxuICAgICAgICAub3B0aW9uYWwoKVxuICAgICAgICAuZGVzY3JpYmUoXG4gICAgICAgICAgXCJNYXggcm93cyB0byByZXR1cm4uIERlZmF1bHRzIHRvIGEgc21hbGwgc2FtcGxlOyByYWlzZSBvbmx5IHdoZW4gbW9yZSByb3dzIGFyZSBnZW51aW5lbHkgbmVlZGVkLlwiLFxuICAgICAgICApLFxuICAgIH0pLFxuICAgIG91dHB1dFNjaGVtYTogei5vYmplY3Qoe1xuICAgICAgY29sdW1uczogei5hcnJheSh6LnN0cmluZygpKSxcbiAgICAgIHJvd3M6IHouYXJyYXkoei5yZWNvcmQoei5zdHJpbmcoKSwgei51bmtub3duKCkpKSxcbiAgICAgIHJvd0NvdW50OiB6Lm51bWJlcigpLFxuICAgICAgdHJ1bmNhdGVkOiB6LmJvb2xlYW4oKSxcbiAgICB9KSxcbiAgICBleGVjdXRlOiBhc3luYyAoeyBzdGF0ZW1lbnRfaWQsIGxpbWl0IH0sIGN0eFJhdykgPT4ge1xuICAgICAgY29uc3QgY3R4ID0gY3R4UmF3IGFzIFRvb2xFeGVjdXRlQ3R4O1xuICAgICAgY29uc3QgeyBjbGllbnQgfSA9IHJlcXVpcmVDbGllbnQoY3R4LCB0b29sSWQpO1xuICAgICAgY29uc3Qgc2lnbmFsID0gY3R4Py5hYm9ydFNpZ25hbDtcbiAgICAgIGNvbnN0IGVmZmVjdGl2ZUxpbWl0ID0gbGltaXQgPz8gREVGQVVMVF9TVEFURU1FTlRfTElNSVQ7XG4gICAgICBjb25zdCBkYXRhID0gYXdhaXQgZmV0Y2hTdGF0ZW1lbnREYXRhKGNsaWVudCwgc3RhdGVtZW50X2lkLCB7XG4gICAgICAgIGxpbWl0OiBlZmZlY3RpdmVMaW1pdCxcbiAgICAgICAgLi4uKHNpZ25hbCA/IHsgc2lnbmFsIH0gOiB7fSksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbHVtbnM6IGRhdGEuY29sdW1ucyxcbiAgICAgICAgcm93czogZGF0YS5yb3dzLFxuICAgICAgICByb3dDb3VudDogZGF0YS5yb3dDb3VudCxcbiAgICAgICAgdHJ1bmNhdGVkOiBkYXRhLnJvd3MubGVuZ3RoIDwgZGF0YS5yb3dDb3VudCxcbiAgICAgIH07XG4gICAgfSxcbiAgfSk7XG59XG5cbi8qKlxuICogYHByZXBhcmVfY2hhcnRgIE1hc3RyYSB0b29sLiBUaGluIHdyYXBwZXIgb3ZlclxuICoge0BsaW5rIHByZXBhcmVDaGFydH0gdGhhdCByZXNvbHZlcyB0aGUgZGF0YXNldCBieSBmZXRjaGluZyB0aGVcbiAqIEdlbmllIHN0YXRlbWVudCdzIHJvd3Mgb24gZGVtYW5kLiBUaGUgdG9vbCBtaW50cyBhIGBjaGFydElkYFxuICogc3luY2hyb25vdXNseSwgY2FjaGVzIGFuIGVtcHR5IHBsYWNlaG9sZGVyLCBhbmQga2lja3Mgb2ZmIHRoZVxuICogcGxhbm5lciBpbiB0aGUgYmFja2dyb3VuZCBzbyB0aGUgYWdlbnQgbG9vcCBuZXZlciBibG9ja3MuIFRoZSByZXN1bHQgY2Fycmllc1xuICogdGhlIGNvbXBsZXRlIG1hcmtlciB0byBjb3B5OyB0aGUgaG9zdCBVSSByZXNvbHZlcyBpdCBieSByZWFkaW5nIHRoZSBjYWNoZWRcbiAqIHtAbGluayBDaGFydH0gZW50cnkgKDFoIFRUTCkuXG4gKlxuICogU3BhY2UtYWdub3N0aWM6IGEgR2VuaWUgYHN0YXRlbWVudF9pZGAgaXMgd29ya3NwYWNlLXNjb3BlZCwgc29cbiAqIG9uZSBzaGFyZWQgYHByZXBhcmVfY2hhcnRgIHRvb2wgY292ZXJzIGV2ZXJ5IHdpcmVkIEdlbmllIHNwYWNlLlxuICpcbiAqIENhbmNlbGxhdGlvbjogZGVsaWJlcmF0ZWx5IGRvZXMgTk9UIGZvcndhcmQgdGhlIHBlci1jYWxsXG4gKiBgYWJvcnRTaWduYWxgIHRvIHtAbGluayBwcmVwYXJlQ2hhcnR9LiBUaGUgcGxhbm5lciB0YXNrIGlzXG4gKiBmaXJlLWFuZC1mb3JnZXQgYmFja2dyb3VuZCB3b3JrOyB0aGUgdG9vbCdzIG93biBgZXhlY3V0ZWBcbiAqIHJlc29sdmVzIHRoZSBtb21lbnQgdGhlIGBjaGFydElkYCBpcyBtaW50ZWQsIHNvIHRoZSBwZXItY2FsbFxuICogc2lnbmFsIGFib3J0cyB0aGUgc2Vjb25kIHRoZSB0b29sIHJldHVybnMuIFRoZSAxaCBjYWNoZSBUVExcbiAqIGNhcHMgYWJhbmRvbmVkIGVudHJpZXMuXG4gKi9cbmZ1bmN0aW9uIGJ1aWxkUHJlcGFyZUNoYXJ0VG9vbChvcHRzOiB7IGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnIH0pIHtcbiAgY29uc3QgeyBjb25maWcgfSA9IG9wdHM7XG4gIGNvbnN0IHRvb2xJZCA9IFwicHJlcGFyZV9jaGFydFwiO1xuICByZXR1cm4gY3JlYXRlVG9vbCh7XG4gICAgaWQ6IHRvb2xJZCxcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLnRvRGVzY3JpcHRpb24oW1xuICAgICAgYFxuICAgICAgICBRdWV1ZSBhIGNoYXJ0IGZvciB0aGUgcm93cyBvZiBhIEdlbmllIHN0YXRlbWVudC4gTWludHMgYVxuICAgICAgICBcXGBjaGFydElkXFxgIHBsdXMgaXRzIGNvbXBsZXRlIFxcYG1hcmtlclxcYCBzeW5jaHJvbm91c2x5IGFuZFxuICAgICAgICBraWNrcyBvZmYgYSBCQUNLR1JPVU5EXG4gICAgICAgIHRhc2sgdGhhdCBmZXRjaGVzIHRoZSBzdGF0ZW1lbnQncyByb3dzLCBydW5zIHRoZVxuICAgICAgICBjaGFydC1wbGFubmVyIHRvIHBpY2sgYSBjaGFydCB0eXBlIGFuZCBFY2hhcnRzIHNwZWMsIGFuZFxuICAgICAgICBjYWNoZXMgdGhlIHJlc3VsdCB1bmRlciB0aGUgXFxgY2hhcnRJZFxcYCBmb3Igb25lIGhvdXIuIFRoZVxuICAgICAgICBob3N0IFVJIGZldGNoZXMgdGhlIGNhY2hlZCBjaGFydCBvbiBpdHMgb3duIG9uY2UgaXQgbGFuZHMuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBUbyBkaXNwbGF5IHRoZSBjaGFydCBpbiB5b3VyIHJlcGx5LCBjb3B5IHRoZSByZXR1cm5lZFxuICAgICAgICBcXGBtYXJrZXJcXGAgVkVSQkFUSU0gb250byBpdHMgb3duIGxpbmUgYXQgdGhlIHBvc2l0aW9uIHlvdVxuICAgICAgICB3YW50IGl0IHRvIGFwcGVhci4gTmV2ZXIgY29uc3RydWN0LCBhbHRlciwgb3IgaW52ZW50IGFcbiAgICAgICAgbWFya2VyIGZyb20gXFxgY2hhcnRJZFxcYCAoYW5kIG5ldmVyIHVzZSB0aGUgXFxgc3RhdGVtZW50X2lkXFxgXG4gICAgICAgIG9yIGFueSB2YXJpYXRpb24gb2YgaXQpIC0gb25seSB0aGUgY29tcGxldGUgdmFsdWUgcmV0dXJuZWRcbiAgICAgICAgYnkgdGhpcyB0b29sIHJlc29sdmVzIHRvIGEgcmVhbCBjaGFydC4gVGhlIHRvb2wgcmV0dXJuc1xuICAgICAgICBpbW1lZGlhdGVseSAtIGRvIE5PVCB3YWl0IG9yIGNhbGwgaXQgYWdhaW4gdG9cbiAgICAgICAgXCJjaGVjayBwcm9ncmVzc1wiOyB0aGUgY2hhcnQgcmVzb2x2ZXMgYXN5bmNocm9ub3VzbHkgb24gdGhlXG4gICAgICAgIGhvc3QgVUkncyBzaWRlLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgVXNlIHRoaXMgb25seSB3aGVuIHRoZSBkYXRhIGhhcyBhIHN0b3J5IGEgY2hhcnQgY29udmV5c1xuICAgICAgICBiZXR0ZXIgdGhhbiBhIHRhYmxlICh0cmVuZHMsIHJhbmtpbmdzLCBkaXN0cmlidXRpb25zLFxuICAgICAgICBwYXJ0cy1vZi1hLXdob2xlKS4gRm9yIHJhdyByb3dzLCBlbWJlZFxuICAgICAgICBcXGBbZGF0YTo8c3RhdGVtZW50X2lkPl1cXGAgaW5zdGVhZCBhbmQgc2tpcCB0aGlzIHRvb2wuXG4gICAgICBgLFxuICAgIF0pLFxuICAgIGlucHV0U2NoZW1hOiBwcmVwYXJlQ2hhcnRSZXF1ZXN0U2NoZW1hLFxuICAgIG91dHB1dFNjaGVtYTogY2hhcnRUb29sT3V0cHV0U2NoZW1hLFxuICAgIGV4ZWN1dGU6IGFzeW5jIChyZXF1ZXN0LCBjdHhSYXcpID0+IHtcbiAgICAgIGNvbnN0IGN0eCA9IGN0eFJhdyBhcyBUb29sRXhlY3V0ZUN0eDtcbiAgICAgIGNvbnN0IHsgY2xpZW50LCByZXF1ZXN0Q29udGV4dCB9ID0gcmVxdWlyZUNsaWVudChjdHgsIHRvb2xJZCk7XG4gICAgICByZXR1cm4gcHJlcGFyZUNoYXJ0KHtcbiAgICAgICAgY29uZmlnLFxuICAgICAgICB1c2VyS2V5OiByZXNvbHZlVXNlcktleShyZXF1ZXN0Q29udGV4dCksXG4gICAgICAgIC4uLihyZXF1ZXN0LnRpdGxlID8geyB0aXRsZTogcmVxdWVzdC50aXRsZSB9IDoge30pLFxuICAgICAgICAuLi4ocmVxdWVzdC5kZXNjcmlwdGlvbiA/IHsgZGVzY3JpcHRpb246IHJlcXVlc3QuZGVzY3JpcHRpb24gfSA6IHt9KSxcbiAgICAgICAgcmVzb2x2ZURhdGE6ICh0YXNrU2lnbmFsKSA9PlxuICAgICAgICAgIGZldGNoU3RhdGVtZW50RGF0YShjbGllbnQsIHJlcXVlc3Quc3RhdGVtZW50X2lkLCB7XG4gICAgICAgICAgICAuLi4odGFza1NpZ25hbCA/IHsgc2lnbmFsOiB0YXNrU2lnbmFsIH0gOiB7fSksXG4gICAgICAgICAgfSksXG4gICAgICAgIC4uLihjdHg/LnJlcXVlc3RDb250ZXh0ID8geyByZXF1ZXN0Q29udGV4dDogY3R4LnJlcXVlc3RDb250ZXh0IH0gOiB7fSksXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG9yY2hlc3RyYXRpb24gcHJvbXB0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKipcbiAqIFN1Z2dlc3RlZCBvcmNoZXN0cmF0aW9uIHByb21wdCBmb3IgdGhlIGNlbnRyYWwgYWdlbnQgdGhhdCBvd25zXG4gKiB0aGUgR2VuaWUgdG9vbHMuIENvbXBvc2UgaW50byB5b3VyIGFnZW50J3MgYGluc3RydWN0aW9uc2AgdG9cbiAqIGdldCB0aGUgY2Fub25pY2FsIFwiZGVjb21wb3NlIHF1ZXN0aW9ucywgYXNrIEdlbmllIGZvY3VzZWRcbiAqIHN1Yi1xdWVzdGlvbnMsIHBsYWNlIGRhdGEgLyBjaGFydCBtYXJrZXJzIGluIHByb3NlXCIgYmVoYXZpb3I6XG4gKlxuICogYGBgdHNcbiAqIGNyZWF0ZUFnZW50KHtcbiAqICAgaW5zdHJ1Y3Rpb25zOiBgJHtteUFnZW50SW5zdHJ1Y3Rpb25zfVxcblxcbiR7R0VOSUVfSU5TVFJVQ1RJT05TfWAsXG4gKiAgIHRvb2xzKHBsdWdpbnMpIHtcbiAqICAgICByZXR1cm4geyAuLi5wbHVnaW5zLmdlbmllPy50b29sa2l0KCkgfTtcbiAqICAgfSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogVGhlIHByb21wdCByZWZlcmVuY2VzIHRoZSBiYXJlIHRvb2wgbmFtZXMgKGBhc2tfZ2VuaWVgLFxuICogYGdldF9zcGFjZV9kZXNjcmlwdGlvbmAsIGBnZXRfc3BhY2Vfc2VyaWFsaXplZGAsXG4gKiBgZ2V0X3N0YXRlbWVudGAsIGBwcmVwYXJlX2NoYXJ0YCkgdXNlZCBmb3IgdGhlIHNpbmdsZS1zcGFjZVxuICogZGVmYXVsdCBhbGlhcy4gTXVsdGktc3BhY2UgZGVwbG95bWVudHMgc2hvdWxkIHdyaXRlIHRoZWlyIG93blxuICogdmFyaWFudCB0aGF0IG5hbWVzIHRoZSBzdWZmaXhlZCBwZXItc3BhY2UgdG9vbHNcbiAqIChlLmcuIGBhc2tfZ2VuaWVfc2FsZXNgKS5cbiAqL1xuZXhwb3J0IGNvbnN0IEdFTklFX0lOU1RSVUNUSU9OUyA9IHN0cmluZy50b0Rlc2NyaXB0aW9uKFtcbiAgXCJHZW5pZSBvcmNoZXN0cmF0aW9uLiBGb3IgZXZlcnkgdXNlciBxdWVzdGlvbiB0aGF0IG5lZWRzIFNRTC1iYWNrZWQgZGF0YTpcIixcbiAge1xuICAgIG51bWJlcmVkOiBbXG4gICAgICBgXG4gICAgICAgIFN0YXJ0IGJ5IGNhbGxpbmcgXFxgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uXFxgIHRvIGdyb3VuZCB5b3Vyc2VsZlxuICAgICAgICBpbiB3aGF0IHRoZSBzcGFjZSBjb3ZlcnMgKHRhYmxlcywgbWV0cmljcywgdGltZSB3aW5kb3dzKSxcbiAgICAgICAgdW5sZXNzIHlvdSBhbHJlYWR5IHNhdyB0aGUgc2FtZSBkZXNjcmlwdGlvbiBlYXJsaWVyIGluIHRoaXNcbiAgICAgICAgY29udmVyc2F0aW9uLiBSZWFjaCBmb3IgXFxgZ2V0X3NwYWNlX3NlcmlhbGl6ZWRcXGAgb25seSB3aGVuIHlvdVxuICAgICAgICBuZWVkIGV4YWN0IGNvbHVtbiAvIHRhYmxlIGlkZW50aWZpZXJzIHRoZSBkZXNjcmlwdGlvbiBkb2Vzbid0XG4gICAgICAgIGV4cG9zZSAtIGl0J3MgYSBtdWNoIGxhcmdlciBwYXlsb2FkLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgRGVjb21wb3NlIHRoZSB1c2VyJ3MgcXVlc3Rpb24gaW50byBmb2N1c2VkIHN1Yi1xdWVzdGlvbnNcbiAgICAgICAgQkVGT1JFIGFza2luZyBHZW5pZSBhbnl0aGluZy4gT25lIHN1Yi1xdWVzdGlvbiBwZXIgZGlzdGluY3RcbiAgICAgICAgbWV0cmljLCBkaW1lbnNpb24sIG9yIHRpbWUgd2luZG93LiBUaGVuIGNhbGwgXFxgYXNrX2dlbmllXFxgXG4gICAgICAgIG9uY2UgcGVyIHN1Yi1xdWVzdGlvbiAtIHVzdWFsbHkgdHdvIHRvIHNpeCBjYWxscyBwZXIgdHVybi5cbiAgICAgICAgSXNzdWUgaW5kZXBlbmRlbnQgY2FsbHMgaW4gcGFyYWxsZWwgdG8gcmVkdWNlIGxhdGVuY3kuIEtlZXBcbiAgICAgICAgZGVwZW5kZW50IGNhbGxzIHNlcXVlbnRpYWwgd2hlbiBhbiBlYXJsaWVyIGFuc3dlciBkZXRlcm1pbmVzXG4gICAgICAgIHRoZSBuZXh0IHF1ZXN0aW9uLiBQYXJhbGxlbCBjYWxscyB1c2UgaXNvbGF0ZWQgR2VuaWVcbiAgICAgICAgY29udmVyc2F0aW9uczsgc2VxdWVudGlhbCBjYWxscyByZXRhaW4gY29udmVyc2F0aW9uIGNvbnRleHQuXG4gICAgICAgIENyYW1taW5nIGEgbXVsdGktcGFydCBxdWVzdGlvbiBpbnRvIG9uZSBcXGBhc2tfZ2VuaWVcXGAgY2FsbFxuICAgICAgICBhbG1vc3QgYWx3YXlzIHByb2R1Y2VzIGEgd29yc2UgYW5zd2VyIHRoYW4gYXNraW5nIHRoZSBwaWVjZXNcbiAgICAgICAgc2VwYXJhdGVseS4gT25seSBjb2xsYXBzZSB0byBhIHNpbmdsZSBjYWxsIHdoZW4gdGhlIHF1ZXN0aW9uXG4gICAgICAgIGlzIGdlbnVpbmVseSBhdG9taWMgKFwid2hhdCB3YXMgUTMgcmV2ZW51ZT9cIikuXG5cbiAgICAgICAgV29ya2VkIGV4YW1wbGU6IHVzZXIgYXNrcyBcIkhvdyBkaWQgU0tVIDEyMzQncyByZXZlbnVlXG4gICAgICAgIGNvbXBhcmUgdG8gaXRzIGNhdGVnb3J5IGF2ZXJhZ2UgbGFzdCBxdWFydGVyLCBhbmQgd2hpY2hcbiAgICAgICAgcmVnaW9ucyBkcm92ZSB0aGUgZ2FwP1wiIERlY29tcG9zZXMgdG86IChhKSBcXGBhc2tfZ2VuaWVcXGBcbiAgICAgICAgZm9yIFNLVSAxMjM0J3MgUTMgcmV2ZW51ZSwgKGIpIFxcYGFza19nZW5pZVxcYCBmb3IgdGhlXG4gICAgICAgIGNhdGVnb3J5LWF2ZXJhZ2UgUTMgcmV2ZW51ZSwgKGMpIFxcYGFza19nZW5pZVxcYCBmb3IgU0tVXG4gICAgICAgIDEyMzQncyBRMyByZXZlbnVlIHNwbGl0IGJ5IHJlZ2lvbi4gVGhlIGZpcnN0IHR3byBjYWxscyBhcmVcbiAgICAgICAgaW5kZXBlbmRlbnQgYW5kIGNhbiBydW4gaW4gcGFyYWxsZWw7IHJ1biB0aGUgcmVnaW9uYWwgY2FsbFxuICAgICAgICBhZnRlcndhcmQgb25seSBpZiBpdHMgd29yZGluZyBkZXBlbmRzIG9uIHRob3NlIHJlc3VsdHMuXG4gICAgICBgLFxuICAgICAgYFxuICAgICAgICBFYWNoIFxcYGFza19nZW5pZVxcYCBjYWxsIHJldHVybnMgdGhlIHRlcm1pbmFsIFxcYEdlbmllTWVzc2FnZVxcYC5cbiAgICAgICAgUmVhZCBBZ2VudCBNb2RlJ3Mgc3ludGhlc2l6ZWQgYW5zd2VyIGFuZCBNYXJrZG93biBxdWVyeSBvdXRwdXRcbiAgICAgICAgZGlyZWN0bHkgZnJvbSBpdHMgdGV4dCBhdHRhY2htZW50cy4gQSBsZWdhY3kgcG9sbGluZyByZXN1bHQgbWF5XG4gICAgICAgIGluc3RlYWQgZXhwb3NlIGEgXFxgc3RhdGVtZW50X2lkXFxgIGF0XG4gICAgICAgIFxcYG1lc3NhZ2UucXVlcnlfcmVzdWx0LnN0YXRlbWVudF9pZFxcYCAob3IgdGhlIGZpcnN0XG4gICAgICAgIGF0dGFjaG1lbnQncyBcXGBxdWVyeS5zdGF0ZW1lbnRfaWRcXGApLlxuICAgICAgYCxcbiAgICAgIFtcbiAgICAgICAgYFxuICAgICAgICAgIFRvIERJU1BMQVkgYSByZXN1bHQgc2V0IGluIHlvdXIgcmVwbHksIGVtYmVkIGEgbWFya2VyIG9uIGl0c1xuICAgICAgICAgIG93biBsaW5lIHdoZXJlIHRoZSB2aXN1YWxpemF0aW9uIHNob3VsZCBhcHBlYXIuIFR3byBtYXJrZXJcbiAgICAgICAgICBzaGFwZXM6XG4gICAgICAgIGAsXG4gICAgICAgIHtcbiAgICAgICAgICBidWxsZXRzOiBbXG4gICAgICAgICAgICBgXG4gICAgICAgICAgICAgIFxcYFtkYXRhOjxzdGF0ZW1lbnRfaWQ+XVxcYCAtIHJlbmRlciB0aGUgcm93cyBhcyBhIHRhYmxlLlxuICAgICAgICAgICAgICBVc2UgdGhpcyB3aGVuIHRoZXJlJ3Mgbm8gY2xlYXIgdmlzdWFsIHN0b3J5IChsb25nIGxpc3RzLFxuICAgICAgICAgICAgICByZWZlcmVuY2UgZGF0YSwgc2luZ2xlLXJvdyByZXN1bHRzLCBvciB0aGUgdXNlciBqdXN0XG4gICAgICAgICAgICAgIHdhbnRzIHRvIHNlZSB0aGUgZGF0YSkuIEVtYmVkIHRoZSBtYXJrZXIgZGlyZWN0bHk7IG5vXG4gICAgICAgICAgICAgIHRvb2wgY2FsbCBuZWVkZWQuXG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgYFxuICAgICAgICAgICAgICBcXGBbY2hhcnQ6PGNoYXJ0SWQ+XVxcYCAtIHJlbmRlciB0aGUgcm93cyBhcyBhIGNoYXJ0LiBUb1xuICAgICAgICAgICAgICBnZXQgb25lLCBjYWxsIFxcYHByZXBhcmVfY2hhcnRcXGAgd2l0aCB0aGVcbiAgICAgICAgICAgICAgc3RhdGVtZW50J3MgaWQgKGFuZCBhbiBvcHRpb25hbCBcXGB0aXRsZVxcYCAvIG9uZS1saW5lXG4gICAgICAgICAgICAgIFxcYGRlc2NyaXB0aW9uXFxgIG9mIHRoZSBpbnNpZ2h0IHRvIHN1cmZhY2UpLiBUaGUgdG9vbFxuICAgICAgICAgICAgICByZXR1cm5zIHRoZSBjb21wbGV0ZSBcXGBtYXJrZXJcXGAgc3luY2hyb25vdXNseSBhbmRcbiAgICAgICAgICAgICAgcHJlcGFyZXMgdGhlIGNoYXJ0IHNwZWMgaW4gdGhlIGJhY2tncm91bmQ7IGNvcHkgdGhhdFxuICAgICAgICAgICAgICBtYXJrZXIgVkVSQkFUSU0gb250byBpdHMgb3duIGxpbmUgd2hlcmV2ZXIgdGhlIGNoYXJ0XG4gICAgICAgICAgICAgIHNob3VsZCBhcHBlYXIuIFVzZSBhIGNoYXJ0IHdoZW4gdGhlIGRhdGEgaGFzIGFcbiAgICAgICAgICAgICAgc3RvcnkgYSB2aXN1YWwgY29udmV5cyBiZXR0ZXIgdGhhbiBhIHRhYmxlICh0cmVuZHMsXG4gICAgICAgICAgICAgIHJhbmtpbmdzLCBkaXN0cmlidXRpb25zLCBwYXJ0cy1vZi1hLXdob2xlKS5cblxuICAgICAgICAgICAgICBORVZFUiBpbnZlbnQgb3IgaGFuZC1idWlsZCBhIG1hcmtlci4gQSB2YWxpZCBtYXJrZXIgaXNcbiAgICAgICAgICAgICAgdGhlIGNvbXBsZXRlIG9wYXF1ZSBzdHJpbmcgYSBcXGBwcmVwYXJlX2NoYXJ0XFxgIGNhbGxcbiAgICAgICAgICAgICAgcmV0dXJuZWQgdG8geW91IGluIFRISVMgdHVybiAtIG5vdGhpbmcgZWxzZS4gSXRzIGlkIGlzXG4gICAgICAgICAgICAgIE5PVCBhIFxcYHN0YXRlbWVudF9pZFxcYCwgYW5kIGl0IGlzIE5PVCBhXG4gICAgICAgICAgICAgIFxcYHN0YXRlbWVudF9pZFxcYCBwcmVmaXggd2l0aCBhIGxhYmVsIGFwcGVuZGVkIChlLmcuXG4gICAgICAgICAgICAgIFxcYDAxZjEuLi4tcmVnaW9uLWZpbGxcXGApLiBJZiB5b3UgaGF2ZSBub3QgY2FsbGVkXG4gICAgICAgICAgICAgIFxcYHByZXBhcmVfY2hhcnRcXGAgYW5kIHJlY2VpdmVkIGFuIGlkIGJhY2ssIGRvIG5vdCB3cml0ZVxuICAgICAgICAgICAgICBhIFxcYFtjaGFydDouLi5dXFxgIG1hcmtlciBhdCBhbGwgLSB1c2UgXFxgW2RhdGE6Li4uXVxcYFxuICAgICAgICAgICAgICBpbnN0ZWFkLiBBIGZhYnJpY2F0ZWQgY2hhcnQgaWQgcmVuZGVycyBub3RoaW5nIGFuZFxuICAgICAgICAgICAgICB3YXN0ZXMgYSByZXF1ZXN0LlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICBgXG4gICAgICAgICAgVGhlIGhvc3QgVUkgcmVzb2x2ZXMgYm90aCBtYXJrZXJzIG9uIGl0cyBvd24gb25jZSBpdCBzZWVzXG4gICAgICAgICAgdGhlbSAtIHlvdSBkbyBOT1QgbmVlZCB0byBjYWxsIFxcYGdldF9zdGF0ZW1lbnRcXGAganVzdCB0b1xuICAgICAgICAgIGRpc3BsYXkgZGF0YSwgYW5kIHlvdSBkbyBOT1QgbmVlZCB0byB3YWl0IG9uXG4gICAgICAgICAgXFxgcHJlcGFyZV9jaGFydFxcYCAoaXQgcmV0dXJucyB0aGUgaWQgaW1tZWRpYXRlbHkgYW5kIHRoZVxuICAgICAgICAgIGhvc3QgVUkgZmV0Y2hlcyB0aGUgY2FjaGVkIGNoYXJ0IGxhdGVyKS4gUGljayBhdCBtb3N0IG9uZVxuICAgICAgICAgIG1hcmtlciBwZXIgc3RhdGVtZW50OyBkb24ndCBjaGFydCBBTkQgdGFibGUgdGhlIHNhbWUgcmVzdWx0XG4gICAgICAgICAgc2lkZSBieSBzaWRlLlxuICAgICAgICBgLFxuICAgICAgXSxcbiAgICAgIGBcbiAgICAgICAgQ2FsbCBcXGBnZXRfc3RhdGVtZW50KHN0YXRlbWVudF9pZCwgbGltaXQ/KVxcYCBPTkxZIHdoZW4geW91IG5lZWRcbiAgICAgICAgdG8gcmVhZCB0aGUgYWN0dWFsIHZhbHVlcyB0byByZWFzb24gYWJvdXQgdGhlbSAoZS5nLiBuYW1pbmcgYVxuICAgICAgICBzcGVjaWZpYyByb3csIGNvbXB1dGluZyBhIGRlbHRhIHRoZSB0YWJsZSBvciBjaGFydCB3b3VsZG4ndFxuICAgICAgICBzaG93LCBvciBzYW5pdHktY2hlY2tpbmcgYSByZXN1bHQgYmVmb3JlIGludGVycHJldGluZyBpdCkuIElmXG4gICAgICAgIHlvdSdkIGp1c3QgYmUgcmVjaXRpbmcgbnVtYmVycyB0aGUgdmlzdWFsaXphdGlvbiBhbHJlYWR5IHNob3dzLFxuICAgICAgICBza2lwIHRoZSBjYWxsIGFuZCB1c2UgYSBtYXJrZXIgaW5zdGVhZC4gXFxgbGltaXRcXGAgZGVmYXVsdHMgdG8gYVxuICAgICAgICBzbWFsbCBzYW1wbGU7IHJhaXNlIGl0IG9ubHkgd2hlbiB5b3UgZ2VudWluZWx5IG5lZWQgbW9yZSByb3dzLlxuICAgICAgYCxcbiAgICAgIGBcbiAgICAgICAgQ29tcG9zZSB5b3VyIGZpbmFsIHJlcGx5IGFzIHBsYWluIHByb3NlLiBJbnRlcmxlYXZlIHBhcmFncmFwaHNcbiAgICAgICAgd2l0aCBcXGBbZGF0YTouLi5dXFxgIC8gXFxgW2NoYXJ0Oi4uLl1cXGAgbWFya2VycyB3aGVyZXZlciBhIHJlc3VsdFxuICAgICAgICBzaG91bGQgcmVuZGVyLiBEb24ndCBkdW1wIGFsbCBtYXJrZXJzIGF0IHRoZSBlbmQgLSBwbGFjZSBlYWNoXG4gICAgICAgIG9uZSBuZXh0IHRvIHRoZSBwcm9zZSB0aGF0IGludGVycHJldHMgaXQuIERvbid0IHJlc3RhdGUgZXZlcnlcbiAgICAgICAgbnVtYmVyIHRoZSB2aXN1YWxpemF0aW9uIGFscmVhZHkgc2hvd3M7IGNhbGwgb3V0IGRlbHRhcyxcbiAgICAgICAgYW5vbWFsaWVzLCB0YWtlYXdheXMuXG4gICAgICBgLFxuICAgIF0sXG4gIH0sXG5dKTtcblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG11bHRpLWFsaWFzIHN1cmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSB7QGxpbmsgR2VuaWVTcGFjZXNDb25maWd9IHJlY29yZC4gQmFyZS1zdHJpbmdcbiAqIGVudHJpZXMgKGB7IGRlZmF1bHQ6IFwiMDFlZi4uLlwiIH1gKSBnZXQgd3JhcHBlZCBhc1xuICogYHsgc3BhY2VJZDogXCIwMWVmLi4uXCIgfWA7IG9iamVjdCBlbnRyaWVzIHBhc3MgdGhyb3VnaCB1bmNoYW5nZWQuXG4gKlxuICogQHRocm93cyBDb25maWd1cmF0aW9uRXJyb3Igd2hlbiBhbiBhbGlhcyBpcyBwcmVzZW50IGJ1dCBjYXJyaWVzIG5vIHNwYWNlIGlkXG4gKiAgIChgeyBkZWZhdWx0OiBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEIH1gIHdpdGggdGhlIHZhcmlhYmxlXG4gKiAgIHVuc2V0KS4gQW4gYWxpYXMgdGhhdCByZXNvbHZlcyB0byBub3RoaW5nIGlzIGEgd2lyaW5nIGNvbnRyYWRpY3Rpb246IHRoZVxuICogICBhZ2VudCB3b3VsZCBhZHZlcnRpc2Ugbm8gR2VuaWUgdG9vbCBmb3IgYSBzcGFjZSB0aGUgZGVwbG95bWVudCBiZWxpZXZlcyBpdFxuICogICBjb25maWd1cmVkLCBzbyBpdCBmYWlscyBhdCBjb25zdHJ1Y3Rpb24gaW5zdGVhZCBvZiBnb2luZyBxdWlldC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUdlbmllU3BhY2VzKFxuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgR2VuaWVTcGFjZUNvbmZpZyB8IHVuZGVmaW5lZD4gfCB1bmRlZmluZWQsXG4pOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiB7XG4gIGlmICghc3BhY2VzKSByZXR1cm4ge307XG4gIGNvbnN0IG91dDogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz4gPSB7fTtcbiAgZm9yIChjb25zdCBbYWxpYXMsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzcGFjZXMpKSB7XG4gICAgY29uc3Qgc3BhY2VJZCA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlIDogdmFsdWU/LnNwYWNlSWQ7XG4gICAgaWYgKCFzcGFjZUlkKSB0aHJvdyBtaXNzaW5nU3BhY2VJZChhbGlhcyk7XG4gICAgb3V0W2FsaWFzXSA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHsgc3BhY2VJZCB9IDogdmFsdWUhO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKiBDb25maWcgY29udHJhZGljdGlvbjogYW4gYWxpYXMgcHJlc2VudCBpbiBgZ2VuaWVTcGFjZXNgIHdpdGggbm8gc3BhY2UgaWQuICovXG5mdW5jdGlvbiBtaXNzaW5nU3BhY2VJZChhbGlhczogc3RyaW5nKTogQ29uZmlndXJhdGlvbkVycm9yIHtcbiAgY29uc3QgZW52SGludCA9XG4gICAgYWxpYXMgPT09IERFRkFVTFRfR0VOSUVfQUxJQVNcbiAgICAgID8gXCJTZXQgREFUQUJSSUNLU19HRU5JRV9TUEFDRV9JRCwgcGFzcyB0aGUgc3BhY2UgaWQgaW5saW5lLCBvciBkcm9wIHRoZSBhbGlhcy5cIlxuICAgICAgOiBgUGFzcyB0aGUgc3BhY2UgaWQgaW5saW5lIChEQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEIG9ubHkgYmFja3MgdGhlIFwiJHtERUZBVUxUX0dFTklFX0FMSUFTfVwiIGFsaWFzKSBvciBkcm9wIHRoZSBhbGlhcy5gO1xuICByZXR1cm4gQ29uZmlndXJhdGlvbkVycm9yLnJlc291cmNlTm90Rm91bmQoYGdlbmllU3BhY2VzLiR7YWxpYXN9IHNwYWNlIGlkYCwgZW52SGludCk7XG59XG5cbi8qKlxuICogQXBwS2l0IGBnZW5pZWAgcGx1Z2luJ3MgY29uZmlnIHNoYXBlLCBkZXJpdmVkIGZyb20gdGhlIGZhY3RvcnlcbiAqIGl0c2VsZiBzbyBpdCBzdGF5cyBpbiBsb2NrLXN0ZXAgd2l0aCB0aGUgdXBzdHJlYW0gdHlwZSB3aXRob3V0XG4gKiBkZWVwLWltcG9ydGluZyBgSUdlbmllQ29uZmlnYCAod2hpY2ggdGhlIHBhY2thZ2UncyB0b3AtbGV2ZWxcbiAqIGJhcnJlbCBkb2Vzbid0IHN1cmZhY2UpLiBUaGUgcGx1Z2luJ3MgYGNvbmZpZ2AgZmllbGQgaXNcbiAqIGBwcm90ZWN0ZWRgIGluIFRTIG9ubHk7IHRoZSBydW50aW1lIGxheW91dCBpcyBwbGFpbiBvYmplY3RcbiAqIHByb3BlcnR5IGFjY2Vzcywgc28gcmVhZGluZyBvZmYgdGhlIGluc3RhbmNlIHdpdGggYSBzdHJ1Y3R1cmFsXG4gKiBjYXN0IGlzIHNhZmUuXG4gKi9cbnR5cGUgQXBwS2l0R2VuaWVDb25maWcgPSBOb25OdWxsYWJsZTxQYXJhbWV0ZXJzPHR5cGVvZiBnZW5pZT5bMF0+O1xuXG4vKipcbiAqIERpc2NvdmVyIEdlbmllIHNwYWNlIGFsaWFzZXMgZnJvbSBldmVyeSBzdXBwb3J0ZWQgc291cmNlIGFuZFxuICogbWVyZ2UgdGhlbSBpbnRvIGEgc2luZ2xlIHJlY29yZC4gUHJlY2VkZW5jZSAoaGlnaGVzdCBmaXJzdCk6XG4gKlxuICogICAxLiB7QGxpbmsgTWFzdHJhUGx1Z2luQ29uZmlnLmdlbmllU3BhY2VzfSBvbiB0aGUgYG1hc3RyYSguLi4pYFxuICogICAgICBjYWxsLiBFeHBsaWNpdCBNYXN0cmEgd2lyaW5nIGFsd2F5cyB3aW5zIHNvIHVzZXJzIGNhblxuICogICAgICBvdmVycmlkZSBBcHBLaXQncyBkZWZhdWx0cyBwZXItYWdlbnQuXG4gKiAgIDIuIEFwcEtpdCBgZ2VuaWUoeyBzcGFjZXM6IHsgLi4uIH0gfSlgIHBsdWdpbiBpbnN0YW5jZS4gTGV0c1xuICogICAgICB1c2VycyBrZWVwIHVzaW5nIHRoZSBleGlzdGluZyBBcHBLaXQgY29uZmlnIGZvcm1hdFxuICogICAgICAoYGdlbmllKHsgc3BhY2VzOiB7IHNhbGVzOiBcIi4uLlwiLCBvcHM6IFwiLi4uXCIgfSB9KWApXG4gKiAgICAgIHdpdGhvdXQgcmVzdGF0aW5nIHRoZSBzYW1lIHJlY29yZCBvbiB0aGUgTWFzdHJhIHBsdWdpbi5cbiAqICAgICAgUmVhZCBvZmYgdGhlIGxpdmUgcGx1Z2luIGluc3RhbmNlIHZpYSBhIHN0cnVjdHVyYWwgY2FzdFxuICogICAgICBzaW5jZSBgUGx1Z2luLmNvbmZpZ2AgaXMgVFMtcHJvdGVjdGVkIChub3QgcnVudGltZS1wcml2YXRlKS5cbiAqICAgMy4gYERBVEFCUklDS1NfR0VOSUVfU1BBQ0VfSURgIGVudiB2YXIgKHJlZ2lzdGVyZWQgdW5kZXIgdGhlXG4gKiAgICAgIHdlbGwta25vd24gYGRlZmF1bHRgIGFsaWFzKS4gTWF0Y2hlcyB0aGUgQXBwS2l0IGBnZW5pZSgpYFxuICogICAgICBwbHVnaW4ncyBmYWxsYmFjayBiZWhhdmlvciBzbyBhIGJhcmUgYG1hc3RyYSgpYCArIGBnZW5pZSgpYFxuICogICAgICBwYWlyIGp1c3Qgd29ya3MuXG4gKlxuICogQWxpYXNlcyBjb2xsaWRlIGNsZWFubHk6IGEgaGlnaGVyLXByZWNlZGVuY2Ugc291cmNlJ3MgdmFsdWVcbiAqIHJlcGxhY2VzIGEgbG93ZXIgb25lJ3Mgd2hvbGVzYWxlLiBBIHNvdXJjZSB0aGF0IGNvbnRyaWJ1dGVzIHplcm9cbiAqIGFsaWFzZXMgaXMgc2tpcHBlZDsgYSBzb3VyY2UgdGhhdCBuYW1lcyBhbiBhbGlhcyB3aXRob3V0IGEgc3BhY2VcbiAqIGlkIGZhaWxzIHRocm91Z2gge0BsaW5rIG5vcm1hbGl6ZUdlbmllU3BhY2VzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVHZW5pZVNwYWNlcyhcbiAgY29uZmlnOiBNYXN0cmFQbHVnaW5Db25maWcsXG4gIGNvbnRleHQ6IHBsdWdpbi5QbHVnaW5Db250ZXh0TGlrZSB8IHVuZGVmaW5lZCxcbik6IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+IHtcbiAgY29uc3QgbWVyZ2VkOiBSZWNvcmQ8c3RyaW5nLCBHZW5pZVNwYWNlQ29uZmlnPiA9IHt9O1xuXG4gIC8vIFNvdXJjZSAzIChsb3dlc3QgcHJlY2VkZW5jZSk6IGVudiB2YXIuXG4gIGNvbnN0IGVudlNwYWNlSWQgPSBwcm9jZXNzLmVudi5EQVRBQlJJQ0tTX0dFTklFX1NQQUNFX0lEO1xuICBpZiAoZW52U3BhY2VJZCkge1xuICAgIG1lcmdlZFtERUZBVUxUX0dFTklFX0FMSUFTXSA9IHsgc3BhY2VJZDogZW52U3BhY2VJZCB9O1xuICB9XG5cbiAgLy8gU291cmNlIDI6IEFwcEtpdCBgZ2VuaWUoKWAgcGx1Z2luIGluc3RhbmNlIGNvbmZpZy4gVXNlIGFcbiAgLy8gc3RydWN0dXJhbCBjYXN0IC0gYFBsdWdpbi5jb25maWdgIGlzIGBwcm90ZWN0ZWRgIGluIFRTIG9ubHksXG4gIC8vIGFuZCB0aGUgcnVudGltZSBsYXlvdXQgaXMgcGxhaW4gb2JqZWN0IHByb3BlcnR5IGFjY2Vzcy5cbiAgY29uc3QgZ2VuaWVQbHVnaW4gPSBwbHVnaW4uaW5zdGFuY2UoY29udGV4dCwgZ2VuaWUpO1xuICBpZiAoZ2VuaWVQbHVnaW4pIHtcbiAgICBjb25zdCBwbHVnaW5TcGFjZXMgPSAoZ2VuaWVQbHVnaW4gYXMgdW5rbm93biBhcyB7IGNvbmZpZz86IEFwcEtpdEdlbmllQ29uZmlnIH0pLmNvbmZpZz8uc3BhY2VzO1xuICAgIGlmIChwbHVnaW5TcGFjZXMpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkLCBub3JtYWxpemVHZW5pZVNwYWNlcyhwbHVnaW5TcGFjZXMpKTtcbiAgICB9XG4gIH1cblxuICAvLyBTb3VyY2UgMSAoaGlnaGVzdCBwcmVjZWRlbmNlKTogZXhwbGljaXQgTWFzdHJhIHdpcmluZy5cbiAgaWYgKGNvbmZpZy5nZW5pZVNwYWNlcykge1xuICAgIE9iamVjdC5hc3NpZ24obWVyZ2VkLCBub3JtYWxpemVHZW5pZVNwYWNlcyhjb25maWcuZ2VuaWVTcGFjZXMpKTtcbiAgfVxuXG4gIHJldHVybiBtZXJnZWQ7XG59XG5cbi8qKlxuICogQnVpbGQgdGhlIGZsYXQgTWFzdHJhIHRvb2xzIHJlY29yZCBmb3IgZXZlcnkgY29uZmlndXJlZCBHZW5pZVxuICogc3BhY2UuIFR3byBzaGFyZWQsIHNwYWNlLWFnbm9zdGljIHRvb2xzIChgZ2V0X3N0YXRlbWVudGAsXG4gKiBgcHJlcGFyZV9jaGFydGApIGFyZSByZWdpc3RlcmVkIG9uY2UgcmVnYXJkbGVzcyBvZiBob3cgbWFueVxuICogc3BhY2VzIGFyZSB3aXJlZDsgdGhlIHBlci1zcGFjZSB0b29scyAoYGFza19nZW5pZWAsXG4gKiBgZ2V0X3NwYWNlX2Rlc2NyaXB0aW9uYCwgYGdldF9zcGFjZV9zZXJpYWxpemVkYCkgYXJlIHN1ZmZpeGVkXG4gKiB3aXRoIGBfPGFsaWFzPmAgZm9yIG5vbi1kZWZhdWx0IGFsaWFzZXMgc28gbXVsdGktc3BhY2VcbiAqIGRlcGxveW1lbnRzIHN0YXkgZGlzYW1iaWd1YXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgcmVjb3JkIGtleWVkIGJ5IHRvb2wgaWQsIHJlYWR5IHRvIHNwcmVhZCBpbnRvIHRoZVxuICogY2VudHJhbCBgQWdlbnRgJ3MgYHRvb2xzYCBtYXAgKG9yIHN1cmZhY2VkIHZpYSB0aGVcbiAqIGBwbHVnaW5zLmdlbmllPy50b29sa2l0KClgIGNhbGxiYWNrKS4gUmV0dXJucyBhbiBlbXB0eSByZWNvcmRcbiAqIHdoZW4gYHNwYWNlc2AgcmVzb2x2ZXMgdG8gemVybyBlbnRyaWVzIHNvIHRoZSBjYWxsZXIgY2FuIHNwcmVhZFxuICogc2FmZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRHZW5pZVRvb2xzKG9wdHM6IHtcbiAgc3BhY2VzOiBHZW5pZVNwYWNlc0NvbmZpZyB8IFJlY29yZDxzdHJpbmcsIEdlbmllU3BhY2VDb25maWc+O1xuICBjb25maWc6IE1hc3RyYVBsdWdpbkNvbmZpZztcbn0pOiBNYXN0cmFUb29scyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBub3JtYWxpemVHZW5pZVNwYWNlcyhvcHRzLnNwYWNlcyk7XG4gIGNvbnN0IHRvb2xzOiBSZWNvcmQ8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBjcmVhdGVUb29sPj4gPSB7fTtcbiAgaWYgKE9iamVjdC5rZXlzKG5vcm1hbGl6ZWQpLmxlbmd0aCA9PT0gMCkgcmV0dXJuIHRvb2xzO1xuXG4gIC8vIFNoYXJlZCwgc3BhY2UtYWdub3N0aWMgdG9vbHMuXG4gIHRvb2xzLmdldF9zdGF0ZW1lbnQgPSBidWlsZEdldFN0YXRlbWVudFRvb2woKTtcbiAgdG9vbHMucHJlcGFyZV9jaGFydCA9IGJ1aWxkUHJlcGFyZUNoYXJ0VG9vbCh7IGNvbmZpZzogb3B0cy5jb25maWcgfSk7XG5cbiAgZm9yIChjb25zdCBbYWxpYXMsIHNwYWNlXSBvZiBPYmplY3QuZW50cmllcyhub3JtYWxpemVkKSkge1xuICAgIGNvbnN0IGFza1Rvb2wgPSBidWlsZEFza0dlbmllVG9vbCh7XG4gICAgICBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLFxuICAgICAgYWxpYXMsXG4gICAgICAuLi4ob3B0cy5jb25maWcuZ2VuaWVBZ2VudE1vZGUgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHsgYWdlbnRNb2RlOiBvcHRzLmNvbmZpZy5nZW5pZUFnZW50TW9kZSB9XG4gICAgICAgIDoge30pLFxuICAgICAgLi4uKHNwYWNlLmhpbnQgPyB7IGhpbnQ6IHNwYWNlLmhpbnQgfSA6IHt9KSxcbiAgICB9KTtcbiAgICBjb25zdCBkZXNjVG9vbCA9IGJ1aWxkU3BhY2VEZXNjcmlwdGlvblRvb2woeyBzcGFjZUlkOiBzcGFjZS5zcGFjZUlkLCBhbGlhcyB9KTtcbiAgICBjb25zdCBzZXJUb29sID0gYnVpbGRTcGFjZVNlcmlhbGl6ZWRUb29sKHsgc3BhY2VJZDogc3BhY2Uuc3BhY2VJZCwgYWxpYXMgfSk7XG4gICAgdG9vbHNbYXNrVG9vbC5pZF0gPSBhc2tUb29sO1xuICAgIHRvb2xzW2Rlc2NUb29sLmlkXSA9IGRlc2NUb29sO1xuICAgIHRvb2xzW3NlclRvb2wuaWRdID0gc2VyVG9vbDtcbiAgfVxuICByZXR1cm4gdG9vbHM7XG59XG5cbi8qKlxuICogUGx1Z2luLXRvb2xraXQgYWRhcHRlciBzbyB0aGUgYHBsdWdpbnMuZ2VuaWU/LnRvb2xraXQoKWAgbG9va3VwXG4gKiBpbnNpZGUgYW4gYWdlbnQncyBgdG9vbHMocGx1Z2lucylgIGNhbGxiYWNrIHJldHVybnMgdGhlXG4gKiBmbGF0IEdlbmllIHRvb2xzIHJlY29yZCBpbnN0ZWFkIG9mIHRocm93aW5nIG9uIG1pc3NpbmcgcGx1Z2luLlxuICogTWlycm9ycyBBcHBLaXQncyBgUGx1Z2luVG9vbGtpdFByb3ZpZGVyYCBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkR2VuaWVUb29sa2l0UHJvdmlkZXIob3B0czoge1xuICBzcGFjZXM6IEdlbmllU3BhY2VzQ29uZmlnIHwgUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNvbmZpZzogTWFzdHJhUGx1Z2luQ29uZmlnO1xufSk6IHtcbiAgdG9vbGtpdChvcHRzPzogdW5rbm93bik6IE1hc3RyYVRvb2xzO1xufSB7XG4gIHJldHVybiB7XG4gICAgdG9vbGtpdChfb3B0cz86IHVua25vd24pIHtcbiAgICAgIHJldHVybiBidWlsZEdlbmllVG9vbHMob3B0cyk7XG4gICAgfSxcbiAgfTtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHN0YXJ0ZXIgc3VnZ2VzdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogRGVmYXVsdCBjYXAgb24gc3RhcnRlciBzdWdnZXN0aW9ucyBzdXJmYWNlZCB0byB0aGUgY2hhdCBlbXB0eVxuICogc3RhdGUuIFNhbXBsZS1xdWVzdGlvbiBsaXN0cyBjYW4gcnVuIGxvbmcgKDEwKyBvbiBhIGN1cmF0ZWRcbiAqIHNwYWNlKTsgYSBoYW5kZnVsIG9mIG9uZS10YXAgcHJvbXB0cyByZWFkcyBiZXR0ZXIgdGhhbiBhIHdhbGwgb2ZcbiAqIGJ1dHRvbnMuXG4gKi9cbmNvbnN0IFNVR0dFU1RJT05fTElNSVQgPSA2O1xuXG4vKipcbiAqIEhvdyBsb25nIGEgc3BhY2UncyBwYXJzZWQgc2FtcGxlIHF1ZXN0aW9ucyBzdGF5IGNhY2hlZC4gVGhleSdyZVxuICogYXV0aG9yZWQgY29uZmlnIHRoYXQgY2hhbmdlcyByYXJlbHksIGFuZCB0aGUgbG9va3VwIGlzIGFuIGV4dHJhXG4gKiBSRVNUIHJvdW5kLXRyaXAgcGVyIGNoYXQgbW91bnQsIHNvIGEgZmV3IG1pbnV0ZXMgb2YgY2FjaGluZyBrZWVwc1xuICogdGhlIGVtcHR5IHN0YXRlIGluc3RhbnQgb24gcmVsb2FkIHdpdGhvdXQgZ29pbmcgc3RhbGUgZm9yIGxvbmcuXG4gKi9cbmNvbnN0IFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TID0gMTAgKiA2MF8wMDA7XG5cbi8qKiBTcGFjZS1pZCAtPiBjYWNoZWQgc2FtcGxlIHF1ZXN0aW9ucyB3aXRoIGFuIGFic29sdXRlIGV4cGlyeS4gKi9cbmNvbnN0IF9zdWdnZXN0aW9uQ2FjaGUgPSBuZXcgTWFwPHN0cmluZywgeyBxdWVzdGlvbnM6IHN0cmluZ1tdOyBleHBpcmVzOiBudW1iZXIgfT4oKTtcblxuLyoqIFJlYWQgYSBzcGFjZSdzIGNhY2hlZCBxdWVzdGlvbnMsIG9yIGB1bmRlZmluZWRgIG9uIG1pc3MgLyBleHBpcnkuICovXG5mdW5jdGlvbiByZWFkU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQ6IHN0cmluZyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZW50cnkgPSBfc3VnZ2VzdGlvbkNhY2hlLmdldChzcGFjZUlkKTtcbiAgaWYgKCFlbnRyeSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKGVudHJ5LmV4cGlyZXMgPD0gRGF0ZS5ub3coKSkge1xuICAgIF9zdWdnZXN0aW9uQ2FjaGUuZGVsZXRlKHNwYWNlSWQpO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIGVudHJ5LnF1ZXN0aW9ucztcbn1cblxuLyoqIENhY2hlIGEgc3BhY2UncyBwYXJzZWQgcXVlc3Rpb25zIGZvciB7QGxpbmsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVN9LiAqL1xuZnVuY3Rpb24gd3JpdGVTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZDogc3RyaW5nLCBxdWVzdGlvbnM6IHN0cmluZ1tdKTogdm9pZCB7XG4gIF9zdWdnZXN0aW9uQ2FjaGUuc2V0KHNwYWNlSWQsIHtcbiAgICBxdWVzdGlvbnMsXG4gICAgZXhwaXJlczogRGF0ZS5ub3coKSArIFNVR0dFU1RJT05fQ0FDSEVfVFRMX01TLFxuICB9KTtcbn1cblxuLyoqXG4gKiBDb2xsZWN0IHRoZSBjdXJhdGVkIHN0YXJ0ZXIgcXVlc3Rpb25zIGFjcm9zcyBldmVyeSByZXNvbHZlZCBHZW5pZVxuICogc3BhY2UsIGRlZHVwZWQgYW5kIGNhcHBlZC4gRWFjaCBzcGFjZSdzIGBzYW1wbGVfcXVlc3Rpb25zYCBhcmVcbiAqIGZldGNoZWQgb25jZSAoY2FjaGVkIGZvciB7QGxpbmsgU1VHR0VTVElPTl9DQUNIRV9UVExfTVN9KSB2aWFcbiAqIHtAbGluayBnZXRHZW5pZVNwYWNlfSArIHtAbGluayBnZW5pZVNhbXBsZVF1ZXN0aW9uc30sIHRoZW4gbWVyZ2VkIGluXG4gKiBhbGlhcy1pdGVyYXRpb24gb3JkZXIgc28gYSBzaW5nbGUtc3BhY2UgYXBwIHN1cmZhY2VzIHRoYXQgc3BhY2Unc1xuICogcXVlc3Rpb25zIGFuZCBhIG11bHRpLXNwYWNlIGFwcCByb3VuZC10cmlwcyBicmVhZHRoLWZpcnN0IHVwIHRvIHRoZVxuICogY2FwLiBBIHBlci1zcGFjZSBmZXRjaCBmYWlsdXJlIGRlZ3JhZGVzIHRvIFwibm8gcXVlc3Rpb25zIGZvciB0aGF0XG4gKiBzcGFjZVwiIChsb2dnZWQsIG5vdCB0aHJvd24pIHNvIG9uZSB1bnJlYWNoYWJsZSBzcGFjZSBuZXZlciBibGFua3NcbiAqIHRoZSB3aG9sZSBsaXN0LiBSZXR1cm5zIGBbXWAgd2hlbiBubyBzcGFjZXMgYXJlIGNvbmZpZ3VyZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb2xsZWN0U3BhY2VTdWdnZXN0aW9ucyhvcHRzOiB7XG4gIHNwYWNlczogUmVjb3JkPHN0cmluZywgR2VuaWVTcGFjZUNvbmZpZz47XG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50O1xuICBzaWduYWw/OiBBYm9ydFNpZ25hbDtcbiAgbGltaXQ/OiBudW1iZXI7XG59KTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICBjb25zdCBsaW1pdCA9IG9wdHMubGltaXQgPz8gU1VHR0VTVElPTl9MSU1JVDtcbiAgY29uc3QgbWVyZ2VkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgZm9yIChjb25zdCB7IHNwYWNlSWQgfSBvZiBPYmplY3QudmFsdWVzKG9wdHMuc3BhY2VzKSkge1xuICAgIGxldCBxdWVzdGlvbnMgPSByZWFkU3VnZ2VzdGlvbkNhY2hlKHNwYWNlSWQpO1xuICAgIGlmICghcXVlc3Rpb25zKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzcGFjZSA9IGF3YWl0IGdlbmllU3BhY2UuZ2V0R2VuaWVTcGFjZShzcGFjZUlkLCB7XG4gICAgICAgICAgd29ya3NwYWNlQ2xpZW50OiBvcHRzLmNsaWVudCxcbiAgICAgICAgICAuLi4ob3B0cy5zaWduYWwgPyB7IGNvbnRleHQ6IG9wdHMuc2lnbmFsIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBxdWVzdGlvbnMgPSBnZW5pZVNwYWNlLmdlbmllU2FtcGxlUXVlc3Rpb25zKHNwYWNlKTtcbiAgICAgICAgd3JpdGVTdWdnZXN0aW9uQ2FjaGUoc3BhY2VJZCwgcXVlc3Rpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBsb2dnZXIud2FybihcInN1Z2dlc3Rpb25zOmZldGNoLWVycm9yXCIsIHtcbiAgICAgICAgICBzcGFjZUlkLFxuICAgICAgICAgIGVycm9yOiBlcnJvci5lcnJvck1lc3NhZ2UoZXJyKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHF1ZXN0aW9ucyA9IFtdO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHF1ZXN0aW9uIG9mIHF1ZXN0aW9ucykge1xuICAgICAgaWYgKHNlZW4uaGFzKHF1ZXN0aW9uKSkgY29udGludWU7XG4gICAgICBzZWVuLmFkZChxdWVzdGlvbik7XG4gICAgICBtZXJnZWQucHVzaChxdWVzdGlvbik7XG4gICAgICBpZiAobWVyZ2VkLmxlbmd0aCA+PSBsaW1pdCkgcmV0dXJuIG1lcmdlZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1lcmdlZDtcbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -31,18 +31,18 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"@databricks/appkit": "^0.60.0",
|
|
34
|
-
"@dbx-tools/appkit": "0.6.
|
|
35
|
-
"@dbx-tools/core": "0.6.
|
|
36
|
-
"@dbx-tools/databricks": "0.6.
|
|
37
|
-
"@dbx-tools/fs": "0.6.
|
|
38
|
-
"@dbx-tools/genie": "0.6.
|
|
39
|
-
"@dbx-tools/model": "0.6.
|
|
40
|
-
"@dbx-tools/path": "0.6.
|
|
41
|
-
"@dbx-tools/shared-core": "0.6.
|
|
42
|
-
"@dbx-tools/shared-fs": "0.6.
|
|
43
|
-
"@dbx-tools/shared-genie": "0.6.
|
|
44
|
-
"@dbx-tools/shared-mastra": "0.6.
|
|
45
|
-
"@dbx-tools/shared-model": "0.6.
|
|
34
|
+
"@dbx-tools/appkit": "0.6.213",
|
|
35
|
+
"@dbx-tools/core": "0.6.213",
|
|
36
|
+
"@dbx-tools/databricks": "0.6.213",
|
|
37
|
+
"@dbx-tools/fs": "0.6.213",
|
|
38
|
+
"@dbx-tools/genie": "0.6.213",
|
|
39
|
+
"@dbx-tools/model": "0.6.213",
|
|
40
|
+
"@dbx-tools/path": "0.6.213",
|
|
41
|
+
"@dbx-tools/shared-core": "0.6.213",
|
|
42
|
+
"@dbx-tools/shared-fs": "0.6.213",
|
|
43
|
+
"@dbx-tools/shared-genie": "0.6.213",
|
|
44
|
+
"@dbx-tools/shared-mastra": "0.6.213",
|
|
45
|
+
"@dbx-tools/shared-model": "0.6.213",
|
|
46
46
|
"@mastra/ai-sdk": "1.6.0",
|
|
47
47
|
"@mastra/core": "1.47.0",
|
|
48
48
|
"@mastra/express": "1.4.2",
|
|
@@ -72,7 +72,7 @@
|
|
|
72
72
|
"./package.json": "./package.json"
|
|
73
73
|
}
|
|
74
74
|
},
|
|
75
|
-
"version": "0.6.
|
|
75
|
+
"version": "0.6.213",
|
|
76
76
|
"types": "./lib/index.d.ts",
|
|
77
77
|
"type": "module",
|
|
78
78
|
"exports": {
|
package/src/config.ts
CHANGED
|
@@ -386,6 +386,13 @@ export interface MastraPluginConfig extends BasePluginConfig {
|
|
|
386
386
|
* spaces config in two places.
|
|
387
387
|
*/
|
|
388
388
|
genieSpaces?: GenieSpacesConfig;
|
|
389
|
+
/**
|
|
390
|
+
* Use the streaming Genie Agent Mode API for `ask_genie`. Defaults to `true`.
|
|
391
|
+
* Set `false` to force the legacy Conversation API polling driver. A
|
|
392
|
+
* pre-stream feature-disabled or preview-toggle response falls back
|
|
393
|
+
* automatically.
|
|
394
|
+
*/
|
|
395
|
+
genieAgentMode?: boolean;
|
|
389
396
|
/**
|
|
390
397
|
* TTL for the in-memory Genie space metadata cache, in
|
|
391
398
|
* milliseconds. Defaults to 5 minutes. The Genie agent calls
|
|
@@ -665,6 +672,11 @@ export const MASTRA_CONFIG_SCHEMA: ConfigSchema = {
|
|
|
665
672
|
description:
|
|
666
673
|
"Genie spaces the agents can delegate to, keyed by alias (the tool-name suffix). Each value is a space id or `{ spaceId, hint }`. Falls back to the `genie` plugin's own `spaces` config, then DATABRICKS_GENIE_SPACE_ID under the `default` alias.",
|
|
667
674
|
},
|
|
675
|
+
genieAgentMode: {
|
|
676
|
+
type: "boolean",
|
|
677
|
+
description:
|
|
678
|
+
"Use the streaming Genie Agent Mode API for ask_genie. Defaults to true; false forces legacy polling. Feature-disabled or preview-toggle responses fall back automatically before streaming.",
|
|
679
|
+
},
|
|
668
680
|
genieSpaceCacheTtlMs: {
|
|
669
681
|
type: "number",
|
|
670
682
|
description: "TTL in ms for the Genie space metadata cache. Defaults to 5 minutes.",
|
package/src/genie.ts
CHANGED
|
@@ -375,8 +375,13 @@ function stripSuggestedQuestions(message: GenieMessage): GenieMessage {
|
|
|
375
375
|
return { ...message, attachments: filtered };
|
|
376
376
|
}
|
|
377
377
|
|
|
378
|
-
function buildAskGenieTool(opts: {
|
|
379
|
-
|
|
378
|
+
function buildAskGenieTool(opts: {
|
|
379
|
+
spaceId: string;
|
|
380
|
+
alias: string;
|
|
381
|
+
hint?: string;
|
|
382
|
+
agentMode?: boolean;
|
|
383
|
+
}) {
|
|
384
|
+
const { spaceId, alias, hint, agentMode } = opts;
|
|
380
385
|
const toolId = `ask_genie${aliasSuffix(alias)}`;
|
|
381
386
|
const hintLine = hint ? ` (${hint})` : "";
|
|
382
387
|
return createTool({
|
|
@@ -395,16 +400,17 @@ function buildAskGenieTool(opts: { spaceId: string; alias: string; hint?: string
|
|
|
395
400
|
Do NOT try to cram a multi-part question into a single
|
|
396
401
|
call; decompose first, then ask each piece.
|
|
397
402
|
|
|
398
|
-
Returns the final \`GenieMessage\`.
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
403
|
+
Returns the final \`GenieMessage\`. Agent Mode includes the
|
|
404
|
+
synthesized answer and can include SQL result values as a
|
|
405
|
+
Markdown text attachment. A legacy polling result instead
|
|
406
|
+
carries a \`statement_id\` (at
|
|
407
|
+
\`message.query_result.statement_id\` or the first
|
|
408
|
+
attachment's \`query.statement_id\`); call
|
|
402
409
|
\`get_statement\` with that id only when you need to read
|
|
403
|
-
the underlying values to reason about them. If you just
|
|
404
|
-
|
|
405
|
-
\`[data:<statement_id>]\` marker in
|
|
406
|
-
|
|
407
|
-
events (status, thinking, sql) stream to the user
|
|
410
|
+
the underlying values to reason about them. If you just want
|
|
411
|
+
to display a legacy result, embed a
|
|
412
|
+
\`[data:<statement_id>]\` marker in prose. Wire events
|
|
413
|
+
(status, reasoning, SQL, query output, answer text) stream
|
|
408
414
|
automatically while the call is in flight.
|
|
409
415
|
`),
|
|
410
416
|
inputSchema: z.object({
|
|
@@ -475,6 +481,7 @@ function buildAskGenieTool(opts: { spaceId: string; alias: string; hint?: string
|
|
|
475
481
|
let finalMessage: GenieMessage | undefined;
|
|
476
482
|
for await (const event of chat.genieEventChat(spaceId, question, {
|
|
477
483
|
workspaceClient: client,
|
|
484
|
+
...(agentMode !== undefined ? { agentMode } : {}),
|
|
478
485
|
...(seedConversationId ? { conversationId: seedConversationId } : {}),
|
|
479
486
|
...(signal ? { context: signal } : {}),
|
|
480
487
|
})) {
|
|
@@ -815,8 +822,10 @@ export const GENIE_INSTRUCTIONS = string.toDescription([
|
|
|
815
822
|
`,
|
|
816
823
|
`
|
|
817
824
|
Each \`ask_genie\` call returns the terminal \`GenieMessage\`.
|
|
818
|
-
|
|
819
|
-
|
|
825
|
+
Read Agent Mode's synthesized answer and Markdown query output
|
|
826
|
+
directly from its text attachments. A legacy polling result may
|
|
827
|
+
instead expose a \`statement_id\` at
|
|
828
|
+
\`message.query_result.statement_id\` (or the first
|
|
820
829
|
attachment's \`query.statement_id\`).
|
|
821
830
|
`,
|
|
822
831
|
[
|
|
@@ -1021,6 +1030,9 @@ export function buildGenieTools(opts: {
|
|
|
1021
1030
|
const askTool = buildAskGenieTool({
|
|
1022
1031
|
spaceId: space.spaceId,
|
|
1023
1032
|
alias,
|
|
1033
|
+
...(opts.config.genieAgentMode !== undefined
|
|
1034
|
+
? { agentMode: opts.config.genieAgentMode }
|
|
1035
|
+
: {}),
|
|
1024
1036
|
...(space.hint ? { hint: space.hint } : {}),
|
|
1025
1037
|
});
|
|
1026
1038
|
const descTool = buildSpaceDescriptionTool({ spaceId: space.spaceId, alias });
|