obsidian-dev-utils 80.0.2 → 81.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/CHANGELOG.md +15 -0
- package/dist/dev/main.js +30208 -0
- package/dist/dev/manifest.json +9 -0
- package/dist/lib/cjs/async-events.cjs +9 -1
- package/dist/lib/cjs/async-events.d.cts +8 -0
- package/dist/lib/cjs/async.cjs +89 -34
- package/dist/lib/cjs/async.d.cts +67 -15
- package/dist/lib/cjs/debug.cjs +26 -9
- package/dist/lib/cjs/debug.d.cts +23 -5
- package/dist/lib/cjs/error.cjs +4 -5
- package/dist/lib/cjs/error.d.cts +19 -4
- package/dist/lib/cjs/html-element.cjs +1 -1
- package/dist/lib/cjs/html-element.d.cts +2 -0
- package/dist/lib/cjs/library.cjs +2 -2
- package/dist/lib/cjs/object-utils.cjs +233 -128
- package/dist/lib/cjs/object-utils.d.cts +19 -4
- package/dist/lib/cjs/obsidian/async-with-notice.cjs +9 -6
- package/dist/lib/cjs/obsidian/async-with-notice.d.cts +9 -0
- package/dist/lib/cjs/obsidian/attachment-path.cjs +45 -13
- package/dist/lib/cjs/obsidian/attachment-path.d.cts +38 -8
- package/dist/lib/cjs/obsidian/backlink.cjs +6 -6
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.cjs +53 -16
- package/dist/lib/cjs/obsidian/command-handlers/abstract-file-command-handler.d.cts +81 -9
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.cjs +25 -5
- package/dist/lib/cjs/obsidian/command-handlers/editor-command-handler.d.cts +35 -1
- package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.cjs +33 -19
- package/dist/lib/cjs/obsidian/command-handlers/file-command-handler.d.cts +43 -17
- package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.cjs +33 -19
- package/dist/lib/cjs/obsidian/command-handlers/folder-command-handler.d.cts +43 -17
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.cjs +17 -9
- package/dist/lib/cjs/obsidian/components/all-windows-event-component.d.cts +48 -8
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +3 -1
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +3 -1
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.cjs +24 -8
- package/dist/lib/cjs/obsidian/components/plugin-settings-component.d.cts +25 -4
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +144 -65
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.d.cts +3 -0
- package/dist/lib/cjs/obsidian/dataview-link.cjs +7 -2
- package/dist/lib/cjs/obsidian/dataview-link.d.cts +20 -5
- package/dist/lib/cjs/obsidian/dataview.cjs +27 -10
- package/dist/lib/cjs/obsidian/dataview.d.cts +19 -4
- package/dist/lib/cjs/obsidian/file-change.cjs +103 -27
- package/dist/lib/cjs/obsidian/file-change.d.cts +50 -13
- package/dist/lib/cjs/obsidian/file-manager.cjs +61 -32
- package/dist/lib/cjs/obsidian/file-manager.d.cts +63 -13
- package/dist/lib/cjs/obsidian/file-system.cjs +122 -23
- package/dist/lib/cjs/obsidian/file-system.d.cts +168 -39
- package/dist/lib/cjs/obsidian/frontmatter.cjs +7 -2
- package/dist/lib/cjs/obsidian/link.cjs +266 -122
- package/dist/lib/cjs/obsidian/link.d.cts +84 -20
- package/dist/lib/cjs/obsidian/logger.cjs +48 -22
- package/dist/lib/cjs/obsidian/logger.d.cts +26 -5
- package/dist/lib/cjs/obsidian/loop.cjs +14 -4
- package/dist/lib/cjs/obsidian/loop.d.cts +5 -0
- package/dist/lib/cjs/obsidian/markdown-code-block-processor.cjs +155 -107
- package/dist/lib/cjs/obsidian/markdown.cjs +40 -11
- package/dist/lib/cjs/obsidian/markdown.d.cts +76 -16
- package/dist/lib/cjs/obsidian/metadata-cache.cjs +28 -14
- package/dist/lib/cjs/obsidian/metadata-cache.d.cts +76 -16
- package/dist/lib/cjs/obsidian/path-settings.cjs +5 -2
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.cjs +5 -1
- package/dist/lib/cjs/obsidian/plugin/plugin-event-source.d.cts +4 -0
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.cjs +15 -7
- package/dist/lib/cjs/obsidian/plugin/plugin-settings-tab.d.cts +39 -8
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +3 -2
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +4 -4
- package/dist/lib/cjs/obsidian/queue.cjs +9 -7
- package/dist/lib/cjs/obsidian/resource-url.cjs +7 -2
- package/dist/lib/cjs/obsidian/resource-url.d.cts +19 -4
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +4 -2
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +6 -2
- package/dist/lib/cjs/obsidian/vault-delete.cjs +19 -15
- package/dist/lib/cjs/obsidian/vault-delete.d.cts +11 -6
- package/dist/lib/cjs/obsidian/vault.cjs +116 -59
- package/dist/lib/cjs/obsidian/vault.d.cts +178 -41
- package/dist/lib/cjs/path.cjs +12 -5
- package/dist/lib/cjs/path.d.cts +15 -3
- package/dist/lib/cjs/reg-exp.cjs +101 -78
- package/dist/lib/cjs/script-utils/build.cjs +9 -5
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/change-extension-plugin.cjs +34 -14
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.cjs +20 -5
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.cts +23 -5
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/dependency.cjs +11 -4
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-esm-plugin.cjs +6 -2
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.cjs +31 -12
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.cts +19 -4
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.cjs +7 -7
- package/dist/lib/cjs/script-utils/bundlers/esbuild-impl/preprocess-plugin.cjs +12 -3
- package/dist/lib/cjs/script-utils/cli-utils.cjs +6 -2
- package/dist/lib/cjs/script-utils/exec.cjs +47 -12
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -3
- package/dist/lib/cjs/script-utils/json.cjs +9 -5
- package/dist/lib/cjs/script-utils/json.d.cts +38 -8
- package/dist/lib/cjs/script-utils/linters/eslint-rules/no-unused-params-members.cjs +8 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-component-suffix.cjs +27 -7
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-method-template.cjs +7 -3
- package/dist/lib/cjs/script-utils/linters/eslint-rules/require-super-call.cjs +8 -3
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +72 -30
- package/dist/lib/cjs/script-utils/npm-publish.cjs +2 -2
- package/dist/lib/cjs/script-utils/npm.cjs +18 -9
- package/dist/lib/cjs/script-utils/root.cjs +20 -5
- package/dist/lib/cjs/script-utils/root.d.cts +45 -9
- package/dist/lib/cjs/script-utils/validate-declarations.cjs +4 -3
- package/dist/lib/cjs/script-utils/version.cjs +36 -19
- package/dist/lib/cjs/strict-proxy.cjs +10 -1
- package/dist/lib/cjs/string.cjs +63 -22
- package/dist/lib/cjs/string.d.cts +188 -40
- package/dist/lib/esm/async-events.d.mts +8 -0
- package/dist/lib/esm/async-events.mjs +9 -1
- package/dist/lib/esm/async.d.mts +67 -15
- package/dist/lib/esm/async.mjs +89 -34
- package/dist/lib/esm/debug.d.mts +23 -5
- package/dist/lib/esm/debug.mjs +26 -9
- package/dist/lib/esm/error.d.mts +19 -4
- package/dist/lib/esm/error.mjs +4 -5
- package/dist/lib/esm/html-element.d.mts +2 -0
- package/dist/lib/esm/html-element.mjs +1 -1
- package/dist/lib/esm/library.mjs +2 -2
- package/dist/lib/esm/object-utils.d.mts +19 -4
- package/dist/lib/esm/object-utils.mjs +233 -128
- package/dist/lib/esm/obsidian/async-with-notice.d.mts +9 -0
- package/dist/lib/esm/obsidian/async-with-notice.mjs +9 -6
- package/dist/lib/esm/obsidian/attachment-path.d.mts +38 -8
- package/dist/lib/esm/obsidian/attachment-path.mjs +45 -13
- package/dist/lib/esm/obsidian/backlink.mjs +6 -6
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.d.mts +81 -9
- package/dist/lib/esm/obsidian/command-handlers/abstract-file-command-handler.mjs +53 -16
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.d.mts +35 -1
- package/dist/lib/esm/obsidian/command-handlers/editor-command-handler.mjs +25 -5
- package/dist/lib/esm/obsidian/command-handlers/file-command-handler.d.mts +43 -17
- package/dist/lib/esm/obsidian/command-handlers/file-command-handler.mjs +33 -19
- package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.d.mts +43 -17
- package/dist/lib/esm/obsidian/command-handlers/folder-command-handler.mjs +33 -19
- package/dist/lib/esm/obsidian/components/all-windows-event-component.d.mts +48 -8
- package/dist/lib/esm/obsidian/components/all-windows-event-component.mjs +17 -9
- package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +3 -1
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +3 -1
- package/dist/lib/esm/obsidian/components/plugin-settings-component.d.mts +25 -4
- package/dist/lib/esm/obsidian/components/plugin-settings-component.mjs +24 -8
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.d.mts +3 -0
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +145 -69
- package/dist/lib/esm/obsidian/dataview-link.d.mts +20 -5
- package/dist/lib/esm/obsidian/dataview-link.mjs +7 -2
- package/dist/lib/esm/obsidian/dataview.d.mts +19 -4
- package/dist/lib/esm/obsidian/dataview.mjs +27 -10
- package/dist/lib/esm/obsidian/file-change.d.mts +50 -13
- package/dist/lib/esm/obsidian/file-change.mjs +104 -27
- package/dist/lib/esm/obsidian/file-manager.d.mts +63 -13
- package/dist/lib/esm/obsidian/file-manager.mjs +65 -33
- package/dist/lib/esm/obsidian/file-system.d.mts +168 -39
- package/dist/lib/esm/obsidian/file-system.mjs +122 -23
- package/dist/lib/esm/obsidian/frontmatter.mjs +7 -2
- package/dist/lib/esm/obsidian/link.d.mts +84 -20
- package/dist/lib/esm/obsidian/link.mjs +266 -122
- package/dist/lib/esm/obsidian/logger.d.mts +26 -5
- package/dist/lib/esm/obsidian/logger.mjs +48 -22
- package/dist/lib/esm/obsidian/loop.d.mts +5 -0
- package/dist/lib/esm/obsidian/loop.mjs +14 -4
- package/dist/lib/esm/obsidian/markdown-code-block-processor.mjs +155 -107
- package/dist/lib/esm/obsidian/markdown.d.mts +76 -16
- package/dist/lib/esm/obsidian/markdown.mjs +40 -11
- package/dist/lib/esm/obsidian/metadata-cache.d.mts +76 -16
- package/dist/lib/esm/obsidian/metadata-cache.mjs +28 -14
- package/dist/lib/esm/obsidian/path-settings.mjs +5 -2
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.d.mts +4 -0
- package/dist/lib/esm/obsidian/plugin/plugin-event-source.mjs +5 -1
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.d.mts +39 -8
- package/dist/lib/esm/obsidian/plugin/plugin-settings-tab.mjs +15 -7
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +4 -4
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +5 -7
- package/dist/lib/esm/obsidian/queue.mjs +9 -7
- package/dist/lib/esm/obsidian/resource-url.d.mts +19 -4
- package/dist/lib/esm/obsidian/resource-url.mjs +7 -2
- package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +6 -2
- package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +4 -2
- package/dist/lib/esm/obsidian/vault-delete.d.mts +11 -6
- package/dist/lib/esm/obsidian/vault-delete.mjs +19 -15
- package/dist/lib/esm/obsidian/vault.d.mts +178 -41
- package/dist/lib/esm/obsidian/vault.mjs +116 -59
- package/dist/lib/esm/path.d.mts +15 -3
- package/dist/lib/esm/path.mjs +12 -5
- package/dist/lib/esm/reg-exp.mjs +101 -78
- package/dist/lib/esm/script-utils/build.mjs +9 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/change-extension-plugin.mjs +34 -14
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.d.mts +23 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/copy-to-obsidian-plugins-folder-plugin.mjs +20 -5
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/dependency.mjs +11 -4
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-esm-plugin.mjs +6 -2
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.d.mts +19 -4
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/fix-source-maps-plugin.mjs +31 -12
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/obsidian-plugin-builder.mjs +7 -7
- package/dist/lib/esm/script-utils/bundlers/esbuild-impl/preprocess-plugin.mjs +12 -3
- package/dist/lib/esm/script-utils/cli-utils.mjs +6 -2
- package/dist/lib/esm/script-utils/exec.mjs +47 -12
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -3
- package/dist/lib/esm/script-utils/json.d.mts +38 -8
- package/dist/lib/esm/script-utils/json.mjs +9 -5
- package/dist/lib/esm/script-utils/linters/eslint-rules/no-unused-params-members.mjs +8 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-component-suffix.mjs +27 -7
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-method-template.mjs +7 -3
- package/dist/lib/esm/script-utils/linters/eslint-rules/require-super-call.mjs +8 -3
- package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +72 -30
- package/dist/lib/esm/script-utils/npm-publish.mjs +2 -2
- package/dist/lib/esm/script-utils/npm.mjs +18 -9
- package/dist/lib/esm/script-utils/root.d.mts +45 -9
- package/dist/lib/esm/script-utils/root.mjs +20 -5
- package/dist/lib/esm/script-utils/validate-declarations.mjs +4 -3
- package/dist/lib/esm/script-utils/version.mjs +36 -19
- package/dist/lib/esm/strict-proxy.mjs +10 -1
- package/dist/lib/esm/string.d.mts +188 -40
- package/dist/lib/esm/string.mjs +63 -22
- package/dist/styles.css +5 -1
- package/package.json +9 -9
|
@@ -170,7 +170,12 @@ function analyzeOverExposure(params) {
|
|
|
170
170
|
}
|
|
171
171
|
const { writeFile } = params;
|
|
172
172
|
(0, import_type_guards.assertNonNullable)(writeFile, "writeFile is required when shouldFix is true.");
|
|
173
|
-
return applyOverExposureFixes(
|
|
173
|
+
return applyOverExposureFixes({
|
|
174
|
+
program: params.languageService.getProgram(),
|
|
175
|
+
result,
|
|
176
|
+
shouldForce: params.shouldForce ?? false,
|
|
177
|
+
writeFile
|
|
178
|
+
});
|
|
174
179
|
}
|
|
175
180
|
function createLanguageServiceHost(params) {
|
|
176
181
|
const { compilerOptions, fileNames, fileSystem } = params;
|
|
@@ -239,7 +244,13 @@ function analyzeExport(node, context) {
|
|
|
239
244
|
const otherFileReferences = references.filter((reference) => (0, import_check_project_types.toCanonical)(reference.fileName) !== declFilePath);
|
|
240
245
|
if (otherFileReferences.length === 0) {
|
|
241
246
|
candidates.push({
|
|
242
|
-
finding: buildFinding(
|
|
247
|
+
finding: buildFinding({
|
|
248
|
+
currentExposure: "export",
|
|
249
|
+
flags: { hasNoReferences: references.length === 0, isForcedByTestOnly: false },
|
|
250
|
+
nameNode,
|
|
251
|
+
node: declaration,
|
|
252
|
+
suggestedExposure: "file-local"
|
|
253
|
+
}),
|
|
243
254
|
isPlainFileLocal: true
|
|
244
255
|
});
|
|
245
256
|
continue;
|
|
@@ -247,7 +258,13 @@ function analyzeExport(node, context) {
|
|
|
247
258
|
const nonTestReferences = otherFileReferences.filter((reference) => !isTestFile((0, import_check_project_types.toCanonical)(reference.fileName)));
|
|
248
259
|
if (nonTestReferences.length === 0) {
|
|
249
260
|
candidates.push({
|
|
250
|
-
finding: buildFinding(
|
|
261
|
+
finding: buildFinding({
|
|
262
|
+
currentExposure: "export",
|
|
263
|
+
flags: { hasNoReferences: false, isForcedByTestOnly: true },
|
|
264
|
+
nameNode,
|
|
265
|
+
node: declaration,
|
|
266
|
+
suggestedExposure: "file-local"
|
|
267
|
+
}),
|
|
251
268
|
isPlainFileLocal: false
|
|
252
269
|
});
|
|
253
270
|
}
|
|
@@ -258,7 +275,11 @@ function analyzeExport(node, context) {
|
|
|
258
275
|
const canDropExport = candidates.length === nameNodes.length && candidates.every((candidate) => candidate.isPlainFileLocal || context.shouldForce);
|
|
259
276
|
const exportEdit = canDropExport ? computeExportRemovalEdit(declaration) : null;
|
|
260
277
|
for (const candidate of candidates) {
|
|
261
|
-
record(
|
|
278
|
+
record({
|
|
279
|
+
context,
|
|
280
|
+
edit: exportEdit,
|
|
281
|
+
finding: candidate.finding
|
|
282
|
+
});
|
|
262
283
|
}
|
|
263
284
|
}
|
|
264
285
|
function analyzeMember(node, context) {
|
|
@@ -284,21 +305,31 @@ function analyzeMember(node, context) {
|
|
|
284
305
|
}
|
|
285
306
|
const sourceFile = member.getSourceFile();
|
|
286
307
|
const directReferences = collectReferences(context.languageService.findReferences(sourceFile.fileName, nameNode.getStart())).filter((reference) => !isDeclarationItself(reference, nameNode));
|
|
287
|
-
const references = [...directReferences, ...collectStringLiteralReferences(
|
|
308
|
+
const references = [...directReferences, ...collectStringLiteralReferences({ context, declaringClass, nameNode })];
|
|
288
309
|
const nonTestReferences = references.filter((reference) => !isTestFile((0, import_check_project_types.toCanonical)(reference.fileName)));
|
|
289
|
-
const neededForSrc = computeNeededExposure(
|
|
290
|
-
const neededWithTests = computeNeededExposure(
|
|
310
|
+
const neededForSrc = computeNeededExposure({ context, declaringClass, references: nonTestReferences });
|
|
311
|
+
const neededWithTests = computeNeededExposure({ context, declaringClass, references });
|
|
291
312
|
if (neededForSrc === "public") {
|
|
292
313
|
return;
|
|
293
314
|
}
|
|
294
315
|
if (rankExposure(neededForSrc) >= rankExposure(currentExposure)) {
|
|
295
316
|
return;
|
|
296
317
|
}
|
|
297
|
-
const finding = buildFinding(
|
|
298
|
-
|
|
299
|
-
|
|
318
|
+
const finding = buildFinding({
|
|
319
|
+
currentExposure,
|
|
320
|
+
flags: {
|
|
321
|
+
hasNoReferences: references.length === 0,
|
|
322
|
+
isForcedByTestOnly: rankExposure(neededWithTests) > rankExposure(neededForSrc)
|
|
323
|
+
},
|
|
324
|
+
nameNode,
|
|
325
|
+
node: member,
|
|
326
|
+
suggestedExposure: neededForSrc
|
|
327
|
+
});
|
|
328
|
+
record({
|
|
329
|
+
context,
|
|
330
|
+
edit: computeMemberExposureEdit(member, neededForSrc),
|
|
331
|
+
finding
|
|
300
332
|
});
|
|
301
|
-
record(context, finding, computeMemberExposureEdit(member, neededForSrc));
|
|
302
333
|
}
|
|
303
334
|
function applyEdits(text, edits) {
|
|
304
335
|
const seen = /* @__PURE__ */ new Set();
|
|
@@ -316,11 +347,12 @@ function applyEdits(text, edits) {
|
|
|
316
347
|
}
|
|
317
348
|
return result;
|
|
318
349
|
}
|
|
319
|
-
function applyOverExposureFixes(
|
|
350
|
+
function applyOverExposureFixes(params) {
|
|
351
|
+
const { program, result, shouldForce, writeFile } = params;
|
|
320
352
|
const editsByFile = /* @__PURE__ */ new Map();
|
|
321
353
|
const findings = result.findings.map((finding, index) => {
|
|
322
354
|
const edit = result.edits[index] ?? null;
|
|
323
|
-
const skipReason = determineSkipReason(
|
|
355
|
+
const skipReason = determineSkipReason({ edit, finding, shouldForce });
|
|
324
356
|
if (skipReason !== null) {
|
|
325
357
|
return { ...finding, skipReason, wasFixed: false };
|
|
326
358
|
}
|
|
@@ -356,7 +388,8 @@ function asExportableDeclaration(node) {
|
|
|
356
388
|
}
|
|
357
389
|
return void 0;
|
|
358
390
|
}
|
|
359
|
-
function buildFinding(
|
|
391
|
+
function buildFinding(params) {
|
|
392
|
+
const { currentExposure, flags, nameNode, node, suggestedExposure } = params;
|
|
360
393
|
const sourceFile = node.getSourceFile();
|
|
361
394
|
const { character, line } = sourceFile.getLineAndCharacterOfPosition(nameNode.getStart());
|
|
362
395
|
return {
|
|
@@ -400,7 +433,8 @@ function collectReferences(referencedSymbols) {
|
|
|
400
433
|
}
|
|
401
434
|
return references;
|
|
402
435
|
}
|
|
403
|
-
function collectStringLiteralReferences(
|
|
436
|
+
function collectStringLiteralReferences(params) {
|
|
437
|
+
const { context, declaringClass, nameNode } = params;
|
|
404
438
|
const occurrences = context.stringLiteralOccurrencesByText.get(nameNode.getText());
|
|
405
439
|
if (!occurrences || occurrences.length === 0) {
|
|
406
440
|
return [];
|
|
@@ -408,7 +442,7 @@ function collectStringLiteralReferences(nameNode, declaringClass, context) {
|
|
|
408
442
|
const keySet = getClassKeySet(declaringClass, context.checker);
|
|
409
443
|
const references = [];
|
|
410
444
|
for (const occurrence of occurrences) {
|
|
411
|
-
if (isKeyReferenceToClass(
|
|
445
|
+
if (isKeyReferenceToClass({ checker: context.checker, keySet, node: occurrence.node })) {
|
|
412
446
|
references.push({ fileName: occurrence.sourceFile.fileName, start: occurrence.node.getStart() });
|
|
413
447
|
}
|
|
414
448
|
}
|
|
@@ -457,17 +491,18 @@ function computeMemberExposureEdit(member, suggestedExposure) {
|
|
|
457
491
|
start: insertStart
|
|
458
492
|
};
|
|
459
493
|
}
|
|
460
|
-
function computeNeededExposure(
|
|
494
|
+
function computeNeededExposure(params) {
|
|
495
|
+
const { context, declaringClass, references } = params;
|
|
461
496
|
if (references.length === 0) {
|
|
462
497
|
return "private";
|
|
463
498
|
}
|
|
464
499
|
let needed = "private";
|
|
465
500
|
for (const reference of references) {
|
|
466
|
-
const referenceClass = getClassAtPosition(
|
|
501
|
+
const referenceClass = getClassAtPosition({ fileName: reference.fileName, position: reference.start, program: context.program });
|
|
467
502
|
if (referenceClass === declaringClass) {
|
|
468
503
|
continue;
|
|
469
504
|
}
|
|
470
|
-
if (referenceClass && isDerivedFrom(
|
|
505
|
+
if (referenceClass && isDerivedFrom({ base: declaringClass, checker: context.checker, derived: referenceClass })) {
|
|
471
506
|
needed = "protected";
|
|
472
507
|
continue;
|
|
473
508
|
}
|
|
@@ -494,7 +529,8 @@ function describeReason(finding) {
|
|
|
494
529
|
}
|
|
495
530
|
return base;
|
|
496
531
|
}
|
|
497
|
-
function determineSkipReason(
|
|
532
|
+
function determineSkipReason(params) {
|
|
533
|
+
const { edit, finding, shouldForce } = params;
|
|
498
534
|
if (finding.isForcedByTestOnly && !shouldForce) {
|
|
499
535
|
return "test-only";
|
|
500
536
|
}
|
|
@@ -527,7 +563,7 @@ function formatFindingBlocks(findings, baseFolder) {
|
|
|
527
563
|
for (const [filePath, list] of byFile) {
|
|
528
564
|
const sorted = [...list].sort((a, b) => a.line - b.line);
|
|
529
565
|
const locationWidth = Math.max(...sorted.map((finding) => `${String(finding.line)}:${String(finding.column)}`.length));
|
|
530
|
-
lines.push(toDisplayPath(
|
|
566
|
+
lines.push(toDisplayPath({ baseFolder, filePath }));
|
|
531
567
|
for (const finding of sorted) {
|
|
532
568
|
const location = `${String(finding.line)}:${String(finding.column)}`.padEnd(locationWidth);
|
|
533
569
|
const change = `${finding.currentExposure} ${finding.name} -> ${finding.suggestedExposure}`;
|
|
@@ -546,7 +582,8 @@ function formatSummary(findings) {
|
|
|
546
582
|
}
|
|
547
583
|
return `${summary} ${String(fixedCount)} fixed, ${String(skippedCount)} skipped.`;
|
|
548
584
|
}
|
|
549
|
-
function getClassAtPosition(
|
|
585
|
+
function getClassAtPosition(params) {
|
|
586
|
+
const { fileName, position, program } = params;
|
|
550
587
|
const sourceFile = program.getSourceFile(fileName);
|
|
551
588
|
(0, import_type_guards.assertNonNullable)(sourceFile, `Source file not found in program: ${fileName}`);
|
|
552
589
|
const node = findNodeAtPosition(sourceFile, position);
|
|
@@ -619,7 +656,8 @@ function hasTsDocComment(node) {
|
|
|
619
656
|
function isDeclarationItself(reference, nameNode) {
|
|
620
657
|
return (0, import_check_project_types.toCanonical)(reference.fileName) === (0, import_check_project_types.toCanonical)(nameNode.getSourceFile().fileName) && reference.start === nameNode.getStart();
|
|
621
658
|
}
|
|
622
|
-
function isDerivedFrom(
|
|
659
|
+
function isDerivedFrom(params) {
|
|
660
|
+
const { base, checker, derived } = params;
|
|
623
661
|
const baseSymbol = base.name ? checker.getSymbolAtLocation(base.name) : void 0;
|
|
624
662
|
if (!baseSymbol) {
|
|
625
663
|
return false;
|
|
@@ -634,7 +672,7 @@ function isDerivedFrom(derived, base, checker) {
|
|
|
634
672
|
return true;
|
|
635
673
|
}
|
|
636
674
|
for (const declaration of symbol?.declarations ?? []) {
|
|
637
|
-
if ((0, import_typescript.isClassLike)(declaration) && isDerivedFrom(
|
|
675
|
+
if ((0, import_typescript.isClassLike)(declaration) && isDerivedFrom({ base, checker, derived: declaration })) {
|
|
638
676
|
return true;
|
|
639
677
|
}
|
|
640
678
|
}
|
|
@@ -642,7 +680,8 @@ function isDerivedFrom(derived, base, checker) {
|
|
|
642
680
|
}
|
|
643
681
|
return false;
|
|
644
682
|
}
|
|
645
|
-
function isKeyReferenceToClass(
|
|
683
|
+
function isKeyReferenceToClass(params) {
|
|
684
|
+
const { checker, keySet, node } = params;
|
|
646
685
|
const contextualType = checker.getContextualType(node);
|
|
647
686
|
if (!contextualType) {
|
|
648
687
|
return false;
|
|
@@ -653,7 +692,8 @@ function isKeyReferenceToClass(node, keySet, checker) {
|
|
|
653
692
|
}
|
|
654
693
|
return literals.every((literal) => keySet.has(literal));
|
|
655
694
|
}
|
|
656
|
-
function isOwnSourceFile(
|
|
695
|
+
function isOwnSourceFile(params) {
|
|
696
|
+
const { filePath, srcFolder } = params;
|
|
657
697
|
return filePath.startsWith(`${srcFolder}/`) && filePath.endsWith(".ts") && !filePath.endsWith(".d.ts");
|
|
658
698
|
}
|
|
659
699
|
function isTestFile(filePath) {
|
|
@@ -662,7 +702,8 @@ function isTestFile(filePath) {
|
|
|
662
702
|
function rankExposure(exposure) {
|
|
663
703
|
return MEMBER_EXPOSURE_ORDER.indexOf(exposure);
|
|
664
704
|
}
|
|
665
|
-
function record(
|
|
705
|
+
function record(params) {
|
|
706
|
+
const { context, edit, finding } = params;
|
|
666
707
|
context.findings.push(finding);
|
|
667
708
|
context.edits.push(edit);
|
|
668
709
|
}
|
|
@@ -683,7 +724,7 @@ function runOverExposureAnalysis(params) {
|
|
|
683
724
|
};
|
|
684
725
|
const sourceFilesToAnalyze = program.getSourceFiles().filter((sourceFile) => {
|
|
685
726
|
const filePath = (0, import_check_project_types.toCanonical)(sourceFile.fileName);
|
|
686
|
-
return isOwnSourceFile(filePath, srcFolder) && !isTestFile(filePath);
|
|
727
|
+
return isOwnSourceFile({ filePath, srcFolder }) && !isTestFile(filePath);
|
|
687
728
|
});
|
|
688
729
|
for (const [analyzedFileCount, sourceFile] of sourceFilesToAnalyze.entries()) {
|
|
689
730
|
onProgress?.({
|
|
@@ -700,7 +741,8 @@ function runOverExposureAnalysis(params) {
|
|
|
700
741
|
node.forEachChild(visit);
|
|
701
742
|
}
|
|
702
743
|
}
|
|
703
|
-
function toDisplayPath(
|
|
744
|
+
function toDisplayPath(params) {
|
|
745
|
+
const { baseFolder, filePath } = params;
|
|
704
746
|
if (baseFolder !== void 0 && filePath.startsWith(`${baseFolder}/`)) {
|
|
705
747
|
return filePath.slice(baseFolder.length + 1);
|
|
706
748
|
}
|
|
@@ -715,4 +757,4 @@ function toDisplayPath(filePath, baseFolder) {
|
|
|
715
757
|
findOverExposure,
|
|
716
758
|
formatOverExposureFindings
|
|
717
759
|
});
|
|
718
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gQmVjYXVzZSBgZmluZFJlZmVyZW5jZXNgIGRvZXMgbm90IGxpbmsgYSBzdHJpbmctbGl0ZXJhbFxuICogYXJndW1lbnQgYmFjayB0byBhIG1lbWJlciBkZWNsYXJhdGlvbiB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb25kaXRpb25hbC9tYXBwZWQga2V5IHR5cGUgKGUuZy5cbiAqIGBiaW5kKGNvbXBvbmVudCwgJ3NvbWVTZXR0aW5nJylgIHdoZXJlIHRoZSBrZXkgaXMgdHlwZWQgYENvbmRpdGlvbmFsS2V5czxTZXR0aW5ncywgXHUyMDI2PmApLCBtZW1iZXJcbiAqIGFuYWx5c2lzIGFkZGl0aW9uYWxseSB0cmVhdHMgYSBzdHJpbmcgbGl0ZXJhbCB3aG9zZSB0ZXh0IGVxdWFscyB0aGUgbWVtYmVyIG5hbWUgYXMgYSByZWZlcmVuY2UgXHUyMDE0XG4gKiBidXQgb25seSB3aGVuIGl0cyBjb250ZXh0dWFsIHR5cGUgaXMgYSBzdHJpbmctbGl0ZXJhbCB0eXBlIChvciB1bmlvbiBvZiB0aGVtKSBhbGwgb2Ygd2hvc2UgbWVtYmVyc1xuICogYXJlIGtleXMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcywgc28gaW5jaWRlbnRhbCBzYW1lLW5hbWVkIHN0cmluZ3MgKGBjb25zb2xlLmxvZygnbmFtZScpYCkgYXJlIG5vdFxuICogbWlzY291bnRlZC4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFNvdXJjZUZpbGUsXG4gIFN0cmluZ0xpdGVyYWxMaWtlLFxuICBUeXBlLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzU3RyaW5nTGl0ZXJhbExpa2UsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKiogVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLiAqL1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgYmVmb3JlIHRoYXQgZmlsZSBpcyBwcm9jZXNzZWQuIFRoZVxuICAgKiB3aG9sZS1wcm9ncmFtIHJlZmVyZW5jZSBhbmFseXNpcyBpcyBzbG93LCBzbyB0aGlzIGxldHMgY2FsbGVycyByZXBvcnQgbGl2ZSBwcm9ncmVzcyBpbnN0ZWFkIG9mXG4gICAqIGFwcGVhcmluZyB0byBoYW5nLlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIHRpZ2h0ZW5lZCBpbiBwbGFjZSB2aWEge0BsaW5rIHdyaXRlRmlsZX0gKHdoaWNoIG11c3QgdGhlblxuICAgKiBiZSBwcm92aWRlZCksIGFuZCB0aGUgcmV0dXJuZWQgZmluZGluZ3MgY2Fycnkge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQgd2l0aCBhIGB0ZXN0LW9ubHlgXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhXG4gICAqIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgc3RheSBza2lwcGVkIHJlZ2FyZGxlc3MsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgd3JpdGVGaWxlPyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmaXhhYmxlIGZpbmRpbmdzIGFyZSB0aWdodGVuZWQgaW4gcGxhY2Ugb24gZGlzayAodGhlIGBleHBvcnRgIGtleXdvcmQgaXMgZHJvcHBlZCxcbiAgICogb3IgYSBgcHJpdmF0ZWAgLyBgcHJvdGVjdGVkYCBtb2RpZmllciBpcyBpbnNlcnRlZC9yZXBsYWNlZCkuIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGVcbiAgICogcHJvamVjdCBpcyBvbmx5IGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgZmlsZSBwYXRocyBpbiB0aGUgcmVwb3J0IGFyZSByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlciAodHlwaWNhbGx5IHRoZSBjdXJyZW50XG4gICAqIHdvcmtpbmcgZGlyZWN0b3J5KSBpbnN0ZWFkIG9mIGFzIGFic29sdXRlIHBhdGhzLiBQYXRocyBvdXRzaWRlIHRoZSBmb2xkZXIgc3RheSBhYnNvbHV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QgbmVlZHMuIEluamVjdGluZyB0aGlzIChyYXRoZXIgdGhhblxuICogYWx3YXlzIHVzaW5nIGB0eXBlc2NyaXB0YCdzIGBzeXNgKSBsZXRzIHRlc3RzIGRyaXZlIHRoZSBhbmFseXplciBhZ2FpbnN0IGluLW1lbW9yeSBzb3VyY2VzIHdpdGggbm9cbiAqIHJlYWwgZmlsZS1zeXN0ZW0gYWNjZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXJlY3RvcnlFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGV4aXN0cy5cbiAgICovXG4gIGZpbGVFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBjb250ZW50cywgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICByZWFkRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKiogMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLiAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKiAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKiBUaGUgZGVjbGFyZWQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiBhIGZpeCBydW4sIHdoeSB0aGlzIGZpbmRpbmcgd2FzIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgdGlnaHRlbmVkOyBgbnVsbGAgd2hlbiBpdCB3YXNcbiAgICogZml4ZWQgb3Igd2hlbiB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRlZCAoYHNob3VsZEZpeGAgb2ZmKS5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBSZWFzb246IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uO1xuXG4gIC8qKiBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiBhIGZpeCBydW4gdGlnaHRlbmVkIHRoaXMgZGVjbGFyYXRpb24gaW4gcGxhY2UuIEFsd2F5cyBgZmFsc2VgIGluIGEgcmVwb3J0IHJ1bi4gKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKiBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLiAqL1xuICByZWFkb25seSBhbmFseXplZEZpbGVDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBhYm91dCB0byBiZSBhbmFseXplZC4gKi9cbiAgcmVhZG9ubHkgY3VycmVudEZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAgXHUyMDE0IHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCBcdTIwMTQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIFx1MjAxNCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuICByZWFkb25seSBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZSB7XG4gIHJlYWRvbmx5IG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlO1xuICByZWFkb25seSBzb3VyY2VGaWxlOiBTb3VyY2VGaWxlO1xufVxuXG4vLyBBIEpTRG9jL1RTRG9jIGNvbW1lbnQgb3BlbnMgd2l0aCBgLyoqYDogdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMiBpcyB0aGUgc2Vjb25kIGAqYCwgYW5kIHRvIGV4Y2x1ZGUgdGhlIGVtcHR5IGAvKiovYCBjb21tZW50IHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0IDMgbXVzdCBub3QgYmUgdGhlIGNsb3NpbmcgYC9gLlxuY29uc3QgSlNET0NfU0VDT05EX0FTVEVSSVNLX09GRlNFVCA9IDI7XG5jb25zdCBKU0RPQ19GT1VSVEhfQ0hBUkFDVEVSX09GRlNFVCA9IDM7XG5jb25zdCBNRU1CRVJfRVhQT1NVUkVfT1JERVI6IHJlYWRvbmx5IE1lbWJlckV4cG9zdXJlW10gPSBbJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ3B1YmxpYyddO1xuY29uc3QgU0NPUEVfREVTQ1JJUFRJT046IFJlY29yZDxTdWdnZXN0ZWRFeHBvc3VyZSwgc3RyaW5nPiA9IHtcbiAgJ2ZpbGUtbG9jYWwnOiAnd2l0aGluIGl0cyBvd24gZmlsZScsXG4gICdwcml2YXRlJzogJ2luc2lkZSBpdHMgb3duIGNsYXNzJyxcbiAgJ3Byb3RlY3RlZCc6ICdpbnNpZGUgaXRzIGNsYXNzICsgc3ViY2xhc3Nlcydcbn07XG5jb25zdCBTS0lQX1JFQVNPTl9ERVNDUklQVElPTjogUmVjb3JkPE92ZXJFeHBvc3VyZVNraXBSZWFzb24sIHN0cmluZz4gPSB7XG4gICdkZWNvcmF0ZWQnOiAnZGVjb3JhdGVkIG1lbWJlcicsXG4gICdzaGFyZWQtZXhwb3J0JzogJ2V4cG9ydCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcnLFxuICAndGVzdC1vbmx5JzogJ2V4cG9zZWQgb25seSBmb3IgdGVzdHMnXG59O1xuY29uc3QgVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUzogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4gPSBuZXcgU2V0PFN5bnRheEtpbmQ+KFtTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkLCBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZF0pO1xuY29uc3QgV0hJVEVTUEFDRV9QQVRURVJOID0gL1xccy87XG5cbi8qKlxuICogQW5hbHl6ZXMgYSBwcm9qZWN0IChhbHJlYWR5IGxvYWRlZCBpbnRvIGEgbGFuZ3VhZ2Ugc2VydmljZSkgZm9yIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGFuZCBcdTIwMTRcbiAqIHdoZW4ge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQgXHUyMDE0IHRpZ2h0ZW5zIGV2ZXJ5IGZpeGFibGUgZmluZGluZyBpbiBwbGFjZVxuICogdmlhIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLndyaXRlRmlsZX0uIEZpbmRpbmdzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQgKGV4cG9zZWRcbiAqIG9ubHkgZm9yIHRlc3RzLCBkZWNvcmF0ZWQsIG9yIHNoYXJpbmcgYW4gYGV4cG9ydGAga2V5d29yZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZykgY2FycnkgYVxuICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0gYW5kIGFyZSBsZWZ0IHVudG91Y2hlZCBcdTIwMTQgdW5sZXNzXG4gKiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGb3JjZX0gaXMgc2V0LCB3aGljaCBhZGRpdGlvbmFsbHkgdGlnaHRlbnMgdGhlIHRlc3Qtb25seVxuICogZmluZGluZ3MgKGRlY29yYXRlZCBhbmQgc2hhcmVkLWV4cG9ydCBvbmVzIHN0aWxsIHN0YXkgc2tpcHBlZCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgaW4gZGlzY292ZXJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZU92ZXJFeHBvc3VyZShwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXMpO1xuICBpZiAoIXBhcmFtcy5zaG91bGRGaXgpIHtcbiAgICByZXR1cm4gWy4uLnJlc3VsdC5maW5kaW5nc107XG4gIH1cblxuICBjb25zdCB7IHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBhc3NlcnROb25OdWxsYWJsZSh3cml0ZUZpbGUsICd3cml0ZUZpbGUgaXMgcmVxdWlyZWQgd2hlbiBzaG91bGRGaXggaXMgdHJ1ZS4nKTtcbiAgcmV0dXJuIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMocmVzdWx0LCBwYXJhbXMubGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKSwgd3JpdGVGaWxlLCBwYXJhbXMuc2hvdWxkRm9yY2UgPz8gZmFsc2UpO1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suIFdoZW5cbiAqIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zLnNob3VsZEZpeH0gaXMgc2V0LCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyBhbHNvIHRpZ2h0ZW5lZCBpbiBwbGFjZVxuICogKHJld3JpdGluZyB0aGUgYWZmZWN0ZWQgc291cmNlIGZpbGVzIHZpYSBgdHlwZXNjcmlwdGAncyBgc3lzLndyaXRlRmlsZWApLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kT3ZlckV4cG9zdXJlKHBhcmFtczogRmluZE92ZXJFeHBvc3VyZVBhcmFtcyk6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSB7XG4gIGNvbnN0IHByb2plY3RGb2xkZXIgPSB0b0Nhbm9uaWNhbChwYXJhbXMucHJvamVjdEZvbGRlcik7XG4gIGNvbnN0IGxhbmd1YWdlU2VydmljZSA9IGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UoeyB0c0NvbmZpZ1BhdGg6IGAke3Byb2plY3RGb2xkZXJ9L3RzY29uZmlnLmpzb25gIH0pO1xuICByZXR1cm4gYW5hbHl6ZU92ZXJFeHBvc3VyZSh7XG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHNob3VsZEZpeDogcGFyYW1zLnNob3VsZEZpeCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlLFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgPyB7IG9uUHJvZ3Jlc3M6IHBhcmFtcy5vblByb2dyZXNzIH0gOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG92ZXItZXhwb3N1cmUgZmluZGluZ3MgYXMgYSBodW1hbi1yZWFkYWJsZSByZXBvcnQsIHVzaW5nIHRoZSBncm91cGVkIGxheW91dCBvZiBFU0xpbnQnc1xuICogYHN0eWxpc2hgIGZvcm1hdHRlci4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkIGJ5IGxpbmU6IGVhY2ggZmlsZSBpcyByZW5kZXJlZCBhcyBhXG4gKiBgcGF0aGAgaGVhZGVyIGxpbmUsIGZvbGxvd2VkIGJ5IG9uZSBpbmRlbnRlZCBgICBsaW5lOmNvbHVtbiAgY2hhbmdlIC0tIHJlYXNvbmAgcm93IHBlciBmaW5kaW5nICh0aGVcbiAqIGBsaW5lOmNvbHVtbmAgaXMgcmlnaHQtcGFkZGVkIHNvIHRoZSByb3dzIGFsaWduIHdpdGhpbiBhIGZpbGUpLiBUZXJtaW5hbHMgc3VjaCBhcyBWUyBDb2RlIHJlbmRlclxuICogZWFjaCBpbmRlbnRlZCBgbGluZTpjb2x1bW5gIGFzIGEgY2xpY2thYmxlIGxpbmsgXHUyMDE0IHJlc29sdmVkIGFnYWluc3QgdGhlIGZpbGUgaGVhZGVyIGFib3ZlIGl0IFx1MjAxNCB0aGF0XG4gKiBqdW1wcyBzdHJhaWdodCB0byB0aGUgZGVjbGFyYXRpb24uIEZpbGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLiBJbiBhIGZpeCBydW4gKGZpbmRpbmdzXG4gKiBjYXJyeWluZyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gLyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSkgZWFjaCBjaGFuZ2VcbiAqIHJvdyBpcyBzdWZmaXhlZCB3aXRoIGBbZml4ZWRdYCBvciBgW3NraXBwZWQ6IFx1MjAyNl1gLCBhbmQgdGhlIHRyYWlsaW5nIHN1bW1hcnkgYXBwZW5kcyB0aGUgZml4ZWQvc2tpcHBlZFxuICogY291bnRzLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBvcHRpb25zPzogRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYmFzZUZvbGRlciA9IG9wdGlvbnM/LmJhc2VGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvQ2Fub25pY2FsKG9wdGlvbnMuYmFzZUZvbGRlcik7XG4gIGNvbnN0IGxpbmVzID0gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5ncywgYmFzZUZvbGRlcik7XG4gIGxpbmVzLnB1c2goZm9ybWF0U3VtbWFyeShmaW5kaW5ncykpO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGUpO1xuICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGhhc1RzRG9jQ29tbWVudChkZWNsYXJhdGlvbikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbmFtZU5vZGVzID0gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb24pO1xuICBjb25zdCBjYW5kaWRhdGVzOiBFeHBvcnRGaW5kaW5nQ2FuZGlkYXRlW10gPSBbXTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBuYW1lTm9kZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgICBjb25zdCBvdGhlckZpbGVSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSAhPT0gZGVjbEZpbGVQYXRoKTtcblxuICAgIGlmIChvdGhlckZpbGVSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY2FuZGlkYXRlcy5wdXNoKHtcbiAgICAgICAgZmluZGluZzogYnVpbGRGaW5kaW5nKGRlY2xhcmF0aW9uLCBuYW1lTm9kZSwgJ2V4cG9ydCcsICdmaWxlLWxvY2FsJywgeyBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZhbHNlIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gb3RoZXJGaWxlUmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuICAgIGlmIChub25UZXN0UmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyhkZWNsYXJhdGlvbiwgbmFtZU5vZGUsICdleHBvcnQnLCAnZmlsZS1sb2NhbCcsIHsgaGFzTm9SZWZlcmVuY2VzOiBmYWxzZSwgaXNGb3JjZWRCeVRlc3RPbmx5OiB0cnVlIH0pLFxuICAgICAgICBpc1BsYWluRmlsZUxvY2FsOiBmYWxzZVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY2FuRHJvcEV4cG9ydCA9IGNhbmRpZGF0ZXMubGVuZ3RoID09PSBuYW1lTm9kZXMubGVuZ3RoICYmIGNhbmRpZGF0ZXMuZXZlcnkoKGNhbmRpZGF0ZSkgPT4gY2FuZGlkYXRlLmlzUGxhaW5GaWxlTG9jYWwgfHwgY29udGV4dC5zaG91bGRGb3JjZSk7XG4gIGNvbnN0IGV4cG9ydEVkaXQgPSBjYW5Ecm9wRXhwb3J0ID8gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uKSA6IG51bGw7XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICByZWNvcmQoY29udGV4dCwgY2FuZGlkYXRlLmZpbmRpbmcsIGV4cG9ydEVkaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVNZW1iZXIobm9kZTogTm9kZSwgY29udGV4dDogQW5hbHlzaXNDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IG1lbWJlciA9IGFzQ2xhc3NNZW1iZXIobm9kZSk7XG4gIGlmICghbWVtYmVyIHx8ICFpc0NsYXNzTGlrZShub2RlLnBhcmVudCkpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgbmFtZU5vZGUgPSBtZW1iZXIubmFtZTtcbiAgY29uc3QgZGVjbGFyaW5nQ2xhc3MgPSBub2RlLnBhcmVudDtcblxuICBpZiAoaXNQcml2YXRlSWRlbnRpZmllcihuYW1lTm9kZSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RpZmllcktpbmRzID0gZ2V0TW9kaWZpZXJLaW5kcyhtZW1iZXIpO1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSB8fCBtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLk92ZXJyaWRlS2V5d29yZCkgfHwgTElGRUNZQ0xFX0FMTE9XTElTVC5oYXMobmFtZU5vZGUuZ2V0VGV4dCgpKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoYXNUc0RvY0NvbW1lbnQobWVtYmVyKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGN1cnJlbnRFeHBvc3VyZSA9IGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzKTtcbiAgaWYgKGN1cnJlbnRFeHBvc3VyZSA9PT0gJ3ByaXZhdGUnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGRpcmVjdFJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc0RlY2xhcmF0aW9uSXRzZWxmKHJlZmVyZW5jZSwgbmFtZU5vZGUpKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IFsuLi5kaXJlY3RSZWZlcmVuY2VzLCAuLi5jb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMobmFtZU5vZGUsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KV07XG4gIGNvbnN0IG5vblRlc3RSZWZlcmVuY2VzID0gcmVmZXJlbmNlcy5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzVGVzdEZpbGUodG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSkpO1xuXG4gIGNvbnN0IG5lZWRlZEZvclNyYyA9IGNvbXB1dGVOZWVkZWRFeHBvc3VyZShub25UZXN0UmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuICBjb25zdCBuZWVkZWRXaXRoVGVzdHMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUocmVmZXJlbmNlcywgZGVjbGFyaW5nQ2xhc3MsIGNvbnRleHQpO1xuXG4gIGlmIChuZWVkZWRGb3JTcmMgPT09ICdwdWJsaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpID49IHJhbmtFeHBvc3VyZShjdXJyZW50RXhwb3N1cmUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZmluZGluZyA9IGJ1aWxkRmluZGluZyhtZW1iZXIsIG5hbWVOb2RlLCBjdXJyZW50RXhwb3N1cmUsIG5lZWRlZEZvclNyYywge1xuICAgIGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsXG4gICAgaXNGb3JjZWRCeVRlc3RPbmx5OiByYW5rRXhwb3N1cmUobmVlZGVkV2l0aFRlc3RzKSA+IHJhbmtFeHBvc3VyZShuZWVkZWRGb3JTcmMpXG4gIH0pO1xuICByZWNvcmQoY29udGV4dCwgZmluZGluZywgY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXIsIG5lZWRlZEZvclNyYykpO1xufVxuXG5mdW5jdGlvbiBhcHBseUVkaXRzKHRleHQ6IHN0cmluZywgZWRpdHM6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZVRleHRFZGl0W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZUVkaXRzID0gZWRpdHNcbiAgICAuZmlsdGVyKChlZGl0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtTdHJpbmcoZWRpdC5zdGFydCl9OiR7U3RyaW5nKGVkaXQubGVuZ3RoKX06JHtlZGl0Lm5ld1RleHR9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG5cbiAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gIGZvciAoY29uc3QgZWRpdCBvZiB1bmlxdWVFZGl0cykge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBlZGl0LnN0YXJ0KX0ke2VkaXQubmV3VGV4dH0ke3Jlc3VsdC5zbGljZShlZGl0LnN0YXJ0ICsgZWRpdC5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhcbiAgcmVzdWx0OiBBbmFseXNpc1Jlc3VsdCxcbiAgcHJvZ3JhbTogUHJvZ3JhbSB8IHVuZGVmaW5lZCxcbiAgd3JpdGVGaWxlOiAodGhpczogdm9pZCwgcGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpID0+IHZvaWQsXG4gIHNob3VsZEZvcmNlOiBib29sZWFuXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbihmaW5kaW5nLCBlZGl0LCBzaG91bGRGb3JjZSk7XG4gICAgaWYgKHNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb24sIHdhc0ZpeGVkOiBmYWxzZSB9O1xuICAgIH1cbiAgICBhc3NlcnROb25OdWxsYWJsZShlZGl0LCAnQSBmaXhhYmxlIGZpbmRpbmcgbXVzdCBjYXJyeSBhIHRleHQgZWRpdC4nKTtcbiAgICBjb25zdCBmaWxlRWRpdHMgPSBlZGl0c0J5RmlsZS5nZXQoZWRpdC5maWxlTmFtZSkgPz8gW107XG4gICAgZmlsZUVkaXRzLnB1c2goZWRpdCk7XG4gICAgZWRpdHNCeUZpbGUuc2V0KGVkaXQuZmlsZU5hbWUsIGZpbGVFZGl0cyk7XG4gICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbjogbnVsbCwgd2FzRml4ZWQ6IHRydWUgfTtcbiAgfSk7XG5cbiAgaWYgKGVkaXRzQnlGaWxlLnNpemUgPiAwKSB7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUocHJvZ3JhbSwgJ0EgcHJvZ3JhbSBpcyBleHBlY3RlZCB3aGVuIHRoZXJlIGFyZSBlZGl0cyB0byBhcHBseS4nKTtcbiAgICBjb25zdCBzb3VyY2VUZXh0QnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZUZpbGVUZXh0PigpO1xuICAgIGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkpIHtcbiAgICAgIHNvdXJjZVRleHRCeUZpbGUuc2V0KHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLCB7IGZpbGVOYW1lOiBzb3VyY2VGaWxlLmZpbGVOYW1lLCB0ZXh0OiBzb3VyY2VGaWxlLnRleHQgfSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2Nhbm9uaWNhbEZpbGVOYW1lLCBmaWxlRWRpdHNdIG9mIGVkaXRzQnlGaWxlKSB7XG4gICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VUZXh0QnlGaWxlLmdldChjYW5vbmljYWxGaWxlTmFtZSk7XG4gICAgICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2UsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtjYW5vbmljYWxGaWxlTmFtZX1gKTtcbiAgICAgIHdyaXRlRmlsZShzb3VyY2UuZmlsZU5hbWUsIGFwcGx5RWRpdHMoc291cmNlLnRleHQsIGZpbGVFZGl0cykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmaW5kaW5ncztcbn1cblxuZnVuY3Rpb24gYXNDbGFzc01lbWJlcihub2RlOiBOb2RlKTogQ2xhc3NNZW1iZXJEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChpc01ldGhvZERlY2xhcmF0aW9uKG5vZGUpIHx8IGlzUHJvcGVydHlEZWNsYXJhdGlvbihub2RlKSB8fCBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkgfHwgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYXNFeHBvcnRhYmxlRGVjbGFyYXRpb24obm9kZTogTm9kZSk6IEV4cG9ydGFibGVEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGlmIChcbiAgICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0ludGVyZmFjZURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNWYXJpYWJsZVN0YXRlbWVudChub2RlKVxuICApIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBidWlsZEZpbmRpbmcoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWVOb2RlOiBOb2RlLFxuICBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZSxcbiAgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlLFxuICBmbGFnczogRmluZGluZ0ZsYWdzXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCB7IGNoYXJhY3RlciwgbGluZSB9ID0gc291cmNlRmlsZS5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihuYW1lTm9kZS5nZXRTdGFydCgpKTtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IGNoYXJhY3RlciArIDEsXG4gICAgY3VycmVudEV4cG9zdXJlLFxuICAgIGZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBoYXNOb1JlZmVyZW5jZXM6IGZsYWdzLmhhc05vUmVmZXJlbmNlcyxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZsYWdzLmlzRm9yY2VkQnlUZXN0T25seSxcbiAgICBpc01lbWJlcjogY3VycmVudEV4cG9zdXJlICE9PSAnZXhwb3J0JyxcbiAgICBsaW5lOiBsaW5lICsgMSxcbiAgICBuYW1lOiBuYW1lTm9kZS5nZXRUZXh0KCksXG4gICAgc2tpcFJlYXNvbjogbnVsbCxcbiAgICBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICB3YXNGaXhlZDogZmFsc2VcbiAgfTtcbn1cblxuZnVuY3Rpb24gYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbTogUHJvZ3JhbSk6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT4ge1xuICBjb25zdCBpbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBTdHJpbmdMaXRlcmFsT2NjdXJyZW5jZVtdPigpO1xuICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgaWYgKHNvdXJjZUZpbGUuaXNEZWNsYXJhdGlvbkZpbGUpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBjb2xsZWN0SW5Ob2RlKHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiBpbmRleDtcblxuICBmdW5jdGlvbiBjb2xsZWN0SW5Ob2RlKG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBpZiAoaXNTdHJpbmdMaXRlcmFsTGlrZShub2RlKSkge1xuICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSBpbmRleC5nZXQobm9kZS50ZXh0KSA/PyBbXTtcbiAgICAgIG9jY3VycmVuY2VzLnB1c2goeyBub2RlLCBzb3VyY2VGaWxlOiBub2RlLmdldFNvdXJjZUZpbGUoKSB9KTtcbiAgICAgIGluZGV4LnNldChub2RlLnRleHQsIG9jY3VycmVuY2VzKTtcbiAgICB9XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQoY29sbGVjdEluTm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZXMocmVmZXJlbmNlZFN5bWJvbHM6IFJlZmVyZW5jZWRTeW1ib2xbXSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZUxvY2F0aW9uW10ge1xuICBjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VMb2NhdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFN5bWJvbCBvZiByZWZlcmVuY2VkU3ltYm9scyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWRTeW1ib2wucmVmZXJlbmNlcykge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IHJlZmVyZW5jZS5maWxlTmFtZSwgc3RhcnQ6IHJlZmVyZW5jZS50ZXh0U3Bhbi5zdGFydCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlcyhuYW1lTm9kZTogTm9kZSwgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZXh0LnN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dC5nZXQobmFtZU5vZGUuZ2V0VGV4dCgpKTtcbiAgaWYgKCFvY2N1cnJlbmNlcyB8fCBvY2N1cnJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBrZXlTZXQgPSBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKTtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9jY3VycmVuY2Ugb2Ygb2NjdXJyZW5jZXMpIHtcbiAgICBpZiAoaXNLZXlSZWZlcmVuY2VUb0NsYXNzKG9jY3VycmVuY2Uubm9kZSwga2V5U2V0LCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogb2NjdXJyZW5jZS5zb3VyY2VGaWxlLmZpbGVOYW1lLCBzdGFydDogb2NjdXJyZW5jZS5ub2RlLmdldFN0YXJ0KCkgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IGRlY2xhcmF0aW9uLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKGRlY2xhcmF0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobW9kaWZpZXJzLCAnTW9kaWZpZXJzIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCBleHBvcnRNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5FeHBvcnRLZXl3b3JkKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoZXhwb3J0TW9kaWZpZXIsICdFeHBvcnQgbW9kaWZpZXIgZXhwZWN0ZWQgb24gYW4gZXhwb3J0ZWQgZGVjbGFyYXRpb24uJyk7XG4gIGNvbnN0IHsgdGV4dCB9ID0gc291cmNlRmlsZTtcbiAgbGV0IGVuZCA9IGV4cG9ydE1vZGlmaWVyLmdldEVuZCgpO1xuICB3aGlsZSAoZW5kIDwgdGV4dC5sZW5ndGggJiYgV0hJVEVTUEFDRV9QQVRURVJOLnRlc3QodGV4dC5jaGFyQXQoZW5kKSkpIHtcbiAgICBlbmQrKztcbiAgfVxuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBsZW5ndGg6IGVuZCAtIGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgbmV3VGV4dDogJycsXG4gICAgc3RhcnQ6IGV4cG9ydE1vZGlmaWVyLmdldFN0YXJ0KClcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU1lbWJlckV4cG9zdXJlRWRpdChtZW1iZXI6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24sIHN1Z2dlc3RlZEV4cG9zdXJlOiAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyk6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGlmICgoZ2V0RGVjb3JhdG9ycyhtZW1iZXIpID8/IFtdKS5sZW5ndGggPiAwKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZmlsZU5hbWUgPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgY29uc3QgbW9kaWZpZXJzID0gZ2V0TW9kaWZpZXJzKG1lbWJlcikgPz8gW107XG4gIGNvbnN0IHZpc2liaWxpdHlNb2RpZmllciA9IG1vZGlmaWVycy5maW5kKChtb2RpZmllcikgPT4gVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUy5oYXMobW9kaWZpZXIua2luZCkpO1xuICBpZiAodmlzaWJpbGl0eU1vZGlmaWVyKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVOYW1lLFxuICAgICAgbGVuZ3RoOiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0RW5kKCkgLSB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKSxcbiAgICAgIG5ld1RleHQ6IHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgICAgc3RhcnQ6IHZpc2liaWxpdHlNb2RpZmllci5nZXRTdGFydCgpXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGZpcnN0TW9kaWZpZXIgPSBtb2RpZmllcnNbMF07XG4gIGNvbnN0IGluc2VydFN0YXJ0ID0gZmlyc3RNb2RpZmllciA/IGZpcnN0TW9kaWZpZXIuZ2V0U3RhcnQoKSA6IG1lbWJlci5nZXRTdGFydCgpO1xuICByZXR1cm4ge1xuICAgIGZpbGVOYW1lLFxuICAgIGxlbmd0aDogMCxcbiAgICBuZXdUZXh0OiBgJHtzdWdnZXN0ZWRFeHBvc3VyZX0gYCxcbiAgICBzdGFydDogaW5zZXJ0U3RhcnRcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKFxuICByZWZlcmVuY2VzOiByZWFkb25seSBSZWZlcmVuY2VMb2NhdGlvbltdLFxuICBkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dFxuKTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbihjb250ZXh0LnByb2dyYW0sIHJlZmVyZW5jZS5maWxlTmFtZSwgcmVmZXJlbmNlLnN0YXJ0KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20ocmVmZXJlbmNlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0LmNoZWNrZXIpKSB7XG4gICAgICBuZWVkZWQgPSAncHJvdGVjdGVkJztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICByZXR1cm4gJ3B1YmxpYyc7XG4gIH1cbiAgcmV0dXJuIG5lZWRlZDtcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGlmIChmaW5kaW5nLndhc0ZpeGVkKSB7XG4gICAgcmV0dXJuICcgW2ZpeGVkXSc7XG4gIH1cbiAgaWYgKGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgIHJldHVybiBgIFtza2lwcGVkOiAke1NLSVBfUkVBU09OX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc2tpcFJlYXNvbl19XWA7XG4gIH1cbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBkZXNjcmliZVJlYXNvbihmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgYmFzZSA9IGByZWZlcmVuY2VkIG9ubHkgJHtTQ09QRV9ERVNDUklQVElPTltmaW5kaW5nLnN1Z2dlc3RlZEV4cG9zdXJlXX1gO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKGV4cG9zZWQgb25seSBmb3IgdGVzdHMpYDtcbiAgfVxuICBpZiAoZmluZGluZy5oYXNOb1JlZmVyZW5jZXMpIHtcbiAgICByZXR1cm4gYCR7YmFzZX0gKG5vIHJlZmVyZW5jZXMgYXQgYWxsKWA7XG4gIH1cbiAgcmV0dXJuIGJhc2U7XG59XG5cbmZ1bmN0aW9uIGRldGVybWluZVNraXBSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZywgZWRpdDogbnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0LCBzaG91bGRGb3JjZTogYm9vbGVhbik6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5ICYmICFzaG91bGRGb3JjZSkge1xuICAgIHJldHVybiAndGVzdC1vbmx5JztcbiAgfVxuICBpZiAoIWVkaXQpIHtcbiAgICByZXR1cm4gZmluZGluZy5pc01lbWJlciA/ICdkZWNvcmF0ZWQnIDogJ3NoYXJlZC1leHBvcnQnO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5mdW5jdGlvbiBmaW5kTm9kZUF0UG9zaXRpb24obm9kZTogTm9kZSwgcG9zaXRpb246IG51bWJlcik6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAocG9zaXRpb24gPCBub2RlLmdldFN0YXJ0KCkgfHwgcG9zaXRpb24gPj0gbm9kZS5nZXRFbmQoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgbGV0IHJlc3VsdDogTm9kZSA9IG5vZGU7XG4gIG5vZGUuZm9yRWFjaENoaWxkKChjaGlsZCkgPT4ge1xuICAgIGNvbnN0IGZvdW5kID0gZmluZE5vZGVBdFBvc2l0aW9uKGNoaWxkLCBwb3NpdGlvbik7XG4gICAgaWYgKGZvdW5kKSB7XG4gICAgICByZXN1bHQgPSBmb3VuZDtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBmb3JtYXRGaW5kaW5nQmxvY2tzKGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10sIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGNvbnN0IHNvcnRlZCA9IFsuLi5saXN0XS5zb3J0KChhLCBiKSA9PiBhLmxpbmUgLSBiLmxpbmUpO1xuICAgIGNvbnN0IGxvY2F0aW9uV2lkdGggPSBNYXRoLm1heCguLi5zb3J0ZWQubWFwKChmaW5kaW5nKSA9PiBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAubGVuZ3RoKSk7XG4gICAgbGluZXMucHVzaCh0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoLCBiYXNlRm9sZGVyKSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocHJvZ3JhbTogUHJvZ3JhbSwgZmlsZU5hbWU6IHN0cmluZywgcG9zaXRpb246IG51bWJlcik6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZShmaWxlTmFtZSk7XG4gIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZUZpbGUsIGBTb3VyY2UgZmlsZSBub3QgZm91bmQgaW4gcHJvZ3JhbTogJHtmaWxlTmFtZX1gKTtcbiAgY29uc3Qgbm9kZSA9IGZpbmROb2RlQXRQb3NpdGlvbihzb3VyY2VGaWxlLCBwb3NpdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG5vZGUsIGBObyBub2RlIGZvdW5kIGF0IHBvc2l0aW9uICR7U3RyaW5nKHBvc2l0aW9uKX0gaW4gJHtmaWxlTmFtZX1gKTtcbiAgcmV0dXJuIGdldEVuY2xvc2luZ0NsYXNzKG5vZGUpO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzczogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogUmVhZG9ubHlTZXQ8c3RyaW5nPiB7XG4gIGNvbnN0IGNsYXNzU3ltYm9sID0gZGVjbGFyaW5nQ2xhc3MubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihkZWNsYXJpbmdDbGFzcy5uYW1lKSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgY2xhc3NUeXBlID0gY2xhc3NTeW1ib2wgPyBjaGVja2VyLmdldERlY2xhcmVkVHlwZU9mU3ltYm9sKGNsYXNzU3ltYm9sKSA6IGNoZWNrZXIuZ2V0VHlwZUF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MpO1xuICByZXR1cm4gbmV3IFNldChjbGFzc1R5cGUuZ2V0UHJvcGVydGllcygpLm1hcCgocHJvcGVydHkpID0+IHByb3BlcnR5Lm5hbWUpKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+KTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcm90ZWN0ZWQnO1xuICB9XG4gIHJldHVybiAncHVibGljJztcbn1cblxuZnVuY3Rpb24gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZTogTm9kZSk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IE5vZGUgPSBub2RlO1xuICB3aGlsZSAoIWlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgIGlmIChpc0NsYXNzTGlrZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRlZE5hbWVOb2RlcyhkZWNsYXJhdGlvbjogRXhwb3J0YWJsZURlY2xhcmF0aW9uKTogTm9kZVtdIHtcbiAgaWYgKGlzVmFyaWFibGVTdGF0ZW1lbnQoZGVjbGFyYXRpb24pKSB7XG4gICAgcmV0dXJuIGRlY2xhcmF0aW9uLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMubWFwKCh2YXJpYWJsZURlY2xhcmF0aW9uKSA9PiB2YXJpYWJsZURlY2xhcmF0aW9uLm5hbWUpLmZpbHRlcihpc0lkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBkZWNsYXJhdGlvbi5uYW1lID8gW2RlY2xhcmF0aW9uLm5hbWVdIDogW107XG59XG5cbmZ1bmN0aW9uIGdldE1vZGlmaWVyS2luZHMobm9kZTogTm9kZSk6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+IHtcbiAgY29uc3Qga2luZHMgPSBuZXcgU2V0PFN5bnRheEtpbmQ+KCk7XG4gIGlmIChjYW5IYXZlTW9kaWZpZXJzKG5vZGUpKSB7XG4gICAgZm9yIChjb25zdCBtb2RpZmllciBvZiBnZXRNb2RpZmllcnMobm9kZSkgPz8gW10pIHtcbiAgICAgIGtpbmRzLmFkZChtb2RpZmllci5raW5kKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGtpbmRzO1xufVxuXG5mdW5jdGlvbiBnZXRTdHJpbmdMaXRlcmFsQ29uc3RpdHVlbnRzKHR5cGU6IFR5cGUpOiBudWxsIHwgc3RyaW5nW10ge1xuICBpZiAodHlwZS5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgIHJldHVybiBbdHlwZS52YWx1ZV07XG4gIH1cbiAgaWYgKHR5cGUuaXNVbmlvbigpKSB7XG4gICAgY29uc3QgbGl0ZXJhbHM6IHN0cmluZ1tdID0gW107XG4gICAgZm9yIChjb25zdCBjb25zdGl0dWVudCBvZiB0eXBlLnR5cGVzKSB7XG4gICAgICBpZiAoIWNvbnN0aXR1ZW50LmlzU3RyaW5nTGl0ZXJhbCgpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgbGl0ZXJhbHMucHVzaChjb25zdGl0dWVudC52YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBsaXRlcmFscztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaGFzVHNEb2NDb21tZW50KG5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBmdWxsVGV4dCA9IHNvdXJjZUZpbGUuZ2V0RnVsbFRleHQoKTtcbiAgY29uc3QgY29tbWVudFJhbmdlcyA9IGdldExlYWRpbmdDb21tZW50UmFuZ2VzKGZ1bGxUZXh0LCBub2RlLmdldEZ1bGxTdGFydCgpKSA/PyBbXTtcbiAgcmV0dXJuIGNvbW1lbnRSYW5nZXMuc29tZSgocmFuZ2UpID0+XG4gICAgcmFuZ2Uua2luZCA9PT0gU3ludGF4S2luZC5NdWx0aUxpbmVDb21tZW50VHJpdmlhXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX1NFQ09ORF9BU1RFUklTS19PRkZTRVQpID09PSAnKidcbiAgICAmJiBmdWxsVGV4dC5jaGFyQXQocmFuZ2UucG9zICsgSlNET0NfRk9VUlRIX0NIQVJBQ1RFUl9PRkZTRVQpICE9PSAnLydcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2U6IFJlZmVyZW5jZUxvY2F0aW9uLCBuYW1lTm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSA9PT0gdG9DYW5vbmljYWwobmFtZU5vZGUuZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lKSAmJiByZWZlcmVuY2Uuc3RhcnQgPT09IG5hbWVOb2RlLmdldFN0YXJ0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGVyaXZlZEZyb20oZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlU3ltYm9sID0gYmFzZS5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGJhc2UubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGlmICghYmFzZVN5bWJvbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2xhdXNlIG9mIGRlcml2ZWQuaGVyaXRhZ2VDbGF1c2VzID8/IFtdKSB7XG4gICAgaWYgKGNsYXVzZS50b2tlbiAhPT0gU3ludGF4S2luZC5FeHRlbmRzS2V5d29yZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZUV4cHJlc3Npb24gb2YgY2xhdXNlLnR5cGVzKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sPy5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGlzQ2xhc3NMaWtlKGRlY2xhcmF0aW9uKSAmJiBpc0Rlcml2ZWRGcm9tKGRlY2xhcmF0aW9uLCBiYXNlLCBjaGVja2VyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNLZXlSZWZlcmVuY2VUb0NsYXNzKG5vZGU6IFN0cmluZ0xpdGVyYWxMaWtlLCBrZXlTZXQ6IFJlYWRvbmx5U2V0PHN0cmluZz4sIGNoZWNrZXI6IFR5cGVDaGVja2VyKTogYm9vbGVhbiB7XG4gIGNvbnN0IGNvbnRleHR1YWxUeXBlID0gY2hlY2tlci5nZXRDb250ZXh0dWFsVHlwZShub2RlKTtcbiAgaWYgKCFjb250ZXh0dWFsVHlwZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBsaXRlcmFscyA9IGdldFN0cmluZ0xpdGVyYWxDb25zdGl0dWVudHMoY29udGV4dHVhbFR5cGUpO1xuICBpZiAoIWxpdGVyYWxzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiBsaXRlcmFscy5ldmVyeSgobGl0ZXJhbCkgPT4ga2V5U2V0LmhhcyhsaXRlcmFsKSk7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBzcmNGb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQoY29udGV4dDogQW5hbHlzaXNDb250ZXh0LCBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nLCBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQpOiB2b2lkIHtcbiAgY29udGV4dC5maW5kaW5ncy5wdXNoKGZpbmRpbmcpO1xuICBjb250ZXh0LmVkaXRzLnB1c2goZWRpdCk7XG59XG5cbmZ1bmN0aW9uIHJ1bk92ZXJFeHBvc3VyZUFuYWx5c2lzKHBhcmFtczogQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyk6IEFuYWx5c2lzUmVzdWx0IHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIHsgZWRpdHM6IFtdLCBmaW5kaW5nczogW10gfTtcbiAgfVxuXG4gIGNvbnN0IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCA9IHtcbiAgICBjaGVja2VyOiBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCksXG4gICAgZWRpdHM6IFtdLFxuICAgIGZpbmRpbmdzOiBbXSxcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJvZ3JhbSxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlLFxuICAgIHN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dDogYnVpbGRTdHJpbmdMaXRlcmFsSW5kZXgocHJvZ3JhbSlcbiAgfTtcblxuICBjb25zdCBzb3VyY2VGaWxlc1RvQW5hbHl6ZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKS5maWx0ZXIoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIHJldHVybiBpc093blNvdXJjZUZpbGUoZmlsZVBhdGgsIHNyY0ZvbGRlcikgJiYgIWlzVGVzdEZpbGUoZmlsZVBhdGgpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IFthbmFseXplZEZpbGVDb3VudCwgc291cmNlRmlsZV0gb2Ygc291cmNlRmlsZXNUb0FuYWx5emUuZW50cmllcygpKSB7XG4gICAgb25Qcm9ncmVzcz8uKHtcbiAgICAgIGFuYWx5emVkRmlsZUNvdW50LFxuICAgICAgY3VycmVudEZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICAgIHRvdGFsRmlsZUNvdW50OiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5sZW5ndGhcbiAgICB9KTtcbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcbiAgfVxuICByZXR1cm4geyBlZGl0czogY29udGV4dC5lZGl0cywgZmluZGluZ3M6IGNvbnRleHQuZmluZGluZ3MgfTtcblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYW5hbHl6ZU1lbWJlcihub2RlLCBjb250ZXh0KTtcbiAgICBhbmFseXplRXhwb3J0KG5vZGUsIGNvbnRleHQpO1xuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0b0Rpc3BsYXlQYXRoKGZpbGVQYXRoOiBzdHJpbmcsIGJhc2VGb2xkZXI6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHN0cmluZyB7XG4gIGlmIChiYXNlRm9sZGVyICE9PSB1bmRlZmluZWQgJiYgZmlsZVBhdGguc3RhcnRzV2l0aChgJHtiYXNlRm9sZGVyfS9gKSkge1xuICAgIHJldHVybiBmaWxlUGF0aC5zbGljZShiYXNlRm9sZGVyLmxlbmd0aCArIDEpO1xuICB9XG4gIHJldHVybiBmaWxlUGF0aDtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUEwRUEsd0JBMEJPO0FBRVAseUJBQWtDO0FBQ2xDLGlDQUdPO0FBOE9BLE1BQU0sc0JBQTJDLG9CQUFJLElBQVk7QUFBQSxFQUN0RTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUNGLENBQUM7QUE0REQsTUFBTSwrQkFBK0I7QUFDckMsTUFBTSxnQ0FBZ0M7QUFDdEMsTUFBTSx3QkFBbUQsQ0FBQyxXQUFXLGFBQWEsUUFBUTtBQUMxRixNQUFNLG9CQUF1RDtBQUFBLEVBQzNELGNBQWM7QUFBQSxFQUNkLFdBQVc7QUFBQSxFQUNYLGFBQWE7QUFDZjtBQUNBLE1BQU0sMEJBQWtFO0FBQUEsRUFDdEUsYUFBYTtBQUFBLEVBQ2IsaUJBQWlCO0FBQUEsRUFDakIsYUFBYTtBQUNmO0FBQ0EsTUFBTSw0QkFBcUQsb0JBQUksSUFBZ0IsQ0FBQyw2QkFBVyxnQkFBZ0IsNkJBQVcsa0JBQWtCLDZCQUFXLGFBQWEsQ0FBQztBQUNqSyxNQUFNLHFC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
|
|
760
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gQmVjYXVzZSBgZmluZFJlZmVyZW5jZXNgIGRvZXMgbm90IGxpbmsgYSBzdHJpbmctbGl0ZXJhbFxuICogYXJndW1lbnQgYmFjayB0byBhIG1lbWJlciBkZWNsYXJhdGlvbiB3aGVuIHRoZSBwYXJhbWV0ZXIgaXMgYSBjb25kaXRpb25hbC9tYXBwZWQga2V5IHR5cGUgKGUuZy5cbiAqIGBiaW5kKGNvbXBvbmVudCwgJ3NvbWVTZXR0aW5nJylgIHdoZXJlIHRoZSBrZXkgaXMgdHlwZWQgYENvbmRpdGlvbmFsS2V5czxTZXR0aW5ncywgXHUyMDI2PmApLCBtZW1iZXJcbiAqIGFuYWx5c2lzIGFkZGl0aW9uYWxseSB0cmVhdHMgYSBzdHJpbmcgbGl0ZXJhbCB3aG9zZSB0ZXh0IGVxdWFscyB0aGUgbWVtYmVyIG5hbWUgYXMgYSByZWZlcmVuY2UgXHUyMDE0XG4gKiBidXQgb25seSB3aGVuIGl0cyBjb250ZXh0dWFsIHR5cGUgaXMgYSBzdHJpbmctbGl0ZXJhbCB0eXBlIChvciB1bmlvbiBvZiB0aGVtKSBhbGwgb2Ygd2hvc2UgbWVtYmVyc1xuICogYXJlIGtleXMgb2YgdGhlIGRlY2xhcmluZyBjbGFzcywgc28gaW5jaWRlbnRhbCBzYW1lLW5hbWVkIHN0cmluZ3MgKGBjb25zb2xlLmxvZygnbmFtZScpYCkgYXJlIG5vdFxuICogbWlzY291bnRlZC4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi4gRUNNQVNjcmlwdCBoYXJkLXByaXZhdGUgbWVtYmVycyAoYCNuYW1lYCkgYXJlIGFsc28gZXhjbHVkZWQgXHUyMDE0XG4gKiB0aGV5IGFyZSBhbHJlYWR5IG1heGltYWxseSBwcml2YXRlIGFuZCBjYW5ub3QgY2FycnkgYSB2aXNpYmlsaXR5IG1vZGlmaWVyLiBBIGRlY2xhcmF0aW9uIGNhcnJ5aW5nXG4gKiBhIFRTRG9jIChgLyoqIFx1MjAyNiAqXFwvYCkgZG9jdW1lbnRhdGlvbiBjb21tZW50IGlzIGxpa2V3aXNlIGV4Y2x1ZGVkIFx1MjAxNCB3aGV0aGVyIGEgdG9wLWxldmVsIGBleHBvcnRgIG9yXG4gKiBhIGNsYXNzIG1lbWJlciwgZG9jdW1lbnRpbmcgaXQgaXMgYSBkZWxpYmVyYXRlIHNpZ25hbCB0aGF0IGl0IGlzIHBhcnQgb2YgdGhlIGludGVuZGVkIHB1YmxpYyBBUEksXG4gKiByZWdhcmRsZXNzIG9mIHdoZXJlIGl0IGN1cnJlbnRseSBoYXBwZW5zIHRvIGJlIHJlZmVyZW5jZWQuXG4gKlxuICogQSBtZW1iZXIgcmVmZXJlbmNlZCBvbmx5IGZyb20gdGVzdCBmaWxlcyBpcyByZXBvcnRlZCB3aXRoIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seX1cbiAqIHNldCwgc3VyZmFjaW5nIG1lbWJlcnMgd2lkZW5lZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5IFx1MjAxNCB0aGUgY2Fub25pY2FsIGNhc2UgZm9yIGV4dHJhY3RpbmcgbG9naWNcbiAqIGludG8gYW4gaW5kZXBlbmRlbnRseSB0ZXN0YWJsZSBjb21wb25lbnQgaW5zdGVhZC5cbiAqXG4gKiBCZXlvbmQgcmVwb3J0aW5nLCBwYXNzaW5nIGBzaG91bGRGaXhgIHRvIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfSAvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfVxuICogcmV3cml0ZXMgdGhlIHNvdXJjZSBpbiBwbGFjZTogZHJvcHBpbmcgdGhlIGBleHBvcnRgIGtleXdvcmQsIG9yIHJlcGxhY2luZy9pbnNlcnRpbmcgYSBgcHJpdmF0ZWBcbiAqIG9yIGBwcm90ZWN0ZWRgIG1vZGlmaWVyLiBFYWNoIGZpbmRpbmcgdGhlbiBjYXJyaWVzIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufS4gQ2hhbmdlcyB0aGF0IGNhbm5vdCBiZSBzYWZlbHkgYXV0b21hdGVkIFx1MjAxNCB0aG9zZSBmb3JjZWRcbiAqIG9ubHkgYnkgdGVzdCByZWZlcmVuY2VzLCBkZWNvcmF0ZWQgbWVtYmVycywgb3IgYW4gYGV4cG9ydGAgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIFx1MjAxNFxuICogYXJlIHJlcG9ydGVkIGFzIHNraXBwZWQgYW5kIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEFkZGl0aW9uYWxseSBwYXNzaW5nIGBzaG91bGRGb3JjZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIGBzaG91bGRGaXhgKSB0aWdodGVucyB0aGVcbiAqIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyB0b28gXHUyMDE0IHRoZSBwcm9kdWN0aW9uIGhhbGYgb2YgdGhlIGNhbm9uaWNhbFxuICogdGVzdC1vbmx5IG1pZ3JhdGlvbjogdGhlIG1lbWJlciBiZWNvbWVzIGBwcml2YXRlYCAvIHRoZSBgZXhwb3J0YCBpcyBkcm9wcGVkLCBsZWF2aW5nIG9ubHkgdGhlXG4gKiB0ZXN0IHRvIHN3aXRjaCB0byBhIGNhc3QtYmFzZWQgYWNjZXNzLiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkXG4gKiBzaWJsaW5nIHN0YXkgc2tpcHBlZCBldmVuIHVuZGVyIGBzaG91bGRGb3JjZWAsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFNvdXJjZUZpbGUsXG4gIFN0cmluZ0xpdGVyYWxMaWtlLFxuICBUeXBlLFxuICBUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgVHlwZUNoZWNrZXIsXG4gIFZhcmlhYmxlU3RhdGVtZW50XG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlY29yYXRvcnMsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TGVhZGluZ0NvbW1lbnRSYW5nZXMsXG4gIGdldE1vZGlmaWVycyxcbiAgaXNDbGFzc0RlY2xhcmF0aW9uLFxuICBpc0NsYXNzTGlrZSxcbiAgaXNFbnVtRGVjbGFyYXRpb24sXG4gIGlzRnVuY3Rpb25EZWNsYXJhdGlvbixcbiAgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc0lkZW50aWZpZXIsXG4gIGlzSW50ZXJmYWNlRGVjbGFyYXRpb24sXG4gIGlzTWV0aG9kRGVjbGFyYXRpb24sXG4gIGlzUHJpdmF0ZUlkZW50aWZpZXIsXG4gIGlzUHJvcGVydHlEZWNsYXJhdGlvbixcbiAgaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uLFxuICBpc1NvdXJjZUZpbGUsXG4gIGlzU3RyaW5nTGl0ZXJhbExpa2UsXG4gIGlzVHlwZUFsaWFzRGVjbGFyYXRpb24sXG4gIGlzVmFyaWFibGVTdGF0ZW1lbnQsXG4gIFNjcmlwdFNuYXBzaG90LFxuICBTeW50YXhLaW5kLFxuICBzeXNcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7IGFzc2VydE5vbk51bGxhYmxlIH0gZnJvbSAnLi4vLi4vdHlwZS1ndWFyZHMudHMnO1xuaW1wb3J0IHtcbiAgcGFyc2VUc0NvbmZpZyxcbiAgdG9DYW5vbmljYWxcbn0gZnJvbSAnLi4vY2hlY2stcHJvamVjdC10eXBlcy50cyc7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMge1xuICAvKiogVGhlIGxhbmd1YWdlIHNlcnZpY2UgdG8gcXVlcnkgZm9yIHJlZmVyZW5jZXMgYW5kIHR5cGVzLiAqL1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcblxuICAvKipcbiAgICogT3B0aW9uYWwgY2FsbGJhY2sgaW52b2tlZCBvbmNlIHBlciBhbmFseXplZCBzb3VyY2UgZmlsZSwgYmVmb3JlIHRoYXQgZmlsZSBpcyBwcm9jZXNzZWQuIFRoZVxuICAgKiB3aG9sZS1wcm9ncmFtIHJlZmVyZW5jZSBhbmFseXNpcyBpcyBzbG93LCBzbyB0aGlzIGxldHMgY2FsbGVycyByZXBvcnQgbGl2ZSBwcm9ncmVzcyBpbnN0ZWFkIG9mXG4gICAqIGFwcGVhcmluZyB0byBoYW5nLlxuICAgKi9cbiAgb25Qcm9ncmVzcz8odGhpczogdm9pZCwgcHJvZ3Jlc3M6IE92ZXJFeHBvc3VyZVByb2dyZXNzKTogdm9pZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIHRpZ2h0ZW5lZCBpbiBwbGFjZSB2aWEge0BsaW5rIHdyaXRlRmlsZX0gKHdoaWNoIG11c3QgdGhlblxuICAgKiBiZSBwcm92aWRlZCksIGFuZCB0aGUgcmV0dXJuZWQgZmluZGluZ3MgY2Fycnkge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAgICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0uIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRzLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQgd2l0aCBhIGB0ZXN0LW9ubHlgXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBEZWNvcmF0ZWQgbWVtYmVycyBhbmQgZXhwb3J0cyBzaGFyZWQgd2l0aCBhXG4gICAqIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgc3RheSBza2lwcGVkIHJlZ2FyZGxlc3MsIGJlY2F1c2Ugbm8gZWRpdCBjYW4gYmUgYXBwbGllZCBzYWZlbHkuXG4gICAqL1xuICByZWFkb25seSBzaG91bGRGb3JjZT86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgd3JpdGVGaWxlPyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmaXhhYmxlIGZpbmRpbmdzIGFyZSB0aWdodGVuZWQgaW4gcGxhY2Ugb24gZGlzayAodGhlIGBleHBvcnRgIGtleXdvcmQgaXMgZHJvcHBlZCxcbiAgICogb3IgYSBgcHJpdmF0ZWAgLyBgcHJvdGVjdGVkYCBtb2RpZmllciBpcyBpbnNlcnRlZC9yZXBsYWNlZCkuIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGVcbiAgICogcHJvamVjdCBpcyBvbmx5IGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAgKG9ubHkgbWVhbmluZ2Z1bCB0b2dldGhlciB3aXRoIHtAbGluayBzaG91bGRGaXh9KSwgZGVjbGFyYXRpb25zIGhlbGQgd2lkZSBwdXJlbHkgYnlcbiAgICogdGVzdCByZWZlcmVuY2VzIGFyZSB0aWdodGVuZWQgdG9vLCBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuIERlY29yYXRlZCBtZW1iZXJzIGFuZCBleHBvcnRzXG4gICAqIHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZyBzdGF5IHNraXBwZWQgcmVnYXJkbGVzcy4gRm9yd2FyZGVkIHRvXG4gICAqIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlPzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgZmlsZSBwYXRocyBpbiB0aGUgcmVwb3J0IGFyZSByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlciAodHlwaWNhbGx5IHRoZSBjdXJyZW50XG4gICAqIHdvcmtpbmcgZGlyZWN0b3J5KSBpbnN0ZWFkIG9mIGFzIGFic29sdXRlIHBhdGhzLiBQYXRocyBvdXRzaWRlIHRoZSBmb2xkZXIgc3RheSBhYnNvbHV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QgbmVlZHMuIEluamVjdGluZyB0aGlzIChyYXRoZXIgdGhhblxuICogYWx3YXlzIHVzaW5nIGB0eXBlc2NyaXB0YCdzIGBzeXNgKSBsZXRzIHRlc3RzIGRyaXZlIHRoZSBhbmFseXplciBhZ2FpbnN0IGluLW1lbW9yeSBzb3VyY2VzIHdpdGggbm9cbiAqIHJlYWwgZmlsZS1zeXN0ZW0gYWNjZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXJlY3RvcnlFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGV4aXN0cy5cbiAgICovXG4gIGZpbGVFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBjb250ZW50cywgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICByZWFkRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKiogMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLiAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKiAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKiBUaGUgZGVjbGFyZWQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiBhIGZpeCBydW4sIHdoeSB0aGlzIGZpbmRpbmcgd2FzIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgdGlnaHRlbmVkOyBgbnVsbGAgd2hlbiBpdCB3YXNcbiAgICogZml4ZWQgb3Igd2hlbiB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRlZCAoYHNob3VsZEZpeGAgb2ZmKS5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBSZWFzb246IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uO1xuXG4gIC8qKiBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiBhIGZpeCBydW4gdGlnaHRlbmVkIHRoaXMgZGVjbGFyYXRpb24gaW4gcGxhY2UuIEFsd2F5cyBgZmFsc2VgIGluIGEgcmVwb3J0IHJ1bi4gKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKiBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLiAqL1xuICByZWFkb25seSBhbmFseXplZEZpbGVDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBhYm91dCB0byBiZSBhbmFseXplZC4gKi9cbiAgcmVhZG9ubHkgY3VycmVudEZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAgXHUyMDE0IHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCBcdTIwMTQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIFx1MjAxNCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuICByZWFkb25seSBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IFJlYWRvbmx5TWFwPHN0cmluZywgcmVhZG9ubHkgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT47XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBhcHBseU92ZXJFeHBvc3VyZUZpeGVzfS5cbiAqL1xuaW50ZXJmYWNlIEFwcGx5T3ZlckV4cG9zdXJlRml4ZXNQYXJhbXMge1xuICAvKiogVGhlIHByb2dyYW0gd2hvc2Ugc291cmNlIGZpbGVzIHN1cHBseSB0aGUgb3JpZ2luYWwgdGV4dCB0aGUgZWRpdHMgYXJlIGFwcGxpZWQgdG87IGB1bmRlZmluZWRgIHdoZW4gbm8gcHJvZ3JhbSBpcyBhdmFpbGFibGUuICovXG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW0gfCB1bmRlZmluZWQ7XG5cbiAgLyoqIFRoZSBhbmFseXNpcyByZXN1bHQgd2hvc2UgZmluZGluZ3MgYW5kIGVkaXRzIGFyZSB0dXJuZWQgaW50byBpbi1wbGFjZSBmaXhlcy4gKi9cbiAgcmVhZG9ubHkgcmVzdWx0OiBBbmFseXNpc1Jlc3VsdDtcblxuICAvKiogV2hlbiBgdHJ1ZWAsIGRlY2xhcmF0aW9ucyBoZWxkIHdpZGUgcHVyZWx5IGJ5IHRlc3QgcmVmZXJlbmNlcyBhcmUgdGlnaHRlbmVkIHRvbyBpbnN0ZWFkIG9mIGJlaW5nIHNraXBwZWQuICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xuXG4gIC8qKiBXcml0ZXMgdGhlIHRpZ2h0ZW5lZCBjb250ZW50cyBvZiBhIGNoYW5nZWQgZmlsZSBiYWNrIHRvIGRpc2suICovXG4gIHdyaXRlRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGJ1aWxkRmluZGluZ30uXG4gKi9cbmludGVyZmFjZSBCdWlsZEZpbmRpbmdQYXJhbXMge1xuICAvKiogVGhlIGN1cnJlbnQgZXhwb3N1cmUgbGV2ZWwgb2YgdGhlIGRlY2xhcmF0aW9uLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogRmxhZ3MgZGVzY3JpYmluZyB3aGV0aGVyIHRoZSBkZWNsYXJhdGlvbiBoYXMgbm8gcmVmZXJlbmNlcyBhdCBhbGwgb3IgaXMgZm9yY2VkIHdpZGUgYnkgdGVzdC1vbmx5IHJlZmVyZW5jZXMuICovXG4gIHJlYWRvbmx5IGZsYWdzOiBGaW5kaW5nRmxhZ3M7XG5cbiAgLyoqIFRoZSBkZWNsYXJhdGlvbidzIG5hbWUgbm9kZSwgdXNlZCB0byByZXNvbHZlIGl0cyBwb3NpdGlvbiBhbmQgdGV4dC4gKi9cbiAgcmVhZG9ubHkgbmFtZU5vZGU6IE5vZGU7XG5cbiAgLyoqIFRoZSBkZWNsYXJhdGlvbiBub2RlLCB1c2VkIHRvIHJlc29sdmUgaXRzIHNvdXJjZSBmaWxlLiAqL1xuICByZWFkb25seSBub2RlOiBOb2RlO1xuXG4gIC8qKiBUaGUgdGlnaHRlciBleHBvc3VyZSBsZXZlbCB0aGUgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgY29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzfS5cbiAqL1xuaW50ZXJmYWNlIENvbGxlY3RTdHJpbmdMaXRlcmFsUmVmZXJlbmNlc1BhcmFtcyB7XG4gIC8qKiBUaGUgYW5hbHlzaXMgY29udGV4dCBwcm92aWRpbmcgdGhlIHN0cmluZy1saXRlcmFsIGluZGV4IGFuZCB0eXBlIGNoZWNrZXIuICovXG4gIHJlYWRvbmx5IGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dDtcblxuICAvKiogVGhlIGNsYXNzIGRlY2xhcmluZyB0aGUgbWVtYmVyIHdob3NlIG5hbWUgdGhlIHN0cmluZyBsaXRlcmFscyBtaWdodCByZWZlcmVuY2UuICovXG4gIHJlYWRvbmx5IGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcblxuICAvKiogVGhlIG1lbWJlcidzIG5hbWUgbm9kZSwgd2hvc2UgdGV4dCBpcyBtYXRjaGVkIGFnYWluc3Qgc3RyaW5nLWxpdGVyYWwgb2NjdXJyZW5jZXMuICovXG4gIHJlYWRvbmx5IG5hbWVOb2RlOiBOb2RlO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBjb21wdXRlTmVlZGVkRXhwb3N1cmV9LlxuICovXG5pbnRlcmZhY2UgQ29tcHV0ZU5lZWRlZEV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqIFRoZSBhbmFseXNpcyBjb250ZXh0IHByb3ZpZGluZyB0aGUgcHJvZ3JhbSBhbmQgdHlwZSBjaGVja2VyLiAqL1xuICByZWFkb25seSBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQ7XG5cbiAgLyoqIFRoZSBjbGFzcyBkZWNsYXJpbmcgdGhlIG1lbWJlciB3aG9zZSBuZWVkZWQgZXhwb3N1cmUgaXMgY29tcHV0ZWQuICovXG4gIHJlYWRvbmx5IGRlY2xhcmluZ0NsYXNzOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcblxuICAvKiogVGhlIHJlZmVyZW5jZSBsb2NhdGlvbnMgdGhhdCBtdXN0IHJlbWFpbiByZWFjaGFibGUgYXQgdGhlIGNvbXB1dGVkIGV4cG9zdXJlLiAqL1xuICByZWFkb25seSByZWZlcmVuY2VzOiByZWFkb25seSBSZWZlcmVuY2VMb2NhdGlvbltdO1xufVxuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBkZXRlcm1pbmVTa2lwUmVhc29ufS5cbiAqL1xuaW50ZXJmYWNlIERldGVybWluZVNraXBSZWFzb25QYXJhbXMge1xuICAvKiogVGhlIHRleHQgZWRpdCB0aGF0IHdvdWxkIHRpZ2h0ZW4gdGhlIGZpbmRpbmcsIG9yIGBudWxsYCB3aGVuIG5vIHNhZmUgZWRpdCBleGlzdHMuICovXG4gIHJlYWRvbmx5IGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdDtcblxuICAvKiogVGhlIGZpbmRpbmcgdW5kZXIgY29uc2lkZXJhdGlvbi4gKi9cbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcblxuICAvKiogV2hlbiBgdHJ1ZWAsIHRlc3Qtb25seSBmaW5kaW5ncyBhcmUgdGlnaHRlbmVkIHJhdGhlciB0aGFuIHNraXBwZWQuICovXG4gIHJlYWRvbmx5IHNob3VsZEZvcmNlOiBib29sZWFuO1xufVxuXG50eXBlIEV4cG9ydGFibGVEZWNsYXJhdGlvbiA9IENsYXNzRGVjbGFyYXRpb24gfCBFbnVtRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgSW50ZXJmYWNlRGVjbGFyYXRpb24gfCBUeXBlQWxpYXNEZWNsYXJhdGlvbiB8IFZhcmlhYmxlU3RhdGVtZW50O1xuXG5pbnRlcmZhY2UgRXhwb3J0RmluZGluZ0NhbmRpZGF0ZSB7XG4gIHJlYWRvbmx5IGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmc7XG4gIHJlYWRvbmx5IGlzUGxhaW5GaWxlTG9jYWw6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBGaW5kaW5nRmxhZ3Mge1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG4gIHJlYWRvbmx5IGlzRm9yY2VkQnlUZXN0T25seTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgZ2V0Q2xhc3NBdFBvc2l0aW9ufS5cbiAqL1xuaW50ZXJmYWNlIEdldENsYXNzQXRQb3NpdGlvblBhcmFtcyB7XG4gIC8qKiBBYnNvbHV0ZSBwYXRoIG9mIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uLiAqL1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuXG4gIC8qKiAwLWJhc2VkIGNoYXJhY3RlciBvZmZzZXQgb2YgdGhlIHJlZmVyZW5jZSB3aXRoaW4gdGhlIGZpbGUuICovXG4gIHJlYWRvbmx5IHBvc2l0aW9uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBwcm9ncmFtIHVzZWQgdG8gcmVzb2x2ZSB0aGUgc291cmNlIGZpbGUuICovXG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGlzRGVyaXZlZEZyb219LlxuICovXG5pbnRlcmZhY2UgSXNEZXJpdmVkRnJvbVBhcmFtcyB7XG4gIC8qKiBUaGUgY2FuZGlkYXRlIGJhc2UgY2xhc3MuICovXG4gIHJlYWRvbmx5IGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uO1xuXG4gIC8qKiBUaGUgdHlwZSBjaGVja2VyIHVzZWQgdG8gcmVzb2x2ZSBoZXJpdGFnZSBzeW1ib2xzLiAqL1xuICByZWFkb25seSBjaGVja2VyOiBUeXBlQ2hlY2tlcjtcblxuICAvKiogVGhlIGNhbmRpZGF0ZSBkZXJpdmVkIGNsYXNzLiAqL1xuICByZWFkb25seSBkZXJpdmVkOiBDbGFzc0xpa2VEZWNsYXJhdGlvbjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaXNLZXlSZWZlcmVuY2VUb0NsYXNzfS5cbiAqL1xuaW50ZXJmYWNlIElzS2V5UmVmZXJlbmNlVG9DbGFzc1BhcmFtcyB7XG4gIC8qKiBUaGUgdHlwZSBjaGVja2VyIHVzZWQgdG8gcmVzb2x2ZSB0aGUgbGl0ZXJhbCdzIGNvbnRleHR1YWwgdHlwZS4gKi9cbiAgcmVhZG9ubHkgY2hlY2tlcjogVHlwZUNoZWNrZXI7XG5cbiAgLyoqIFRoZSBzZXQgb2YgcHJvcGVydHkga2V5cyBkZWNsYXJlZCBieSB0aGUgY2xhc3MuICovXG4gIHJlYWRvbmx5IGtleVNldDogUmVhZG9ubHlTZXQ8c3RyaW5nPjtcblxuICAvKiogVGhlIHN0cmluZy1saXRlcmFsIG5vZGUgYmVpbmcgdGVzdGVkLiAqL1xuICByZWFkb25seSBub2RlOiBTdHJpbmdMaXRlcmFsTGlrZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgaXNPd25Tb3VyY2VGaWxlfS5cbiAqL1xuaW50ZXJmYWNlIElzT3duU291cmNlRmlsZVBhcmFtcyB7XG4gIC8qKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBmaWxlIHVuZGVyIHRlc3QuICovXG4gIHJlYWRvbmx5IGZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuICovXG4gIHJlYWRvbmx5IHNyY0ZvbGRlcjogc3RyaW5nO1xufVxuXG50eXBlIE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcgfCAncHVibGljJztcblxuLyoqXG4gKiBBIHNpbmdsZSBpbi1wbGFjZSB0ZXh0IHJlcGxhY2VtZW50IHRoYXQgdGlnaHRlbnMgYSBkZWNsYXJhdGlvbidzIGV4cG9zdXJlLiBBIHplcm8tbGVuZ3RoIGVkaXQgaXNcbiAqIGFuIGluc2VydGlvbiAoZS5nLiBhZGRpbmcgYW4gZXhwbGljaXQgYHByaXZhdGVgIG1vZGlmaWVyIHRvIGFuIGltcGxpY2l0bHktYHB1YmxpY2AgbWVtYmVyKS5cbiAqL1xuaW50ZXJmYWNlIE92ZXJFeHBvc3VyZVRleHRFZGl0IHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgbGVuZ3RoOiBudW1iZXI7XG4gIHJlYWRvbmx5IG5ld1RleHQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgcmVjb3JkfS5cbiAqL1xuaW50ZXJmYWNlIFJlY29yZFBhcmFtcyB7XG4gIC8qKiBUaGUgYW5hbHlzaXMgY29udGV4dCB3aG9zZSBmaW5kaW5ncyBhbmQgZWRpdHMgYXJlIGFwcGVuZGVkIHRvLiAqL1xuICByZWFkb25seSBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQ7XG5cbiAgLyoqIFRoZSB0ZXh0IGVkaXQgdGhhdCB3b3VsZCB0aWdodGVuIHRoZSBmaW5kaW5nLCBvciBgbnVsbGAgd2hlbiBubyBzYWZlIGVkaXQgZXhpc3RzLiAqL1xuICByZWFkb25seSBlZGl0OiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQ7XG5cbiAgLyoqIFRoZSBmaW5kaW5nIHRvIHJlY29yZC4gKi9cbiAgcmVhZG9ubHkgZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZztcbn1cblxuaW50ZXJmYWNlIFJlZmVyZW5jZUxvY2F0aW9uIHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFNvdXJjZUZpbGVUZXh0IHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgdGV4dDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2Uge1xuICByZWFkb25seSBub2RlOiBTdHJpbmdMaXRlcmFsTGlrZTtcbiAgcmVhZG9ubHkgc291cmNlRmlsZTogU291cmNlRmlsZTtcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgdG9EaXNwbGF5UGF0aH0uXG4gKi9cbmludGVyZmFjZSBUb0Rpc3BsYXlQYXRoUGFyYW1zIHtcbiAgLyoqIFdoZW4gc2V0LCB0aGUgcGF0aCBpcyByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlcjsgcGF0aHMgb3V0c2lkZSBpdCBzdGF5IGFic29sdXRlLiAqL1xuICByZWFkb25seSBiYXNlRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cbiAgLyoqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggdG8gcmVuZGVyLiAqL1xuICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xufVxuXG4vLyBBIEpTRG9jL1RTRG9jIGNvbW1lbnQgb3BlbnMgd2l0aCBgLyoqYDogdGhlIGNoYXJhY3RlciBhdCBvZmZzZXQgMiBpcyB0aGUgc2Vjb25kIGAqYCwgYW5kIHRvIGV4Y2x1ZGUgdGhlIGVtcHR5IGAvKiovYCBjb21tZW50IHRoZSBjaGFyYWN0ZXIgYXQgb2Zmc2V0IDMgbXVzdCBub3QgYmUgdGhlIGNsb3NpbmcgYC9gLlxuY29uc3QgSlNET0NfU0VDT05EX0FTVEVSSVNLX09GRlNFVCA9IDI7XG5jb25zdCBKU0RPQ19GT1VSVEhfQ0hBUkFDVEVSX09GRlNFVCA9IDM7XG5jb25zdCBNRU1CRVJfRVhQT1NVUkVfT1JERVI6IHJlYWRvbmx5IE1lbWJlckV4cG9zdXJlW10gPSBbJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ3B1YmxpYyddO1xuY29uc3QgU0NPUEVfREVTQ1JJUFRJT046IFJlY29yZDxTdWdnZXN0ZWRFeHBvc3VyZSwgc3RyaW5nPiA9IHtcbiAgJ2ZpbGUtbG9jYWwnOiAnd2l0aGluIGl0cyBvd24gZmlsZScsXG4gICdwcml2YXRlJzogJ2luc2lkZSBpdHMgb3duIGNsYXNzJyxcbiAgJ3Byb3RlY3RlZCc6ICdpbnNpZGUgaXRzIGNsYXNzICsgc3ViY2xhc3Nlcydcbn07XG5jb25zdCBTS0lQX1JFQVNPTl9ERVNDUklQVElPTjogUmVjb3JkPE92ZXJFeHBvc3VyZVNraXBSZWFzb24sIHN0cmluZz4gPSB7XG4gICdkZWNvcmF0ZWQnOiAnZGVjb3JhdGVkIG1lbWJlcicsXG4gICdzaGFyZWQtZXhwb3J0JzogJ2V4cG9ydCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcnLFxuICAndGVzdC1vbmx5JzogJ2V4cG9zZWQgb25seSBmb3IgdGVzdHMnXG59O1xuY29uc3QgVklTSUJJTElUWV9NT0RJRklFUl9LSU5EUzogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4gPSBuZXcgU2V0PFN5bnRheEtpbmQ+KFtTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkLCBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZF0pO1xuY29uc3QgV0hJVEVTUEFDRV9QQVRURVJOID0gL1xccy87XG5cbi8qKlxuICogQW5hbHl6ZXMgYSBwcm9qZWN0IChhbHJlYWR5IGxvYWRlZCBpbnRvIGEgbGFuZ3VhZ2Ugc2VydmljZSkgZm9yIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGFuZCBcdTIwMTRcbiAqIHdoZW4ge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQgXHUyMDE0IHRpZ2h0ZW5zIGV2ZXJ5IGZpeGFibGUgZmluZGluZyBpbiBwbGFjZVxuICogdmlhIHtAbGluayBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zLndyaXRlRmlsZX0uIEZpbmRpbmdzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQgKGV4cG9zZWRcbiAqIG9ubHkgZm9yIHRlc3RzLCBkZWNvcmF0ZWQsIG9yIHNoYXJpbmcgYW4gYGV4cG9ydGAga2V5d29yZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZykgY2FycnkgYVxuICoge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0gYW5kIGFyZSBsZWZ0IHVudG91Y2hlZCBcdTIwMTQgdW5sZXNzXG4gKiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGb3JjZX0gaXMgc2V0LCB3aGljaCBhZGRpdGlvbmFsbHkgdGlnaHRlbnMgdGhlIHRlc3Qtb25seVxuICogZmluZGluZ3MgKGRlY29yYXRlZCBhbmQgc2hhcmVkLWV4cG9ydCBvbmVzIHN0aWxsIHN0YXkgc2tpcHBlZCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgaW4gZGlzY292ZXJ5IG9yZGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYW5hbHl6ZU92ZXJFeHBvc3VyZShwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCByZXN1bHQgPSBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXMpO1xuICBpZiAoIXBhcmFtcy5zaG91bGRGaXgpIHtcbiAgICByZXR1cm4gWy4uLnJlc3VsdC5maW5kaW5nc107XG4gIH1cblxuICBjb25zdCB7IHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBhc3NlcnROb25OdWxsYWJsZSh3cml0ZUZpbGUsICd3cml0ZUZpbGUgaXMgcmVxdWlyZWQgd2hlbiBzaG91bGRGaXggaXMgdHJ1ZS4nKTtcbiAgcmV0dXJuIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMoe1xuICAgIHByb2dyYW06IHBhcmFtcy5sYW5ndWFnZVNlcnZpY2UuZ2V0UHJvZ3JhbSgpLFxuICAgIHJlc3VsdCxcbiAgICBzaG91bGRGb3JjZTogcGFyYW1zLnNob3VsZEZvcmNlID8/IGZhbHNlLFxuICAgIHdyaXRlRmlsZVxuICB9KTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSB7QGxpbmsgTGFuZ3VhZ2VTZXJ2aWNlSG9zdH0gYmFja2VkIGJ5IGFuIGV4cGxpY2l0IGZpbGUgbGlzdCBhbmQgZmlsZSBzeXN0ZW0uXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgbGFuZ3VhZ2Utc2VydmljZSBob3N0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdChwYXJhbXM6IENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMpOiBMYW5ndWFnZVNlcnZpY2VIb3N0IHtcbiAgY29uc3QgeyBjb21waWxlck9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbSB9ID0gcGFyYW1zO1xuICByZXR1cm4ge1xuICAgIGRpcmVjdG9yeUV4aXN0czogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5kaXJlY3RvcnlFeGlzdHMoZGlyZWN0b3J5KSxcbiAgICBmaWxlRXhpc3RzOiAoZmlsZSkgPT4gZmlsZVN5c3RlbS5maWxlRXhpc3RzKGZpbGUpLFxuICAgIGdldENvbXBpbGF0aW9uU2V0dGluZ3M6ICgpID0+IGNvbXBpbGVyT3B0aW9ucyxcbiAgICBnZXRDdXJyZW50RGlyZWN0b3J5OiAoKSA9PiBmaWxlU3lzdGVtLmdldEN1cnJlbnREaXJlY3RvcnkoKSxcbiAgICBnZXREZWZhdWx0TGliRmlsZU5hbWU6IChsaWJPcHRpb25zKSA9PiBnZXREZWZhdWx0TGliRmlsZVBhdGgobGliT3B0aW9ucyksXG4gICAgZ2V0RGlyZWN0b3JpZXM6IChkaXJlY3RvcnkpID0+IGZpbGVTeXN0ZW0uZ2V0RGlyZWN0b3JpZXMoZGlyZWN0b3J5KSxcbiAgICBnZXRTY3JpcHRGaWxlTmFtZXM6ICgpID0+IFsuLi5maWxlTmFtZXNdLFxuICAgIGdldFNjcmlwdFNuYXBzaG90OiAoZmlsZU5hbWUpOiBJU2NyaXB0U25hcHNob3QgfCB1bmRlZmluZWQgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IGZpbGVTeXN0ZW0ucmVhZEZpbGUoZmlsZU5hbWUpO1xuICAgICAgcmV0dXJuIHRleHQgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFNjcmlwdFNuYXBzaG90LmZyb21TdHJpbmcodGV4dCk7XG4gICAgfSxcbiAgICBnZXRTY3JpcHRWZXJzaW9uOiAoKSA9PiAnMCcsXG4gICAgcmVhZERpcmVjdG9yeTogKHBhdGgsIGV4dGVuc2lvbnMsIGV4Y2x1ZGUsIGluY2x1ZGUsIGRlcHRoKSA9PiBmaWxlU3lzdGVtLnJlYWREaXJlY3RvcnkocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpLFxuICAgIHJlYWRGaWxlOiAoZmlsZSkgPT4gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlKVxuICB9O1xufVxuXG4vKipcbiAqIEJ1aWxkcyBhIGxhbmd1YWdlIHNlcnZpY2Ugb3ZlciBldmVyeSBmaWxlIGluIGEgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zfS5cbiAqIEByZXR1cm5zIEEgbGFuZ3VhZ2Ugc2VydmljZSByZWFkeSBmb3Ige0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9LlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZShwYXJhbXM6IENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMpOiBMYW5ndWFnZVNlcnZpY2Uge1xuICBjb25zdCB7IGZpbGVOYW1lcywgb3B0aW9ucyB9ID0gcGFyc2VUc0NvbmZpZyhwYXJhbXMudHNDb25maWdQYXRoKTtcbiAgcmV0dXJuIGNyZWF0ZUxhbmd1YWdlU2VydmljZShjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHsgY29tcGlsZXJPcHRpb25zOiBvcHRpb25zLCBmaWxlTmFtZXMsIGZpbGVTeXN0ZW06IHN5cyB9KSwgY3JlYXRlRG9jdW1lbnRSZWdpc3RyeSgpKTtcbn1cblxuLyoqXG4gKiBGaW5kcyBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zIGluIGEgcHJvamVjdCBvbiBkaXNrLiBXaGVuXG4gKiB7QGxpbmsgRmluZE92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCwgZWFjaCBmaXhhYmxlIGZpbmRpbmcgaXMgYWxzbyB0aWdodGVuZWQgaW4gcGxhY2VcbiAqIChyZXdyaXRpbmcgdGhlIGFmZmVjdGVkIHNvdXJjZSBmaWxlcyB2aWEgYHR5cGVzY3JpcHRgJ3MgYHN5cy53cml0ZUZpbGVgKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmluZE92ZXJFeHBvc3VyZShwYXJhbXM6IEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBwcm9qZWN0Rm9sZGVyID0gdG9DYW5vbmljYWwocGFyYW1zLnByb2plY3RGb2xkZXIpO1xuICBjb25zdCBsYW5ndWFnZVNlcnZpY2UgPSBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHsgdHNDb25maWdQYXRoOiBgJHtwcm9qZWN0Rm9sZGVyfS90c2NvbmZpZy5qc29uYCB9KTtcbiAgcmV0dXJuIGFuYWx5emVPdmVyRXhwb3N1cmUoe1xuICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICBzaG91bGRGaXg6IHBhcmFtcy5zaG91bGRGaXgsXG4gICAgc2hvdWxkRm9yY2U6IHBhcmFtcy5zaG91bGRGb3JjZSxcbiAgICBzcmNGb2xkZXI6IGAke3Byb2plY3RGb2xkZXJ9L3NyY2AsXG4gICAgd3JpdGVGaWxlOiAocGF0aCwgY29udGVudCkgPT4ge1xuICAgICAgc3lzLndyaXRlRmlsZShwYXRoLCBjb250ZW50KTtcbiAgICB9LFxuICAgIC4uLnBhcmFtcy5vblByb2dyZXNzID8geyBvblByb2dyZXNzOiBwYXJhbXMub25Qcm9ncmVzcyB9IDoge31cbiAgfSk7XG59XG5cbi8qKlxuICogRm9ybWF0cyBvdmVyLWV4cG9zdXJlIGZpbmRpbmdzIGFzIGEgaHVtYW4tcmVhZGFibGUgcmVwb3J0LCB1c2luZyB0aGUgZ3JvdXBlZCBsYXlvdXQgb2YgRVNMaW50J3NcbiAqIGBzdHlsaXNoYCBmb3JtYXR0ZXIuIEZpbmRpbmdzIGFyZSBncm91cGVkIGJ5IGZpbGUgYW5kIHNvcnRlZCBieSBsaW5lOiBlYWNoIGZpbGUgaXMgcmVuZGVyZWQgYXMgYVxuICogYHBhdGhgIGhlYWRlciBsaW5lLCBmb2xsb3dlZCBieSBvbmUgaW5kZW50ZWQgYCAgbGluZTpjb2x1bW4gIGNoYW5nZSAtLSByZWFzb25gIHJvdyBwZXIgZmluZGluZyAodGhlXG4gKiBgbGluZTpjb2x1bW5gIGlzIHJpZ2h0LXBhZGRlZCBzbyB0aGUgcm93cyBhbGlnbiB3aXRoaW4gYSBmaWxlKS4gVGVybWluYWxzIHN1Y2ggYXMgVlMgQ29kZSByZW5kZXJcbiAqIGVhY2ggaW5kZW50ZWQgYGxpbmU6Y29sdW1uYCBhcyBhIGNsaWNrYWJsZSBsaW5rIFx1MjAxNCByZXNvbHZlZCBhZ2FpbnN0IHRoZSBmaWxlIGhlYWRlciBhYm92ZSBpdCBcdTIwMTQgdGhhdFxuICoganVtcHMgc3RyYWlnaHQgdG8gdGhlIGRlY2xhcmF0aW9uLiBGaWxlIGdyb3VwcyBhcmUgc2VwYXJhdGVkIGJ5IGEgYmxhbmsgbGluZS4gSW4gYSBmaXggcnVuIChmaW5kaW5nc1xuICogY2Fycnlpbmcge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC8ge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuc2tpcFJlYXNvbn0pIGVhY2ggY2hhbmdlXG4gKiByb3cgaXMgc3VmZml4ZWQgd2l0aCBgW2ZpeGVkXWAgb3IgYFtza2lwcGVkOiBcdTIwMjZdYCwgYW5kIHRoZSB0cmFpbGluZyBzdW1tYXJ5IGFwcGVuZHMgdGhlIGZpeGVkL3NraXBwZWRcbiAqIGNvdW50cy5cbiAqXG4gKiBAcGFyYW0gZmluZGluZ3MgLSBUaGUgZmluZGluZ3MgdG8gZm9ybWF0LlxuICogQHBhcmFtIG9wdGlvbnMgLSBUaGUge0BsaW5rIEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9uc30uXG4gKiBAcmV0dXJucyBUaGUgcmVwb3J0IHRleHQuIEVtcHR5LWZpbmRpbmcgaW5wdXQgeWllbGRzIGEgc2luZ2xlIFwibm8gZmluZGluZ3NcIiBsaW5lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3MoZmluZGluZ3M6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSwgb3B0aW9ucz86IEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9ucyk6IHN0cmluZyB7XG4gIGlmIChmaW5kaW5ncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ05vIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgZm91bmQuXFxuJztcbiAgfVxuXG4gIGNvbnN0IGJhc2VGb2xkZXIgPSBvcHRpb25zPy5iYXNlRm9sZGVyID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0b0Nhbm9uaWNhbChvcHRpb25zLmJhc2VGb2xkZXIpO1xuICBjb25zdCBsaW5lcyA9IGZvcm1hdEZpbmRpbmdCbG9ja3MoZmluZGluZ3MsIGJhc2VGb2xkZXIpO1xuICBsaW5lcy5wdXNoKGZvcm1hdFN1bW1hcnkoZmluZGluZ3MpKTtcbiAgcmV0dXJuIGAke2xpbmVzLmpvaW4oJ1xcbicpfVxcbmA7XG59XG5cbmZ1bmN0aW9uIGFuYWx5emVFeHBvcnQobm9kZTogTm9kZSwgY29udGV4dDogQW5hbHlzaXNDb250ZXh0KTogdm9pZCB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgaWYgKG5vZGUucGFyZW50ICE9PSBzb3VyY2VGaWxlIHx8ICFnZXRNb2RpZmllcktpbmRzKG5vZGUpLmhhcyhTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVjbGFyYXRpb24gPSBhc0V4cG9ydGFibGVEZWNsYXJhdGlvbihub2RlKTtcbiAgaWYgKCFkZWNsYXJhdGlvbikge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChoYXNUc0RvY0NvbW1lbnQoZGVjbGFyYXRpb24pKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVjbEZpbGVQYXRoID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gIGNvbnN0IG5hbWVOb2RlcyA9IGdldEV4cG9ydGVkTmFtZU5vZGVzKGRlY2xhcmF0aW9uKTtcbiAgY29uc3QgY2FuZGlkYXRlczogRXhwb3J0RmluZGluZ0NhbmRpZGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgbmFtZU5vZGUgb2YgbmFtZU5vZGVzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSk7XG4gICAgY29uc3Qgb3RoZXJGaWxlUmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+IHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgIT09IGRlY2xGaWxlUGF0aCk7XG5cbiAgICBpZiAob3RoZXJGaWxlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyh7XG4gICAgICAgICAgY3VycmVudEV4cG9zdXJlOiAnZXhwb3J0JyxcbiAgICAgICAgICBmbGFnczogeyBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZhbHNlIH0sXG4gICAgICAgICAgbmFtZU5vZGUsXG4gICAgICAgICAgbm9kZTogZGVjbGFyYXRpb24sXG4gICAgICAgICAgc3VnZ2VzdGVkRXhwb3N1cmU6ICdmaWxlLWxvY2FsJ1xuICAgICAgICB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IG90aGVyRmlsZVJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcbiAgICBpZiAobm9uVGVzdFJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoe1xuICAgICAgICAgIGN1cnJlbnRFeHBvc3VyZTogJ2V4cG9ydCcsXG4gICAgICAgICAgZmxhZ3M6IHsgaGFzTm9SZWZlcmVuY2VzOiBmYWxzZSwgaXNGb3JjZWRCeVRlc3RPbmx5OiB0cnVlIH0sXG4gICAgICAgICAgbmFtZU5vZGUsXG4gICAgICAgICAgbm9kZTogZGVjbGFyYXRpb24sXG4gICAgICAgICAgc3VnZ2VzdGVkRXhwb3N1cmU6ICdmaWxlLWxvY2FsJ1xuICAgICAgICB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhbkRyb3BFeHBvcnQgPSBjYW5kaWRhdGVzLmxlbmd0aCA9PT0gbmFtZU5vZGVzLmxlbmd0aCAmJiBjYW5kaWRhdGVzLmV2ZXJ5KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pc1BsYWluRmlsZUxvY2FsIHx8IGNvbnRleHQuc2hvdWxkRm9yY2UpO1xuICBjb25zdCBleHBvcnRFZGl0ID0gY2FuRHJvcEV4cG9ydCA/IGNvbXB1dGVFeHBvcnRSZW1vdmFsRWRpdChkZWNsYXJhdGlvbikgOiBudWxsO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgcmVjb3JkKHtcbiAgICAgIGNvbnRleHQsXG4gICAgICBlZGl0OiBleHBvcnRFZGl0LFxuICAgICAgZmluZGluZzogY2FuZGlkYXRlLmZpbmRpbmdcbiAgICB9KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBhbmFseXplTWVtYmVyKG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBtZW1iZXIgPSBhc0NsYXNzTWVtYmVyKG5vZGUpO1xuICBpZiAoIW1lbWJlciB8fCAhaXNDbGFzc0xpa2Uobm9kZS5wYXJlbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG5hbWVOb2RlID0gbWVtYmVyLm5hbWU7XG4gIGNvbnN0IGRlY2xhcmluZ0NsYXNzID0gbm9kZS5wYXJlbnQ7XG5cbiAgaWYgKGlzUHJpdmF0ZUlkZW50aWZpZXIobmFtZU5vZGUpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgbW9kaWZpZXJLaW5kcyA9IGdldE1vZGlmaWVyS2luZHMobWVtYmVyKTtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgfHwgbW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5PdmVycmlkZUtleXdvcmQpIHx8IExJRkVDWUNMRV9BTExPV0xJU1QuaGFzKG5hbWVOb2RlLmdldFRleHQoKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoaGFzVHNEb2NDb21tZW50KG1lbWJlcikpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50RXhwb3N1cmUgPSBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kcyk7XG4gIGlmIChjdXJyZW50RXhwb3N1cmUgPT09ICdwcml2YXRlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBtZW1iZXIuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCBkaXJlY3RSZWZlcmVuY2VzID0gY29sbGVjdFJlZmVyZW5jZXMoY29udGV4dC5sYW5ndWFnZVNlcnZpY2UuZmluZFJlZmVyZW5jZXMoc291cmNlRmlsZS5maWxlTmFtZSwgbmFtZU5vZGUuZ2V0U3RhcnQoKSkpXG4gICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSk7XG4gIGNvbnN0IHJlZmVyZW5jZXMgPSBbLi4uZGlyZWN0UmVmZXJlbmNlcywgLi4uY29sbGVjdFN0cmluZ0xpdGVyYWxSZWZlcmVuY2VzKHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIG5hbWVOb2RlIH0pXTtcbiAgY29uc3Qgbm9uVGVzdFJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNUZXN0RmlsZSh0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpKSk7XG5cbiAgY29uc3QgbmVlZGVkRm9yU3JjID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHsgY29udGV4dCwgZGVjbGFyaW5nQ2xhc3MsIHJlZmVyZW5jZXM6IG5vblRlc3RSZWZlcmVuY2VzIH0pO1xuICBjb25zdCBuZWVkZWRXaXRoVGVzdHMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUoeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgcmVmZXJlbmNlcyB9KTtcblxuICBpZiAobmVlZGVkRm9yU3JjID09PSAncHVibGljJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKSA+PSByYW5rRXhwb3N1cmUoY3VycmVudEV4cG9zdXJlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbmRpbmcgPSBidWlsZEZpbmRpbmcoe1xuICAgIGN1cnJlbnRFeHBvc3VyZSxcbiAgICBmbGFnczoge1xuICAgICAgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCxcbiAgICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICAgIH0sXG4gICAgbmFtZU5vZGUsXG4gICAgbm9kZTogbWVtYmVyLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlOiBuZWVkZWRGb3JTcmNcbiAgfSk7XG4gIHJlY29yZCh7XG4gICAgY29udGV4dCxcbiAgICBlZGl0OiBjb21wdXRlTWVtYmVyRXhwb3N1cmVFZGl0KG1lbWJlciwgbmVlZGVkRm9yU3JjKSxcbiAgICBmaW5kaW5nXG4gIH0pO1xufVxuXG5mdW5jdGlvbiBhcHBseUVkaXRzKHRleHQ6IHN0cmluZywgZWRpdHM6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZVRleHRFZGl0W10pOiBzdHJpbmcge1xuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IHVuaXF1ZUVkaXRzID0gZWRpdHNcbiAgICAuZmlsdGVyKChlZGl0KSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgJHtTdHJpbmcoZWRpdC5zdGFydCl9OiR7U3RyaW5nKGVkaXQubGVuZ3RoKX06JHtlZGl0Lm5ld1RleHR9YDtcbiAgICAgIGlmIChzZWVuLmhhcyhrZXkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC5zb3J0KChhLCBiKSA9PiBiLnN0YXJ0IC0gYS5zdGFydCk7XG5cbiAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gIGZvciAoY29uc3QgZWRpdCBvZiB1bmlxdWVFZGl0cykge1xuICAgIHJlc3VsdCA9IGAke3Jlc3VsdC5zbGljZSgwLCBlZGl0LnN0YXJ0KX0ke2VkaXQubmV3VGV4dH0ke3Jlc3VsdC5zbGljZShlZGl0LnN0YXJ0ICsgZWRpdC5sZW5ndGgpfWA7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXBwbHlPdmVyRXhwb3N1cmVGaXhlcyhwYXJhbXM6IEFwcGx5T3ZlckV4cG9zdXJlRml4ZXNQYXJhbXMpOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCB7IHByb2dyYW0sIHJlc3VsdCwgc2hvdWxkRm9yY2UsIHdyaXRlRmlsZSB9ID0gcGFyYW1zO1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbih7IGVkaXQsIGZpbmRpbmcsIHNob3VsZEZvcmNlIH0pO1xuICAgIGlmIChza2lwUmVhc29uICE9PSBudWxsKSB7XG4gICAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uLCB3YXNGaXhlZDogZmFsc2UgfTtcbiAgICB9XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZWRpdCwgJ0EgZml4YWJsZSBmaW5kaW5nIG11c3QgY2FycnkgYSB0ZXh0IGVkaXQuJyk7XG4gICAgY29uc3QgZmlsZUVkaXRzID0gZWRpdHNCeUZpbGUuZ2V0KGVkaXQuZmlsZU5hbWUpID8/IFtdO1xuICAgIGZpbGVFZGl0cy5wdXNoKGVkaXQpO1xuICAgIGVkaXRzQnlGaWxlLnNldChlZGl0LmZpbGVOYW1lLCBmaWxlRWRpdHMpO1xuICAgIHJldHVybiB7IC4uLmZpbmRpbmcsIHNraXBSZWFzb246IG51bGwsIHdhc0ZpeGVkOiB0cnVlIH07XG4gIH0pO1xuXG4gIGlmIChlZGl0c0J5RmlsZS5zaXplID4gMCkge1xuICAgIGFzc2VydE5vbk51bGxhYmxlKHByb2dyYW0sICdBIHByb2dyYW0gaXMgZXhwZWN0ZWQgd2hlbiB0aGVyZSBhcmUgZWRpdHMgdG8gYXBwbHkuJyk7XG4gICAgY29uc3Qgc291cmNlVGV4dEJ5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VGaWxlVGV4dD4oKTtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZUZpbGUgb2YgcHJvZ3JhbS5nZXRTb3VyY2VGaWxlcygpKSB7XG4gICAgICBzb3VyY2VUZXh0QnlGaWxlLnNldCh0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSwgeyBmaWxlTmFtZTogc291cmNlRmlsZS5maWxlTmFtZSwgdGV4dDogc291cmNlRmlsZS50ZXh0IH0pO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtjYW5vbmljYWxGaWxlTmFtZSwgZmlsZUVkaXRzXSBvZiBlZGl0c0J5RmlsZSkge1xuICAgICAgY29uc3Qgc291cmNlID0gc291cmNlVGV4dEJ5RmlsZS5nZXQoY2Fub25pY2FsRmlsZU5hbWUpO1xuICAgICAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7Y2Fub25pY2FsRmlsZU5hbWV9YCk7XG4gICAgICB3cml0ZUZpbGUoc291cmNlLmZpbGVOYW1lLCBhcHBseUVkaXRzKHNvdXJjZS50ZXh0LCBmaWxlRWRpdHMpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmluZGluZ3M7XG59XG5cbmZ1bmN0aW9uIGFzQ2xhc3NNZW1iZXIobm9kZTogTm9kZSk6IENsYXNzTWVtYmVyRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGU6IE5vZGUpOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBpZiAoXG4gICAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc0VudW1EZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSlcbiAgKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gYnVpbGRGaW5kaW5nKHBhcmFtczogQnVpbGRGaW5kaW5nUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZyB7XG4gIGNvbnN0IHsgY3VycmVudEV4cG9zdXJlLCBmbGFncywgbmFtZU5vZGUsIG5vZGUsIHN1Z2dlc3RlZEV4cG9zdXJlIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgeyBjaGFyYWN0ZXIsIGxpbmUgfSA9IHNvdXJjZUZpbGUuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24obmFtZU5vZGUuZ2V0U3RhcnQoKSk7XG4gIHJldHVybiB7XG4gICAgY29sdW1uOiBjaGFyYWN0ZXIgKyAxLFxuICAgIGN1cnJlbnRFeHBvc3VyZSxcbiAgICBmaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgaGFzTm9SZWZlcmVuY2VzOiBmbGFncy5oYXNOb1JlZmVyZW5jZXMsXG4gICAgaXNGb3JjZWRCeVRlc3RPbmx5OiBmbGFncy5pc0ZvcmNlZEJ5VGVzdE9ubHksXG4gICAgaXNNZW1iZXI6IGN1cnJlbnRFeHBvc3VyZSAhPT0gJ2V4cG9ydCcsXG4gICAgbGluZTogbGluZSArIDEsXG4gICAgbmFtZTogbmFtZU5vZGUuZ2V0VGV4dCgpLFxuICAgIHNraXBSZWFzb246IG51bGwsXG4gICAgc3VnZ2VzdGVkRXhwb3N1cmUsXG4gICAgd2FzRml4ZWQ6IGZhbHNlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGJ1aWxkU3RyaW5nTGl0ZXJhbEluZGV4KHByb2dyYW06IFByb2dyYW0pOiBSZWFkb25seU1hcDxzdHJpbmcsIHJlYWRvbmx5IFN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlW10+IHtcbiAgY29uc3QgaW5kZXggPSBuZXcgTWFwPHN0cmluZywgU3RyaW5nTGl0ZXJhbE9jY3VycmVuY2VbXT4oKTtcbiAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKSkge1xuICAgIGlmIChzb3VyY2VGaWxlLmlzRGVjbGFyYXRpb25GaWxlKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29sbGVjdEluTm9kZShzb3VyY2VGaWxlKTtcbiAgfVxuICByZXR1cm4gaW5kZXg7XG5cbiAgZnVuY3Rpb24gY29sbGVjdEluTm9kZShub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgaWYgKGlzU3RyaW5nTGl0ZXJhbExpa2Uobm9kZSkpIHtcbiAgICAgIGNvbnN0IG9jY3VycmVuY2VzID0gaW5kZXguZ2V0KG5vZGUudGV4dCkgPz8gW107XG4gICAgICBvY2N1cnJlbmNlcy5wdXNoKHsgbm9kZSwgc291cmNlRmlsZTogbm9kZS5nZXRTb3VyY2VGaWxlKCkgfSk7XG4gICAgICBpbmRleC5zZXQobm9kZS50ZXh0LCBvY2N1cnJlbmNlcyk7XG4gICAgfVxuICAgIG5vZGUuZm9yRWFjaENoaWxkKGNvbGxlY3RJbk5vZGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNvbGxlY3RSZWZlcmVuY2VzKHJlZmVyZW5jZWRTeW1ib2xzOiBSZWZlcmVuY2VkU3ltYm9sW10gfCB1bmRlZmluZWQpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZWRTeW1ib2wgb2YgcmVmZXJlbmNlZFN5bWJvbHMgPz8gW10pIHtcbiAgICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VkU3ltYm9sLnJlZmVyZW5jZXMpIHtcbiAgICAgIHJlZmVyZW5jZXMucHVzaCh7IGZpbGVOYW1lOiByZWZlcmVuY2UuZmlsZU5hbWUsIHN0YXJ0OiByZWZlcmVuY2UudGV4dFNwYW4uc3RhcnQgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZWZlcmVuY2VzO1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXMocGFyYW1zOiBDb2xsZWN0U3RyaW5nTGl0ZXJhbFJlZmVyZW5jZXNQYXJhbXMpOiBSZWZlcmVuY2VMb2NhdGlvbltdIHtcbiAgY29uc3QgeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgbmFtZU5vZGUgfSA9IHBhcmFtcztcbiAgY29uc3Qgb2NjdXJyZW5jZXMgPSBjb250ZXh0LnN0cmluZ0xpdGVyYWxPY2N1cnJlbmNlc0J5VGV4dC5nZXQobmFtZU5vZGUuZ2V0VGV4dCgpKTtcbiAgaWYgKCFvY2N1cnJlbmNlcyB8fCBvY2N1cnJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBrZXlTZXQgPSBnZXRDbGFzc0tleVNldChkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKTtcbiAgY29uc3QgcmVmZXJlbmNlczogUmVmZXJlbmNlTG9jYXRpb25bXSA9IFtdO1xuICBmb3IgKGNvbnN0IG9jY3VycmVuY2Ugb2Ygb2NjdXJyZW5jZXMpIHtcbiAgICBpZiAoaXNLZXlSZWZlcmVuY2VUb0NsYXNzKHsgY2hlY2tlcjogY29udGV4dC5jaGVja2VyLCBrZXlTZXQsIG5vZGU6IG9jY3VycmVuY2Uubm9kZSB9KSkge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IG9jY3VycmVuY2Uuc291cmNlRmlsZS5maWxlTmFtZSwgc3RhcnQ6IG9jY3VycmVuY2Uubm9kZS5nZXRTdGFydCgpIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24pOiBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhkZWNsYXJhdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG1vZGlmaWVycywgJ01vZGlmaWVycyBleHBlY3RlZCBvbiBhbiBleHBvcnRlZCBkZWNsYXJhdGlvbi4nKTtcbiAgY29uc3QgZXhwb3J0TW9kaWZpZXIgPSBtb2RpZmllcnMuZmluZCgobW9kaWZpZXIpID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCk7XG4gIGFzc2VydE5vbk51bGxhYmxlKGV4cG9ydE1vZGlmaWVyLCAnRXhwb3J0IG1vZGlmaWVyIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCB7IHRleHQgfSA9IHNvdXJjZUZpbGU7XG4gIGxldCBlbmQgPSBleHBvcnRNb2RpZmllci5nZXRFbmQoKTtcbiAgd2hpbGUgKGVuZCA8IHRleHQubGVuZ3RoICYmIFdISVRFU1BBQ0VfUEFUVEVSTi50ZXN0KHRleHQuY2hhckF0KGVuZCkpKSB7XG4gICAgZW5kKys7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZTogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgbGVuZ3RoOiBlbmQgLSBleHBvcnRNb2RpZmllci5nZXRTdGFydCgpLFxuICAgIG5ld1RleHQ6ICcnLFxuICAgIHN0YXJ0OiBleHBvcnRNb2RpZmllci5nZXRTdGFydCgpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyOiBDbGFzc01lbWJlckRlY2xhcmF0aW9uLCBzdWdnZXN0ZWRFeHBvc3VyZTogJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcpOiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICBpZiAoKGdldERlY29yYXRvcnMobWVtYmVyKSA/PyBbXSkubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGZpbGVOYW1lID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhtZW1iZXIpID8/IFtdO1xuICBjb25zdCB2aXNpYmlsaXR5TW9kaWZpZXIgPSBtb2RpZmllcnMuZmluZCgobW9kaWZpZXIpID0+IFZJU0lCSUxJVFlfTU9ESUZJRVJfS0lORFMuaGFzKG1vZGlmaWVyLmtpbmQpKTtcbiAgaWYgKHZpc2liaWxpdHlNb2RpZmllcikge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGxlbmd0aDogdmlzaWJpbGl0eU1vZGlmaWVyLmdldEVuZCgpIC0gdmlzaWJpbGl0eU1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgICBuZXdUZXh0OiBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICAgIHN0YXJ0OiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKVxuICAgIH07XG4gIH1cblxuICBjb25zdCBmaXJzdE1vZGlmaWVyID0gbW9kaWZpZXJzWzBdO1xuICBjb25zdCBpbnNlcnRTdGFydCA9IGZpcnN0TW9kaWZpZXIgPyBmaXJzdE1vZGlmaWVyLmdldFN0YXJ0KCkgOiBtZW1iZXIuZ2V0U3RhcnQoKTtcbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZSxcbiAgICBsZW5ndGg6IDAsXG4gICAgbmV3VGV4dDogYCR7c3VnZ2VzdGVkRXhwb3N1cmV9IGAsXG4gICAgc3RhcnQ6IGluc2VydFN0YXJ0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVOZWVkZWRFeHBvc3VyZShwYXJhbXM6IENvbXB1dGVOZWVkZWRFeHBvc3VyZVBhcmFtcyk6IE1lbWJlckV4cG9zdXJlIHtcbiAgY29uc3QgeyBjb250ZXh0LCBkZWNsYXJpbmdDbGFzcywgcmVmZXJlbmNlcyB9ID0gcGFyYW1zO1xuICBpZiAocmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG5cbiAgbGV0IG5lZWRlZDogTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZSc7XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZXMpIHtcbiAgICBjb25zdCByZWZlcmVuY2VDbGFzcyA9IGdldENsYXNzQXRQb3NpdGlvbih7IGZpbGVOYW1lOiByZWZlcmVuY2UuZmlsZU5hbWUsIHBvc2l0aW9uOiByZWZlcmVuY2Uuc3RhcnQsIHByb2dyYW06IGNvbnRleHQucHJvZ3JhbSB9KTtcbiAgICBpZiAocmVmZXJlbmNlQ2xhc3MgPT09IGRlY2xhcmluZ0NsYXNzKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzICYmIGlzRGVyaXZlZEZyb20oeyBiYXNlOiBkZWNsYXJpbmdDbGFzcywgY2hlY2tlcjogY29udGV4dC5jaGVja2VyLCBkZXJpdmVkOiByZWZlcmVuY2VDbGFzcyB9KSkge1xuICAgICAgbmVlZGVkID0gJ3Byb3RlY3RlZCc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiBuZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRml4U3RhdHVzKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZy53YXNGaXhlZCkge1xuICAgIHJldHVybiAnIFtmaXhlZF0nO1xuICB9XG4gIGlmIChmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gYCBbc2tpcHBlZDogJHtTS0lQX1JFQVNPTl9ERVNDUklQVElPTltmaW5kaW5nLnNraXBSZWFzb25dfV1gO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBgcmVmZXJlbmNlZCBvbmx5ICR7U0NPUEVfREVTQ1JJUFRJT05bZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZV19YDtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5KSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChleHBvc2VkIG9ubHkgZm9yIHRlc3RzKWA7XG4gIH1cbiAgaWYgKGZpbmRpbmcuaGFzTm9SZWZlcmVuY2VzKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChubyByZWZlcmVuY2VzIGF0IGFsbClgO1xuICB9XG4gIHJldHVybiBiYXNlO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVTa2lwUmVhc29uKHBhcmFtczogRGV0ZXJtaW5lU2tpcFJlYXNvblBhcmFtcyk6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgY29uc3QgeyBlZGl0LCBmaW5kaW5nLCBzaG91bGRGb3JjZSB9ID0gcGFyYW1zO1xuICBpZiAoZmluZGluZy5pc0ZvcmNlZEJ5VGVzdE9ubHkgJiYgIXNob3VsZEZvcmNlKSB7XG4gICAgcmV0dXJuICd0ZXN0LW9ubHknO1xuICB9XG4gIGlmICghZWRpdCkge1xuICAgIHJldHVybiBmaW5kaW5nLmlzTWVtYmVyID8gJ2RlY29yYXRlZCcgOiAnc2hhcmVkLWV4cG9ydCc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmROb2RlQXRQb3NpdGlvbihub2RlOiBOb2RlLCBwb3NpdGlvbjogbnVtYmVyKTogTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChwb3NpdGlvbiA8IG5vZGUuZ2V0U3RhcnQoKSB8fCBwb3NpdGlvbiA+PSBub2RlLmdldEVuZCgpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgcmVzdWx0OiBOb2RlID0gbm9kZTtcbiAgbm9kZS5mb3JFYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgY29uc3QgZm91bmQgPSBmaW5kTm9kZUF0UG9zaXRpb24oY2hpbGQsIHBvc2l0aW9uKTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHJlc3VsdCA9IGZvdW5kO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbmRpbmdCbG9ja3MoZmluZGluZ3M6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSwgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBjb25zdCBieUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlRmluZGluZ1tdPigpO1xuICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICBjb25zdCBsaXN0ID0gYnlGaWxlLmdldChmaW5kaW5nLmZpbGVQYXRoKSA/PyBbXTtcbiAgICBsaXN0LnB1c2goZmluZGluZyk7XG4gICAgYnlGaWxlLnNldChmaW5kaW5nLmZpbGVQYXRoLCBsaXN0KTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgbGlzdF0gb2YgYnlGaWxlKSB7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmxpc3RdLnNvcnQoKGEsIGIpID0+IGEubGluZSAtIGIubGluZSk7XG4gICAgY29uc3QgbG9jYXRpb25XaWR0aCA9IE1hdGgubWF4KC4uLnNvcnRlZC5tYXAoKGZpbmRpbmcpID0+IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5sZW5ndGgpKTtcbiAgICBsaW5lcy5wdXNoKHRvRGlzcGxheVBhdGgoeyBiYXNlRm9sZGVyLCBmaWxlUGF0aCB9KSk7XG4gICAgZm9yIChjb25zdCBmaW5kaW5nIG9mIHNvcnRlZCkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWAucGFkRW5kKGxvY2F0aW9uV2lkdGgpO1xuICAgICAgY29uc3QgY2hhbmdlID0gYCR7ZmluZGluZy5jdXJyZW50RXhwb3N1cmV9ICR7ZmluZGluZy5uYW1lfSAtPiAke2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmV9YDtcbiAgICAgIGxpbmVzLnB1c2goYCAgJHtsb2NhdGlvbn0gICR7Y2hhbmdlfSAtLSAke2Rlc2NyaWJlUmVhc29uKGZpbmRpbmcpfSR7ZGVzY3JpYmVGaXhTdGF0dXMoZmluZGluZyl9YCk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJycpO1xuICB9XG4gIHJldHVybiBsaW5lcztcbn1cblxuZnVuY3Rpb24gZm9ybWF0U3VtbWFyeShmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3VtbWFyeSA9IGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmA7XG4gIGNvbnN0IGZpeGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcud2FzRml4ZWQpLmxlbmd0aDtcbiAgY29uc3Qgc2tpcHBlZENvdW50ID0gZmluZGluZ3MuZmlsdGVyKChmaW5kaW5nKSA9PiBmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpLmxlbmd0aDtcbiAgaWYgKGZpeGVkQ291bnQgPT09IDAgJiYgc2tpcHBlZENvdW50ID09PSAwKSB7XG4gICAgcmV0dXJuIHN1bW1hcnk7XG4gIH1cbiAgcmV0dXJuIGAke3N1bW1hcnl9ICR7U3RyaW5nKGZpeGVkQ291bnQpfSBmaXhlZCwgJHtTdHJpbmcoc2tpcHBlZENvdW50KX0gc2tpcHBlZC5gO1xufVxuXG5mdW5jdGlvbiBnZXRDbGFzc0F0UG9zaXRpb24ocGFyYW1zOiBHZXRDbGFzc0F0UG9zaXRpb25QYXJhbXMpOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHsgZmlsZU5hbWUsIHBvc2l0aW9uLCBwcm9ncmFtIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGUoZmlsZU5hbWUpO1xuICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2VGaWxlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7ZmlsZU5hbWV9YCk7XG4gIGNvbnN0IG5vZGUgPSBmaW5kTm9kZUF0UG9zaXRpb24oc291cmNlRmlsZSwgcG9zaXRpb24pO1xuICBhc3NlcnROb25OdWxsYWJsZShub2RlLCBgTm8gbm9kZSBmb3VuZCBhdCBwb3NpdGlvbiAke1N0cmluZyhwb3NpdGlvbil9IGluICR7ZmlsZU5hbWV9YCk7XG4gIHJldHVybiBnZXRFbmNsb3NpbmdDbGFzcyhub2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xhc3NLZXlTZXQoZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IFJlYWRvbmx5U2V0PHN0cmluZz4ge1xuICBjb25zdCBjbGFzc1N5bWJvbCA9IGRlY2xhcmluZ0NsYXNzLm5hbWUgPyBjaGVja2VyLmdldFN5bWJvbEF0TG9jYXRpb24oZGVjbGFyaW5nQ2xhc3MubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGNsYXNzVHlwZSA9IGNsYXNzU3ltYm9sID8gY2hlY2tlci5nZXREZWNsYXJlZFR5cGVPZlN5bWJvbChjbGFzc1N5bWJvbCkgOiBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKGRlY2xhcmluZ0NsYXNzKTtcbiAgcmV0dXJuIG5ldyBTZXQoY2xhc3NUeXBlLmdldFByb3BlcnRpZXMoKS5tYXAoKHByb3BlcnR5KSA9PiBwcm9wZXJ0eS5uYW1lKSk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzOiBSZWFkb25seVNldDxTeW50YXhLaW5kPik6IE1lbWJlckV4cG9zdXJlIHtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJvdGVjdGVkJztcbiAgfVxuICByZXR1cm4gJ3B1YmxpYyc7XG59XG5cbmZ1bmN0aW9uIGdldEVuY2xvc2luZ0NsYXNzKG5vZGU6IE5vZGUpOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBOb2RlID0gbm9kZTtcbiAgd2hpbGUgKCFpc1NvdXJjZUZpbGUoY3VycmVudCkpIHtcbiAgICBpZiAoaXNDbGFzc0xpa2UoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE5vZGVbXSB7XG4gIGlmIChpc1ZhcmlhYmxlU3RhdGVtZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybiBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLm1hcCgodmFyaWFibGVEZWNsYXJhdGlvbikgPT4gdmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lKS5maWx0ZXIoaXNJZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gZGVjbGFyYXRpb24ubmFtZSA/IFtkZWNsYXJhdGlvbi5uYW1lXSA6IFtdO1xufVxuXG5mdW5jdGlvbiBnZXRNb2RpZmllcktpbmRzKG5vZGU6IE5vZGUpOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiB7XG4gIGNvbnN0IGtpbmRzID0gbmV3IFNldDxTeW50YXhLaW5kPigpO1xuICBpZiAoY2FuSGF2ZU1vZGlmaWVycyhub2RlKSkge1xuICAgIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgZ2V0TW9kaWZpZXJzKG5vZGUpID8/IFtdKSB7XG4gICAgICBraW5kcy5hZGQobW9kaWZpZXIua2luZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBraW5kcztcbn1cblxuZnVuY3Rpb24gZ2V0U3RyaW5nTGl0ZXJhbENvbnN0aXR1ZW50cyh0eXBlOiBUeXBlKTogbnVsbCB8IHN0cmluZ1tdIHtcbiAgaWYgKHR5cGUuaXNTdHJpbmdMaXRlcmFsKCkpIHtcbiAgICByZXR1cm4gW3R5cGUudmFsdWVdO1xuICB9XG4gIGlmICh0eXBlLmlzVW5pb24oKSkge1xuICAgIGNvbnN0IGxpdGVyYWxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY29uc3RpdHVlbnQgb2YgdHlwZS50eXBlcykge1xuICAgICAgaWYgKCFjb25zdGl0dWVudC5pc1N0cmluZ0xpdGVyYWwoKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGxpdGVyYWxzLnB1c2goY29uc3RpdHVlbnQudmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gbGl0ZXJhbHM7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGhhc1RzRG9jQ29tbWVudChub2RlOiBOb2RlKTogYm9vbGVhbiB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgZnVsbFRleHQgPSBzb3VyY2VGaWxlLmdldEZ1bGxUZXh0KCk7XG4gIGNvbnN0IGNvbW1lbnRSYW5nZXMgPSBnZXRMZWFkaW5nQ29tbWVudFJhbmdlcyhmdWxsVGV4dCwgbm9kZS5nZXRGdWxsU3RhcnQoKSkgPz8gW107XG4gIHJldHVybiBjb21tZW50UmFuZ2VzLnNvbWUoKHJhbmdlKSA9PlxuICAgIHJhbmdlLmtpbmQgPT09IFN5bnRheEtpbmQuTXVsdGlMaW5lQ29tbWVudFRyaXZpYVxuICAgICYmIGZ1bGxUZXh0LmNoYXJBdChyYW5nZS5wb3MgKyBKU0RPQ19TRUNPTkRfQVNURVJJU0tfT0ZGU0VUKSA9PT0gJyonXG4gICAgJiYgZnVsbFRleHQuY2hhckF0KHJhbmdlLnBvcyArIEpTRE9DX0ZPVVJUSF9DSEFSQUNURVJfT0ZGU0VUKSAhPT0gJy8nXG4gICk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlOiBSZWZlcmVuY2VMb2NhdGlvbiwgbmFtZU5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgPT09IHRvQ2Fub25pY2FsKG5hbWVOb2RlLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSkgJiYgcmVmZXJlbmNlLnN0YXJ0ID09PSBuYW1lTm9kZS5nZXRTdGFydCgpO1xufVxuXG5mdW5jdGlvbiBpc0Rlcml2ZWRGcm9tKHBhcmFtczogSXNEZXJpdmVkRnJvbVBhcmFtcyk6IGJvb2xlYW4ge1xuICBjb25zdCB7IGJhc2UsIGNoZWNrZXIsIGRlcml2ZWQgfSA9IHBhcmFtcztcbiAgY29uc3QgYmFzZVN5bWJvbCA9IGJhc2UubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihiYXNlLm5hbWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWJhc2VTeW1ib2wpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBkZXJpdmVkLmhlcml0YWdlQ2xhdXNlcyA/PyBbXSkge1xuICAgIGlmIChjbGF1c2UudG9rZW4gIT09IFN5bnRheEtpbmQuRXh0ZW5kc0tleXdvcmQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHR5cGVFeHByZXNzaW9uIG9mIGNsYXVzZS50eXBlcykge1xuICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbih0eXBlRXhwcmVzc2lvbi5leHByZXNzaW9uKS5nZXRTeW1ib2woKTtcbiAgICAgIGlmIChzeW1ib2wgPT09IGJhc2VTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbD8uZGVjbGFyYXRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmIChpc0NsYXNzTGlrZShkZWNsYXJhdGlvbikgJiYgaXNEZXJpdmVkRnJvbSh7IGJhc2UsIGNoZWNrZXIsIGRlcml2ZWQ6IGRlY2xhcmF0aW9uIH0pKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5mdW5jdGlvbiBpc0tleVJlZmVyZW5jZVRvQ2xhc3MocGFyYW1zOiBJc0tleVJlZmVyZW5jZVRvQ2xhc3NQYXJhbXMpOiBib29sZWFuIHtcbiAgY29uc3QgeyBjaGVja2VyLCBrZXlTZXQsIG5vZGUgfSA9IHBhcmFtcztcbiAgY29uc3QgY29udGV4dHVhbFR5cGUgPSBjaGVja2VyLmdldENvbnRleHR1YWxUeXBlKG5vZGUpO1xuICBpZiAoIWNvbnRleHR1YWxUeXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IGxpdGVyYWxzID0gZ2V0U3RyaW5nTGl0ZXJhbENvbnN0aXR1ZW50cyhjb250ZXh0dWFsVHlwZSk7XG4gIGlmICghbGl0ZXJhbHMpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGxpdGVyYWxzLmV2ZXJ5KChsaXRlcmFsKSA9PiBrZXlTZXQuaGFzKGxpdGVyYWwpKTtcbn1cblxuZnVuY3Rpb24gaXNPd25Tb3VyY2VGaWxlKHBhcmFtczogSXNPd25Tb3VyY2VGaWxlUGFyYW1zKTogYm9vbGVhbiB7XG4gIGNvbnN0IHsgZmlsZVBhdGgsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuXG5mdW5jdGlvbiByZWNvcmQocGFyYW1zOiBSZWNvcmRQYXJhbXMpOiB2b2lkIHtcbiAgY29uc3QgeyBjb250ZXh0LCBlZGl0LCBmaW5kaW5nIH0gPSBwYXJhbXM7XG4gIGNvbnRleHQuZmluZGluZ3MucHVzaChmaW5kaW5nKTtcbiAgY29udGV4dC5lZGl0cy5wdXNoKGVkaXQpO1xufVxuXG5mdW5jdGlvbiBydW5PdmVyRXhwb3N1cmVBbmFseXNpcyhwYXJhbXM6IEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMpOiBBbmFseXNpc1Jlc3VsdCB7XG4gIGNvbnN0IHsgbGFuZ3VhZ2VTZXJ2aWNlLCBvblByb2dyZXNzLCBzcmNGb2xkZXIgfSA9IHBhcmFtcztcbiAgY29uc3QgcHJvZ3JhbSA9IGxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCk7XG4gIGlmICghcHJvZ3JhbSkge1xuICAgIHJldHVybiB7IGVkaXRzOiBbXSwgZmluZGluZ3M6IFtdIH07XG4gIH1cblxuICBjb25zdCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQgPSB7XG4gICAgY2hlY2tlcjogcHJvZ3JhbS5nZXRUeXBlQ2hlY2tlcigpLFxuICAgIGVkaXRzOiBbXSxcbiAgICBmaW5kaW5nczogW10sXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByb2dyYW0sXG4gICAgc2hvdWxkRm9yY2U6IHBhcmFtcy5zaG91bGRGb3JjZSA/PyBmYWxzZSxcbiAgICBzdHJpbmdMaXRlcmFsT2NjdXJyZW5jZXNCeVRleHQ6IGJ1aWxkU3RyaW5nTGl0ZXJhbEluZGV4KHByb2dyYW0pXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKHsgZmlsZVBhdGgsIHNyY0ZvbGRlciB9KSAmJiAhaXNUZXN0RmlsZShmaWxlUGF0aCk7XG4gIH0pO1xuXG4gIGZvciAoY29uc3QgW2FuYWx5emVkRmlsZUNvdW50LCBzb3VyY2VGaWxlXSBvZiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5lbnRyaWVzKCkpIHtcbiAgICBvblByb2dyZXNzPy4oe1xuICAgICAgYW5hbHl6ZWRGaWxlQ291bnQsXG4gICAgICBjdXJyZW50RmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgICAgdG90YWxGaWxlQ291bnQ6IHNvdXJjZUZpbGVzVG9BbmFseXplLmxlbmd0aFxuICAgIH0pO1xuICAgIHZpc2l0KHNvdXJjZUZpbGUpO1xuICB9XG4gIHJldHVybiB7IGVkaXRzOiBjb250ZXh0LmVkaXRzLCBmaW5kaW5nczogY29udGV4dC5maW5kaW5ncyB9O1xuXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGU6IE5vZGUpOiB2b2lkIHtcbiAgICBhbmFseXplTWVtYmVyKG5vZGUsIGNvbnRleHQpO1xuICAgIGFuYWx5emVFeHBvcnQobm9kZSwgY29udGV4dCk7XG4gICAgbm9kZS5mb3JFYWNoQ2hpbGQodmlzaXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvRGlzcGxheVBhdGgocGFyYW1zOiBUb0Rpc3BsYXlQYXRoUGFyYW1zKTogc3RyaW5nIHtcbiAgY29uc3QgeyBiYXNlRm9sZGVyLCBmaWxlUGF0aCB9ID0gcGFyYW1zO1xuICBpZiAoYmFzZUZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7YmFzZUZvbGRlcn0vYCkpIHtcbiAgICByZXR1cm4gZmlsZVBhdGguc2xpY2UoYmFzZUZvbGRlci5sZW5ndGggKyAxKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBMEVBLHdCQTBCTztBQUVQLHlCQUFrQztBQUNsQyxpQ0FHTztBQThPQSxNQUFNLHNCQUEyQyxvQkFBSSxJQUFZO0FBQUEsRUFDdEU7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFDRixDQUFDO0FBeU5ELE1BQU0sK0JBQStCO0FBQ3JDLE1BQU0sZ0NBQWdDO0FBQ3RDLE1BQU0sd0JBQW1ELENBQUMsV0FBVyxhQUFhLFFBQVE7QUFDMUYsTUFBTSxvQkFBdUQ7QUFBQSxFQUMzRCxjQUFjO0FBQUEsRUFDZCxXQUFXO0FBQUEsRUFDWCxhQUFhO0FBQ2Y7QUFDQSxNQUFNLDBCQUFrRTtBQUFBLEVBQ3RFLGFBQWE7QUFBQSxFQUNiLGlCQUFpQjtBQUFBLEVBQ2pCLGFBQWE7QUFDZjtBQUNBLE1BQU0sNEJBQXFELG9C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
|