@k8slens/ai-tools-contracts 1.0.0
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/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +642 -0
- package/dist/src/ai-tool-configuration.d.ts +51 -0
- package/dist/src/ai-tool-configuration.d.ts.map +1 -0
- package/dist/src/ai-tool-description.d.ts +25 -0
- package/dist/src/ai-tool-description.d.ts.map +1 -0
- package/dist/src/ai-tool-detection.d.ts +20 -0
- package/dist/src/ai-tool-detection.d.ts.map +1 -0
- package/dist/src/ai-tool-display-name.d.ts +18 -0
- package/dist/src/ai-tool-display-name.d.ts.map +1 -0
- package/dist/src/ai-tool-icon.d.ts +577 -0
- package/dist/src/ai-tool-icon.d.ts.map +1 -0
- package/dist/src/ai-tool-injection-token.d.ts +10 -0
- package/dist/src/ai-tool-injection-token.d.ts.map +1 -0
- package/dist/src/ai-tool-installation-instructions.d.ts +20 -0
- package/dist/src/ai-tool-installation-instructions.d.ts.map +1 -0
- package/dist/src/ai-tool-installed-via-cli-command.d.ts +17 -0
- package/dist/src/ai-tool-installed-via-cli-command.d.ts.map +1 -0
- package/dist/src/ai-tool-instructions-filename.d.ts +20 -0
- package/dist/src/ai-tool-instructions-filename.d.ts.map +1 -0
- package/dist/src/ai-tool-instructions-filenames.d.ts +13 -0
- package/dist/src/ai-tool-instructions-filenames.d.ts.map +1 -0
- package/dist/src/ai-tool-is-configured.d.ts +17 -0
- package/dist/src/ai-tool-is-configured.d.ts.map +1 -0
- package/dist/src/ai-tool-name.d.ts +17 -0
- package/dist/src/ai-tool-name.d.ts.map +1 -0
- package/dist/src/ai-tool-order-number.d.ts +16 -0
- package/dist/src/ai-tool-order-number.d.ts.map +1 -0
- package/dist/src/ai-tool-selection-row.d.ts +18 -0
- package/dist/src/ai-tool-selection-row.d.ts.map +1 -0
- package/dist/src/ai-tool-settings.d.ts +18 -0
- package/dist/src/ai-tool-settings.d.ts.map +1 -0
- package/dist/src/ai-tool-top-bar-menu.d.ts +46 -0
- package/dist/src/ai-tool-top-bar-menu.d.ts.map +1 -0
- package/dist/src/ai-tool.d.ts +64 -0
- package/dist/src/ai-tool.d.ts.map +1 -0
- package/dist/src/ai-tools-injection-token.d.ts +12 -0
- package/dist/src/ai-tools-injection-token.d.ts.map +1 -0
- package/dist/src/ai-tools-open-externally.d.ts +17 -0
- package/dist/src/ai-tools-open-externally.d.ts.map +1 -0
- package/dist/src/build-external-terminal-command.d.ts +33 -0
- package/dist/src/build-external-terminal-command.d.ts.map +1 -0
- package/dist/src/current-shell-family.d.ts +13 -0
- package/dist/src/current-shell-family.d.ts.map +1 -0
- package/dist/src/default-ai-tool-icon.d.ts +8 -0
- package/dist/src/default-ai-tool-icon.d.ts.map +1 -0
- package/dist/src/detected-ai-tools.d.ts +15 -0
- package/dist/src/detected-ai-tools.d.ts.map +1 -0
- package/dist/src/get-ai-command-for-terminal.d.ts +17 -0
- package/dist/src/get-ai-command-for-terminal.d.ts.map +1 -0
- package/dist/src/get-ai-tool-injectable-bunch.d.ts +534 -0
- package/dist/src/get-ai-tool-injectable-bunch.d.ts.map +1 -0
- package/dist/src/get-ai-tool-is-installed-cli-command.d.ts +20 -0
- package/dist/src/get-ai-tool-is-installed-cli-command.d.ts.map +1 -0
- package/dist/src/get-open-tool-in-external-terminal-for-tool.d.ts +17 -0
- package/dist/src/get-open-tool-in-external-terminal-for-tool.d.ts.map +1 -0
- package/dist/src/get-resume-ai-command-for-terminal.d.ts +23 -0
- package/dist/src/get-resume-ai-command-for-terminal.d.ts.map +1 -0
- package/dist/src/operating-system-specific.d.ts +16 -0
- package/dist/src/operating-system-specific.d.ts.map +1 -0
- package/dist/src/os-and-shell-specific.d.ts +133 -0
- package/dist/src/os-and-shell-specific.d.ts.map +1 -0
- package/dist/src/resolve-llm-command.d.ts +16 -0
- package/dist/src/resolve-llm-command.d.ts.map +1 -0
- package/dist/src/selected-ai-tool-injection-tokens.d.ts +363 -0
- package/dist/src/selected-ai-tool-injection-tokens.d.ts.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +63 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,642 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// index.ts
|
|
31
|
+
var index_exports = {};
|
|
32
|
+
__export(index_exports, {
|
|
33
|
+
AiToolSelectionRow: () => AiToolSelectionRow,
|
|
34
|
+
DefaultAiToolIcon: () => DefaultAiToolIcon,
|
|
35
|
+
agentsInstructionsFilename: () => agentsInstructionsFilename,
|
|
36
|
+
agentsInstructionsIndirectionContents: () => agentsInstructionsIndirectionContents,
|
|
37
|
+
aiToolConfigurationMenuKind: () => aiToolConfigurationMenuKind,
|
|
38
|
+
aiToolConfigurationStateInjectionToken: () => aiToolConfigurationStateInjectionToken,
|
|
39
|
+
aiToolDescriptionInjectionToken: () => aiToolDescriptionInjectionToken,
|
|
40
|
+
aiToolDisplayNameInjectionToken: () => aiToolDisplayNameInjectionToken,
|
|
41
|
+
aiToolIconForKindInjectionToken: () => aiToolIconForKindInjectionToken,
|
|
42
|
+
aiToolIconInjectionToken: () => aiToolIconInjectionToken,
|
|
43
|
+
aiToolInjectionToken: () => aiToolInjectionToken,
|
|
44
|
+
aiToolInstallationInstructionsInjectionToken: () => aiToolInstallationInstructionsInjectionToken,
|
|
45
|
+
aiToolInstalledViaCliCommandInjectionToken: () => aiToolInstalledViaCliCommandInjectionToken,
|
|
46
|
+
aiToolInstructionsFilenameInjectionToken: () => aiToolInstructionsFilenameInjectionToken,
|
|
47
|
+
aiToolInstructionsIndirectionFilenamesInjectionToken: () => aiToolInstructionsIndirectionFilenamesInjectionToken,
|
|
48
|
+
aiToolIsConfiguredForKindInjectionToken: () => aiToolIsConfiguredForKindInjectionToken,
|
|
49
|
+
aiToolIsConfiguredInjectionToken: () => aiToolIsConfiguredInjectionToken,
|
|
50
|
+
aiToolNameInjectionToken: () => aiToolNameInjectionToken,
|
|
51
|
+
aiToolOrderNumberInjectionToken: () => aiToolOrderNumberInjectionToken,
|
|
52
|
+
aiToolSettingsInjectionToken: () => aiToolSettingsInjectionToken,
|
|
53
|
+
aiToolTopBarMenuKind: () => aiToolTopBarMenuKind,
|
|
54
|
+
aiToolTopBarMenuOrderNumbers: () => aiToolTopBarMenuOrderNumbers,
|
|
55
|
+
aiToolsInjectionToken: () => aiToolsInjectionToken,
|
|
56
|
+
aiToolsOpenExternallyInjectionToken: () => aiToolsOpenExternallyInjectionToken,
|
|
57
|
+
currentShellFamilyInjectionToken: () => currentShellFamilyInjectionToken,
|
|
58
|
+
customAiToolKind: () => customAiToolKind,
|
|
59
|
+
detectedAiToolsInjectionToken: () => detectedAiToolsInjectionToken,
|
|
60
|
+
effectiveAiToolDisplayNameInjectionToken: () => effectiveAiToolDisplayNameInjectionToken,
|
|
61
|
+
effectiveAiToolIconInjectionToken: () => effectiveAiToolIconInjectionToken,
|
|
62
|
+
effectiveAiToolKindInjectionToken: () => effectiveAiToolKindInjectionToken,
|
|
63
|
+
effectiveAiToolNameInjectionToken: () => effectiveAiToolNameInjectionToken,
|
|
64
|
+
externalTerminalCommandBuilderInjectionToken: () => externalTerminalCommandBuilderInjectionToken,
|
|
65
|
+
getAiCommandForTerminalInjectionToken: () => getAiCommandForTerminalInjectionToken,
|
|
66
|
+
getAiToolInjectableBunch: () => getAiToolInjectableBunch,
|
|
67
|
+
getAiToolIsInstalledCliCommandInjectionToken: () => getAiToolIsInstalledCliCommandInjectionToken,
|
|
68
|
+
getOpenToolInExternalTerminalForToolInjectionToken: () => getOpenToolInExternalTerminalForToolInjectionToken,
|
|
69
|
+
getOsAndShellAwareInjectable: () => getOsAndShellAwareInjectable,
|
|
70
|
+
getResumeAiCommandForTerminalInjectionToken: () => getResumeAiCommandForTerminalInjectionToken,
|
|
71
|
+
noAiToolKind: () => noAiToolKind,
|
|
72
|
+
refreshAiToolDetectionInjectionToken: () => refreshAiToolDetectionInjectionToken,
|
|
73
|
+
resolveLlmCommand: () => resolveLlmCommand,
|
|
74
|
+
selectedAiToolCommandInjectionToken: () => selectedAiToolCommandInjectionToken,
|
|
75
|
+
selectedAiToolKindInjectionToken: () => selectedAiToolKindInjectionToken,
|
|
76
|
+
selectedAiToolOpenInExternalTerminalCommandInjectionToken: () => selectedAiToolOpenInExternalTerminalCommandInjectionToken,
|
|
77
|
+
selectedAiToolResumeCommandInjectionToken: () => selectedAiToolResumeCommandInjectionToken,
|
|
78
|
+
shellQuote: () => import_public_utilities2.shellQuote,
|
|
79
|
+
windowsShellQuote: () => import_public_utilities2.windowsShellQuote
|
|
80
|
+
});
|
|
81
|
+
module.exports = __toCommonJS(index_exports);
|
|
82
|
+
|
|
83
|
+
// src/ai-tool.ts
|
|
84
|
+
var customAiToolKind = "custom";
|
|
85
|
+
var noAiToolKind = "none";
|
|
86
|
+
var agentsInstructionsFilename = "AGENTS.md";
|
|
87
|
+
var agentsInstructionsIndirectionContents = `@${agentsInstructionsFilename}
|
|
88
|
+
`;
|
|
89
|
+
|
|
90
|
+
// src/ai-tool-is-configured.ts
|
|
91
|
+
var import_injectable = require("@k8slens/injectable");
|
|
92
|
+
var aiToolIsConfiguredInjectionToken = (0, import_injectable.getInjectionToken2)({
|
|
93
|
+
id: "ai-tool-is-configured",
|
|
94
|
+
cardinality: "one"
|
|
95
|
+
})();
|
|
96
|
+
|
|
97
|
+
// src/os-and-shell-specific.ts
|
|
98
|
+
var import_platform_specific_injectables = require("@k8slens/platform-specific-injectables");
|
|
99
|
+
var isFunction = (value) => typeof value === "function";
|
|
100
|
+
var isShellSpecific = (value) => "posix" in value;
|
|
101
|
+
var sameForEveryShell = (value) => ({
|
|
102
|
+
posix: () => value,
|
|
103
|
+
fish: () => value,
|
|
104
|
+
cmd: () => value,
|
|
105
|
+
powershell: () => value
|
|
106
|
+
});
|
|
107
|
+
var perShellProducers = (value) => ({
|
|
108
|
+
posix: () => value.posix,
|
|
109
|
+
fish: () => value.fish,
|
|
110
|
+
cmd: () => value.cmd,
|
|
111
|
+
powershell: () => value.powershell
|
|
112
|
+
});
|
|
113
|
+
var getOsAndShellAwareInjectable = (args) => {
|
|
114
|
+
const { id, injectionToken, value } = args;
|
|
115
|
+
if (isFunction(value)) {
|
|
116
|
+
return (0, import_platform_specific_injectables.getInjectableForShells)({ id, injectionToken, instantiate: sameForEveryShell(value) });
|
|
117
|
+
}
|
|
118
|
+
if (isShellSpecific(value)) {
|
|
119
|
+
return (0, import_platform_specific_injectables.getInjectableForShells)({ id, injectionToken, instantiate: perShellProducers(value) });
|
|
120
|
+
}
|
|
121
|
+
const perOperatingSystem = (osValue) => isFunction(osValue) ? sameForEveryShell(osValue) : perShellProducers(osValue);
|
|
122
|
+
return (0, import_platform_specific_injectables.getInjectableForOperatingSystemsAndShells)({
|
|
123
|
+
id,
|
|
124
|
+
injectionToken,
|
|
125
|
+
instantiate: {
|
|
126
|
+
macos: perOperatingSystem(value.macos),
|
|
127
|
+
windows: perOperatingSystem(value.windows),
|
|
128
|
+
linux: perOperatingSystem(value.linux)
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// src/current-shell-family.ts
|
|
134
|
+
var import_injectable2 = require("@k8slens/injectable");
|
|
135
|
+
var currentShellFamilyInjectionToken = (0, import_injectable2.getInjectionToken2)({
|
|
136
|
+
id: "current-shell-family",
|
|
137
|
+
cardinality: "one"
|
|
138
|
+
})();
|
|
139
|
+
|
|
140
|
+
// src/ai-tool-injection-token.ts
|
|
141
|
+
var import_injectable3 = require("@k8slens/injectable");
|
|
142
|
+
var aiToolInjectionToken = (0, import_injectable3.getInjectionToken2)({
|
|
143
|
+
id: "ai-tool",
|
|
144
|
+
cardinality: "zero-or-many"
|
|
145
|
+
})();
|
|
146
|
+
|
|
147
|
+
// src/get-ai-command-for-terminal.ts
|
|
148
|
+
var import_injectable4 = require("@k8slens/injectable");
|
|
149
|
+
var getAiCommandForTerminalInjectionToken = (0, import_injectable4.getInjectionToken2)({
|
|
150
|
+
id: "get-ai-command-for-terminal",
|
|
151
|
+
cardinality: "zero-or-many"
|
|
152
|
+
})(
|
|
153
|
+
(kind) => (0, import_injectable4.getInjectionToken2)({
|
|
154
|
+
id: `get-ai-command-for-terminal-${kind}`,
|
|
155
|
+
speciality: kind,
|
|
156
|
+
cardinality: "zero-or-many"
|
|
157
|
+
})()
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
// src/get-resume-ai-command-for-terminal.ts
|
|
161
|
+
var import_injectable5 = require("@k8slens/injectable");
|
|
162
|
+
var getResumeAiCommandForTerminalInjectionToken = (0, import_injectable5.getInjectionToken2)({
|
|
163
|
+
id: "get-resume-ai-command-for-terminal",
|
|
164
|
+
cardinality: "zero-or-many"
|
|
165
|
+
})(
|
|
166
|
+
(kind) => (0, import_injectable5.getInjectionToken2)({
|
|
167
|
+
id: `get-resume-ai-command-for-terminal-${kind}`,
|
|
168
|
+
speciality: kind,
|
|
169
|
+
cardinality: "zero-or-many"
|
|
170
|
+
})()
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
// src/ai-tool-installed-via-cli-command.ts
|
|
174
|
+
var import_injectable6 = require("@k8slens/injectable");
|
|
175
|
+
var aiToolInstalledViaCliCommandInjectionToken = (0, import_injectable6.getInjectionToken2)({
|
|
176
|
+
id: "ai-tool-installed-via-cli-command",
|
|
177
|
+
cardinality: "one"
|
|
178
|
+
})();
|
|
179
|
+
|
|
180
|
+
// src/ai-tool-detection.ts
|
|
181
|
+
var import_injectable7 = require("@k8slens/injectable");
|
|
182
|
+
var refreshAiToolDetectionInjectionToken = (0, import_injectable7.getInjectionToken2)(
|
|
183
|
+
{
|
|
184
|
+
id: "refresh-ai-tool-detection",
|
|
185
|
+
cardinality: "one"
|
|
186
|
+
}
|
|
187
|
+
)();
|
|
188
|
+
|
|
189
|
+
// src/ai-tool-name.ts
|
|
190
|
+
var import_injectable8 = require("@k8slens/injectable");
|
|
191
|
+
var aiToolNameInjectionToken = (0, import_injectable8.getInjectionToken2)({
|
|
192
|
+
id: "ai-tool-name",
|
|
193
|
+
cardinality: "zero-or-many"
|
|
194
|
+
})(
|
|
195
|
+
(kind) => (0, import_injectable8.getInjectionToken2)({
|
|
196
|
+
id: `ai-tool-name-${kind}`,
|
|
197
|
+
speciality: kind,
|
|
198
|
+
cardinality: "one"
|
|
199
|
+
})()
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
// src/ai-tool-display-name.ts
|
|
203
|
+
var import_injectable9 = require("@k8slens/injectable");
|
|
204
|
+
var aiToolDisplayNameInjectionToken = (0, import_injectable9.getInjectionToken2)({
|
|
205
|
+
id: "ai-tool-display-name",
|
|
206
|
+
cardinality: "zero-or-many"
|
|
207
|
+
})(
|
|
208
|
+
(kind) => (0, import_injectable9.getInjectionToken2)({
|
|
209
|
+
id: `ai-tool-display-name-${kind}`,
|
|
210
|
+
speciality: kind,
|
|
211
|
+
cardinality: "one"
|
|
212
|
+
})()
|
|
213
|
+
);
|
|
214
|
+
|
|
215
|
+
// src/ai-tool-description.ts
|
|
216
|
+
var import_injectable10 = require("@k8slens/injectable");
|
|
217
|
+
var aiToolDescriptionInjectionToken = (0, import_injectable10.getInjectionToken2)({
|
|
218
|
+
id: "ai-tool-description",
|
|
219
|
+
cardinality: "zero-or-many"
|
|
220
|
+
})(
|
|
221
|
+
(kind) => (0, import_injectable10.getInjectionToken2)({
|
|
222
|
+
id: `ai-tool-description-${kind}`,
|
|
223
|
+
speciality: kind,
|
|
224
|
+
cardinality: "one"
|
|
225
|
+
})()
|
|
226
|
+
);
|
|
227
|
+
|
|
228
|
+
// src/ai-tool-icon.ts
|
|
229
|
+
var import_injectable11 = require("@k8slens/injectable");
|
|
230
|
+
var aiToolIconInjectionToken = (0, import_injectable11.getInjectionToken2)({
|
|
231
|
+
id: "ai-tool-icon",
|
|
232
|
+
cardinality: "zero-or-many"
|
|
233
|
+
})(
|
|
234
|
+
(kind) => (0, import_injectable11.getInjectionToken2)({
|
|
235
|
+
id: `ai-tool-icon-${kind}`,
|
|
236
|
+
speciality: kind,
|
|
237
|
+
cardinality: "one"
|
|
238
|
+
})()
|
|
239
|
+
);
|
|
240
|
+
var aiToolIconForKindInjectionToken = (0, import_injectable11.getInjectionToken2)({
|
|
241
|
+
id: "ai-tool-icon-for-kind",
|
|
242
|
+
cardinality: "one"
|
|
243
|
+
})();
|
|
244
|
+
|
|
245
|
+
// src/default-ai-tool-icon.tsx
|
|
246
|
+
var import_element_components = require("@k8slens/element-components");
|
|
247
|
+
var import_jsx_runtime = require("react/jsx-runtime");
|
|
248
|
+
var DefaultAiToolIcon = (props) => /* @__PURE__ */ (0, import_jsx_runtime.jsx)(import_element_components.Svg, { ...props, viewBox: "0 0 24 24", fill: "currentColor", children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("path", { d: "M3 3a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V5a2 2 0 0 0-2-2H3zm0 2h18v14H3V5zm3.5 2.5L5 9l2 2-2 2 1.5 1.5L11 11 6.5 7.5zM12 14h5v2h-5v-2z" }) });
|
|
249
|
+
|
|
250
|
+
// src/ai-tool-order-number.ts
|
|
251
|
+
var import_injectable12 = require("@k8slens/injectable");
|
|
252
|
+
var aiToolOrderNumberInjectionToken = (0, import_injectable12.getInjectionToken2)({
|
|
253
|
+
id: "ai-tool-order-number",
|
|
254
|
+
cardinality: "zero-or-many"
|
|
255
|
+
})(
|
|
256
|
+
(kind) => (0, import_injectable12.getInjectionToken2)({
|
|
257
|
+
id: `ai-tool-order-number-${kind}`,
|
|
258
|
+
speciality: kind,
|
|
259
|
+
cardinality: "one"
|
|
260
|
+
})()
|
|
261
|
+
);
|
|
262
|
+
|
|
263
|
+
// src/ai-tool-settings.ts
|
|
264
|
+
var import_injectable13 = require("@k8slens/injectable");
|
|
265
|
+
var aiToolSettingsInjectionToken = (0, import_injectable13.getInjectionToken2)({
|
|
266
|
+
id: "ai-tool-settings",
|
|
267
|
+
cardinality: "zero-or-many"
|
|
268
|
+
})(
|
|
269
|
+
(kind) => (0, import_injectable13.getInjectionToken2)({
|
|
270
|
+
id: `ai-tool-settings-${kind}`,
|
|
271
|
+
speciality: kind,
|
|
272
|
+
cardinality: "one"
|
|
273
|
+
})()
|
|
274
|
+
);
|
|
275
|
+
|
|
276
|
+
// src/ai-tool-installation-instructions.ts
|
|
277
|
+
var import_injectable14 = require("@k8slens/injectable");
|
|
278
|
+
var aiToolInstallationInstructionsInjectionToken = (0, import_injectable14.getInjectionToken2)({
|
|
279
|
+
id: "ai-tool-installation-instructions",
|
|
280
|
+
cardinality: "zero-or-many"
|
|
281
|
+
})(
|
|
282
|
+
(kind) => (0, import_injectable14.getInjectionToken2)({
|
|
283
|
+
id: `ai-tool-installation-instructions-${kind}`,
|
|
284
|
+
speciality: kind,
|
|
285
|
+
cardinality: "one"
|
|
286
|
+
})()
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
// src/ai-tool-instructions-filename.ts
|
|
290
|
+
var import_injectable15 = require("@k8slens/injectable");
|
|
291
|
+
var aiToolInstructionsFilenameInjectionToken = (0, import_injectable15.getInjectionToken2)({
|
|
292
|
+
id: "ai-tool-instructions-filename",
|
|
293
|
+
cardinality: "zero-or-many"
|
|
294
|
+
})(
|
|
295
|
+
(kind) => (0, import_injectable15.getInjectionToken2)({
|
|
296
|
+
id: `ai-tool-instructions-filename-${kind}`,
|
|
297
|
+
speciality: kind,
|
|
298
|
+
cardinality: "one"
|
|
299
|
+
})()
|
|
300
|
+
);
|
|
301
|
+
|
|
302
|
+
// src/ai-tool-instructions-filenames.ts
|
|
303
|
+
var import_injectable16 = require("@k8slens/injectable");
|
|
304
|
+
var aiToolInstructionsIndirectionFilenamesInjectionToken = (0, import_injectable16.getInjectionToken2)({
|
|
305
|
+
id: "ai-tool-instructions-indirection-filenames",
|
|
306
|
+
cardinality: "one"
|
|
307
|
+
})();
|
|
308
|
+
|
|
309
|
+
// src/resolve-llm-command.ts
|
|
310
|
+
var import_public_utilities = require("@k8slens/public-utilities");
|
|
311
|
+
var promptPlaceholder = "{prompt}";
|
|
312
|
+
var dirPlaceholder = "{dir}";
|
|
313
|
+
var escapeForRegex = (value) => value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
314
|
+
var substitute = (template, placeholder, value) => {
|
|
315
|
+
if (value !== void 0 && value !== "") {
|
|
316
|
+
return template.split(placeholder).join((0, import_public_utilities.shellQuote)(value));
|
|
317
|
+
}
|
|
318
|
+
const stripPattern = new RegExp(`\\s*${escapeForRegex(placeholder)}`, "g");
|
|
319
|
+
return template.replace(stripPattern, "");
|
|
320
|
+
};
|
|
321
|
+
var resolveLlmCommand = (template, { prompt, dir } = {}) => {
|
|
322
|
+
let resolved = substitute(template, dirPlaceholder, dir);
|
|
323
|
+
resolved = substitute(resolved, promptPlaceholder, prompt);
|
|
324
|
+
return resolved;
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
// index.ts
|
|
328
|
+
var import_public_utilities2 = require("@k8slens/public-utilities");
|
|
329
|
+
|
|
330
|
+
// src/build-external-terminal-command.ts
|
|
331
|
+
var import_injectable17 = require("@k8slens/injectable");
|
|
332
|
+
var externalTerminalCommandBuilderInjectionToken = (0, import_injectable17.getInjectionToken2)({
|
|
333
|
+
id: "external-terminal-command-builder",
|
|
334
|
+
cardinality: "one"
|
|
335
|
+
})();
|
|
336
|
+
|
|
337
|
+
// src/get-open-tool-in-external-terminal-for-tool.ts
|
|
338
|
+
var import_injectable18 = require("@k8slens/injectable");
|
|
339
|
+
var getOpenToolInExternalTerminalForToolInjectionToken = (0, import_injectable18.getInjectionToken2)({
|
|
340
|
+
id: "open-tool-in-external-terminal-for-tool",
|
|
341
|
+
cardinality: "zero-or-many"
|
|
342
|
+
})(
|
|
343
|
+
(kind) => (0, import_injectable18.getInjectionToken2)({
|
|
344
|
+
id: `open-tool-in-external-terminal-for-tool-${kind}`,
|
|
345
|
+
speciality: kind,
|
|
346
|
+
cardinality: "zero-or-many"
|
|
347
|
+
})()
|
|
348
|
+
);
|
|
349
|
+
|
|
350
|
+
// src/get-ai-tool-is-installed-cli-command.ts
|
|
351
|
+
var import_injectable19 = require("@k8slens/injectable");
|
|
352
|
+
var getAiToolIsInstalledCliCommandInjectionToken = (0, import_injectable19.getInjectionToken2)({
|
|
353
|
+
id: "ai-tool-is-installed-cli-command",
|
|
354
|
+
cardinality: "zero-or-many"
|
|
355
|
+
})(
|
|
356
|
+
(kind) => (0, import_injectable19.getInjectionToken2)({
|
|
357
|
+
id: `ai-tool-is-installed-cli-command-${kind}`,
|
|
358
|
+
speciality: kind,
|
|
359
|
+
cardinality: "zero-or-many"
|
|
360
|
+
})()
|
|
361
|
+
);
|
|
362
|
+
|
|
363
|
+
// src/ai-tools-open-externally.ts
|
|
364
|
+
var import_injectable20 = require("@k8slens/injectable");
|
|
365
|
+
var aiToolsOpenExternallyInjectionToken = (0, import_injectable20.getInjectionToken2)({
|
|
366
|
+
id: "ai-tools-open-externally",
|
|
367
|
+
cardinality: "one"
|
|
368
|
+
})();
|
|
369
|
+
|
|
370
|
+
// src/get-ai-tool-injectable-bunch.ts
|
|
371
|
+
var import_injectable22 = require("@k8slens/injectable");
|
|
372
|
+
var import_drop_down_menu_contracts2 = require("@k8slens/drop-down-menu-contracts");
|
|
373
|
+
var import_mobx = require("mobx");
|
|
374
|
+
var import_react = __toESM(require("react"));
|
|
375
|
+
|
|
376
|
+
// src/ai-tool-selection-row.ts
|
|
377
|
+
var import_injectable_react = require("@k8slens/injectable-react");
|
|
378
|
+
var AiToolSelectionRow = (0, import_injectable_react.getInjectionTokenComponent2)({
|
|
379
|
+
id: "ai-tool-selection-row"
|
|
380
|
+
})();
|
|
381
|
+
|
|
382
|
+
// src/ai-tool-top-bar-menu.ts
|
|
383
|
+
var import_drop_down_menu_contracts = require("@k8slens/drop-down-menu-contracts");
|
|
384
|
+
var aiToolTopBarMenuKind = (0, import_drop_down_menu_contracts.getDropDownMenuKind)()("ai-tool-top-bar-menu");
|
|
385
|
+
var aiToolTopBarMenuOrderNumbers = {
|
|
386
|
+
/** The heading above the selection rows. */
|
|
387
|
+
aiToolsHeader: 100,
|
|
388
|
+
/** The scanning indicator shown while the first detection has not settled. */
|
|
389
|
+
detectionPending: 200,
|
|
390
|
+
/** The first order number of the band holding the rows of installed tools. */
|
|
391
|
+
installedAiToolBand: 300,
|
|
392
|
+
/** The first order number of the band holding the rows of not-installed tools. */
|
|
393
|
+
notInstalledAiToolBand: 400,
|
|
394
|
+
/** How wide each selection band is, and so how far a tool's own number may reach. */
|
|
395
|
+
bandWidth: 100,
|
|
396
|
+
/** The first order number past the whole selection section. */
|
|
397
|
+
sectionEnd: 500
|
|
398
|
+
};
|
|
399
|
+
|
|
400
|
+
// src/detected-ai-tools.ts
|
|
401
|
+
var import_injectable21 = require("@k8slens/injectable");
|
|
402
|
+
var detectedAiToolsInjectionToken = (0, import_injectable21.getInjectionToken2)({
|
|
403
|
+
id: "detected-ai-tools",
|
|
404
|
+
cardinality: "one"
|
|
405
|
+
})();
|
|
406
|
+
|
|
407
|
+
// src/get-ai-tool-injectable-bunch.ts
|
|
408
|
+
var detectedInstallState = (detectedAiTools, kind) => {
|
|
409
|
+
var _a;
|
|
410
|
+
return (_a = detectedAiTools.get().find((tool) => tool.kind === kind)) == null ? void 0 : _a.isInstalled;
|
|
411
|
+
};
|
|
412
|
+
var inSelectionBand = (band, toolOrderNumber) => band + Math.max(0, Math.min(toolOrderNumber, aiToolTopBarMenuOrderNumbers.bandWidth - 1));
|
|
413
|
+
var getAiToolInjectableBunch = (params) => {
|
|
414
|
+
const displayName = params.name ?? params.kind;
|
|
415
|
+
const NameComponent = params.Name ?? (() => import_react.default.createElement(import_react.default.Fragment, null, displayName));
|
|
416
|
+
const DescriptionComponent = params.Description ?? (() => null);
|
|
417
|
+
const IconComponent = params.Icon ?? DefaultAiToolIcon;
|
|
418
|
+
const SelectionRowComponent = () => import_react.default.createElement(AiToolSelectionRow, { kind: params.kind });
|
|
419
|
+
const SettingsComponent = params.Settings ?? (() => null);
|
|
420
|
+
const InstallationInstructionsComponent = params.InstallationInstructions ?? (() => null);
|
|
421
|
+
return (0, import_injectable22.getInjectableBunch)({
|
|
422
|
+
aiTool: (0, import_injectable22.getInjectable2)({
|
|
423
|
+
id: `ai-tool-${params.kind}`,
|
|
424
|
+
instantiate: () => () => params.kind,
|
|
425
|
+
injectionToken: aiToolInjectionToken
|
|
426
|
+
}),
|
|
427
|
+
orderNumber: (0, import_injectable22.getInjectable2)({
|
|
428
|
+
id: `ai-tool-order-number-${params.kind}`,
|
|
429
|
+
instantiate: () => () => params.orderNumber,
|
|
430
|
+
injectionToken: aiToolOrderNumberInjectionToken.for(params.kind)
|
|
431
|
+
}),
|
|
432
|
+
getCliCommand: getOsAndShellAwareInjectable({
|
|
433
|
+
id: `get-ai-command-for-terminal-${params.kind}`,
|
|
434
|
+
injectionToken: getAiCommandForTerminalInjectionToken.for(params.kind),
|
|
435
|
+
value: params.getCliCommand
|
|
436
|
+
}),
|
|
437
|
+
getResumeCliCommand: getOsAndShellAwareInjectable({
|
|
438
|
+
id: `get-resume-ai-command-for-terminal-${params.kind}`,
|
|
439
|
+
injectionToken: getResumeAiCommandForTerminalInjectionToken.for(params.kind),
|
|
440
|
+
value: params.getResumeCliCommand
|
|
441
|
+
}),
|
|
442
|
+
getOpenToolInExternalTerminalCliCommand: getOsAndShellAwareInjectable({
|
|
443
|
+
id: `open-tool-in-external-terminal-for-tool-${params.kind}`,
|
|
444
|
+
injectionToken: getOpenToolInExternalTerminalForToolInjectionToken.for(params.kind),
|
|
445
|
+
value: params.getOpenToolInExternalTerminalCliCommand
|
|
446
|
+
}),
|
|
447
|
+
name: (0, import_injectable22.getInjectable2)({
|
|
448
|
+
id: `ai-tool-name-${params.kind}`,
|
|
449
|
+
instantiate: () => () => NameComponent,
|
|
450
|
+
injectionToken: aiToolNameInjectionToken.for(params.kind)
|
|
451
|
+
}),
|
|
452
|
+
displayName: (0, import_injectable22.getInjectable2)({
|
|
453
|
+
id: `ai-tool-display-name-${params.kind}`,
|
|
454
|
+
instantiate: () => () => displayName,
|
|
455
|
+
injectionToken: aiToolDisplayNameInjectionToken.for(params.kind)
|
|
456
|
+
}),
|
|
457
|
+
description: (0, import_injectable22.getInjectable2)({
|
|
458
|
+
id: `ai-tool-description-${params.kind}`,
|
|
459
|
+
instantiate: () => () => DescriptionComponent,
|
|
460
|
+
injectionToken: aiToolDescriptionInjectionToken.for(params.kind)
|
|
461
|
+
}),
|
|
462
|
+
icon: (0, import_injectable22.getInjectable2)({
|
|
463
|
+
id: `ai-tool-icon-${params.kind}`,
|
|
464
|
+
instantiate: () => () => IconComponent,
|
|
465
|
+
injectionToken: aiToolIconInjectionToken.for(params.kind)
|
|
466
|
+
}),
|
|
467
|
+
settings: (0, import_injectable22.getInjectable2)({
|
|
468
|
+
id: `ai-tool-settings-${params.kind}`,
|
|
469
|
+
instantiate: () => () => SettingsComponent,
|
|
470
|
+
injectionToken: aiToolSettingsInjectionToken.for(params.kind)
|
|
471
|
+
}),
|
|
472
|
+
installationInstructions: (0, import_injectable22.getInjectable2)({
|
|
473
|
+
id: `ai-tool-installation-instructions-${params.kind}`,
|
|
474
|
+
instantiate: () => () => InstallationInstructionsComponent,
|
|
475
|
+
injectionToken: aiToolInstallationInstructionsInjectionToken.for(params.kind)
|
|
476
|
+
}),
|
|
477
|
+
instructionsFilename: (0, import_injectable22.getInjectable2)({
|
|
478
|
+
id: `ai-tool-instructions-filename-${params.kind}`,
|
|
479
|
+
instantiate: () => () => params.instructionsFilename,
|
|
480
|
+
injectionToken: aiToolInstructionsFilenameInjectionToken.for(params.kind)
|
|
481
|
+
}),
|
|
482
|
+
// The tool's rows in the AI tool button's drop-down menu: one per band, the
|
|
483
|
+
// visibility switching on the detected install state so the tool sits in
|
|
484
|
+
// whichever band matches — and in neither while no scan has determined it.
|
|
485
|
+
// What a row looks like and does is the AiToolSelectionRow implementation's
|
|
486
|
+
// business.
|
|
487
|
+
installedSelectionRow: (0, import_injectable22.getInjectable2)({
|
|
488
|
+
id: `ai-tool-selection-row-installed-${params.kind}`,
|
|
489
|
+
consumptions: [detectedAiToolsInjectionToken],
|
|
490
|
+
instantiate: (di) => {
|
|
491
|
+
const detectedAiTools = di.inject(detectedAiToolsInjectionToken)();
|
|
492
|
+
const item = {
|
|
493
|
+
id: `ai-tool-selection-row-installed-${params.kind}`,
|
|
494
|
+
orderNumber: inSelectionBand(aiToolTopBarMenuOrderNumbers.installedAiToolBand, params.orderNumber),
|
|
495
|
+
isVisible: (0, import_mobx.computed)(() => detectedInstallState(detectedAiTools, params.kind) === true),
|
|
496
|
+
Component: SelectionRowComponent
|
|
497
|
+
};
|
|
498
|
+
return () => item;
|
|
499
|
+
},
|
|
500
|
+
injectionToken: import_drop_down_menu_contracts2.dropDownMenuItemInjectionToken.for(aiToolTopBarMenuKind)
|
|
501
|
+
}),
|
|
502
|
+
notInstalledSelectionRow: (0, import_injectable22.getInjectable2)({
|
|
503
|
+
id: `ai-tool-selection-row-not-installed-${params.kind}`,
|
|
504
|
+
consumptions: [detectedAiToolsInjectionToken],
|
|
505
|
+
instantiate: (di) => {
|
|
506
|
+
const detectedAiTools = di.inject(detectedAiToolsInjectionToken)();
|
|
507
|
+
const item = {
|
|
508
|
+
id: `ai-tool-selection-row-not-installed-${params.kind}`,
|
|
509
|
+
orderNumber: inSelectionBand(aiToolTopBarMenuOrderNumbers.notInstalledAiToolBand, params.orderNumber),
|
|
510
|
+
isVisible: (0, import_mobx.computed)(() => detectedInstallState(detectedAiTools, params.kind) === false),
|
|
511
|
+
Component: SelectionRowComponent
|
|
512
|
+
};
|
|
513
|
+
return () => item;
|
|
514
|
+
},
|
|
515
|
+
injectionToken: import_drop_down_menu_contracts2.dropDownMenuItemInjectionToken.for(aiToolTopBarMenuKind)
|
|
516
|
+
}),
|
|
517
|
+
// The install-detection command, registered only when the tool declares one;
|
|
518
|
+
// the detected-tools list runs it (exit 0 ⇒ installed). A tool that declares
|
|
519
|
+
// none (e.g. Custom) is reported as installed.
|
|
520
|
+
...params.getAiToolIsInstalledCliCommand !== void 0 ? {
|
|
521
|
+
aiToolIsInstalledCliCommand: getOsAndShellAwareInjectable({
|
|
522
|
+
id: `ai-tool-is-installed-cli-command-${params.kind}`,
|
|
523
|
+
injectionToken: getAiToolIsInstalledCliCommandInjectionToken.for(params.kind),
|
|
524
|
+
value: params.getAiToolIsInstalledCliCommand
|
|
525
|
+
})
|
|
526
|
+
} : {}
|
|
527
|
+
});
|
|
528
|
+
};
|
|
529
|
+
|
|
530
|
+
// src/ai-tools-injection-token.ts
|
|
531
|
+
var import_injectable23 = require("@k8slens/injectable");
|
|
532
|
+
var aiToolsInjectionToken = (0, import_injectable23.getInjectionToken2)({
|
|
533
|
+
id: "ai-tools",
|
|
534
|
+
cardinality: "one"
|
|
535
|
+
})();
|
|
536
|
+
|
|
537
|
+
// src/ai-tool-configuration.ts
|
|
538
|
+
var import_injectable24 = require("@k8slens/injectable");
|
|
539
|
+
var import_drop_down_menu_contracts3 = require("@k8slens/drop-down-menu-contracts");
|
|
540
|
+
var aiToolConfigurationMenuKind = (0, import_drop_down_menu_contracts3.getDropDownMenuKind)()(
|
|
541
|
+
"ai-tool-configuration-menu"
|
|
542
|
+
);
|
|
543
|
+
var aiToolIsConfiguredForKindInjectionToken = (0, import_injectable24.getInjectionToken2)({
|
|
544
|
+
id: "ai-tool-is-configured-for-kind",
|
|
545
|
+
cardinality: "zero-or-one"
|
|
546
|
+
})(
|
|
547
|
+
(kind) => (0, import_injectable24.getInjectionToken2)({
|
|
548
|
+
id: `ai-tool-is-configured-for-kind-${kind}`,
|
|
549
|
+
speciality: kind,
|
|
550
|
+
cardinality: "zero-or-one"
|
|
551
|
+
})()
|
|
552
|
+
);
|
|
553
|
+
var aiToolConfigurationStateInjectionToken = (0, import_injectable24.getInjectionToken2)({
|
|
554
|
+
id: "ai-tool-configuration-state",
|
|
555
|
+
cardinality: "one"
|
|
556
|
+
})();
|
|
557
|
+
|
|
558
|
+
// src/selected-ai-tool-injection-tokens.ts
|
|
559
|
+
var import_injectable25 = require("@k8slens/injectable");
|
|
560
|
+
var selectedAiToolKindInjectionToken = (0, import_injectable25.getInjectionToken2)({
|
|
561
|
+
id: "selected-ai-tool-kind",
|
|
562
|
+
cardinality: "one"
|
|
563
|
+
})();
|
|
564
|
+
var effectiveAiToolKindInjectionToken = (0, import_injectable25.getInjectionToken2)({
|
|
565
|
+
id: "effective-ai-tool-kind",
|
|
566
|
+
cardinality: "one"
|
|
567
|
+
})();
|
|
568
|
+
var selectedAiToolCommandInjectionToken = (0, import_injectable25.getInjectionToken2)({
|
|
569
|
+
id: "selected-ai-tool-command",
|
|
570
|
+
cardinality: "one"
|
|
571
|
+
})();
|
|
572
|
+
var selectedAiToolResumeCommandInjectionToken = (0, import_injectable25.getInjectionToken2)({
|
|
573
|
+
id: "selected-ai-tool-resume-command",
|
|
574
|
+
cardinality: "one"
|
|
575
|
+
})();
|
|
576
|
+
var selectedAiToolOpenInExternalTerminalCommandInjectionToken = (0, import_injectable25.getInjectionToken2)({
|
|
577
|
+
id: "selected-ai-tool-open-in-external-terminal-command",
|
|
578
|
+
cardinality: "one"
|
|
579
|
+
})();
|
|
580
|
+
var effectiveAiToolNameInjectionToken = (0, import_injectable25.getInjectionToken2)({
|
|
581
|
+
id: "effective-ai-tool-name",
|
|
582
|
+
cardinality: "one"
|
|
583
|
+
})();
|
|
584
|
+
var effectiveAiToolDisplayNameInjectionToken = (0, import_injectable25.getInjectionToken2)({
|
|
585
|
+
id: "effective-ai-tool-display-name",
|
|
586
|
+
cardinality: "one"
|
|
587
|
+
})();
|
|
588
|
+
var effectiveAiToolIconInjectionToken = (0, import_injectable25.getInjectionToken2)({
|
|
589
|
+
id: "effective-ai-tool-icon",
|
|
590
|
+
cardinality: "one"
|
|
591
|
+
})();
|
|
592
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
593
|
+
0 && (module.exports = {
|
|
594
|
+
AiToolSelectionRow,
|
|
595
|
+
DefaultAiToolIcon,
|
|
596
|
+
agentsInstructionsFilename,
|
|
597
|
+
agentsInstructionsIndirectionContents,
|
|
598
|
+
aiToolConfigurationMenuKind,
|
|
599
|
+
aiToolConfigurationStateInjectionToken,
|
|
600
|
+
aiToolDescriptionInjectionToken,
|
|
601
|
+
aiToolDisplayNameInjectionToken,
|
|
602
|
+
aiToolIconForKindInjectionToken,
|
|
603
|
+
aiToolIconInjectionToken,
|
|
604
|
+
aiToolInjectionToken,
|
|
605
|
+
aiToolInstallationInstructionsInjectionToken,
|
|
606
|
+
aiToolInstalledViaCliCommandInjectionToken,
|
|
607
|
+
aiToolInstructionsFilenameInjectionToken,
|
|
608
|
+
aiToolInstructionsIndirectionFilenamesInjectionToken,
|
|
609
|
+
aiToolIsConfiguredForKindInjectionToken,
|
|
610
|
+
aiToolIsConfiguredInjectionToken,
|
|
611
|
+
aiToolNameInjectionToken,
|
|
612
|
+
aiToolOrderNumberInjectionToken,
|
|
613
|
+
aiToolSettingsInjectionToken,
|
|
614
|
+
aiToolTopBarMenuKind,
|
|
615
|
+
aiToolTopBarMenuOrderNumbers,
|
|
616
|
+
aiToolsInjectionToken,
|
|
617
|
+
aiToolsOpenExternallyInjectionToken,
|
|
618
|
+
currentShellFamilyInjectionToken,
|
|
619
|
+
customAiToolKind,
|
|
620
|
+
detectedAiToolsInjectionToken,
|
|
621
|
+
effectiveAiToolDisplayNameInjectionToken,
|
|
622
|
+
effectiveAiToolIconInjectionToken,
|
|
623
|
+
effectiveAiToolKindInjectionToken,
|
|
624
|
+
effectiveAiToolNameInjectionToken,
|
|
625
|
+
externalTerminalCommandBuilderInjectionToken,
|
|
626
|
+
getAiCommandForTerminalInjectionToken,
|
|
627
|
+
getAiToolInjectableBunch,
|
|
628
|
+
getAiToolIsInstalledCliCommandInjectionToken,
|
|
629
|
+
getOpenToolInExternalTerminalForToolInjectionToken,
|
|
630
|
+
getOsAndShellAwareInjectable,
|
|
631
|
+
getResumeAiCommandForTerminalInjectionToken,
|
|
632
|
+
noAiToolKind,
|
|
633
|
+
refreshAiToolDetectionInjectionToken,
|
|
634
|
+
resolveLlmCommand,
|
|
635
|
+
selectedAiToolCommandInjectionToken,
|
|
636
|
+
selectedAiToolKindInjectionToken,
|
|
637
|
+
selectedAiToolOpenInExternalTerminalCommandInjectionToken,
|
|
638
|
+
selectedAiToolResumeCommandInjectionToken,
|
|
639
|
+
shellQuote,
|
|
640
|
+
windowsShellQuote
|
|
641
|
+
});
|
|
642
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vaW5kZXgudHMiLCAiLi4vc3JjL2FpLXRvb2wudHMiLCAiLi4vc3JjL2FpLXRvb2wtaXMtY29uZmlndXJlZC50cyIsICIuLi9zcmMvb3MtYW5kLXNoZWxsLXNwZWNpZmljLnRzIiwgIi4uL3NyYy9jdXJyZW50LXNoZWxsLWZhbWlseS50cyIsICIuLi9zcmMvYWktdG9vbC1pbmplY3Rpb24tdG9rZW4udHMiLCAiLi4vc3JjL2dldC1haS1jb21tYW5kLWZvci10ZXJtaW5hbC50cyIsICIuLi9zcmMvZ2V0LXJlc3VtZS1haS1jb21tYW5kLWZvci10ZXJtaW5hbC50cyIsICIuLi9zcmMvYWktdG9vbC1pbnN0YWxsZWQtdmlhLWNsaS1jb21tYW5kLnRzIiwgIi4uL3NyYy9haS10b29sLWRldGVjdGlvbi50cyIsICIuLi9zcmMvYWktdG9vbC1uYW1lLnRzIiwgIi4uL3NyYy9haS10b29sLWRpc3BsYXktbmFtZS50cyIsICIuLi9zcmMvYWktdG9vbC1kZXNjcmlwdGlvbi50cyIsICIuLi9zcmMvYWktdG9vbC1pY29uLnRzIiwgIi4uL3NyYy9kZWZhdWx0LWFpLXRvb2wtaWNvbi50c3giLCAiLi4vc3JjL2FpLXRvb2wtb3JkZXItbnVtYmVyLnRzIiwgIi4uL3NyYy9haS10b29sLXNldHRpbmdzLnRzIiwgIi4uL3NyYy9haS10b29sLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnMudHMiLCAiLi4vc3JjL2FpLXRvb2wtaW5zdHJ1Y3Rpb25zLWZpbGVuYW1lLnRzIiwgIi4uL3NyYy9haS10b29sLWluc3RydWN0aW9ucy1maWxlbmFtZXMudHMiLCAiLi4vc3JjL3Jlc29sdmUtbGxtLWNvbW1hbmQudHMiLCAiLi4vc3JjL2J1aWxkLWV4dGVybmFsLXRlcm1pbmFsLWNvbW1hbmQudHMiLCAiLi4vc3JjL2dldC1vcGVuLXRvb2wtaW4tZXh0ZXJuYWwtdGVybWluYWwtZm9yLXRvb2wudHMiLCAiLi4vc3JjL2dldC1haS10b29sLWlzLWluc3RhbGxlZC1jbGktY29tbWFuZC50cyIsICIuLi9zcmMvYWktdG9vbHMtb3Blbi1leHRlcm5hbGx5LnRzIiwgIi4uL3NyYy9nZXQtYWktdG9vbC1pbmplY3RhYmxlLWJ1bmNoLnRzIiwgIi4uL3NyYy9haS10b29sLXNlbGVjdGlvbi1yb3cudHMiLCAiLi4vc3JjL2FpLXRvb2wtdG9wLWJhci1tZW51LnRzIiwgIi4uL3NyYy9kZXRlY3RlZC1haS10b29scy50cyIsICIuLi9zcmMvYWktdG9vbHMtaW5qZWN0aW9uLXRva2VuLnRzIiwgIi4uL3NyYy9haS10b29sLWNvbmZpZ3VyYXRpb24udHMiLCAiLi4vc3JjL3NlbGVjdGVkLWFpLXRvb2wtaW5qZWN0aW9uLXRva2Vucy50cyJdLAogICJzb3VyY2VzQ29udGVudCI6IFsiZXhwb3J0IHtcbiAgdHlwZSBBaVRvb2xLaW5kLFxuICBjdXN0b21BaVRvb2xLaW5kLFxuICBub0FpVG9vbEtpbmQsXG4gIGFnZW50c0luc3RydWN0aW9uc0ZpbGVuYW1lLFxuICBhZ2VudHNJbnN0cnVjdGlvbnNJbmRpcmVjdGlvbkNvbnRlbnRzLFxuICB0eXBlIEdldENsaUNvbW1hbmQsXG4gIHR5cGUgR2V0QWlUb29sSXNJbnN0YWxsZWRDbGlDb21tYW5kLFxuICB0eXBlIEdldE9wZW5Ub29sSW5FeHRlcm5hbFRlcm1pbmFsQ2xpQ29tbWFuZCxcbiAgdHlwZSBBaVRvb2xMaXN0RW50cnksXG59IGZyb20gXCIuL3NyYy9haS10b29sXCI7XG5leHBvcnQgeyBhaVRvb2xJc0NvbmZpZ3VyZWRJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL3NyYy9haS10b29sLWlzLWNvbmZpZ3VyZWRcIjtcbmV4cG9ydCB0eXBlIHtcbiAgT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWMsXG4gIE1heWJlT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWMsXG59IGZyb20gXCIuL3NyYy9vcGVyYXRpbmctc3lzdGVtLXNwZWNpZmljXCI7XG5leHBvcnQge1xuICB0eXBlIFNoZWxsU3BlY2lmaWMsXG4gIHR5cGUgTWF5YmVTaGVsbFNwZWNpZmljLFxuICB0eXBlIE9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWMsXG4gIHR5cGUgTWF5YmVPcGVyYXRpbmdTeXN0ZW1BbmRTaGVsbFNwZWNpZmljLFxuICBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlLFxufSBmcm9tIFwiLi9zcmMvb3MtYW5kLXNoZWxsLXNwZWNpZmljXCI7XG5leHBvcnQgeyBjdXJyZW50U2hlbGxGYW1pbHlJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL3NyYy9jdXJyZW50LXNoZWxsLWZhbWlseVwiO1xuXG5leHBvcnQgeyBhaVRvb2xJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL3NyYy9haS10b29sLWluamVjdGlvbi10b2tlblwiO1xuZXhwb3J0IHsgZ2V0QWlDb21tYW5kRm9yVGVybWluYWxJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL3NyYy9nZXQtYWktY29tbWFuZC1mb3ItdGVybWluYWxcIjtcbmV4cG9ydCB7IGdldFJlc3VtZUFpQ29tbWFuZEZvclRlcm1pbmFsSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9zcmMvZ2V0LXJlc3VtZS1haS1jb21tYW5kLWZvci10ZXJtaW5hbFwiO1xuZXhwb3J0IHtcbiAgYWlUb29sSW5zdGFsbGVkVmlhQ2xpQ29tbWFuZEluamVjdGlvblRva2VuLFxuICB0eXBlIEFpVG9vbEluc3RhbGxlZFZpYUNsaUNvbW1hbmQsXG59IGZyb20gXCIuL3NyYy9haS10b29sLWluc3RhbGxlZC12aWEtY2xpLWNvbW1hbmRcIjtcbmV4cG9ydCB7IHJlZnJlc2hBaVRvb2xEZXRlY3Rpb25JbmplY3Rpb25Ub2tlbiwgdHlwZSBSZWZyZXNoQWlUb29sRGV0ZWN0aW9uIH0gZnJvbSBcIi4vc3JjL2FpLXRvb2wtZGV0ZWN0aW9uXCI7XG5leHBvcnQgeyBhaVRvb2xOYW1lSW5qZWN0aW9uVG9rZW4sIHR5cGUgQWlUb29sTmFtZSB9IGZyb20gXCIuL3NyYy9haS10b29sLW5hbWVcIjtcbmV4cG9ydCB7IGFpVG9vbERpc3BsYXlOYW1lSW5qZWN0aW9uVG9rZW4sIHR5cGUgQWlUb29sRGlzcGxheU5hbWUgfSBmcm9tIFwiLi9zcmMvYWktdG9vbC1kaXNwbGF5LW5hbWVcIjtcbmV4cG9ydCB7XG4gIGFpVG9vbERlc2NyaXB0aW9uSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgQWlUb29sRGVzY3JpcHRpb24sXG4gIHR5cGUgQWlUb29sRGVzY3JpcHRpb25Qcm9wcyxcbn0gZnJvbSBcIi4vc3JjL2FpLXRvb2wtZGVzY3JpcHRpb25cIjtcbmV4cG9ydCB7XG4gIGFpVG9vbEljb25JbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBBaVRvb2xJY29uLFxuICBhaVRvb2xJY29uRm9yS2luZEluamVjdGlvblRva2VuLFxuICB0eXBlIEFpVG9vbEljb25Gb3JLaW5kLFxufSBmcm9tIFwiLi9zcmMvYWktdG9vbC1pY29uXCI7XG5leHBvcnQgeyBEZWZhdWx0QWlUb29sSWNvbiB9IGZyb20gXCIuL3NyYy9kZWZhdWx0LWFpLXRvb2wtaWNvblwiO1xuZXhwb3J0IHsgYWlUb29sT3JkZXJOdW1iZXJJbmplY3Rpb25Ub2tlbiwgdHlwZSBBaVRvb2xPcmRlck51bWJlciB9IGZyb20gXCIuL3NyYy9haS10b29sLW9yZGVyLW51bWJlclwiO1xuZXhwb3J0IHsgYWlUb29sU2V0dGluZ3NJbmplY3Rpb25Ub2tlbiwgdHlwZSBBaVRvb2xTZXR0aW5ncyB9IGZyb20gXCIuL3NyYy9haS10b29sLXNldHRpbmdzXCI7XG5leHBvcnQge1xuICBhaVRvb2xJbnN0YWxsYXRpb25JbnN0cnVjdGlvbnNJbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBBaVRvb2xJbnN0YWxsYXRpb25JbnN0cnVjdGlvbnMsXG59IGZyb20gXCIuL3NyYy9haS10b29sLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnNcIjtcbmV4cG9ydCB7XG4gIGFpVG9vbEluc3RydWN0aW9uc0ZpbGVuYW1lSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgQWlUb29sSW5zdHJ1Y3Rpb25zRmlsZW5hbWUsXG59IGZyb20gXCIuL3NyYy9haS10b29sLWluc3RydWN0aW9ucy1maWxlbmFtZVwiO1xuZXhwb3J0IHtcbiAgYWlUb29sSW5zdHJ1Y3Rpb25zSW5kaXJlY3Rpb25GaWxlbmFtZXNJbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBBaVRvb2xJbnN0cnVjdGlvbnNJbmRpcmVjdGlvbkZpbGVuYW1lcyxcbn0gZnJvbSBcIi4vc3JjL2FpLXRvb2wtaW5zdHJ1Y3Rpb25zLWZpbGVuYW1lc1wiO1xuZXhwb3J0IHsgcmVzb2x2ZUxsbUNvbW1hbmQsIHR5cGUgUmVzb2x2ZUxsbUNvbW1hbmRPcHRpb25zIH0gZnJvbSBcIi4vc3JjL3Jlc29sdmUtbGxtLWNvbW1hbmRcIjtcbi8vIEdlbmVyaWMgc2hlbGwgZXNjYXBpbmcsIGRlZmluZWQgd2l0aCB0aGUgb3RoZXIgc2hlbGwgaGVscGVycyBpblxuLy8gQGs4c2xlbnMvcHVibGljLXV0aWxpdGllczsgcmUtZXhwb3J0ZWQgc28gZXhpc3RpbmcgaW1wb3J0ZXJzIGFyZSB1bmFmZmVjdGVkLlxuZXhwb3J0IHsgc2hlbGxRdW90ZSwgd2luZG93c1NoZWxsUXVvdGUgfSBmcm9tIFwiQGs4c2xlbnMvcHVibGljLXV0aWxpdGllc1wiO1xuZXhwb3J0IHtcbiAgZXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRCdWlsZGVySW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgRXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRPcHRpb25zLFxuICB0eXBlIEV4dGVybmFsVGVybWluYWxDb21tYW5kQnVpbGRlcixcbn0gZnJvbSBcIi4vc3JjL2J1aWxkLWV4dGVybmFsLXRlcm1pbmFsLWNvbW1hbmRcIjtcbmV4cG9ydCB7IGdldE9wZW5Ub29sSW5FeHRlcm5hbFRlcm1pbmFsRm9yVG9vbEluamVjdGlvblRva2VuIH0gZnJvbSBcIi4vc3JjL2dldC1vcGVuLXRvb2wtaW4tZXh0ZXJuYWwtdGVybWluYWwtZm9yLXRvb2xcIjtcbmV4cG9ydCB7IGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZEluamVjdGlvblRva2VuIH0gZnJvbSBcIi4vc3JjL2dldC1haS10b29sLWlzLWluc3RhbGxlZC1jbGktY29tbWFuZFwiO1xuZXhwb3J0IHsgYWlUb29sc09wZW5FeHRlcm5hbGx5SW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9zcmMvYWktdG9vbHMtb3Blbi1leHRlcm5hbGx5XCI7XG5leHBvcnQgeyBnZXRBaVRvb2xJbmplY3RhYmxlQnVuY2gsIHR5cGUgQWlUb29sQnVuY2hQYXJhbXMgfSBmcm9tIFwiLi9zcmMvZ2V0LWFpLXRvb2wtaW5qZWN0YWJsZS1idW5jaFwiO1xuZXhwb3J0IHsgYWlUb29sc0luamVjdGlvblRva2VuLCB0eXBlIEFpVG9vbHMgfSBmcm9tIFwiLi9zcmMvYWktdG9vbHMtaW5qZWN0aW9uLXRva2VuXCI7XG5leHBvcnQgeyBkZXRlY3RlZEFpVG9vbHNJbmplY3Rpb25Ub2tlbiwgdHlwZSBEZXRlY3RlZEFpVG9vbHMgfSBmcm9tIFwiLi9zcmMvZGV0ZWN0ZWQtYWktdG9vbHNcIjtcbmV4cG9ydCB7IGFpVG9vbFRvcEJhck1lbnVLaW5kLCBhaVRvb2xUb3BCYXJNZW51T3JkZXJOdW1iZXJzIH0gZnJvbSBcIi4vc3JjL2FpLXRvb2wtdG9wLWJhci1tZW51XCI7XG5leHBvcnQge1xuICBhaVRvb2xDb25maWd1cmF0aW9uTWVudUtpbmQsXG4gIGFpVG9vbENvbmZpZ3VyYXRpb25TdGF0ZUluamVjdGlvblRva2VuLFxuICBhaVRvb2xJc0NvbmZpZ3VyZWRGb3JLaW5kSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgQWlUb29sQ29uZmlndXJhdGlvblN0YXRlLFxuICB0eXBlIEFpVG9vbENvbmZpZ3VyYXRpb25TdGF0ZUZvcixcbiAgdHlwZSBBaVRvb2xJc0NvbmZpZ3VyZWQsXG59IGZyb20gXCIuL3NyYy9haS10b29sLWNvbmZpZ3VyYXRpb25cIjtcbmV4cG9ydCB7IEFpVG9vbFNlbGVjdGlvblJvdywgdHlwZSBBaVRvb2xTZWxlY3Rpb25Sb3dQcm9wcyB9IGZyb20gXCIuL3NyYy9haS10b29sLXNlbGVjdGlvbi1yb3dcIjtcbmV4cG9ydCB7XG4gIHNlbGVjdGVkQWlUb29sS2luZEluamVjdGlvblRva2VuLFxuICB0eXBlIFNlbGVjdGVkQWlUb29sS2luZCxcbiAgZWZmZWN0aXZlQWlUb29sS2luZEluamVjdGlvblRva2VuLFxuICB0eXBlIEVmZmVjdGl2ZUFpVG9vbEtpbmQsXG4gIHNlbGVjdGVkQWlUb29sQ29tbWFuZEluamVjdGlvblRva2VuLFxuICB0eXBlIFNlbGVjdGVkQWlUb29sQ29tbWFuZCxcbiAgc2VsZWN0ZWRBaVRvb2xSZXN1bWVDb21tYW5kSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgU2VsZWN0ZWRBaVRvb2xSZXN1bWVDb21tYW5kLFxuICBzZWxlY3RlZEFpVG9vbE9wZW5JbkV4dGVybmFsVGVybWluYWxDb21tYW5kSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgU2VsZWN0ZWRBaVRvb2xPcGVuSW5FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZCxcbiAgZWZmZWN0aXZlQWlUb29sTmFtZUluamVjdGlvblRva2VuLFxuICB0eXBlIEVmZmVjdGl2ZUFpVG9vbE5hbWUsXG4gIGVmZmVjdGl2ZUFpVG9vbERpc3BsYXlOYW1lSW5qZWN0aW9uVG9rZW4sXG4gIHR5cGUgRWZmZWN0aXZlQWlUb29sRGlzcGxheU5hbWUsXG4gIGVmZmVjdGl2ZUFpVG9vbEljb25JbmplY3Rpb25Ub2tlbixcbiAgdHlwZSBFZmZlY3RpdmVBaVRvb2xJY29uLFxufSBmcm9tIFwiLi9zcmMvc2VsZWN0ZWQtYWktdG9vbC1pbmplY3Rpb24tdG9rZW5zXCI7XG4iLCAiaW1wb3J0IHR5cGUgeyBDb25zdW1wdGlvbkRpLCBEaUNvbnRhaW5lckZvckluamVjdGlvbiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5cbi8qKiBJZGVudGlmaWVyIGZvciBhIGtpbmQgb2YgQUkgQ0xJIHRvb2wsIGUuZy4gYFwiY2xhdWRlXCJgLiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sS2luZCA9IHN0cmluZztcblxuLyoqIFRoZSBwc2V1ZG8ta2luZCBmb3IgdGhlIHVzZXIncyBmcmVlLXRleHQgXCJDdXN0b21cIiBjb21tYW5kLiAqL1xuZXhwb3J0IGNvbnN0IGN1c3RvbUFpVG9vbEtpbmQ6IEFpVG9vbEtpbmQgPSBcImN1c3RvbVwiO1xuXG4vKipcbiAqIFRoZSBwc2V1ZG8ta2luZCBmb3IgXCJObyBBSSB0b29sXCIgXHUyMDE0IHRoZSBleHBsaWNpdCBvcHQtb3V0LCBhbmQgdGhlIGRlZmF1bHQvZmFsbGJhY2tcbiAqIGVmZmVjdGl2ZSBraW5kLiBJdCBpcyBub3QgYSByZWdpc3RlcmVkIHRvb2w6IHdoZW4gaXQgaXMgdGhlIGVmZmVjdGl2ZSBzZWxlY3Rpb24sXG4gKiBMZW5zIGxhdW5jaGVzIG5vdGhpbmcgYW5kIHRoZSBBSSBzdXJmYWNlcyBoaWRlICh0aGUgdG9wLWJhciBidXR0b24gYmVjb21lc1xuICogXCJDb25maWd1cmUgQUlcIikuIFRoZSBlZmZlY3RpdmUga2luZCByZXNvbHZlcyB0byB0aGlzIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gaXNcbiAqIHVuc2V0LCBzZXQgdG8gdGhpcyBzZW50aW5lbCwgb3Igc2V0IHRvIGEgdG9vbCB0aGF0IGlzIG5vdCBpbnN0YWxsZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBub0FpVG9vbEtpbmQ6IEFpVG9vbEtpbmQgPSBcIm5vbmVcIjtcblxuLyoqXG4gKiBUaGUgY2Fub25pY2FsIGFnZW50LWluc3RydWN0aW9ucyBmaWxlbmFtZSwgd3JpdHRlbiBpbnRvIGV2ZXJ5IEFJIHRvb2wgdGFiJ3NcbiAqIHdvcmtpbmcgZGlyZWN0b3J5LiBUb29scyB0aGF0IHJlYWQgYSBkaWZmZXJlbnRseS1uYW1lZCBmaWxlIChzZWVcbiAqIHtAbGluayBBaVRvb2xJbnN0cnVjdGlvbnNGaWxlbmFtZX0pIGdldCB0aGF0IGZpbGUgdG9vLCBhcyBhbiBpbmRpcmVjdGlvblxuICogaW1wb3J0aW5nIHRoaXMgb25lLlxuICovXG5leHBvcnQgY29uc3QgYWdlbnRzSW5zdHJ1Y3Rpb25zRmlsZW5hbWUgPSBcIkFHRU5UUy5tZFwiO1xuXG4vKipcbiAqIFRoZSBjb250ZW50cyBvZiBhIHRvb2wtc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGZpbGUgKGUuZy4gYENMQVVERS5tZGApOiBhIHNpbmdsZVxuICogbGluZSBpbXBvcnRpbmcgdGhlIGNhbm9uaWNhbCB7QGxpbmsgYWdlbnRzSW5zdHJ1Y3Rpb25zRmlsZW5hbWV9LCBzbyBhIHRvb2wgdGhhdFxuICogcmVhZHMgaXRzIG93biBmaWxlbmFtZSBzdGlsbCBwaWNrcyB1cCB0aGUgaW5zdHJ1Y3Rpb25zIHdyaXR0ZW4gdGhlcmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhZ2VudHNJbnN0cnVjdGlvbnNJbmRpcmVjdGlvbkNvbnRlbnRzID0gYEAke2FnZW50c0luc3RydWN0aW9uc0ZpbGVuYW1lfVxcbmA7XG5cbi8qKlxuICogQnVpbGRzIHRoZSBzaGVsbCBjb21tYW5kIHRoYXQgbGF1bmNoZXMgYW4gQUkgQ0xJIHRvb2wgaW4gYSB0ZXJtaW5hbC4gQW4gYXN5bmNcbiAqIGNhbGxiYWNrIHJlY2VpdmluZyB0aGUgREkgY29udGFpbmVyLCBzbyBhIHRvb2wgY2FuIGluamVjdCAoYW5kIGF3YWl0KSB3aGF0ZXZlclxuICogaXQgbmVlZHMgd2hpbGUgYXNzZW1ibGluZyBpdHMgY29tbWFuZC4gYGRpcmAgaXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoZVxuICogY29tbWFuZCBydW5zIGluOyB0aGUgbGF1bmNoZXIgaGFzIGFscmVhZHkgd3JpdHRlbiB0aGUgY2x1c3RlciBjb250ZXh0IHRoZXJlIGFzXG4gKiBgQUdFTlRTLm1kYCAocGx1cyBwZXItdG9vbCBpbmRpcmVjdGlvbiBmaWxlcyksIHNvIHRvb2xzIGRpc2NvdmVyIGl0IGZyb20gY3dkLlxuICovXG5leHBvcnQgdHlwZSBHZXRDbGlDb21tYW5kID0gKGRpOiBEaUNvbnRhaW5lckZvckluamVjdGlvbiwgYXJnczogeyBwcm9tcHQ/OiBzdHJpbmc7IGRpcjogc3RyaW5nIH0pID0+IFByb21pc2U8c3RyaW5nPjtcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGhvc3QgY29tbWFuZCB0aGF0IGNoZWNrcyB3aGV0aGVyIGFuIEFJIHRvb2wgaXMgaW5zdGFsbGVkIChlLmcuXG4gKiBgY29tbWFuZCAtdiBjbGF1ZGVgIC8gYHdoZXJlIGNsYXVkZWApLiBUaGUgY29tbWFuZCBpcyBydW4gb24gdGhlIGhvc3QgYW5kIGFuXG4gKiBleGl0IGNvZGUgb2YgYDBgIG1lYW5zIGluc3RhbGxlZC4gR2l2ZW4gdGhlIERJIGNvbnRhaW5lciwgcmV0dXJucyB0aGUgY29tbWFuZFxuICogc3RyaW5nLiBPbWl0IChvbiBgQWlUb29sQnVuY2hQYXJhbXNgKSBmb3IgYW4gYWx3YXlzLWF2YWlsYWJsZSB0b29sLlxuICovXG4vLyBSZWNlaXZlcyB0aGUgaW52b2tpbmcgaW5qZWN0YWJsZSdzIHNjb3BlZCBgZGlgLCBzbyBhIGJ1aWxkZXIgbWF5IGluamVjdFxuLy8gaW5qZWN0YWJsZXMgYnkgcmVmZXJlbmNlIGJ1dCBubyBpbmplY3Rpb24gdG9rZW5zICh0aGV5IHdvdWxkIGhhdmUgdG8gYmVcbi8vIGRlY2xhcmVkIGJ5IGV2ZXJ5IGludm9rZXIpLiBUaGUgYnVpbHQtaW4gY2hlY2tzIGFyZSBzdGF0aWMgc3RyaW5ncyBhbnl3YXkuXG5leHBvcnQgdHlwZSBHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQgPSAoZGk6IENvbnN1bXB0aW9uRGkpID0+IHN0cmluZztcblxuLyoqXG4gKiBCdWlsZHMgdGhlIGZ1bGwgaG9zdCBjb21tYW5kIHRoYXQgb3BlbnMgYW4gQUkgdG9vbCBpbiBhIGZyZXNoIGV4dGVybmFsIHRlcm1pbmFsXG4gKiB3aW5kb3cgXHUyMDE0IHR5cGljYWxseSBieSB3cmFwcGluZyB0aGUgdG9vbCdzIG93biBpbnZvY2F0aW9uIHdpdGggb25lIG9mIHRoZVxuICogYGJ1aWxke01hYyxXaW5kb3dzLExpbnV4fUV4dGVybmFsVGVybWluYWxDb21tYW5kYCBoZWxwZXJzLiBNaXJyb3JzXG4gKiB7QGxpbmsgR2V0Q2xpQ29tbWFuZH0ncyBhcmdzIChzbyBpdCBjYW4gcmV1c2UgdGhlIHRvb2wncyBsYXVuY2ggY29tbWFuZCksXG4gKiBwbHVzIGBlbnZgIChlLmcuIGB7IEtVQkVDT05GSUcgfWApIHdoaWNoIGlzIGJha2VkIGludG8gdGhlIGNvbW1hbmQgYmVjYXVzZSB0aGVcbiAqIGZyZXNobHktb3BlbmVkIHRlcm1pbmFsIGRvZXMgbm90IGluaGVyaXQgdGhlIGxhdW5jaGVyJ3MgZW52aXJvbm1lbnQuIFJldHVybnNcbiAqIGBcIlwiYCB3aGVuIHRoZSB0b29sIGhhcyBubyBjb21tYW5kIHRvIHJ1biAoZS5nLiBhbiBlbXB0eSBDdXN0b20gdGVtcGxhdGUpLlxuICovXG5leHBvcnQgdHlwZSBHZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmQgPSAoXG4gIGRpOiBEaUNvbnRhaW5lckZvckluamVjdGlvbixcbiAgYXJnczogeyBwcm9tcHQ/OiBzdHJpbmc7IGRpcjogc3RyaW5nOyBlbnY/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG4pID0+IFByb21pc2U8c3RyaW5nPjtcblxuLyoqIEFuIEFJIHRvb2wga2luZCB0b2dldGhlciB3aXRoIGl0cyBkZXRlY3RlZCBpbnN0YWxsYXRpb24gc3RhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEFpVG9vbExpc3RFbnRyeSB7XG4gIHJlYWRvbmx5IGtpbmQ6IEFpVG9vbEtpbmQ7XG4gIHJlYWRvbmx5IGlzSW5zdGFsbGVkOiBib29sZWFuO1xufVxuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IElDb21wdXRlZFZhbHVlIH0gZnJvbSBcIm1vYnhcIjtcblxuLyoqXG4gKiBXaGV0aGVyIGEgcmVhbCBBSSB0b29sIGlzIGNvbmZpZ3VyZWQgXHUyMDE0IGkuZS4gdGhlIGVmZmVjdGl2ZSBBSSB0b29sIGtpbmQgaXMgYSByZWFsXG4gKiB0b29sIChvciBDdXN0b20pLCBub3Qge0BsaW5rIG5vQWlUb29sS2luZH0uIERlcml2ZWQgcHVyZWx5IGZyb20gdGhlIHVzZXInc1xuICogc2VsZWN0aW9uLCBOT1QgZnJvbSBpbnN0YWxsIGRldGVjdGlvbjogb2JzZXJ2aW5nIHRoZSBjb25maWd1cmVkIHN0YXRlIG11c3Qgbm90XG4gKiBkZXBlbmQgb24gdGhlIGFzeW5jIFBBVEggc2NhbiBoYXZpbmcgcnVuIGZpcnN0LlxuICpcbiAqIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIHBlcnNpc3RlZCBzZWxlY3Rpb24gaGFzIGxvYWRlZCAodGhlbiBhIHJlYWN0aXZlXG4gKiBib29sZWFuKSwgc28gY29uc3VtZXJzIHJlZmxlY3QgYSBnZW51aW5lICpwZW5kaW5nKiBzdGF0ZSB3aGlsZSBpdCBsb2FkcyBpbnN0ZWFkXG4gKiBvZiBndWVzc2luZyBgZmFsc2VgLiBSZWFjdCBzdXJmYWNlcyByZWFkIGl0IHZpYSBgdXNlSW5qZWN0KC4uLilgIHVuZGVyXG4gKiBgPFN1c3BlbnNlPmAgKG9yIGJyaWRnZSBpdCB3aXRoIGBhc1JlYWN0aXZlYCk7IHRoZSBsYXVuY2ggaGFuZGxlcnMgYGF3YWl0YCBpdC5cbiAqIFRoZSBBc2stQUkgbGF1bmNoIHN1cmZhY2VzIGdhdGUgdGhlaXIgdmlzaWJpbGl0eSBvbiBpdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbElzQ29uZmlndXJlZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTxib29sZWFuPj47XG59Pih7XG4gIGlkOiBcImFpLXRvb2wtaXMtY29uZmlndXJlZFwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iLCAiaW1wb3J0IHR5cGUgeyBGYWN0b3J5LCBJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHtcbiAgZ2V0SW5qZWN0YWJsZUZvck9wZXJhdGluZ1N5c3RlbXNBbmRTaGVsbHMsXG4gIGdldEluamVjdGFibGVGb3JTaGVsbHMsXG4gIHR5cGUgUGVyU2hlbGxGYW1pbHksXG4gIHR5cGUgU2hlbGxTY29wZWQsXG59IGZyb20gXCJAazhzbGVucy9wbGF0Zm9ybS1zcGVjaWZpYy1pbmplY3RhYmxlc1wiO1xuaW1wb3J0IHR5cGUgeyBPcGVyYXRpbmdTeXN0ZW1TcGVjaWZpYyB9IGZyb20gXCIuL29wZXJhdGluZy1zeXN0ZW0tc3BlY2lmaWNcIjtcblxuLyoqXG4gKiBBIHZhbHVlIHByb3ZpZGVkIHNlcGFyYXRlbHkgcGVyIHNoZWxsIGZhbWlseS4gVGhlIHNoZWxsIGFuYWxvZ3VlIG9mXG4gKiB7QGxpbmsgT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWN9LlxuICovXG5leHBvcnQgdHlwZSBTaGVsbFNwZWNpZmljPFQ+ID0gUGVyU2hlbGxGYW1pbHk8VD47XG5cbi8qKlxuICogQSB2YWx1ZSB0aGF0IGlzIGVpdGhlciBzaGVsbC1hZ25vc3RpYyAodGhlIHZhbHVlIGl0c2VsZikgb3Igc2hlbGwgc3BlY2lmaWMgKGFcbiAqIHtAbGluayBTaGVsbFNwZWNpZmljfSBvYmplY3QpLiBUaGUgc2hlbGwgYW5hbG9ndWUgb2YgYE1heWJlT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWNgLlxuICovXG5leHBvcnQgdHlwZSBNYXliZVNoZWxsU3BlY2lmaWM8VD4gPSBUIHwgU2hlbGxTcGVjaWZpYzxUPjtcblxuLyoqIEEgdmFsdWUgcHJvdmlkZWQgcGVyIG9wZXJhdGluZyBzeXN0ZW0sIGFuZCB3aXRoaW4gZWFjaCwgcGVyIHNoZWxsIGZhbWlseS4gKi9cbmV4cG9ydCB0eXBlIE9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWM8VD4gPSBPcGVyYXRpbmdTeXN0ZW1TcGVjaWZpYzxTaGVsbFNwZWNpZmljPFQ+PjtcblxuLyoqXG4gKiBBIHZhbHVlIHRoYXQgbWF5IHZhcnkgYWxvbmcgZWl0aGVyIGF4aXM6IGFnbm9zdGljLCBvcGVyYXRpbmctc3lzdGVtIHNwZWNpZmljLFxuICogc2hlbGwgc3BlY2lmaWMsIG9yIGJvdGguIFVzZWQgZm9yIHRoZSBBSS10b29sIENMSSBjb21tYW5kcyBzbyBhIHRvb2wgbWF5IGRpZmZlclxuICogaXRzIGNvbW1hbmQgKmNvbnRlbnQqIHBlciBPUyBhbmQvb3Igc2hlbGwgKGUuZy4gbGF1bmNoLWJ5LW5hbWUgdnMgcGF0aCwgb3JcbiAqIHBlci1PUyBkaXNjb3ZlcnkgbG9naWMpLlxuICovXG5leHBvcnQgdHlwZSBNYXliZU9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWM8VD4gPVxuICB8IFRcbiAgfCBPcGVyYXRpbmdTeXN0ZW1TcGVjaWZpYzxUPlxuICB8IFNoZWxsU3BlY2lmaWM8VD5cbiAgfCBPcGVyYXRpbmdTeXN0ZW1BbmRTaGVsbFNwZWNpZmljPFQ+O1xuXG5jb25zdCBpc0Z1bmN0aW9uID0gKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgRmFjdG9yeSA9PiB0eXBlb2YgdmFsdWUgPT09IFwiZnVuY3Rpb25cIjtcblxuY29uc3QgaXNTaGVsbFNwZWNpZmljID0gPEY+KFxuICB2YWx1ZTogT3BlcmF0aW5nU3lzdGVtU3BlY2lmaWM8RiB8IFNoZWxsU3BlY2lmaWM8Rj4+IHwgU2hlbGxTcGVjaWZpYzxGPixcbik6IHZhbHVlIGlzIFNoZWxsU3BlY2lmaWM8Rj4gPT4gXCJwb3NpeFwiIGluIHZhbHVlO1xuXG5jb25zdCBzYW1lRm9yRXZlcnlTaGVsbCA9IDxGPih2YWx1ZTogRik6IFBlclNoZWxsRmFtaWx5PCgpID0+IEY+ID0+ICh7XG4gIHBvc2l4OiAoKSA9PiB2YWx1ZSxcbiAgZmlzaDogKCkgPT4gdmFsdWUsXG4gIGNtZDogKCkgPT4gdmFsdWUsXG4gIHBvd2Vyc2hlbGw6ICgpID0+IHZhbHVlLFxufSk7XG5cbmNvbnN0IHBlclNoZWxsUHJvZHVjZXJzID0gPEY+KHZhbHVlOiBTaGVsbFNwZWNpZmljPEY+KTogUGVyU2hlbGxGYW1pbHk8KCkgPT4gRj4gPT4gKHtcbiAgcG9zaXg6ICgpID0+IHZhbHVlLnBvc2l4LFxuICBmaXNoOiAoKSA9PiB2YWx1ZS5maXNoLFxuICBjbWQ6ICgpID0+IHZhbHVlLmNtZCxcbiAgcG93ZXJzaGVsbDogKCkgPT4gdmFsdWUucG93ZXJzaGVsbCxcbn0pO1xuXG4vKipcbiAqIFJlZ2lzdGVycyBhIHtAbGluayBNYXliZU9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWN9IHZhbHVlIHVuZGVyIGEgc2luZ2xlXG4gKiB0b2tlbiBzbyBjb25zdW1lcnMgcmVzb2x2ZSBpdCBhdCBydW50aW1lIHdpdGhcbiAqIGByZXNvbHZlRm9yU2hlbGwoaW5qZWN0TWFueSh0b2tlbikoKSwgc2hlbGxGYW1pbHkpYC4gVGhlICoqT1MqKiBheGlzIGlzIGZpbHRlcmVkXG4gKiBzeW5jaHJvbm91c2x5IGF0IHJlZ2lzdHJhdGlvbiAoaG9zdC1vbmx5IGAqLW9ubHlgIHRhZ3MsIHZpYVxuICogYGdldEluamVjdGFibGVGb3JPcGVyYXRpbmdTeXN0ZW1zQW5kU2hlbGxzYCk7IHRoZSAqKnNoZWxsKiogYXhpcyBpcyBzZWxlY3RlZCBhdFxuICogcnVudGltZSwgc2luY2UgdGhlIGNvbmZpZ3VyZWQgc2hlbGwgaXMgYXN5bmMuIEFnbm9zdGljIGFuZCBPUy1vbmx5IHZhbHVlcyBhcmVcbiAqIHJlcGVhdGVkIGFjcm9zcyB0aGUgc2hlbGwgZmFtaWxpZXMgc28gZXZlcnkgdG9rZW4gdW5pZm9ybWx5IHlpZWxkc1xuICogYFNoZWxsU2NvcGVkPEY+YC4gVGhlIHNoZWxsIGFuYWxvZ3VlL3N1cGVyc2V0IG9mIGBnZXRJbmplY3RhYmxlRm9yT3BlcmF0aW5nU3lzdGVtc2AuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlID0gPEYgZXh0ZW5kcyBGYWN0b3J5PihhcmdzOiB7XG4gIGlkOiBzdHJpbmc7XG4gIGluamVjdGlvblRva2VuOiBJbmplY3Rpb25Ub2tlbjI8e1xuICAgIHNpbmdsZUZhY3Rvcnk6ICgpID0+IFNoZWxsU2NvcGVkPEY+O1xuICAgIG1hbnlGYWN0b3J5OiBhbnk7XG4gICAgc3BlY2lmaWNUb2tlbkZhY3Rvcnk6IHVuZGVmaW5lZDtcbiAgICBjYXJkaW5hbGl0eTogYW55O1xuICB9PjtcbiAgdmFsdWU6IE1heWJlT3BlcmF0aW5nU3lzdGVtQW5kU2hlbGxTcGVjaWZpYzxGPjtcbn0pID0+IHtcbiAgY29uc3QgeyBpZCwgaW5qZWN0aW9uVG9rZW4sIHZhbHVlIH0gPSBhcmdzO1xuXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHJldHVybiBnZXRJbmplY3RhYmxlRm9yU2hlbGxzKHsgaWQsIGluamVjdGlvblRva2VuLCBpbnN0YW50aWF0ZTogc2FtZUZvckV2ZXJ5U2hlbGwodmFsdWUpIH0pO1xuICB9XG5cbiAgaWYgKGlzU2hlbGxTcGVjaWZpYyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZ2V0SW5qZWN0YWJsZUZvclNoZWxscyh7IGlkLCBpbmplY3Rpb25Ub2tlbiwgaW5zdGFudGlhdGU6IHBlclNoZWxsUHJvZHVjZXJzKHZhbHVlKSB9KTtcbiAgfVxuXG4gIGNvbnN0IHBlck9wZXJhdGluZ1N5c3RlbSA9IChvc1ZhbHVlOiBGIHwgU2hlbGxTcGVjaWZpYzxGPik6IFBlclNoZWxsRmFtaWx5PCgpID0+IEY+ID0+XG4gICAgaXNGdW5jdGlvbihvc1ZhbHVlKSA/IHNhbWVGb3JFdmVyeVNoZWxsKG9zVmFsdWUpIDogcGVyU2hlbGxQcm9kdWNlcnMob3NWYWx1ZSk7XG5cbiAgcmV0dXJuIGdldEluamVjdGFibGVGb3JPcGVyYXRpbmdTeXN0ZW1zQW5kU2hlbGxzKHtcbiAgICBpZCxcbiAgICBpbmplY3Rpb25Ub2tlbixcbiAgICBpbnN0YW50aWF0ZToge1xuICAgICAgbWFjb3M6IHBlck9wZXJhdGluZ1N5c3RlbSh2YWx1ZS5tYWNvcyksXG4gICAgICB3aW5kb3dzOiBwZXJPcGVyYXRpbmdTeXN0ZW0odmFsdWUud2luZG93cyksXG4gICAgICBsaW51eDogcGVyT3BlcmF0aW5nU3lzdGVtKHZhbHVlLmxpbnV4KSxcbiAgICB9LFxuICB9KTtcbn07XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHR5cGUgeyBTaGVsbEZhbWlseSB9IGZyb20gXCJAazhzbGVucy9wdWJsaWMtdXRpbGl0aWVzXCI7XG5cbi8qKlxuICogUmVhY3RpdmUgbG9va3VwIG9mIHRoZSBhY3RpdmUgc2hlbGwgKmZhbWlseSogKGBwb3NpeGAvYGZpc2hgL2BjbWRgL2Bwb3dlcnNoZWxsYCksXG4gKiBkZXJpdmVkIGZyb20gdGhlIHVzZXItY29uZmlndXJlZCBzaGVsbC4gQ29uc3VtZXJzIG9mIHRoZSBwZXIta2luZCBBSSBjb21tYW5kXG4gKiB0b2tlbnMgKHdoaWNoIHJlZ2lzdGVyIG9uZSB7QGxpbmsgaW1wb3J0KFwiQGs4c2xlbnMvcHVibGljLXV0aWxpdGllc1wiKS5TaGVsbFNjb3BlZH0gY2VsbFxuICogcGVyIGZhbWlseSkgdXNlIHRoaXMgdG8gcGljayB0aGUgYWN0aXZlIHNoZWxsJ3MgY29tbWFuZCBhdCBydW50aW1lIHZpYVxuICogYHJlc29sdmVGb3JTaGVsbChpbmplY3RNYW55KHRva2VuLmZvcihraW5kKSkoKSwgY3VycmVudFNoZWxsRmFtaWx5LmdldCgpKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBjdXJyZW50U2hlbGxGYW1pbHlJbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuMjx7XG4gIHNpbmdsZUZhY3Rvcnk6ICgpID0+IElDb21wdXRlZFZhbHVlPFNoZWxsRmFtaWx5Pjtcbn0+KHtcbiAgaWQ6IFwiY3VycmVudC1zaGVsbC1mYW1pbHlcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKlxuICogVGhlIHJlZ2lzdHJ5IG9mIGF2YWlsYWJsZSBBSSB0b29sIGtpbmRzLiBFYWNoIGNvbnRyaWJ1dGlvbiBpcyBKVVNUIGEga2luZDtcbiAqIGV2ZXJ5IG90aGVyIGFzcGVjdCAoY29tbWFuZCwgaW5zdGFsbC1zdGF0ZSwgbmFtZSwgb3JkZXIsIFx1MjAyNikgaXMgY29udHJpYnV0ZWRcbiAqIHZpYSBpdHMgb3duIGAuZm9yKGtpbmQpYCB0b2tlbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogKCkgPT4gQWlUb29sS2luZCB9Pih7XG4gIGlkOiBcImFpLXRvb2xcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiwgdHlwZSBNYW55RmFjdG9yeSB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IFNoZWxsU2NvcGVkIH0gZnJvbSBcIkBrOHNsZW5zL3BsYXRmb3JtLXNwZWNpZmljLWluamVjdGFibGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQsIEdldENsaUNvbW1hbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKlxuICogUGVyLWtpbmQgYnVpbGRlciBmb3IgdGhlIGNvbW1hbmQgdGhhdCBsYXVuY2hlcyBhbiBBSSB0b29sIGluIGEgdGVybWluYWwuXG4gKiBDb250cmlidXRlIG9uZSBwZXIgdG9vbCBraW5kIHZpYSBgLmZvcihraW5kKWAuIFJlZ2lzdGVyZWQgKGJ5IHRoZSBidW5jaCBmYWN0b3J5KVxuICogYXMgb25lIHtAbGluayBTaGVsbFNjb3BlZH0gY2VsbCBwZXIgc2hlbGwgZmFtaWx5OyBjb25zdW1lcnMgcGljayB0aGUgYWN0aXZlXG4gKiBzaGVsbCdzIGF0IHJ1bnRpbWUgd2l0aCBgcmVzb2x2ZUZvclNoZWxsKGluamVjdE1hbnkodG9rZW4uZm9yKGtpbmQpKSgpLCBmYW1pbHkpYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFpQ29tbWFuZEZvclRlcm1pbmFsSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBTaGVsbFNjb3BlZDxHZXRDbGlDb21tYW5kPjtcbn0+KHtcbiAgaWQ6IFwiZ2V0LWFpLWNvbW1hbmQtZm9yLXRlcm1pbmFsXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7XG4gICAgc2luZ2xlRmFjdG9yeTogKCkgPT4gU2hlbGxTY29wZWQ8R2V0Q2xpQ29tbWFuZD47XG4gICAgbWFueUZhY3Rvcnk6IE1hbnlGYWN0b3J5PCgpID0+IFNoZWxsU2NvcGVkPEdldENsaUNvbW1hbmQ+PjtcbiAgfT4oe1xuICAgIGlkOiBgZ2V0LWFpLWNvbW1hbmQtZm9yLXRlcm1pbmFsLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG4gIH0pKCksXG4pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiwgdHlwZSBNYW55RmFjdG9yeSB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IFNoZWxsU2NvcGVkIH0gZnJvbSBcIkBrOHNsZW5zL3BsYXRmb3JtLXNwZWNpZmljLWluamVjdGFibGVzXCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQsIEdldENsaUNvbW1hbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKlxuICogUGVyLWtpbmQgYnVpbGRlciBmb3IgdGhlIGNvbW1hbmQgdGhhdCAqcmVzdW1lcyogYW4gQUkgdG9vbCBpbiBhIHRlcm1pbmFsIFx1MjAxNFxuICogcnVuIGluc3RlYWQgb2Yge0BsaW5rIGdldEFpQ29tbWFuZEZvclRlcm1pbmFsSW5qZWN0aW9uVG9rZW59IHdoZW4gdGhlIHRhYidzXG4gKiBzZXNzaW9uIGlzIHJlLWVzdGFibGlzaGVkIChlLmcuIGFmdGVyIGFuIGFwcCByZXN0YXJ0KSByYXRoZXIgdGhhbiBmaXJzdFxuICogb3BlbmVkLCBzbyB0aGUgdG9vbCBjb250aW51ZXMgaXRzIHByZXZpb3VzIHNlc3Npb24gKGUuZy4gYGNsYXVkZSAtLWNvbnRpbnVlXG4gKiB8fCBjbGF1ZGVgLCB3aGljaCBmYWxscyBiYWNrIHRvIGEgZnJlc2ggbGF1bmNoIHdoZW4gdGhlcmUgaXMgbm8gc2Vzc2lvbikuXG4gKlxuICogUmVzb2x2ZXMgdG8gYSB7QGxpbmsgR2V0Q2xpQ29tbWFuZH0gKHRoZSBsYXVuY2gtY29tbWFuZCBzaWduYXR1cmUpOyByZXN1bWVcbiAqIGJ1aWxkZXJzIHR5cGljYWxseSBpZ25vcmUgYHByb21wdGAgKHRoZXkgY29udGludWUgdGhlIHByaW9yIHNlc3Npb24gcmF0aGVyXG4gKiB0aGFuIHN0YXJ0aW5nIGEgbmV3IG9uZSkuIEV2ZXJ5IHRvb2wgY29udHJpYnV0ZXMgb25lIHZpYSBgLmZvcihraW5kKWAgXHUyMDE0IGEgdG9vbFxuICogd2l0aCBubyBkZWRpY2F0ZWQgcmVzdW1lIGludm9jYXRpb24gcGFzc2VzIGl0cyBsYXVuY2ggY29tbWFuZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldFJlc3VtZUFpQ29tbWFuZEZvclRlcm1pbmFsSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBTaGVsbFNjb3BlZDxHZXRDbGlDb21tYW5kPjtcbn0+KHtcbiAgaWQ6IFwiZ2V0LXJlc3VtZS1haS1jb21tYW5kLWZvci10ZXJtaW5hbFwiLFxuICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbn0pKChraW5kOiBBaVRvb2xLaW5kKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICAgIHNpbmdsZUZhY3Rvcnk6ICgpID0+IFNoZWxsU2NvcGVkPEdldENsaUNvbW1hbmQ+O1xuICAgIG1hbnlGYWN0b3J5OiBNYW55RmFjdG9yeTwoKSA9PiBTaGVsbFNjb3BlZDxHZXRDbGlDb21tYW5kPj47XG4gIH0+KHtcbiAgICBpZDogYGdldC1yZXN1bWUtYWktY29tbWFuZC1mb3ItdGVybWluYWwtJHtraW5kfWAsXG4gICAgc3BlY2lhbGl0eToga2luZCxcbiAgICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbiAgfSkoKSxcbik7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuLyoqIFJ1bnMgYW4gaW5zdGFsbGF0aW9uLWRldGVjdGlvbiBjb21tYW5kIG9uIHRoZSBob3N0OyByZXNvbHZlcyBgdHJ1ZWAgaWZmIGl0IGV4aXRzIDAuICovXG5leHBvcnQgdHlwZSBBaVRvb2xJbnN0YWxsZWRWaWFDbGlDb21tYW5kID0gKGNvbW1hbmQ6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcblxuLyoqXG4gKiBSdW5zIGEgdG9vbCdzIGBnZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmRgIG91dHB1dCBvbiB0aGUgaG9zdCBhbmQgcmVwb3J0c1xuICogd2hldGhlciBpdCBzdWNjZWVkZWQgKGV4aXQgY29kZSAwKS4gSW1wbGVtZW50ZWQgaW4gdGhlIGBAbGVuc2FwcC9haS10b29sc2BcbiAqIGZlYXR1cmUgdmlhIGBjbGlFeGVjdXRlYCBhZ2FpbnN0IHRoZSBzaGVsbC1zeW5jZWQgZW52aXJvbm1lbnQsIHNvIGRldGVjdGlvblxuICogcmVzb2x2ZXMgdGhlIHNhbWUgUEFUSCB0aGUgbGF1bmNoZWQgdG9vbHMgc2VlLiBUaGUgZGV0ZWN0ZWQtdG9vbHMgbGlzdFxuICogKGByZWZyZXNoQWlUb29sc2ApIHJ1bnMgdGhlIHBlci1raW5kIGNvbW1hbmQgdGhyb3VnaCBpdC5cbiAqXG4gKiBUaGUgaW5zdGFuY2UgaXMgdGhlIGNoZWNrIGZ1bmN0aW9uIGl0c2VsZiAoYGRpLmluamVjdCh0b2tlbikoKWAgeWllbGRzIGl0KSBcdTIwMTRcbiAqIGEgdjIgaW5qZWN0YWJsZSBtZW1vaXNlcyBpdHMgaW5zdGFuY2UgYnkgY2FsbCBhcmdzLCBzbyByZXR1cm5pbmcgYSBmdW5jdGlvblxuICogKHJhdGhlciB0aGFuIGEgYFByb21pc2U8Ym9vbGVhbj5gKSBrZWVwcyBldmVyeSBjaGVjayBsaXZlIGFjcm9zcyByZS1zY2Fucy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluc3RhbGxlZFZpYUNsaUNvbW1hbmRJbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuMjx7XG4gIHNpbmdsZUZhY3Rvcnk6ICgpID0+IEFpVG9vbEluc3RhbGxlZFZpYUNsaUNvbW1hbmQ7XG59Pih7XG4gIGlkOiBcImFpLXRvb2wtaW5zdGFsbGVkLXZpYS1jbGktY29tbWFuZFwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuLyoqXG4gKiBSZS1zY2FucyBBSSB0b29sIGluc3RhbGxhdGlvbiBzdGF0ZSBhbmQgdXBkYXRlcyB7QGxpbmsgYWlUb29sc0luamVjdGlvblRva2VufS5cbiAqIEF3YWl0YWJsZSwgc28gY2FsbGVycyBjYW4gYWN0IG9uY2UgZGV0ZWN0aW9uIHNldHRsZXMuXG4gKi9cbmV4cG9ydCB0eXBlIFJlZnJlc2hBaVRvb2xEZXRlY3Rpb24gPSAoKSA9PiBQcm9taXNlPHZvaWQ+O1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBleHBsaWNpdCBcInJlLXNjYW4gaW5zdGFsbGVkIEFJIHRvb2xzXCIgYWN0aW9uLiBEZXRlY3Rpb24gaXMgbmV2ZXJcbiAqIGEgc2lkZSBlZmZlY3Qgb2YgaW5qZWN0aW9uOiB0aGUgcHJlZmVyZW5jZXMgVUkgY2FsbHMgdGhpcyBvbiBtb3VudCBhbmQgZnJvbSBhXG4gKiBcIlJlZnJlc2hcIiBjb250cm9sLCBhbmQgdGhlIGxhdW5jaCBwYXRoIGF3YWl0cyBpdCBiZWZvcmUgcmVzb2x2aW5nIHRoZVxuICogZWZmZWN0aXZlIHRvb2wgXHUyMDE0IHNvIHRvb2xzIGluc3RhbGxlZC9yZW1vdmVkIHdoaWxlIExlbnMgaXMgcnVubmluZyBhcmUgcGlja2VkXG4gKiB1cCB3aXRob3V0IGEgcmVzdGFydC5cbiAqXG4gKiBTaGFwZWQgYXMgYSBmYWN0b3J5IHJldHVybmluZyB0aGUgYWN0aW9uIChsaWtlIGBhaVRvb2xOYW1lSW5qZWN0aW9uVG9rZW5gKSBzb1xuICogaXQgaXMgY29uc3VtYWJsZSB2aWEgYHVzZUluamVjdGAgLyBgZGkuaW5qZWN0YCBcdTIwMTQgd2hpY2ggcmV0dXJuIHRoZSBhY3Rpb24gXHUyMDE0IGFuZFxuICogbmV2ZXIgbmVlZHMgYGluamVjdDJgIChhYnNlbnQgZnJvbSB0aGUgUmVhY3QtY29udGV4dCBESSBjb250YWluZXIpLlxuICovXG5leHBvcnQgY29uc3QgcmVmcmVzaEFpVG9vbERldGVjdGlvbkluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogKCkgPT4gUmVmcmVzaEFpVG9vbERldGVjdGlvbiB9PihcbiAge1xuICAgIGlkOiBcInJlZnJlc2gtYWktdG9vbC1kZXRlY3Rpb25cIixcbiAgICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbiAgfSxcbikoKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKiBSZXNvbHZlcyB0aGUgZGlzcGxheS1uYW1lIGNvbXBvbmVudCBmb3IgYSBnaXZlbiBBSSB0b29sIGtpbmQuICovXG5leHBvcnQgdHlwZSBBaVRvb2xOYW1lID0gKCkgPT4gUmVhY3QuQ29tcG9uZW50VHlwZTtcblxuLyoqXG4gKiBQZXIta2luZCBkaXNwbGF5IG5hbWUgZm9yIGFuIEFJIHRvb2wgXHUyMDE0IGEgUmVhY3QgY29tcG9uZW50IChub3QgYSBzdHJpbmcpLCBzb1xuICogYSB0b29sIGNhbiByZW5kZXIgYnJhbmRpbmcvbWFya3VwLiBDb250cmlidXRlIG9uZSBwZXIgdG9vbCBraW5kLlxuICovXG5leHBvcnQgY29uc3QgYWlUb29sTmFtZUluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sTmFtZSB9Pih7XG4gIGlkOiBcImFpLXRvb2wtbmFtZVwiLFxuICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbn0pKChraW5kOiBBaVRvb2xLaW5kKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xOYW1lIH0+KHtcbiAgICBpZDogYGFpLXRvb2wtbmFtZS0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIHBsYWluLXRleHQgZGlzcGxheSBuYW1lIGZvciBhIGdpdmVuIEFJIHRvb2wga2luZC4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbERpc3BsYXlOYW1lID0gKCkgPT4gc3RyaW5nO1xuXG4vKipcbiAqIFBlci1raW5kIHBsYWluLXRleHQgZGlzcGxheSBuYW1lIChlLmcuIFwiQ2xhdWRlIENvZGVcIikuIFVzZWQgYnkgc3RyaW5nLW9ubHlcbiAqIHNsb3RzIHRoYXQgY2Fubm90IHJlbmRlciB0aGUgUmVhY3QgYGFpVG9vbE5hbWVJbmplY3Rpb25Ub2tlbmAgY29tcG9uZW50IFx1MjAxNCBmb3JcbiAqIGV4YW1wbGUgdGhlIGNvbW1hbmQtcGFsZXR0ZSBlbnRyeSB0aXRsZS4gVGhlIFJlYWN0IG5hbWUgY29tcG9uZW50IGRlcml2ZXNcbiAqIGZyb20gdGhpcyBzYW1lIHZhbHVlLCBzbyB0aGUgdHdvIHN0YXkgaW4gc3luYy5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbERpc3BsYXlOYW1lSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xEaXNwbGF5TmFtZSB9Pih7XG4gIGlkOiBcImFpLXRvb2wtZGlzcGxheS1uYW1lXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6IEFpVG9vbERpc3BsYXlOYW1lIH0+KHtcbiAgICBpZDogYGFpLXRvb2wtZGlzcGxheS1uYW1lLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwib25lXCIsXG4gIH0pKCksXG4pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sS2luZCB9IGZyb20gXCIuL2FpLXRvb2xcIjtcblxuLyoqIFByb3BzIGEgdG9vbCdzIGRlc2NyaXB0aW9uIGNvbXBvbmVudCByZWNlaXZlcywgc28gaXQgY2FuIGFkYXB0IHRvIGRldGVjdGlvbiBzdGF0ZS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQWlUb29sRGVzY3JpcHRpb25Qcm9wcyB7XG4gIC8qKiBXaGV0aGVyIHRoZSB0b29sIHdhcyBkZXRlY3RlZCBhcyBpbnN0YWxsZWQ7IGxldHMgYSBkZXNjcmlwdGlvbiBzd2FwIGluIGEgXCJOb3QgZm91bmQgaW4gUEFUSFwiIG1lc3NhZ2UuICovXG4gIHJlYWRvbmx5IGlzSW5zdGFsbGVkOiBib29sZWFuO1xufVxuXG4vKiogUmVzb2x2ZXMgYSBraW5kJ3MgZGVzY3JpcHRpb24gY29tcG9uZW50LiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sRGVzY3JpcHRpb24gPSAoKSA9PiBSZWFjdC5Db21wb25lbnRUeXBlPEFpVG9vbERlc2NyaXB0aW9uUHJvcHM+O1xuXG4vKipcbiAqIFBlci1raW5kIGRlc2NyaXB0aW9uIGZvciBhbiBBSSB0b29sIFx1MjAxNCBhIHNob3J0IGJsdXJiIGludHJvZHVjaW5nIHRoZSB0b29sIChlLmcuXG4gKiBcIlRoZSBjb2RpbmcgYXNzaXN0YW50IGJ5IEFudGhyb3BpY1wiKSwgc2hvd24gYXMgdGhlIHNlbGVjdG9yJ3Mgc2Vjb25kYXJ5IGxpbmUuXG4gKiBBIFJlYWN0IGNvbXBvbmVudCAobm90IGEgc3RyaW5nKSByZWNlaXZpbmcgdGhlIHRvb2wncyBkZXRlY3Rpb24gc3RhdGUsIHNvIGl0XG4gKiBtYXkgaW5jbHVkZSBtYXJrdXAvbGlua3MgYW5kIG9wdCB0byBzaG93IGEgXCJOb3QgZm91bmQgaW4gUEFUSFwiIG1lc3NhZ2UgKG9yIGFueVxuICogb3RoZXIgZ3VpZGFuY2UpIHdoZW4gdGhlIHRvb2wgaXMgbm90IGluc3RhbGxlZC4gQ29udHJpYnV0ZSBvbmUgcGVyIHRvb2wga2luZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbERlc2NyaXB0aW9uSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xEZXNjcmlwdGlvbiB9Pih7XG4gIGlkOiBcImFpLXRvb2wtZGVzY3JpcHRpb25cIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sRGVzY3JpcHRpb24gfT4oe1xuICAgIGlkOiBgYWktdG9vbC1kZXNjcmlwdGlvbi0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgU3ZnUHJvcHMgfSBmcm9tIFwiQGs4c2xlbnMvZWxlbWVudC1jb21wb25lbnRzXCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKiBSZXNvbHZlcyB0aGUgaWNvbiBjb21wb25lbnQgZm9yIGEgZ2l2ZW4gQUkgdG9vbCBraW5kLiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sSWNvbiA9ICgpID0+IFJlYWN0LkNvbXBvbmVudFR5cGU8U3ZnUHJvcHM+O1xuXG4vKipcbiAqIFBlci1raW5kIGljb24gZm9yIGFuIEFJIHRvb2wgXHUyMDE0IGEgUmVhY3QgY29tcG9uZW50IChub3QgYW4gaWNvbiBuYW1lKS4gSXRcbiAqIGFjY2VwdHMgYFN2Z1Byb3BzYCBzbyBjYWxsIHNpdGVzIGNhbiBzaXplIGl0IChgJHNpemVgKSwgYnV0IGV2ZXJ5IGZpZWxkIGlzXG4gKiBvcHRpb25hbCwgc28gYSBwcm9wLWxlc3MgY29tcG9uZW50IGlzIGFzc2lnbmFibGUgdG9vLiBTaG93biBiZXNpZGUgdGhlIHRvb2wnc1xuICogbmFtZSBpbiB0aGUgc2VsZWN0b3IgYW5kIHdoZXJldmVyIHRoZSB0b29sIGlzIG9mZmVyZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBhaVRvb2xJY29uSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJY29uIH0+KHtcbiAgaWQ6IFwiYWktdG9vbC1pY29uXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6IEFpVG9vbEljb24gfT4oe1xuICAgIGlkOiBgYWktdG9vbC1pY29uLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwib25lXCIsXG4gIH0pKCksXG4pO1xuXG4vKipcbiAqIFJlc29sdmVzIHRoZSBpY29uIGNvbXBvbmVudCBmb3IgYW4gYXJiaXRyYXJ5IEFJIHRvb2wga2luZCwgZmFsbGluZyBiYWNrIHRvIHRoZSBnZW5lcmljIGljb24gZm9yIGtpbmRzXG4gKiB3aXRob3V0IGEgcmVnaXN0ZXJlZCBvbmUgKGUuZy4gdGhlIGN1c3RvbSBraW5kKS4gVXNlIHRoaXMgdG8gcmVuZGVyIGEgKnNwZWNpZmljKiB0b29sJ3MgaWNvbiBcdTIwMTQgZS5nLiBhblxuICogZW50cnkgcG9pbnQgdGhhdCBtdXN0IHN0YXkgb24gdGhlIHRvb2wgaXQgd2FzIGNyZWF0ZWQgZm9yIHJhdGhlciB0aGFuIGZvbGxvd2luZyB0aGUgbGl2ZSBzZWxlY3Rpb24uXG4gKiBGb3IgdGhlIGN1cnJlbnRseS1zZWxlY3RlZCB0b29sLCBwcmVmZXIge0BsaW5rIGVmZmVjdGl2ZUFpVG9vbEljb25JbmplY3Rpb25Ub2tlbn0uXG4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbEljb25Gb3JLaW5kID0gKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTwoa2luZDogQWlUb29sS2luZCkgPT4gUmVhY3QuQ29tcG9uZW50VHlwZTxTdmdQcm9wcz4+PjtcblxuZXhwb3J0IGNvbnN0IGFpVG9vbEljb25Gb3JLaW5kSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJY29uRm9yS2luZCB9Pih7XG4gIGlkOiBcImFpLXRvb2wtaWNvbi1mb3Ita2luZFwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iLCAiaW1wb3J0IHsgdHlwZSBTdmdQcm9wcywgU3ZnIH0gZnJvbSBcIkBrOHNsZW5zL2VsZW1lbnQtY29tcG9uZW50c1wiO1xuXG4vKipcbiAqIEdlbmVyaWMgZmFsbGJhY2sgaWNvbiBmb3IgYW4gQUkgdG9vbCB0aGF0IGNvbnRyaWJ1dGVzIG5vIGBJY29uYCBvZiBpdHMgb3duIChhXG4gKiB0ZXJtaW5hbCBnbHlwaCkuIFRoZSBidW5jaCBmYWN0b3J5IGZhbGxzIGJhY2sgdG8gdGhpcyBzbyB0aGUgZWZmZWN0aXZlLWljb25cbiAqIHRva2VuIG5ldmVyIHJlc29sdmVzIHRvIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgY29uc3QgRGVmYXVsdEFpVG9vbEljb24gPSAocHJvcHM6IFN2Z1Byb3BzKSA9PiAoXG4gIDxTdmcgey4uLnByb3BzfSB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cImN1cnJlbnRDb2xvclwiPlxuICAgIDxwYXRoIGQ9XCJNMyAzYTIgMiAwIDAgMC0yIDJ2MTRhMiAyIDAgMCAwIDIgMmgxOGEyIDIgMCAwIDAgMi0yVjVhMiAyIDAgMCAwLTItMkgzem0wIDJoMTh2MTRIM1Y1em0zLjUgMi41TDUgOWwyIDItMiAyIDEuNSAxLjVMMTEgMTEgNi41IDcuNXpNMTIgMTRoNXYyaC01di0yelwiIC8+XG4gIDwvU3ZnPlxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIG9yZGVyL3ByaW9yaXR5IG51bWJlciBmb3IgYSBnaXZlbiBBSSB0b29sIGtpbmQuICovXG5leHBvcnQgdHlwZSBBaVRvb2xPcmRlck51bWJlciA9ICgpID0+IG51bWJlcjtcblxuLyoqXG4gKiBQZXIta2luZCBvcmRlcmluZy9wcmlvcml0eSBmb3IgYW4gQUkgdG9vbC4gTG93ZXIgY29tZXMgZmlyc3QgaW4gdGhlIHNlbGVjdG9yO1xuICogdGhlIGxvd2VzdC1udW1iZXJlZCAqaW5zdGFsbGVkKiB0b29sIGlzIHRoZSBkZWZhdWx0IHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbE9yZGVyTnVtYmVySW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xPcmRlck51bWJlciB9Pih7XG4gIGlkOiBcImFpLXRvb2wtb3JkZXItbnVtYmVyXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6IEFpVG9vbE9yZGVyTnVtYmVyIH0+KHtcbiAgICBpZDogYGFpLXRvb2wtb3JkZXItbnVtYmVyLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwib25lXCIsXG4gIH0pKCksXG4pO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sS2luZCB9IGZyb20gXCIuL2FpLXRvb2xcIjtcblxuLyoqIFJlc29sdmVzIGEga2luZCdzIHNldHRpbmdzIGNvbXBvbmVudCwgc2hvd24gYmVsb3cgdGhlIHNlbGVjdG9yIHdoZW4gdGhhdCBraW5kIGlzIHNlbGVjdGVkLiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sU2V0dGluZ3MgPSAoKSA9PiBSZWFjdC5Db21wb25lbnRUeXBlO1xuXG4vKipcbiAqIFBlci1raW5kIHNldHRpbmdzIFVJLCByZW5kZXJlZCBiZW5lYXRoIHRoZSBBSS10b29sIHNlbGVjdG9yIHdoZW4gdGhhdCBraW5kIGlzXG4gKiB0aGUgYWN0aXZlIHNlbGVjdGlvbi4gT3B0aW9uYWwgXHUyMDE0IG1vc3QgdG9vbHMgbmVlZCBub25lOyBlLmcuIHRoZSBcImN1c3RvbVwiIGtpbmRcbiAqIGNvbnRyaWJ1dGVzIGEgY29tbWFuZCBpbnB1dCArIGEgcnVuLWV4dGVybmFsbHkgdG9nZ2xlLiBBIFJlYWN0IGNvbXBvbmVudC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbFNldHRpbmdzSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xTZXR0aW5ncyB9Pih7XG4gIGlkOiBcImFpLXRvb2wtc2V0dGluZ3NcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sU2V0dGluZ3MgfT4oe1xuICAgIGlkOiBgYWktdG9vbC1zZXR0aW5ncy0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKiBSZXNvbHZlcyBhIGtpbmQncyBpbnN0YWxsYXRpb24taW5zdHJ1Y3Rpb25zIGNvbXBvbmVudC4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbEluc3RhbGxhdGlvbkluc3RydWN0aW9ucyA9ICgpID0+IFJlYWN0LkNvbXBvbmVudFR5cGU7XG5cbi8qKlxuICogUGVyLWtpbmQgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBVSSwgcmVuZGVyZWQgYmVuZWF0aCB0aGUgQUktdG9vbCBzZWxlY3RvclxuICogd2hlbiB0aGF0IGtpbmQgaXMgZGV0ZWN0ZWQgYXMgbm90IGluc3RhbGxlZCBcdTIwMTQgc28gdGhlIHRvb2wgaXMgc2hvd24gZGlzYWJsZWRcbiAqIGluc3RlYWQgb2YgaGlkZGVuLCB3aXRoIGd1aWRhbmNlIG9uIGhvdyB0byBpbnN0YWxsIGl0LiBPcHRpb25hbDsgYSBSZWFjdFxuICogY29tcG9uZW50LCBzbyBpbnN0cnVjdGlvbnMgbWF5IGluY2x1ZGUgbGlua3MgKGUuZy4gYDxCcm93c2VyTGluaz5gKSBvciBhbnlcbiAqIG90aGVyIG1hcmt1cC5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluc3RhbGxhdGlvbkluc3RydWN0aW9uc0luamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogQWlUb29sSW5zdGFsbGF0aW9uSW5zdHJ1Y3Rpb25zO1xufT4oe1xuICBpZDogXCJhaS10b29sLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnNcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sSW5zdGFsbGF0aW9uSW5zdHJ1Y3Rpb25zIH0+KHtcbiAgICBpZDogYGFpLXRvb2wtaW5zdGFsbGF0aW9uLWluc3RydWN0aW9ucy0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIGluc3RydWN0aW9ucyBmaWxlbmFtZSBhIGdpdmVuIEFJIHRvb2wga2luZCByZWFkcyBmcm9tIGl0cyB3b3JraW5nIGRpcmVjdG9yeS4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbEluc3RydWN0aW9uc0ZpbGVuYW1lID0gKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4vKipcbiAqIFBlci1raW5kIGluc3RydWN0aW9ucyBmaWxlbmFtZSBcdTIwMTQgdGhlIGZpbGUgdGhlIHRvb2wgYXV0by1kaXNjb3ZlcnMgaW4gaXRzXG4gKiB3b3JraW5nIGRpcmVjdG9yeSAoZS5nLiBgXCJDTEFVREUubWRcImAgZm9yIENsYXVkZSBDb2RlLCBgXCJHRU1JTkkubWRcImAgZm9yXG4gKiBHZW1pbmkgQ0xJKS4gVGhlIGxhdW5jaGVyIGFsd2F5cyB3cml0ZXMgdGhlIGNhbm9uaWNhbFxuICoge0BsaW5rIGFnZW50c0luc3RydWN0aW9uc0ZpbGVuYW1lfTsgd2hlbiBhIGtpbmQgZGVjbGFyZXMgYSBkaWZmZXJlbnQgZmlsZW5hbWVcbiAqIHRoZSBsYXVuY2hlciBhZGRpdGlvbmFsbHkgd3JpdGVzIHRoYXQgZmlsZSBhcyBhbiBpbmRpcmVjdGlvbiBpbXBvcnRpbmcgdGhlXG4gKiBjYW5vbmljYWwgb25lLiBgdW5kZWZpbmVkYCBmb3Iga2luZHMgdGhhdCByZWFkIG5vIHN1Y2ggZmlsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluc3RydWN0aW9uc0ZpbGVuYW1lSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJbnN0cnVjdGlvbnNGaWxlbmFtZTtcbn0+KHtcbiAgaWQ6IFwiYWktdG9vbC1pbnN0cnVjdGlvbnMtZmlsZW5hbWVcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogQWlUb29sSW5zdHJ1Y3Rpb25zRmlsZW5hbWUgfT4oe1xuICAgIGlkOiBgYWktdG9vbC1pbnN0cnVjdGlvbnMtZmlsZW5hbWUtJHtraW5kfWAsXG4gICAgc3BlY2lhbGl0eToga2luZCxcbiAgICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbiAgfSkoKSxcbik7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuLyoqIFJlc29sdmVzIHRoZSBpbmRpcmVjdGlvbiBpbnN0cnVjdGlvbnMgZmlsZW5hbWVzIHRvIHdyaXRlIGFjcm9zcyBhbGwgcmVnaXN0ZXJlZCBBSSB0b29scy4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbEluc3RydWN0aW9uc0luZGlyZWN0aW9uRmlsZW5hbWVzID0gKCkgPT4gcmVhZG9ubHkgc3RyaW5nW107XG5cbi8qKlxuICogVGhlIGRpc3RpbmN0IHRvb2wtc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zIGZpbGVuYW1lcyBhY3Jvc3MgKiphbGwqKiByZWdpc3RlcmVkIEFJXG4gKiB0b29sIGtpbmRzIFx1MjAxNCByZWdhcmRsZXNzIG9mIGluc3RhbGxhdGlvbiBzdGF0ZSBcdTIwMTQgZXhjbHVkaW5nIHRoZSBjYW5vbmljYWxcbiAqIHtAbGluayBhZ2VudHNJbnN0cnVjdGlvbnNGaWxlbmFtZX0uIEEgbGF1bmNoZXIgd3JpdGVzIHRoZSBjYW5vbmljYWxcbiAqIGBBR0VOVFMubWRgIHBsdXMgZWFjaCBvZiB0aGVzZSBhcyBhbiBpbmRpcmVjdGlvbiBpbXBvcnRpbmcgaXQsIHNvIHdoaWNoZXZlclxuICogdG9vbCB0aGUgdXNlciBsYXRlciBwaWNrcyBmaW5kcyBpdHMgaW5zdHJ1Y3Rpb25zIGluIHRoZSB3b3JraW5nIGRpcmVjdG9yeS5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbEluc3RydWN0aW9uc0luZGlyZWN0aW9uRmlsZW5hbWVzSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJbnN0cnVjdGlvbnNJbmRpcmVjdGlvbkZpbGVuYW1lcztcbn0+KHtcbiAgaWQ6IFwiYWktdG9vbC1pbnN0cnVjdGlvbnMtaW5kaXJlY3Rpb24tZmlsZW5hbWVzXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcbiIsICJpbXBvcnQgeyBzaGVsbFF1b3RlIH0gZnJvbSBcIkBrOHNsZW5zL3B1YmxpYy11dGlsaXRpZXNcIjtcblxuY29uc3QgcHJvbXB0UGxhY2Vob2xkZXIgPSBcIntwcm9tcHR9XCI7XG5jb25zdCBkaXJQbGFjZWhvbGRlciA9IFwie2Rpcn1cIjtcblxuY29uc3QgZXNjYXBlRm9yUmVnZXggPSAodmFsdWU6IHN0cmluZykgPT4gdmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpO1xuXG5jb25zdCBzdWJzdGl0dXRlID0gKHRlbXBsYXRlOiBzdHJpbmcsIHBsYWNlaG9sZGVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcgPT4ge1xuICBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCAmJiB2YWx1ZSAhPT0gXCJcIikge1xuICAgIHJldHVybiB0ZW1wbGF0ZS5zcGxpdChwbGFjZWhvbGRlcikuam9pbihzaGVsbFF1b3RlKHZhbHVlKSk7XG4gIH1cblxuICAvLyBTdHJpcCB0aGUgcGxhY2Vob2xkZXIgYW5kIG9uZSBsZWFkaW5nIHdoaXRlc3BhY2UgcnVuLCBzbyBgY2xhdWRlIHtwcm9tcHR9YFxuICAvLyBiZWNvbWVzIGBjbGF1ZGVgLCBub3QgYGNsYXVkZSBgLlxuICBjb25zdCBzdHJpcFBhdHRlcm4gPSBuZXcgUmVnRXhwKGBcXFxccyoke2VzY2FwZUZvclJlZ2V4KHBsYWNlaG9sZGVyKX1gLCBcImdcIik7XG4gIHJldHVybiB0ZW1wbGF0ZS5yZXBsYWNlKHN0cmlwUGF0dGVybiwgXCJcIik7XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlc29sdmVMbG1Db21tYW5kT3B0aW9ucyB7XG4gIC8qKiBTZWVkZWQgaW5pdGlhbCB1c2VyIG1lc3NhZ2UsIHN1YnN0aXR1dGVkIGludG8gYHtwcm9tcHR9YC4gKi9cbiAgcHJvbXB0Pzogc3RyaW5nO1xuICAvKiogV29ya2luZyBkaXJlY3RvcnkgdGhlIGNvbW1hbmQgcnVucyBpbiwgc3Vic3RpdHV0ZWQgKHNoZWxsLWVzY2FwZWQpIGludG8gYHtkaXJ9YC4gKi9cbiAgZGlyPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIFJlc29sdmUgYSBmcmVlLXRleHQgTExNIGNvbW1hbmQgdGVtcGxhdGUgYnkgc3Vic3RpdHV0aW5nIHRoZSBge3Byb21wdH1gIGFuZFxuICogYHtkaXJ9YCBwbGFjZWhvbGRlcnMgd2l0aCBzaGVsbC1lc2NhcGVkIHZhbHVlcy4gVW5maWxsZWQgcGxhY2Vob2xkZXJzIChhbmQgb25lXG4gKiBsZWFkaW5nIHdoaXRlc3BhY2UgcnVuKSBhcmUgc3RyaXBwZWQuIEEgdmFsdWUgd2l0aCBubyBtYXRjaGluZyBwbGFjZWhvbGRlciBpc1xuICogc2ltcGx5IG9taXR0ZWQgXHUyMDE0IGluIHBhcnRpY3VsYXIsIGEgc2VlZGVkIHByb21wdCBpcyBOT1QgYXBwZW5kZWQgdG8gYSB0ZW1wbGF0ZVxuICogdGhhdCBvbWl0cyBge3Byb21wdH1gIChhIGNvbW1hbmQgc3VjaCBhcyBgb3BlbiAtYSBpVGVybSB7ZGlyfWAgbXVzdCBub3QgcmVjZWl2ZVxuICogdGhlIHByb21wdCBhcyBhIHN0cmF5IGFyZ3VtZW50KS5cbiAqL1xuZXhwb3J0IGNvbnN0IHJlc29sdmVMbG1Db21tYW5kID0gKHRlbXBsYXRlOiBzdHJpbmcsIHsgcHJvbXB0LCBkaXIgfTogUmVzb2x2ZUxsbUNvbW1hbmRPcHRpb25zID0ge30pOiBzdHJpbmcgPT4ge1xuICBsZXQgcmVzb2x2ZWQgPSBzdWJzdGl0dXRlKHRlbXBsYXRlLCBkaXJQbGFjZWhvbGRlciwgZGlyKTtcblxuICByZXNvbHZlZCA9IHN1YnN0aXR1dGUocmVzb2x2ZWQsIHByb21wdFBsYWNlaG9sZGVyLCBwcm9tcHQpO1xuXG4gIHJldHVybiByZXNvbHZlZDtcbn07XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRlcm5hbFRlcm1pbmFsQ29tbWFuZE9wdGlvbnMge1xuICAvKipcbiAgICogVGhlIHJlc29sdmVkIGlubmVyIGNvbW1hbmQgdG8gcnVuLCBpbnNlcnRlZCAqKnJhdyoqIChpdCBpcyBhIGZ1bGwgY29tbWFuZFxuICAgKiBsaW5lLCBub3QgYW4gYXJndW1lbnQpLlxuICAgKi9cbiAgcmVhZG9ubHkgY29tbWFuZDogc3RyaW5nO1xuICAvKiogVGhlIHdvcmtpbmcgZGlyZWN0b3J5IHRoZSBjb21tYW5kIHJ1bnMgaW4uIEJ1aWxkZXJzIHF1b3RlIGl0LCBzbyBhIHBhdGggd2l0aCBzcGFjZXMgaXMgc2FmZS4gKi9cbiAgcmVhZG9ubHkgZGlyOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBQZXItbGF1bmNoIGVudmlyb25tZW50IHRvIGFwcGx5LiBBIGZyZXNobHktb3BlbmVkIGV4dGVybmFsIHRlcm1pbmFsIHJ1bnMgaXRzXG4gICAqIG93biBzaGVsbCB0aGF0IGRvZXMgbm90IGluaGVyaXQgdGhlIGxhdW5jaGVyJ3MgZW52LCBzbyBhIGJ1aWxkZXIgaGFzIHRvIGNhcnJ5XG4gICAqIHRoZXNlIGludG8gdGhlIGxhdW5jaGVkIGNvbW1hbmQgaXRzZWxmIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gdGhlIGFtYmllbnRcbiAgICogZW52aXJvbm1lbnQuIFJlYWxpc3RpY2FsbHkgc21hbGwgKGUuZy4ganVzdCBgS1VCRUNPTkZJR2ApLlxuICAgKi9cbiAgcmVhZG9ubHkgZW52PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqXG4gICAqIFRoZSB1c2VyLWNvbmZpZ3VyZWQgc2hlbGwgKHRoZSBzYW1lIFwiU2hlbGwgUGF0aFwiIHRoZSBpbi1hcHAgdGVybWluYWwgdXNlcyksIHNvXG4gICAqIHRoZSBleHRlcm5hbCB0ZXJtaW5hbCBydW5zIHRoZSBjb21tYW5kIGluIFx1MjAxNCBhbmQgZHJvcHMgdGhlIHVzZXIgaW50byBcdTIwMTQgdGhhdFxuICAgKiBzaGVsbCByYXRoZXIgdGhhbiB0aGUgT1MvdGVybWluYWwgZGVmYXVsdC5cbiAgICovXG4gIHJlYWRvbmx5IHNoZWxsOiBzdHJpbmc7XG59XG5cbi8qKiBCdWlsZHMgdGhlIGZ1bGwgaG9zdCBjb21tYW5kIHRoYXQgb3BlbnMgYGNvbW1hbmRgIGluIGEgZnJlc2ggZXh0ZXJuYWwgdGVybWluYWwgd2luZG93IGZvciBvbmUgT1MuICovXG5leHBvcnQgdHlwZSBFeHRlcm5hbFRlcm1pbmFsQ29tbWFuZEJ1aWxkZXIgPSAob3B0aW9uczogRXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRPcHRpb25zKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogVGhlIGhvc3QgT1MncyB7QGxpbmsgRXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRCdWlsZGVyfS4gUmVnaXN0ZXJlZCBwZXItT1MgdmlhXG4gKiBgZ2V0SW5qZWN0YWJsZUZvck9wZXJhdGluZ1N5c3RlbXNgIChob3N0LW9ubHkgYCotb25seWAgdGFncyksIHNvIGluamVjdGluZyB0aGVcbiAqIHRva2VuIHlpZWxkcyB0aGUgYnVpbGRlciBmb3IgdGhlIGN1cnJlbnQgT1MgXHUyMDE0IG5vIHJ1bnRpbWUgcGxhdGZvcm0gc3dpdGNoLlxuICovXG5leHBvcnQgY29uc3QgZXh0ZXJuYWxUZXJtaW5hbENvbW1hbmRCdWlsZGVySW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBFeHRlcm5hbFRlcm1pbmFsQ29tbWFuZEJ1aWxkZXI7XG59Pih7XG4gIGlkOiBcImV4dGVybmFsLXRlcm1pbmFsLWNvbW1hbmQtYnVpbGRlclwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yLCB0eXBlIE1hbnlGYWN0b3J5IH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgU2hlbGxTY29wZWQgfSBmcm9tIFwiQGs4c2xlbnMvcGxhdGZvcm0tc3BlY2lmaWMtaW5qZWN0YWJsZXNcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sS2luZCwgR2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKipcbiAqIFBlci1raW5kIGJ1aWxkZXIgZm9yIHRoZSBob3N0IGNvbW1hbmQgdGhhdCBvcGVucyBhbiBBSSB0b29sIGluIGEgZnJlc2ggZXh0ZXJuYWxcbiAqIHRlcm1pbmFsIHdpbmRvdy4gQ29udHJpYnV0ZWQgcGVyIHRvb2wgYnkgYGdldEFpVG9vbEluamVjdGFibGVCdW5jaGAgKHJlc29sdmVkXG4gKiB0byB0aGUgaG9zdCBPUydzIHZhcmlhbnQgZnJvbSB0aGUgdG9vbCdzIGBnZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmRgXG4gKiBwYXJhbSkuIENvbnN1bWVkIHZpYSB0aGUgZGVyaXZlZCBgc2VsZWN0ZWRBaVRvb2xPcGVuSW5FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZEluamVjdGlvblRva2VuYC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9wZW5Ub29sSW5FeHRlcm5hbFRlcm1pbmFsRm9yVG9vbEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogKCkgPT4gU2hlbGxTY29wZWQ8R2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kPjtcbn0+KHtcbiAgaWQ6IFwib3Blbi10b29sLWluLWV4dGVybmFsLXRlcm1pbmFsLWZvci10b29sXCIsXG4gIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxufSkoKGtpbmQ6IEFpVG9vbEtpbmQpID0+XG4gIGdldEluamVjdGlvblRva2VuMjx7XG4gICAgc2luZ2xlRmFjdG9yeTogKCkgPT4gU2hlbGxTY29wZWQ8R2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kPjtcbiAgICBtYW55RmFjdG9yeTogTWFueUZhY3Rvcnk8KCkgPT4gU2hlbGxTY29wZWQ8R2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kPj47XG4gIH0+KHtcbiAgICBpZDogYG9wZW4tdG9vbC1pbi1leHRlcm5hbC10ZXJtaW5hbC1mb3ItdG9vbC0ke2tpbmR9YCxcbiAgICBzcGVjaWFsaXR5OiBraW5kLFxuICAgIGNhcmRpbmFsaXR5OiBcInplcm8tb3ItbWFueVwiLFxuICB9KSgpLFxuKTtcbiIsICJpbXBvcnQgeyBnZXRJbmplY3Rpb25Ub2tlbjIsIHR5cGUgTWFueUZhY3RvcnkgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHR5cGUgeyBTaGVsbFNjb3BlZCB9IGZyb20gXCJAazhzbGVucy9wbGF0Zm9ybS1zcGVjaWZpYy1pbmplY3RhYmxlc1wiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kLCBHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKlxuICogUGVyLWtpbmQgYnVpbGRlciBmb3IgdGhlIGNvbW1hbmQgdGhhdCBkZXRlY3RzIHdoZXRoZXIgYW4gQUkgdG9vbCBpcyBpbnN0YWxsZWRcbiAqIChlLmcuIGBjb21tYW5kIC12IGNsYXVkZWAgLyBgd2hlcmUgY2xhdWRlYCkuIENvbnRyaWJ1dGVkIHBlciB0b29sIGJ5XG4gKiBgZ2V0QWlUb29sSW5qZWN0YWJsZUJ1bmNoYCAodGhlIGhvc3QgT1MncyB2YXJpYW50IHdoZW4gdGhlIHRvb2wnc1xuICogYGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZGAgaXMgb3BlcmF0aW5nLXN5c3RlbSBzcGVjaWZpYykuIFRoZSBkZXRlY3RlZFxuICogdG9vbHMgbGlzdCBydW5zIGl0IHZpYSBgYWlUb29sSW5zdGFsbGVkVmlhQ2xpQ29tbWFuZEluamVjdGlvblRva2VuYCAoZXhpdCBjb2RlXG4gKiAwIFx1MjFEMiBpbnN0YWxsZWQpLiBOb3QgY29udHJpYnV0ZWQgZm9yIGFsd2F5cy1hdmFpbGFibGUgdG9vbHMgKGUuZy4gQ3VzdG9tKSxcbiAqIHdoaWNoIGFyZSB0aGVuIHJlcG9ydGVkIGFzIGluc3RhbGxlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogKCkgPT4gU2hlbGxTY29wZWQ8R2V0QWlUb29sSXNJbnN0YWxsZWRDbGlDb21tYW5kPjtcbn0+KHtcbiAgaWQ6IFwiYWktdG9vbC1pcy1pbnN0YWxsZWQtY2xpLWNvbW1hbmRcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1tYW55XCIsXG59KSgoa2luZDogQWlUb29sS2luZCkgPT5cbiAgZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBTaGVsbFNjb3BlZDxHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQ+O1xuICAgIG1hbnlGYWN0b3J5OiBNYW55RmFjdG9yeTwoKSA9PiBTaGVsbFNjb3BlZDxHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQ+PjtcbiAgfT4oe1xuICAgIGlkOiBgYWktdG9vbC1pcy1pbnN0YWxsZWQtY2xpLWNvbW1hbmQtJHtraW5kfWAsXG4gICAgc3BlY2lhbGl0eToga2luZCxcbiAgICBjYXJkaW5hbGl0eTogXCJ6ZXJvLW9yLW1hbnlcIixcbiAgfSkoKSxcbik7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgSU9ic2VydmFibGVWYWx1ZSB9IGZyb20gXCJtb2J4XCI7XG5cbi8qKlxuICogVGhlIGdsb2JhbCBcIm9wZW4gQUkgdG9vbHMgaW4gYW4gZXh0ZXJuYWwgdGVybWluYWxcIiB0b2dnbGUuIFdoZW4gYHRydWVgLCB0aGVcbiAqIHNlbGVjdGVkIEFJIHRvb2wgbGF1bmNoZXMgaW4gYSBmcmVzaCBleHRlcm5hbCB0ZXJtaW5hbCB3aW5kb3cgXHUyMDE0IGJ1aWx0IGJ5IHRoZVxuICogaG9zdCBvcGVyYXRpbmcgc3lzdGVtJ3MgZXh0ZXJuYWwtdGVybWluYWwgY29tbWFuZCBidWlsZGVyIChyZXNvbHZlZCB2aWFcbiAqIGBzZWxlY3RlZEFpVG9vbEV4dGVybmFsVGVybWluYWxDb21tYW5kSW5qZWN0aW9uVG9rZW5gKSBhbmQgc3Bhd25lZCBkZXRhY2hlZCBvblxuICogdGhlIGhvc3QgXHUyMDE0IGluc3RlYWQgb2YgYSBMZW5zIHRlcm1pbmFsIHRhYi4gQXBwbGllcyB0byBldmVyeSB0b29sIChDdXN0b21cbiAqIGluY2x1ZGVkKSwgcmVwbGFjaW5nIHRoZSBmb3JtZXIgcGVyLXRvb2wgcnVucy1leHRlcm5hbGx5IGNhbGxiYWNrcy5cbiAqXG4gKiBQZXJzaXN0ZWQ7IHRoZSBib3ggbG9hZHMgYXN5bmNocm9ub3VzbHksIHNvIHRoZSB0b2tlbiByZXNvbHZlcyB0byBhIHByb21pc2VcbiAqIG9mIHRoZSBvYnNlcnZhYmxlLiBTdXBwb3J0ZWQgb24gbWFjT1MgKFRlcm1pbmFsKSwgV2luZG93cyAoV2luZG93cyBUZXJtaW5hbCksIGFuZFxuICogTGludXggKHRoZSBmaXJzdCBhdmFpbGFibGUgdGVybWluYWwgZW11bGF0b3IpLlxuICovXG5leHBvcnQgY29uc3QgYWlUb29sc09wZW5FeHRlcm5hbGx5SW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiAoKSA9PiBQcm9taXNlPElPYnNlcnZhYmxlVmFsdWU8Ym9vbGVhbj4+O1xufT4oe1xuICBpZDogXCJhaS10b29scy1vcGVuLWV4dGVybmFsbHlcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGFibGUyLCBnZXRJbmplY3RhYmxlQnVuY2ggfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgZHJvcERvd25NZW51SXRlbUluamVjdGlvblRva2VuLCB0eXBlIERyb3BEb3duTWVudUl0ZW0gfSBmcm9tIFwiQGs4c2xlbnMvZHJvcC1kb3duLW1lbnUtY29udHJhY3RzXCI7XG5pbXBvcnQgeyBjb21wdXRlZCwgdHlwZSBJQ29tcHV0ZWRWYWx1ZSB9IGZyb20gXCJtb2J4XCI7XG5pbXBvcnQgUmVhY3QgZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IFN2Z1Byb3BzIH0gZnJvbSBcIkBrOHNsZW5zL2VsZW1lbnQtY29tcG9uZW50c1wiO1xuaW1wb3J0IHR5cGUge1xuICBBaVRvb2xLaW5kLFxuICBBaVRvb2xMaXN0RW50cnksXG4gIEdldENsaUNvbW1hbmQsXG4gIEdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZCxcbiAgR2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kLFxufSBmcm9tIFwiLi9haS10b29sXCI7XG5pbXBvcnQgeyBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlLCB0eXBlIE1heWJlT3BlcmF0aW5nU3lzdGVtQW5kU2hlbGxTcGVjaWZpYyB9IGZyb20gXCIuL29zLWFuZC1zaGVsbC1zcGVjaWZpY1wiO1xuaW1wb3J0IHsgYWlUb29sSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9haS10b29sLWluamVjdGlvbi10b2tlblwiO1xuaW1wb3J0IHsgZ2V0QWlDb21tYW5kRm9yVGVybWluYWxJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2dldC1haS1jb21tYW5kLWZvci10ZXJtaW5hbFwiO1xuaW1wb3J0IHsgZ2V0UmVzdW1lQWlDb21tYW5kRm9yVGVybWluYWxJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2dldC1yZXN1bWUtYWktY29tbWFuZC1mb3ItdGVybWluYWxcIjtcbmltcG9ydCB7IGdldE9wZW5Ub29sSW5FeHRlcm5hbFRlcm1pbmFsRm9yVG9vbEluamVjdGlvblRva2VuIH0gZnJvbSBcIi4vZ2V0LW9wZW4tdG9vbC1pbi1leHRlcm5hbC10ZXJtaW5hbC1mb3ItdG9vbFwiO1xuaW1wb3J0IHsgZ2V0QWlUb29sSXNJbnN0YWxsZWRDbGlDb21tYW5kSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9nZXQtYWktdG9vbC1pcy1pbnN0YWxsZWQtY2xpLWNvbW1hbmRcIjtcbmltcG9ydCB7IGFpVG9vbE5hbWVJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2FpLXRvb2wtbmFtZVwiO1xuaW1wb3J0IHsgYWlUb29sRGlzcGxheU5hbWVJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2FpLXRvb2wtZGlzcGxheS1uYW1lXCI7XG5pbXBvcnQgeyBhaVRvb2xEZXNjcmlwdGlvbkluamVjdGlvblRva2VuLCB0eXBlIEFpVG9vbERlc2NyaXB0aW9uUHJvcHMgfSBmcm9tIFwiLi9haS10b29sLWRlc2NyaXB0aW9uXCI7XG5pbXBvcnQgeyBhaVRvb2xJY29uSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9haS10b29sLWljb25cIjtcbmltcG9ydCB7IGFpVG9vbE9yZGVyTnVtYmVySW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9haS10b29sLW9yZGVyLW51bWJlclwiO1xuaW1wb3J0IHsgYWlUb29sU2V0dGluZ3NJbmplY3Rpb25Ub2tlbiB9IGZyb20gXCIuL2FpLXRvb2wtc2V0dGluZ3NcIjtcbmltcG9ydCB7IGFpVG9vbEluc3RhbGxhdGlvbkluc3RydWN0aW9uc0luamVjdGlvblRva2VuIH0gZnJvbSBcIi4vYWktdG9vbC1pbnN0YWxsYXRpb24taW5zdHJ1Y3Rpb25zXCI7XG5pbXBvcnQgeyBhaVRvb2xJbnN0cnVjdGlvbnNGaWxlbmFtZUluamVjdGlvblRva2VuIH0gZnJvbSBcIi4vYWktdG9vbC1pbnN0cnVjdGlvbnMtZmlsZW5hbWVcIjtcbmltcG9ydCB7IEFpVG9vbFNlbGVjdGlvblJvdyB9IGZyb20gXCIuL2FpLXRvb2wtc2VsZWN0aW9uLXJvd1wiO1xuaW1wb3J0IHsgYWlUb29sVG9wQmFyTWVudUtpbmQsIGFpVG9vbFRvcEJhck1lbnVPcmRlck51bWJlcnMgfSBmcm9tIFwiLi9haS10b29sLXRvcC1iYXItbWVudVwiO1xuaW1wb3J0IHsgZGV0ZWN0ZWRBaVRvb2xzSW5qZWN0aW9uVG9rZW4gfSBmcm9tIFwiLi9kZXRlY3RlZC1haS10b29sc1wiO1xuaW1wb3J0IHsgRGVmYXVsdEFpVG9vbEljb24gfSBmcm9tIFwiLi9kZWZhdWx0LWFpLXRvb2wtaWNvblwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIEFpVG9vbEJ1bmNoUGFyYW1zIHtcbiAgcmVhZG9ubHkga2luZDogQWlUb29sS2luZDtcbiAgLyoqIExvd2VyIGNvbWVzIGZpcnN0OyB0aGUgbG93ZXN0LW51bWJlcmVkIGluc3RhbGxlZCB0b29sIGlzIHRoZSBkZWZhdWx0LiAqL1xuICByZWFkb25seSBvcmRlck51bWJlcjogbnVtYmVyO1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBpbi1hcHAgbGF1bmNoIGNvbW1hbmQgKGtub3dzIGhvdyB0byBwYXNzIGB7cHJvbXB0fWApLiBBIHNpbmdsZVxuICAgKiBPUy1hZ25vc3RpYyBidWlsZGVyLCBvciBvbmUgcGVyIG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqL1xuICByZWFkb25seSBnZXRDbGlDb21tYW5kOiBNYXliZU9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWM8R2V0Q2xpQ29tbWFuZD47XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNvbW1hbmQgdGhhdCAqcmVzdW1lcyogdGhlIHRvb2wgd2hlbiBpdHMgdGFiJ3Mgc2Vzc2lvbiBpc1xuICAgKiByZS1lc3RhYmxpc2hlZCAoZS5nLiBhZnRlciBhbiBhcHAgcmVzdGFydCkgcmF0aGVyIHRoYW4gZmlyc3Qgb3BlbmVkIFx1MjAxNCBlLmcuXG4gICAqIGBjbGF1ZGUgLS1jb250aW51ZSB8fCBjbGF1ZGVgLCB3aGljaCBjb250aW51ZXMgdGhlIHByaW9yIHNlc3Npb24gYW5kIGZhbGxzXG4gICAqIGJhY2sgdG8gYSBmcmVzaCBsYXVuY2ggd2hlbiB0aGVyZSBpcyBub25lLiBBIHRvb2wgd2l0aCBubyBkZWRpY2F0ZWQgcmVzdW1lXG4gICAqIGludm9jYXRpb24gcGFzc2VzIGl0cyBsYXVuY2ggY29tbWFuZC4gVXN1YWxseSBpZ25vcmVzIGBwcm9tcHRgLiBPUy1hZ25vc3RpYyxcbiAgICogb3Igb25lIGJ1aWxkZXIgcGVyIG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqL1xuICByZWFkb25seSBnZXRSZXN1bWVDbGlDb21tYW5kOiBNYXliZU9wZXJhdGluZ1N5c3RlbUFuZFNoZWxsU3BlY2lmaWM8R2V0Q2xpQ29tbWFuZD47XG4gIC8qKlxuICAgKiBCdWlsZHMgdGhlIGNvbW1hbmQgdGhhdCBjaGVja3Mgd2hldGhlciB0aGUgdG9vbCBpcyBpbnN0YWxsZWQgKGUuZy5cbiAgICogYGNvbW1hbmQgLXYgY2xhdWRlYCAvIGB3aGVyZSBjbGF1ZGVgKSwgcnVuIG9uIHRoZSBob3N0IHdpdGggZXhpdCBjb2RlIDBcbiAgICogbWVhbmluZyBpbnN0YWxsZWQuIE9TLWFnbm9zdGljLCBvciBvbmUgYnVpbGRlciBwZXIgb3BlcmF0aW5nIHN5c3RlbS4gT21pdCBmb3JcbiAgICogYW4gYWx3YXlzLWF2YWlsYWJsZSB0b29sIChlLmcuIHRoZSBmcmVlLXRleHQgQ3VzdG9tIGNvbW1hbmQpLCB3aGljaCBpcyB0aGVuXG4gICAqIHJlcG9ydGVkIGFzIGluc3RhbGxlZC5cbiAgICovXG4gIHJlYWRvbmx5IGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZD86IE1heWJlT3BlcmF0aW5nU3lzdGVtQW5kU2hlbGxTcGVjaWZpYzxHZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQ+O1xuICAvKipcbiAgICogQnVpbGRzIHRoZSBjb21tYW5kIHRoYXQgb3BlbnMgdGhlIHRvb2wgaW4gYSBmcmVzaCBleHRlcm5hbCB0ZXJtaW5hbCB3aW5kb3cgXHUyMDE0XG4gICAqIHR5cGljYWxseSB3cmFwcGluZyB0aGUgdG9vbCdzIGludm9jYXRpb24gd2l0aCBhIGBidWlsZHtNYWMsV2luZG93cyxMaW51eH1FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZGBcbiAgICogaGVscGVyLiBPUy1hZ25vc3RpYywgb3Igb25lIGJ1aWxkZXIgcGVyIG9wZXJhdGluZyBzeXN0ZW0uXG4gICAqL1xuICByZWFkb25seSBnZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmQ6IE1heWJlT3BlcmF0aW5nU3lzdGVtQW5kU2hlbGxTcGVjaWZpYzxHZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmQ+O1xuICAvKiogQ2Fub25pY2FsIHBsYWluLXRleHQgZGlzcGxheSBuYW1lLCBlLmcuIGBcIkNsYXVkZSBDb2RlXCJgLiBEcml2ZXMgc3RyaW5nLW9ubHkgc2xvdHMgYW5kIHRoZSBkZWZhdWx0IG5hbWUgY29tcG9uZW50LiBEZWZhdWx0cyB0byBga2luZGAuICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCByaWNoIGRpc3BsYXktbmFtZSBjb21wb25lbnQ7IGRlZmF1bHRzIHRvIGEgZnJhZ21lbnQgb2YgdGhlIGRpc3BsYXkgbmFtZS4gKi9cbiAgcmVhZG9ubHkgTmFtZT86IFJlYWN0LkNvbXBvbmVudFR5cGU7XG4gIC8qKiBTaG9ydCBibHVyYiBpbnRyb2R1Y2luZyB0aGUgdG9vbCAoZS5nLiBgXCJUaGUgY29kaW5nIGFzc2lzdGFudCBieSBBbnRocm9waWNcImApLCBzaG93biBhcyB0aGUgc2VsZWN0b3IncyBzZWNvbmRhcnkgbGluZS4gUmVjZWl2ZXMgdGhlIHRvb2wncyBgaXNJbnN0YWxsZWRgIHN0YXRlIHNvIGl0IG1heSBvcHQgdG8gc2hvdyBhIFwiTm90IGZvdW5kIGluIFBBVEhcIiBtZXNzYWdlIGluc3RlYWQuIEEgY29tcG9uZW50IHNvIGl0IG1heSBpbmNsdWRlIG1hcmt1cC9saW5rcy4gRGVmYXVsdHMgdG8gbm90aGluZy4gKi9cbiAgcmVhZG9ubHkgRGVzY3JpcHRpb24/OiBSZWFjdC5Db21wb25lbnRUeXBlPEFpVG9vbERlc2NyaXB0aW9uUHJvcHM+O1xuICAvKiogSWNvbiBjb21wb25lbnQgKGRlZmF1bHRzIHRvIGEgZ2VuZXJpYyB0ZXJtaW5hbCBnbHlwaCkuIEFjY2VwdHMgYFN2Z1Byb3BzYCBzbyBjYWxsIHNpdGVzIGNhbiBzaXplIGl0LiAqL1xuICByZWFkb25seSBJY29uPzogUmVhY3QuQ29tcG9uZW50VHlwZTxTdmdQcm9wcz47XG4gIC8qKiBTZXR0aW5ncyBjb21wb25lbnQgc2hvd24gYmVsb3cgdGhlIHNlbGVjdG9yIHdoZW4gdGhpcyBraW5kIGlzIHNlbGVjdGVkIChlLmcuIHRoZSBjdXN0b20gY29tbWFuZCBpbnB1dCkuICovXG4gIHJlYWRvbmx5IFNldHRpbmdzPzogUmVhY3QuQ29tcG9uZW50VHlwZTtcbiAgLyoqIEluc3RydWN0aW9ucyBzaG93biBiZWxvdyB0aGUgc2VsZWN0b3Igd2hlbiB0aGlzIGtpbmQgaXMgbm90IGluc3RhbGxlZCwgc28gaXQgYXBwZWFycyBkaXNhYmxlZCB3aXRoIGd1aWRhbmNlIGluc3RlYWQgb2YgaGlkZGVuLiBNYXkgY29udGFpbiBsaW5rcy4gKi9cbiAgcmVhZG9ubHkgSW5zdGFsbGF0aW9uSW5zdHJ1Y3Rpb25zPzogUmVhY3QuQ29tcG9uZW50VHlwZTtcbiAgLyoqIEZpbGVuYW1lIHRoZSB0b29sIGF1dG8tZGlzY292ZXJzIGluIGl0cyB3b3JraW5nIGRpcmVjdG9yeSAoZS5nLiBgXCJDTEFVREUubWRcImApLiBPbWl0IHdoZW4gdGhlIHRvb2wgcmVhZHMgbm8gc3VjaCBmaWxlOyB0aGUgbGF1bmNoZXIgYWx3YXlzIHdyaXRlcyB0aGUgY2Fub25pY2FsIGBBR0VOVFMubWRgLiAqL1xuICByZWFkb25seSBpbnN0cnVjdGlvbnNGaWxlbmFtZT86IHN0cmluZztcbn1cblxuLy8gVGhlIHRvb2wncyBpbnN0YWxsIHN0YXRlIGFzIHRoZSBsYXN0IHNjYW4gc2F3IGl0OiB0cnVlL2ZhbHNlIG9uY2Ugc2Nhbm5lZCxcbi8vIHVuZGVmaW5lZCB3aGlsZSBubyBzY2FuIGhhcyBkZXRlcm1pbmVkIGl0IHlldC5cbmNvbnN0IGRldGVjdGVkSW5zdGFsbFN0YXRlID0gKFxuICBkZXRlY3RlZEFpVG9vbHM6IElDb21wdXRlZFZhbHVlPEFpVG9vbExpc3RFbnRyeVtdPixcbiAga2luZDogQWlUb29sS2luZCxcbik6IGJvb2xlYW4gfCB1bmRlZmluZWQgPT4gZGV0ZWN0ZWRBaVRvb2xzLmdldCgpLmZpbmQoKHRvb2wpID0+IHRvb2wua2luZCA9PT0ga2luZCk/LmlzSW5zdGFsbGVkO1xuXG4vLyBBIHRvb2wncyBvd24gb3JkZXIgbnVtYmVyIG9ubHkgcGxhY2VzIGl0IHdpdGhpbiBpdHMgYmFuZDogQ3VzdG9tIGRlY2xhcmVzXG4vLyBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB0byBzb3J0IGxhc3QsIHdoaWNoIG11c3Qgbm90IGxlYWsgaW50byBsYXRlciBiYW5kcy5cbmNvbnN0IGluU2VsZWN0aW9uQmFuZCA9IChiYW5kOiBudW1iZXIsIHRvb2xPcmRlck51bWJlcjogbnVtYmVyKSA9PlxuICBiYW5kICsgTWF0aC5tYXgoMCwgTWF0aC5taW4odG9vbE9yZGVyTnVtYmVyLCBhaVRvb2xUb3BCYXJNZW51T3JkZXJOdW1iZXJzLmJhbmRXaWR0aCAtIDEpKTtcblxuLyoqXG4gKiBSZWdpc3RlciBhIHR5cGljYWwgTExNIENMSSB0b29sOiBpdHMga2luZCwgb3JkZXIsIHRoZSBjb21tYW5kcyAobGF1bmNoLCByZXN1bWUsXG4gKiBpbnN0YWxsLWNoZWNrLCBvcGVuLWV4dGVybmFsbHkpLCBkaXNwbGF5IG5hbWUsIGFuZCBpY29uLiBFYWNoIGNvbW1hbmQgbWF5IGJlIGFcbiAqIHNpbmdsZSBhZ25vc3RpYyBidWlsZGVyLCBvciB2YXJ5IHBlciBvcGVyYXRpbmcgc3lzdGVtIGFuZC9vciBzaGVsbCBcdTIwMTQgcmVnaXN0ZXJlZFxuICogdmlhIGBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlYDogdGhlIE9TIGlzIGZpbHRlcmVkIGF0IHJlZ2lzdHJhdGlvbiAoaG9zdC1vbmx5XG4gKiBgKi1vbmx5YCB0YWdzKSBhbmQgdGhlIHNoZWxsIGlzIHNlbGVjdGVkIGF0IHJ1bnRpbWUgKGByZXNvbHZlRm9yU2hlbGxgKSwgc2luY2VcbiAqIHRoZSBjb25maWd1cmVkIHNoZWxsIGlzIGFzeW5jLiBUaGUgZGV0ZWN0ZWQgdG9vbHMgbGlzdCBydW5zIHRoZSBpbnN0YWxsLWNoZWNrXG4gKiBjb21tYW5kIHZpYVxuICogYGFpVG9vbEluc3RhbGxlZFZpYUNsaUNvbW1hbmRJbmplY3Rpb25Ub2tlbmAgKG9taXQgdGhlIGNvbW1hbmQgZm9yIGFuXG4gKiBhbHdheXMtYXZhaWxhYmxlIHRvb2wpLiBCdW5kbGUgc2V2ZXJhbCB3aXRoXG4gKiBgZ2V0SW5qZWN0YWJsZUJ1bmNoKFsgZ2V0QWlUb29sSW5qZWN0YWJsZUJ1bmNoKC4uLiksIC4uLiBdKWAuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBaVRvb2xJbmplY3RhYmxlQnVuY2ggPSAocGFyYW1zOiBBaVRvb2xCdW5jaFBhcmFtcykgPT4ge1xuICAvLyBCdWlsdCBvbmNlIHBlciB0b29sIHNvIHRoZSBjb21wb25lbnQgcmVmcyBhcmUgc3RhYmxlIFx1MjAxNCBhIGZyZXNoIHJlZiBvbiBlYWNoXG4gIC8vIGluamVjdGlvbiB3b3VsZCByZW1vdW50IFJlYWN0IGFuZCBsb3NlIHN0YXRlLlxuICBjb25zdCBkaXNwbGF5TmFtZSA9IHBhcmFtcy5uYW1lID8/IHBhcmFtcy5raW5kO1xuICBjb25zdCBOYW1lQ29tcG9uZW50OiBSZWFjdC5Db21wb25lbnRUeXBlID1cbiAgICBwYXJhbXMuTmFtZSA/PyAoKCkgPT4gUmVhY3QuY3JlYXRlRWxlbWVudChSZWFjdC5GcmFnbWVudCwgbnVsbCwgZGlzcGxheU5hbWUpKTtcbiAgY29uc3QgRGVzY3JpcHRpb25Db21wb25lbnQ6IFJlYWN0LkNvbXBvbmVudFR5cGU8QWlUb29sRGVzY3JpcHRpb25Qcm9wcz4gPSBwYXJhbXMuRGVzY3JpcHRpb24gPz8gKCgpID0+IG51bGwpO1xuICBjb25zdCBJY29uQ29tcG9uZW50OiBSZWFjdC5Db21wb25lbnRUeXBlPFN2Z1Byb3BzPiA9IHBhcmFtcy5JY29uID8/IERlZmF1bHRBaVRvb2xJY29uO1xuICBjb25zdCBTZWxlY3Rpb25Sb3dDb21wb25lbnQ6IFJlYWN0LkNvbXBvbmVudFR5cGUgPSAoKSA9PlxuICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoQWlUb29sU2VsZWN0aW9uUm93LCB7IGtpbmQ6IHBhcmFtcy5raW5kIH0pO1xuICBjb25zdCBTZXR0aW5nc0NvbXBvbmVudDogUmVhY3QuQ29tcG9uZW50VHlwZSA9IHBhcmFtcy5TZXR0aW5ncyA/PyAoKCkgPT4gbnVsbCk7XG4gIGNvbnN0IEluc3RhbGxhdGlvbkluc3RydWN0aW9uc0NvbXBvbmVudDogUmVhY3QuQ29tcG9uZW50VHlwZSA9IHBhcmFtcy5JbnN0YWxsYXRpb25JbnN0cnVjdGlvbnMgPz8gKCgpID0+IG51bGwpO1xuXG4gIHJldHVybiBnZXRJbmplY3RhYmxlQnVuY2goe1xuICAgIGFpVG9vbDogZ2V0SW5qZWN0YWJsZTIoe1xuICAgICAgaWQ6IGBhaS10b29sLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKTogQWlUb29sS2luZCA9PiBwYXJhbXMua2luZCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xJbmplY3Rpb25Ub2tlbixcbiAgICB9KSxcblxuICAgIG9yZGVyTnVtYmVyOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtb3JkZXItbnVtYmVyLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKTogbnVtYmVyID0+IHBhcmFtcy5vcmRlck51bWJlcixcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xPcmRlck51bWJlckluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgfSksXG5cbiAgICBnZXRDbGlDb21tYW5kOiBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlKHtcbiAgICAgIGlkOiBgZ2V0LWFpLWNvbW1hbmQtZm9yLXRlcm1pbmFsLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluamVjdGlvblRva2VuOiBnZXRBaUNvbW1hbmRGb3JUZXJtaW5hbEluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgICB2YWx1ZTogcGFyYW1zLmdldENsaUNvbW1hbmQsXG4gICAgfSksXG5cbiAgICBnZXRSZXN1bWVDbGlDb21tYW5kOiBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlKHtcbiAgICAgIGlkOiBgZ2V0LXJlc3VtZS1haS1jb21tYW5kLWZvci10ZXJtaW5hbC0ke3BhcmFtcy5raW5kfWAsXG4gICAgICBpbmplY3Rpb25Ub2tlbjogZ2V0UmVzdW1lQWlDb21tYW5kRm9yVGVybWluYWxJbmplY3Rpb25Ub2tlbi5mb3IocGFyYW1zLmtpbmQpLFxuICAgICAgdmFsdWU6IHBhcmFtcy5nZXRSZXN1bWVDbGlDb21tYW5kLFxuICAgIH0pLFxuXG4gICAgZ2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kOiBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlKHtcbiAgICAgIGlkOiBgb3Blbi10b29sLWluLWV4dGVybmFsLXRlcm1pbmFsLWZvci10b29sLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluamVjdGlvblRva2VuOiBnZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbEZvclRvb2xJbmplY3Rpb25Ub2tlbi5mb3IocGFyYW1zLmtpbmQpLFxuICAgICAgdmFsdWU6IHBhcmFtcy5nZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbENsaUNvbW1hbmQsXG4gICAgfSksXG5cbiAgICBuYW1lOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtbmFtZS0ke3BhcmFtcy5raW5kfWAsXG4gICAgICBpbnN0YW50aWF0ZTogKCkgPT4gKCkgPT4gTmFtZUNvbXBvbmVudCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xOYW1lSW5qZWN0aW9uVG9rZW4uZm9yKHBhcmFtcy5raW5kKSxcbiAgICB9KSxcblxuICAgIGRpc3BsYXlOYW1lOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtZGlzcGxheS1uYW1lLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKSA9PiBkaXNwbGF5TmFtZSxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xEaXNwbGF5TmFtZUluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgfSksXG5cbiAgICBkZXNjcmlwdGlvbjogZ2V0SW5qZWN0YWJsZTIoe1xuICAgICAgaWQ6IGBhaS10b29sLWRlc2NyaXB0aW9uLSR7cGFyYW1zLmtpbmR9YCxcbiAgICAgIGluc3RhbnRpYXRlOiAoKSA9PiAoKSA9PiBEZXNjcmlwdGlvbkNvbXBvbmVudCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xEZXNjcmlwdGlvbkluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgfSksXG5cbiAgICBpY29uOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtaWNvbi0ke3BhcmFtcy5raW5kfWAsXG4gICAgICBpbnN0YW50aWF0ZTogKCkgPT4gKCkgPT4gSWNvbkNvbXBvbmVudCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xJY29uSW5qZWN0aW9uVG9rZW4uZm9yKHBhcmFtcy5raW5kKSxcbiAgICB9KSxcblxuICAgIHNldHRpbmdzOiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtc2V0dGluZ3MtJHtwYXJhbXMua2luZH1gLFxuICAgICAgaW5zdGFudGlhdGU6ICgpID0+ICgpOiBSZWFjdC5Db21wb25lbnRUeXBlID0+IFNldHRpbmdzQ29tcG9uZW50LFxuICAgICAgaW5qZWN0aW9uVG9rZW46IGFpVG9vbFNldHRpbmdzSW5qZWN0aW9uVG9rZW4uZm9yKHBhcmFtcy5raW5kKSxcbiAgICB9KSxcblxuICAgIGluc3RhbGxhdGlvbkluc3RydWN0aW9uczogZ2V0SW5qZWN0YWJsZTIoe1xuICAgICAgaWQ6IGBhaS10b29sLWluc3RhbGxhdGlvbi1pbnN0cnVjdGlvbnMtJHtwYXJhbXMua2luZH1gLFxuICAgICAgaW5zdGFudGlhdGU6ICgpID0+ICgpOiBSZWFjdC5Db21wb25lbnRUeXBlID0+IEluc3RhbGxhdGlvbkluc3RydWN0aW9uc0NvbXBvbmVudCxcbiAgICAgIGluamVjdGlvblRva2VuOiBhaVRvb2xJbnN0YWxsYXRpb25JbnN0cnVjdGlvbnNJbmplY3Rpb25Ub2tlbi5mb3IocGFyYW1zLmtpbmQpLFxuICAgIH0pLFxuXG4gICAgaW5zdHJ1Y3Rpb25zRmlsZW5hbWU6IGdldEluamVjdGFibGUyKHtcbiAgICAgIGlkOiBgYWktdG9vbC1pbnN0cnVjdGlvbnMtZmlsZW5hbWUtJHtwYXJhbXMua2luZH1gLFxuICAgICAgaW5zdGFudGlhdGU6ICgpID0+ICgpOiBzdHJpbmcgfCB1bmRlZmluZWQgPT4gcGFyYW1zLmluc3RydWN0aW9uc0ZpbGVuYW1lLFxuICAgICAgaW5qZWN0aW9uVG9rZW46IGFpVG9vbEluc3RydWN0aW9uc0ZpbGVuYW1lSW5qZWN0aW9uVG9rZW4uZm9yKHBhcmFtcy5raW5kKSxcbiAgICB9KSxcblxuICAgIC8vIFRoZSB0b29sJ3Mgcm93cyBpbiB0aGUgQUkgdG9vbCBidXR0b24ncyBkcm9wLWRvd24gbWVudTogb25lIHBlciBiYW5kLCB0aGVcbiAgICAvLyB2aXNpYmlsaXR5IHN3aXRjaGluZyBvbiB0aGUgZGV0ZWN0ZWQgaW5zdGFsbCBzdGF0ZSBzbyB0aGUgdG9vbCBzaXRzIGluXG4gICAgLy8gd2hpY2hldmVyIGJhbmQgbWF0Y2hlcyBcdTIwMTQgYW5kIGluIG5laXRoZXIgd2hpbGUgbm8gc2NhbiBoYXMgZGV0ZXJtaW5lZCBpdC5cbiAgICAvLyBXaGF0IGEgcm93IGxvb2tzIGxpa2UgYW5kIGRvZXMgaXMgdGhlIEFpVG9vbFNlbGVjdGlvblJvdyBpbXBsZW1lbnRhdGlvbidzXG4gICAgLy8gYnVzaW5lc3MuXG4gICAgaW5zdGFsbGVkU2VsZWN0aW9uUm93OiBnZXRJbmplY3RhYmxlMih7XG4gICAgICBpZDogYGFpLXRvb2wtc2VsZWN0aW9uLXJvdy1pbnN0YWxsZWQtJHtwYXJhbXMua2luZH1gLFxuICAgICAgY29uc3VtcHRpb25zOiBbZGV0ZWN0ZWRBaVRvb2xzSW5qZWN0aW9uVG9rZW5dLFxuXG4gICAgICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGVjdGVkQWlUb29scyA9IGRpLmluamVjdChkZXRlY3RlZEFpVG9vbHNJbmplY3Rpb25Ub2tlbikoKTtcblxuICAgICAgICBjb25zdCBpdGVtOiBEcm9wRG93bk1lbnVJdGVtID0ge1xuICAgICAgICAgIGlkOiBgYWktdG9vbC1zZWxlY3Rpb24tcm93LWluc3RhbGxlZC0ke3BhcmFtcy5raW5kfWAsXG4gICAgICAgICAgb3JkZXJOdW1iZXI6IGluU2VsZWN0aW9uQmFuZChhaVRvb2xUb3BCYXJNZW51T3JkZXJOdW1iZXJzLmluc3RhbGxlZEFpVG9vbEJhbmQsIHBhcmFtcy5vcmRlck51bWJlciksXG4gICAgICAgICAgaXNWaXNpYmxlOiBjb21wdXRlZCgoKSA9PiBkZXRlY3RlZEluc3RhbGxTdGF0ZShkZXRlY3RlZEFpVG9vbHMsIHBhcmFtcy5raW5kKSA9PT0gdHJ1ZSksXG4gICAgICAgICAgQ29tcG9uZW50OiBTZWxlY3Rpb25Sb3dDb21wb25lbnQsXG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuICgpID0+IGl0ZW07XG4gICAgICB9LFxuXG4gICAgICBpbmplY3Rpb25Ub2tlbjogZHJvcERvd25NZW51SXRlbUluamVjdGlvblRva2VuLmZvcihhaVRvb2xUb3BCYXJNZW51S2luZCksXG4gICAgfSksXG5cbiAgICBub3RJbnN0YWxsZWRTZWxlY3Rpb25Sb3c6IGdldEluamVjdGFibGUyKHtcbiAgICAgIGlkOiBgYWktdG9vbC1zZWxlY3Rpb24tcm93LW5vdC1pbnN0YWxsZWQtJHtwYXJhbXMua2luZH1gLFxuICAgICAgY29uc3VtcHRpb25zOiBbZGV0ZWN0ZWRBaVRvb2xzSW5qZWN0aW9uVG9rZW5dLFxuXG4gICAgICBpbnN0YW50aWF0ZTogKGRpKSA9PiB7XG4gICAgICAgIGNvbnN0IGRldGVjdGVkQWlUb29scyA9IGRpLmluamVjdChkZXRlY3RlZEFpVG9vbHNJbmplY3Rpb25Ub2tlbikoKTtcblxuICAgICAgICBjb25zdCBpdGVtOiBEcm9wRG93bk1lbnVJdGVtID0ge1xuICAgICAgICAgIGlkOiBgYWktdG9vbC1zZWxlY3Rpb24tcm93LW5vdC1pbnN0YWxsZWQtJHtwYXJhbXMua2luZH1gLFxuICAgICAgICAgIG9yZGVyTnVtYmVyOiBpblNlbGVjdGlvbkJhbmQoYWlUb29sVG9wQmFyTWVudU9yZGVyTnVtYmVycy5ub3RJbnN0YWxsZWRBaVRvb2xCYW5kLCBwYXJhbXMub3JkZXJOdW1iZXIpLFxuICAgICAgICAgIGlzVmlzaWJsZTogY29tcHV0ZWQoKCkgPT4gZGV0ZWN0ZWRJbnN0YWxsU3RhdGUoZGV0ZWN0ZWRBaVRvb2xzLCBwYXJhbXMua2luZCkgPT09IGZhbHNlKSxcbiAgICAgICAgICBDb21wb25lbnQ6IFNlbGVjdGlvblJvd0NvbXBvbmVudCxcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gKCkgPT4gaXRlbTtcbiAgICAgIH0sXG5cbiAgICAgIGluamVjdGlvblRva2VuOiBkcm9wRG93bk1lbnVJdGVtSW5qZWN0aW9uVG9rZW4uZm9yKGFpVG9vbFRvcEJhck1lbnVLaW5kKSxcbiAgICB9KSxcblxuICAgIC8vIFRoZSBpbnN0YWxsLWRldGVjdGlvbiBjb21tYW5kLCByZWdpc3RlcmVkIG9ubHkgd2hlbiB0aGUgdG9vbCBkZWNsYXJlcyBvbmU7XG4gICAgLy8gdGhlIGRldGVjdGVkLXRvb2xzIGxpc3QgcnVucyBpdCAoZXhpdCAwIFx1MjFEMiBpbnN0YWxsZWQpLiBBIHRvb2wgdGhhdCBkZWNsYXJlc1xuICAgIC8vIG5vbmUgKGUuZy4gQ3VzdG9tKSBpcyByZXBvcnRlZCBhcyBpbnN0YWxsZWQuXG4gICAgLi4uKHBhcmFtcy5nZXRBaVRvb2xJc0luc3RhbGxlZENsaUNvbW1hbmQgIT09IHVuZGVmaW5lZFxuICAgICAgPyB7XG4gICAgICAgICAgYWlUb29sSXNJbnN0YWxsZWRDbGlDb21tYW5kOiBnZXRPc0FuZFNoZWxsQXdhcmVJbmplY3RhYmxlKHtcbiAgICAgICAgICAgIGlkOiBgYWktdG9vbC1pcy1pbnN0YWxsZWQtY2xpLWNvbW1hbmQtJHtwYXJhbXMua2luZH1gLFxuICAgICAgICAgICAgaW5qZWN0aW9uVG9rZW46IGdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZEluamVjdGlvblRva2VuLmZvcihwYXJhbXMua2luZCksXG4gICAgICAgICAgICB2YWx1ZTogcGFyYW1zLmdldEFpVG9vbElzSW5zdGFsbGVkQ2xpQ29tbWFuZCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfVxuICAgICAgOiB7fSksXG4gIH0pO1xufTtcbiIsICJpbXBvcnQgdHlwZSBSZWFjdCBmcm9tIFwicmVhY3RcIjtcbmltcG9ydCB7IGdldEluamVjdGlvblRva2VuQ29tcG9uZW50MiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlLXJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IEFpVG9vbEtpbmQgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWlUb29sU2VsZWN0aW9uUm93UHJvcHMge1xuICAvKiogVGhlIHRvb2wgdGhlIHJvdyByZXByZXNlbnRzLiAqL1xuICByZWFkb25seSBraW5kOiBBaVRvb2xLaW5kO1xufVxuXG4vKipcbiAqIE9uZSBBSSB0b29sJ3Mgcm93IGluIHRoZSB0b3AgYmFyIG1lbnUncyBzZWxlY3Rpb24gc2VjdGlvbjogaG93IHRoZSByb3cgbG9va3MgYW5kIHdoYXRcbiAqIGNsaWNraW5nIGl0IGRvZXMgKHNlbGVjdGluZyBhbiBpbnN0YWxsZWQgdG9vbCwgZ3VpZGluZyB0aGUgaW5zdGFsbGF0aW9uIG9mIGEgbWlzc2luZ1xuICogb25lKS4gUmVnaXN0ZXJlZCBhZ2FpbnN0IHRoZSBtZW51IGF1dG9tYXRpY2FsbHksIHBlciB0b29sLCBieVxuICoge0BsaW5rIGdldEFpVG9vbEluamVjdGFibGVCdW5jaH07IHRoZSBmZWF0dXJlIG93bmluZyB0aGUgQUkgdG9vbCBidXR0b24gcHJvdmlkZXMgdGhlXG4gKiBpbXBsZW1lbnRhdGlvbiwgc28gdGhpcyBnZW5lcmljIHBhY2thZ2Ugc3RheXMgZnJlZSBvZiBpdHMgdGVsZW1ldHJ5IGFuZCBlbnRpdGxlbWVudFxuICogY29uY2VybnMuXG4gKi9cbmV4cG9ydCBjb25zdCBBaVRvb2xTZWxlY3Rpb25Sb3cgPSBnZXRJbmplY3Rpb25Ub2tlbkNvbXBvbmVudDI8UmVhY3QuRnVuY3Rpb25Db21wb25lbnQ8QWlUb29sU2VsZWN0aW9uUm93UHJvcHM+Pih7XG4gIGlkOiBcImFpLXRvb2wtc2VsZWN0aW9uLXJvd1wiLFxufSkoKTtcbiIsICJpbXBvcnQgeyBnZXREcm9wRG93bk1lbnVLaW5kIH0gZnJvbSBcIkBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWNvbnRyYWN0c1wiO1xuXG4vKipcbiAqIFRoZSBkcm9wLWRvd24gbWVudSBvZiB0aGUgdG9wIGJhcidzIEFJIHRvb2wgYnV0dG9uLiBUaGUgQUkgdG9vbCBzZWxlY3Rpb24gcm93cyBhcmVcbiAqIGNvbnRyaWJ1dGVkIGF1dG9tYXRpY2FsbHksIG9uZSBwZXIgcmVnaXN0ZXJlZCB0b29sLCBieSBgZ2V0QWlUb29sSW5qZWN0YWJsZUJ1bmNoYCBvZlxuICogYEBrOHNsZW5zL2FpLXRvb2xzLWNvbnRyYWN0c2A7IGFueW9uZSBlbHNlIGNvbnRyaWJ1dGVzIHRoZWlyIG93biBpdGVtcyB3aXRoXG4gKiBgZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaGAgb2YgYEBrOHNsZW5zL2Ryb3AtZG93bi1tZW51LWNvbnRyYWN0c2AgYWdhaW5zdFxuICogdGhpcyBraW5kLCBwbGFjZWQgd2l0aCB7QGxpbmsgYWlUb29sVG9wQmFyTWVudU9yZGVyTnVtYmVyc30uXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHRzeFxuICogZXhwb3J0IGRlZmF1bHQgZ2V0RHJvcERvd25NZW51SXRlbUluamVjdGFibGVCdW5jaCh7XG4gKiAgIGlkOiBcIm15LWFpLW1lbnUtaXRlbVwiLFxuICogICBraW5kOiBhaVRvb2xUb3BCYXJNZW51S2luZCxcbiAqICAgb3JkZXJOdW1iZXI6IGFpVG9vbFRvcEJhck1lbnVPcmRlck51bWJlcnMuc2VjdGlvbkVuZCArIDEwMCxcbiAqICAgQ29tcG9uZW50OiBNeU1lbnVJdGVtLFxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbFRvcEJhck1lbnVLaW5kID0gZ2V0RHJvcERvd25NZW51S2luZCgpKFwiYWktdG9vbC10b3AtYmFyLW1lbnVcIik7XG5cbi8qKlxuICogV2hlcmUgdGhlIEFJIHRvb2wgc2VsZWN0aW9uIHNlY3Rpb24ncyBvd24gaXRlbXMgc2l0IGluIHRoZSBidXR0b24ncyBtZW51LCBhcyB0aGVcbiAqIGJvdW5kYXJpZXMgdGhleSBhcmUgbGFpZCBvdXQgYWdhaW5zdC4gVGhlIHNlbGVjdGlvbiByb3dzIG9jY3VweSB0d28gYmFuZHMsIGVhY2hcbiAqIGBiYW5kV2lkdGhgIHdpZGUsIHNvIHRoYXQgZXZlcnkgaW5zdGFsbGVkIHRvb2wgY29tZXMgYmVmb3JlIGV2ZXJ5IG5vdC15ZXQtaW5zdGFsbGVkXG4gKiBvbmUgd2hpbGUgZWFjaCBiYW5kIHN0YXlzIHNvcnRlZCBieSB0aGUgdG9vbHMnIG93biBvcmRlciBudW1iZXJzLlxuICpcbiAqIEEgY29udHJpYnV0b3IgcGxhY2VzIGl0c2VsZiByZWxhdGl2ZSB0byB0aGVzZSByYXRoZXIgdGhhbiBhZ2FpbnN0IGEgZ3Vlc3NlZCBudW1iZXIuXG4gKiBUaGUgc2VjdGlvbiBlbmRzIGF0IHtAbGluayBzZWN0aW9uRW5kfTogaXRlbXMgY29udHJpYnV0ZWQgYWZ0ZXIgaXQgcGljayB0aGVpciBvcmRlclxuICogbnVtYmVycyBmcm9tIHRoZXJlIHVwLCBmcmFtaW5nIHRoZWlyIG93biBzZWN0aW9ucyB3aXRoIHNlcGFyYXRvcnMgdGhleSBjb250cmlidXRlXG4gKiB0aGVtc2VsdmVzLlxuICovXG5leHBvcnQgY29uc3QgYWlUb29sVG9wQmFyTWVudU9yZGVyTnVtYmVycyA9IHtcbiAgLyoqIFRoZSBoZWFkaW5nIGFib3ZlIHRoZSBzZWxlY3Rpb24gcm93cy4gKi9cbiAgYWlUb29sc0hlYWRlcjogMTAwLFxuICAvKiogVGhlIHNjYW5uaW5nIGluZGljYXRvciBzaG93biB3aGlsZSB0aGUgZmlyc3QgZGV0ZWN0aW9uIGhhcyBub3Qgc2V0dGxlZC4gKi9cbiAgZGV0ZWN0aW9uUGVuZGluZzogMjAwLFxuICAvKiogVGhlIGZpcnN0IG9yZGVyIG51bWJlciBvZiB0aGUgYmFuZCBob2xkaW5nIHRoZSByb3dzIG9mIGluc3RhbGxlZCB0b29scy4gKi9cbiAgaW5zdGFsbGVkQWlUb29sQmFuZDogMzAwLFxuICAvKiogVGhlIGZpcnN0IG9yZGVyIG51bWJlciBvZiB0aGUgYmFuZCBob2xkaW5nIHRoZSByb3dzIG9mIG5vdC1pbnN0YWxsZWQgdG9vbHMuICovXG4gIG5vdEluc3RhbGxlZEFpVG9vbEJhbmQ6IDQwMCxcbiAgLyoqIEhvdyB3aWRlIGVhY2ggc2VsZWN0aW9uIGJhbmQgaXMsIGFuZCBzbyBob3cgZmFyIGEgdG9vbCdzIG93biBudW1iZXIgbWF5IHJlYWNoLiAqL1xuICBiYW5kV2lkdGg6IDEwMCxcbiAgLyoqIFRoZSBmaXJzdCBvcmRlciBudW1iZXIgcGFzdCB0aGUgd2hvbGUgc2VsZWN0aW9uIHNlY3Rpb24uICovXG4gIHNlY3Rpb25FbmQ6IDUwMCxcbn0gYXMgY29uc3Q7XG4iLCAiaW1wb3J0IHsgZ2V0SW5qZWN0aW9uVG9rZW4yIH0gZnJvbSBcIkBrOHNsZW5zL2luamVjdGFibGVcIjtcbmltcG9ydCB0eXBlIHsgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xMaXN0RW50cnkgfSBmcm9tIFwiLi9haS10b29sXCI7XG5cbi8qKiBSZXNvbHZlcyB0aGUgc3luY2hyb25vdXNseSByZWFkYWJsZSBkZXRlY3RlZC10b29scyBsaXN0LiAqL1xuZXhwb3J0IHR5cGUgRGV0ZWN0ZWRBaVRvb2xzID0gKCkgPT4gSUNvbXB1dGVkVmFsdWU8QWlUb29sTGlzdEVudHJ5W10+O1xuXG4vKipcbiAqIFRoZSBBSSB0b29scyB3aXRoIHRoZWlyIGRldGVjdGVkIGluc3RhbGwgc3RhdGUsIGFzIGEgc3luY2hyb25vdXNseSByZWFkYWJsZSByZWFjdGl2ZVxuICogbGlzdCBcdTIwMTQgdGhlIHNhbWUgc3RhdGUgYGFpVG9vbHNJbmplY3Rpb25Ub2tlbmAgZXhwb3NlcyBiZWhpbmQgYSBwcm9taXNlLCBmb3IgY29uc3VtZXJzXG4gKiB0aGF0IG5lZWQgc3luYyByZWFjdGl2aXR5IChlLmcuIHRoZSBgaXNWaXNpYmxlYCBjb21wdXRlZHMgb2YgbWVudSBpdGVtcykuIEVtcHR5IHVudGlsXG4gKiB0aGUgZmlyc3QgZXhwbGljaXQgc2NhbiAoYHJlZnJlc2hBaVRvb2xEZXRlY3Rpb25JbmplY3Rpb25Ub2tlbmApIGhhcyBydW47IGEga2luZFxuICogbWlzc2luZyBmcm9tIHRoZSBsaXN0IGhhcyBub3QgYmVlbiBzY2FubmVkIHlldC5cbiAqL1xuZXhwb3J0IGNvbnN0IGRldGVjdGVkQWlUb29sc0luamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogRGV0ZWN0ZWRBaVRvb2xzIH0+KHtcbiAgaWQ6IFwiZGV0ZWN0ZWQtYWktdG9vbHNcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IElDb21wdXRlZFZhbHVlIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sTGlzdEVudHJ5IH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIHJlYWN0aXZlIGxpc3Qgb2YgYWxsIGNvbnRyaWJ1dGVkIEFJIHRvb2xzIHdpdGggaW5zdGFsbCBzdGF0ZS4gKi9cbmV4cG9ydCB0eXBlIEFpVG9vbHMgPSAoKSA9PiBQcm9taXNlPElDb21wdXRlZFZhbHVlPEFpVG9vbExpc3RFbnRyeVtdPj47XG5cbi8qKlxuICogQWxsIGNvbnRyaWJ1dGVkIEFJIHRvb2wga2luZHMgdG9nZXRoZXIgd2l0aCB0aGVpciBkZXRlY3RlZCBpbnN0YWxsYXRpb25cbiAqIHN0YXRlLCBzb3J0ZWQgYnkgb3JkZXIgbnVtYmVyLiBDb25zdW1lZCBieSB0aGUgcHJlZmVyZW5jZXMgc2VsZWN0b3IuXG4gKi9cbmV4cG9ydCBjb25zdCBhaVRvb2xzSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xzIH0+KHtcbiAgaWQ6IFwiYWktdG9vbHNcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiwgdHlwZSBNYXliZVJlc3VsdEZhY3RvcnkgfSBmcm9tIFwiQGs4c2xlbnMvaW5qZWN0YWJsZVwiO1xuaW1wb3J0IHsgZ2V0RHJvcERvd25NZW51S2luZCB9IGZyb20gXCJAazhzbGVucy9kcm9wLWRvd24tbWVudS1jb250cmFjdHNcIjtcbmltcG9ydCB0eXBlIHsgSUNvbXB1dGVkVmFsdWUgfSBmcm9tIFwibW9ieFwiO1xuaW1wb3J0IHR5cGUgeyBBaVRvb2xLaW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKipcbiAqIFRoZSBtZW51IGEgdG9vbCdzIG93biBjb25maWd1cmF0aW9uIGlzIG9mZmVyZWQgaW4sIG9wZW5lZCBmcm9tIHRoZSB0b29sJ3Mgcm93IGluXG4gKiB0aGUgQUkgdG9vbCBidXR0b24ncyBtZW51LiBPbmUga2luZCBmb3IgZXZlcnkgdG9vbDogdGhlIHJvdyBzYXlzIHdoaWNoIHRvb2wgaXRcbiAqIG9wZW5lZCB0aGUgbWVudSBmb3IsIGFuZCB0aGUgaXRlbSByZW5kZXJzIHRoYXQgdG9vbCdzIGBTZXR0aW5nc2AuXG4gKi9cbmV4cG9ydCBjb25zdCBhaVRvb2xDb25maWd1cmF0aW9uTWVudUtpbmQgPSBnZXREcm9wRG93bk1lbnVLaW5kPHsgcmVhZG9ubHkga2luZDogQWlUb29sS2luZCB9PigpKFxuICBcImFpLXRvb2wtY29uZmlndXJhdGlvbi1tZW51XCIsXG4pO1xuXG4vKiogUmVzb2x2ZXMgd2hldGhlciB0aGUgdG9vbCBoYXMgdGhlIGNvbmZpZ3VyYXRpb24gaXQgbmVlZHMgdG8gcnVuLiAqL1xuZXhwb3J0IHR5cGUgQWlUb29sSXNDb25maWd1cmVkID0gKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTxib29sZWFuPj47XG5cbi8qKlxuICogV2hldGhlciBhIHRvb2wgaGFzIHRoZSBjb25maWd1cmF0aW9uIGl0IG5lZWRzIHRvIHJ1biBcdTIwMTQgdGhlIEN1c3RvbSBraW5kJ3NcbiAqIGZyZWUtdGV4dCBjb21tYW5kLCBmb3IgaW5zdGFuY2UsIGlzIG5vdGhpbmcgdW50aWwgdGhlIHVzZXIgd3JpdGVzIG9uZS5cbiAqXG4gKiBSZWdpc3RlcmVkIG9ubHkgYnkgdGhlIHRvb2xzIHRoYXQgbmVlZCBjb25maWd1cmluZzsgYSB0b29sIHdpdGggbm8gcmVnaXN0cmF0aW9uXG4gKiBuZWVkcyBub25lIGFuZCBpcyBhbHdheXMgcmVhZHkuIFJlZ2lzdGVyaW5nIG9uZSBpcyBhbHNvIHdoYXQgbWFrZXMgYSBzdXJmYWNlXG4gKiBvZmZlciB0aGUgdG9vbCdzIG93biBgU2V0dGluZ3NgLCBzbyBhIHRvb2wgY2FuIGJlIGNvbmZpZ3VyZWQgd2hlcmUgaXQgaXMgcGlja2VkXG4gKiByYXRoZXIgdGhhbiBpbiBvbmUgcGxhY2UgYWxvbmUuXG4gKi9cbmV4cG9ydCBjb25zdCBhaVRvb2xJc0NvbmZpZ3VyZWRGb3JLaW5kSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJc0NvbmZpZ3VyZWQgfT4oe1xuICBpZDogXCJhaS10b29sLWlzLWNvbmZpZ3VyZWQtZm9yLWtpbmRcIixcbiAgY2FyZGluYWxpdHk6IFwiemVyby1vci1vbmVcIixcbn0pKChraW5kOiBBaVRvb2xLaW5kKSA9PlxuICBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBBaVRvb2xJc0NvbmZpZ3VyZWQ7IG1heWJlRmFjdG9yeTogTWF5YmVSZXN1bHRGYWN0b3J5PEFpVG9vbElzQ29uZmlndXJlZD4gfT4oe1xuICAgIGlkOiBgYWktdG9vbC1pcy1jb25maWd1cmVkLWZvci1raW5kLSR7a2luZH1gLFxuICAgIHNwZWNpYWxpdHk6IGtpbmQsXG4gICAgY2FyZGluYWxpdHk6IFwiemVyby1vci1vbmVcIixcbiAgfSkoKSxcbik7XG5cbi8qKiBXaGF0IG9uZSB0b29sIHNheXMgYWJvdXQgY29uZmlndXJhdGlvbiBvZiBpdHMgb3duLCBhcyB0aGUgc3VyZmFjZXMgdGhhdCBnYXRlIG9uIGl0IG5lZWQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIEFpVG9vbENvbmZpZ3VyYXRpb25TdGF0ZSB7XG4gIC8qKiBXaGV0aGVyIHRoZSB0b29sIGhhcyBjb25maWd1cmF0aW9uIHRvIGZpbGwgaW4gYXQgYWxsLiAqL1xuICByZWFkb25seSBpc0NvbmZpZ3VyYWJsZTogSUNvbXB1dGVkVmFsdWU8Ym9vbGVhbj47XG4gIC8qKiBXaGV0aGVyIHRoYXQgY29uZmlndXJhdGlvbiBpcyB0aGVyZSB5ZXQuICovXG4gIHJlYWRvbmx5IGlzQ29uZmlndXJlZDogSUNvbXB1dGVkVmFsdWU8Ym9vbGVhbj47XG4gIC8qKiBXaGV0aGVyIHRoZSB0b29sIG1heSBiZSBwaWNrZWQ6IGl0IGVpdGhlciBuZWVkcyBubyBjb25maWd1cmF0aW9uLCBvciBoYXMgaXQuICovXG4gIHJlYWRvbmx5IGlzUmVhZHlUb1NlbGVjdDogSUNvbXB1dGVkVmFsdWU8Ym9vbGVhbj47XG59XG5cbi8qKiBSZXNvbHZlcyBvbmUgdG9vbCdzIGNvbmZpZ3VyYXRpb24gc3RhdGUuICovXG5leHBvcnQgdHlwZSBBaVRvb2xDb25maWd1cmF0aW9uU3RhdGVGb3IgPSAoKSA9PiAoa2luZDogQWlUb29sS2luZCkgPT4gQWlUb29sQ29uZmlndXJhdGlvblN0YXRlO1xuXG4vKipcbiAqIFJlYWRzIHtAbGluayBhaVRvb2xJc0NvbmZpZ3VyZWRGb3JLaW5kSW5qZWN0aW9uVG9rZW59IG9uIGJlaGFsZiBvZiBldmVyeSBzdXJmYWNlXG4gKiB0aGF0IGdhdGVzIG9uIGl0IFx1MjAxNCB0aGUgQUkgdG9vbCBidXR0b24ncyBtZW51IGFuZCB0aGUgcHJlZmVyZW5jZXMgc2VsZWN0b3IgXHUyMDE0IHNvXG4gKiBvbmUgcnVsZSBpcyBub3QgZW5mb3JjZWQgaW4gb25lIHBsYWNlIGFuZCBtaXNzZWQgaW4gYW5vdGhlci5cbiAqL1xuZXhwb3J0IGNvbnN0IGFpVG9vbENvbmZpZ3VyYXRpb25TdGF0ZUluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogQWlUb29sQ29uZmlndXJhdGlvblN0YXRlRm9yO1xufT4oe1xuICBpZDogXCJhaS10b29sLWNvbmZpZ3VyYXRpb24tc3RhdGVcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuIiwgImltcG9ydCB7IGdldEluamVjdGlvblRva2VuMiB9IGZyb20gXCJAazhzbGVucy9pbmplY3RhYmxlXCI7XG5pbXBvcnQgdHlwZSB7IElDb21wdXRlZFZhbHVlLCBJT2JzZXJ2YWJsZVZhbHVlIH0gZnJvbSBcIm1vYnhcIjtcbmltcG9ydCB0eXBlIFJlYWN0IGZyb20gXCJyZWFjdFwiO1xuaW1wb3J0IHR5cGUgeyBTdmdQcm9wcyB9IGZyb20gXCJAazhzbGVucy9lbGVtZW50LWNvbXBvbmVudHNcIjtcbmltcG9ydCB0eXBlIHsgQWlUb29sS2luZCwgR2V0Q2xpQ29tbWFuZCwgR2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kIH0gZnJvbSBcIi4vYWktdG9vbFwiO1xuXG4vKiogUmVzb2x2ZXMgdGhlIHBlcnNpc3RlZCByYXcgc2VsZWN0aW9uOiBhIHRvb2wga2luZCwgYGN1c3RvbUFpVG9vbEtpbmRgLCBgbm9BaVRvb2xLaW5kYCwgb3IgYHVuZGVmaW5lZGAgKHVuc2V0KS4gKi9cbmV4cG9ydCB0eXBlIFNlbGVjdGVkQWlUb29sS2luZCA9ICgpID0+IFByb21pc2U8SU9ic2VydmFibGVWYWx1ZTxBaVRvb2xLaW5kIHwgdW5kZWZpbmVkPj47XG5cbi8qKlxuICogVGhlIHVzZXIncyBwZXJzaXN0ZWQgQUkgdG9vbCBzZWxlY3Rpb24uIEhvbGRzIGEgY29udHJpYnV0ZWQgdG9vbCBraW5kLCB0aGVcbiAqIGBjdXN0b21BaVRvb2xLaW5kYCBzZW50aW5lbCwgdGhlIGBub0FpVG9vbEtpbmRgIG9wdC1vdXQsIG9yIGB1bmRlZmluZWRgIHdoZW4gbmV2ZXJcbiAqIHNldC4gUmVhZC93cml0ZSBcdTIwMTQgdGhlIHByZWZlcmVuY2VzIHNlbGVjdG9yIGJpbmRzIHRvIGl0LlxuICovXG5leHBvcnQgY29uc3Qgc2VsZWN0ZWRBaVRvb2xLaW5kSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBTZWxlY3RlZEFpVG9vbEtpbmQgfT4oe1xuICBpZDogXCJzZWxlY3RlZC1haS10b29sLWtpbmRcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuXG4vKiogUmVzb2x2ZXMgdGhlIGVmZmVjdGl2ZSBzZWxlY3Rpb246IHRoZSByYXcgc2VsZWN0aW9uIGlmIGluc3RhbGxlZCwgZWxzZSBgbm9BaVRvb2xLaW5kYC4gKi9cbmV4cG9ydCB0eXBlIEVmZmVjdGl2ZUFpVG9vbEtpbmQgPSAoKSA9PiBQcm9taXNlPElDb21wdXRlZFZhbHVlPEFpVG9vbEtpbmQ+PjtcblxuLyoqXG4gKiBUaGUgZWZmZWN0aXZlIEFJIHRvb2wga2luZDogdGhlIHJhdyBzZWxlY3Rpb24gd2hlbiBpdCBpcyBhbiBpbnN0YWxsZWQga2luZCAoYVxuICogcmVhbCB0b29sIG9yIGBjdXN0b21BaVRvb2xLaW5kYCksIG90aGVyd2lzZSBgbm9BaVRvb2xLaW5kYC4gU28gYW4gdW5zZXRcbiAqIHNlbGVjdGlvbiwgYW4gZXhwbGljaXQgXCJObyBBSSB0b29sXCIsIGFuZCBhIHNlbGVjdGVkLWJ1dC11bmluc3RhbGxlZCB0b29sIGFsbFxuICogcmVzb2x2ZSB0byBgbm9BaVRvb2xLaW5kYCBcdTIwMTQgdGhlIGRlZmF1bHQgYW5kIHRoZSBmYWxsYmFjay5cbiAqL1xuZXhwb3J0IGNvbnN0IGVmZmVjdGl2ZUFpVG9vbEtpbmRJbmplY3Rpb25Ub2tlbiA9IGdldEluamVjdGlvblRva2VuMjx7IHNpbmdsZUZhY3Rvcnk6IEVmZmVjdGl2ZUFpVG9vbEtpbmQgfT4oe1xuICBpZDogXCJlZmZlY3RpdmUtYWktdG9vbC1raW5kXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcblxuLyoqIFJlc29sdmVzIHRoZSBlZmZlY3RpdmUgY29tbWFuZCBidWlsZGVyLCBvciBgdW5kZWZpbmVkYCB3aGVuIEN1c3RvbSBvciBcIk5vIEFJIHRvb2xcIiBpcyBlZmZlY3RpdmUuICovXG5leHBvcnQgdHlwZSBTZWxlY3RlZEFpVG9vbENvbW1hbmQgPSAoKSA9PiBQcm9taXNlPElDb21wdXRlZFZhbHVlPEdldENsaUNvbW1hbmQgfCB1bmRlZmluZWQ+PjtcblxuLyoqXG4gKiBUaGUgY29tbWFuZCBidWlsZGVyIGZvciB0aGUgZWZmZWN0aXZlIHNlbGVjdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAqIGVmZmVjdGl2ZSBzZWxlY3Rpb24gaXMgYGN1c3RvbUFpVG9vbEtpbmRgICh0aGUgY29uc3VtZXIgdGhlbiB1c2VzIGl0cyBvd25cbiAqIGZyZWUtdGV4dCBjb21tYW5kKSBvciBgbm9BaVRvb2xLaW5kYCAobm90aGluZyB0byBsYXVuY2gpLiBDb25zdW1lZCB3aGVuXG4gKiBsYXVuY2hpbmcgYW4gQUkgdG9vbC5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlbGVjdGVkQWlUb29sQ29tbWFuZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHsgc2luZ2xlRmFjdG9yeTogU2VsZWN0ZWRBaVRvb2xDb21tYW5kIH0+KHtcbiAgaWQ6IFwic2VsZWN0ZWQtYWktdG9vbC1jb21tYW5kXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcblxuLyoqIFJlc29sdmVzIHRoZSBlZmZlY3RpdmUgdG9vbCdzIHJlc3VtZSBjb21tYW5kIGJ1aWxkZXIsIG9yIGB1bmRlZmluZWRgIHdoZW4gaXQgaGFzIG5vIHJlc3VtZSBpbnZvY2F0aW9uLiAqL1xuZXhwb3J0IHR5cGUgU2VsZWN0ZWRBaVRvb2xSZXN1bWVDb21tYW5kID0gKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTxHZXRDbGlDb21tYW5kIHwgdW5kZWZpbmVkPj47XG5cbi8qKlxuICogVGhlIGNvbW1hbmQgYnVpbGRlciB0aGF0ICpyZXN1bWVzKiB0aGUgZWZmZWN0aXZlIHNlbGVjdGlvbiAoZS5nLiBidWlsZGluZ1xuICogYGNsYXVkZSAtLWNvbnRpbnVlIHx8IGNsYXVkZWApLCBvciBgdW5kZWZpbmVkYCB3aGVuIHRoZSBlZmZlY3RpdmUgdG9vbCBkZWNsYXJlcyBub1xuICogcmVzdW1lIGludm9jYXRpb24uIENvbnN1bWVkIHdoZW4gcmUtZXN0YWJsaXNoaW5nIGFuIEFJIHRvb2wncyBzZXNzaW9uIFx1MjAxNCBhXG4gKiB0ZXJtaW5hbCB0YWIgcnVucyB0aGlzIGluc3RlYWQgb2YgdGhlIGxhdW5jaCBjb21tYW5kIGFmdGVyIGEgcmVzdGFydC5cbiAqL1xuZXhwb3J0IGNvbnN0IHNlbGVjdGVkQWlUb29sUmVzdW1lQ29tbWFuZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogU2VsZWN0ZWRBaVRvb2xSZXN1bWVDb21tYW5kO1xufT4oe1xuICBpZDogXCJzZWxlY3RlZC1haS10b29sLXJlc3VtZS1jb21tYW5kXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcblxuLyoqIFJlc29sdmVzIHRoZSBlZmZlY3RpdmUgdG9vbCdzIFwib3BlbiBpbiBleHRlcm5hbCB0ZXJtaW5hbFwiIGNvbW1hbmQgYnVpbGRlciBmb3IgdGhlIGhvc3QgT1MuICovXG5leHBvcnQgdHlwZSBTZWxlY3RlZEFpVG9vbE9wZW5JbkV4dGVybmFsVGVybWluYWxDb21tYW5kID0gKCkgPT4gUHJvbWlzZTxcbiAgSUNvbXB1dGVkVmFsdWU8R2V0T3BlblRvb2xJbkV4dGVybmFsVGVybWluYWxDbGlDb21tYW5kIHwgdW5kZWZpbmVkPlxuPjtcblxuLyoqXG4gKiBUaGUgY29tbWFuZCBidWlsZGVyIHRoYXQgb3BlbnMgdGhlIGVmZmVjdGl2ZSBzZWxlY3RlZCB0b29sIGluIGEgZnJlc2ggZXh0ZXJuYWxcbiAqIHRlcm1pbmFsIHdpbmRvdywgZm9yIHRoZSBob3N0IG9wZXJhdGluZyBzeXN0ZW0uIENvbnN1bWVkIHdoZW4gdGhlIGdsb2JhbCBcIm9wZW5cbiAqIEFJIHRvb2xzIGluIGFuIGV4dGVybmFsIHRlcm1pbmFsXCIgdG9nZ2xlIGlzIG9uIFx1MjAxNCB0aGUgY29uc3VtZXIgY2FsbHMgaXQgd2l0aFxuICogYHsgcHJvbXB0LCBkaXIsIGVudiB9YCBhbmQgc3Bhd25zIHRoZSByZXN1bHQgZGV0YWNoZWQuIFJlc29sdmVzIHRoZSB0b29sJ3NcbiAqIGhvc3QtT1MgdmFyaWFudCAobWFjT1MgVGVybWluYWwsIFdpbmRvd3MgVGVybWluYWwsIG9yIGEgTGludXggZmFsbGJhY2sgY2hhaW4pIHZpYVxuICogdGhlIHBlci1raW5kIGBnZXRPcGVuVG9vbEluRXh0ZXJuYWxUZXJtaW5hbEZvclRvb2xgIHRva2VuLlxuICovXG5leHBvcnQgY29uc3Qgc2VsZWN0ZWRBaVRvb2xPcGVuSW5FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZEluamVjdGlvblRva2VuID0gZ2V0SW5qZWN0aW9uVG9rZW4yPHtcbiAgc2luZ2xlRmFjdG9yeTogU2VsZWN0ZWRBaVRvb2xPcGVuSW5FeHRlcm5hbFRlcm1pbmFsQ29tbWFuZDtcbn0+KHtcbiAgaWQ6IFwic2VsZWN0ZWQtYWktdG9vbC1vcGVuLWluLWV4dGVybmFsLXRlcm1pbmFsLWNvbW1hbmRcIixcbiAgY2FyZGluYWxpdHk6IFwib25lXCIsXG59KSgpO1xuXG4vKiogUmVzb2x2ZXMgdGhlIGVmZmVjdGl2ZSB0b29sJ3MgZGlzcGxheS1uYW1lIFJlYWN0IGNvbXBvbmVudC4gKi9cbmV4cG9ydCB0eXBlIEVmZmVjdGl2ZUFpVG9vbE5hbWUgPSAoKSA9PiBQcm9taXNlPElDb21wdXRlZFZhbHVlPFJlYWN0LkNvbXBvbmVudFR5cGU+PjtcblxuLyoqXG4gKiBUaGUgZWZmZWN0aXZlIHNlbGVjdGVkIHRvb2wncyBkaXNwbGF5LW5hbWUgY29tcG9uZW50IChlLmcuIHJlbmRlcnMgXCJDbGF1ZGVcbiAqIENvZGVcIikuIERyaXZlcyB0aGUgUmVhY3Qgc3VyZmFjZXMgdGhhdCBuYW1lIHRoZSBBSSB0b29sIFx1MjAxNCBcIkFzayA8bmFtZT5cIlxuICogYnV0dG9ucyBhbmQgdGhlIHRvcC1iYXIgbGFiZWwuXG4gKi9cbmV4cG9ydCBjb25zdCBlZmZlY3RpdmVBaVRvb2xOYW1lSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBFZmZlY3RpdmVBaVRvb2xOYW1lIH0+KHtcbiAgaWQ6IFwiZWZmZWN0aXZlLWFpLXRvb2wtbmFtZVwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG5cbi8qKiBSZXNvbHZlcyB0aGUgZWZmZWN0aXZlIHRvb2wncyBwbGFpbi10ZXh0IGRpc3BsYXkgbmFtZS4gKi9cbmV4cG9ydCB0eXBlIEVmZmVjdGl2ZUFpVG9vbERpc3BsYXlOYW1lID0gKCkgPT4gUHJvbWlzZTxJQ29tcHV0ZWRWYWx1ZTxzdHJpbmc+PjtcblxuLyoqXG4gKiBUaGUgZWZmZWN0aXZlIHNlbGVjdGVkIHRvb2wncyBwbGFpbi10ZXh0IG5hbWUsIGZvciBzdHJpbmctb25seSBzbG90cyB0aGF0XG4gKiBjYW5ub3QgcmVuZGVyIHRoZSBSZWFjdCBuYW1lIGNvbXBvbmVudCAoZS5nLiB0aGUgY29tbWFuZC1wYWxldHRlIGVudHJ5IHRpdGxlKS5cbiAqL1xuZXhwb3J0IGNvbnN0IGVmZmVjdGl2ZUFpVG9vbERpc3BsYXlOYW1lSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8e1xuICBzaW5nbGVGYWN0b3J5OiBFZmZlY3RpdmVBaVRvb2xEaXNwbGF5TmFtZTtcbn0+KHtcbiAgaWQ6IFwiZWZmZWN0aXZlLWFpLXRvb2wtZGlzcGxheS1uYW1lXCIsXG4gIGNhcmRpbmFsaXR5OiBcIm9uZVwiLFxufSkoKTtcblxuLyoqIFJlc29sdmVzIHRoZSBlZmZlY3RpdmUgdG9vbCdzIGljb24gY29tcG9uZW50LiAqL1xuZXhwb3J0IHR5cGUgRWZmZWN0aXZlQWlUb29sSWNvbiA9ICgpID0+IFByb21pc2U8SUNvbXB1dGVkVmFsdWU8UmVhY3QuQ29tcG9uZW50VHlwZTxTdmdQcm9wcz4+PjtcblxuLyoqXG4gKiBUaGUgZWZmZWN0aXZlIHNlbGVjdGVkIHRvb2wncyBpY29uIGNvbXBvbmVudCwgc2hvd24gd2hlcmV2ZXIgdGhlIHRvb2wgaXMgb2ZmZXJlZFxuICogKHRoZSBcIkFzayA8bmFtZT5cIiBidXR0b25zIGFuZCB0aGUgdG9wLWJhciBidXR0b24pIGluIHBsYWNlIG9mIGEgZml4ZWQgYnJhbmRcbiAqIGljb24uXG4gKi9cbmV4cG9ydCBjb25zdCBlZmZlY3RpdmVBaVRvb2xJY29uSW5qZWN0aW9uVG9rZW4gPSBnZXRJbmplY3Rpb25Ub2tlbjI8eyBzaW5nbGVGYWN0b3J5OiBFZmZlY3RpdmVBaVRvb2xJY29uIH0+KHtcbiAgaWQ6IFwiZWZmZWN0aXZlLWFpLXRvb2wtaWNvblwiLFxuICBjYXJkaW5hbGl0eTogXCJvbmVcIixcbn0pKCk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtB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QUNmLENBQUMsRUFBRTtBQVdJLElBQU0sd0NBQW9DLHdDQUEyRDtBQUFBLEVBQzFHLElBQUk7QUFBQSxFQUNKLGFBQWE7QUFDZixDQUFDLEVBQUU7QUFXSSxJQUFNLDBDQUFzQyx3Q0FBNkQ7QUFBQSxFQUM5RyxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBV0ksSUFBTSxnREFBNEMsd0NBRXREO0FBQUEsRUFDRCxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBZUksSUFBTSxnRUFBNEQsd0NBRXRFO0FBQUEsRUFDRCxJQUFJO0FBQUEsRUFDSixhQUFhO0FBQ2YsQ0FBQyxFQUFFO0FBVUksSUFBTSx3Q0FBb0Msd0NBQTJEO0FBQUEsRUFDMUcsSUFBSTtBQUFBLEVBQ0osYUFBYTtBQUNmLENBQUMsRUFBRTtBQVNJLElBQU0sK0NBQTJDLHdDQUVyRDtBQUFBLEVBQ0QsSUFBSTtBQUFBLEVBQ0osYUFBYTtBQUNmLENBQUMsRUFBRTtBQVVJLElBQU0sd0NBQW9DLHdDQUEyRDtBQUFBLEVBQzFHLElBQUk7QUFBQSxFQUNKLGFBQWE7QUFDZixDQUFDLEVBQUU7IiwKICAibmFtZXMiOiBbImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9wdWJsaWNfdXRpbGl0aWVzIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9pbmplY3RhYmxlIiwgImltcG9ydF9kcm9wX2Rvd25fbWVudV9jb250cmFjdHMiLCAiaW1wb3J0X2luamVjdGFibGUiLCAiUmVhY3QiLCAiaW1wb3J0X2luamVjdGFibGUiLCAiaW1wb3J0X2luamVjdGFibGUiLCAiaW1wb3J0X2Ryb3BfZG93bl9tZW51X2NvbnRyYWN0cyIsICJpbXBvcnRfaW5qZWN0YWJsZSJdCn0K
|