obsidian-dev-utils 77.0.0 → 78.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 +17 -0
- package/dist/dev/main.js +588 -239
- package/dist/lib/cjs/async.cjs +15 -1
- package/dist/lib/cjs/async.d.cts +8 -0
- package/dist/lib/cjs/html-element.cjs +16 -3
- package/dist/lib/cjs/html-element.d.cts +7 -0
- package/dist/lib/cjs/library.cjs +1 -1
- package/dist/lib/cjs/obsidian/bases-view-registrar.cjs +155 -0
- package/dist/lib/cjs/obsidian/bases-view-registrar.d.cts +52 -0
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.cjs +1 -1
- package/dist/lib/cjs/obsidian/command-handlers/command-handler.d.cts +3 -3
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +64 -53
- package/dist/lib/cjs/obsidian/editor-extension-registrar.cjs +155 -0
- package/dist/lib/cjs/obsidian/editor-extension-registrar.d.cts +37 -0
- package/dist/lib/cjs/obsidian/editor-suggest-registrar.cjs +155 -0
- package/dist/lib/cjs/obsidian/editor-suggest-registrar.d.cts +36 -0
- package/dist/lib/cjs/obsidian/extensions-registrar.cjs +155 -0
- package/dist/lib/cjs/obsidian/extensions-registrar.d.cts +51 -0
- package/dist/lib/cjs/obsidian/hover-link-source-registrar.cjs +155 -0
- package/dist/lib/cjs/obsidian/hover-link-source-registrar.d.cts +52 -0
- package/dist/lib/cjs/obsidian/index.cjs +28 -1
- package/dist/lib/cjs/obsidian/index.d.cts +9 -0
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.cjs +4 -6
- package/dist/lib/cjs/obsidian/markdown-code-block-processor-registrar.d.cts +24 -8
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.cjs +156 -0
- package/dist/lib/cjs/obsidian/markdown-post-processor-registrar.d.cts +57 -0
- package/dist/lib/cjs/obsidian/markdown.cjs +6 -8
- package/dist/lib/cjs/obsidian/modals/alert.cjs +11 -5
- package/dist/lib/cjs/obsidian/modals/confirm.cjs +11 -5
- package/dist/lib/cjs/obsidian/modals/confirm.d.cts +2 -10
- package/dist/lib/cjs/obsidian/modals/modal.cjs +16 -14
- package/dist/lib/cjs/obsidian/modals/modal.d.cts +22 -11
- package/dist/lib/cjs/obsidian/modals/prompt.cjs +11 -5
- package/dist/lib/cjs/obsidian/modals/prompt.d.cts +2 -6
- package/dist/lib/cjs/obsidian/modals/select-item.cjs +23 -16
- package/dist/lib/cjs/obsidian/modals/select-item.d.cts +3 -11
- package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.cjs +5 -6
- package/dist/lib/cjs/obsidian/obsidian-protocol-handler-registrar.d.cts +23 -10
- package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.cjs +156 -0
- package/dist/lib/cjs/obsidian/plugin-cli-handler-registrar.d.cts +64 -0
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.cjs +156 -0
- package/dist/lib/cjs/obsidian/ribbon-icon-registrar.d.cts +60 -0
- package/dist/lib/cjs/obsidian/setting-components/date-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/date-time-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/email-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/file-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/month-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-email-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/multiple-file-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/number-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/password-component.cjs +8 -4
- package/dist/lib/cjs/obsidian/setting-components/password-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.cjs +8 -4
- package/dist/lib/cjs/obsidian/setting-components/telephone-component.d.cts +2 -2
- package/dist/lib/cjs/obsidian/setting-components/time-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.cjs +6 -8
- package/dist/lib/cjs/obsidian/setting-components/typed-text-component.d.cts +19 -4
- package/dist/lib/cjs/obsidian/setting-components/url-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/setting-components/week-component.cjs +6 -2
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.cjs +153 -0
- package/dist/lib/cjs/obsidian/status-bar-item-registrar.d.cts +32 -0
- package/dist/lib/cjs/obsidian/view-registrar.cjs +4 -5
- package/dist/lib/cjs/obsidian/view-registrar.d.cts +20 -7
- package/dist/lib/cjs/script-utils/linters/over-exposure.cjs +250 -72
- package/dist/lib/cjs/script-utils/linters/over-exposure.d.cts +71 -6
- package/dist/lib/cjs/script-utils/nano-staged-config.cjs +10 -2
- package/dist/lib/esm/async.d.mts +8 -0
- package/dist/lib/esm/async.mjs +14 -1
- package/dist/lib/esm/html-element.d.mts +7 -0
- package/dist/lib/esm/html-element.mjs +14 -2
- package/dist/lib/esm/library.mjs +1 -1
- package/dist/lib/esm/obsidian/bases-view-registrar.d.mts +52 -0
- package/dist/lib/esm/obsidian/bases-view-registrar.mjs +47 -0
- package/dist/lib/esm/obsidian/command-handlers/command-handler.d.mts +3 -3
- package/dist/lib/esm/obsidian/command-handlers/command-handler.mjs +1 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +64 -53
- package/dist/lib/esm/obsidian/editor-extension-registrar.d.mts +37 -0
- package/dist/lib/esm/obsidian/editor-extension-registrar.mjs +47 -0
- package/dist/lib/esm/obsidian/editor-suggest-registrar.d.mts +36 -0
- package/dist/lib/esm/obsidian/editor-suggest-registrar.mjs +50 -0
- package/dist/lib/esm/obsidian/extensions-registrar.d.mts +51 -0
- package/dist/lib/esm/obsidian/extensions-registrar.mjs +47 -0
- package/dist/lib/esm/obsidian/hover-link-source-registrar.d.mts +52 -0
- package/dist/lib/esm/obsidian/hover-link-source-registrar.mjs +47 -0
- package/dist/lib/esm/obsidian/index.d.mts +9 -0
- package/dist/lib/esm/obsidian/index.mjs +19 -1
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.d.mts +24 -8
- package/dist/lib/esm/obsidian/markdown-code-block-processor-registrar.mjs +4 -6
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.d.mts +57 -0
- package/dist/lib/esm/obsidian/markdown-post-processor-registrar.mjs +48 -0
- package/dist/lib/esm/obsidian/markdown.mjs +10 -9
- package/dist/lib/esm/obsidian/modals/alert.mjs +11 -6
- package/dist/lib/esm/obsidian/modals/confirm.d.mts +2 -10
- package/dist/lib/esm/obsidian/modals/confirm.mjs +11 -6
- package/dist/lib/esm/obsidian/modals/modal.d.mts +22 -11
- package/dist/lib/esm/obsidian/modals/modal.mjs +16 -13
- package/dist/lib/esm/obsidian/modals/prompt.d.mts +2 -6
- package/dist/lib/esm/obsidian/modals/prompt.mjs +11 -6
- package/dist/lib/esm/obsidian/modals/select-item.d.mts +3 -11
- package/dist/lib/esm/obsidian/modals/select-item.mjs +23 -16
- package/dist/lib/esm/obsidian/obsidian-protocol-handler-registrar.d.mts +23 -10
- package/dist/lib/esm/obsidian/obsidian-protocol-handler-registrar.mjs +5 -6
- package/dist/lib/esm/obsidian/plugin-cli-handler-registrar.d.mts +64 -0
- package/dist/lib/esm/obsidian/plugin-cli-handler-registrar.mjs +48 -0
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.d.mts +60 -0
- package/dist/lib/esm/obsidian/ribbon-icon-registrar.mjs +48 -0
- package/dist/lib/esm/obsidian/setting-components/date-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/date-time-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/email-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/file-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/month-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-email-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/multiple-file-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/number-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/password-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/password-component.mjs +8 -4
- package/dist/lib/esm/obsidian/setting-components/telephone-component.d.mts +2 -2
- package/dist/lib/esm/obsidian/setting-components/telephone-component.mjs +8 -4
- package/dist/lib/esm/obsidian/setting-components/time-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.d.mts +19 -4
- package/dist/lib/esm/obsidian/setting-components/typed-text-component.mjs +6 -8
- package/dist/lib/esm/obsidian/setting-components/url-component.mjs +6 -2
- package/dist/lib/esm/obsidian/setting-components/week-component.mjs +6 -2
- package/dist/lib/esm/obsidian/status-bar-item-registrar.d.mts +32 -0
- package/dist/lib/esm/obsidian/status-bar-item-registrar.mjs +45 -0
- package/dist/lib/esm/obsidian/view-registrar.d.mts +20 -7
- package/dist/lib/esm/obsidian/view-registrar.mjs +4 -5
- package/dist/lib/esm/script-utils/linters/over-exposure.d.mts +71 -6
- package/dist/lib/esm/script-utils/linters/over-exposure.mjs +251 -72
- package/dist/lib/esm/script-utils/nano-staged-config.mjs +10 -2
- package/dist/scripts/linters/over-exposure/find-overexposed-fix.ts +12 -0
- package/dist/scripts/linters/over-exposure/find-overexposed.ts +1 -1
- package/obsidian/bases-view-registrar/package.json +6 -0
- package/obsidian/editor-extension-registrar/package.json +6 -0
- package/obsidian/editor-suggest-registrar/package.json +6 -0
- package/obsidian/extensions-registrar/package.json +6 -0
- package/obsidian/hover-link-source-registrar/package.json +6 -0
- package/obsidian/markdown-post-processor-registrar/package.json +6 -0
- package/obsidian/plugin-cli-handler-registrar/package.json +6 -0
- package/obsidian/ribbon-icon-registrar/package.json +6 -0
- package/obsidian/status-bar-item-registrar/package.json +6 -0
- package/package.json +1 -1
|
@@ -25,6 +25,7 @@ import {
|
|
|
25
25
|
canHaveModifiers,
|
|
26
26
|
createDocumentRegistry,
|
|
27
27
|
createLanguageService,
|
|
28
|
+
getDecorators,
|
|
28
29
|
getDefaultLibFilePath,
|
|
29
30
|
getModifiers,
|
|
30
31
|
isClassDeclaration,
|
|
@@ -67,36 +68,21 @@ const SCOPE_DESCRIPTION = {
|
|
|
67
68
|
"private": "inside its own class",
|
|
68
69
|
"protected": "inside its class + subclasses"
|
|
69
70
|
};
|
|
71
|
+
const SKIP_REASON_DESCRIPTION = {
|
|
72
|
+
"decorated": "decorated member",
|
|
73
|
+
"shared-export": "export shared with a still-exported sibling",
|
|
74
|
+
"test-only": "exposed only for tests"
|
|
75
|
+
};
|
|
76
|
+
const VISIBILITY_MODIFIER_KINDS = /* @__PURE__ */ new Set([SyntaxKind.PrivateKeyword, SyntaxKind.ProtectedKeyword, SyntaxKind.PublicKeyword]);
|
|
77
|
+
const WHITESPACE_PATTERN = /\s/;
|
|
70
78
|
function analyzeOverExposure(params) {
|
|
71
|
-
const
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
return [];
|
|
75
|
-
}
|
|
76
|
-
const context = {
|
|
77
|
-
checker: program.getTypeChecker(),
|
|
78
|
-
findings: [],
|
|
79
|
-
languageService,
|
|
80
|
-
program
|
|
81
|
-
};
|
|
82
|
-
const sourceFilesToAnalyze = program.getSourceFiles().filter((sourceFile) => {
|
|
83
|
-
const filePath = toCanonical(sourceFile.fileName);
|
|
84
|
-
return isOwnSourceFile(filePath, srcFolder) && !isTestFile(filePath);
|
|
85
|
-
});
|
|
86
|
-
for (const [analyzedFileCount, sourceFile] of sourceFilesToAnalyze.entries()) {
|
|
87
|
-
onProgress?.({
|
|
88
|
-
analyzedFileCount,
|
|
89
|
-
currentFilePath: toCanonical(sourceFile.fileName),
|
|
90
|
-
totalFileCount: sourceFilesToAnalyze.length
|
|
91
|
-
});
|
|
92
|
-
visit(sourceFile);
|
|
93
|
-
}
|
|
94
|
-
return context.findings;
|
|
95
|
-
function visit(node) {
|
|
96
|
-
analyzeMember(node, context);
|
|
97
|
-
analyzeExport(node, context);
|
|
98
|
-
node.forEachChild(visit);
|
|
79
|
+
const result = runOverExposureAnalysis(params);
|
|
80
|
+
if (!params.shouldFix) {
|
|
81
|
+
return [...result.findings];
|
|
99
82
|
}
|
|
83
|
+
const { writeFile } = params;
|
|
84
|
+
assertNonNullable(writeFile, "writeFile is required when shouldFix is true.");
|
|
85
|
+
return applyOverExposureFixes(result, params.languageService.getProgram(), writeFile);
|
|
100
86
|
}
|
|
101
87
|
function createLanguageServiceHost(params) {
|
|
102
88
|
const { compilerOptions, fileNames, fileSystem } = params;
|
|
@@ -126,29 +112,21 @@ function findOverExposure(params) {
|
|
|
126
112
|
const languageService = createProjectLanguageService({ tsConfigPath: `${projectFolder}/tsconfig.json` });
|
|
127
113
|
return analyzeOverExposure({
|
|
128
114
|
languageService,
|
|
115
|
+
shouldFix: params.shouldFix,
|
|
129
116
|
srcFolder: `${projectFolder}/src`,
|
|
117
|
+
writeFile: (path, content) => {
|
|
118
|
+
sys.writeFile(path, content);
|
|
119
|
+
},
|
|
130
120
|
...params.onProgress ? { onProgress: params.onProgress } : {}
|
|
131
121
|
});
|
|
132
122
|
}
|
|
133
|
-
function formatOverExposureFindings(findings) {
|
|
123
|
+
function formatOverExposureFindings(findings, options) {
|
|
134
124
|
if (findings.length === 0) {
|
|
135
125
|
return "No over-exposed declarations found.\n";
|
|
136
126
|
}
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
list.push(finding);
|
|
141
|
-
byFile.set(finding.filePath, list);
|
|
142
|
-
}
|
|
143
|
-
const lines = [];
|
|
144
|
-
for (const [filePath, list] of byFile) {
|
|
145
|
-
for (const finding of [...list].sort((a, b) => a.line - b.line)) {
|
|
146
|
-
const location = `${filePath}:${String(finding.line)}:${String(finding.column)}`;
|
|
147
|
-
const change = `${finding.currentExposure} ${finding.name} -> ${finding.suggestedExposure}`;
|
|
148
|
-
lines.push(`${location} ${change} -- ${describeReason(finding)}`);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
lines.push("", `${String(findings.length)} finding(s).`);
|
|
127
|
+
const baseFolder = options?.baseFolder === void 0 ? void 0 : toCanonical(options.baseFolder);
|
|
128
|
+
const lines = formatFindingBlocks(findings, baseFolder);
|
|
129
|
+
lines.push(formatSummary(findings));
|
|
152
130
|
return `${lines.join("\n")}
|
|
153
131
|
`;
|
|
154
132
|
}
|
|
@@ -157,30 +135,48 @@ function analyzeExport(node, context) {
|
|
|
157
135
|
if (node.parent !== sourceFile || !getModifierKinds(node).has(SyntaxKind.ExportKeyword)) {
|
|
158
136
|
return;
|
|
159
137
|
}
|
|
138
|
+
const declaration = asExportableDeclaration(node);
|
|
139
|
+
if (!declaration) {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
160
142
|
const declFilePath = toCanonical(sourceFile.fileName);
|
|
161
|
-
|
|
143
|
+
const nameNodes = getExportedNameNodes(declaration);
|
|
144
|
+
const candidates = [];
|
|
145
|
+
for (const nameNode of nameNodes) {
|
|
162
146
|
const references = collectReferences(context.languageService.findReferences(sourceFile.fileName, nameNode.getStart())).filter((reference) => !isDeclarationItself(reference, nameNode));
|
|
163
147
|
const otherFileReferences = references.filter((reference) => toCanonical(reference.fileName) !== declFilePath);
|
|
164
148
|
if (otherFileReferences.length === 0) {
|
|
165
|
-
|
|
149
|
+
candidates.push({
|
|
150
|
+
finding: buildFinding(declaration, nameNode, "export", "file-local", { hasNoReferences: references.length === 0, isForcedByTestOnly: false }),
|
|
151
|
+
isPlainFileLocal: true
|
|
152
|
+
});
|
|
166
153
|
continue;
|
|
167
154
|
}
|
|
168
155
|
const nonTestReferences = otherFileReferences.filter((reference) => !isTestFile(toCanonical(reference.fileName)));
|
|
169
156
|
if (nonTestReferences.length === 0) {
|
|
170
|
-
|
|
157
|
+
candidates.push({
|
|
158
|
+
finding: buildFinding(declaration, nameNode, "export", "file-local", { hasNoReferences: false, isForcedByTestOnly: true }),
|
|
159
|
+
isPlainFileLocal: false
|
|
160
|
+
});
|
|
171
161
|
}
|
|
172
162
|
}
|
|
173
|
-
|
|
174
|
-
function analyzeMember(node, context) {
|
|
175
|
-
const nameNode = getMemberNameNode(node);
|
|
176
|
-
if (!nameNode) {
|
|
163
|
+
if (candidates.length === 0) {
|
|
177
164
|
return;
|
|
178
165
|
}
|
|
179
|
-
const
|
|
180
|
-
|
|
166
|
+
const canDropExport = candidates.length === nameNodes.length && candidates.every((candidate) => candidate.isPlainFileLocal);
|
|
167
|
+
const exportEdit = canDropExport ? computeExportRemovalEdit(declaration) : null;
|
|
168
|
+
for (const candidate of candidates) {
|
|
169
|
+
record(context, candidate.finding, exportEdit);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
function analyzeMember(node, context) {
|
|
173
|
+
const member = asClassMember(node);
|
|
174
|
+
if (!member || !isClassLike(node.parent)) {
|
|
181
175
|
return;
|
|
182
176
|
}
|
|
183
|
-
const
|
|
177
|
+
const nameNode = member.name;
|
|
178
|
+
const declaringClass = node.parent;
|
|
179
|
+
const modifierKinds = getModifierKinds(member);
|
|
184
180
|
if (modifierKinds.has(SyntaxKind.StaticKeyword) || modifierKinds.has(SyntaxKind.OverrideKeyword) || LIFECYCLE_ALLOWLIST.has(nameNode.getText())) {
|
|
185
181
|
return;
|
|
186
182
|
}
|
|
@@ -188,7 +184,7 @@ function analyzeMember(node, context) {
|
|
|
188
184
|
if (currentExposure === "private") {
|
|
189
185
|
return;
|
|
190
186
|
}
|
|
191
|
-
const sourceFile =
|
|
187
|
+
const sourceFile = member.getSourceFile();
|
|
192
188
|
const references = collectReferences(context.languageService.findReferences(sourceFile.fileName, nameNode.getStart())).filter((reference) => !isDeclarationItself(reference, nameNode));
|
|
193
189
|
const nonTestReferences = references.filter((reference) => !isTestFile(toCanonical(reference.fileName)));
|
|
194
190
|
const neededForSrc = computeNeededExposure(nonTestReferences, declaringClass, context);
|
|
@@ -199,10 +195,67 @@ function analyzeMember(node, context) {
|
|
|
199
195
|
if (rankExposure(neededForSrc) >= rankExposure(currentExposure)) {
|
|
200
196
|
return;
|
|
201
197
|
}
|
|
202
|
-
|
|
198
|
+
const finding = buildFinding(member, nameNode, currentExposure, neededForSrc, {
|
|
203
199
|
hasNoReferences: references.length === 0,
|
|
204
200
|
isForcedByTestOnly: rankExposure(neededWithTests) > rankExposure(neededForSrc)
|
|
205
|
-
})
|
|
201
|
+
});
|
|
202
|
+
record(context, finding, computeMemberExposureEdit(member, neededForSrc));
|
|
203
|
+
}
|
|
204
|
+
function applyEdits(text, edits) {
|
|
205
|
+
const seen = /* @__PURE__ */ new Set();
|
|
206
|
+
const uniqueEdits = edits.filter((edit) => {
|
|
207
|
+
const key = `${String(edit.start)}:${String(edit.length)}:${edit.newText}`;
|
|
208
|
+
if (seen.has(key)) {
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
seen.add(key);
|
|
212
|
+
return true;
|
|
213
|
+
}).sort((a, b) => b.start - a.start);
|
|
214
|
+
let result = text;
|
|
215
|
+
for (const edit of uniqueEdits) {
|
|
216
|
+
result = `${result.slice(0, edit.start)}${edit.newText}${result.slice(edit.start + edit.length)}`;
|
|
217
|
+
}
|
|
218
|
+
return result;
|
|
219
|
+
}
|
|
220
|
+
function applyOverExposureFixes(result, program, writeFile) {
|
|
221
|
+
const editsByFile = /* @__PURE__ */ new Map();
|
|
222
|
+
const findings = result.findings.map((finding, index) => {
|
|
223
|
+
const edit = result.edits[index] ?? null;
|
|
224
|
+
const skipReason = determineSkipReason(finding, edit);
|
|
225
|
+
if (skipReason !== null) {
|
|
226
|
+
return { ...finding, skipReason, wasFixed: false };
|
|
227
|
+
}
|
|
228
|
+
assertNonNullable(edit, "A fixable finding must carry a text edit.");
|
|
229
|
+
const fileEdits = editsByFile.get(edit.fileName) ?? [];
|
|
230
|
+
fileEdits.push(edit);
|
|
231
|
+
editsByFile.set(edit.fileName, fileEdits);
|
|
232
|
+
return { ...finding, skipReason: null, wasFixed: true };
|
|
233
|
+
});
|
|
234
|
+
if (editsByFile.size > 0) {
|
|
235
|
+
assertNonNullable(program, "A program is expected when there are edits to apply.");
|
|
236
|
+
const sourceTextByFile = /* @__PURE__ */ new Map();
|
|
237
|
+
for (const sourceFile of program.getSourceFiles()) {
|
|
238
|
+
sourceTextByFile.set(toCanonical(sourceFile.fileName), { fileName: sourceFile.fileName, text: sourceFile.text });
|
|
239
|
+
}
|
|
240
|
+
for (const [canonicalFileName, fileEdits] of editsByFile) {
|
|
241
|
+
const source = sourceTextByFile.get(canonicalFileName);
|
|
242
|
+
assertNonNullable(source, `Source file not found in program: ${canonicalFileName}`);
|
|
243
|
+
writeFile(source.fileName, applyEdits(source.text, fileEdits));
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return findings;
|
|
247
|
+
}
|
|
248
|
+
function asClassMember(node) {
|
|
249
|
+
if (isMethodDeclaration(node) || isPropertyDeclaration(node) || isGetAccessorDeclaration(node) || isSetAccessorDeclaration(node)) {
|
|
250
|
+
return node;
|
|
251
|
+
}
|
|
252
|
+
return void 0;
|
|
253
|
+
}
|
|
254
|
+
function asExportableDeclaration(node) {
|
|
255
|
+
if (isFunctionDeclaration(node) || isClassDeclaration(node) || isInterfaceDeclaration(node) || isTypeAliasDeclaration(node) || isEnumDeclaration(node) || isVariableStatement(node)) {
|
|
256
|
+
return node;
|
|
257
|
+
}
|
|
258
|
+
return void 0;
|
|
206
259
|
}
|
|
207
260
|
function buildFinding(node, nameNode, currentExposure, suggestedExposure, flags) {
|
|
208
261
|
const sourceFile = node.getSourceFile();
|
|
@@ -216,7 +269,9 @@ function buildFinding(node, nameNode, currentExposure, suggestedExposure, flags)
|
|
|
216
269
|
isMember: currentExposure !== "export",
|
|
217
270
|
line: line + 1,
|
|
218
271
|
name: nameNode.getText(),
|
|
219
|
-
|
|
272
|
+
skipReason: null,
|
|
273
|
+
suggestedExposure,
|
|
274
|
+
wasFixed: false
|
|
220
275
|
};
|
|
221
276
|
}
|
|
222
277
|
function collectReferences(referencedSymbols) {
|
|
@@ -228,6 +283,49 @@ function collectReferences(referencedSymbols) {
|
|
|
228
283
|
}
|
|
229
284
|
return references;
|
|
230
285
|
}
|
|
286
|
+
function computeExportRemovalEdit(declaration) {
|
|
287
|
+
const sourceFile = declaration.getSourceFile();
|
|
288
|
+
const modifiers = getModifiers(declaration);
|
|
289
|
+
assertNonNullable(modifiers, "Modifiers expected on an exported declaration.");
|
|
290
|
+
const exportModifier = modifiers.find((modifier) => modifier.kind === SyntaxKind.ExportKeyword);
|
|
291
|
+
assertNonNullable(exportModifier, "Export modifier expected on an exported declaration.");
|
|
292
|
+
const { text } = sourceFile;
|
|
293
|
+
let end = exportModifier.getEnd();
|
|
294
|
+
while (end < text.length && WHITESPACE_PATTERN.test(text.charAt(end))) {
|
|
295
|
+
end++;
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
fileName: toCanonical(sourceFile.fileName),
|
|
299
|
+
length: end - exportModifier.getStart(),
|
|
300
|
+
newText: "",
|
|
301
|
+
start: exportModifier.getStart()
|
|
302
|
+
};
|
|
303
|
+
}
|
|
304
|
+
function computeMemberExposureEdit(member, suggestedExposure) {
|
|
305
|
+
if ((getDecorators(member) ?? []).length > 0) {
|
|
306
|
+
return null;
|
|
307
|
+
}
|
|
308
|
+
const sourceFile = member.getSourceFile();
|
|
309
|
+
const fileName = toCanonical(sourceFile.fileName);
|
|
310
|
+
const modifiers = getModifiers(member) ?? [];
|
|
311
|
+
const visibilityModifier = modifiers.find((modifier) => VISIBILITY_MODIFIER_KINDS.has(modifier.kind));
|
|
312
|
+
if (visibilityModifier) {
|
|
313
|
+
return {
|
|
314
|
+
fileName,
|
|
315
|
+
length: visibilityModifier.getEnd() - visibilityModifier.getStart(),
|
|
316
|
+
newText: suggestedExposure,
|
|
317
|
+
start: visibilityModifier.getStart()
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
const firstModifier = modifiers[0];
|
|
321
|
+
const insertStart = firstModifier ? firstModifier.getStart() : member.getStart();
|
|
322
|
+
return {
|
|
323
|
+
fileName,
|
|
324
|
+
length: 0,
|
|
325
|
+
newText: `${suggestedExposure} `,
|
|
326
|
+
start: insertStart
|
|
327
|
+
};
|
|
328
|
+
}
|
|
231
329
|
function computeNeededExposure(references, declaringClass, context) {
|
|
232
330
|
if (references.length === 0) {
|
|
233
331
|
return "private";
|
|
@@ -246,6 +344,15 @@ function computeNeededExposure(references, declaringClass, context) {
|
|
|
246
344
|
}
|
|
247
345
|
return needed;
|
|
248
346
|
}
|
|
347
|
+
function describeFixStatus(finding) {
|
|
348
|
+
if (finding.wasFixed) {
|
|
349
|
+
return " [fixed]";
|
|
350
|
+
}
|
|
351
|
+
if (finding.skipReason !== null) {
|
|
352
|
+
return ` [skipped: ${SKIP_REASON_DESCRIPTION[finding.skipReason]}]`;
|
|
353
|
+
}
|
|
354
|
+
return "";
|
|
355
|
+
}
|
|
249
356
|
function describeReason(finding) {
|
|
250
357
|
const base = `referenced only ${SCOPE_DESCRIPTION[finding.suggestedExposure]}`;
|
|
251
358
|
if (finding.isForcedByTestOnly) {
|
|
@@ -256,6 +363,15 @@ function describeReason(finding) {
|
|
|
256
363
|
}
|
|
257
364
|
return base;
|
|
258
365
|
}
|
|
366
|
+
function determineSkipReason(finding, edit) {
|
|
367
|
+
if (finding.isForcedByTestOnly) {
|
|
368
|
+
return "test-only";
|
|
369
|
+
}
|
|
370
|
+
if (!edit) {
|
|
371
|
+
return finding.isMember ? "decorated" : "shared-export";
|
|
372
|
+
}
|
|
373
|
+
return null;
|
|
374
|
+
}
|
|
259
375
|
function findNodeAtPosition(node, position) {
|
|
260
376
|
if (position < node.getStart() || position >= node.getEnd()) {
|
|
261
377
|
return void 0;
|
|
@@ -269,6 +385,36 @@ function findNodeAtPosition(node, position) {
|
|
|
269
385
|
});
|
|
270
386
|
return result;
|
|
271
387
|
}
|
|
388
|
+
function formatFindingBlocks(findings, baseFolder) {
|
|
389
|
+
const byFile = /* @__PURE__ */ new Map();
|
|
390
|
+
for (const finding of findings) {
|
|
391
|
+
const list = byFile.get(finding.filePath) ?? [];
|
|
392
|
+
list.push(finding);
|
|
393
|
+
byFile.set(finding.filePath, list);
|
|
394
|
+
}
|
|
395
|
+
const lines = [];
|
|
396
|
+
for (const [filePath, list] of byFile) {
|
|
397
|
+
const sorted = [...list].sort((a, b) => a.line - b.line);
|
|
398
|
+
const locationWidth = Math.max(...sorted.map((finding) => `${String(finding.line)}:${String(finding.column)}`.length));
|
|
399
|
+
lines.push(toDisplayPath(filePath, baseFolder));
|
|
400
|
+
for (const finding of sorted) {
|
|
401
|
+
const location = `${String(finding.line)}:${String(finding.column)}`.padEnd(locationWidth);
|
|
402
|
+
const change = `${finding.currentExposure} ${finding.name} -> ${finding.suggestedExposure}`;
|
|
403
|
+
lines.push(` ${location} ${change} -- ${describeReason(finding)}${describeFixStatus(finding)}`);
|
|
404
|
+
}
|
|
405
|
+
lines.push("");
|
|
406
|
+
}
|
|
407
|
+
return lines;
|
|
408
|
+
}
|
|
409
|
+
function formatSummary(findings) {
|
|
410
|
+
const summary = `${String(findings.length)} finding(s).`;
|
|
411
|
+
const fixedCount = findings.filter((finding) => finding.wasFixed).length;
|
|
412
|
+
const skippedCount = findings.filter((finding) => finding.skipReason !== null).length;
|
|
413
|
+
if (fixedCount === 0 && skippedCount === 0) {
|
|
414
|
+
return summary;
|
|
415
|
+
}
|
|
416
|
+
return `${summary} ${String(fixedCount)} fixed, ${String(skippedCount)} skipped.`;
|
|
417
|
+
}
|
|
272
418
|
function getClassAtPosition(program, fileName, position) {
|
|
273
419
|
const sourceFile = program.getSourceFile(fileName);
|
|
274
420
|
assertNonNullable(sourceFile, `Source file not found in program: ${fileName}`);
|
|
@@ -295,20 +441,11 @@ function getEnclosingClass(node) {
|
|
|
295
441
|
}
|
|
296
442
|
return void 0;
|
|
297
443
|
}
|
|
298
|
-
function getExportedNameNodes(
|
|
299
|
-
if (
|
|
300
|
-
return
|
|
444
|
+
function getExportedNameNodes(declaration) {
|
|
445
|
+
if (isVariableStatement(declaration)) {
|
|
446
|
+
return declaration.declarationList.declarations.map((variableDeclaration) => variableDeclaration.name).filter(isIdentifier);
|
|
301
447
|
}
|
|
302
|
-
|
|
303
|
-
return node.declarationList.declarations.map((declaration) => declaration.name).filter(isIdentifier);
|
|
304
|
-
}
|
|
305
|
-
return [];
|
|
306
|
-
}
|
|
307
|
-
function getMemberNameNode(node) {
|
|
308
|
-
if (isMethodDeclaration(node) || isPropertyDeclaration(node) || isGetAccessorDeclaration(node) || isSetAccessorDeclaration(node)) {
|
|
309
|
-
return node.name;
|
|
310
|
-
}
|
|
311
|
-
return void 0;
|
|
448
|
+
return declaration.name ? [declaration.name] : [];
|
|
312
449
|
}
|
|
313
450
|
function getModifierKinds(node) {
|
|
314
451
|
const kinds = /* @__PURE__ */ new Set();
|
|
@@ -354,6 +491,48 @@ function isTestFile(filePath) {
|
|
|
354
491
|
function rankExposure(exposure) {
|
|
355
492
|
return MEMBER_EXPOSURE_ORDER.indexOf(exposure);
|
|
356
493
|
}
|
|
494
|
+
function record(context, finding, edit) {
|
|
495
|
+
context.findings.push(finding);
|
|
496
|
+
context.edits.push(edit);
|
|
497
|
+
}
|
|
498
|
+
function runOverExposureAnalysis(params) {
|
|
499
|
+
const { languageService, onProgress, srcFolder } = params;
|
|
500
|
+
const program = languageService.getProgram();
|
|
501
|
+
if (!program) {
|
|
502
|
+
return { edits: [], findings: [] };
|
|
503
|
+
}
|
|
504
|
+
const context = {
|
|
505
|
+
checker: program.getTypeChecker(),
|
|
506
|
+
edits: [],
|
|
507
|
+
findings: [],
|
|
508
|
+
languageService,
|
|
509
|
+
program
|
|
510
|
+
};
|
|
511
|
+
const sourceFilesToAnalyze = program.getSourceFiles().filter((sourceFile) => {
|
|
512
|
+
const filePath = toCanonical(sourceFile.fileName);
|
|
513
|
+
return isOwnSourceFile(filePath, srcFolder) && !isTestFile(filePath);
|
|
514
|
+
});
|
|
515
|
+
for (const [analyzedFileCount, sourceFile] of sourceFilesToAnalyze.entries()) {
|
|
516
|
+
onProgress?.({
|
|
517
|
+
analyzedFileCount,
|
|
518
|
+
currentFilePath: toCanonical(sourceFile.fileName),
|
|
519
|
+
totalFileCount: sourceFilesToAnalyze.length
|
|
520
|
+
});
|
|
521
|
+
visit(sourceFile);
|
|
522
|
+
}
|
|
523
|
+
return { edits: context.edits, findings: context.findings };
|
|
524
|
+
function visit(node) {
|
|
525
|
+
analyzeMember(node, context);
|
|
526
|
+
analyzeExport(node, context);
|
|
527
|
+
node.forEachChild(visit);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
function toDisplayPath(filePath, baseFolder) {
|
|
531
|
+
if (baseFolder !== void 0 && filePath.startsWith(`${baseFolder}/`)) {
|
|
532
|
+
return filePath.slice(baseFolder.length + 1);
|
|
533
|
+
}
|
|
534
|
+
return filePath;
|
|
535
|
+
}
|
|
357
536
|
export {
|
|
358
537
|
LIFECYCLE_ALLOWLIST,
|
|
359
538
|
analyzeOverExposure,
|
|
@@ -362,4 +541,4 @@ export {
|
|
|
362
541
|
findOverExposure,
|
|
363
542
|
formatOverExposureFindings
|
|
364
543
|
};
|
|
365
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi5cbiAqXG4gKiBBIG1lbWJlciByZWZlcmVuY2VkIG9ubHkgZnJvbSB0ZXN0IGZpbGVzIGlzIHJlcG9ydGVkIHdpdGgge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5fVxuICogc2V0LCBzdXJmYWNpbmcgbWVtYmVycyB3aWRlbmVkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkgXHUyMDE0IHRoZSBjYW5vbmljYWwgY2FzZSBmb3IgZXh0cmFjdGluZyBsb2dpY1xuICogaW50byBhbiBpbmRlcGVuZGVudGx5IHRlc3RhYmxlIGNvbXBvbmVudCBpbnN0ZWFkLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQ2xhc3NMaWtlRGVjbGFyYXRpb24sXG4gIENvbXBpbGVyT3B0aW9ucyxcbiAgSVNjcmlwdFNuYXBzaG90LFxuICBMYW5ndWFnZVNlcnZpY2UsXG4gIExhbmd1YWdlU2VydmljZUhvc3QsXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFR5cGVDaGVja2VyXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQge1xuICBjYW5IYXZlTW9kaWZpZXJzLFxuICBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5LFxuICBjcmVhdGVMYW5ndWFnZVNlcnZpY2UsXG4gIGdldERlZmF1bHRMaWJGaWxlUGF0aCxcbiAgZ2V0TW9kaWZpZXJzLFxuICBpc0NsYXNzRGVjbGFyYXRpb24sXG4gIGlzQ2xhc3NMaWtlLFxuICBpc0VudW1EZWNsYXJhdGlvbixcbiAgaXNGdW5jdGlvbkRlY2xhcmF0aW9uLFxuICBpc0dldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzSWRlbnRpZmllcixcbiAgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgaXNNZXRob2REZWNsYXJhdGlvbixcbiAgaXNQcm9wZXJ0eURlY2xhcmF0aW9uLFxuICBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIGlzU291cmNlRmlsZSxcbiAgaXNUeXBlQWxpYXNEZWNsYXJhdGlvbixcbiAgaXNWYXJpYWJsZVN0YXRlbWVudCxcbiAgU2NyaXB0U25hcHNob3QsXG4gIFN5bnRheEtpbmQsXG4gIHN5c1xufSBmcm9tICd0eXBlc2NyaXB0JztcblxuaW1wb3J0IHsgYXNzZXJ0Tm9uTnVsbGFibGUgfSBmcm9tICcuLi8uLi90eXBlLWd1YXJkcy50cyc7XG5pbXBvcnQge1xuICBwYXJzZVRzQ29uZmlnLFxuICB0b0Nhbm9uaWNhbFxufSBmcm9tICcuLi9jaGVjay1wcm9qZWN0LXR5cGVzLnRzJztcblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcyB7XG4gIC8qKiBUaGUgbGFuZ3VhZ2Ugc2VydmljZSB0byBxdWVyeSBmb3IgcmVmZXJlbmNlcyBhbmQgdHlwZXMuICovXG4gIHJlYWRvbmx5IGxhbmd1YWdlU2VydmljZTogTGFuZ3VhZ2VTZXJ2aWNlO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCBjYWxsYmFjayBpbnZva2VkIG9uY2UgcGVyIGFuYWx5emVkIHNvdXJjZSBmaWxlLCBiZWZvcmUgdGhhdCBmaWxlIGlzIHByb2Nlc3NlZC4gVGhlXG4gICAqIHdob2xlLXByb2dyYW0gcmVmZXJlbmNlIGFuYWx5c2lzIGlzIHNsb3csIHNvIHRoaXMgbGV0cyBjYWxsZXJzIHJlcG9ydCBsaXZlIHByb2dyZXNzIGluc3RlYWQgb2ZcbiAgICogYXBwZWFyaW5nIHRvIGhhbmcuXG4gICAqL1xuICBvblByb2dyZXNzPyh0aGlzOiB2b2lkLCBwcm9ncmVzczogT3ZlckV4cG9zdXJlUHJvZ3Jlc3MpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBwcm9qZWN0J3MgYHNyY2AgZm9sZGVyLiBPbmx5IGRlY2xhcmF0aW9ucyBpbiBub24tdGVzdCBmaWxlc1xuICAgKiB1bmRlciB0aGlzIGZvbGRlciBhcmUgYW5hbHl6ZWQ7IGRlY2xhcmF0aW9ucyBlbHNld2hlcmUgKHRlc3QgZmlsZXMsIGRlcGVuZGVuY2llcykgYXJlIGlnbm9yZWRcbiAgICogYnV0IHN0aWxsIGNvdW50ZWQgYXMgcmVmZXJlbmNlIHNpdGVzLlxuICAgKi9cbiAgcmVhZG9ubHkgc3JjRm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QgbmVlZHMuIEluamVjdGluZyB0aGlzIChyYXRoZXIgdGhhblxuICogYWx3YXlzIHVzaW5nIGB0eXBlc2NyaXB0YCdzIGBzeXNgKSBsZXRzIHRlc3RzIGRyaXZlIHRoZSBhbmFseXplciBhZ2FpbnN0IGluLW1lbW9yeSBzb3VyY2VzIHdpdGggbm9cbiAqIHJlYWwgZmlsZS1zeXN0ZW0gYWNjZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXJlY3RvcnlFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGV4aXN0cy5cbiAgICovXG4gIGZpbGVFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBjb250ZW50cywgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICByZWFkRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKiogMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLiAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKiAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKiBUaGUgZGVjbGFyZWQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKiBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xufVxuXG4vKipcbiAqIFByb2dyZXNzIHJlcG9ydGVkIHdoaWxlIGFuYWx5emluZyBhIHByb2plY3QsIG9uZSBldmVudCBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3ZlckV4cG9zdXJlUHJvZ3Jlc3Mge1xuICAvKiogTnVtYmVyIG9mIHNvdXJjZSBmaWxlcyBmdWxseSBhbmFseXplZCBiZWZvcmUgdGhlIGN1cnJlbnQgb25lICgwLWJhc2VkKS4gKi9cbiAgcmVhZG9ubHkgYW5hbHl6ZWRGaWxlQ291bnQ6IG51bWJlcjtcblxuICAvKiogQWJzb2x1dGUgKGNhbm9uaWNhbCkgcGF0aCBvZiB0aGUgc291cmNlIGZpbGUgYWJvdXQgdG8gYmUgYW5hbHl6ZWQuICovXG4gIHJlYWRvbmx5IGN1cnJlbnRGaWxlUGF0aDogc3RyaW5nO1xuXG4gIC8qKiBUb3RhbCBudW1iZXIgb2Ygc291cmNlIGZpbGVzIHRoYXQgd2lsbCBiZSBhbmFseXplZC4gKi9cbiAgcmVhZG9ubHkgdG90YWxGaWxlQ291bnQ6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBmaW5kaW5nczogT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xuICByZWFkb25seSBsYW5ndWFnZVNlcnZpY2U6IExhbmd1YWdlU2VydmljZTtcbiAgcmVhZG9ubHkgcHJvZ3JhbTogUHJvZ3JhbTtcbn1cblxuaW50ZXJmYWNlIEZpbmRpbmdGbGFncyB7XG4gIHJlYWRvbmx5IGhhc05vUmVmZXJlbmNlczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xufVxuXG50eXBlIE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcgfCAncHVibGljJztcblxuaW50ZXJmYWNlIFJlZmVyZW5jZUxvY2F0aW9uIHtcbiAgcmVhZG9ubHkgZmlsZU5hbWU6IHN0cmluZztcbiAgcmVhZG9ubHkgc3RhcnQ6IG51bWJlcjtcbn1cblxuY29uc3QgTUVNQkVSX0VYUE9TVVJFX09SREVSOiByZWFkb25seSBNZW1iZXJFeHBvc3VyZVtdID0gWydwcml2YXRlJywgJ3Byb3RlY3RlZCcsICdwdWJsaWMnXTtcbmNvbnN0IFNDT1BFX0RFU0NSSVBUSU9OOiBSZWNvcmQ8U3VnZ2VzdGVkRXhwb3N1cmUsIHN0cmluZz4gPSB7XG4gICdmaWxlLWxvY2FsJzogJ3dpdGhpbiBpdHMgb3duIGZpbGUnLFxuICAncHJpdmF0ZSc6ICdpbnNpZGUgaXRzIG93biBjbGFzcycsXG4gICdwcm90ZWN0ZWQnOiAnaW5zaWRlIGl0cyBjbGFzcyArIHN1YmNsYXNzZXMnXG59O1xuXG4vKipcbiAqIEFuYWx5emVzIGEgcHJvamVjdCAoYWxyZWFkeSBsb2FkZWQgaW50byBhIGxhbmd1YWdlIHNlcnZpY2UpIGZvciBvdmVyLWV4cG9zZWQgZGVjbGFyYXRpb25zLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGluIGRpc2NvdmVyeSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuYWx5emVPdmVyRXhwb3N1cmUocGFyYW1zOiBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgeyBsYW5ndWFnZVNlcnZpY2UsIG9uUHJvZ3Jlc3MsIHNyY0ZvbGRlciB9ID0gcGFyYW1zO1xuICBjb25zdCBwcm9ncmFtID0gbGFuZ3VhZ2VTZXJ2aWNlLmdldFByb2dyYW0oKTtcbiAgaWYgKCFwcm9ncmFtKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgY29uc3QgY29udGV4dDogQW5hbHlzaXNDb250ZXh0ID0ge1xuICAgIGNoZWNrZXI6IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKSxcbiAgICBmaW5kaW5nczogW10sXG4gICAgbGFuZ3VhZ2VTZXJ2aWNlLFxuICAgIHByb2dyYW1cbiAgfTtcblxuICBjb25zdCBzb3VyY2VGaWxlc1RvQW5hbHl6ZSA9IHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKS5maWx0ZXIoKHNvdXJjZUZpbGUpID0+IHtcbiAgICBjb25zdCBmaWxlUGF0aCA9IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIHJldHVybiBpc093blNvdXJjZUZpbGUoZmlsZVBhdGgsIHNyY0ZvbGRlcikgJiYgIWlzVGVzdEZpbGUoZmlsZVBhdGgpO1xuICB9KTtcblxuICBmb3IgKGNvbnN0IFthbmFseXplZEZpbGVDb3VudCwgc291cmNlRmlsZV0gb2Ygc291cmNlRmlsZXNUb0FuYWx5emUuZW50cmllcygpKSB7XG4gICAgb25Qcm9ncmVzcz8uKHtcbiAgICAgIGFuYWx5emVkRmlsZUNvdW50LFxuICAgICAgY3VycmVudEZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICAgIHRvdGFsRmlsZUNvdW50OiBzb3VyY2VGaWxlc1RvQW5hbHl6ZS5sZW5ndGhcbiAgICB9KTtcbiAgICB2aXNpdChzb3VyY2VGaWxlKTtcbiAgfVxuICByZXR1cm4gY29udGV4dC5maW5kaW5ncztcblxuICBmdW5jdGlvbiB2aXNpdChub2RlOiBOb2RlKTogdm9pZCB7XG4gICAgYW5hbHl6ZU1lbWJlcihub2RlLCBjb250ZXh0KTtcbiAgICBhbmFseXplRXhwb3J0KG5vZGUsIGNvbnRleHQpO1xuICAgIG5vZGUuZm9yRWFjaENoaWxkKHZpc2l0KTtcbiAgfVxufVxuXG4vKipcbiAqIEJ1aWxkcyBhIHtAbGluayBMYW5ndWFnZVNlcnZpY2VIb3N0fSBiYWNrZWQgYnkgYW4gZXhwbGljaXQgZmlsZSBsaXN0IGFuZCBmaWxlIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHtAbGluayBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zfS5cbiAqIEByZXR1cm5zIFRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0KHBhcmFtczogQ3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdFBhcmFtcyk6IExhbmd1YWdlU2VydmljZUhvc3Qge1xuICBjb25zdCB7IGNvbXBpbGVyT3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtIH0gPSBwYXJhbXM7XG4gIHJldHVybiB7XG4gICAgZGlyZWN0b3J5RXhpc3RzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnkpLFxuICAgIGZpbGVFeGlzdHM6IChmaWxlKSA9PiBmaWxlU3lzdGVtLmZpbGVFeGlzdHMoZmlsZSksXG4gICAgZ2V0Q29tcGlsYXRpb25TZXR0aW5nczogKCkgPT4gY29tcGlsZXJPcHRpb25zLFxuICAgIGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IGZpbGVTeXN0ZW0uZ2V0Q3VycmVudERpcmVjdG9yeSgpLFxuICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKGxpYk9wdGlvbnMpID0+IGdldERlZmF1bHRMaWJGaWxlUGF0aChsaWJPcHRpb25zKSxcbiAgICBnZXREaXJlY3RvcmllczogKGRpcmVjdG9yeSkgPT4gZmlsZVN5c3RlbS5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnkpLFxuICAgIGdldFNjcmlwdEZpbGVOYW1lczogKCkgPT4gWy4uLmZpbGVOYW1lc10sXG4gICAgZ2V0U2NyaXB0U25hcHNob3Q6IChmaWxlTmFtZSk6IElTY3JpcHRTbmFwc2hvdCB8IHVuZGVmaW5lZCA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gZmlsZVN5c3RlbS5yZWFkRmlsZShmaWxlTmFtZSk7XG4gICAgICByZXR1cm4gdGV4dCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU2NyaXB0U25hcHNob3QuZnJvbVN0cmluZyh0ZXh0KTtcbiAgICB9LFxuICAgIGdldFNjcmlwdFZlcnNpb246ICgpID0+ICcwJyxcbiAgICByZWFkRGlyZWN0b3J5OiAocGF0aCwgZXh0ZW5zaW9ucywgZXhjbHVkZSwgaW5jbHVkZSwgZGVwdGgpID0+IGZpbGVTeXN0ZW0ucmVhZERpcmVjdG9yeShwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCksXG4gICAgcmVhZEZpbGU6IChmaWxlKSA9PiBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGUpXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGRzIGEgbGFuZ3VhZ2Ugc2VydmljZSBvdmVyIGV2ZXJ5IGZpbGUgaW4gYSBwcm9qZWN0J3MgYHRzY29uZmlnLmpzb25gLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXN9LlxuICogQHJldHVybnMgQSBsYW5ndWFnZSBzZXJ2aWNlIHJlYWR5IGZvciB7QGxpbmsgYW5hbHl6ZU92ZXJFeHBvc3VyZX0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlKHBhcmFtczogQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtcyk6IExhbmd1YWdlU2VydmljZSB7XG4gIGNvbnN0IHsgZmlsZU5hbWVzLCBvcHRpb25zIH0gPSBwYXJzZVRzQ29uZmlnKHBhcmFtcy50c0NvbmZpZ1BhdGgpO1xuICByZXR1cm4gY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlKGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QoeyBjb21waWxlck9wdGlvbnM6IG9wdGlvbnMsIGZpbGVOYW1lcywgZmlsZVN5c3RlbTogc3lzIH0pLCBjcmVhdGVEb2N1bWVudFJlZ2lzdHJ5KCkpO1xufVxuXG4vKipcbiAqIEZpbmRzIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMgaW4gYSBwcm9qZWN0IG9uIGRpc2suXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRmluZE92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdmVyRXhwb3N1cmUocGFyYW1zOiBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgcHJvamVjdEZvbGRlciA9IHRvQ2Fub25pY2FsKHBhcmFtcy5wcm9qZWN0Rm9sZGVyKTtcbiAgY29uc3QgbGFuZ3VhZ2VTZXJ2aWNlID0gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZSh7IHRzQ29uZmlnUGF0aDogYCR7cHJvamVjdEZvbGRlcn0vdHNjb25maWcuanNvbmAgfSk7XG4gIHJldHVybiBhbmFseXplT3ZlckV4cG9zdXJlKHtcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgc3JjRm9sZGVyOiBgJHtwcm9qZWN0Rm9sZGVyfS9zcmNgLFxuICAgIC4uLnBhcmFtcy5vblByb2dyZXNzID8geyBvblByb2dyZXNzOiBwYXJhbXMub25Qcm9ncmVzcyB9IDoge31cbiAgfSk7XG59XG5cbi8qKlxuICogRm9ybWF0cyBvdmVyLWV4cG9zdXJlIGZpbmRpbmdzIGFzIGEgaHVtYW4tcmVhZGFibGUgcmVwb3J0LiBGaW5kaW5ncyBhcmUgZ3JvdXBlZCBieSBmaWxlIGFuZCBlYWNoXG4gKiBsaW5lIGJlZ2lucyB3aXRoIGEgYHBhdGg6bGluZTpjb2x1bW5gIGxvY2F0aW9uIHNvIHRlcm1pbmFscyAoZS5nLiBWUyBDb2RlKSByZW5kZXIgaXQgYXMgYVxuICogY2xpY2thYmxlIGxpbmsgdGhhdCBqdW1wcyB0byB0aGUgZGVjbGFyYXRpb24uXG4gKlxuICogQHBhcmFtIGZpbmRpbmdzIC0gVGhlIGZpbmRpbmdzIHRvIGZvcm1hdC5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYnlGaWxlID0gbmV3IE1hcDxzdHJpbmcsIE92ZXJFeHBvc3VyZUZpbmRpbmdbXT4oKTtcbiAgZm9yIChjb25zdCBmaW5kaW5nIG9mIGZpbmRpbmdzKSB7XG4gICAgY29uc3QgbGlzdCA9IGJ5RmlsZS5nZXQoZmluZGluZy5maWxlUGF0aCkgPz8gW107XG4gICAgbGlzdC5wdXNoKGZpbmRpbmcpO1xuICAgIGJ5RmlsZS5zZXQoZmluZGluZy5maWxlUGF0aCwgbGlzdCk7XG4gIH1cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBbZmlsZVBhdGgsIGxpc3RdIG9mIGJ5RmlsZSkge1xuICAgIGZvciAoY29uc3QgZmluZGluZyBvZiBbLi4ubGlzdF0uc29ydCgoYSwgYikgPT4gYS5saW5lIC0gYi5saW5lKSkge1xuICAgICAgY29uc3QgbG9jYXRpb24gPSBgJHtmaWxlUGF0aH06JHtTdHJpbmcoZmluZGluZy5saW5lKX06JHtTdHJpbmcoZmluZGluZy5jb2x1bW4pfWA7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBgJHtmaW5kaW5nLmN1cnJlbnRFeHBvc3VyZX0gJHtmaW5kaW5nLm5hbWV9IC0+ICR7ZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZX1gO1xuICAgICAgbGluZXMucHVzaChgJHtsb2NhdGlvbn0gJHtjaGFuZ2V9IC0tICR7ZGVzY3JpYmVSZWFzb24oZmluZGluZyl9YCk7XG4gICAgfVxuICB9XG4gIGxpbmVzLnB1c2goJycsIGAke1N0cmluZyhmaW5kaW5ncy5sZW5ndGgpfSBmaW5kaW5nKHMpLmApO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsRmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgZm9yIChjb25zdCBuYW1lTm9kZSBvZiBnZXRFeHBvcnRlZE5hbWVOb2Rlcyhub2RlKSkge1xuICAgIGNvbnN0IHJlZmVyZW5jZXMgPSBjb2xsZWN0UmVmZXJlbmNlcyhjb250ZXh0Lmxhbmd1YWdlU2VydmljZS5maW5kUmVmZXJlbmNlcyhzb3VyY2VGaWxlLmZpbGVOYW1lLCBuYW1lTm9kZS5nZXRTdGFydCgpKSlcbiAgICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICAgIGNvbnN0IG90aGVyRmlsZVJlZmVyZW5jZXMgPSByZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiB0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpICE9PSBkZWNsRmlsZVBhdGgpO1xuXG4gICAgaWYgKG90aGVyRmlsZVJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjb250ZXh0LmZpbmRpbmdzLnB1c2goYnVpbGRGaW5kaW5nKG5vZGUsIG5hbWVOb2RlLCAnZXhwb3J0JywgJ2ZpbGUtbG9jYWwnLCB7IGhhc05vUmVmZXJlbmNlczogcmVmZXJlbmNlcy5sZW5ndGggPT09IDAsIGlzRm9yY2VkQnlUZXN0T25seTogZmFsc2UgfSkpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3Qgbm9uVGVzdFJlZmVyZW5jZXMgPSBvdGhlckZpbGVSZWZlcmVuY2VzLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNUZXN0RmlsZSh0b0Nhbm9uaWNhbChyZWZlcmVuY2UuZmlsZU5hbWUpKSk7XG4gICAgaWYgKG5vblRlc3RSZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY29udGV4dC5maW5kaW5ncy5wdXNoKGJ1aWxkRmluZGluZyhub2RlLCBuYW1lTm9kZSwgJ2V4cG9ydCcsICdmaWxlLWxvY2FsJywgeyBoYXNOb1JlZmVyZW5jZXM6IGZhbHNlLCBpc0ZvcmNlZEJ5VGVzdE9ubHk6IHRydWUgfSkpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhbmFseXplTWVtYmVyKG5vZGU6IE5vZGUsIGNvbnRleHQ6IEFuYWx5c2lzQ29udGV4dCk6IHZvaWQge1xuICBjb25zdCBuYW1lTm9kZSA9IGdldE1lbWJlck5hbWVOb2RlKG5vZGUpO1xuICBpZiAoIW5hbWVOb2RlKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IGRlY2xhcmluZ0NsYXNzID0gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZSk7XG4gIGlmICghZGVjbGFyaW5nQ2xhc3MpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBtb2RpZmllcktpbmRzID0gZ2V0TW9kaWZpZXJLaW5kcyhub2RlKTtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgfHwgbW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5PdmVycmlkZUtleXdvcmQpIHx8IExJRkVDWUNMRV9BTExPV0xJU1QuaGFzKG5hbWVOb2RlLmdldFRleHQoKSkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBjdXJyZW50RXhwb3N1cmUgPSBnZXRDdXJyZW50TWVtYmVyRXhwb3N1cmUobW9kaWZpZXJLaW5kcyk7XG4gIGlmIChjdXJyZW50RXhwb3N1cmUgPT09ICdwcml2YXRlJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBub2RlLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcblxuICBjb25zdCBuZWVkZWRGb3JTcmMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUobm9uVGVzdFJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcbiAgY29uc3QgbmVlZGVkV2l0aFRlc3RzID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcblxuICBpZiAobmVlZGVkRm9yU3JjID09PSAncHVibGljJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKSA+PSByYW5rRXhwb3N1cmUoY3VycmVudEV4cG9zdXJlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnRleHQuZmluZGluZ3MucHVzaChidWlsZEZpbmRpbmcobm9kZSwgbmFtZU5vZGUsIGN1cnJlbnRFeHBvc3VyZSwgbmVlZGVkRm9yU3JjLCB7XG4gICAgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IHJhbmtFeHBvc3VyZShuZWVkZWRXaXRoVGVzdHMpID4gcmFua0V4cG9zdXJlKG5lZWRlZEZvclNyYylcbiAgfSkpO1xufVxuXG5mdW5jdGlvbiBidWlsZEZpbmRpbmcoXG4gIG5vZGU6IE5vZGUsXG4gIG5hbWVOb2RlOiBOb2RlLFxuICBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZSxcbiAgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlLFxuICBmbGFnczogRmluZGluZ0ZsYWdzXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBjb25zdCB7IGNoYXJhY3RlciwgbGluZSB9ID0gc291cmNlRmlsZS5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihuYW1lTm9kZS5nZXRTdGFydCgpKTtcbiAgcmV0dXJuIHtcbiAgICBjb2x1bW46IGNoYXJhY3RlciArIDEsXG4gICAgY3VycmVudEV4cG9zdXJlLFxuICAgIGZpbGVQYXRoOiB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKSxcbiAgICBoYXNOb1JlZmVyZW5jZXM6IGZsYWdzLmhhc05vUmVmZXJlbmNlcyxcbiAgICBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGZsYWdzLmlzRm9yY2VkQnlUZXN0T25seSxcbiAgICBpc01lbWJlcjogY3VycmVudEV4cG9zdXJlICE9PSAnZXhwb3J0JyxcbiAgICBsaW5lOiBsaW5lICsgMSxcbiAgICBuYW1lOiBuYW1lTm9kZS5nZXRUZXh0KCksXG4gICAgc3VnZ2VzdGVkRXhwb3N1cmVcbiAgfTtcbn1cblxuZnVuY3Rpb24gY29sbGVjdFJlZmVyZW5jZXMocmVmZXJlbmNlZFN5bWJvbHM6IFJlZmVyZW5jZWRTeW1ib2xbXSB8IHVuZGVmaW5lZCk6IFJlZmVyZW5jZUxvY2F0aW9uW10ge1xuICBjb25zdCByZWZlcmVuY2VzOiBSZWZlcmVuY2VMb2NhdGlvbltdID0gW107XG4gIGZvciAoY29uc3QgcmVmZXJlbmNlZFN5bWJvbCBvZiByZWZlcmVuY2VkU3ltYm9scyA/PyBbXSkge1xuICAgIGZvciAoY29uc3QgcmVmZXJlbmNlIG9mIHJlZmVyZW5jZWRTeW1ib2wucmVmZXJlbmNlcykge1xuICAgICAgcmVmZXJlbmNlcy5wdXNoKHsgZmlsZU5hbWU6IHJlZmVyZW5jZS5maWxlTmFtZSwgc3RhcnQ6IHJlZmVyZW5jZS50ZXh0U3Bhbi5zdGFydCB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlZmVyZW5jZXM7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVOZWVkZWRFeHBvc3VyZShcbiAgcmVmZXJlbmNlczogcmVhZG9ubHkgUmVmZXJlbmNlTG9jYXRpb25bXSxcbiAgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLFxuICBjb250ZXh0OiBBbmFseXNpc0NvbnRleHRcbik6IE1lbWJlckV4cG9zdXJlIHtcbiAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuXG4gIGxldCBuZWVkZWQ6IE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlQ2xhc3MgPSBnZXRDbGFzc0F0UG9zaXRpb24oY29udGV4dC5wcm9ncmFtLCByZWZlcmVuY2UuZmlsZU5hbWUsIHJlZmVyZW5jZS5zdGFydCk7XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzID09PSBkZWNsYXJpbmdDbGFzcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChyZWZlcmVuY2VDbGFzcyAmJiBpc0Rlcml2ZWRGcm9tKHJlZmVyZW5jZUNsYXNzLCBkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKSkge1xuICAgICAgbmVlZGVkID0gJ3Byb3RlY3RlZCc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiBuZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlUmVhc29uKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBjb25zdCBiYXNlID0gYHJlZmVyZW5jZWQgb25seSAke1NDT1BFX0RFU0NSSVBUSU9OW2ZpbmRpbmcuc3VnZ2VzdGVkRXhwb3N1cmVdfWA7XG4gIGlmIChmaW5kaW5nLmlzRm9yY2VkQnlUZXN0T25seSkge1xuICAgIHJldHVybiBgJHtiYXNlfSAoZXhwb3NlZCBvbmx5IGZvciB0ZXN0cylgO1xuICB9XG4gIGlmIChmaW5kaW5nLmhhc05vUmVmZXJlbmNlcykge1xuICAgIHJldHVybiBgJHtiYXNlfSAobm8gcmVmZXJlbmNlcyBhdCBhbGwpYDtcbiAgfVxuICByZXR1cm4gYmFzZTtcbn1cblxuZnVuY3Rpb24gZmluZE5vZGVBdFBvc2l0aW9uKG5vZGU6IE5vZGUsIHBvc2l0aW9uOiBudW1iZXIpOiBOb2RlIHwgdW5kZWZpbmVkIHtcbiAgaWYgKHBvc2l0aW9uIDwgbm9kZS5nZXRTdGFydCgpIHx8IHBvc2l0aW9uID49IG5vZGUuZ2V0RW5kKCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGxldCByZXN1bHQ6IE5vZGUgPSBub2RlO1xuICBub2RlLmZvckVhY2hDaGlsZCgoY2hpbGQpID0+IHtcbiAgICBjb25zdCBmb3VuZCA9IGZpbmROb2RlQXRQb3NpdGlvbihjaGlsZCwgcG9zaXRpb24pO1xuICAgIGlmIChmb3VuZCkge1xuICAgICAgcmVzdWx0ID0gZm91bmQ7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gZ2V0Q2xhc3NBdFBvc2l0aW9uKHByb2dyYW06IFByb2dyYW0sIGZpbGVOYW1lOiBzdHJpbmcsIHBvc2l0aW9uOiBudW1iZXIpOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGUoZmlsZU5hbWUpO1xuICBhc3NlcnROb25OdWxsYWJsZShzb3VyY2VGaWxlLCBgU291cmNlIGZpbGUgbm90IGZvdW5kIGluIHByb2dyYW06ICR7ZmlsZU5hbWV9YCk7XG4gIGNvbnN0IG5vZGUgPSBmaW5kTm9kZUF0UG9zaXRpb24oc291cmNlRmlsZSwgcG9zaXRpb24pO1xuICBhc3NlcnROb25OdWxsYWJsZShub2RlLCBgTm8gbm9kZSBmb3VuZCBhdCBwb3NpdGlvbiAke1N0cmluZyhwb3NpdGlvbil9IGluICR7ZmlsZU5hbWV9YCk7XG4gIHJldHVybiBnZXRFbmNsb3NpbmdDbGFzcyhub2RlKTtcbn1cblxuZnVuY3Rpb24gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHM6IFJlYWRvbmx5U2V0PFN5bnRheEtpbmQ+KTogTWVtYmVyRXhwb3N1cmUge1xuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkpIHtcbiAgICByZXR1cm4gJ3ByaXZhdGUnO1xuICB9XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcm90ZWN0ZWQnO1xuICB9XG4gIHJldHVybiAncHVibGljJztcbn1cblxuZnVuY3Rpb24gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZTogTm9kZSk6IENsYXNzTGlrZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgbGV0IGN1cnJlbnQ6IE5vZGUgPSBub2RlO1xuICB3aGlsZSAoIWlzU291cmNlRmlsZShjdXJyZW50KSkge1xuICAgIGlmIChpc0NsYXNzTGlrZShjdXJyZW50KSkge1xuICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBnZXRFeHBvcnRlZE5hbWVOb2Rlcyhub2RlOiBOb2RlKTogTm9kZVtdIHtcbiAgaWYgKGlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKSB8fCBpc0NsYXNzRGVjbGFyYXRpb24obm9kZSkgfHwgaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihub2RlKSB8fCBpc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpIHx8IGlzRW51bURlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGUubmFtZSA/IFtub2RlLm5hbWVdIDogW107XG4gIH1cbiAgaWYgKGlzVmFyaWFibGVTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLm1hcCgoZGVjbGFyYXRpb24pID0+IGRlY2xhcmF0aW9uLm5hbWUpLmZpbHRlcihpc0lkZW50aWZpZXIpO1xuICB9XG4gIHJldHVybiBbXTtcbn1cblxuZnVuY3Rpb24gZ2V0TWVtYmVyTmFtZU5vZGUobm9kZTogTm9kZSk6IE5vZGUgfCB1bmRlZmluZWQge1xuICBpZiAoaXNNZXRob2REZWNsYXJhdGlvbihub2RlKSB8fCBpc1Byb3BlcnR5RGVjbGFyYXRpb24obm9kZSkgfHwgaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG5vZGUpIHx8IGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSkge1xuICAgIHJldHVybiBub2RlLm5hbWU7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0TW9kaWZpZXJLaW5kcyhub2RlOiBOb2RlKTogUmVhZG9ubHlTZXQ8U3ludGF4S2luZD4ge1xuICBjb25zdCBraW5kcyA9IG5ldyBTZXQ8U3ludGF4S2luZD4oKTtcbiAgaWYgKGNhbkhhdmVNb2RpZmllcnMobm9kZSkpIHtcbiAgICBmb3IgKGNvbnN0IG1vZGlmaWVyIG9mIGdldE1vZGlmaWVycyhub2RlKSA/PyBbXSkge1xuICAgICAga2luZHMuYWRkKG1vZGlmaWVyLmtpbmQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2luZHM7XG59XG5cbmZ1bmN0aW9uIGlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlOiBSZWZlcmVuY2VMb2NhdGlvbiwgbmFtZU5vZGU6IE5vZGUpOiBib29sZWFuIHtcbiAgcmV0dXJuIHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgPT09IHRvQ2Fub25pY2FsKG5hbWVOb2RlLmdldFNvdXJjZUZpbGUoKS5maWxlTmFtZSkgJiYgcmVmZXJlbmNlLnN0YXJ0ID09PSBuYW1lTm9kZS5nZXRTdGFydCgpO1xufVxuXG5mdW5jdGlvbiBpc0Rlcml2ZWRGcm9tKGRlcml2ZWQ6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBiYXNlOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiwgY2hlY2tlcjogVHlwZUNoZWNrZXIpOiBib29sZWFuIHtcbiAgY29uc3QgYmFzZVN5bWJvbCA9IGJhc2UubmFtZSA/IGNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihiYXNlLm5hbWUpIDogdW5kZWZpbmVkO1xuICBpZiAoIWJhc2VTeW1ib2wpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBmb3IgKGNvbnN0IGNsYXVzZSBvZiBkZXJpdmVkLmhlcml0YWdlQ2xhdXNlcyA/PyBbXSkge1xuICAgIGlmIChjbGF1c2UudG9rZW4gIT09IFN5bnRheEtpbmQuRXh0ZW5kc0tleXdvcmQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IHR5cGVFeHByZXNzaW9uIG9mIGNsYXVzZS50eXBlcykge1xuICAgICAgY29uc3Qgc3ltYm9sID0gY2hlY2tlci5nZXRUeXBlQXRMb2NhdGlvbih0eXBlRXhwcmVzc2lvbi5leHByZXNzaW9uKS5nZXRTeW1ib2woKTtcbiAgICAgIGlmIChzeW1ib2wgPT09IGJhc2VTeW1ib2wpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGRlY2xhcmF0aW9uIG9mIHN5bWJvbD8uZGVjbGFyYXRpb25zID8/IFtdKSB7XG4gICAgICAgIGlmIChpc0NsYXNzTGlrZShkZWNsYXJhdGlvbikgJiYgaXNEZXJpdmVkRnJvbShkZWNsYXJhdGlvbiwgYmFzZSwgY2hlY2tlcikpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGlzT3duU291cmNlRmlsZShmaWxlUGF0aDogc3RyaW5nLCBzcmNGb2xkZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguc3RhcnRzV2l0aChgJHtzcmNGb2xkZXJ9L2ApICYmIGZpbGVQYXRoLmVuZHNXaXRoKCcudHMnKSAmJiAhZmlsZVBhdGguZW5kc1dpdGgoJy5kLnRzJyk7XG59XG5cbmZ1bmN0aW9uIGlzVGVzdEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gZmlsZVBhdGguaW5jbHVkZXMoJy50ZXN0LicpIHx8IGZpbGVQYXRoLmluY2x1ZGVzKCcuaW50ZWdyYXRpb24uJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmtFeHBvc3VyZShleHBvc3VyZTogTWVtYmVyRXhwb3N1cmUpOiBudW1iZXIge1xuICByZXR1cm4gTUVNQkVSX0VYUE9TVVJFX09SREVSLmluZGV4T2YoZXhwb3N1cmUpO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQ0E7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBRVAsU0FBUyx5QkFBeUI7QUFDbEM7QUFBQSxFQUNFO0FBQUEsRUFDQTtBQUFBLE9BQ0s7QUEwS0EsTUFBTSxzQkFBMkMsb0JBQUksSUFBWTtBQUFBLEVBQ3RFO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQ0YsQ0FBQztBQXFCRCxNQUFNLHdCQUFtRCxDQUFDLFdBQVcsYUFBYSxRQUFRO0FBQzFGLE1BQU0sb0JBQXVEO0FBQUEsRUFDM0QsY0FBYztBQUFBLEVBQ2QsV0FBVztBQUFBLEVBQ1gsYUFBYTtBQUNmO0FBUU8sU0FBUyxvQkFBb0IsUUFBMEQ7QUFDNUYsUUFBTSxFQUFFLGlCQUFpQixZQUFZLFVBQVUsSUFBSTtBQUNuRCxRQUFNLFVBQVUsZ0JBQWdCLFdBQVc7QUFDM0MsTUFBSSxDQUFDLFNBQVM7QUFDWixXQUFPLENBQUM7QUFBQSxFQUNWO0FBRUEsUUFBTSxVQUEyQjtBQUFBLElBQy9CLFNBQVMsUUFBUSxlQUFlO0FBQUEsSUFDaEMsVUFBVSxDQUFDO0FBQUEsSUFDWDtBQUFBLElBQ0E7QUFBQSxFQUNGO0FBRUEsUUFBTSx1QkFBdUIsUUFBUSxlQUFlLEVBQUUsT0FBTyxDQUFDLGVBQWU7QUFDM0UsVUFBTSxXQUFXLFlBQVksV0FBVyxRQUFRO0FBQ2hELFdBQU8sZ0JBQWdCLFVBQVUsU0FBUyxLQUFLLENBQUMsV0FBVyxRQUFRO0FBQUEsRUFDckUsQ0FBQztBQUVELGFBQVcsQ0FBQyxtQkFBbUIsVUFBVSxLQUFLLHFCQUFxQixRQUFRLEdBQUc7QUFDNUUsaUJBQWE7QUFBQSxNQUNYO0FBQUEsTUFDQSxpQkFBaUIsWUFBWSxXQUFXLFFBQVE7QUFBQSxNQUNoRCxnQkFBZ0IscUJBQXFCO0FBQUEsSUFDdkMsQ0FBQztBQUNELFVBQU0sVUFBVTtBQUFBLEVBQ2xCO0FBQ0EsU0FBTyxRQUFRO0FBRWYsV0FBUyxNQUFNLE1BQWtCO0FBQy9CLGtCQUFjLE1BQU0sT0FBTztBQUMzQixrQkFBYyxNQUFNLE9BQU87QUFDM0IsU0FBSyxhQUFhLEtBQUs7QUFBQSxFQUN6QjtBQUNGO0FBUU8sU0FBUywwQkFBMEIsUUFBOEQ7QUFDdEcsUUFBTSxFQUFFLGlCQUFpQixXQUFXLFdBQVcsSUFBSTtBQUNuRCxTQUFPO0FBQUEsSUFDTCxpQkFBaUIsQ0FBQyxjQUFjLFdBQVcsZ0JBQWdCLFNBQVM7QUFBQSxJQUNwRSxZQUFZLENBQUMsU0FBUyxXQUFXLFdBQVcsSUFBSTtBQUFBLElBQ2hELHdCQUF3QixNQUFNO0FBQUEsSUFDOUIscUJBQXFCLE1BQU0sV0FBVyxvQkFBb0I7QUFBQSxJQUMxRCx1QkFBdUIsQ0FBQyxlQUFlLHNCQUFzQixVQUFVO0FBQUEsSUFDdkUsZ0JBQWdCLENBQUMsY0FBYyxXQUFXLGVBQWUsU0FBUztBQUFBLElBQ2xFLG9CQUFvQixNQUFNLENBQUMsR0FBRyxTQUFTO0FBQUEsSUFDdkMsbUJBQW1CLENBQUMsYUFBMEM7QUFDNUQsWUFBTSxPQUFPLFdBQVcsU0FBUyxRQUFRO0FBQ3pDLGFBQU8sU0FBUyxTQUFZLFNBQVksZUFBZSxXQUFXLElBQUk7QUFBQSxJQUN4RTtBQUFBLElBQ0Esa0JBQWtCLE1BQU07QUFBQSxJQUN4QixlQUFlLENBQUMsTUFBTSxZQUFZLFNBQVMsU0FBUyxVQUFVLFdBQVcsY0FBYyxNQUFNLFlBQVksU0FBUyxTQUFTLEtBQUs7QUFBQSxJQUNoSSxVQUFVLENBQUMsU0FBUyxXQUFXLFNBQVMsSUFBSTtBQUFBLEVBQzlDO0FBQ0Y7QUFRTyxTQUFTLDZCQUE2QixRQUE2RDtBQUN4RyxRQUFNLEVBQUUsV0FBVyxRQUFRLElBQUksY0FBYyxPQUFPLFlBQVk7QUFDaEUsU0FBTyxzQkFBc0IsMEJBQTBCLEVBQUUsaUJBQWlCLFNBQVMsV0FBVyxZQUFZLElBQUksQ0FBQyxHQUFHLHVCQUF1QixDQUFDO0FBQzVJO0FBUU8sU0FBUyxpQkFBaUIsUUFBdUQ7QUFDdEYsUUFBTSxnQkFBZ0IsWUFBWSxPQUFPLGFBQWE7QUFDdEQsUUFBTSxrQkFBa0IsNkJBQTZCLEVBQUUsY0FBYyxHQUFHLGFBQWEsaUJBQWlCLENBQUM7QUFDdkcsU0FBTyxvQkFBb0I7QUFBQSxJQUN6QjtBQUFBLElBQ0EsV0FBVyxHQUFHLGFBQWE7QUFBQSxJQUMzQixHQUFHLE9BQU8sYUFBYSxFQUFFLFlBQVksT0FBTyxXQUFXLElBQUksQ0FBQztBQUFBLEVBQzlELENBQUM7QUFDSDtBQVVPLFNBQVMsMkJBQTJCLFVBQWtEO0FBQzNGLE1BQUksU0FBUyxXQUFXLEdBQUc7QUFDekIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxRQUFNLFNBQVMsb0JBQUksSUFBbUM7QUFDdEQsYUFBVyxXQUFXLFVBQVU7QUFDOUIsVUFBTSxPQUFPLE9BQU8sSUFBSSxRQUFRLFFBQVEsS0FBSyxDQUFDO0FBQzlDLFNBQUssS0FBSyxPQUFPO0FBQ2pCLFdBQU8sSUFBSSxRQUFRLFVBQVUsSUFBSTtBQUFBLEVBQ25DO0FBRUEsUUFBTSxRQUFrQixDQUFDO0FBQ3pCLGFBQVcsQ0FBQyxVQUFVLElBQUksS0FBSyxRQUFRO0FBQ3JDLGVBQVcsV0FBVyxDQUFDLEdBQUcsSUFBSSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sRUFBRSxPQUFPLEVBQUUsSUFBSSxHQUFHO0FBQy9ELFlBQU0sV0FBVyxHQUFHLFFBQVEsSUFBSSxPQUFPLFFBQVEsSUFBSSxDQUFDLElBQUksT0FBTyxRQUFRLE1BQU0sQ0FBQztBQUM5RSxZQUFNLFNBQVMsR0FBRyxRQUFRLGVBQWUsSUFBSSxRQUFRLElBQUksT0FBTyxRQUFRLGlCQUFpQjtBQUN6RixZQUFNLEtBQUssR0FBRyxRQUFRLElBQUksTUFBTSxPQUFPLGVBQWUsT0FBTyxDQUFDLEVBQUU7QUFBQSxJQUNsRTtBQUFBLEVBQ0Y7QUFDQSxRQUFNLEtBQUssSUFBSSxHQUFHLE9BQU8sU0FBUyxNQUFNLENBQUMsY0FBYztBQUN2RCxTQUFPLEdBQUcsTUFBTSxLQUFLLElBQUksQ0FBQztBQUFBO0FBQzVCO0FBRUEsU0FBUyxjQUFjLE1BQVksU0FBZ0M7QUFDakUsUUFBTSxhQUFhLEtBQUssY0FBYztBQUN0QyxNQUFJLEtBQUssV0FBVyxjQUFjLENBQUMsaUJBQWlCLElBQUksRUFBRSxJQUFJLFdBQVcsYUFBYSxHQUFHO0FBQ3ZGO0FBQUEsRUFDRjtBQUVBLFFBQU0sZUFBZSxZQUFZLFdBQVcsUUFBUTtBQUNwRCxhQUFXLFlBQVkscUJBQXFCLElBQUksR0FBRztBQUNqRCxVQUFNLGFBQWEsa0JBQWtCLFFBQVEsZ0JBQWdCLGVBQWUsV0FBVyxVQUFVLFNBQVMsU0FBUyxDQUFDLENBQUMsRUFDbEgsT0FBTyxDQUFDLGNBQWMsQ0FBQyxvQkFBb0IsV0FBVyxRQUFRLENBQUM7QUFDbEUsVUFBTSxzQkFBc0IsV0FBVyxPQUFPLENBQUMsY0FBYyxZQUFZLFVBQVUsUUFBUSxNQUFNLFlBQVk7QUFFN0csUUFBSSxvQkFBb0IsV0FBVyxHQUFHO0FBQ3BDLGNBQVEsU0FBUyxLQUFLLGFBQWEsTUFBTSxVQUFVLFVBQVUsY0FBYyxFQUFFLGlCQUFpQixXQUFXLFdBQVcsR0FBRyxvQkFBb0IsTUFBTSxDQUFDLENBQUM7QUFDbko7QUFBQSxJQUNGO0FBRUEsVUFBTSxvQkFBb0Isb0JBQW9CLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxZQUFZLFVBQVUsUUFBUSxDQUFDLENBQUM7QUFDaEgsUUFBSSxrQkFBa0IsV0FBVyxHQUFHO0FBQ2xDLGNBQVEsU0FBUyxLQUFLLGFBQWEsTUFBTSxVQUFVLFVBQVUsY0FBYyxFQUFFLGlCQUFpQixPQUFPLG9CQUFvQixLQUFLLENBQUMsQ0FBQztBQUFBLElBQ2xJO0FBQUEsRUFDRjtBQUNGO0FBRUEsU0FBUyxjQUFjLE1BQVksU0FBZ0M7QUFDakUsUUFBTSxXQUFXLGtCQUFrQixJQUFJO0FBQ3ZDLE1BQUksQ0FBQyxVQUFVO0FBQ2I7QUFBQSxFQUNGO0FBQ0EsUUFBTSxpQkFBaUIsa0JBQWtCLElBQUk7QUFDN0MsTUFBSSxDQUFDLGdCQUFnQjtBQUNuQjtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGdCQUFnQixpQkFBaUIsSUFBSTtBQUMzQyxNQUFJLGNBQWMsSUFBSSxXQUFXLGFBQWEsS0FBSyxjQUFjLElBQUksV0FBVyxlQUFlLEtBQUssb0JBQW9CLElBQUksU0FBUyxRQUFRLENBQUMsR0FBRztBQUMvSTtBQUFBLEVBQ0Y7QUFFQSxRQUFNLGtCQUFrQix5QkFBeUIsYUFBYTtBQUM5RCxNQUFJLG9CQUFvQixXQUFXO0FBQ2pDO0FBQUEsRUFDRjtBQUVBLFFBQU0sYUFBYSxLQUFLLGNBQWM7QUFDdEMsUUFBTSxhQUFhLGtCQUFrQixRQUFRLGdCQUFnQixlQUFlLFdBQVcsVUFBVSxTQUFTLFNBQVMsQ0FBQyxDQUFDLEVBQ2xILE9BQU8sQ0FBQyxjQUFjLENBQUMsb0JBQW9CLFdBQVcsUUFBUSxDQUFDO0FBQ2xFLFFBQU0sb0JBQW9CLFdBQVcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLFlBQVksVUFBVSxRQUFRLENBQUMsQ0FBQztBQUV2RyxRQUFNLGVBQWUsc0JBQXNCLG1CQUFtQixnQkFBZ0IsT0FBTztBQUNyRixRQUFNLGtCQUFrQixzQkFBc0IsWUFBWSxnQkFBZ0IsT0FBTztBQUVqRixNQUFJLGlCQUFpQixVQUFVO0FBQzdCO0FBQUEsRUFDRjtBQUVBLE1BQUksYUFBYSxZQUFZLEtBQUssYUFBYSxlQUFlLEdBQUc7QUFDL0Q7QUFBQSxFQUNGO0FBRUEsVUFBUSxTQUFTLEtBQUssYUFBYSxNQUFNLFVBQVUsaUJBQWlCLGNBQWM7QUFBQSxJQUNoRixpQkFBaUIsV0FBVyxXQUFXO0FBQUEsSUFDdkMsb0JBQW9CLGFBQWEsZUFBZSxJQUFJLGFBQWEsWUFBWTtBQUFBLEVBQy9FLENBQUMsQ0FBQztBQUNKO0FBRUEsU0FBUyxhQUNQLE1BQ0EsVUFDQSxpQkFDQSxtQkFDQSxPQUNxQjtBQUNyQixRQUFNLGFBQWEsS0FBSyxjQUFjO0FBQ3RDLFFBQU0sRUFBRSxXQUFXLEtBQUssSUFBSSxXQUFXLDhCQUE4QixTQUFTLFNBQVMsQ0FBQztBQUN4RixTQUFPO0FBQUEsSUFDTCxRQUFRLFlBQVk7QUFBQSxJQUNwQjtBQUFBLElBQ0EsVUFBVSxZQUFZLFdBQVcsUUFBUTtBQUFBLElBQ3pDLGlCQUFpQixNQUFNO0FBQUEsSUFDdkIsb0JBQW9CLE1BQU07QUFBQSxJQUMxQixVQUFVLG9CQUFvQjtBQUFBLElBQzlCLE1BQU0sT0FBTztBQUFBLElBQ2IsTUFBTSxTQUFTLFFBQVE7QUFBQSxJQUN2QjtBQUFBLEVBQ0Y7QUFDRjtBQUVBLFNBQVMsa0JBQWtCLG1CQUF3RTtBQUNqRyxRQUFNLGFBQWtDLENBQUM7QUFDekMsYUFBVyxvQkFBb0IscUJBQXFCLENBQUMsR0FBRztBQUN0RCxlQUFXLGFBQWEsaUJBQWlCLFlBQVk7QUFDbkQsaUJBQVcsS0FBSyxFQUFFLFVBQVUsVUFBVSxVQUFVLE9BQU8sVUFBVSxTQUFTLE1BQU0sQ0FBQztBQUFBLElBQ25GO0FBQUEsRUFDRjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsc0JBQ1AsWUFDQSxnQkFDQSxTQUNnQjtBQUNoQixNQUFJLFdBQVcsV0FBVyxHQUFHO0FBQzNCLFdBQU87QUFBQSxFQUNUO0FBRUEsTUFBSSxTQUF5QjtBQUM3QixhQUFXLGFBQWEsWUFBWTtBQUNsQyxVQUFNLGlCQUFpQixtQkFBbUIsUUFBUSxTQUFTLFVBQVUsVUFBVSxVQUFVLEtBQUs7QUFDOUYsUUFBSSxtQkFBbUIsZ0JBQWdCO0FBQ3JDO0FBQUEsSUFDRjtBQUNBLFFBQUksa0JBQWtCLGNBQWMsZ0JBQWdCLGdCQUFnQixRQUFRLE9BQU8sR0FBRztBQUNwRixlQUFTO0FBQ1Q7QUFBQSxJQUNGO0FBQ0EsV0FBTztBQUFBLEVBQ1Q7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGVBQWUsU0FBc0M7QUFDNUQsUUFBTSxPQUFPLG1CQUFtQixrQkFBa0IsUUFBUSxpQkFBaUIsQ0FBQztBQUM1RSxNQUFJLFFBQVEsb0JBQW9CO0FBQzlCLFdBQU8sR0FBRyxJQUFJO0FBQUEsRUFDaEI7QUFDQSxNQUFJLFFBQVEsaUJBQWlCO0FBQzNCLFdBQU8sR0FBRyxJQUFJO0FBQUEsRUFDaEI7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLG1CQUFtQixNQUFZLFVBQW9DO0FBQzFFLE1BQUksV0FBVyxLQUFLLFNBQVMsS0FBSyxZQUFZLEtBQUssT0FBTyxHQUFHO0FBQzNELFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxTQUFlO0FBQ25CLE9BQUssYUFBYSxDQUFDLFVBQVU7QUFDM0IsVUFBTSxRQUFRLG1CQUFtQixPQUFPLFFBQVE7QUFDaEQsUUFBSSxPQUFPO0FBQ1QsZUFBUztBQUFBLElBQ1g7QUFBQSxFQUNGLENBQUM7QUFDRCxTQUFPO0FBQ1Q7QUFFQSxTQUFTLG1CQUFtQixTQUFrQixVQUFrQixVQUFvRDtBQUNsSCxRQUFNLGFBQWEsUUFBUSxjQUFjLFFBQVE7QUFDakQsb0JBQWtCLFlBQVkscUNBQXFDLFFBQVEsRUFBRTtBQUM3RSxRQUFNLE9BQU8sbUJBQW1CLFlBQVksUUFBUTtBQUNwRCxvQkFBa0IsTUFBTSw2QkFBNkIsT0FBTyxRQUFRLENBQUMsT0FBTyxRQUFRLEVBQUU7QUFDdEYsU0FBTyxrQkFBa0IsSUFBSTtBQUMvQjtBQUVBLFNBQVMseUJBQXlCLGVBQXdEO0FBQ3hGLE1BQUksY0FBYyxJQUFJLFdBQVcsY0FBYyxHQUFHO0FBQ2hELFdBQU87QUFBQSxFQUNUO0FBQ0EsTUFBSSxjQUFjLElBQUksV0FBVyxnQkFBZ0IsR0FBRztBQUNsRCxXQUFPO0FBQUEsRUFDVDtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsa0JBQWtCLE1BQThDO0FBQ3ZFLE1BQUksVUFBZ0I7QUFDcEIsU0FBTyxDQUFDLGFBQWEsT0FBTyxHQUFHO0FBQzdCLFFBQUksWUFBWSxPQUFPLEdBQUc7QUFDeEIsYUFBTztBQUFBLElBQ1Q7QUFDQSxjQUFVLFFBQVE7QUFBQSxFQUNwQjtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMscUJBQXFCLE1BQW9CO0FBQ2hELE1BQUksc0JBQXNCLElBQUksS0FBSyxtQkFBbUIsSUFBSSxLQUFLLHVCQUF1QixJQUFJLEtBQUssdUJBQXVCLElBQUksS0FBSyxrQkFBa0IsSUFBSSxHQUFHO0FBQ3RKLFdBQU8sS0FBSyxPQUFPLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQztBQUFBLEVBQ3BDO0FBQ0EsTUFBSSxvQkFBb0IsSUFBSSxHQUFHO0FBQzdCLFdBQU8sS0FBSyxnQkFBZ0IsYUFBYSxJQUFJLENBQUMsZ0JBQWdCLFlBQVksSUFBSSxFQUFFLE9BQU8sWUFBWTtBQUFBLEVBQ3JHO0FBQ0EsU0FBTyxDQUFDO0FBQ1Y7QUFFQSxTQUFTLGtCQUFrQixNQUE4QjtBQUN2RCxNQUFJLG9CQUFvQixJQUFJLEtBQUssc0JBQXNCLElBQUksS0FBSyx5QkFBeUIsSUFBSSxLQUFLLHlCQUF5QixJQUFJLEdBQUc7QUFDaEksV0FBTyxLQUFLO0FBQUEsRUFDZDtBQUNBLFNBQU87QUFDVDtBQUVBLFNBQVMsaUJBQWlCLE1BQXFDO0FBQzdELFFBQU0sUUFBUSxvQkFBSSxJQUFnQjtBQUNsQyxNQUFJLGlCQUFpQixJQUFJLEdBQUc7QUFDMUIsZUFBVyxZQUFZLGFBQWEsSUFBSSxLQUFLLENBQUMsR0FBRztBQUMvQyxZQUFNLElBQUksU0FBUyxJQUFJO0FBQUEsSUFDekI7QUFBQSxFQUNGO0FBQ0EsU0FBTztBQUNUO0FBRUEsU0FBUyxvQkFBb0IsV0FBOEIsVUFBeUI7QUFDbEYsU0FBTyxZQUFZLFVBQVUsUUFBUSxNQUFNLFlBQVksU0FBUyxjQUFjLEVBQUUsUUFBUSxLQUFLLFVBQVUsVUFBVSxTQUFTLFNBQVM7QUFDckk7QUFFQSxTQUFTLGNBQWMsU0FBK0IsTUFBNEIsU0FBK0I7QUFDL0csUUFBTSxhQUFhLEtBQUssT0FBTyxRQUFRLG9CQUFvQixLQUFLLElBQUksSUFBSTtBQUN4RSxNQUFJLENBQUMsWUFBWTtBQUNmLFdBQU87QUFBQSxFQUNUO0FBRUEsYUFBVyxVQUFVLFFBQVEsbUJBQW1CLENBQUMsR0FBRztBQUNsRCxRQUFJLE9BQU8sVUFBVSxXQUFXLGdCQUFnQjtBQUM5QztBQUFBLElBQ0Y7QUFDQSxlQUFXLGtCQUFrQixPQUFPLE9BQU87QUFDekMsWUFBTSxTQUFTLFFBQVEsa0JBQWtCLGVBQWUsVUFBVSxFQUFFLFVBQVU7QUFDOUUsVUFBSSxXQUFXLFlBQVk7QUFDekIsZUFBTztBQUFBLE1BQ1Q7QUFDQSxpQkFBVyxlQUFlLFFBQVEsZ0JBQWdCLENBQUMsR0FBRztBQUNwRCxZQUFJLFlBQVksV0FBVyxLQUFLLGNBQWMsYUFBYSxNQUFNLE9BQU8sR0FBRztBQUN6RSxpQkFBTztBQUFBLFFBQ1Q7QUFBQSxNQUNGO0FBQUEsSUFDRjtBQUFBLEVBQ0Y7QUFDQSxTQUFPO0FBQ1Q7QUFFQSxTQUFTLGdCQUFnQixVQUFrQixXQUE0QjtBQUNyRSxTQUFPLFNBQVMsV0FBVyxHQUFHLFNBQVMsR0FBRyxLQUFLLFNBQVMsU0FBUyxLQUFLLEtBQUssQ0FBQyxTQUFTLFNBQVMsT0FBTztBQUN2RztBQUVBLFNBQVMsV0FBVyxVQUEyQjtBQUM3QyxTQUFPLFNBQVMsU0FBUyxRQUFRLEtBQUssU0FBUyxTQUFTLGVBQWU7QUFDekU7QUFFQSxTQUFTLGFBQWEsVUFBa0M7QUFDdEQsU0FBTyxzQkFBc0IsUUFBUSxRQUFRO0FBQy9DOyIsCiAgIm5hbWVzIjogW10KfQo=
|
|
544
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vLi4vc3JjL3NjcmlwdC11dGlscy9saW50ZXJzL292ZXItZXhwb3N1cmUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBPdmVyLWV4cG9zdXJlIGFuYWx5emVyLlxuICpcbiAqIEZpbmRzIGRlY2xhcmF0aW9ucyBleHBvc2VkIG1vcmUgYnJvYWRseSB0aGFuIHRoZWlyIHJlZmVyZW5jZXMgcmVxdWlyZSwgc28gdGhlIGV4cG9zdXJlIGNhbiBiZVxuICogdGlnaHRlbmVkOlxuICpcbiAqIC0gYGV4cG9ydGBlZCBzeW1ib2xzIHJlZmVyZW5jZWQgb25seSB3aXRoaW4gdGhlaXIgb3duIGZpbGUgXHUyMDE0IHRoZSBgZXhwb3J0YCBjYW4gYmUgZHJvcHBlZC5cbiAqIC0gYHB1YmxpY2AgY2xhc3MgbWVtYmVycyByZWZlcmVuY2VkIG9ubHkgaW5zaWRlIHRoZWlyIG93biBjbGFzcyBcdTIwMTQgdGhleSBjYW4gYmUgYHByaXZhdGVgLlxuICogLSBgcHVibGljYCBjbGFzcyBtZW1iZXJzIHJlZmVyZW5jZWQgb25seSBpbnNpZGUgdGhlaXIgb3duIGNsYXNzIGFuZCBpdHMgc3ViY2xhc3NlcyBcdTIwMTQgdGhleSBjYW4gYmVcbiAqICAgYHByb3RlY3RlZGAuXG4gKiAtIGBwcm90ZWN0ZWRgIGNsYXNzIG1lbWJlcnMgcmVmZXJlbmNlZCBvbmx5IGluc2lkZSB0aGVpciBvd24gY2xhc3MgXHUyMDE0IHRoZXkgY2FuIGJlIGBwcml2YXRlYC5cbiAqXG4gKiBUaGUgYW5hbHlzaXMgaXMgd2hvbGUtcHJvZ3JhbSBhbmQgdHlwZS1hd2FyZTogaXQgdXNlcyB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBzZXJ2aWNlJ3NcbiAqIGZpbmQtYWxsLXJlZmVyZW5jZXMgdG8gbG9jYXRlIGV2ZXJ5IHVzZSBvZiBlYWNoIGRlY2xhcmF0aW9uLCB0aGVuIGNsYXNzaWZpZXMgdGhlIHRpZ2h0ZXN0XG4gKiBleHBvc3VyZSB0aGF0IHN0aWxsIGNvdmVycyBhbGwgcmVmZXJlbmNlcy4gTWVtYmVycyBpbnZva2VkIGJ5IHRoZSBmcmFtZXdvcmsgdmlhIHJlZ2lzdHJhdGlvblxuICogcmF0aGVyIHRoYW4gYnkgdmlzaWJsZSByZWZlcmVuY2VzIChPYnNpZGlhbiBsaWZlY3ljbGUgaG9va3MsIHNldHRpbmdzLXRhYiBgZGlzcGxheWAsIGV0Yy4pIGFyZVxuICogZXhjbHVkZWQgdmlhIHtAbGluayBMSUZFQ1lDTEVfQUxMT1dMSVNUfSwgYXMgYXJlIGBvdmVycmlkZWAgYW5kIGBzdGF0aWNgIG1lbWJlcnMgd2hvc2UgZXhwb3N1cmUgaXNcbiAqIGNvbnN0cmFpbmVkIGJ5IGEgYmFzZSBkZWNsYXJhdGlvbi5cbiAqXG4gKiBBIG1lbWJlciByZWZlcmVuY2VkIG9ubHkgZnJvbSB0ZXN0IGZpbGVzIGlzIHJlcG9ydGVkIHdpdGgge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5fVxuICogc2V0LCBzdXJmYWNpbmcgbWVtYmVycyB3aWRlbmVkIHB1cmVseSBmb3IgdGVzdGFiaWxpdHkgXHUyMDE0IHRoZSBjYW5vbmljYWwgY2FzZSBmb3IgZXh0cmFjdGluZyBsb2dpY1xuICogaW50byBhbiBpbmRlcGVuZGVudGx5IHRlc3RhYmxlIGNvbXBvbmVudCBpbnN0ZWFkLlxuICpcbiAqIEJleW9uZCByZXBvcnRpbmcsIHBhc3NpbmcgYHNob3VsZEZpeGAgdG8ge0BsaW5rIGZpbmRPdmVyRXhwb3N1cmV9IC8ge0BsaW5rIGFuYWx5emVPdmVyRXhwb3N1cmV9XG4gKiByZXdyaXRlcyB0aGUgc291cmNlIGluIHBsYWNlOiBkcm9wcGluZyB0aGUgYGV4cG9ydGAga2V5d29yZCwgb3IgcmVwbGFjaW5nL2luc2VydGluZyBhIGBwcml2YXRlYFxuICogb3IgYHByb3RlY3RlZGAgbW9kaWZpZXIuIEVhY2ggZmluZGluZyB0aGVuIGNhcnJpZXMge0BsaW5rIE92ZXJFeHBvc3VyZUZpbmRpbmcud2FzRml4ZWR9IC9cbiAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBDaGFuZ2VzIHRoYXQgY2Fubm90IGJlIHNhZmVseSBhdXRvbWF0ZWQgXHUyMDE0IHRob3NlIGZvcmNlZFxuICogb25seSBieSB0ZXN0IHJlZmVyZW5jZXMsIGRlY29yYXRlZCBtZW1iZXJzLCBvciBhbiBgZXhwb3J0YCBzaGFyZWQgd2l0aCBhIHN0aWxsLWV4cG9ydGVkIHNpYmxpbmcgXHUyMDE0XG4gKiBhcmUgcmVwb3J0ZWQgYXMgc2tpcHBlZCBhbmQgbGVmdCB1bnRvdWNoZWQuXG4gKi9cblxuaW1wb3J0IHR5cGUge1xuICBDbGFzc0RlY2xhcmF0aW9uLFxuICBDbGFzc0xpa2VEZWNsYXJhdGlvbixcbiAgQ29tcGlsZXJPcHRpb25zLFxuICBFbnVtRGVjbGFyYXRpb24sXG4gIEZ1bmN0aW9uRGVjbGFyYXRpb24sXG4gIEdldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIEludGVyZmFjZURlY2xhcmF0aW9uLFxuICBJU2NyaXB0U25hcHNob3QsXG4gIExhbmd1YWdlU2VydmljZSxcbiAgTGFuZ3VhZ2VTZXJ2aWNlSG9zdCxcbiAgTWV0aG9kRGVjbGFyYXRpb24sXG4gIE5vZGUsXG4gIFByb2dyYW0sXG4gIFByb3BlcnR5RGVjbGFyYXRpb24sXG4gIFJlZmVyZW5jZWRTeW1ib2wsXG4gIFNldEFjY2Vzc29yRGVjbGFyYXRpb24sXG4gIFR5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBUeXBlQ2hlY2tlcixcbiAgVmFyaWFibGVTdGF0ZW1lbnRcbn0gZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7XG4gIGNhbkhhdmVNb2RpZmllcnMsXG4gIGNyZWF0ZURvY3VtZW50UmVnaXN0cnksXG4gIGNyZWF0ZUxhbmd1YWdlU2VydmljZSxcbiAgZ2V0RGVjb3JhdG9ycyxcbiAgZ2V0RGVmYXVsdExpYkZpbGVQYXRoLFxuICBnZXRNb2RpZmllcnMsXG4gIGlzQ2xhc3NEZWNsYXJhdGlvbixcbiAgaXNDbGFzc0xpa2UsXG4gIGlzRW51bURlY2xhcmF0aW9uLFxuICBpc0Z1bmN0aW9uRGVjbGFyYXRpb24sXG4gIGlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgaXNJZGVudGlmaWVyLFxuICBpc0ludGVyZmFjZURlY2xhcmF0aW9uLFxuICBpc01ldGhvZERlY2xhcmF0aW9uLFxuICBpc1Byb3BlcnR5RGVjbGFyYXRpb24sXG4gIGlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbixcbiAgaXNTb3VyY2VGaWxlLFxuICBpc1R5cGVBbGlhc0RlY2xhcmF0aW9uLFxuICBpc1ZhcmlhYmxlU3RhdGVtZW50LFxuICBTY3JpcHRTbmFwc2hvdCxcbiAgU3ludGF4S2luZCxcbiAgc3lzXG59IGZyb20gJ3R5cGVzY3JpcHQnO1xuXG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uLy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7XG4gIHBhcnNlVHNDb25maWcsXG4gIHRvQ2Fub25pY2FsXG59IGZyb20gJy4uL2NoZWNrLXByb2plY3QtdHlwZXMudHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqIFRoZSBsYW5ndWFnZSBzZXJ2aWNlIHRvIHF1ZXJ5IGZvciByZWZlcmVuY2VzIGFuZCB0eXBlcy4gKi9cbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGJlZm9yZSB0aGF0IGZpbGUgaXMgcHJvY2Vzc2VkLiBUaGVcbiAgICogd2hvbGUtcHJvZ3JhbSByZWZlcmVuY2UgYW5hbHlzaXMgaXMgc2xvdywgc28gdGhpcyBsZXRzIGNhbGxlcnMgcmVwb3J0IGxpdmUgcHJvZ3Jlc3MgaW5zdGVhZCBvZlxuICAgKiBhcHBlYXJpbmcgdG8gaGFuZy5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBlYWNoIGZpeGFibGUgZmluZGluZyBpcyB0aWdodGVuZWQgaW4gcGxhY2UgdmlhIHtAbGluayB3cml0ZUZpbGV9ICh3aGljaCBtdXN0IHRoZW5cbiAgICogYmUgcHJvdmlkZWQpLCBhbmQgdGhlIHJldHVybmVkIGZpbmRpbmdzIGNhcnJ5IHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLndhc0ZpeGVkfSAvXG4gICAqIHtAbGluayBPdmVyRXhwb3N1cmVGaW5kaW5nLnNraXBSZWFzb259LiBXaGVuIGBmYWxzZWAgb3Igb21pdHRlZCwgdGhlIGFuYWx5c2lzIG9ubHkgcmVwb3J0cy5cbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEZpeD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEFic29sdXRlIChjYW5vbmljYWwpIHBhdGggb2YgdGhlIHByb2plY3QncyBgc3JjYCBmb2xkZXIuIE9ubHkgZGVjbGFyYXRpb25zIGluIG5vbi10ZXN0IGZpbGVzXG4gICAqIHVuZGVyIHRoaXMgZm9sZGVyIGFyZSBhbmFseXplZDsgZGVjbGFyYXRpb25zIGVsc2V3aGVyZSAodGVzdCBmaWxlcywgZGVwZW5kZW5jaWVzKSBhcmUgaWdub3JlZFxuICAgKiBidXQgc3RpbGwgY291bnRlZCBhcyByZWZlcmVuY2Ugc2l0ZXMuXG4gICAqL1xuICByZWFkb25seSBzcmNGb2xkZXI6IHN0cmluZztcblxuICAvKipcbiAgICogV3JpdGVzIHRoZSB0aWdodGVuZWQgY29udGVudHMgb2YgYSBjaGFuZ2VkIGZpbGUgYmFjayB0byBkaXNrLiBSZXF1aXJlZCB3aGVuIHtAbGluayBzaG91bGRGaXh9XG4gICAqIGlzIGB0cnVlYDsgaWdub3JlZCBvdGhlcndpc2UuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoIC0gQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSB0byB3cml0ZSAob3JpZ2luYWwgY2FzaW5nLCBhcyBzdG9yZWQgaW4gdGhlIHByb2dyYW0pLlxuICAgKiBAcGFyYW0gY29udGVudCAtIFRoZSBmdWxsIG5ldyBmaWxlIGNvbnRlbnRzLlxuICAgKi9cbiAgd3JpdGVGaWxlPyh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3R9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXMge1xuICAvKiogVGhlIGNvbXBpbGVyIG9wdGlvbnMuICovXG4gIHJlYWRvbmx5IGNvbXBpbGVyT3B0aW9uczogQ29tcGlsZXJPcHRpb25zO1xuXG4gIC8qKiBUaGUgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcHJvZ3JhbS4gKi9cbiAgcmVhZG9ubHkgZmlsZU5hbWVzOiByZWFkb25seSBzdHJpbmdbXTtcblxuICAvKiogVGhlIGZpbGUtc3lzdGVtIG9wZXJhdGlvbnMgdXNlZCB0byByZWFkIHNvdXJjZXMuICovXG4gIHJlYWRvbmx5IGZpbGVTeXN0ZW06IE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW07XG59XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2V9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2VQYXJhbXMge1xuICAvKiogQWJzb2x1dGUgcGF0aCB0byB0aGUgcHJvamVjdCdzIGB0c2NvbmZpZy5qc29uYC4gKi9cbiAgcmVhZG9ubHkgdHNDb25maWdQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY3VycmVudGx5IGhhcy5cbiAqL1xuZXhwb3J0IHR5cGUgQ3VycmVudEV4cG9zdXJlID0gJ2V4cG9ydCcgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgZm9yIHtAbGluayBmaW5kT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGNhbGxiYWNrIGludm9rZWQgb25jZSBwZXIgYW5hbHl6ZWQgc291cmNlIGZpbGUsIGZvciBsaXZlIHByb2dyZXNzIHJlcG9ydGluZy4gRm9yd2FyZGVkXG4gICAqIHRvIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAgICovXG4gIG9uUHJvZ3Jlc3M/KHRoaXM6IHZvaWQsIHByb2dyZXNzOiBPdmVyRXhwb3N1cmVQcm9ncmVzcyk6IHZvaWQ7XG5cbiAgLyoqIEFic29sdXRlIHBhdGggdG8gdGhlIHByb2plY3Qgcm9vdCAodGhlIGZvbGRlciBjb250YWluaW5nIGB0c2NvbmZpZy5qc29uYCBhbmQgYHNyY2ApLiAqL1xuICByZWFkb25seSBwcm9qZWN0Rm9sZGVyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCBmaXhhYmxlIGZpbmRpbmdzIGFyZSB0aWdodGVuZWQgaW4gcGxhY2Ugb24gZGlzayAodGhlIGBleHBvcnRgIGtleXdvcmQgaXMgZHJvcHBlZCxcbiAgICogb3IgYSBgcHJpdmF0ZWAgLyBgcHJvdGVjdGVkYCBtb2RpZmllciBpcyBpbnNlcnRlZC9yZXBsYWNlZCkuIFdoZW4gYGZhbHNlYCBvciBvbWl0dGVkLCB0aGVcbiAgICogcHJvamVjdCBpcyBvbmx5IGFuYWx5emVkLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkRml4PzogYm9vbGVhbiB8IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciB7QGxpbmsgZm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3N9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdE92ZXJFeHBvc3VyZUZpbmRpbmdzT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBXaGVuIHNldCwgZmlsZSBwYXRocyBpbiB0aGUgcmVwb3J0IGFyZSByZW5kZXJlZCByZWxhdGl2ZSB0byB0aGlzIGZvbGRlciAodHlwaWNhbGx5IHRoZSBjdXJyZW50XG4gICAqIHdvcmtpbmcgZGlyZWN0b3J5KSBpbnN0ZWFkIG9mIGFzIGFic29sdXRlIHBhdGhzLiBQYXRocyBvdXRzaWRlIHRoZSBmb2xkZXIgc3RheSBhYnNvbHV0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGJhc2VGb2xkZXI/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIHN1YnNldCBvZiBmaWxlLXN5c3RlbSBvcGVyYXRpb25zIHRoZSBsYW5ndWFnZS1zZXJ2aWNlIGhvc3QgbmVlZHMuIEluamVjdGluZyB0aGlzIChyYXRoZXIgdGhhblxuICogYWx3YXlzIHVzaW5nIGB0eXBlc2NyaXB0YCdzIGBzeXNgKSBsZXRzIHRlc3RzIGRyaXZlIHRoZSBhbmFseXplciBhZ2FpbnN0IGluLW1lbW9yeSBzb3VyY2VzIHdpdGggbm9cbiAqIHJlYWwgZmlsZS1zeXN0ZW0gYWNjZXNzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbGVTeXN0ZW0ge1xuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBEaXJlY3RvcnkgcGF0aC5cbiAgICogQHJldHVybnMgYHRydWVgIHdoZW4gdGhlIGRpcmVjdG9yeSBleGlzdHMuXG4gICAqL1xuICBkaXJlY3RvcnlFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIHBhdGggLSBGaWxlIHBhdGguXG4gICAqIEByZXR1cm5zIGB0cnVlYCB3aGVuIHRoZSBmaWxlIGV4aXN0cy5cbiAgICovXG4gIGZpbGVFeGlzdHModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkuXG4gICAqL1xuICBnZXRDdXJyZW50RGlyZWN0b3J5KHRoaXM6IHZvaWQpOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRGlyZWN0b3J5IHBhdGguXG4gICAqIEByZXR1cm5zIFRoZSBpbW1lZGlhdGUgc3ViZGlyZWN0b3J5IG5hbWVzLlxuICAgKi9cbiAgZ2V0RGlyZWN0b3JpZXModGhpczogdm9pZCwgcGF0aDogc3RyaW5nKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gUm9vdCBkaXJlY3RvcnkuXG4gICAqIEBwYXJhbSBleHRlbnNpb25zIC0gRXh0ZW5zaW9ucyB0byBpbmNsdWRlLlxuICAgKiBAcGFyYW0gZXhjbHVkZSAtIFBhdHRlcm5zIHRvIGV4Y2x1ZGUuXG4gICAqIEBwYXJhbSBpbmNsdWRlIC0gUGF0dGVybnMgdG8gaW5jbHVkZS5cbiAgICogQHBhcmFtIGRlcHRoIC0gTWF4aW11bSByZWN1cnNpb24gZGVwdGguXG4gICAqIEByZXR1cm5zIFRoZSBtYXRjaGluZyBmaWxlIHBhdGhzLlxuICAgKi9cbiAgcmVhZERpcmVjdG9yeSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcsIGV4dGVuc2lvbnM/OiByZWFkb25seSBzdHJpbmdbXSwgZXhjbHVkZT86IHJlYWRvbmx5IHN0cmluZ1tdLCBpbmNsdWRlPzogcmVhZG9ubHkgc3RyaW5nW10sIGRlcHRoPzogbnVtYmVyKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBwYXRoIC0gRmlsZSBwYXRoLlxuICAgKiBAcmV0dXJucyBUaGUgZmlsZSBjb250ZW50cywgb3IgYHVuZGVmaW5lZGAgd2hlbiBhYnNlbnQuXG4gICAqL1xuICByZWFkRmlsZSh0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQSBzaW5nbGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICAvKiogMS1iYXNlZCBjb2x1bW4gb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgY29sdW1uOiBudW1iZXI7XG5cbiAgLyoqIFRoZSBjdXJyZW50IGV4cG9zdXJlIGxldmVsLiAqL1xuICByZWFkb25seSBjdXJyZW50RXhwb3N1cmU6IEN1cnJlbnRFeHBvc3VyZTtcblxuICAvKiogQWJzb2x1dGUgcGF0aCBvZiB0aGUgZmlsZSBkZWNsYXJpbmcgdGhlIHN5bWJvbC4gKi9cbiAgcmVhZG9ubHkgZmlsZVBhdGg6IHN0cmluZztcblxuICAvKiogYHRydWVgIHdoZW4gdGhlIGRlY2xhcmF0aW9uIGhhcyBubyByZWZlcmVuY2VzIGF0IGFsbCAoYmVzaWRlcyBpdHNlbGYpLiAqL1xuICByZWFkb25seSBoYXNOb1JlZmVyZW5jZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIGB0cnVlYCB3aGVuIHRoZSBkZWNsYXJhdGlvbiB3b3VsZCBxdWFsaWZ5IGZvciBhIHRpZ2h0ZXIgZXhwb3N1cmUgaWYgbm90IGZvciByZWZlcmVuY2VzIGNvbWluZ1xuICAgKiBleGNsdXNpdmVseSBmcm9tIHRlc3QgZmlsZXMgXHUyMDE0IGkuZS4gaXQgaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RhYmlsaXR5LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNGb3JjZWRCeVRlc3RPbmx5OiBib29sZWFuO1xuXG4gIC8qKiBgdHJ1ZWAgZm9yIGEgY2xhc3MgbWVtYmVyLCBgZmFsc2VgIGZvciBhIHRvcC1sZXZlbCBleHBvcnQuICovXG4gIHJlYWRvbmx5IGlzTWVtYmVyOiBib29sZWFuO1xuXG4gIC8qKiAxLWJhc2VkIGxpbmUgb2YgdGhlIGRlY2xhcmF0aW9uJ3MgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbGluZTogbnVtYmVyO1xuXG4gIC8qKiBUaGUgZGVjbGFyZWQgbmFtZS4gKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJbiBhIGZpeCBydW4sIHdoeSB0aGlzIGZpbmRpbmcgd2FzIGxlZnQgdW50b3VjaGVkIGluc3RlYWQgb2YgdGlnaHRlbmVkOyBgbnVsbGAgd2hlbiBpdCB3YXNcbiAgICogZml4ZWQgb3Igd2hlbiB0aGUgYW5hbHlzaXMgb25seSByZXBvcnRlZCAoYHNob3VsZEZpeGAgb2ZmKS5cbiAgICovXG4gIHJlYWRvbmx5IHNraXBSZWFzb246IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uO1xuXG4gIC8qKiBUaGUgZXhwb3N1cmUgdGhlIGRlY2xhcmF0aW9uIGNvdWxkIGJlIHRpZ2h0ZW5lZCB0by4gKi9cbiAgcmVhZG9ubHkgc3VnZ2VzdGVkRXhwb3N1cmU6IFN1Z2dlc3RlZEV4cG9zdXJlO1xuXG4gIC8qKiBgdHJ1ZWAgd2hlbiBhIGZpeCBydW4gdGlnaHRlbmVkIHRoaXMgZGVjbGFyYXRpb24gaW4gcGxhY2UuIEFsd2F5cyBgZmFsc2VgIGluIGEgcmVwb3J0IHJ1bi4gKi9cbiAgcmVhZG9ubHkgd2FzRml4ZWQ6IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvZ3Jlc3MgcmVwb3J0ZWQgd2hpbGUgYW5hbHl6aW5nIGEgcHJvamVjdCwgb25lIGV2ZW50IHBlciBhbmFseXplZCBzb3VyY2UgZmlsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPdmVyRXhwb3N1cmVQcm9ncmVzcyB7XG4gIC8qKiBOdW1iZXIgb2Ygc291cmNlIGZpbGVzIGZ1bGx5IGFuYWx5emVkIGJlZm9yZSB0aGUgY3VycmVudCBvbmUgKDAtYmFzZWQpLiAqL1xuICByZWFkb25seSBhbmFseXplZEZpbGVDb3VudDogbnVtYmVyO1xuXG4gIC8qKiBBYnNvbHV0ZSAoY2Fub25pY2FsKSBwYXRoIG9mIHRoZSBzb3VyY2UgZmlsZSBhYm91dCB0byBiZSBhbmFseXplZC4gKi9cbiAgcmVhZG9ubHkgY3VycmVudEZpbGVQYXRoOiBzdHJpbmc7XG5cbiAgLyoqIFRvdGFsIG51bWJlciBvZiBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGFuYWx5emVkLiAqL1xuICByZWFkb25seSB0b3RhbEZpbGVDb3VudDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFdoeSBhIGZpeCBydW4gbGVmdCBhIGZpbmRpbmcgdW50b3VjaGVkOlxuICpcbiAqIC0gYGRlY29yYXRlZGAgXHUyMDE0IHRoZSBtZW1iZXIgY2FycmllcyBhIGRlY29yYXRvciwgc28gdGhlIG1vZGlmaWVyIGluc2VydGlvbiBwb2ludCBpcyBhbWJpZ3VvdXMuXG4gKiAtIGBzaGFyZWQtZXhwb3J0YCBcdTIwMTQgdGhlIGBleHBvcnRgIGtleXdvcmQgaXMgc2hhcmVkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nIGRlY2xhcmF0b3IuXG4gKiAtIGB0ZXN0LW9ubHlgIFx1MjAxNCB0aGUgZGVjbGFyYXRpb24gaXMgZXhwb3NlZCBwdXJlbHkgZm9yIHRlc3RzLCBzbyB0aWdodGVuaW5nIHdvdWxkIGJyZWFrIHRoZSB0ZXN0LlxuICovXG5leHBvcnQgdHlwZSBPdmVyRXhwb3N1cmVTa2lwUmVhc29uID0gJ2RlY29yYXRlZCcgfCAnc2hhcmVkLWV4cG9ydCcgfCAndGVzdC1vbmx5JztcblxuLyoqXG4gKiBUaGUgKHRpZ2h0ZXIpIGV4cG9zdXJlIGxldmVsIGEgZGVjbGFyYXRpb24gY291bGQgYmUgcmVkdWNlZCB0by5cbiAqL1xuZXhwb3J0IHR5cGUgU3VnZ2VzdGVkRXhwb3N1cmUgPSAnZmlsZS1sb2NhbCcgfCAncHJpdmF0ZScgfCAncHJvdGVjdGVkJztcblxuLyoqXG4gKiBMaWZlY3ljbGUgYW5kIGZyYW1ld29yayBtZW1iZXJzIGludm9rZWQgYnkgT2JzaWRpYW4gb3IgYSBiYXNlIGNsYXNzIHZpYSByZWdpc3RyYXRpb24gcmF0aGVyIHRoYW5cbiAqIGJ5IHJlZmVyZW5jZXMgdGhlIGxhbmd1YWdlIHNlcnZpY2UgY2FuIHNlZS4gVGlnaHRlbmluZyB0aGVzZSB3b3VsZCBicmVhayB0aGUgZnJhbWV3b3JrIGNvbnRyYWN0LFxuICogc28gdGhleSBhcmUgbmV2ZXIgcmVwb3J0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBMSUZFQ1lDTEVfQUxMT1dMSVNUOiBSZWFkb25seVNldDxzdHJpbmc+ID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgJ2Rpc3BsYXknLFxuICAnaGlkZScsXG4gICdvbkV4dGVybmFsU2V0dGluZ3NDaGFuZ2UnLFxuICAnb25MYXlvdXRSZWFkeScsXG4gICdvbmxvYWQnLFxuICAnb25sb2FkSW1wbCcsXG4gICdvbkxvYWRTZXR0aW5ncycsXG4gICdvblNhdmVTZXR0aW5ncycsXG4gICdvbnVubG9hZCcsXG4gICdvbnVubG9hZEltcGwnXG5dKTtcblxuaW50ZXJmYWNlIEFuYWx5c2lzQ29udGV4dCB7XG4gIHJlYWRvbmx5IGNoZWNrZXI6IFR5cGVDaGVja2VyO1xuICByZWFkb25seSBlZGl0czogKG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdClbXTtcbiAgcmVhZG9ubHkgZmluZGluZ3M6IE92ZXJFeHBvc3VyZUZpbmRpbmdbXTtcbiAgcmVhZG9ubHkgbGFuZ3VhZ2VTZXJ2aWNlOiBMYW5ndWFnZVNlcnZpY2U7XG4gIHJlYWRvbmx5IHByb2dyYW06IFByb2dyYW07XG59XG5cbmludGVyZmFjZSBBbmFseXNpc1Jlc3VsdCB7XG4gIHJlYWRvbmx5IGVkaXRzOiByZWFkb25seSAobnVsbCB8IE92ZXJFeHBvc3VyZVRleHRFZGl0KVtdO1xuICByZWFkb25seSBmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdO1xufVxuXG50eXBlIENsYXNzTWVtYmVyRGVjbGFyYXRpb24gPSBHZXRBY2Nlc3NvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBQcm9wZXJ0eURlY2xhcmF0aW9uIHwgU2V0QWNjZXNzb3JEZWNsYXJhdGlvbjtcblxudHlwZSBFeHBvcnRhYmxlRGVjbGFyYXRpb24gPSBDbGFzc0RlY2xhcmF0aW9uIHwgRW51bURlY2xhcmF0aW9uIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IEludGVyZmFjZURlY2xhcmF0aW9uIHwgVHlwZUFsaWFzRGVjbGFyYXRpb24gfCBWYXJpYWJsZVN0YXRlbWVudDtcblxuaW50ZXJmYWNlIEV4cG9ydEZpbmRpbmdDYW5kaWRhdGUge1xuICByZWFkb25seSBmaW5kaW5nOiBPdmVyRXhwb3N1cmVGaW5kaW5nO1xuICByZWFkb25seSBpc1BsYWluRmlsZUxvY2FsOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRmluZGluZ0ZsYWdzIHtcbiAgcmVhZG9ubHkgaGFzTm9SZWZlcmVuY2VzOiBib29sZWFuO1xuICByZWFkb25seSBpc0ZvcmNlZEJ5VGVzdE9ubHk6IGJvb2xlYW47XG59XG5cbnR5cGUgTWVtYmVyRXhwb3N1cmUgPSAncHJpdmF0ZScgfCAncHJvdGVjdGVkJyB8ICdwdWJsaWMnO1xuXG4vKipcbiAqIEEgc2luZ2xlIGluLXBsYWNlIHRleHQgcmVwbGFjZW1lbnQgdGhhdCB0aWdodGVucyBhIGRlY2xhcmF0aW9uJ3MgZXhwb3N1cmUuIEEgemVyby1sZW5ndGggZWRpdCBpc1xuICogYW4gaW5zZXJ0aW9uIChlLmcuIGFkZGluZyBhbiBleHBsaWNpdCBgcHJpdmF0ZWAgbW9kaWZpZXIgdG8gYW4gaW1wbGljaXRseS1gcHVibGljYCBtZW1iZXIpLlxuICovXG5pbnRlcmZhY2UgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBsZW5ndGg6IG51bWJlcjtcbiAgcmVhZG9ubHkgbmV3VGV4dDogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgUmVmZXJlbmNlTG9jYXRpb24ge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBzdGFydDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgU291cmNlRmlsZVRleHQge1xuICByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuICByZWFkb25seSB0ZXh0OiBzdHJpbmc7XG59XG5cbmNvbnN0IE1FTUJFUl9FWFBPU1VSRV9PUkRFUjogcmVhZG9ubHkgTWVtYmVyRXhwb3N1cmVbXSA9IFsncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJ107XG5jb25zdCBTQ09QRV9ERVNDUklQVElPTjogUmVjb3JkPFN1Z2dlc3RlZEV4cG9zdXJlLCBzdHJpbmc+ID0ge1xuICAnZmlsZS1sb2NhbCc6ICd3aXRoaW4gaXRzIG93biBmaWxlJyxcbiAgJ3ByaXZhdGUnOiAnaW5zaWRlIGl0cyBvd24gY2xhc3MnLFxuICAncHJvdGVjdGVkJzogJ2luc2lkZSBpdHMgY2xhc3MgKyBzdWJjbGFzc2VzJ1xufTtcbmNvbnN0IFNLSVBfUkVBU09OX0RFU0NSSVBUSU9OOiBSZWNvcmQ8T3ZlckV4cG9zdXJlU2tpcFJlYXNvbiwgc3RyaW5nPiA9IHtcbiAgJ2RlY29yYXRlZCc6ICdkZWNvcmF0ZWQgbWVtYmVyJyxcbiAgJ3NoYXJlZC1leHBvcnQnOiAnZXhwb3J0IHNoYXJlZCB3aXRoIGEgc3RpbGwtZXhwb3J0ZWQgc2libGluZycsXG4gICd0ZXN0LW9ubHknOiAnZXhwb3NlZCBvbmx5IGZvciB0ZXN0cydcbn07XG5jb25zdCBWSVNJQklMSVRZX01PRElGSUVSX0tJTkRTOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiA9IG5ldyBTZXQ8U3ludGF4S2luZD4oW1N5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQsIFN5bnRheEtpbmQuUHJvdGVjdGVkS2V5d29yZCwgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkXSk7XG5jb25zdCBXSElURVNQQUNFX1BBVFRFUk4gPSAvXFxzLztcblxuLyoqXG4gKiBBbmFseXplcyBhIHByb2plY3QgKGFscmVhZHkgbG9hZGVkIGludG8gYSBsYW5ndWFnZSBzZXJ2aWNlKSBmb3Igb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucywgYW5kIFx1MjAxNFxuICogd2hlbiB7QGxpbmsgQW5hbHl6ZU92ZXJFeHBvc3VyZVBhcmFtcy5zaG91bGRGaXh9IGlzIHNldCBcdTIwMTQgdGlnaHRlbnMgZXZlcnkgZml4YWJsZSBmaW5kaW5nIGluIHBsYWNlXG4gKiB2aWEge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXMud3JpdGVGaWxlfS4gRmluZGluZ3MgdGhhdCBjYW5ub3QgYmUgc2FmZWx5IGF1dG9tYXRlZCAoZXhwb3NlZFxuICogb25seSBmb3IgdGVzdHMsIGRlY29yYXRlZCwgb3Igc2hhcmluZyBhbiBgZXhwb3J0YCBrZXl3b3JkIHdpdGggYSBzdGlsbC1leHBvcnRlZCBzaWJsaW5nKSBjYXJyeSBhXG4gKiB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSBhbmQgYXJlIGxlZnQgdW50b3VjaGVkLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIEFuYWx5emVPdmVyRXhwb3N1cmVQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIG92ZXItZXhwb3NlZCBkZWNsYXJhdGlvbnMsIGluIGRpc2NvdmVyeSBvcmRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFuYWx5emVPdmVyRXhwb3N1cmUocGFyYW1zOiBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgcmVzdWx0ID0gcnVuT3ZlckV4cG9zdXJlQW5hbHlzaXMocGFyYW1zKTtcbiAgaWYgKCFwYXJhbXMuc2hvdWxkRml4KSB7XG4gICAgcmV0dXJuIFsuLi5yZXN1bHQuZmluZGluZ3NdO1xuICB9XG5cbiAgY29uc3QgeyB3cml0ZUZpbGUgfSA9IHBhcmFtcztcbiAgYXNzZXJ0Tm9uTnVsbGFibGUod3JpdGVGaWxlLCAnd3JpdGVGaWxlIGlzIHJlcXVpcmVkIHdoZW4gc2hvdWxkRml4IGlzIHRydWUuJyk7XG4gIHJldHVybiBhcHBseU92ZXJFeHBvc3VyZUZpeGVzKHJlc3VsdCwgcGFyYW1zLmxhbmd1YWdlU2VydmljZS5nZXRQcm9ncmFtKCksIHdyaXRlRmlsZSk7XG59XG5cbi8qKlxuICogQnVpbGRzIGEge0BsaW5rIExhbmd1YWdlU2VydmljZUhvc3R9IGJhY2tlZCBieSBhbiBleHBsaWNpdCBmaWxlIGxpc3QgYW5kIGZpbGUgc3lzdGVtLlxuICpcbiAqIEBwYXJhbSBwYXJhbXMgLSBUaGUge0BsaW5rIENyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3RQYXJhbXN9LlxuICogQHJldHVybnMgVGhlIGxhbmd1YWdlLXNlcnZpY2UgaG9zdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUxhbmd1YWdlU2VydmljZUhvc3QocGFyYW1zOiBDcmVhdGVMYW5ndWFnZVNlcnZpY2VIb3N0UGFyYW1zKTogTGFuZ3VhZ2VTZXJ2aWNlSG9zdCB7XG4gIGNvbnN0IHsgY29tcGlsZXJPcHRpb25zLCBmaWxlTmFtZXMsIGZpbGVTeXN0ZW0gfSA9IHBhcmFtcztcbiAgcmV0dXJuIHtcbiAgICBkaXJlY3RvcnlFeGlzdHM6IChkaXJlY3RvcnkpID0+IGZpbGVTeXN0ZW0uZGlyZWN0b3J5RXhpc3RzKGRpcmVjdG9yeSksXG4gICAgZmlsZUV4aXN0czogKGZpbGUpID0+IGZpbGVTeXN0ZW0uZmlsZUV4aXN0cyhmaWxlKSxcbiAgICBnZXRDb21waWxhdGlvblNldHRpbmdzOiAoKSA9PiBjb21waWxlck9wdGlvbnMsXG4gICAgZ2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gZmlsZVN5c3RlbS5nZXRDdXJyZW50RGlyZWN0b3J5KCksXG4gICAgZ2V0RGVmYXVsdExpYkZpbGVOYW1lOiAobGliT3B0aW9ucykgPT4gZ2V0RGVmYXVsdExpYkZpbGVQYXRoKGxpYk9wdGlvbnMpLFxuICAgIGdldERpcmVjdG9yaWVzOiAoZGlyZWN0b3J5KSA9PiBmaWxlU3lzdGVtLmdldERpcmVjdG9yaWVzKGRpcmVjdG9yeSksXG4gICAgZ2V0U2NyaXB0RmlsZU5hbWVzOiAoKSA9PiBbLi4uZmlsZU5hbWVzXSxcbiAgICBnZXRTY3JpcHRTbmFwc2hvdDogKGZpbGVOYW1lKTogSVNjcmlwdFNuYXBzaG90IHwgdW5kZWZpbmVkID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSBmaWxlU3lzdGVtLnJlYWRGaWxlKGZpbGVOYW1lKTtcbiAgICAgIHJldHVybiB0ZXh0ID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBTY3JpcHRTbmFwc2hvdC5mcm9tU3RyaW5nKHRleHQpO1xuICAgIH0sXG4gICAgZ2V0U2NyaXB0VmVyc2lvbjogKCkgPT4gJzAnLFxuICAgIHJlYWREaXJlY3Rvcnk6IChwYXRoLCBleHRlbnNpb25zLCBleGNsdWRlLCBpbmNsdWRlLCBkZXB0aCkgPT4gZmlsZVN5c3RlbS5yZWFkRGlyZWN0b3J5KHBhdGgsIGV4dGVuc2lvbnMsIGV4Y2x1ZGUsIGluY2x1ZGUsIGRlcHRoKSxcbiAgICByZWFkRmlsZTogKGZpbGUpID0+IGZpbGVTeXN0ZW0ucmVhZEZpbGUoZmlsZSlcbiAgfTtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBsYW5ndWFnZSBzZXJ2aWNlIG92ZXIgZXZlcnkgZmlsZSBpbiBhIHByb2plY3QncyBgdHNjb25maWcuanNvbmAuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgQ3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZVBhcmFtc30uXG4gKiBAcmV0dXJucyBBIGxhbmd1YWdlIHNlcnZpY2UgcmVhZHkgZm9yIHtAbGluayBhbmFseXplT3ZlckV4cG9zdXJlfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2plY3RMYW5ndWFnZVNlcnZpY2UocGFyYW1zOiBDcmVhdGVQcm9qZWN0TGFuZ3VhZ2VTZXJ2aWNlUGFyYW1zKTogTGFuZ3VhZ2VTZXJ2aWNlIHtcbiAgY29uc3QgeyBmaWxlTmFtZXMsIG9wdGlvbnMgfSA9IHBhcnNlVHNDb25maWcocGFyYW1zLnRzQ29uZmlnUGF0aCk7XG4gIHJldHVybiBjcmVhdGVMYW5ndWFnZVNlcnZpY2UoY3JlYXRlTGFuZ3VhZ2VTZXJ2aWNlSG9zdCh7IGNvbXBpbGVyT3B0aW9uczogb3B0aW9ucywgZmlsZU5hbWVzLCBmaWxlU3lzdGVtOiBzeXMgfSksIGNyZWF0ZURvY3VtZW50UmVnaXN0cnkoKSk7XG59XG5cbi8qKlxuICogRmluZHMgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBpbiBhIHByb2plY3Qgb24gZGlzay4gV2hlblxuICoge0BsaW5rIEZpbmRPdmVyRXhwb3N1cmVQYXJhbXMuc2hvdWxkRml4fSBpcyBzZXQsIGVhY2ggZml4YWJsZSBmaW5kaW5nIGlzIGFsc28gdGlnaHRlbmVkIGluIHBsYWNlXG4gKiAocmV3cml0aW5nIHRoZSBhZmZlY3RlZCBzb3VyY2UgZmlsZXMgdmlhIGB0eXBlc2NyaXB0YCdzIGBzeXMud3JpdGVGaWxlYCkuXG4gKlxuICogQHBhcmFtIHBhcmFtcyAtIFRoZSB7QGxpbmsgRmluZE92ZXJFeHBvc3VyZVBhcmFtc30uXG4gKiBAcmV0dXJucyBUaGUgb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRPdmVyRXhwb3N1cmUocGFyYW1zOiBGaW5kT3ZlckV4cG9zdXJlUGFyYW1zKTogT3ZlckV4cG9zdXJlRmluZGluZ1tdIHtcbiAgY29uc3QgcHJvamVjdEZvbGRlciA9IHRvQ2Fub25pY2FsKHBhcmFtcy5wcm9qZWN0Rm9sZGVyKTtcbiAgY29uc3QgbGFuZ3VhZ2VTZXJ2aWNlID0gY3JlYXRlUHJvamVjdExhbmd1YWdlU2VydmljZSh7IHRzQ29uZmlnUGF0aDogYCR7cHJvamVjdEZvbGRlcn0vdHNjb25maWcuanNvbmAgfSk7XG4gIHJldHVybiBhbmFseXplT3ZlckV4cG9zdXJlKHtcbiAgICBsYW5ndWFnZVNlcnZpY2UsXG4gICAgc2hvdWxkRml4OiBwYXJhbXMuc2hvdWxkRml4LFxuICAgIHNyY0ZvbGRlcjogYCR7cHJvamVjdEZvbGRlcn0vc3JjYCxcbiAgICB3cml0ZUZpbGU6IChwYXRoLCBjb250ZW50KSA9PiB7XG4gICAgICBzeXMud3JpdGVGaWxlKHBhdGgsIGNvbnRlbnQpO1xuICAgIH0sXG4gICAgLi4ucGFyYW1zLm9uUHJvZ3Jlc3MgPyB7IG9uUHJvZ3Jlc3M6IHBhcmFtcy5vblByb2dyZXNzIH0gOiB7fVxuICB9KTtcbn1cblxuLyoqXG4gKiBGb3JtYXRzIG92ZXItZXhwb3N1cmUgZmluZGluZ3MgYXMgYSBodW1hbi1yZWFkYWJsZSByZXBvcnQsIHVzaW5nIHRoZSBncm91cGVkIGxheW91dCBvZiBFU0xpbnQnc1xuICogYHN0eWxpc2hgIGZvcm1hdHRlci4gRmluZGluZ3MgYXJlIGdyb3VwZWQgYnkgZmlsZSBhbmQgc29ydGVkIGJ5IGxpbmU6IGVhY2ggZmlsZSBpcyByZW5kZXJlZCBhcyBhXG4gKiBgcGF0aGAgaGVhZGVyIGxpbmUsIGZvbGxvd2VkIGJ5IG9uZSBpbmRlbnRlZCBgICBsaW5lOmNvbHVtbiAgY2hhbmdlIC0tIHJlYXNvbmAgcm93IHBlciBmaW5kaW5nICh0aGVcbiAqIGBsaW5lOmNvbHVtbmAgaXMgcmlnaHQtcGFkZGVkIHNvIHRoZSByb3dzIGFsaWduIHdpdGhpbiBhIGZpbGUpLiBUZXJtaW5hbHMgc3VjaCBhcyBWUyBDb2RlIHJlbmRlclxuICogZWFjaCBpbmRlbnRlZCBgbGluZTpjb2x1bW5gIGFzIGEgY2xpY2thYmxlIGxpbmsgXHUyMDE0IHJlc29sdmVkIGFnYWluc3QgdGhlIGZpbGUgaGVhZGVyIGFib3ZlIGl0IFx1MjAxNCB0aGF0XG4gKiBqdW1wcyBzdHJhaWdodCB0byB0aGUgZGVjbGFyYXRpb24uIEZpbGUgZ3JvdXBzIGFyZSBzZXBhcmF0ZWQgYnkgYSBibGFuayBsaW5lLiBJbiBhIGZpeCBydW4gKGZpbmRpbmdzXG4gKiBjYXJyeWluZyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy53YXNGaXhlZH0gLyB7QGxpbmsgT3ZlckV4cG9zdXJlRmluZGluZy5za2lwUmVhc29ufSkgZWFjaCBjaGFuZ2VcbiAqIHJvdyBpcyBzdWZmaXhlZCB3aXRoIGBbZml4ZWRdYCBvciBgW3NraXBwZWQ6IFx1MjAyNl1gLCBhbmQgdGhlIHRyYWlsaW5nIHN1bW1hcnkgYXBwZW5kcyB0aGUgZml4ZWQvc2tpcHBlZFxuICogY291bnRzLlxuICpcbiAqIEBwYXJhbSBmaW5kaW5ncyAtIFRoZSBmaW5kaW5ncyB0byBmb3JtYXQuXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSB7QGxpbmsgRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zfS5cbiAqIEByZXR1cm5zIFRoZSByZXBvcnQgdGV4dC4gRW1wdHktZmluZGluZyBpbnB1dCB5aWVsZHMgYSBzaW5nbGUgXCJubyBmaW5kaW5nc1wiIGxpbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRPdmVyRXhwb3N1cmVGaW5kaW5ncyhmaW5kaW5nczogcmVhZG9ubHkgT3ZlckV4cG9zdXJlRmluZGluZ1tdLCBvcHRpb25zPzogRm9ybWF0T3ZlckV4cG9zdXJlRmluZGluZ3NPcHRpb25zKTogc3RyaW5nIHtcbiAgaWYgKGZpbmRpbmdzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnTm8gb3Zlci1leHBvc2VkIGRlY2xhcmF0aW9ucyBmb3VuZC5cXG4nO1xuICB9XG5cbiAgY29uc3QgYmFzZUZvbGRlciA9IG9wdGlvbnM/LmJhc2VGb2xkZXIgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRvQ2Fub25pY2FsKG9wdGlvbnMuYmFzZUZvbGRlcik7XG4gIGNvbnN0IGxpbmVzID0gZm9ybWF0RmluZGluZ0Jsb2NrcyhmaW5kaW5ncywgYmFzZUZvbGRlcik7XG4gIGxpbmVzLnB1c2goZm9ybWF0U3VtbWFyeShmaW5kaW5ncykpO1xuICByZXR1cm4gYCR7bGluZXMuam9pbignXFxuJyl9XFxuYDtcbn1cblxuZnVuY3Rpb24gYW5hbHl6ZUV4cG9ydChub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuICBpZiAobm9kZS5wYXJlbnQgIT09IHNvdXJjZUZpbGUgfHwgIWdldE1vZGlmaWVyS2luZHMobm9kZSkuaGFzKFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBkZWNsYXJhdGlvbiA9IGFzRXhwb3J0YWJsZURlY2xhcmF0aW9uKG5vZGUpO1xuICBpZiAoIWRlY2xhcmF0aW9uKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVjbEZpbGVQYXRoID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gIGNvbnN0IG5hbWVOb2RlcyA9IGdldEV4cG9ydGVkTmFtZU5vZGVzKGRlY2xhcmF0aW9uKTtcbiAgY29uc3QgY2FuZGlkYXRlczogRXhwb3J0RmluZGluZ0NhbmRpZGF0ZVtdID0gW107XG4gIGZvciAoY29uc3QgbmFtZU5vZGUgb2YgbmFtZU5vZGVzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgICAgLmZpbHRlcigocmVmZXJlbmNlKSA9PiAhaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2UsIG5hbWVOb2RlKSk7XG4gICAgY29uc3Qgb3RoZXJGaWxlUmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+IHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkgIT09IGRlY2xGaWxlUGF0aCk7XG5cbiAgICBpZiAob3RoZXJGaWxlUmVmZXJlbmNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7XG4gICAgICAgIGZpbmRpbmc6IGJ1aWxkRmluZGluZyhkZWNsYXJhdGlvbiwgbmFtZU5vZGUsICdleHBvcnQnLCAnZmlsZS1sb2NhbCcsIHsgaGFzTm9SZWZlcmVuY2VzOiByZWZlcmVuY2VzLmxlbmd0aCA9PT0gMCwgaXNGb3JjZWRCeVRlc3RPbmx5OiBmYWxzZSB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogdHJ1ZVxuICAgICAgfSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IG90aGVyRmlsZVJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcbiAgICBpZiAobm9uVGVzdFJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBjYW5kaWRhdGVzLnB1c2goe1xuICAgICAgICBmaW5kaW5nOiBidWlsZEZpbmRpbmcoZGVjbGFyYXRpb24sIG5hbWVOb2RlLCAnZXhwb3J0JywgJ2ZpbGUtbG9jYWwnLCB7IGhhc05vUmVmZXJlbmNlczogZmFsc2UsIGlzRm9yY2VkQnlUZXN0T25seTogdHJ1ZSB9KSxcbiAgICAgICAgaXNQbGFpbkZpbGVMb2NhbDogZmFsc2VcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGlmIChjYW5kaWRhdGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGNhbkRyb3BFeHBvcnQgPSBjYW5kaWRhdGVzLmxlbmd0aCA9PT0gbmFtZU5vZGVzLmxlbmd0aCAmJiBjYW5kaWRhdGVzLmV2ZXJ5KChjYW5kaWRhdGUpID0+IGNhbmRpZGF0ZS5pc1BsYWluRmlsZUxvY2FsKTtcbiAgY29uc3QgZXhwb3J0RWRpdCA9IGNhbkRyb3BFeHBvcnQgPyBjb21wdXRlRXhwb3J0UmVtb3ZhbEVkaXQoZGVjbGFyYXRpb24pIDogbnVsbDtcbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgY2FuZGlkYXRlcykge1xuICAgIHJlY29yZChjb250ZXh0LCBjYW5kaWRhdGUuZmluZGluZywgZXhwb3J0RWRpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYW5hbHl6ZU1lbWJlcihub2RlOiBOb2RlLCBjb250ZXh0OiBBbmFseXNpc0NvbnRleHQpOiB2b2lkIHtcbiAgY29uc3QgbWVtYmVyID0gYXNDbGFzc01lbWJlcihub2RlKTtcbiAgaWYgKCFtZW1iZXIgfHwgIWlzQ2xhc3NMaWtlKG5vZGUucGFyZW50KSkge1xuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBuYW1lTm9kZSA9IG1lbWJlci5uYW1lO1xuICBjb25zdCBkZWNsYXJpbmdDbGFzcyA9IG5vZGUucGFyZW50O1xuXG4gIGNvbnN0IG1vZGlmaWVyS2luZHMgPSBnZXRNb2RpZmllcktpbmRzKG1lbWJlcik7XG4gIGlmIChtb2RpZmllcktpbmRzLmhhcyhTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpIHx8IG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuT3ZlcnJpZGVLZXl3b3JkKSB8fCBMSUZFQ1lDTEVfQUxMT1dMSVNULmhhcyhuYW1lTm9kZS5nZXRUZXh0KCkpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgY3VycmVudEV4cG9zdXJlID0gZ2V0Q3VycmVudE1lbWJlckV4cG9zdXJlKG1vZGlmaWVyS2luZHMpO1xuICBpZiAoY3VycmVudEV4cG9zdXJlID09PSAncHJpdmF0ZScpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCBzb3VyY2VGaWxlID0gbWVtYmVyLmdldFNvdXJjZUZpbGUoKTtcbiAgY29uc3QgcmVmZXJlbmNlcyA9IGNvbGxlY3RSZWZlcmVuY2VzKGNvbnRleHQubGFuZ3VhZ2VTZXJ2aWNlLmZpbmRSZWZlcmVuY2VzKHNvdXJjZUZpbGUuZmlsZU5hbWUsIG5hbWVOb2RlLmdldFN0YXJ0KCkpKVxuICAgIC5maWx0ZXIoKHJlZmVyZW5jZSkgPT4gIWlzRGVjbGFyYXRpb25JdHNlbGYocmVmZXJlbmNlLCBuYW1lTm9kZSkpO1xuICBjb25zdCBub25UZXN0UmVmZXJlbmNlcyA9IHJlZmVyZW5jZXMuZmlsdGVyKChyZWZlcmVuY2UpID0+ICFpc1Rlc3RGaWxlKHRvQ2Fub25pY2FsKHJlZmVyZW5jZS5maWxlTmFtZSkpKTtcblxuICBjb25zdCBuZWVkZWRGb3JTcmMgPSBjb21wdXRlTmVlZGVkRXhwb3N1cmUobm9uVGVzdFJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcbiAgY29uc3QgbmVlZGVkV2l0aFRlc3RzID0gY29tcHV0ZU5lZWRlZEV4cG9zdXJlKHJlZmVyZW5jZXMsIGRlY2xhcmluZ0NsYXNzLCBjb250ZXh0KTtcblxuICBpZiAobmVlZGVkRm9yU3JjID09PSAncHVibGljJykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmIChyYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKSA+PSByYW5rRXhwb3N1cmUoY3VycmVudEV4cG9zdXJlKSkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGZpbmRpbmcgPSBidWlsZEZpbmRpbmcobWVtYmVyLCBuYW1lTm9kZSwgY3VycmVudEV4cG9zdXJlLCBuZWVkZWRGb3JTcmMsIHtcbiAgICBoYXNOb1JlZmVyZW5jZXM6IHJlZmVyZW5jZXMubGVuZ3RoID09PSAwLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogcmFua0V4cG9zdXJlKG5lZWRlZFdpdGhUZXN0cykgPiByYW5rRXhwb3N1cmUobmVlZGVkRm9yU3JjKVxuICB9KTtcbiAgcmVjb3JkKGNvbnRleHQsIGZpbmRpbmcsIGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyLCBuZWVkZWRGb3JTcmMpKTtcbn1cblxuZnVuY3Rpb24gYXBwbHlFZGl0cyh0ZXh0OiBzdHJpbmcsIGVkaXRzOiByZWFkb25seSBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdKTogc3RyaW5nIHtcbiAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCB1bmlxdWVFZGl0cyA9IGVkaXRzXG4gICAgLmZpbHRlcigoZWRpdCkgPT4ge1xuICAgICAgY29uc3Qga2V5ID0gYCR7U3RyaW5nKGVkaXQuc3RhcnQpfToke1N0cmluZyhlZGl0Lmxlbmd0aCl9OiR7ZWRpdC5uZXdUZXh0fWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZChrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAuc29ydCgoYSwgYikgPT4gYi5zdGFydCAtIGEuc3RhcnQpO1xuXG4gIGxldCByZXN1bHQgPSB0ZXh0O1xuICBmb3IgKGNvbnN0IGVkaXQgb2YgdW5pcXVlRWRpdHMpIHtcbiAgICByZXN1bHQgPSBgJHtyZXN1bHQuc2xpY2UoMCwgZWRpdC5zdGFydCl9JHtlZGl0Lm5ld1RleHR9JHtyZXN1bHQuc2xpY2UoZWRpdC5zdGFydCArIGVkaXQubGVuZ3RoKX1gO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFwcGx5T3ZlckV4cG9zdXJlRml4ZXMoXG4gIHJlc3VsdDogQW5hbHlzaXNSZXN1bHQsXG4gIHByb2dyYW06IFByb2dyYW0gfCB1bmRlZmluZWQsXG4gIHdyaXRlRmlsZTogKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZywgY29udGVudDogc3RyaW5nKSA9PiB2b2lkXG4pOiBPdmVyRXhwb3N1cmVGaW5kaW5nW10ge1xuICBjb25zdCBlZGl0c0J5RmlsZSA9IG5ldyBNYXA8c3RyaW5nLCBPdmVyRXhwb3N1cmVUZXh0RWRpdFtdPigpO1xuICBjb25zdCBmaW5kaW5ncyA9IHJlc3VsdC5maW5kaW5ncy5tYXAoKGZpbmRpbmcsIGluZGV4KSA9PiB7XG4gICAgY29uc3QgZWRpdCA9IHJlc3VsdC5lZGl0c1tpbmRleF0gPz8gbnVsbDtcbiAgICBjb25zdCBza2lwUmVhc29uID0gZGV0ZXJtaW5lU2tpcFJlYXNvbihmaW5kaW5nLCBlZGl0KTtcbiAgICBpZiAoc2tpcFJlYXNvbiAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHsgLi4uZmluZGluZywgc2tpcFJlYXNvbiwgd2FzRml4ZWQ6IGZhbHNlIH07XG4gICAgfVxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVkaXQsICdBIGZpeGFibGUgZmluZGluZyBtdXN0IGNhcnJ5IGEgdGV4dCBlZGl0LicpO1xuICAgIGNvbnN0IGZpbGVFZGl0cyA9IGVkaXRzQnlGaWxlLmdldChlZGl0LmZpbGVOYW1lKSA/PyBbXTtcbiAgICBmaWxlRWRpdHMucHVzaChlZGl0KTtcbiAgICBlZGl0c0J5RmlsZS5zZXQoZWRpdC5maWxlTmFtZSwgZmlsZUVkaXRzKTtcbiAgICByZXR1cm4geyAuLi5maW5kaW5nLCBza2lwUmVhc29uOiBudWxsLCB3YXNGaXhlZDogdHJ1ZSB9O1xuICB9KTtcblxuICBpZiAoZWRpdHNCeUZpbGUuc2l6ZSA+IDApIHtcbiAgICBhc3NlcnROb25OdWxsYWJsZShwcm9ncmFtLCAnQSBwcm9ncmFtIGlzIGV4cGVjdGVkIHdoZW4gdGhlcmUgYXJlIGVkaXRzIHRvIGFwcGx5LicpO1xuICAgIGNvbnN0IHNvdXJjZVRleHRCeUZpbGUgPSBuZXcgTWFwPHN0cmluZywgU291cmNlRmlsZVRleHQ+KCk7XG4gICAgZm9yIChjb25zdCBzb3VyY2VGaWxlIG9mIHByb2dyYW0uZ2V0U291cmNlRmlsZXMoKSkge1xuICAgICAgc291cmNlVGV4dEJ5RmlsZS5zZXQodG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksIHsgZmlsZU5hbWU6IHNvdXJjZUZpbGUuZmlsZU5hbWUsIHRleHQ6IHNvdXJjZUZpbGUudGV4dCB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbY2Fub25pY2FsRmlsZU5hbWUsIGZpbGVFZGl0c10gb2YgZWRpdHNCeUZpbGUpIHtcbiAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZVRleHRCeUZpbGUuZ2V0KGNhbm9uaWNhbEZpbGVOYW1lKTtcbiAgICAgIGFzc2VydE5vbk51bGxhYmxlKHNvdXJjZSwgYFNvdXJjZSBmaWxlIG5vdCBmb3VuZCBpbiBwcm9ncmFtOiAke2Nhbm9uaWNhbEZpbGVOYW1lfWApO1xuICAgICAgd3JpdGVGaWxlKHNvdXJjZS5maWxlTmFtZSwgYXBwbHlFZGl0cyhzb3VyY2UudGV4dCwgZmlsZUVkaXRzKSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGZpbmRpbmdzO1xufVxuXG5mdW5jdGlvbiBhc0NsYXNzTWVtYmVyKG5vZGU6IE5vZGUpOiBDbGFzc01lbWJlckRlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzTWV0aG9kRGVjbGFyYXRpb24obm9kZSkgfHwgaXNQcm9wZXJ0eURlY2xhcmF0aW9uKG5vZGUpIHx8IGlzR2V0QWNjZXNzb3JEZWNsYXJhdGlvbihub2RlKSB8fCBpc1NldEFjY2Vzc29yRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICByZXR1cm4gbm9kZTtcbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG5mdW5jdGlvbiBhc0V4cG9ydGFibGVEZWNsYXJhdGlvbihub2RlOiBOb2RlKTogRXhwb3J0YWJsZURlY2xhcmF0aW9uIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgIGlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKVxuICAgIHx8IGlzSW50ZXJmYWNlRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc1R5cGVBbGlhc0RlY2xhcmF0aW9uKG5vZGUpXG4gICAgfHwgaXNFbnVtRGVjbGFyYXRpb24obm9kZSlcbiAgICB8fCBpc1ZhcmlhYmxlU3RhdGVtZW50KG5vZGUpXG4gICkge1xuICAgIHJldHVybiBub2RlO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGJ1aWxkRmluZGluZyhcbiAgbm9kZTogTm9kZSxcbiAgbmFtZU5vZGU6IE5vZGUsXG4gIGN1cnJlbnRFeHBvc3VyZTogQ3VycmVudEV4cG9zdXJlLFxuICBzdWdnZXN0ZWRFeHBvc3VyZTogU3VnZ2VzdGVkRXhwb3N1cmUsXG4gIGZsYWdzOiBGaW5kaW5nRmxhZ3Ncbik6IE92ZXJFeHBvc3VyZUZpbmRpbmcge1xuICBjb25zdCBzb3VyY2VGaWxlID0gbm9kZS5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IHsgY2hhcmFjdGVyLCBsaW5lIH0gPSBzb3VyY2VGaWxlLmdldExpbmVBbmRDaGFyYWN0ZXJPZlBvc2l0aW9uKG5hbWVOb2RlLmdldFN0YXJ0KCkpO1xuICByZXR1cm4ge1xuICAgIGNvbHVtbjogY2hhcmFjdGVyICsgMSxcbiAgICBjdXJyZW50RXhwb3N1cmUsXG4gICAgZmlsZVBhdGg6IHRvQ2Fub25pY2FsKHNvdXJjZUZpbGUuZmlsZU5hbWUpLFxuICAgIGhhc05vUmVmZXJlbmNlczogZmxhZ3MuaGFzTm9SZWZlcmVuY2VzLFxuICAgIGlzRm9yY2VkQnlUZXN0T25seTogZmxhZ3MuaXNGb3JjZWRCeVRlc3RPbmx5LFxuICAgIGlzTWVtYmVyOiBjdXJyZW50RXhwb3N1cmUgIT09ICdleHBvcnQnLFxuICAgIGxpbmU6IGxpbmUgKyAxLFxuICAgIG5hbWU6IG5hbWVOb2RlLmdldFRleHQoKSxcbiAgICBza2lwUmVhc29uOiBudWxsLFxuICAgIHN1Z2dlc3RlZEV4cG9zdXJlLFxuICAgIHdhc0ZpeGVkOiBmYWxzZVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb2xsZWN0UmVmZXJlbmNlcyhyZWZlcmVuY2VkU3ltYm9sczogUmVmZXJlbmNlZFN5bWJvbFtdIHwgdW5kZWZpbmVkKTogUmVmZXJlbmNlTG9jYXRpb25bXSB7XG4gIGNvbnN0IHJlZmVyZW5jZXM6IFJlZmVyZW5jZUxvY2F0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCByZWZlcmVuY2VkU3ltYm9sIG9mIHJlZmVyZW5jZWRTeW1ib2xzID8/IFtdKSB7XG4gICAgZm9yIChjb25zdCByZWZlcmVuY2Ugb2YgcmVmZXJlbmNlZFN5bWJvbC5yZWZlcmVuY2VzKSB7XG4gICAgICByZWZlcmVuY2VzLnB1c2goeyBmaWxlTmFtZTogcmVmZXJlbmNlLmZpbGVOYW1lLCBzdGFydDogcmVmZXJlbmNlLnRleHRTcGFuLnN0YXJ0IH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVmZXJlbmNlcztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZUV4cG9ydFJlbW92YWxFZGl0KGRlY2xhcmF0aW9uOiBFeHBvcnRhYmxlRGVjbGFyYXRpb24pOiBPdmVyRXhwb3N1cmVUZXh0RWRpdCB7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPSBkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhkZWNsYXJhdGlvbik7XG4gIGFzc2VydE5vbk51bGxhYmxlKG1vZGlmaWVycywgJ01vZGlmaWVycyBleHBlY3RlZCBvbiBhbiBleHBvcnRlZCBkZWNsYXJhdGlvbi4nKTtcbiAgY29uc3QgZXhwb3J0TW9kaWZpZXIgPSBtb2RpZmllcnMuZmluZCgobW9kaWZpZXIpID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuRXhwb3J0S2V5d29yZCk7XG4gIGFzc2VydE5vbk51bGxhYmxlKGV4cG9ydE1vZGlmaWVyLCAnRXhwb3J0IG1vZGlmaWVyIGV4cGVjdGVkIG9uIGFuIGV4cG9ydGVkIGRlY2xhcmF0aW9uLicpO1xuICBjb25zdCB7IHRleHQgfSA9IHNvdXJjZUZpbGU7XG4gIGxldCBlbmQgPSBleHBvcnRNb2RpZmllci5nZXRFbmQoKTtcbiAgd2hpbGUgKGVuZCA8IHRleHQubGVuZ3RoICYmIFdISVRFU1BBQ0VfUEFUVEVSTi50ZXN0KHRleHQuY2hhckF0KGVuZCkpKSB7XG4gICAgZW5kKys7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZTogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgbGVuZ3RoOiBlbmQgLSBleHBvcnRNb2RpZmllci5nZXRTdGFydCgpLFxuICAgIG5ld1RleHQ6ICcnLFxuICAgIHN0YXJ0OiBleHBvcnRNb2RpZmllci5nZXRTdGFydCgpXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVNZW1iZXJFeHBvc3VyZUVkaXQobWVtYmVyOiBDbGFzc01lbWJlckRlY2xhcmF0aW9uLCBzdWdnZXN0ZWRFeHBvc3VyZTogJ3ByaXZhdGUnIHwgJ3Byb3RlY3RlZCcpOiBudWxsIHwgT3ZlckV4cG9zdXJlVGV4dEVkaXQge1xuICBpZiAoKGdldERlY29yYXRvcnMobWVtYmVyKSA/PyBbXSkubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgY29uc3Qgc291cmNlRmlsZSA9IG1lbWJlci5nZXRTb3VyY2VGaWxlKCk7XG4gIGNvbnN0IGZpbGVOYW1lID0gdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gIGNvbnN0IG1vZGlmaWVycyA9IGdldE1vZGlmaWVycyhtZW1iZXIpID8/IFtdO1xuICBjb25zdCB2aXNpYmlsaXR5TW9kaWZpZXIgPSBtb2RpZmllcnMuZmluZCgobW9kaWZpZXIpID0+IFZJU0lCSUxJVFlfTU9ESUZJRVJfS0lORFMuaGFzKG1vZGlmaWVyLmtpbmQpKTtcbiAgaWYgKHZpc2liaWxpdHlNb2RpZmllcikge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGxlbmd0aDogdmlzaWJpbGl0eU1vZGlmaWVyLmdldEVuZCgpIC0gdmlzaWJpbGl0eU1vZGlmaWVyLmdldFN0YXJ0KCksXG4gICAgICBuZXdUZXh0OiBzdWdnZXN0ZWRFeHBvc3VyZSxcbiAgICAgIHN0YXJ0OiB2aXNpYmlsaXR5TW9kaWZpZXIuZ2V0U3RhcnQoKVxuICAgIH07XG4gIH1cblxuICBjb25zdCBmaXJzdE1vZGlmaWVyID0gbW9kaWZpZXJzWzBdO1xuICBjb25zdCBpbnNlcnRTdGFydCA9IGZpcnN0TW9kaWZpZXIgPyBmaXJzdE1vZGlmaWVyLmdldFN0YXJ0KCkgOiBtZW1iZXIuZ2V0U3RhcnQoKTtcbiAgcmV0dXJuIHtcbiAgICBmaWxlTmFtZSxcbiAgICBsZW5ndGg6IDAsXG4gICAgbmV3VGV4dDogYCR7c3VnZ2VzdGVkRXhwb3N1cmV9IGAsXG4gICAgc3RhcnQ6IGluc2VydFN0YXJ0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVOZWVkZWRFeHBvc3VyZShcbiAgcmVmZXJlbmNlczogcmVhZG9ubHkgUmVmZXJlbmNlTG9jYXRpb25bXSxcbiAgZGVjbGFyaW5nQ2xhc3M6IENsYXNzTGlrZURlY2xhcmF0aW9uLFxuICBjb250ZXh0OiBBbmFseXNpc0NvbnRleHRcbik6IE1lbWJlckV4cG9zdXJlIHtcbiAgaWYgKHJlZmVyZW5jZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuXG4gIGxldCBuZWVkZWQ6IE1lbWJlckV4cG9zdXJlID0gJ3ByaXZhdGUnO1xuICBmb3IgKGNvbnN0IHJlZmVyZW5jZSBvZiByZWZlcmVuY2VzKSB7XG4gICAgY29uc3QgcmVmZXJlbmNlQ2xhc3MgPSBnZXRDbGFzc0F0UG9zaXRpb24oY29udGV4dC5wcm9ncmFtLCByZWZlcmVuY2UuZmlsZU5hbWUsIHJlZmVyZW5jZS5zdGFydCk7XG4gICAgaWYgKHJlZmVyZW5jZUNsYXNzID09PSBkZWNsYXJpbmdDbGFzcykge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChyZWZlcmVuY2VDbGFzcyAmJiBpc0Rlcml2ZWRGcm9tKHJlZmVyZW5jZUNsYXNzLCBkZWNsYXJpbmdDbGFzcywgY29udGV4dC5jaGVja2VyKSkge1xuICAgICAgbmVlZGVkID0gJ3Byb3RlY3RlZCc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgcmV0dXJuICdwdWJsaWMnO1xuICB9XG4gIHJldHVybiBuZWVkZWQ7XG59XG5cbmZ1bmN0aW9uIGRlc2NyaWJlRml4U3RhdHVzKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcpOiBzdHJpbmcge1xuICBpZiAoZmluZGluZy53YXNGaXhlZCkge1xuICAgIHJldHVybiAnIFtmaXhlZF0nO1xuICB9XG4gIGlmIChmaW5kaW5nLnNraXBSZWFzb24gIT09IG51bGwpIHtcbiAgICByZXR1cm4gYCBbc2tpcHBlZDogJHtTS0lQX1JFQVNPTl9ERVNDUklQVElPTltmaW5kaW5nLnNraXBSZWFzb25dfV1gO1xuICB9XG4gIHJldHVybiAnJztcbn1cblxuZnVuY3Rpb24gZGVzY3JpYmVSZWFzb24oZmluZGluZzogT3ZlckV4cG9zdXJlRmluZGluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGJhc2UgPSBgcmVmZXJlbmNlZCBvbmx5ICR7U0NPUEVfREVTQ1JJUFRJT05bZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZV19YDtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5KSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChleHBvc2VkIG9ubHkgZm9yIHRlc3RzKWA7XG4gIH1cbiAgaWYgKGZpbmRpbmcuaGFzTm9SZWZlcmVuY2VzKSB7XG4gICAgcmV0dXJuIGAke2Jhc2V9IChubyByZWZlcmVuY2VzIGF0IGFsbClgO1xuICB9XG4gIHJldHVybiBiYXNlO1xufVxuXG5mdW5jdGlvbiBkZXRlcm1pbmVTa2lwUmVhc29uKGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcsIGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCk6IG51bGwgfCBPdmVyRXhwb3N1cmVTa2lwUmVhc29uIHtcbiAgaWYgKGZpbmRpbmcuaXNGb3JjZWRCeVRlc3RPbmx5KSB7XG4gICAgcmV0dXJuICd0ZXN0LW9ubHknO1xuICB9XG4gIGlmICghZWRpdCkge1xuICAgIHJldHVybiBmaW5kaW5nLmlzTWVtYmVyID8gJ2RlY29yYXRlZCcgOiAnc2hhcmVkLWV4cG9ydCc7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbmZ1bmN0aW9uIGZpbmROb2RlQXRQb3NpdGlvbihub2RlOiBOb2RlLCBwb3NpdGlvbjogbnVtYmVyKTogTm9kZSB8IHVuZGVmaW5lZCB7XG4gIGlmIChwb3NpdGlvbiA8IG5vZGUuZ2V0U3RhcnQoKSB8fCBwb3NpdGlvbiA+PSBub2RlLmdldEVuZCgpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBsZXQgcmVzdWx0OiBOb2RlID0gbm9kZTtcbiAgbm9kZS5mb3JFYWNoQ2hpbGQoKGNoaWxkKSA9PiB7XG4gICAgY29uc3QgZm91bmQgPSBmaW5kTm9kZUF0UG9zaXRpb24oY2hpbGQsIHBvc2l0aW9uKTtcbiAgICBpZiAoZm91bmQpIHtcbiAgICAgIHJlc3VsdCA9IGZvdW5kO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGZvcm1hdEZpbmRpbmdCbG9ja3MoZmluZGluZ3M6IHJlYWRvbmx5IE92ZXJFeHBvc3VyZUZpbmRpbmdbXSwgYmFzZUZvbGRlcjogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBjb25zdCBieUZpbGUgPSBuZXcgTWFwPHN0cmluZywgT3ZlckV4cG9zdXJlRmluZGluZ1tdPigpO1xuICBmb3IgKGNvbnN0IGZpbmRpbmcgb2YgZmluZGluZ3MpIHtcbiAgICBjb25zdCBsaXN0ID0gYnlGaWxlLmdldChmaW5kaW5nLmZpbGVQYXRoKSA/PyBbXTtcbiAgICBsaXN0LnB1c2goZmluZGluZyk7XG4gICAgYnlGaWxlLnNldChmaW5kaW5nLmZpbGVQYXRoLCBsaXN0KTtcbiAgfVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IFtmaWxlUGF0aCwgbGlzdF0gb2YgYnlGaWxlKSB7XG4gICAgY29uc3Qgc29ydGVkID0gWy4uLmxpc3RdLnNvcnQoKGEsIGIpID0+IGEubGluZSAtIGIubGluZSk7XG4gICAgY29uc3QgbG9jYXRpb25XaWR0aCA9IE1hdGgubWF4KC4uLnNvcnRlZC5tYXAoKGZpbmRpbmcpID0+IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5sZW5ndGgpKTtcbiAgICBsaW5lcy5wdXNoKHRvRGlzcGxheVBhdGgoZmlsZVBhdGgsIGJhc2VGb2xkZXIpKTtcbiAgICBmb3IgKGNvbnN0IGZpbmRpbmcgb2Ygc29ydGVkKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IGAke1N0cmluZyhmaW5kaW5nLmxpbmUpfToke1N0cmluZyhmaW5kaW5nLmNvbHVtbil9YC5wYWRFbmQobG9jYXRpb25XaWR0aCk7XG4gICAgICBjb25zdCBjaGFuZ2UgPSBgJHtmaW5kaW5nLmN1cnJlbnRFeHBvc3VyZX0gJHtmaW5kaW5nLm5hbWV9IC0+ICR7ZmluZGluZy5zdWdnZXN0ZWRFeHBvc3VyZX1gO1xuICAgICAgbGluZXMucHVzaChgICAke2xvY2F0aW9ufSAgJHtjaGFuZ2V9IC0tICR7ZGVzY3JpYmVSZWFzb24oZmluZGluZyl9JHtkZXNjcmliZUZpeFN0YXR1cyhmaW5kaW5nKX1gKTtcbiAgICB9XG4gICAgbGluZXMucHVzaCgnJyk7XG4gIH1cbiAgcmV0dXJuIGxpbmVzO1xufVxuXG5mdW5jdGlvbiBmb3JtYXRTdW1tYXJ5KGZpbmRpbmdzOiByZWFkb25seSBPdmVyRXhwb3N1cmVGaW5kaW5nW10pOiBzdHJpbmcge1xuICBjb25zdCBzdW1tYXJ5ID0gYCR7U3RyaW5nKGZpbmRpbmdzLmxlbmd0aCl9IGZpbmRpbmcocykuYDtcbiAgY29uc3QgZml4ZWRDb3VudCA9IGZpbmRpbmdzLmZpbHRlcigoZmluZGluZykgPT4gZmluZGluZy53YXNGaXhlZCkubGVuZ3RoO1xuICBjb25zdCBza2lwcGVkQ291bnQgPSBmaW5kaW5ncy5maWx0ZXIoKGZpbmRpbmcpID0+IGZpbmRpbmcuc2tpcFJlYXNvbiAhPT0gbnVsbCkubGVuZ3RoO1xuICBpZiAoZml4ZWRDb3VudCA9PT0gMCAmJiBza2lwcGVkQ291bnQgPT09IDApIHtcbiAgICByZXR1cm4gc3VtbWFyeTtcbiAgfVxuICByZXR1cm4gYCR7c3VtbWFyeX0gJHtTdHJpbmcoZml4ZWRDb3VudCl9IGZpeGVkLCAke1N0cmluZyhza2lwcGVkQ291bnQpfSBza2lwcGVkLmA7XG59XG5cbmZ1bmN0aW9uIGdldENsYXNzQXRQb3NpdGlvbihwcm9ncmFtOiBQcm9ncmFtLCBmaWxlTmFtZTogc3RyaW5nLCBwb3NpdGlvbjogbnVtYmVyKTogQ2xhc3NMaWtlRGVjbGFyYXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBzb3VyY2VGaWxlID0gcHJvZ3JhbS5nZXRTb3VyY2VGaWxlKGZpbGVOYW1lKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUoc291cmNlRmlsZSwgYFNvdXJjZSBmaWxlIG5vdCBmb3VuZCBpbiBwcm9ncmFtOiAke2ZpbGVOYW1lfWApO1xuICBjb25zdCBub2RlID0gZmluZE5vZGVBdFBvc2l0aW9uKHNvdXJjZUZpbGUsIHBvc2l0aW9uKTtcbiAgYXNzZXJ0Tm9uTnVsbGFibGUobm9kZSwgYE5vIG5vZGUgZm91bmQgYXQgcG9zaXRpb24gJHtTdHJpbmcocG9zaXRpb24pfSBpbiAke2ZpbGVOYW1lfWApO1xuICByZXR1cm4gZ2V0RW5jbG9zaW5nQ2xhc3Mobm9kZSk7XG59XG5cbmZ1bmN0aW9uIGdldEN1cnJlbnRNZW1iZXJFeHBvc3VyZShtb2RpZmllcktpbmRzOiBSZWFkb25seVNldDxTeW50YXhLaW5kPik6IE1lbWJlckV4cG9zdXJlIHtcbiAgaWYgKG1vZGlmaWVyS2luZHMuaGFzKFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpKSB7XG4gICAgcmV0dXJuICdwcml2YXRlJztcbiAgfVxuICBpZiAobW9kaWZpZXJLaW5kcy5oYXMoU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkKSkge1xuICAgIHJldHVybiAncHJvdGVjdGVkJztcbiAgfVxuICByZXR1cm4gJ3B1YmxpYyc7XG59XG5cbmZ1bmN0aW9uIGdldEVuY2xvc2luZ0NsYXNzKG5vZGU6IE5vZGUpOiBDbGFzc0xpa2VEZWNsYXJhdGlvbiB8IHVuZGVmaW5lZCB7XG4gIGxldCBjdXJyZW50OiBOb2RlID0gbm9kZTtcbiAgd2hpbGUgKCFpc1NvdXJjZUZpbGUoY3VycmVudCkpIHtcbiAgICBpZiAoaXNDbGFzc0xpa2UoY3VycmVudCkpIHtcbiAgICAgIHJldHVybiBjdXJyZW50O1xuICAgIH1cbiAgICBjdXJyZW50ID0gY3VycmVudC5wYXJlbnQ7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwb3J0ZWROYW1lTm9kZXMoZGVjbGFyYXRpb246IEV4cG9ydGFibGVEZWNsYXJhdGlvbik6IE5vZGVbXSB7XG4gIGlmIChpc1ZhcmlhYmxlU3RhdGVtZW50KGRlY2xhcmF0aW9uKSkge1xuICAgIHJldHVybiBkZWNsYXJhdGlvbi5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLm1hcCgodmFyaWFibGVEZWNsYXJhdGlvbikgPT4gdmFyaWFibGVEZWNsYXJhdGlvbi5uYW1lKS5maWx0ZXIoaXNJZGVudGlmaWVyKTtcbiAgfVxuICByZXR1cm4gZGVjbGFyYXRpb24ubmFtZSA/IFtkZWNsYXJhdGlvbi5uYW1lXSA6IFtdO1xufVxuXG5mdW5jdGlvbiBnZXRNb2RpZmllcktpbmRzKG5vZGU6IE5vZGUpOiBSZWFkb25seVNldDxTeW50YXhLaW5kPiB7XG4gIGNvbnN0IGtpbmRzID0gbmV3IFNldDxTeW50YXhLaW5kPigpO1xuICBpZiAoY2FuSGF2ZU1vZGlmaWVycyhub2RlKSkge1xuICAgIGZvciAoY29uc3QgbW9kaWZpZXIgb2YgZ2V0TW9kaWZpZXJzKG5vZGUpID8/IFtdKSB7XG4gICAgICBraW5kcy5hZGQobW9kaWZpZXIua2luZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBraW5kcztcbn1cblxuZnVuY3Rpb24gaXNEZWNsYXJhdGlvbkl0c2VsZihyZWZlcmVuY2U6IFJlZmVyZW5jZUxvY2F0aW9uLCBuYW1lTm9kZTogTm9kZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdG9DYW5vbmljYWwocmVmZXJlbmNlLmZpbGVOYW1lKSA9PT0gdG9DYW5vbmljYWwobmFtZU5vZGUuZ2V0U291cmNlRmlsZSgpLmZpbGVOYW1lKSAmJiByZWZlcmVuY2Uuc3RhcnQgPT09IG5hbWVOb2RlLmdldFN0YXJ0KCk7XG59XG5cbmZ1bmN0aW9uIGlzRGVyaXZlZEZyb20oZGVyaXZlZDogQ2xhc3NMaWtlRGVjbGFyYXRpb24sIGJhc2U6IENsYXNzTGlrZURlY2xhcmF0aW9uLCBjaGVja2VyOiBUeXBlQ2hlY2tlcik6IGJvb2xlYW4ge1xuICBjb25zdCBiYXNlU3ltYm9sID0gYmFzZS5uYW1lID8gY2hlY2tlci5nZXRTeW1ib2xBdExvY2F0aW9uKGJhc2UubmFtZSkgOiB1bmRlZmluZWQ7XG4gIGlmICghYmFzZVN5bWJvbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGZvciAoY29uc3QgY2xhdXNlIG9mIGRlcml2ZWQuaGVyaXRhZ2VDbGF1c2VzID8/IFtdKSB7XG4gICAgaWYgKGNsYXVzZS50b2tlbiAhPT0gU3ludGF4S2luZC5FeHRlbmRzS2V5d29yZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdHlwZUV4cHJlc3Npb24gb2YgY2xhdXNlLnR5cGVzKSB7XG4gICAgICBjb25zdCBzeW1ib2wgPSBjaGVja2VyLmdldFR5cGVBdExvY2F0aW9uKHR5cGVFeHByZXNzaW9uLmV4cHJlc3Npb24pLmdldFN5bWJvbCgpO1xuICAgICAgaWYgKHN5bWJvbCA9PT0gYmFzZVN5bWJvbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2Ygc3ltYm9sPy5kZWNsYXJhdGlvbnMgPz8gW10pIHtcbiAgICAgICAgaWYgKGlzQ2xhc3NMaWtlKGRlY2xhcmF0aW9uKSAmJiBpc0Rlcml2ZWRGcm9tKGRlY2xhcmF0aW9uLCBiYXNlLCBjaGVja2VyKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gaXNPd25Tb3VyY2VGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIHNyY0ZvbGRlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlUGF0aC5zdGFydHNXaXRoKGAke3NyY0ZvbGRlcn0vYCkgJiYgZmlsZVBhdGguZW5kc1dpdGgoJy50cycpICYmICFmaWxlUGF0aC5lbmRzV2l0aCgnLmQudHMnKTtcbn1cblxuZnVuY3Rpb24gaXNUZXN0RmlsZShmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBmaWxlUGF0aC5pbmNsdWRlcygnLnRlc3QuJykgfHwgZmlsZVBhdGguaW5jbHVkZXMoJy5pbnRlZ3JhdGlvbi4nKTtcbn1cblxuZnVuY3Rpb24gcmFua0V4cG9zdXJlKGV4cG9zdXJlOiBNZW1iZXJFeHBvc3VyZSk6IG51bWJlciB7XG4gIHJldHVybiBNRU1CRVJfRVhQT1NVUkVfT1JERVIuaW5kZXhPZihleHBvc3VyZSk7XG59XG5cbmZ1bmN0aW9uIHJlY29yZChjb250ZXh0OiBBbmFseXNpc0NvbnRleHQsIGZpbmRpbmc6IE92ZXJFeHBvc3VyZUZpbmRpbmcsIGVkaXQ6IG51bGwgfCBPdmVyRXhwb3N1cmVUZXh0RWRpdCk6IHZvaWQge1xuICBjb250ZXh0LmZpbmRpbmdzLnB1c2goZmluZGluZyk7XG4gIGNvbnRleHQuZWRpdHMucHVzaChlZGl0KTtcbn1cblxuZnVuY3Rpb24gcnVuT3ZlckV4cG9zdXJlQW5hbHlzaXMocGFyYW1zOiBBbmFseXplT3ZlckV4cG9zdXJlUGFyYW1zKTogQW5hbHlzaXNSZXN1bHQge1xuICBjb25zdCB7IGxhbmd1YWdlU2VydmljZSwgb25Qcm9ncmVzcywgc3JjRm9sZGVyIH0gPSBwYXJhbXM7XG4gIGNvbnN0IHByb2dyYW0gPSBsYW5ndWFnZVNlcnZpY2UuZ2V0UHJvZ3JhbSgpO1xuICBpZiAoIXByb2dyYW0pIHtcbiAgICByZXR1cm4geyBlZGl0czogW10sIGZpbmRpbmdzOiBbXSB9O1xuICB9XG5cbiAgY29uc3QgY29udGV4dDogQW5hbHlzaXNDb250ZXh0ID0ge1xuICAgIGNoZWNrZXI6IHByb2dyYW0uZ2V0VHlwZUNoZWNrZXIoKSxcbiAgICBlZGl0czogW10sXG4gICAgZmluZGluZ3M6IFtdLFxuICAgIGxhbmd1YWdlU2VydmljZSxcbiAgICBwcm9ncmFtXG4gIH07XG5cbiAgY29uc3Qgc291cmNlRmlsZXNUb0FuYWx5emUgPSBwcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkuZmlsdGVyKChzb3VyY2VGaWxlKSA9PiB7XG4gICAgY29uc3QgZmlsZVBhdGggPSB0b0Nhbm9uaWNhbChzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICByZXR1cm4gaXNPd25Tb3VyY2VGaWxlKGZpbGVQYXRoLCBzcmNGb2xkZXIpICYmICFpc1Rlc3RGaWxlKGZpbGVQYXRoKTtcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbYW5hbHl6ZWRGaWxlQ291bnQsIHNvdXJjZUZpbGVdIG9mIHNvdXJjZUZpbGVzVG9BbmFseXplLmVudHJpZXMoKSkge1xuICAgIG9uUHJvZ3Jlc3M/Lih7XG4gICAgICBhbmFseXplZEZpbGVDb3VudCxcbiAgICAgIGN1cnJlbnRGaWxlUGF0aDogdG9DYW5vbmljYWwoc291cmNlRmlsZS5maWxlTmFtZSksXG4gICAgICB0b3RhbEZpbGVDb3VudDogc291cmNlRmlsZXNUb0FuYWx5emUubGVuZ3RoXG4gICAgfSk7XG4gICAgdmlzaXQoc291cmNlRmlsZSk7XG4gIH1cbiAgcmV0dXJuIHsgZWRpdHM6IGNvbnRleHQuZWRpdHMsIGZpbmRpbmdzOiBjb250ZXh0LmZpbmRpbmdzIH07XG5cbiAgZnVuY3Rpb24gdmlzaXQobm9kZTogTm9kZSk6IHZvaWQge1xuICAgIGFuYWx5emVNZW1iZXIobm9kZSwgY29udGV4dCk7XG4gICAgYW5hbHl6ZUV4cG9ydChub2RlLCBjb250ZXh0KTtcbiAgICBub2RlLmZvckVhY2hDaGlsZCh2aXNpdCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9EaXNwbGF5UGF0aChmaWxlUGF0aDogc3RyaW5nLCBiYXNlRm9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICBpZiAoYmFzZUZvbGRlciAhPT0gdW5kZWZpbmVkICYmIGZpbGVQYXRoLnN0YXJ0c1dpdGgoYCR7YmFzZUZvbGRlcn0vYCkpIHtcbiAgICByZXR1cm4gZmlsZVBhdGguc2xpY2UoYmFzZUZvbGRlci5sZW5ndGggKyAxKTtcbiAgfVxuICByZXR1cm4gZmlsZVBhdGg7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVEQTtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7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
|