@dbx-tools/appkit-mastra 0.9.120 → 0.9.122
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +22 -14
- package/index.ts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.js +2 -2
- package/lib/src/agents.d.ts +7 -3
- package/lib/src/agents.js +11 -6
- package/lib/src/config.d.ts +1 -1
- package/lib/src/config.js +2 -2
- package/lib/src/mlflow.js +5 -6
- package/lib/src/plugin.js +16 -4
- package/lib/src/remote-skills.d.ts +8 -9
- package/lib/src/remote-skills.js +43 -10
- package/lib/src/telemetry.js +3 -4
- package/lib/src/workspaces.d.ts +7 -5
- package/lib/src/workspaces.js +69 -11
- package/package.json +20 -17
- package/src/agents.ts +26 -9
- package/src/config.ts +2 -2
- package/src/mlflow.ts +4 -4
- package/src/plugin.ts +15 -3
- package/src/remote-skills.ts +53 -13
- package/src/telemetry.ts +2 -3
- package/src/workspaces.ts +80 -11
package/lib/src/remote-skills.js
CHANGED
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
* source (or the top-level call) sets `failOnError: false`, in which case it is
|
|
27
27
|
* logged and skipped so one bad source never takes the app down.
|
|
28
28
|
*
|
|
29
|
-
* AI Tools uses the shared `@dbx-tools/cache` project cache with a one-day TTL
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
* a {@link METADATA_FILE} beside their
|
|
33
|
-
*
|
|
29
|
+
* AI Tools uses the shared `@dbx-tools/cache` project cache with a one-day TTL.
|
|
30
|
+
* Every source hydrates a process-memory filesystem that the plugin converts to
|
|
31
|
+
* native agent-level skills; persisted workspace copies are not used for
|
|
32
|
+
* runtime discovery. Other sources keep a {@link METADATA_FILE} beside their
|
|
33
|
+
* provisioned tree and default to a seven-day refresh window.
|
|
34
34
|
*
|
|
35
35
|
* For non-AI-Tools sources, the default destination is the Databricks workspace
|
|
36
36
|
* Assistant skills tree (`/Workspace/.assistant/skills`). Pass `userEmail` or
|
|
@@ -270,7 +270,11 @@ function localSkillsFS(key) {
|
|
|
270
270
|
*/
|
|
271
271
|
export async function provisionRemoteSkills(option) {
|
|
272
272
|
const options = normalizeRemoteSkillsOption(option);
|
|
273
|
-
const empty = {
|
|
273
|
+
const empty = {
|
|
274
|
+
localSkillMounts: [],
|
|
275
|
+
standardSkillMounts: [],
|
|
276
|
+
skillNames: [],
|
|
277
|
+
};
|
|
274
278
|
if (!options)
|
|
275
279
|
return empty;
|
|
276
280
|
const failDefault = options.failOnError !== false;
|
|
@@ -288,6 +292,7 @@ export async function provisionRemoteSkills(option) {
|
|
|
288
292
|
: undefined;
|
|
289
293
|
const databricksBasePath = destination ? requestedBasePath : undefined;
|
|
290
294
|
const localSkillMounts = [];
|
|
295
|
+
const standardSkillMounts = [];
|
|
291
296
|
const skillNames = [];
|
|
292
297
|
let staging;
|
|
293
298
|
try {
|
|
@@ -301,10 +306,12 @@ export async function provisionRemoteSkills(option) {
|
|
|
301
306
|
if (isAiToolsSource(sourceOptions.source)) {
|
|
302
307
|
staging ??= await initializedScratch("mastra-remote-skills");
|
|
303
308
|
const tree = await cachedAiToolsTree(sourceOptions, staging.root, options, key);
|
|
304
|
-
|
|
309
|
+
const mount = {
|
|
305
310
|
filesystem: await memorySkillTree(tree.files, `aitools-${key}`),
|
|
306
311
|
mountPath,
|
|
307
|
-
}
|
|
312
|
+
};
|
|
313
|
+
localSkillMounts.push(mount);
|
|
314
|
+
standardSkillMounts.push(mount);
|
|
308
315
|
skillNames.push(...tree.record.skills);
|
|
309
316
|
logger.info("remote skill ready", {
|
|
310
317
|
source: sourceOptions.source,
|
|
@@ -320,6 +327,11 @@ export async function provisionRemoteSkills(option) {
|
|
|
320
327
|
const cached = metadata?.sources[key];
|
|
321
328
|
if (cached && isFresh(cached, resolveRefreshTtl(sourceOptions, options))) {
|
|
322
329
|
skillNames.push(...cached.skills);
|
|
330
|
+
const standardMount = {
|
|
331
|
+
filesystem: await memorySkillTreeFromFileSystem(cacheFS, cached.skills, `remote-${key}`),
|
|
332
|
+
mountPath,
|
|
333
|
+
};
|
|
334
|
+
standardSkillMounts.push(standardMount);
|
|
323
335
|
if (!destination)
|
|
324
336
|
localSkillMounts.push({ root: cacheFS.root, mountPath });
|
|
325
337
|
logger.info("remote skill ready", {
|
|
@@ -360,6 +372,10 @@ export async function provisionRemoteSkills(option) {
|
|
|
360
372
|
mountPath,
|
|
361
373
|
});
|
|
362
374
|
}
|
|
375
|
+
standardSkillMounts.push({
|
|
376
|
+
filesystem: await memorySkillTree(await serializeSkillDirs(staged), `remote-${key}`),
|
|
377
|
+
mountPath,
|
|
378
|
+
});
|
|
363
379
|
skillNames.push(...record.skills);
|
|
364
380
|
logger.info("remote skill installed", {
|
|
365
381
|
source: sourceOptions.source,
|
|
@@ -384,7 +400,7 @@ export async function provisionRemoteSkills(option) {
|
|
|
384
400
|
}
|
|
385
401
|
}
|
|
386
402
|
assertUniqueLocalSkillMounts(localSkillMounts);
|
|
387
|
-
return { localSkillMounts, databricksBasePath, skillNames };
|
|
403
|
+
return { localSkillMounts, standardSkillMounts, databricksBasePath, skillNames };
|
|
388
404
|
}
|
|
389
405
|
async function cachedAiToolsTree(sourceOptions, stagingRoot, options, key) {
|
|
390
406
|
const ttl = resolveRefreshTtl(sourceOptions, options);
|
|
@@ -443,6 +459,23 @@ async function memorySkillTree(files, id) {
|
|
|
443
459
|
}
|
|
444
460
|
return filesystem;
|
|
445
461
|
}
|
|
462
|
+
async function memorySkillTreeFromFileSystem(source, skillNames, id) {
|
|
463
|
+
await source.init();
|
|
464
|
+
const files = [];
|
|
465
|
+
for (const skill of skillNames) {
|
|
466
|
+
for (const entry of await source.readdir(skill, { recursive: true })) {
|
|
467
|
+
if (entry.type !== "file")
|
|
468
|
+
continue;
|
|
469
|
+
const path = posix.join(skill, entry.name);
|
|
470
|
+
const content = await source.readFile(path);
|
|
471
|
+
files.push({
|
|
472
|
+
path,
|
|
473
|
+
content: Buffer.from(content).toString("base64"),
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
}
|
|
477
|
+
return memorySkillTree(files, id);
|
|
478
|
+
}
|
|
446
479
|
/** Fail before workspace composition when two sources claim one virtual mount. */
|
|
447
480
|
function assertUniqueLocalSkillMounts(mounts) {
|
|
448
481
|
const rootsByMount = new Map();
|
|
@@ -748,4 +781,4 @@ async function pathExists(path) {
|
|
|
748
781
|
return false;
|
|
749
782
|
}
|
|
750
783
|
}
|
|
751
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLE9BQU8sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILEdBQUcsRUFDSCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFtQixNQUFNLHNCQUFzQixDQUFDO0FBRXpFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxN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SSxDQUFDLENBQUM7UUFDakIsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogU3RhcnR1cCBwcm92aXNpb25pbmcgb2YgcmVtb3RlIEFnZW50LVNraWxsIHNvdXJjZXMgZm9yIGEgTWFzdHJhIHdvcmtzcGFjZS5cbiAqXG4gKiBBIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZX0gbmFtZXMgV0hFUkUgYSBgU0tJTEwubWRgIHRyZWUgY29tZXMgZnJvbSAtIHRoZVxuICoge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBjb25zdGFudCwgYSBHaXRIdWIgYG93bmVyL3JlcG9gLCBhbnkgZ2l0IC8gR2l0TGFiIFVSTCxcbiAqIG9yIGEgZGlyZWN0IGRvd25sb2FkIFVSTCAtIGFuZCBvcHRpb25hbCBwZXItc291cmNlIHBvbGljeS5cbiAqIHtAbGluayBwcm92aXNpb25SZW1vdGVTa2lsbHN9IG1hdGVyaWFsaXplcyBldmVyeSBzb3VyY2UgaW50byBhIGxvY2FsXG4gKiBgU0tJTEwubWRgIHRyZWUgYXQgYXBwIGJvb3QgYW5kIHJldHVybnMgcmVhZC1vbmx5IGZpbGVzeXN0ZW0gYmFja2luZ3MgcGx1c1xuICogdGhlaXIgc3RhYmxlIHZpcnR1YWwgd29ya3NwYWNlIG1vdW50cy5cbiAqXG4gKiBSZXNvbHV0aW9uIHBlciBzb3VyY2UsIGluIG9yZGVyOlxuICpcbiAqIDEuIHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50IChgXCJhaXRvb2xzXCJgKTogRGF0YWJyaWNrcycgb3duIHNraWxsXG4gKiAgICBzZXQsIHJlYWQgc3RyYWlnaHQgZnJvbSB0aGUgcHVibGljIHJlcG8gdGhlIGBkYXRhYnJpY2tzIGFpdG9vbHNgIENMSVxuICogICAgc291cmNlcyBmcm9tLiBObyBDTEksIG5vIERhdGFicmlja3MgYXV0aCAtIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQgdXNhYmxlXG4gKiAgICBpbnNpZGUgYSBEYXRhYnJpY2tzIEFwcCBjb250YWluZXIsIHdoZXJlIHRoZSBDTEkgaXMgbm90IGluc3RhbGxlZDtcbiAqIDIuIHRoZSBPUFRJT05BTCBgc2tpbGxzYCBucG0gQ0xJIChwZWVyIGRlcCk6IGlmIGluc3RhbGxlZCwgZWFjaCBzb3VyY2UgaXNcbiAqICAgIGNvcGllZCBpbnRvIGEgc3RhZ2luZyBkaXIgd2l0aCBgc2tpbGxzIGFkZCA8c291cmNlPiAtLWFnZW50IDxkaXI+IC0tY29weWAsXG4gKiAgICB3aGljaCB1bmRlcnN0YW5kcyBldmVyeSBzb3VyY2UgZm9ybWF0IHRoZSBlY29zeXN0ZW0gZG9lcyAoR2l0SHViXG4gKiAgICBzaG9ydGhhbmQsIGdpdCBVUkxzLCBhcmNoaXZlL2Rvd25sb2FkIFVSTHMpO1xuICogMy4gb3RoZXJ3aXNlIGEgcGxhaW4ge0BsaW5rIGZldGNofSBvZiB0aGUgc291cmNlIFVSTCAoYnVpbHQgd2l0aFxuICogICAge0BsaW5rIG5ldC51cmxCdWlsZGVyfSksIHdyaXRpbmcgdGhlIGRvd25sb2FkZWQgYFNLSUxMLm1kYCB0byBhIHN0YWdpbmdcbiAqICAgIGRpci5cbiAqXG4gKiBBIHNvdXJjZSB0aGF0IHJlc29sdmVzIHRocm91Z2ggbmVpdGhlciBwYXRoIGZhaWxzIGFwcCBzdGFydHVwLCB1bmxlc3MgdGhlXG4gKiBzb3VyY2UgKG9yIHRoZSB0b3AtbGV2ZWwgY2FsbCkgc2V0cyBgZmFpbE9uRXJyb3I6IGZhbHNlYCwgaW4gd2hpY2ggY2FzZSBpdCBpc1xuICogbG9nZ2VkIGFuZCBza2lwcGVkIHNvIG9uZSBiYWQgc291cmNlIG5ldmVyIHRha2VzIHRoZSBhcHAgZG93bi5cbiAqXG4gKiBBSSBUb29scyB1c2VzIHRoZSBzaGFyZWQgYEBkYngtdG9vbHMvY2FjaGVgIHByb2plY3QgY2FjaGUgd2l0aCBhIG9uZS1kYXkgVFRMLFxuICogdGhlbiBoeWRyYXRlcyBvbmUgcHJvY2Vzcy1tZW1vcnkgZmlsZXN5c3RlbSBtb3VudGVkIGF0XG4gKiB7QGxpbmsgQUlUT09MU19TS0lMTFNfTU9VTlR9IGZvciBldmVyeSBkZWZhdWx0IHdvcmtzcGFjZS4gT3RoZXIgc291cmNlcyBrZWVwXG4gKiBhIHtAbGluayBNRVRBREFUQV9GSUxFfSBiZXNpZGUgdGhlaXIgcHJvdmlzaW9uZWQgdHJlZSBhbmQgZGVmYXVsdCB0byBhXG4gKiBzZXZlbi1kYXkgcmVmcmVzaCB3aW5kb3cuIFBhc3MgYHJlZnJlc2hUdGxNczogMGAgdG8gZG93bmxvYWQgb24gZXZlcnkgYm9vdC5cbiAqXG4gKiBGb3Igbm9uLUFJLVRvb2xzIHNvdXJjZXMsIHRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIGlzIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZVxuICogQXNzaXN0YW50IHNraWxscyB0cmVlIChgL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc2ApLiBQYXNzIGB1c2VyRW1haWxgIG9yXG4gKiBgZGF0YWJyaWNrc0Jhc2VQYXRoYCB0byBzZWxlY3QgYW5vdGhlciBkZXN0aW5hdGlvbi4gV2hlbiBpdCBpcyB1bmF2YWlsYWJsZSxcbiAqIHRoZSB0cmVlIGlzIGV4cG9zZWQgdGhyb3VnaCBhIHN0YWJsZSByZWFkLW9ubHkgbG9jYWwgbW91bnQgaW5zdGVhZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlLCBybSwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHBvc2l4IH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50TGlrZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZmx1c2hDYWNoZSwgZ2V0T3JTZXQsIHByb2plY3RDYWNoZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2NhY2hlL2NhY2hlXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0sIHdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmltcG9ydCB7IGxvY2FsRlMsIHR5cGUgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGZpbmQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQge1xuICBhc3luY1V0aWxzLFxuICBlcnJvclV0aWxzLFxuICBoYXNoLFxuICBqc29uLFxuICBsb2csXG4gIG5ldCxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgT25lT3JNYW55IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IE1lbW9yeUZpbGVTeXN0ZW0sIHR5cGUgRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5pbXBvcnQgeyBPUkdBTklaQVRJT05fU0tJTExTX1BBVEgsIHBlcnNvbmFsU2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvcmVtb3RlLXNraWxsc1wiKTtcblxuLyoqXG4gKiBBZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuXG4gKlxuICogYHVuaXZlcnNhbGAgaXMgdGhlIENMSSdzIG93biBuYW1lIGZvciBcIm5vIHBhcnRpY3VsYXIgYWdlbnQsIGp1c3QgdGhlIHBsYWluXG4gKiB0cmVlXCIsIHdoaWNoIGlzIHdoYXQgdGhpcyBtb2R1bGUgd2FudHMgLSBpdCByZS1ob3N0cyB0aGUgcmVzdWx0IGl0c2VsZi4gVGhlXG4gKiBpZCBtdXN0IGJlIG9uZSB0aGUgaW5zdGFsbGVkIENMSSBrbm93czogYW4gdW5yZWNvZ25pemVkIG9uZSBpcyByZWplY3RlZFxuICogb3V0cmlnaHQgKGBJbnZhbGlkIGFnZW50czogLi4uYCksIHRha2luZyBldmVyeSBub24tYGFpdG9vbHNgIHNvdXJjZSBkb3duIHdpdGhcbiAqIGl0LCBzaW5jZSBhIENMSSBmYWlsdXJlIGlzIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgZmFsbC10aHJvdWdoIHRvXG4gKiB7QGxpbmsgc3RhZ2VWaWFGZXRjaH0uXG4gKi9cbmNvbnN0IFNLSUxMU19DTElfQUdFTlQgPSBcInVuaXZlcnNhbFwiO1xuXG4vKiogV2hlcmUgdGhlIGBza2lsbHNgIENMSSBkcm9wcyBhIHBsYWluIGBTS0lMTC5tZGAgdHJlZSB1bmRlciBhIHRhcmdldCBkaXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0xBWU9VVCA9IFtcIi5hZ2VudHNcIiwgXCJza2lsbHNcIl0gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgYm9keSwgbWF0Y2hpbmcgdGhlIGBza2lsbHNgIENMSSBkZWZhdWx0LiAqL1xuY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogTWF4aW11bSB0aW1lIG9uZSByZW1vdGUgZmlsZSBkb3dubG9hZCBtYXkgYmxvY2sgc3RhcnR1cC4gKi9cbmNvbnN0IERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIFN0YWJsZSB0ZW1wIGRpcmVjdG9yeSBob2xkaW5nIG9uZSByZWJ1aWx0IHNraWxsIHRyZWUgcGVyIHJlbW90ZSBzb3VyY2UuICovXG5jb25zdCBMT0NBTF9TS0lMTFNfRElSID0gXCJtYXN0cmEtbG9jYWwtc2tpbGxzXCI7XG5cbi8qKiBWaXJ0dWFsIHdvcmtzcGFjZSBwYXRoIHJlc2VydmVkIGZvciBsb2NhbGx5IHByb3Zpc2lvbmVkIERhdGFicmlja3MgQUkgVG9vbHMuICovXG5leHBvcnQgY29uc3QgQUlUT09MU19TS0lMTFNfTU9VTlQgPSBcIi8uZGF0YWJyaWNrcy9za2lsbHNcIjtcblxuLyoqIFZpcnR1YWwgd29ya3NwYWNlIHJvb3QgZm9yIGV2ZXJ5IG90aGVyIGxvY2FsbHkgcHJvdmlzaW9uZWQgcmVtb3RlIHNvdXJjZS4gKi9cbmV4cG9ydCBjb25zdCBSRU1PVEVfU0tJTExTX01PVU5UID0gXCIvLnNraWxsc1wiO1xuXG4vKipcbiAqIEJvb2trZWVwaW5nIGZpbGUgd3JpdHRlbiBhdCB0aGUgcm9vdCBvZiBldmVyeSBwcm92aXNpb25lZCBza2lsbCB0cmVlLCBuYW1pbmdcbiAqIHdoZW4gZWFjaCBzb3VyY2Ugd2FzIGxhc3QgZG93bmxvYWRlZC4gQSBkb3RmaWxlIHNvIHRoZSBza2lsbCBzY2FubmVycywgd2hpY2hcbiAqIGxvb2sgZm9yIGA8ZGlyPi9TS0lMTC5tZGAsIG5ldmVyIG1pc3Rha2UgaXQgZm9yIGEgc2tpbGwuXG4gKi9cbmNvbnN0IE1FVEFEQVRBX0ZJTEUgPSBcIi5tZXRhZGF0YS5qc29uXCI7XG5cbi8qKiBTaGFwZSBtYXJrZXIgZm9yIHtAbGluayBNRVRBREFUQV9GSUxFfTsgYW4gdW5rbm93biB2ZXJzaW9uIGlzIGlnbm9yZWQsIG5vdCByZWFkLiAqL1xuY29uc3QgTUVUQURBVEFfVkVSU0lPTiA9IDE7XG5cbi8qKiBIb3cgbG9uZyBhIGdlbmVyYWwgcHJvdmlzaW9uZWQgc291cmNlIGlzIHJldXNlZCBiZWZvcmUgYmVpbmcgZG93bmxvYWRlZCBhZ2Fpbi4gKi9cbmNvbnN0IERFRkFVTFRfUkVGUkVTSF9UVExfTVMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqIEhvdyBsb25nIHRoZSBzaGFyZWQgRGF0YWJyaWNrcyBBSSBUb29scyBzbmFwc2hvdCBpcyByZXVzZWQuICovXG5leHBvcnQgY29uc3QgQUlUT09MU19SRUZSRVNIX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGFpVG9vbHNDYWNoZSA9IHByb2plY3RDYWNoZShcIm1hc3RyYS1haXRvb2xzXCIsIHtcbiAgdHRsOiBBSVRPT0xTX1JFRlJFU0hfVFRMX01TLFxuICBtYXhFbnRyaWVzOiAzMixcbn0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUkgVG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogU291cmNlIGNvbnN0YW50IHNlbGVjdGluZyBEYXRhYnJpY2tzJyBvd24gQUkgVG9vbHMgc2tpbGwgc2V0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXN0cmEoeyByZW1vdGVTa2lsbHM6IFwiYWl0b29sc1wiIH0pO1xuICovXG5leHBvcnQgY29uc3QgQUlUT09MU19TT1VSQ0UgPSBcImFpdG9vbHNcIjtcblxuLyoqIFRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGxpdGVyYWwsIGZvciBjYWxsZXJzIHNwZWxsaW5nIHRoZSB1bmlvbiBvdXQuICovXG5leHBvcnQgdHlwZSBBaVRvb2xzU291cmNlID0gdHlwZW9mIEFJVE9PTFNfU09VUkNFO1xuXG4vKipcbiAqIFRoZSBQVUJMSUMgcmVwbyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGxgIHNvdXJjZXMgZnJvbS4gUmVhZGluZyBpdFxuICogZGlyZWN0bHkgaXMgd2hhdCBsZXRzIGFuIGFwcCBnZXQgdGhlIHNhbWUgc2tpbGxzIHRoZSBDTEkgaW5zdGFsbHMgd2l0aG91dFxuICogdGhlIENMSSAtIHdoaWNoIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyIGRvZXMgbm90IHNoaXAuXG4gKi9cbmNvbnN0IEFJVE9PTFNfUkVQTyA9IFwiZGF0YWJyaWNrcy9kYXRhYnJpY2tzLWFnZW50LXNraWxsc1wiO1xuXG4vKiogUmVwbyByZWYgdGhlIHNraWxscyBhcmUgcmVhZCBmcm9tLiBPdmVycmlkZSBwZXIgc291cmNlIHdpdGggYHJlZmAuICovXG5jb25zdCBBSVRPT0xTX1JFRiA9IFwibWFpblwiO1xuXG4vKiogU2tpbGwgZmlsZXMgZG93bmxvYWRlZCBhdCBvbmNlOyB0aGUgc2V0IGlzIH4zMCBza2lsbHMgb2YgYSBmZXcgZmlsZXMgZWFjaC4gKi9cbmNvbnN0IEFJVE9PTFNfQ09OQ1VSUkVOQ1kgPSA4O1xuXG4vKiogVGhlIHN1YnNldCBvZiB0aGUgcmVwbydzIGdlbmVyYXRlZCBgbWFuaWZlc3QuanNvbmAgdGhpcyBtb2R1bGUgcmVhZHMuICovXG5pbnRlcmZhY2UgQWlUb29sc01hbmlmZXN0IHtcbiAgc2tpbGxzPzogUmVjb3JkPHN0cmluZywgeyBmaWxlcz86IHN0cmluZ1tdOyByZXBvX2Rpcj86IHN0cmluZyB9Pjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcmVtb3RlIHNraWxsIHNvdXJjZSBhbmQgaXRzIHBlci1zb3VyY2UgcG9saWN5LlxuICpcbiAqIGBzb3VyY2VgIGlzIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gb3IgYW55dGhpbmcgdGhlIGBza2lsbHNgIGVjb3N5c3RlbVxuICogdW5kZXJzdGFuZHM6IGEgR2l0SHViIGBvd25lci9yZXBvYCBzaG9ydGhhbmQsIGEgZnVsbCBHaXRIdWIgLyBHaXRMYWIgLyBnaXRcbiAqIFVSTCwgb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMIHRvIGEgYFNLSUxMLm1kYCBvciBhcmNoaXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsU291cmNlT3B0aW9ucyB7XG4gIC8qKiBgXCJhaXRvb2xzXCJgLCBhIEdpdEh1YiBzaG9ydGhhbmQsIGEgZ2l0IC8gR2l0TGFiIFVSTCwgb3IgYSBkb3dubG9hZCBVUkwuICovXG4gIHNvdXJjZTogbmV0LlVybExpa2UgfCBBaVRvb2xzU291cmNlO1xuICAvKiogU3RhYmxlIHZpcnR1YWwgbW91bnQgbmFtZSB1bmRlciBgLy5za2lsbHNgOyBnZW5lcmF0ZWQgZnJvbSB0aGUgc291cmNlIHdoZW4gb21pdHRlZC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEluc3RhbGwgb25seSB0aGVzZSBza2lsbCBuYW1lcyBmcm9tIHRoZSBzb3VyY2UuICovXG4gIHNraWxscz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKiogSW5jbHVkZSBleHBlcmltZW50YWwgc2tpbGxzLiBgXCJhaXRvb2xzXCJgIG9ubHkuICovXG4gIGV4cGVyaW1lbnRhbD86IGJvb2xlYW47XG4gIC8qKiBQaW4gdGhlIHJlcG8gcmVmICh0YWcgLyBicmFuY2ggLyBzaGEpLiBgXCJhaXRvb2xzXCJgIG9ubHk7IGRlZmF1bHRzIHRvIGBtYWluYC4gKi9cbiAgcmVmPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBmb3IgdGhpcyBzb3VyY2UuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGlzIHNvdXJjZSdzIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdCBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsXG4gICAqIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLnJlZnJlc2hUdGxNc307IGAwYCByZS1kb3dubG9hZHMgb25cbiAgICogZXZlcnkgYm9vdC5cbiAgICovXG4gIHJlZnJlc2hUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gYGZhbHNlYCwgYSBzb3VyY2UgdGhhdCBmYWlscyB0byByZXNvbHZlIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZCBpbnN0ZWFkXG4gICAqIG9mIGZhaWxpbmcgYXBwIHN0YXJ0dXAuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLmZhaWxPbkVycm9yfS5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJlbW90ZSBza2lsbCBzb3VyY2U6IHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIFVSTC1saWtlXG4gKiAoc3RyaW5nIC8gYFVSTGAgLyBgeyB1cmwgfWApLCBvciBhIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnN9IGJhZyB3aXRoXG4gKiBwZXItc291cmNlIHBvbGljeS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVtb3RlU2tpbGxTb3VyY2UgPSBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2UgfCBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnM7XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZSBgcmVtb3RlU2tpbGxzYCBvcHRpb246IG9uZSBzb3VyY2UsIGEgbm9uLWVtcHR5IGxpc3Qgb2YgdGhlbSwgb3JcbiAqIGEge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnN9IGJhZyB3aGVuIHRvcC1sZXZlbCBwb2xpY3kgaXMgbmVlZGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbHNPcHRpb24gPVxuICBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT4gfCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zO1xuXG4vKiogQSBzb3VyY2UgZW50cnkgd2l0aCBpdHMgYHNvdXJjZWAgZmxhdHRlbmVkIHRvIGEgcGxhaW4gc3RyaW5nLiAqL1xudHlwZSBOb3JtYWxpemVkU291cmNlID0gT21pdDxSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFwic291cmNlXCI+ICYgeyBzb3VyY2U6IHN0cmluZyB9O1xuXG4vKiogUmVhZC1vbmx5IGxvY2FsIGRpcmVjdG9yeSBleHBvc2VkIGF0IGEgc3RhYmxlIHZpcnR1YWwgd29ya3NwYWNlIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsU2tpbGxEaXJlY3RvcnlNb3VudCB7XG4gIC8qKiBQaHlzaWNhbCBsb2NhbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJvdmlzaW9uZWQgYFNLSUxMLm1kYCB0cmVlLiAqL1xuICByb290OiBzdHJpbmc7XG4gIC8qKiBWaXJ0dWFsIHBhdGggYWdlbnRzIHNlZSBpbnNpZGUgdGhlIGNvbXBvc2VkIE1hc3RyYSB3b3Jrc3BhY2UuICovXG4gIG1vdW50UGF0aDogc3RyaW5nO1xufVxuXG4vKiogUmVhZC1vbmx5IHByb2Nlc3MtbG9jYWwgZmlsZXN5c3RlbSBleHBvc2VkIGF0IGEgc3RhYmxlIHZpcnR1YWwgd29ya3NwYWNlIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVNraWxsTW91bnQge1xuICAvKiogUHJvY2Vzcy1zaGFyZWQgZmlsZXN5c3RlbSBjb250YWluaW5nIHRoZSBwcm92aXNpb25lZCBgU0tJTEwubWRgIHRyZWUuICovXG4gIGZpbGVzeXN0ZW06IEZpbGVTeXN0ZW07XG4gIC8qKiBWaXJ0dWFsIHBhdGggYWdlbnRzIHNlZSBpbnNpZGUgdGhlIGNvbXBvc2VkIE1hc3RyYSB3b3Jrc3BhY2UuICovXG4gIG1vdW50UGF0aDogc3RyaW5nO1xufVxuXG4vKiogTG9jYWwgc2tpbGwgYmFja2luZyBhY2NlcHRlZCBieSBldmVyeSBhdXRvLWNyZWF0ZWQgd29ya3NwYWNlLiAqL1xuZXhwb3J0IHR5cGUgTG9jYWxTa2lsbE1vdW50ID0gTG9jYWxTa2lsbERpcmVjdG9yeU1vdW50IHwgTWVtb3J5U2tpbGxNb3VudDtcblxuLyoqIFRvcC1sZXZlbCByZW1vdGUtc2tpbGxzIHByb3Zpc2lvbmluZyBvcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgLyoqIFNvdXJjZXMgdG8gbWF0ZXJpYWxpemUgYXQgc3RhcnR1cC4gKi9cbiAgc291cmNlczogUmVtb3RlU2tpbGxTb3VyY2UgfCBPbmVPck1hbnk8UmVtb3RlU2tpbGxTb3VyY2U+O1xuICAvKipcbiAgICogRmFpbCBhcHAgc3RhcnR1cCB3aGVuIGEgc291cmNlIGNhbid0IGJlIHJlc29sdmVkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuIEFcbiAgICogcGVyLXNvdXJjZSBgZmFpbE9uRXJyb3JgIHdpbnMgb3ZlciB0aGlzLlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xuICAvKipcbiAgICogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIHRoYXQgcm9vdHMgdGhlIGRlc3RpbmF0aW9uIEFzc2lzdGFudCBza2lsbHMgdHJlZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIE9CTyB1c2VyJ3MgYC9Xb3Jrc3BhY2UvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2AuXG4gICAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiBBdXRoLXNjb3BlZCBEYXRhYnJpY2tzIGNsaWVudC4gRGVmYXVsdHMgdG8gdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50TGlrZTtcbiAgLyoqIFVzZXIgZW1haWwgdXNlZCB0byBkZXJpdmUgdGhlIGRlZmF1bHQgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbi4gKi9cbiAgdXNlckVtYWlsPzogc3RyaW5nO1xuICAvKiogQnl0ZSBjZWlsaW5nIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkLiBEZWZhdWx0cyB0byAxMCBNaUIuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyBhIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdHMgc291cmNlIGlzIGRvd25sb2FkZWRcbiAgICogYWdhaW4sIGluIG1pbGxpc2Vjb25kcy4gQUkgVG9vbHMgZGVmYXVsdHMgdG8gb25lIGRheSBhbmQgb3RoZXIgc291cmNlcyB0b1xuICAgKiBzZXZlbiBkYXlzOyBgMGAgcmUtZG93bmxvYWRzIG9uIGV2ZXJ5IGJvb3QuIEEgcGVyLXNvdXJjZSBgcmVmcmVzaFR0bE1zYCB3aW5zLlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSByZXNvbHZlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMge1xuICAvKipcbiAgICogRXh0cmEgcmVhZC1vbmx5IGxvY2FsIG9yIHByb2Nlc3MtbWVtb3J5IHNraWxsIG1vdW50cyB0byBoYW5kIE1hc3RyYS4gQUlcbiAgICogVG9vbHMgYWx3YXlzIHVzZXMgcHJvY2VzcyBtZW1vcnk7IG90aGVyIHNvdXJjZXMgdXNlIHRoaXMgZmFsbGJhY2sgd2hlblxuICAgKiB0aGV5IGNvdWxkIG5vdCBiZSB3cml0dGVuIHRvIERhdGFicmlja3MuIFBoeXNpY2FsIHBhdGhzIHJlbWFpbiBoaWRkZW5cbiAgICogYmVoaW5kIHN0YWJsZSB2aXJ0dWFsIHdvcmtzcGFjZSBwYXRocy5cbiAgICovXG4gIGxvY2FsU2tpbGxNb3VudHM6IExvY2FsU2tpbGxNb3VudFtdO1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbiBlYWNoIHNvdXJjZSB3YXMgd3JpdHRlbiB0bywgaWYgYW55LiAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lcyBvZiBldmVyeSBza2lsbCBkaXJlY3Rvcnkgbm93IGF2YWlsYWJsZSwgd2hldGhlciBpdCB3YXMgZG93bmxvYWRlZCBvblxuICAgKiB0aGlzIGJvb3Qgb3IgcmV1c2VkIGZyb20gYSBzdGlsbC1mcmVzaCB0cmVlIChzZWUge0BsaW5rIE1FVEFEQVRBX0ZJTEV9KS5cbiAgICovXG4gIHNraWxsTmFtZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGZvciBvbmUgcmVzb2x2ZWQgc291cmNlIHNuYXBzaG90LiBHZW5lcmFsIHJlbW90ZSBzb3VyY2VzIHN0b3JlIGl0XG4gKiBpbiB7QGxpbmsgTUVUQURBVEFfRklMRX07IEFJIFRvb2xzIHN0b3JlcyBpdCB3aXRoIHRoZSBjYWNoZS1wYWNrYWdlIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsQ2FjaGVFbnRyeSB7XG4gIC8qKiBUaGUgc291cmNlIHN0cmluZyB0aGlzIGVudHJ5IHdhcyBkb3dubG9hZGVkIGZyb20sIGZvciByZWFkYWJpbGl0eS4gKi9cbiAgc291cmNlOiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRoZSBkb3dubG9hZCBjb21wbGV0ZWQsIElTTy04NjAxLiAqL1xuICBkb3dubG9hZGVkQXQ6IHN0cmluZztcbiAgLyoqIFNraWxsIGRpcmVjdG9yeSBuYW1lcyB0aGUgZG93bmxvYWQgcHJvZHVjZWQuICovXG4gIHNraWxsczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgY29udGVudC1hZmZlY3RpbmcgcG9saWN5IHRoYXQgZG93bmxvYWQgdXNlZC4gQWxzbyBmb2xkZWQgaW50byB0aGUgZW50cnlcbiAgICogS0VZLCBzbyBuYXJyb3dpbmcgYHNraWxsc2Agb3IgbW92aW5nIGByZWZgIG1pc3NlcyB0aGUgY2FjaGUgaW5zdGVhZCBvZlxuICAgKiBzaWxlbnRseSBzZXJ2aW5nIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gICAqL1xuICBwb2xpY3k/OiB7IHNraWxscz86IHN0cmluZ1tdOyBleHBlcmltZW50YWw/OiBib29sZWFuOyByZWY/OiBzdHJpbmcgfTtcbn1cblxuLyoqIFRoZSB7QGxpbmsgTUVUQURBVEFfRklMRX0gZG9jdW1lbnQ6IG9uZSBlbnRyeSBwZXIgcHJvdmlzaW9uZWQgc291cmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbHNNZXRhZGF0YSB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgc291cmNlczogUmVjb3JkPHN0cmluZywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5Pjtcbn1cblxuaW50ZXJmYWNlIENhY2hlZFNraWxsRmlsZSB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2FjaGVkQWlUb29sc1RyZWUge1xuICBmaWxlczogQ2FjaGVkU2tpbGxGaWxlW107XG4gIHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5O1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRBaVRvb2xzVHJlZSBleHRlbmRzIENhY2hlZEFpVG9vbHNUcmVlIHtcbiAgY2FjaGVkOiBib29sZWFuO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogTm9ybWFsaXplIHRoZSBgcmVtb3RlU2tpbGxzYCBvcHRpb24gaW50byBhIGZsYXQgb3B0aW9ucyBiYWcuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJhZyA9IGlzUHJvdmlzaW9uT3B0aW9ucyhvcHRpb24pID8gb3B0aW9uIDogdW5kZWZpbmVkO1xuICBjb25zdCBzb3VyY2VzID0gdG9Tb3VyY2VMaXN0KGJhZyA/IGJhZy5zb3VyY2VzIDogKG9wdGlvbiBhcyBSZW1vdGVTa2lsbFNvdXJjZSkpO1xuICAvLyBBbiBlbXB0eSBsaXN0IGlzIHRoZSBzYW1lIGFzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsLlxuICBpZiAoIW9iamVjdC5pc09uZU9yTWFueShzb3VyY2VzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgLi4uYmFnLCBzb3VyY2VzIH07XG59XG5cbi8qKiBBIGBzb3VyY2VzYC1iZWFyaW5nIGJhZyBpcyB0aGUgdG9wLWxldmVsIG9wdGlvbnMgc2hhcGUsIG5vdCBhIHNpbmdsZSBzb3VyY2UuICovXG5mdW5jdGlvbiBpc1Byb3Zpc2lvbk9wdGlvbnModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgcmV0dXJuIG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgJiYgXCJzb3VyY2VzXCIgaW4gdmFsdWU7XG59XG5cbi8qKiBPbmUgc291cmNlIG9yIG1hbnksIGFzIGEgcGxhaW4gYXJyYXkuIEEgc291cmNlIGlzIG5ldmVyIGl0c2VsZiBhbiBhcnJheS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlTGlzdChcbiAgaW5wdXQ6IFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPixcbik6IFJlbW90ZVNraWxsU291cmNlW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBbLi4uaW5wdXRdIDogW2lucHV0XTtcbn1cblxuLyoqIEZsYXR0ZW4gYSBzb3VyY2UgZW50cnkgLSBzdHJpbmcsIGBVUkxgLCBgeyB1cmwgfWAsIG9yIG9wdGlvbnMgYmFnIC0gdG8gYSB7QGxpbmsgTm9ybWFsaXplZFNvdXJjZX0uICovXG5mdW5jdGlvbiB0b1NvdXJjZU9wdGlvbnMoc291cmNlOiBSZW1vdGVTa2lsbFNvdXJjZSk6IE5vcm1hbGl6ZWRTb3VyY2Uge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsgc291cmNlIH07XG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkwpIHJldHVybiB7IHNvdXJjZTogc291cmNlLnRvU3RyaW5nKCkgfTtcbiAgaWYgKFwic291cmNlXCIgaW4gc291cmNlKSByZXR1cm4geyAuLi5zb3VyY2UsIHNvdXJjZTogdG9Tb3VyY2VTdHJpbmcoc291cmNlLnNvdXJjZSkgfTtcbiAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudXJsIH07XG59XG5cbi8qKiBBIHtAbGluayBuZXQuVXJsTGlrZX0gYXMgdGhlIHBsYWluIHN0cmluZyB0aGUgc3RhZ2luZyBwYXRocyB3b3JrIHdpdGguICovXG5mdW5jdGlvbiB0b1NvdXJjZVN0cmluZyhzb3VyY2U6IG5ldC5VcmxMaWtlKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBzb3VyY2U7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBVUkwgPyBzb3VyY2UudG9TdHJpbmcoKSA6IHNvdXJjZS51cmw7XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBzb3VyY2Ugc2VsZWN0cyB0aGUgYnVpbHQtaW4gRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbCBzZXQuICovXG5mdW5jdGlvbiBpc0FpVG9vbHNTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNvdXJjZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gQUlUT09MU19TT1VSQ0U7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHBvbGljeSB0aGF0IGRlY2lkZXMgd2hhdCBhIHNvdXJjZSdzIGRvd25sb2FkIENPTlRBSU5TLlxuICpcbiAqIE9ubHkgdGhlc2UgdGhyZWUgY2hhbmdlIHRoZSByZXN1bHRpbmcgdHJlZSwgc28gb25seSB0aGVzZSBiZWxvbmcgaW4gdGhlIGNhY2hlXG4gKiBrZXkgLSBgZmFpbE9uRXJyb3JgIGFuZCBgbWF4RG93bmxvYWRCeXRlc2AgZ292ZXJuIGhvdyBhIGZhaWx1cmUgaXMgaGFuZGxlZCxcbiAqIG5vdCB3aGF0IGEgc3VjY2VzcyBwcm9kdWNlcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVQb2xpY3koc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeVtcInBvbGljeVwiXSB7XG4gIGNvbnN0IHNraWxscyA9IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscyk7XG4gIGNvbnN0IHBvbGljeSA9IHtcbiAgICAuLi4oc2tpbGxzLmxlbmd0aCA+IDAgPyB7IHNraWxsczogWy4uLnNraWxsc10uc29ydCgpIH0gOiB7fSksXG4gICAgLi4uKHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlID8geyBleHBlcmltZW50YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPyB7IHJlZjogc291cmNlT3B0aW9ucy5yZWYhLnRyaW0oKSB9IDoge30pLFxuICB9O1xuICByZXR1cm4gT2JqZWN0LmtleXMocG9saWN5KS5sZW5ndGggPiAwID8gcG9saWN5IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YWJsZSBpZGVudGl0eSBvZiBhIHNvdXJjZSBBTkQgaXRzIGNvbnRlbnQtYWZmZWN0aW5nIHBvbGljeS5cbiAqXG4gKiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbG9uZSB3b3VsZCBsZXQgYSBjaGFuZ2VkIGBza2lsbHNgIGZpbHRlciBvciBgcmVmYCByZWFkXG4gKiBiYWNrIHRoZSBwcmV2aW91cyBkb3dubG9hZCBmb3IgYSBkYXk7IGtleWluZyBvbiBib3RoIHR1cm5zIHRoYXQgaW50byBhIG1pc3MuXG4gKiBUaGUgc2tpbGwgbGlzdCBpcyBzb3J0ZWQgZmlyc3Qgc28gYSByZW9yZGVyZWQgYXJyYXkgaXMgc3RpbGwgdGhlIHNhbWUga2V5LlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc2guZm52SGFzaChcbiAgICBKU09OLnN0cmluZ2lmeSh7IHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsIHBvbGljeTogY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucykgPz8gbnVsbCB9KSxcbiAgKTtcbn1cblxuLyoqIFN0YWJsZSB2aXJ0dWFsIHdvcmtzcGFjZSBwYXRoIGZvciBvbmUgbG9jYWxseSBwcm92aXNpb25lZCBzb3VyY2UuICovXG5mdW5jdGlvbiBsb2NhbFNraWxsTW91bnRQYXRoKHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzQWlUb29sc1NvdXJjZShzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHJldHVybiBBSVRPT0xTX1NLSUxMU19NT1VOVDtcbiAgY29uc3QgY29uZmlndXJlZE5hbWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHNvdXJjZU9wdGlvbnMubmFtZSk7XG4gIGNvbnN0IGlkZW50aWZpZXIgPSBjb25maWd1cmVkTmFtZVxuICAgID8gc3RyaW5nVXRpbHMudG9TbHVnKGNvbmZpZ3VyZWROYW1lKVxuICAgIDogc3RyaW5nVXRpbHMudG9TbHVnKHJlbW90ZVNvdXJjZUlkZW50aWZpZXIoc291cmNlT3B0aW9ucy5zb3VyY2UpKSB8fCBcInNvdXJjZVwiO1xuICBpZiAoIWlkZW50aWZpZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcmVtb3RlIHNraWxsIHNvdXJjZSBuYW1lIG11c3QgY29udGFpbiBsZXR0ZXJzIG9yIG51bWJlcnM6IFwiJHtjb25maWd1cmVkTmFtZX1cImAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zaXguam9pbihSRU1PVEVfU0tJTExTX01PVU5ULCBjb25maWd1cmVkTmFtZSA/IGlkZW50aWZpZXIgOiBgJHtpZGVudGlmaWVyfS0ke2tleX1gKTtcbn1cblxuLyoqIEh1bWFuLXJlYWRhYmxlIHNvdXJjZSBwb3J0aW9uIHVzZWQgYnkgZ2VuZXJhdGVkIHZpcnR1YWwgbW91bnQgaWRlbnRpZmllcnMuICovXG5mdW5jdGlvbiByZW1vdGVTb3VyY2VJZGVudGlmaWVyKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoc291cmNlKTtcbiAgaWYgKCF1cmwpIHJldHVybiBzb3VyY2U7XG4gIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWUucmVwbGFjZSgvXFwuKGdpdHxtZHx6aXB8dGFyfHRnenxneikkL2ksIFwiXCIpO1xuICByZXR1cm4gYCR7dXJsLmhvc3RuYW1lfS0ke3BhdGh9YDtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgcmV1c2Ugd2luZG93OiBwZXItc291cmNlLCB0b3AtbGV2ZWwsIHRoZW4gdGhlIHNvdXJjZSBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlZnJlc2hUdGwoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBudW1iZXIge1xuICByZXR1cm4gKFxuICAgIHNvdXJjZU9wdGlvbnMucmVmcmVzaFR0bE1zID8/XG4gICAgb3B0aW9ucy5yZWZyZXNoVHRsTXMgPz9cbiAgICAoaXNBaVRvb2xzU291cmNlKHNvdXJjZU9wdGlvbnMuc291cmNlKSA/IEFJVE9PTFNfUkVGUkVTSF9UVExfTVMgOiBERUZBVUxUX1JFRlJFU0hfVFRMX01TKVxuICApO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIG1ldGFkYXRhIGRvY3VtZW50IGF0IHRoZSByb290IG9mIGEgcHJvdmlzaW9uZWQgdHJlZSwgb3IgYHVuZGVmaW5lZGBcbiAqIHdoZW4gdGhlcmUgaXMgbm9uZSwgaXQgaXMgdW5yZWFkYWJsZSwgb3IgaXQgd2FzIHdyaXR0ZW4gYnkgYSBzaGFwZSB0aGlzXG4gKiB2ZXJzaW9uIGRvZXMgbm90IGtub3cuXG4gKlxuICogTmV2ZXIgdGhyb3dzOiBhIG1pc3Npbmcgb3IgY29ycnVwdCByZWNvcmQgaXMgYSBjYWNoZSBNSVNTLCB3aGljaCBjb3N0cyBhXG4gKiBkb3dubG9hZCAtIHdoaWxlIGxldHRpbmcgaXQgZmFpbCB3b3VsZCB0YWtlIGFwcCBzdGFydHVwIGRvd24gb3ZlclxuICogYm9va2tlZXBpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNZXRhZGF0YShmczogRmlsZVN5c3RlbSk6IFByb21pc2U8UmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHMoTUVUQURBVEFfRklMRSkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKE1FVEFEQVRBX0ZJTEUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UocmF3LCB1bmRlZmluZWQpIGFzIFJlbW90ZVNraWxsc01ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnNlZCkgfHwgcGFyc2VkLnZlcnNpb24gIT09IE1FVEFEQVRBX1ZFUlNJT04pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG9iamVjdC5pc1JlY29yZChwYXJzZWQuc291cmNlcykgPyBwYXJzZWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlOnVucmVhZGFibGVcIiwgeyBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gZW50cnkgaXMgc3RpbGwgaW5zaWRlIGl0cyByZXVzZSB3aW5kb3cuXG4gKlxuICogQSBgdHRsTXNgIG9mIGAwYCBkaXNhYmxlcyByZXVzZSBvdXRyaWdodCwgYW5kIGFuIHVucGFyc2VhYmxlIG9yIEZVVFVSRVxuICogdGltZXN0YW1wIGNvdW50cyBhcyBzdGFsZSAtIGEgY2xvY2sgdGhhdCBtb3ZlZCBiYWNrd2FyZHMgc2hvdWxkIGNvc3Qgb25lXG4gKiBleHRyYSBkb3dubG9hZCwgbm90IHBpbiBhIHRyZWUgYXMgZnJlc2ggaW5kZWZpbml0ZWx5LlxuICovXG5mdW5jdGlvbiBpc0ZyZXNoKGVudHJ5OiBSZW1vdGVTa2lsbENhY2hlRW50cnksIHR0bE1zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHR0bE1zIDw9IDAgfHwgIUFycmF5LmlzQXJyYXkoZW50cnkuc2tpbGxzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkb3dubG9hZGVkQXQgPSBvYmplY3QudG9EYXRlKGVudHJ5LmRvd25sb2FkZWRBdCk7XG4gIGlmICghZG93bmxvYWRlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBkb3dubG9hZGVkQXQuZ2V0VGltZSgpO1xuICByZXR1cm4gYWdlID49IDAgJiYgYWdlIDwgdHRsTXM7XG59XG5cbi8qKlxuICogTWVyZ2Ugb25lIHNvdXJjZSdzIGVudHJ5IGludG8gdGhlIHRyZWUncyBtZXRhZGF0YSBkb2N1bWVudCwgcHJlc2VydmluZyB3aGF0XG4gKiBvdGhlciBzb3VyY2VzIHJlY29yZGVkIC0gdGhlIERhdGFicmlja3MgZGVzdGluYXRpb24gaXMgU0hBUkVELCBzbyBhIGJsaW5kXG4gKiBvdmVyd3JpdGUgd291bGQgZHJvcCBldmVyeSBzaWJsaW5nIHNvdXJjZSdzIHRpbWVzdGFtcCBhbmQgcmUtZG93bmxvYWQgdGhlXG4gKiBsb3Qgb24gdGhlIG5leHQgYm9vdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVNZXRhZGF0YShcbiAgZnM6IEZpbGVTeXN0ZW0sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyeTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCByZWFkTWV0YWRhdGEoZnMpO1xuICBjb25zdCBuZXh0OiBSZW1vdGVTa2lsbHNNZXRhZGF0YSA9IHtcbiAgICB2ZXJzaW9uOiBNRVRBREFUQV9WRVJTSU9OLFxuICAgIHNvdXJjZXM6IHsgLi4uY3VycmVudD8uc291cmNlcywgW2tleV06IGVudHJ5IH0sXG4gIH07XG4gIGF3YWl0IGZzLndyaXRlRmlsZShNRVRBREFUQV9GSUxFLCBgJHtKU09OLnN0cmluZ2lmeShuZXh0LCBudWxsLCAyKX1cXG5gLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbn1cblxuLyoqIFRoZSBzdGFibGUgbG9jYWwgdHJlZSBhIHNvdXJjZSBpcyByZWJ1aWx0IGludG8sIGtleWVkIGJ5IHtAbGluayBjYWNoZUtleX0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsc0ZTKGtleTogc3RyaW5nKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgcmV0dXJuIGxvY2FsRlMudG1wRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgZXZlcnkgY29uZmlndXJlZCByZW1vdGUgc2tpbGwgc291cmNlIGF0IGFwcCBzdGFydHVwLlxuICpcbiAqIFdyaXRlcyBlYWNoIHJlc29sdmVkIGBTS0lMTC5tZGAgdHJlZSB0byB0aGUgRGF0YWJyaWNrcyB1c2VyIEFzc2lzdGFudCBza2lsbHNcbiAqIGZvbGRlciB3aGVuIGEgd3JpdGFibGUgd29ya3NwYWNlIGlzIGF2YWlsYWJsZSwgZWxzZSB1bmRlclxuICoge0BsaW5rIGxvY2FsRlMudG1wRlN9IHJldHVybmVkIGluIHtAbGluayBQcm92aXNpb25lZFJlbW90ZVNraWxscy5sb2NhbFNraWxsTW91bnRzfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvblJlbW90ZVNraWxscyhcbiAgb3B0aW9uOiBSZW1vdGVTa2lsbHNPcHRpb24gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpemVSZW1vdGVTa2lsbHNPcHRpb24ob3B0aW9uKTtcbiAgY29uc3QgZW1wdHk6IFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzID0geyBsb2NhbFNraWxsTW91bnRzOiBbXSwgc2tpbGxOYW1lczogW10gfTtcbiAgaWYgKCFvcHRpb25zKSByZXR1cm4gZW1wdHk7XG5cbiAgY29uc3QgZmFpbERlZmF1bHQgPSBvcHRpb25zLmZhaWxPbkVycm9yICE9PSBmYWxzZTtcbiAgY29uc3Qgc291cmNlcyA9IChBcnJheS5pc0FycmF5KG9wdGlvbnMuc291cmNlcykgPyBvcHRpb25zLnNvdXJjZXMgOiBbb3B0aW9ucy5zb3VyY2VzXSkubWFwKFxuICAgIHRvU291cmNlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgY2xpZW50ID0gb3B0aW9ucy5jbGllbnQgPz8gYXBwa2l0LnRyeUdldEV4ZWN1dGlvbkNvbnRleHQoKT8uY2xpZW50O1xuICAvLyBQcm9iZWQgcmF0aGVyIHRoYW4gYXNzdW1lZDogYW4gaWRlbnRpdHkgdGhhdCBjYW5ub3Qgd3JpdGUgdGhlIHdvcmtzcGFjZVxuICAvLyB0cmVlIGZhbGxzIGJhY2sgdG8gdGhlIGxvY2FsIG9uZSBpbnN0ZWFkIG9mIGZhaWxpbmcgc3RhcnR1cC4gVGhlIHByb2JlIGFsc29cbiAgLy8gY3JlYXRlcyB0aGUgcm9vdCwgd2hpY2ggdGhlIGZpcnN0IGNhY2hlIFJFQUQgbmVlZHMgLSBgY29weVNraWxsRGlyc2Agd291bGRcbiAgLy8gb3RoZXJ3aXNlIGJlIHRoZSBmaXJzdCB0aGluZyB0byBjcmVhdGUgaXQsIHdoaWNoIGlzIHRvbyBsYXRlLlxuICBjb25zdCByZXF1ZXN0ZWRCYXNlUGF0aCA9IHNvdXJjZXMuc29tZSgoc291cmNlKSA9PiAhaXNBaVRvb2xzU291cmNlKHNvdXJjZS5zb3VyY2UpKVxuICAgID8gcmVzb2x2ZURhdGFicmlja3NCYXNlUGF0aChvcHRpb25zLCBjbGllbnQpXG4gICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGRlc3RpbmF0aW9uID0gcmVxdWVzdGVkQmFzZVBhdGhcbiAgICA/IGF3YWl0IG9wZW5Xcml0YWJsZVdvcmtzcGFjZShyZXF1ZXN0ZWRCYXNlUGF0aCwgY2xpZW50IGFzIFdvcmtzcGFjZUNsaWVudClcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGF0YWJyaWNrc0Jhc2VQYXRoID0gZGVzdGluYXRpb24gPyByZXF1ZXN0ZWRCYXNlUGF0aCA6IHVuZGVmaW5lZDtcblxuICBjb25zdCBsb2NhbFNraWxsTW91bnRzOiBMb2NhbFNraWxsTW91bnRbXSA9IFtdO1xuICBjb25zdCBza2lsbE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBsZXQgc3RhZ2luZzogTG9jYWxGaWxlU3lzdGVtIHwgdW5kZWZpbmVkO1xuXG4gIHRyeSB7XG4gICAgZm9yIChjb25zdCBzb3VyY2VPcHRpb25zIG9mIHNvdXJjZXMpIHtcbiAgICAgIGNvbnN0IGZhaWxPbkVycm9yID0gc291cmNlT3B0aW9ucy5mYWlsT25FcnJvciA/PyBmYWlsRGVmYXVsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIFdoZXJlIHRoaXMgc291cmNlJ3MgYm9va2tlZXBpbmcgbGl2ZXM6IHRoZSBzaGFyZWQgRGF0YWJyaWNrcyB0cmVlLCBvclxuICAgICAgICAvLyB0aGUgc291cmNlJ3Mgb3duIHN0YWJsZSBsb2NhbCBkaXIuXG4gICAgICAgIGNvbnN0IGtleSA9IGNhY2hlS2V5KHNvdXJjZU9wdGlvbnMpO1xuICAgICAgICBjb25zdCBtb3VudFBhdGggPSBsb2NhbFNraWxsTW91bnRQYXRoKHNvdXJjZU9wdGlvbnMsIGtleSk7XG4gICAgICAgIGlmIChpc0FpVG9vbHNTb3VyY2Uoc291cmNlT3B0aW9ucy5zb3VyY2UpKSB7XG4gICAgICAgICAgc3RhZ2luZyA/Pz0gYXdhaXQgaW5pdGlhbGl6ZWRTY3JhdGNoKFwibWFzdHJhLXJlbW90ZS1za2lsbHNcIik7XG4gICAgICAgICAgY29uc3QgdHJlZSA9IGF3YWl0IGNhY2hlZEFpVG9vbHNUcmVlKHNvdXJjZU9wdGlvbnMsIHN0YWdpbmcucm9vdCwgb3B0aW9ucywga2V5KTtcbiAgICAgICAgICBsb2NhbFNraWxsTW91bnRzLnB1c2goe1xuICAgICAgICAgICAgZmlsZXN5c3RlbTogYXdhaXQgbWVtb3J5U2tpbGxUcmVlKHRyZWUuZmlsZXMsIGBhaXRvb2xzLSR7a2V5fWApLFxuICAgICAgICAgICAgbW91bnRQYXRoLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi50cmVlLnJlY29yZC5za2lsbHMpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxsIHJlYWR5XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogbW91bnRQYXRoLFxuICAgICAgICAgICAgZG93bmxvYWRlZEF0OiB0cmVlLnJlY29yZC5kb3dubG9hZGVkQXQsXG4gICAgICAgICAgICBza2lsbHM6IHRyZWUucmVjb3JkLnNraWxscyxcbiAgICAgICAgICAgIGNhY2hlZDogdHJlZS5jYWNoZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGVGUyA9IGRlc3RpbmF0aW9uID8/IGxvY2FsU2tpbGxzRlMoa2V5KTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCByZWFkTWV0YWRhdGEoY2FjaGVGUyk7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IG1ldGFkYXRhPy5zb3VyY2VzW2tleV07XG4gICAgICAgIGlmIChjYWNoZWQgJiYgaXNGcmVzaChjYWNoZWQsIHJlc29sdmVSZWZyZXNoVHRsKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpKSkge1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5jYWNoZWQuc2tpbGxzKTtcbiAgICAgICAgICBpZiAoIWRlc3RpbmF0aW9uKSBsb2NhbFNraWxsTW91bnRzLnB1c2goeyByb290OiBjYWNoZUZTLnJvb3QsIG1vdW50UGF0aCB9KTtcbiAgICAgICAgICBsb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbCByZWFkeVwiLCB7XG4gICAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBtb3VudFBhdGgsXG4gICAgICAgICAgICBkb3dubG9hZGVkQXQ6IGNhY2hlZC5kb3dubG9hZGVkQXQsXG4gICAgICAgICAgICBza2lsbHM6IGNhY2hlZC5za2lsbHMsXG4gICAgICAgICAgICBjYWNoZWQ6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBsb2dnZXIuaW5mbyhcImluc3RhbGxpbmcgcmVtb3RlIHNraWxsXCIsIHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICB9KTtcbiAgICAgICAgc3RhZ2luZyA/Pz0gYXdhaXQgaW5pdGlhbGl6ZWRTY3JhdGNoKFwibWFzdHJhLXJlbW90ZS1za2lsbHNcIik7XG4gICAgICAgIGNvbnN0IHN0YWdlZERpciA9IGF3YWl0IHN0YWdlU291cmNlKHNvdXJjZU9wdGlvbnMsIHN0YWdpbmcucm9vdCwgb3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHN0YWdlZCA9IGF3YWl0IGNvbGxlY3RTa2lsbERpcnMoc3RhZ2VkRGlyKTtcbiAgICAgICAgaWYgKHN0YWdlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIFNLSUxMLm1kIGZvdW5kIGZvciBzb3VyY2UgXCIke3NvdXJjZU9wdGlvbnMuc291cmNlfVwiYCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcG9saWN5ID0gY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5ID0ge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZG93bmxvYWRlZEF0OiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgc2tpbGxzOiBzdGFnZWQubWFwKChkaXIpID0+IGRpci5uYW1lKSxcbiAgICAgICAgICAuLi4ocG9saWN5ID8geyBwb2xpY3kgfSA6IHt9KSxcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGRlc3RpbmF0aW9uICYmIGRhdGFicmlja3NCYXNlUGF0aCkge1xuICAgICAgICAgIGF3YWl0IHJlbW92ZURlbGV0ZWRTa2lsbHMoZGVzdGluYXRpb24sIGtleSwgbWV0YWRhdGEsIHJlY29yZC5za2lsbHMpO1xuICAgICAgICAgIGF3YWl0IGNvcHlTa2lsbERpcnMoZGVzdGluYXRpb24sIHN0YWdlZCk7XG4gICAgICAgICAgLy8gT25seSBhZnRlciB0aGUgY29weSBsYW5kczogYSBtZXRhZGF0YSBlbnRyeSB3cml0dGVuIGZpcnN0IHdvdWxkXG4gICAgICAgICAgLy8gbWFyayBhIGZhaWxlZCBwcm92aXNpb24gYXMgZnJlc2ggYW5kIHN1cHByZXNzIHRoZSByZXRyeSBmb3IgYSBkYXkuXG4gICAgICAgICAgYXdhaXQgd3JpdGVNZXRhZGF0YShkZXN0aW5hdGlvbiwga2V5LCByZWNvcmQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvY2FsU2tpbGxNb3VudHMucHVzaCh7XG4gICAgICAgICAgICByb290OiBhd2FpdCBwZXJzaXN0TG9jYWxseShrZXksIHN0YWdlZCwgcmVjb3JkKSxcbiAgICAgICAgICAgIG1vdW50UGF0aCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBza2lsbE5hbWVzLnB1c2goLi4ucmVjb3JkLnNraWxscyk7XG4gICAgICAgIGxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxsIGluc3RhbGxlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBkZXN0aW5hdGlvbjogZGF0YWJyaWNrc0Jhc2VQYXRoID8/IGxvY2FsU2tpbGxNb3VudHMuYXQoLTEpPy5tb3VudFBhdGgsXG4gICAgICAgICAgc2tpbGxzOiByZWNvcmQuc2tpbGxzLFxuICAgICAgICB9KTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICBpZiAoZmFpbE9uRXJyb3IpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgZmFpbGVkIHRvIHByb3Zpc2lvbiByZW1vdGUgc2tpbGwgc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cIjogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpfWAsXG4gICAgICAgICAgICB7IGNhdXNlOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSB9LFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgbG9nZ2VyLndhcm4oXCJzb3VyY2U6c2tpcHBlZFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgfSBmaW5hbGx5IHtcbiAgICBpZiAoc3RhZ2luZykge1xuICAgICAgYXdhaXQgcm0oc3RhZ2luZy5yb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgICB9XG4gIH1cblxuICBhc3NlcnRVbmlxdWVMb2NhbFNraWxsTW91bnRzKGxvY2FsU2tpbGxNb3VudHMpO1xuICByZXR1cm4geyBsb2NhbFNraWxsTW91bnRzLCBkYXRhYnJpY2tzQmFzZVBhdGgsIHNraWxsTmFtZXMgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2FjaGVkQWlUb29sc1RyZWUoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHN0YWdpbmdSb290OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4gIGtleTogc3RyaW5nLFxuKTogUHJvbWlzZTxSZXNvbHZlZEFpVG9vbHNUcmVlPiB7XG4gIGNvbnN0IHR0bCA9IHJlc29sdmVSZWZyZXNoVHRsKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpO1xuICBsZXQgbG9hZGVkID0gZmFsc2U7XG4gIGNvbnN0IGxvYWQgPSBhc3luYyAoKTogUHJvbWlzZTxDYWNoZWRBaVRvb2xzVHJlZT4gPT4ge1xuICAgIGxvYWRlZCA9IHRydWU7XG4gICAgY29uc3Qgc3RhZ2VkRGlyID0gYXdhaXQgc3RhZ2VBaVRvb2xzKFxuICAgICAgc291cmNlT3B0aW9ucyxcbiAgICAgIGpvaW4oc3RhZ2luZ1Jvb3QsIGBhaXRvb2xzLSR7aGFzaC5pZCgpfWApLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIGNvbnN0IHN0YWdlZCA9IGF3YWl0IGNvbGxlY3RTa2lsbERpcnMoc3RhZ2VkRGlyKTtcbiAgICBpZiAoc3RhZ2VkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgIH1cbiAgICBjb25zdCBwb2xpY3kgPSBjYWNoZVBvbGljeShzb3VyY2VPcHRpb25zKTtcbiAgICByZXR1cm4ge1xuICAgICAgZmlsZXM6IGF3YWl0IHNlcmlhbGl6ZVNraWxsRGlycyhzdGFnZWQpLFxuICAgICAgcmVjb3JkOiB7XG4gICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgIGRvd25sb2FkZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICBza2lsbHM6IHN0YWdlZC5tYXAoKGRpcikgPT4gZGlyLm5hbWUpLFxuICAgICAgICAuLi4ocG9saWN5ID8geyBwb2xpY3kgfSA6IHt9KSxcbiAgICAgIH0sXG4gICAgfTtcbiAgfTtcbiAgY29uc3QgdHJlZSA9XG4gICAgdHRsIDw9IDBcbiAgICAgID8gYXdhaXQgbG9hZCgpXG4gICAgICA6IGF3YWl0IGdldE9yU2V0KGFpVG9vbHNDYWNoZSwga2V5LCBsb2FkLCB7XG4gICAgICAgICAgdHRsLFxuICAgICAgICAgIHRocm93RXJyb3JzOiB0cnVlLFxuICAgICAgICB9KTtcbiAgaWYgKCF0cmVlKSB0aHJvdyBuZXcgRXJyb3IoYEFJIFRvb2xzIGNhY2hlIHJldHVybmVkIG5vIHRyZWUgZm9yICR7a2V5fWApO1xuICBhd2FpdCBmbHVzaENhY2hlKGFpVG9vbHNDYWNoZSk7XG4gIHJldHVybiB7IC4uLnRyZWUsIGNhY2hlZDogIWxvYWRlZCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBzZXJpYWxpemVTa2lsbERpcnMoZGlyczogcmVhZG9ubHkgU3RhZ2VkU2tpbGxEaXJbXSk6IFByb21pc2U8Q2FjaGVkU2tpbGxGaWxlW10+IHtcbiAgY29uc3QgZmlsZXM6IENhY2hlZFNraWxsRmlsZVtdID0gW107XG4gIGZvciAoY29uc3QgZGlyIG9mIGRpcnMpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHJlbGF0aXZlIG9mIGZpbmQuZmluZEZpbGVzKFwiKiovKlwiLCB7XG4gICAgICBjd2Q6IGRpci5hYnNvbHV0ZVBhdGgsXG4gICAgICBub2RpcjogdHJ1ZSxcbiAgICB9KSkge1xuICAgICAgZmlsZXMucHVzaCh7XG4gICAgICAgIHBhdGg6IHBvc2l4LmpvaW4oZGlyLm5hbWUsIHJlbGF0aXZlLnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpLFxuICAgICAgICBjb250ZW50OiAoYXdhaXQgcmVhZEZpbGUoam9pbihkaXIuYWJzb2x1dGVQYXRoLCByZWxhdGl2ZSkpKS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIG1lbW9yeVNraWxsVHJlZShcbiAgZmlsZXM6IHJlYWRvbmx5IENhY2hlZFNraWxsRmlsZVtdLFxuICBpZDogc3RyaW5nLFxuKTogUHJvbWlzZTxNZW1vcnlGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IGZpbGVzeXN0ZW0gPSBuZXcgTWVtb3J5RmlsZVN5c3RlbSh7IGlkLCByb290OiBcIi9cIiB9KTtcbiAgYXdhaXQgZmlsZXN5c3RlbS5pbml0KCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykge1xuICAgIGF3YWl0IGZpbGVzeXN0ZW0ud3JpdGVGaWxlKGZpbGUucGF0aCwgQnVmZmVyLmZyb20oZmlsZS5jb250ZW50LCBcImJhc2U2NFwiKSwge1xuICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBmaWxlc3lzdGVtO1xufVxuXG4vKiogRmFpbCBiZWZvcmUgd29ya3NwYWNlIGNvbXBvc2l0aW9uIHdoZW4gdHdvIHNvdXJjZXMgY2xhaW0gb25lIHZpcnR1YWwgbW91bnQuICovXG5mdW5jdGlvbiBhc3NlcnRVbmlxdWVMb2NhbFNraWxsTW91bnRzKG1vdW50czogcmVhZG9ubHkgTG9jYWxTa2lsbE1vdW50W10pOiB2b2lkIHtcbiAgY29uc3Qgcm9vdHNCeU1vdW50ID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBtb3VudCBvZiBtb3VudHMpIHtcbiAgICBjb25zdCBpZGVudGl0eSA9IFwicm9vdFwiIGluIG1vdW50ID8gbW91bnQucm9vdCA6IG1vdW50LmZpbGVzeXN0ZW0uaWQ7XG4gICAgY29uc3QgcHJldmlvdXNSb290ID0gcm9vdHNCeU1vdW50LmdldChtb3VudC5tb3VudFBhdGgpO1xuICAgIGlmIChwcmV2aW91c1Jvb3QgJiYgcHJldmlvdXNSb290ICE9PSBpZGVudGl0eSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgbXVsdGlwbGUgcmVtb3RlIHNraWxsIHNvdXJjZXMgcmVzb2x2ZSB0byB2aXJ0dWFsIG1vdW50IFwiJHttb3VudC5tb3VudFBhdGh9XCI7IGdpdmUgZWFjaCBzb3VyY2UgYSB1bmlxdWUgbmFtZWAsXG4gICAgICApO1xuICAgIH1cbiAgICByb290c0J5TW91bnQuc2V0KG1vdW50Lm1vdW50UGF0aCwgaWRlbnRpdHkpO1xuICB9XG59XG5cbi8qKiBSZW1vdmUgZGlyZWN0b3JpZXMgZHJvcHBlZCBieSBvbmUgc291cmNlIHVubGVzcyBhbm90aGVyIHNvdXJjZSBzdGlsbCBvd25zIHRoZW0uICovXG5hc3luYyBmdW5jdGlvbiByZW1vdmVEZWxldGVkU2tpbGxzKFxuICBkZXN0aW5hdGlvbjogRmlsZVN5c3RlbSxcbiAga2V5OiBzdHJpbmcsXG4gIG1ldGFkYXRhOiBSZW1vdGVTa2lsbHNNZXRhZGF0YSB8IHVuZGVmaW5lZCxcbiAgbmV4dFNraWxsczogcmVhZG9ubHkgc3RyaW5nW10sXG4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcHJldmlvdXMgPSBtZXRhZGF0YT8uc291cmNlc1trZXldPy5za2lsbHMgPz8gW107XG4gIGNvbnN0IHJldGFpbmVkID0gbmV3IFNldChuZXh0U2tpbGxzKTtcbiAgZm9yIChjb25zdCBbc291cmNlS2V5LCBlbnRyeV0gb2YgT2JqZWN0LmVudHJpZXMobWV0YWRhdGE/LnNvdXJjZXMgPz8ge30pKSB7XG4gICAgaWYgKHNvdXJjZUtleSA9PT0ga2V5KSBjb250aW51ZTtcbiAgICBmb3IgKGNvbnN0IHNraWxsIG9mIGVudHJ5LnNraWxscykgcmV0YWluZWQuYWRkKHNraWxsKTtcbiAgfVxuICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICBwcmV2aW91c1xuICAgICAgLmZpbHRlcigoc2tpbGwpID0+ICFyZXRhaW5lZC5oYXMoc2tpbGwpKVxuICAgICAgLm1hcCgoc2tpbGwpID0+IGRlc3RpbmF0aW9uLnJtZGlyKHNraWxsLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSkpLFxuICApO1xufVxuXG4vKiogUHJvYmUgZmlsZSB7QGxpbmsgb3BlbldyaXRhYmxlV29ya3NwYWNlfSB3cml0ZXMgYW5kIHJlbW92ZXMuICovXG5jb25zdCBXUklURV9QUk9CRV9GSUxFID0gXCIuZGJ4LXRvb2xzLXdyaXRlLXByb2JlXCI7XG5cbi8qKlxuICogT3BlbiB0aGUgRGF0YWJyaWNrcyBza2lsbHMgZGVzdGluYXRpb24sIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhpcyBpZGVudGl0eVxuICogY2Fubm90IHdyaXRlIHRoZXJlLlxuICpcbiAqIFRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIChgL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc2ApIGlzIGNvbW1vbmx5XG4gKiBhZG1pbnMtb25seSwgYW5kIGFuIGFwcCBzZXJ2aWNlIHByaW5jaXBhbCBpcyBub3QgYW4gYWRtaW4gLSBzbyBhIERhdGFicmlja3NcbiAqIEFwcCB3cml0aW5nIHRoZXJlIGZhaWxzIHdpdGggYFJFU09VUkNFX0RPRVNfTk9UX0VYSVNUYCwgd2hpY2ggaXMgaG93IHRoZVxuICogd29ya3NwYWNlIEFQSSByZXBvcnRzIGEgcGF0aCB0aGUgY2FsbGVyIGlzIG5vdCBhbGxvd2VkIHRvIHNlZS4gVGhhdCBpcyBhIGZhY3RcbiAqIGFib3V0IFdIRVJFIHRoZSB0cmVlIGlzIHN0b3JlZCwgbm90IGFib3V0IHdoZXRoZXIgdGhlIHNraWxscyBhcmUgdXNhYmxlLCBzbyBpdFxuICogZGVncmFkZXMgdG8gdGhlIGxvY2FsIHRyZWUgKGhhbmRlZCB0byBNYXN0cmEgYXMgYW4gZXh0cmEgc2NhbiBwYXRoKSByYXRoZXJcbiAqIHRoYW4gdGFraW5nIGFwcCBzdGFydHVwIGRvd24gb3ZlciBib29ra2VlcGluZyBsb2NhdGlvbi5cbiAqXG4gKiBUaGUgcHJvYmUgaXMgYSByZWFsIHdyaXRlOiBgbWtkaXJzYCBzdWNjZWVkcyBvbiBhbiBleGlzdGluZyBkaXJlY3RvcnkgZXZlbiBmb3JcbiAqIGFuIGlkZW50aXR5IHRoYXQgY2Fubm90IHdyaXRlIGludG8gaXQsIHNvIGluaXQgYWxvbmUgcHJvdmVzIG5vdGhpbmcuIFJlbW92aW5nXG4gKiB0aGUgcHJvYmUgZmlsZSBpcyBiZXN0LWVmZm9ydCAtIGEgZmFpbGVkIGNsZWFudXAgbXVzdCBub3QgZGVjaWRlIHdyaXRhYmlsaXR5LlxuICovXG5hc3luYyBmdW5jdGlvbiBvcGVuV3JpdGFibGVXb3Jrc3BhY2UoXG4gIGJhc2VQYXRoOiBzdHJpbmcsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50LFxuKTogUHJvbWlzZTxEYXRhYnJpY2tzRmlsZVN5c3RlbSB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCBmcyA9IG5ldyBEYXRhYnJpY2tzRmlsZVN5c3RlbSh7XG4gICAgY2xpZW50OiB3b3Jrc3BhY2VDbGllbnQudG9MZWdhY3lXb3Jrc3BhY2VDbGllbnQoY2xpZW50KSxcbiAgICByb290OiBiYXNlUGF0aCxcbiAgICByZWFkT25seTogZmFsc2UsXG4gICAgY3JlYXRlUm9vdDogdHJ1ZSxcbiAgfSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgZnMuaW5pdCgpO1xuICAgIGF3YWl0IGZzLndyaXRlRmlsZShXUklURV9QUk9CRV9GSUxFLCBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsb2dnZXIud2FybihcImRlc3RpbmF0aW9uOnVud3JpdGFibGVcIiwge1xuICAgICAgZGVzdGluYXRpb246IGJhc2VQYXRoLFxuICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgYXdhaXQgZnMuZGVsZXRlRmlsZShXUklURV9QUk9CRV9GSUxFLCB7IGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gIHJldHVybiBmcztcbn1cblxuLyoqIFJlc29sdmUgdGhlIERhdGFicmlja3MgQXNzaXN0YW50IHNraWxscyBkZXN0aW5hdGlvbiwgb3IgYHVuZGVmaW5lZGAgZm9yIGxvY2FsIHRlbXAuICovXG5mdW5jdGlvbiByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuICBjbGllbnQ6IFdvcmtzcGFjZUNsaWVudExpa2UgfCB1bmRlZmluZWQsXG4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBpZiAoIWNsaWVudCkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgaWYgKG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoKSByZXR1cm4gc3RyaW5nVXRpbHMudHJpbVRvVW5kZWZpbmVkKG9wdGlvbnMuZGF0YWJyaWNrc0Jhc2VQYXRoKTtcbiAgY29uc3QgZW1haWwgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKG9wdGlvbnMudXNlckVtYWlsKTtcbiAgLy8gQSBuYW1lZCB1c2VyIHRhcmdldHMgdGhlaXIgcGVyc29uYWwgQXNzaXN0YW50IHRyZWUgKHRoZSBcInNhdmUgYSBza2lsbFwiXG4gIC8vIHRhcmdldCk7IG90aGVyd2lzZSB0aGUgc2hhcmVkIHdvcmtzcGFjZSBBc3Npc3RhbnQgdHJlZSwgd2hpY2ggdGhlIGJ1aWx0LWluXG4gIC8vIEFzc2lzdGFudC1za2lsbHMgbW91bnQgYWxyZWFkeSBzY2Fucy5cbiAgcmV0dXJuIGVtYWlsID8gcGVyc29uYWxTa2lsbHNQYXRoKGVtYWlsKSA6IE9SR0FOSVpBVElPTl9TS0lMTFNfUEFUSDtcbn1cblxuLyoqXG4gKiBTdGFnZSBvbmUgc291cmNlIGludG8gYSBmcmVzaCBkaXIgdW5kZXIgYHN0YWdpbmdSb290YCwgcHJlZmVycmluZyB0aGUgb3B0aW9uYWxcbiAqIGBza2lsbHNgIENMSSBhbmQgZmFsbGluZyBiYWNrIHRvIGEgZGlyZWN0IGZldGNoLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVNvdXJjZShcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgc3RhZ2luZ1Jvb3Q6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHRhcmdldCA9IGpvaW4oc3RhZ2luZ1Jvb3QsIGBzcmMtJHtoYXNoLmlkKCl9YCk7XG4gIGF3YWl0IG1rZGlyKHRhcmdldCwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIC8vIEFJIFRvb2xzIHJlc29sdmVzIGZyb20gYSBrbm93biByZXBvIGxheW91dCwgc28gaXQgbmV2ZXIgbmVlZHMgdGhlIENMSS5cbiAgaWYgKGlzQWlUb29sc1NvdXJjZShzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHJldHVybiBzdGFnZUFpVG9vbHMoc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbiAgY29uc3QgdmlhQ2xpID0gYXdhaXQgc3RhZ2VWaWFTa2lsbHNDbGkoc291cmNlT3B0aW9ucywgdGFyZ2V0KTtcbiAgaWYgKHZpYUNsaSkgcmV0dXJuIHZpYUNsaTtcbiAgcmV0dXJuIHN0YWdlVmlhRmV0Y2goc291cmNlT3B0aW9ucywgdGFyZ2V0LCBvcHRpb25zKTtcbn1cblxuLyoqXG4gKiBNYXRlcmlhbGl6ZSB0aGUgRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbHMgaW50byBgdGFyZ2V0YC5cbiAqXG4gKiBSZWFkcyB0aGUgcmVwbydzIG93biBnZW5lcmF0ZWQgYG1hbmlmZXN0Lmpzb25gICh3aGljaCBuYW1lcyBlYWNoIHNraWxsJ3NcbiAqIGZpbGVzIGFuZCB3aGV0aGVyIGl0IGxpdmVzIHVuZGVyIGBza2lsbHMvYCBvciBgZXhwZXJpbWVudGFsL2ApIGFuZCBkb3dubG9hZHNcbiAqIHRoZW0gLSB0aGUgc2FtZSB0aGluZyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGxgIGRvZXMsIG1pbnVzIHRoZSBDTEkgYW5kXG4gKiBtaW51cyBhbnkgRGF0YWJyaWNrcyBhdXRoLCBzaW5jZSB0aGUgcmVwbyBpcyBwdWJsaWMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlQWlUb29scyhcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBtYXhCeXRlcyA9IHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKTtcbiAgY29uc3QgcmVmID0gc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPz8gQUlUT09MU19SRUY7XG4gIGNvbnN0IG1hbmlmZXN0ID0ganNvbi5wYXJzZShcbiAgICAoYXdhaXQgZG93bmxvYWQoYWlUb29sc1Jhd1VybChyZWYsIFwibWFuaWZlc3QuanNvblwiKSwgbWF4Qnl0ZXMpKS50b1N0cmluZyhcInV0ZjhcIiksXG4gICAgdW5kZWZpbmVkLFxuICApIGFzIEFpVG9vbHNNYW5pZmVzdCB8IHVuZGVmaW5lZDtcblxuICBjb25zdCB3YW50ZWQgPSBuZXcgU2V0KHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykpO1xuICBjb25zdCBzZWxlY3RlZCA9IE9iamVjdC5lbnRyaWVzKG1hbmlmZXN0Py5za2lsbHMgPz8ge30pLmZpbHRlcigoW25hbWUsIGVudHJ5XSkgPT5cbiAgICB3YW50ZWQuc2l6ZSA+IDBcbiAgICAgID8gd2FudGVkLmhhcyhuYW1lKVxuICAgICAgOiBlbnRyeS5yZXBvX2RpciAhPT0gXCJleHBlcmltZW50YWxcIiB8fCBzb3VyY2VPcHRpb25zLmV4cGVyaW1lbnRhbCA9PT0gdHJ1ZSxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgbm8gbWF0Y2hpbmcgc2tpbGxzIGluICR7QUlUT09MU19SRVBPfUAke3JlZn1gKTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVzID0gc2VsZWN0ZWQuZmxhdE1hcCgoW25hbWUsIGVudHJ5XSkgPT5cbiAgICAoZW50cnkuZmlsZXMgPz8gW10pLm1hcCgoZmlsZSkgPT4gKHtcbiAgICAgIHVybDogYWlUb29sc1Jhd1VybChyZWYsIGAke2VudHJ5LnJlcG9fZGlyID8/IFwic2tpbGxzXCJ9LyR7bmFtZX0vJHtmaWxlfWApLFxuICAgICAgcGF0aDogam9pbih0YXJnZXQsIG5hbWUsIC4uLmZpbGUuc3BsaXQoXCIvXCIpKSxcbiAgICB9KSksXG4gICk7XG4gIGF3YWl0IGFzeW5jVXRpbHMubWFwQ29uY3VycmVudChcbiAgICBmaWxlcyxcbiAgICBhc3luYyAoaXRlbSkgPT4ge1xuICAgICAgY29uc3QgYm9keSA9IGF3YWl0IGRvd25sb2FkKGl0ZW0udXJsLCBtYXhCeXRlcyk7XG4gICAgICBhd2FpdCBta2RpcihkaXJuYW1lKGl0ZW0ucGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGl0ZW0ucGF0aCwgYm9keSk7XG4gICAgfSxcbiAgICB7IGNvbmN1cnJlbmN5OiBBSVRPT0xTX0NPTkNVUlJFTkNZIH0sXG4gICk7XG5cbiAgbG9nZ2VyLmRlYnVnKFwiYWl0b29sczpzdGFnZWRcIiwgeyByZWYsIHNraWxsczogc2VsZWN0ZWQubGVuZ3RoLCBmaWxlczogZmlsZXMubGVuZ3RoIH0pO1xuICByZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiogUmF3LWNvbnRlbnQgVVJMIGZvciBhIHBhdGggaW4gdGhlIEFJIFRvb2xzIHJlcG8gYXQgYHJlZmAuICovXG5mdW5jdGlvbiBhaVRvb2xzUmF3VXJsKHJlZjogc3RyaW5nLCBwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS8ke0FJVE9PTFNfUkVQT30vJHtyZWZ9LyR7cGF0aH1gO1xufVxuXG4vKipcbiAqIENvcHkgYSBzb3VyY2UgaW50byBgdGFyZ2V0YCB3aXRoIHRoZSBgc2tpbGxzYCBDTEkgd2hlbiBpdCBpcyBpbnN0YWxsZWQuXG4gKiBSZXR1cm5zIHRoZSBkaXIgaG9sZGluZyB0aGUgY29waWVkIGBTS0lMTC5tZGAgdHJlZXMsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlXG4gKiBDTEkgaXMgYWJzZW50IChzbyB0aGUgY2FsbGVyIGNhbiBmYWxsIGJhY2sgdG8gYSBmZXRjaCkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlVmlhU2tpbGxzQ2xpKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICB0YXJnZXQ6IHN0cmluZyxcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGNsaSA9IGF3YWl0IHJlc29sdmVTa2lsbHNDbGkoKTtcbiAgaWYgKCFjbGkpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3QgYXJncyA9IFtcbiAgICAuLi5jbGkuYXJncyxcbiAgICBcImFkZFwiLFxuICAgIHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgIFwiLS1hZ2VudFwiLFxuICAgIFNLSUxMU19DTElfQUdFTlQsXG4gICAgXCItLWNvcHlcIixcbiAgICBcIi15XCIsXG4gIF07XG4gIGZvciAoY29uc3Qgc2tpbGwgb2Ygc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSkge1xuICAgIGFyZ3MucHVzaChcIi0tc2tpbGxcIiwgc2tpbGwpO1xuICB9XG4gIGlmIChzdHJpbmdVdGlscy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpLmxlbmd0aCA9PT0gMCkgYXJncy5wdXNoKFwiLS1za2lsbFwiLCBcIipcIik7XG5cbiAgY29uc3QgcmVzdWx0ID0gYXdhaXQgZXhlYy5zcGF3bihjbGkuY29tbWFuZCwgYXJncywge1xuICAgIGN3ZDogdGFyZ2V0LFxuICAgIHN0ZG91dDogXCJjYXB0dXJlXCIsXG4gICAgc3RkZXJyOiBcImNhcHR1cmVcIixcbiAgICBjaGVjazogZmFsc2UsXG4gIH0pO1xuICBpZiAocmVzdWx0LmV4aXRDb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNraWxscyBDTEkgZmFpbGVkIChleGl0ICR7cmVzdWx0LmV4aXRDb2RlfSk6ICR7cmVzdWx0LnN0ZGVyciB8fCByZXN1bHQuc3Rkb3V0fWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gam9pbih0YXJnZXQsIC4uLlNLSUxMU19DTElfTEFZT1VUKTtcbn1cblxuLyoqXG4gKiBMb2NhdGUgdGhlIG9wdGlvbmFsIGBza2lsbHNgIENMSSBiaW4sIHJlc29sdmVkIGZyb20gVEhJUyBwYWNrYWdlJ3MgbW9kdWxlXG4gKiBncmFwaC4gUmV0dXJucyBgdW5kZWZpbmVkYCB3aGVuIHRoZSBwZWVyIGRlcCBpc24ndCBpbnN0YWxsZWQsIHNvIHRoZSBjYWxsZXJcbiAqIGZhbGxzIGJhY2sgdG8gYSBkaXJlY3QgZmV0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTa2lsbHNDbGkoKTogUHJvbWlzZTx7IGNvbW1hbmQ6IHN0cmluZzsgYXJnczogc3RyaW5nW10gfSB8IHVuZGVmaW5lZD4ge1xuICB0cnkge1xuICAgIGNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG4gICAgY29uc3QgcGtnUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShcInNraWxscy9wYWNrYWdlLmpzb25cIik7XG4gICAgY29uc3QgYmluID0gam9pbihwa2dQYXRoLCBcIi4uXCIsIFwiYmluXCIsIFwiY2xpLm1qc1wiKTtcbiAgICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhiaW4pKSByZXR1cm4geyBjb21tYW5kOiBwcm9jZXNzLmV4ZWNQYXRoLCBhcmdzOiBbYmluXSB9O1xuICB9IGNhdGNoIHtcbiAgICAvLyBwZWVyIGRlcCBhYnNlbnQgb3IgdW5yZXNvbHZhYmxlIC0gZmV0Y2ggZmFsbGJhY2sgaGFuZGxlcyBpdFxuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogRmV0Y2ggYSBzb3VyY2UgVVJMIGFuZCB3cml0ZSB0aGUgZG93bmxvYWRlZCBgU0tJTEwubWRgIHVuZGVyIGB0YXJnZXRgLlxuICogVXNlZCB3aGVuIHRoZSBgc2tpbGxzYCBDTEkgaXNuJ3QgaW5zdGFsbGVkOyBzdXBwb3J0cyBhIGRpcmVjdCBgU0tJTEwubWRgIFVSTC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VWaWFGZXRjaChcbiAgc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSxcbiAgdGFyZ2V0OiBzdHJpbmcsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcihzb3VyY2VPcHRpb25zLnNvdXJjZSk7XG4gIGlmICghdXJsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCIgaXMgbm90IGEgVVJMIGFuZCB0aGUgb3B0aW9uYWwgXCJza2lsbHNcIiBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWRgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYnVmZmVyID0gYXdhaXQgZG93bmxvYWQodXJsLnRvU3RyaW5nKCksIHJlc29sdmVNYXhCeXRlcyhzb3VyY2VPcHRpb25zLCBvcHRpb25zKSk7XG4gIGNvbnN0IG5hbWUgPSBzdHJpbmdVdGlscy50b1NsdWcoZGVyaXZlU2tpbGxOYW1lKHVybC50b1N0cmluZygpKSkgfHwgXCJyZW1vdGUtc2tpbGxcIjtcbiAgY29uc3Qgc2tpbGxEaXIgPSBqb2luKHRhcmdldCwgbmFtZSk7XG4gIGF3YWl0IG1rZGlyKHNraWxsRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgd3JpdGVGaWxlKGpvaW4oc2tpbGxEaXIsIFwiU0tJTEwubWRcIiksIGJ1ZmZlcik7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKiBUaGUgZWZmZWN0aXZlIGRvd25sb2FkIGNlaWxpbmc6IHBlci1zb3VyY2UsIHRoZW4gdG9wLWxldmVsLCB0aGVuIHRoZSBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZU1heEJ5dGVzKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogbnVtYmVyIHtcbiAgcmV0dXJuIHNvdXJjZU9wdGlvbnMubWF4RG93bmxvYWRCeXRlcyA/PyBvcHRpb25zLm1heERvd25sb2FkQnl0ZXMgPz8gREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVM7XG59XG5cbi8qKiBHRVQgYSBVUkwsIGZhaWxpbmcgbG91ZGx5IG9uIGEgbm9uLTJ4eCBzdGF0dXMgb3IgYW4gb3ZlcnNpemVkIGJvZHkuICovXG5hc3luYyBmdW5jdGlvbiBkb3dubG9hZCh1cmw6IHN0cmluZywgbWF4Qnl0ZXM6IG51bWJlcik6IFByb21pc2U8QnVmZmVyPiB7XG4gIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2godXJsLCB7XG4gICAgc2lnbmFsOiBBYm9ydFNpZ25hbC50aW1lb3V0KERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyksXG4gIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGZhaWxlZCAoJHt1cmx9KTogJHtlcnJvclV0aWxzLmVycm9yTWVzc2FnZShlcnIpfWAsIHtcbiAgICAgIGNhdXNlOiBlcnJvclV0aWxzLnRvRXJyb3IoZXJyKSxcbiAgICB9KTtcbiAgfSk7XG4gIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGZhaWxlZDogJHtyZXNwb25zZS5zdGF0dXN9ICR7cmVzcG9uc2Uuc3RhdHVzVGV4dH0gKCR7dXJsfSlgKTtcbiAgfVxuICBjb25zdCBidWZmZXIgPSBCdWZmZXIuZnJvbShhd2FpdCByZXNwb25zZS5hcnJheUJ1ZmZlcigpKTtcbiAgaWYgKGJ1ZmZlci5ieXRlTGVuZ3RoID4gbWF4Qnl0ZXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRvd25sb2FkIGV4Y2VlZHMgJHttYXhCeXRlc30gYnl0ZXMgKCR7dXJsfSlgKTtcbiAgfVxuICByZXR1cm4gYnVmZmVyO1xufVxuXG4vKiogRGVyaXZlIGEgc2tpbGwgZGlyZWN0b3J5IG5hbWUgZnJvbSBhIGRvd25sb2FkIFVSTCdzIGxhc3QgcGF0aCBzZWdtZW50LiAqL1xuZnVuY3Rpb24gZGVyaXZlU2tpbGxOYW1lKHVybFN0cmluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIodXJsU3RyaW5nKTtcbiAgY29uc3QgbGFzdCA9IHVybD8ucGF0aG5hbWUuc3BsaXQoXCIvXCIpLmZpbHRlcihCb29sZWFuKS5wb3AoKSA/PyBcIlwiO1xuICByZXR1cm4gbGFzdC5yZXBsYWNlKC9cXC4obWR8emlwfHRhcnx0Z3p8Z3opJC9pLCBcIlwiKTtcbn1cblxuLyoqIEEgc2tpbGwgZGlyZWN0b3J5IChob2xkaW5nIGEgYFNLSUxMLm1kYCkgc3RhZ2VkIG9uIGxvY2FsIGRpc2suICovXG5pbnRlcmZhY2UgU3RhZ2VkU2tpbGxEaXIge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFic29sdXRlUGF0aDogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbGxlY3QgZXZlcnkgc2tpbGwgZGlyZWN0b3J5IHVuZGVyIGByb290YDogYSBgcm9vdC9TS0lMTC5tZGAgKHJvb3QgSVMgdGhlXG4gKiBza2lsbCkgb3IgZWFjaCBpbW1lZGlhdGUgY2hpbGQgZGlyIHRoYXQgY29udGFpbnMgYSBgU0tJTEwubWRgLlxuICovXG5hc3luYyBmdW5jdGlvbiBjb2xsZWN0U2tpbGxEaXJzKHJvb3Q6IHN0cmluZyk6IFByb21pc2U8U3RhZ2VkU2tpbGxEaXJbXT4ge1xuICBpZiAoIShhd2FpdCBwYXRoRXhpc3RzKHJvb3QpKSkgcmV0dXJuIFtdO1xuICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhqb2luKHJvb3QsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgY29uc3QgbmFtZSA9IHBvc2l4LmJhc2VuYW1lKHJvb3Quc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgcmV0dXJuIFt7IG5hbWUsIGFic29sdXRlUGF0aDogcm9vdCB9XTtcbiAgfVxuICBjb25zdCBkaXJzOiBTdGFnZWRTa2lsbERpcltdID0gW107XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgcmVhZGRpcihyb290LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSkpIHtcbiAgICBpZiAoIWVudHJ5LmlzRGlyZWN0b3J5KCkpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRpciA9IGpvaW4ocm9vdCwgZW50cnkubmFtZSk7XG4gICAgaWYgKGF3YWl0IHBhdGhFeGlzdHMoam9pbihkaXIsIFwiU0tJTEwubWRcIikpKSB7XG4gICAgICBkaXJzLnB1c2goeyBuYW1lOiBlbnRyeS5uYW1lLCBhYnNvbHV0ZVBhdGg6IGRpciB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpcnM7XG59XG5cbi8qKlxuICogQ29weSBldmVyeSBzdGFnZWQgc2tpbGwgZGlyZWN0b3J5IGludG8ge0BsaW5rIGRlc3RpbmF0aW9ufSwgcHJlc2VydmluZyB0aGVcbiAqIGA8c2tpbGw+LzxyZWxhdGl2ZT5gIGxheW91dC4gVGhlIGRlc3RpbmF0aW9uIGlzIGp1c3QgYSB7QGxpbmsgRmlsZVN5c3RlbX0sXG4gKiBzbyB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgdHJlZSBhbmQgdGhlIGxvY2FsIGZhbGxiYWNrIHNoYXJlIG9uZSBjb3BpZXIuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvcHlTa2lsbERpcnMoZGVzdGluYXRpb246IEZpbGVTeXN0ZW0sIGRpcnM6IFN0YWdlZFNraWxsRGlyW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgYXdhaXQgZGVzdGluYXRpb24uaW5pdCgpO1xuICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCByZWxhdGl2ZSBvZiBmaW5kLmZpbmRGaWxlcyhcIioqLypcIiwge1xuICAgICAgY3dkOiBkaXIuYWJzb2x1dGVQYXRoLFxuICAgICAgbm9kaXI6IHRydWUsXG4gICAgfSkpIHtcbiAgICAgIGNvbnN0IGJ1ZmZlciA9IGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlyLmFic29sdXRlUGF0aCwgcmVsYXRpdmUpKTtcbiAgICAgIGNvbnN0IHNraWxsUGF0aCA9IHBvc2l4LmpvaW4oZGlyLm5hbWUsIHJlbGF0aXZlLnNwbGl0KC9bXFxcXC9dLykuam9pbihcIi9cIikpO1xuICAgICAgYXdhaXQgZGVzdGluYXRpb24ud3JpdGVGaWxlKHNraWxsUGF0aCwgYnVmZmVyLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDb3B5IHN0YWdlZCBza2lsbCBkaXJzIGludG8gYSBTVEFCTEUgbG9jYWwgdHJlZSBrZXllZCBieSB0aGUgc291cmNlLCBhbmRcbiAqIHJldHVybiBpdHMgcm9vdCBwYXRoLlxuICpcbiAqIEEgZ2l2ZW4gc291cmNlIHJlc29sdmVzIHRvIHRoZSBzYW1lIGNvbnRlbnQgb24gYWxtb3N0IGV2ZXJ5IGJvb3QsIHNvIGVhY2hcbiAqIG9uZSBvd25zIGEgZGlyZWN0b3J5IG5hbWVkIGZvciBpdHMge0BsaW5rIGNhY2hlS2V5fSByYXRoZXIgdGhhbiBsZWF2aW5nIGFcbiAqIGZyZXNoIHNjcmF0Y2ggZGlyIGJlaGluZCBwZXIgcmVzdGFydC4gS2V5aW5nIG9uIHRoZSBzb3VyY2UgYW5kIGl0cyBwb2xpY3lcbiAqIChub3QgdGhlIGNvbnRlbnQpIGlzIHdoYXQga2VlcHMgdHdvIGRpZmZlcmVudCBzb3VyY2VzIGZyb20gb3ZlcndyaXRpbmcgZWFjaFxuICogb3RoZXIuXG4gKlxuICogVGhlIG1ldGFkYXRhIGlzIHdyaXR0ZW4gSU5TSURFIHRoZSByZWJ1aWxkIHJhdGhlciB0aGFuIGFmdGVyIGl0OiBgcmVidWlsZEZTYFxuICogcmVwbGFjZXMgdGhlIHN0YWJsZSByb290IHdob2xlc2FsZSwgc28gYW55dGhpbmcgd3JpdHRlbiBhZnRlcndhcmRzIHdvdWxkXG4gKiBzdXJ2aXZlIG9ubHkgdW50aWwgdGhlIG5leHQgcmVmcmVzaCwgYW5kIGFueXRoaW5nIHdyaXR0ZW4gYmVmb3JlIHdvdWxkIGJlXG4gKiB0aHJvd24gYXdheSBieSB0aGUgc3dhcC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcGVyc2lzdExvY2FsbHkoXG4gIGtleTogc3RyaW5nLFxuICBkaXJzOiBTdGFnZWRTa2lsbERpcltdLFxuICByZWNvcmQ6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHN0YWJsZSA9IGF3YWl0IGxvY2FsRlMucmVidWlsZEZTKGAke0xPQ0FMX1NLSUxMU19ESVJ9LyR7a2V5fWAsIGFzeW5jIChzY3JhdGNoKSA9PiB7XG4gICAgYXdhaXQgY29weVNraWxsRGlycyhzY3JhdGNoLCBkaXJzKTtcbiAgICBhd2FpdCB3cml0ZU1ldGFkYXRhKHNjcmF0Y2gsIGtleSwgcmVjb3JkKTtcbiAgfSk7XG4gIHJldHVybiBzdGFibGUucm9vdDtcbn1cblxuLyoqXG4gKiBBIHNjcmF0Y2ggZmlsZXN5c3RlbSB3aG9zZSByb290IGV4aXN0cyBvbiBkaXNrLCBmb3IgdGhlIHBhdGhzIHRoYXQgaGFuZCBhXG4gKiByZWFsIGRpcmVjdG9yeSB0byBgbm9kZTpmc2Agb3IgYSBjaGlsZCBwcm9jZXNzIHJhdGhlciB0aGFuIGdvaW5nIHRocm91Z2hcbiAqIHRoZSB7QGxpbmsgRmlsZVN5c3RlbX0gQVBJLlxuICovXG5hc3luYyBmdW5jdGlvbiBpbml0aWFsaXplZFNjcmF0Y2gocHJlZml4OiBzdHJpbmcpOiBQcm9taXNlPExvY2FsRmlsZVN5c3RlbT4ge1xuICBjb25zdCBzY3JhdGNoID0gbG9jYWxGUy5zY3JhdGNoRlMocHJlZml4KTtcbiAgYXdhaXQgc2NyYXRjaC5pbml0KCk7XG4gIHJldHVybiBzY3JhdGNoO1xufVxuXG4vKiogQmVzdC1lZmZvcnQgZXhpc3RlbmNlIGNoZWNrLiAqL1xuYXN5bmMgZnVuY3Rpb24gcGF0aEV4aXN0cyhwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgdHJ5IHtcbiAgICBhd2FpdCBzdGF0KHBhdGgpO1xuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
|
|
784
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlLXNraWxscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZW1vdGUtc2tpbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBRUgsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDakYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFakQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBRTNDLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN2QyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsZUFBZSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDOUUsT0FBTyxFQUFFLE9BQU8sRUFBd0IsTUFBTSxlQUFlLENBQUM7QUFDOUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3ZDLE9BQU8sRUFDTCxVQUFVLEVBQ1YsVUFBVSxFQUNWLElBQUksRUFDSixJQUFJLEVBQ0osR0FBRyxFQUNILEdBQUcsRUFDSCxNQUFNLEVBQ04sV0FBVyxHQUNaLE1BQU0sd0JBQXdCLENBQUM7QUFFaEMsT0FBTyxFQUFFLGdCQUFnQixFQUFtQixNQUFNLHNCQUFzQixDQUFDO0FBRXpFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRWhGLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxN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YztJQUM5QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQ3JCLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsS0FBSyxVQUFVLFVBQVUsQ0FBQyxJQUFZO0lBQ3BDLElBQUksQ0FBQztRQUNILE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUFDLE1BQU0sQ0FBQztRQUNQLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFN0YXJ0dXAgcHJvdmlzaW9uaW5nIG9mIHJlbW90ZSBBZ2VudC1Ta2lsbCBzb3VyY2VzIGZvciBhIE1hc3RyYSB3b3Jrc3BhY2UuXG4gKlxuICogQSB7QGxpbmsgUmVtb3RlU2tpbGxTb3VyY2V9IG5hbWVzIFdIRVJFIGEgYFNLSUxMLm1kYCB0cmVlIGNvbWVzIGZyb20gLSB0aGVcbiAqIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gY29uc3RhbnQsIGEgR2l0SHViIGBvd25lci9yZXBvYCwgYW55IGdpdCAvIEdpdExhYiBVUkwsXG4gKiBvciBhIGRpcmVjdCBkb3dubG9hZCBVUkwgLSBhbmQgb3B0aW9uYWwgcGVyLXNvdXJjZSBwb2xpY3kuXG4gKiB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSBtYXRlcmlhbGl6ZXMgZXZlcnkgc291cmNlIGludG8gYSBsb2NhbFxuICogYFNLSUxMLm1kYCB0cmVlIGF0IGFwcCBib290IGFuZCByZXR1cm5zIHJlYWQtb25seSBmaWxlc3lzdGVtIGJhY2tpbmdzIHBsdXNcbiAqIHRoZWlyIHN0YWJsZSB2aXJ0dWFsIHdvcmtzcGFjZSBtb3VudHMuXG4gKlxuICogUmVzb2x1dGlvbiBwZXIgc291cmNlLCBpbiBvcmRlcjpcbiAqXG4gKiAxLiB0aGUge0BsaW5rIEFJVE9PTFNfU09VUkNFfSBjb25zdGFudCAoYFwiYWl0b29sc1wiYCk6IERhdGFicmlja3MnIG93biBza2lsbFxuICogICAgc2V0LCByZWFkIHN0cmFpZ2h0IGZyb20gdGhlIHB1YmxpYyByZXBvIHRoZSBgZGF0YWJyaWNrcyBhaXRvb2xzYCBDTElcbiAqICAgIHNvdXJjZXMgZnJvbS4gTm8gQ0xJLCBubyBEYXRhYnJpY2tzIGF1dGggLSB3aGljaCBpcyB3aGF0IG1ha2VzIGl0IHVzYWJsZVxuICogICAgaW5zaWRlIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyLCB3aGVyZSB0aGUgQ0xJIGlzIG5vdCBpbnN0YWxsZWQ7XG4gKiAyLiB0aGUgT1BUSU9OQUwgYHNraWxsc2AgbnBtIENMSSAocGVlciBkZXApOiBpZiBpbnN0YWxsZWQsIGVhY2ggc291cmNlIGlzXG4gKiAgICBjb3BpZWQgaW50byBhIHN0YWdpbmcgZGlyIHdpdGggYHNraWxscyBhZGQgPHNvdXJjZT4gLS1hZ2VudCA8ZGlyPiAtLWNvcHlgLFxuICogICAgd2hpY2ggdW5kZXJzdGFuZHMgZXZlcnkgc291cmNlIGZvcm1hdCB0aGUgZWNvc3lzdGVtIGRvZXMgKEdpdEh1YlxuICogICAgc2hvcnRoYW5kLCBnaXQgVVJMcywgYXJjaGl2ZS9kb3dubG9hZCBVUkxzKTtcbiAqIDMuIG90aGVyd2lzZSBhIHBsYWluIHtAbGluayBmZXRjaH0gb2YgdGhlIHNvdXJjZSBVUkwgKGJ1aWx0IHdpdGhcbiAqICAgIHtAbGluayBuZXQudXJsQnVpbGRlcn0pLCB3cml0aW5nIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdG8gYSBzdGFnaW5nXG4gKiAgICBkaXIuXG4gKlxuICogQSBzb3VyY2UgdGhhdCByZXNvbHZlcyB0aHJvdWdoIG5laXRoZXIgcGF0aCBmYWlscyBhcHAgc3RhcnR1cCwgdW5sZXNzIHRoZVxuICogc291cmNlIChvciB0aGUgdG9wLWxldmVsIGNhbGwpIHNldHMgYGZhaWxPbkVycm9yOiBmYWxzZWAsIGluIHdoaWNoIGNhc2UgaXQgaXNcbiAqIGxvZ2dlZCBhbmQgc2tpcHBlZCBzbyBvbmUgYmFkIHNvdXJjZSBuZXZlciB0YWtlcyB0aGUgYXBwIGRvd24uXG4gKlxuICogQUkgVG9vbHMgdXNlcyB0aGUgc2hhcmVkIGBAZGJ4LXRvb2xzL2NhY2hlYCBwcm9qZWN0IGNhY2hlIHdpdGggYSBvbmUtZGF5IFRUTC5cbiAqIEV2ZXJ5IHNvdXJjZSBoeWRyYXRlcyBhIHByb2Nlc3MtbWVtb3J5IGZpbGVzeXN0ZW0gdGhhdCB0aGUgcGx1Z2luIGNvbnZlcnRzIHRvXG4gKiBuYXRpdmUgYWdlbnQtbGV2ZWwgc2tpbGxzOyBwZXJzaXN0ZWQgd29ya3NwYWNlIGNvcGllcyBhcmUgbm90IHVzZWQgZm9yXG4gKiBydW50aW1lIGRpc2NvdmVyeS4gT3RoZXIgc291cmNlcyBrZWVwIGEge0BsaW5rIE1FVEFEQVRBX0ZJTEV9IGJlc2lkZSB0aGVpclxuICogcHJvdmlzaW9uZWQgdHJlZSBhbmQgZGVmYXVsdCB0byBhIHNldmVuLWRheSByZWZyZXNoIHdpbmRvdy5cbiAqXG4gKiBGb3Igbm9uLUFJLVRvb2xzIHNvdXJjZXMsIHRoZSBkZWZhdWx0IGRlc3RpbmF0aW9uIGlzIHRoZSBEYXRhYnJpY2tzIHdvcmtzcGFjZVxuICogQXNzaXN0YW50IHNraWxscyB0cmVlIChgL1dvcmtzcGFjZS8uYXNzaXN0YW50L3NraWxsc2ApLiBQYXNzIGB1c2VyRW1haWxgIG9yXG4gKiBgZGF0YWJyaWNrc0Jhc2VQYXRoYCB0byBzZWxlY3QgYW5vdGhlciBkZXN0aW5hdGlvbi4gV2hlbiBpdCBpcyB1bmF2YWlsYWJsZSxcbiAqIHRoZSB0cmVlIGlzIGV4cG9zZWQgdGhyb3VnaCBhIHN0YWJsZSByZWFkLW9ubHkgbG9jYWwgbW91bnQgaW5zdGVhZC5cbiAqXG4gKiBAbW9kdWxlXG4gKi9cblxuaW1wb3J0IHsgbWtkaXIsIHJlYWRkaXIsIHJlYWRGaWxlLCBybSwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSBcIm5vZGU6ZnMvcHJvbWlzZXNcIjtcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tIFwibm9kZTptb2R1bGVcIjtcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHBvc2l4IH0gZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VDbGllbnQgfSBmcm9tIFwiQGRhdGFicmlja3MvYXBwa2l0XCI7XG5pbXBvcnQgeyBhcHBraXQgfSBmcm9tIFwiQGRieC10b29scy9hcHBraXRcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlQ2xpZW50TGlrZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2FwcGtpdFwiO1xuaW1wb3J0IHsgZmx1c2hDYWNoZSwgZ2V0T3JTZXQsIHByb2plY3RDYWNoZSB9IGZyb20gXCJAZGJ4LXRvb2xzL2NhY2hlL2NhY2hlXCI7XG5pbXBvcnQgeyBleGVjIH0gZnJvbSBcIkBkYngtdG9vbHMvY29yZVwiO1xuaW1wb3J0IHsgRGF0YWJyaWNrc0ZpbGVTeXN0ZW0sIHdvcmtzcGFjZUNsaWVudCB9IGZyb20gXCJAZGJ4LXRvb2xzL2RhdGFicmlja3NcIjtcbmltcG9ydCB7IGxvY2FsRlMsIHR5cGUgTG9jYWxGaWxlU3lzdGVtIH0gZnJvbSBcIkBkYngtdG9vbHMvZnNcIjtcbmltcG9ydCB7IGZpbmQgfSBmcm9tIFwiQGRieC10b29scy9wYXRoXCI7XG5pbXBvcnQge1xuICBhc3luY1V0aWxzLFxuICBlcnJvclV0aWxzLFxuICBoYXNoLFxuICBqc29uLFxuICBsb2csXG4gIG5ldCxcbiAgb2JqZWN0LFxuICBzdHJpbmdVdGlscyxcbn0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB0eXBlIHsgT25lT3JNYW55IH0gZnJvbSBcIkBkYngtdG9vbHMvc2hhcmVkLWNvcmVcIjtcbmltcG9ydCB7IE1lbW9yeUZpbGVTeXN0ZW0sIHR5cGUgRmlsZVN5c3RlbSB9IGZyb20gXCJAZGJ4LXRvb2xzL3NoYXJlZC1mc1wiO1xuXG5pbXBvcnQgeyBPUkdBTklaQVRJT05fU0tJTExTX1BBVEgsIHBlcnNvbmFsU2tpbGxzUGF0aCB9IGZyb20gXCIuL3NraWxsLXBhdGhzLnRzXCI7XG5cbmNvbnN0IGxvZ2dlciA9IGxvZy5sb2dnZXIoXCJtYXN0cmEvcmVtb3RlLXNraWxsc1wiKTtcblxuLyoqXG4gKiBBZ2VudCBpZCB0aGUgYHNraWxsc2AgQ0xJIGluc3RhbGxzIGEgYmFyZSBgU0tJTEwubWRgIHRyZWUgdW5kZXIuXG4gKlxuICogYHVuaXZlcnNhbGAgaXMgdGhlIENMSSdzIG93biBuYW1lIGZvciBcIm5vIHBhcnRpY3VsYXIgYWdlbnQsIGp1c3QgdGhlIHBsYWluXG4gKiB0cmVlXCIsIHdoaWNoIGlzIHdoYXQgdGhpcyBtb2R1bGUgd2FudHMgLSBpdCByZS1ob3N0cyB0aGUgcmVzdWx0IGl0c2VsZi4gVGhlXG4gKiBpZCBtdXN0IGJlIG9uZSB0aGUgaW5zdGFsbGVkIENMSSBrbm93czogYW4gdW5yZWNvZ25pemVkIG9uZSBpcyByZWplY3RlZFxuICogb3V0cmlnaHQgKGBJbnZhbGlkIGFnZW50czogLi4uYCksIHRha2luZyBldmVyeSBub24tYGFpdG9vbHNgIHNvdXJjZSBkb3duIHdpdGhcbiAqIGl0LCBzaW5jZSBhIENMSSBmYWlsdXJlIGlzIGEgaGFyZCBmYWlsdXJlIHJhdGhlciB0aGFuIGEgZmFsbC10aHJvdWdoIHRvXG4gKiB7QGxpbmsgc3RhZ2VWaWFGZXRjaH0uXG4gKi9cbmNvbnN0IFNLSUxMU19DTElfQUdFTlQgPSBcInVuaXZlcnNhbFwiO1xuXG4vKiogV2hlcmUgdGhlIGBza2lsbHNgIENMSSBkcm9wcyBhIHBsYWluIGBTS0lMTC5tZGAgdHJlZSB1bmRlciBhIHRhcmdldCBkaXIuICovXG5jb25zdCBTS0lMTFNfQ0xJX0xBWU9VVCA9IFtcIi5hZ2VudHNcIiwgXCJza2lsbHNcIl0gYXMgY29uc3Q7XG5cbi8qKiBDYXAgb24gYSBkaXJlY3QtZmV0Y2ggZG93bmxvYWQgYm9keSwgbWF0Y2hpbmcgdGhlIGBza2lsbHNgIENMSSBkZWZhdWx0LiAqL1xuY29uc3QgREVGQVVMVF9NQVhfRE9XTkxPQURfQllURVMgPSAxMCAqIDEwMjQgKiAxMDI0O1xuXG4vKiogTWF4aW11bSB0aW1lIG9uZSByZW1vdGUgZmlsZSBkb3dubG9hZCBtYXkgYmxvY2sgc3RhcnR1cC4gKi9cbmNvbnN0IERFRkFVTFRfRE9XTkxPQURfVElNRU9VVF9NUyA9IDYwXzAwMDtcblxuLyoqIFN0YWJsZSB0ZW1wIGRpcmVjdG9yeSBob2xkaW5nIG9uZSByZWJ1aWx0IHNraWxsIHRyZWUgcGVyIHJlbW90ZSBzb3VyY2UuICovXG5jb25zdCBMT0NBTF9TS0lMTFNfRElSID0gXCJtYXN0cmEtbG9jYWwtc2tpbGxzXCI7XG5cbi8qKiBWaXJ0dWFsIHdvcmtzcGFjZSBwYXRoIHJlc2VydmVkIGZvciBsb2NhbGx5IHByb3Zpc2lvbmVkIERhdGFicmlja3MgQUkgVG9vbHMuICovXG5leHBvcnQgY29uc3QgQUlUT09MU19TS0lMTFNfTU9VTlQgPSBcIi8uZGF0YWJyaWNrcy9za2lsbHNcIjtcblxuLyoqIFZpcnR1YWwgd29ya3NwYWNlIHJvb3QgZm9yIGV2ZXJ5IG90aGVyIGxvY2FsbHkgcHJvdmlzaW9uZWQgcmVtb3RlIHNvdXJjZS4gKi9cbmV4cG9ydCBjb25zdCBSRU1PVEVfU0tJTExTX01PVU5UID0gXCIvLnNraWxsc1wiO1xuXG4vKipcbiAqIEJvb2trZWVwaW5nIGZpbGUgd3JpdHRlbiBhdCB0aGUgcm9vdCBvZiBldmVyeSBwcm92aXNpb25lZCBza2lsbCB0cmVlLCBuYW1pbmdcbiAqIHdoZW4gZWFjaCBzb3VyY2Ugd2FzIGxhc3QgZG93bmxvYWRlZC4gQSBkb3RmaWxlIHNvIHRoZSBza2lsbCBzY2FubmVycywgd2hpY2hcbiAqIGxvb2sgZm9yIGA8ZGlyPi9TS0lMTC5tZGAsIG5ldmVyIG1pc3Rha2UgaXQgZm9yIGEgc2tpbGwuXG4gKi9cbmNvbnN0IE1FVEFEQVRBX0ZJTEUgPSBcIi5tZXRhZGF0YS5qc29uXCI7XG5cbi8qKiBTaGFwZSBtYXJrZXIgZm9yIHtAbGluayBNRVRBREFUQV9GSUxFfTsgYW4gdW5rbm93biB2ZXJzaW9uIGlzIGlnbm9yZWQsIG5vdCByZWFkLiAqL1xuY29uc3QgTUVUQURBVEFfVkVSU0lPTiA9IDE7XG5cbi8qKiBIb3cgbG9uZyBhIGdlbmVyYWwgcHJvdmlzaW9uZWQgc291cmNlIGlzIHJldXNlZCBiZWZvcmUgYmVpbmcgZG93bmxvYWRlZCBhZ2Fpbi4gKi9cbmNvbnN0IERFRkFVTFRfUkVGUkVTSF9UVExfTVMgPSA3ICogMjQgKiA2MCAqIDYwICogMTAwMDtcblxuLyoqIEhvdyBsb25nIHRoZSBzaGFyZWQgRGF0YWJyaWNrcyBBSSBUb29scyBzbmFwc2hvdCBpcyByZXVzZWQuICovXG5leHBvcnQgY29uc3QgQUlUT09MU19SRUZSRVNIX1RUTF9NUyA9IDI0ICogNjAgKiA2MCAqIDEwMDA7XG5cbmNvbnN0IGFpVG9vbHNDYWNoZSA9IHByb2plY3RDYWNoZShcIm1hc3RyYS1haXRvb2xzXCIsIHtcbiAgdHRsOiBBSVRPT0xTX1JFRlJFU0hfVFRMX01TLFxuICBtYXhFbnRyaWVzOiAzMixcbn0pO1xuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUkgVG9vbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogU291cmNlIGNvbnN0YW50IHNlbGVjdGluZyBEYXRhYnJpY2tzJyBvd24gQUkgVG9vbHMgc2tpbGwgc2V0LlxuICpcbiAqIEBleGFtcGxlXG4gKiBtYXN0cmEoeyByZW1vdGVTa2lsbHM6IFwiYWl0b29sc1wiIH0pO1xuICovXG5leHBvcnQgY29uc3QgQUlUT09MU19TT1VSQ0UgPSBcImFpdG9vbHNcIjtcblxuLyoqIFRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGxpdGVyYWwsIGZvciBjYWxsZXJzIHNwZWxsaW5nIHRoZSB1bmlvbiBvdXQuICovXG5leHBvcnQgdHlwZSBBaVRvb2xzU291cmNlID0gdHlwZW9mIEFJVE9PTFNfU09VUkNFO1xuXG4vKipcbiAqIFRoZSBQVUJMSUMgcmVwbyBgZGF0YWJyaWNrcyBhaXRvb2xzIGluc3RhbGxgIHNvdXJjZXMgZnJvbS4gUmVhZGluZyBpdFxuICogZGlyZWN0bHkgaXMgd2hhdCBsZXRzIGFuIGFwcCBnZXQgdGhlIHNhbWUgc2tpbGxzIHRoZSBDTEkgaW5zdGFsbHMgd2l0aG91dFxuICogdGhlIENMSSAtIHdoaWNoIGEgRGF0YWJyaWNrcyBBcHAgY29udGFpbmVyIGRvZXMgbm90IHNoaXAuXG4gKi9cbmNvbnN0IEFJVE9PTFNfUkVQTyA9IFwiZGF0YWJyaWNrcy9kYXRhYnJpY2tzLWFnZW50LXNraWxsc1wiO1xuXG4vKiogUmVwbyByZWYgdGhlIHNraWxscyBhcmUgcmVhZCBmcm9tLiBPdmVycmlkZSBwZXIgc291cmNlIHdpdGggYHJlZmAuICovXG5jb25zdCBBSVRPT0xTX1JFRiA9IFwibWFpblwiO1xuXG4vKiogU2tpbGwgZmlsZXMgZG93bmxvYWRlZCBhdCBvbmNlOyB0aGUgc2V0IGlzIH4zMCBza2lsbHMgb2YgYSBmZXcgZmlsZXMgZWFjaC4gKi9cbmNvbnN0IEFJVE9PTFNfQ09OQ1VSUkVOQ1kgPSA4O1xuXG4vKiogVGhlIHN1YnNldCBvZiB0aGUgcmVwbydzIGdlbmVyYXRlZCBgbWFuaWZlc3QuanNvbmAgdGhpcyBtb2R1bGUgcmVhZHMuICovXG5pbnRlcmZhY2UgQWlUb29sc01hbmlmZXN0IHtcbiAgc2tpbGxzPzogUmVjb3JkPHN0cmluZywgeyBmaWxlcz86IHN0cmluZ1tdOyByZXBvX2Rpcj86IHN0cmluZyB9Pjtcbn1cblxuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuLyoqXG4gKiBPbmUgcmVtb3RlIHNraWxsIHNvdXJjZSBhbmQgaXRzIHBlci1zb3VyY2UgcG9saWN5LlxuICpcbiAqIGBzb3VyY2VgIGlzIHtAbGluayBBSVRPT0xTX1NPVVJDRX0gb3IgYW55dGhpbmcgdGhlIGBza2lsbHNgIGVjb3N5c3RlbVxuICogdW5kZXJzdGFuZHM6IGEgR2l0SHViIGBvd25lci9yZXBvYCBzaG9ydGhhbmQsIGEgZnVsbCBHaXRIdWIgLyBHaXRMYWIgLyBnaXRcbiAqIFVSTCwgb3IgYSBkaXJlY3QgZG93bmxvYWQgVVJMIHRvIGEgYFNLSUxMLm1kYCBvciBhcmNoaXZlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsU291cmNlT3B0aW9ucyB7XG4gIC8qKiBgXCJhaXRvb2xzXCJgLCBhIEdpdEh1YiBzaG9ydGhhbmQsIGEgZ2l0IC8gR2l0TGFiIFVSTCwgb3IgYSBkb3dubG9hZCBVUkwuICovXG4gIHNvdXJjZTogbmV0LlVybExpa2UgfCBBaVRvb2xzU291cmNlO1xuICAvKiogU3RhYmxlIHZpcnR1YWwgbW91bnQgbmFtZSB1bmRlciBgLy5za2lsbHNgOyBnZW5lcmF0ZWQgZnJvbSB0aGUgc291cmNlIHdoZW4gb21pdHRlZC4gKi9cbiAgbmFtZT86IHN0cmluZztcbiAgLyoqIEluc3RhbGwgb25seSB0aGVzZSBza2lsbCBuYW1lcyBmcm9tIHRoZSBzb3VyY2UuICovXG4gIHNraWxscz86IHN0cmluZyB8IHN0cmluZ1tdO1xuICAvKiogSW5jbHVkZSBleHBlcmltZW50YWwgc2tpbGxzLiBgXCJhaXRvb2xzXCJgIG9ubHkuICovXG4gIGV4cGVyaW1lbnRhbD86IGJvb2xlYW47XG4gIC8qKiBQaW4gdGhlIHJlcG8gcmVmICh0YWcgLyBicmFuY2ggLyBzaGEpLiBgXCJhaXRvb2xzXCJgIG9ubHk7IGRlZmF1bHRzIHRvIGBtYWluYC4gKi9cbiAgcmVmPzogc3RyaW5nO1xuICAvKiogT3ZlcnJpZGUgdGhlIGJ5dGUgY2VpbGluZyBvbiBhIGRpcmVjdC1mZXRjaCBkb3dubG9hZCBmb3IgdGhpcyBzb3VyY2UuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyB0aGlzIHNvdXJjZSdzIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdCBpcyBkb3dubG9hZGVkXG4gICAqIGFnYWluLCBpbiBtaWxsaXNlY29uZHMuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsXG4gICAqIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLnJlZnJlc2hUdGxNc307IGAwYCByZS1kb3dubG9hZHMgb25cbiAgICogZXZlcnkgYm9vdC5cbiAgICovXG4gIHJlZnJlc2hUdGxNcz86IG51bWJlcjtcbiAgLyoqXG4gICAqIFdoZW4gYGZhbHNlYCwgYSBzb3VyY2UgdGhhdCBmYWlscyB0byByZXNvbHZlIGlzIGxvZ2dlZCBhbmQgc2tpcHBlZCBpbnN0ZWFkXG4gICAqIG9mIGZhaWxpbmcgYXBwIHN0YXJ0dXAuIE92ZXJyaWRlcyB0aGUgdG9wLWxldmVsIHtAbGluayBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLmZhaWxPbkVycm9yfS5cbiAgICovXG4gIGZhaWxPbkVycm9yPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBIHJlbW90ZSBza2lsbCBzb3VyY2U6IHRoZSB7QGxpbmsgQUlUT09MU19TT1VSQ0V9IGNvbnN0YW50LCBhIFVSTC1saWtlXG4gKiAoc3RyaW5nIC8gYFVSTGAgLyBgeyB1cmwgfWApLCBvciBhIHtAbGluayBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnN9IGJhZyB3aXRoXG4gKiBwZXItc291cmNlIHBvbGljeS5cbiAqL1xuZXhwb3J0IHR5cGUgUmVtb3RlU2tpbGxTb3VyY2UgPSBuZXQuVXJsTGlrZSB8IEFpVG9vbHNTb3VyY2UgfCBSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnM7XG5cbi8qKlxuICogVGhlIHdvcmtzcGFjZSBgcmVtb3RlU2tpbGxzYCBvcHRpb246IG9uZSBzb3VyY2UsIGEgbm9uLWVtcHR5IGxpc3Qgb2YgdGhlbSwgb3JcbiAqIGEge0BsaW5rIFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnN9IGJhZyB3aGVuIHRvcC1sZXZlbCBwb2xpY3kgaXMgbmVlZGVkLlxuICovXG5leHBvcnQgdHlwZSBSZW1vdGVTa2lsbHNPcHRpb24gPVxuICBSZW1vdGVTa2lsbFNvdXJjZSB8IE9uZU9yTWFueTxSZW1vdGVTa2lsbFNvdXJjZT4gfCBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zO1xuXG4vKiogQSBzb3VyY2UgZW50cnkgd2l0aCBpdHMgYHNvdXJjZWAgZmxhdHRlbmVkIHRvIGEgcGxhaW4gc3RyaW5nLiAqL1xudHlwZSBOb3JtYWxpemVkU291cmNlID0gT21pdDxSZW1vdGVTa2lsbFNvdXJjZU9wdGlvbnMsIFwic291cmNlXCI+ICYgeyBzb3VyY2U6IHN0cmluZyB9O1xuXG4vKiogUmVhZC1vbmx5IGxvY2FsIGRpcmVjdG9yeSBleHBvc2VkIGF0IGEgc3RhYmxlIHZpcnR1YWwgd29ya3NwYWNlIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2FsU2tpbGxEaXJlY3RvcnlNb3VudCB7XG4gIC8qKiBQaHlzaWNhbCBsb2NhbCBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgcHJvdmlzaW9uZWQgYFNLSUxMLm1kYCB0cmVlLiAqL1xuICByb290OiBzdHJpbmc7XG4gIC8qKiBWaXJ0dWFsIHBhdGggYWdlbnRzIHNlZSBpbnNpZGUgdGhlIGNvbXBvc2VkIE1hc3RyYSB3b3Jrc3BhY2UuICovXG4gIG1vdW50UGF0aDogc3RyaW5nO1xufVxuXG4vKiogUmVhZC1vbmx5IHByb2Nlc3MtbG9jYWwgZmlsZXN5c3RlbSBleHBvc2VkIGF0IGEgc3RhYmxlIHZpcnR1YWwgd29ya3NwYWNlIHBhdGguICovXG5leHBvcnQgaW50ZXJmYWNlIE1lbW9yeVNraWxsTW91bnQge1xuICAvKiogUHJvY2Vzcy1zaGFyZWQgZmlsZXN5c3RlbSBjb250YWluaW5nIHRoZSBwcm92aXNpb25lZCBgU0tJTEwubWRgIHRyZWUuICovXG4gIGZpbGVzeXN0ZW06IEZpbGVTeXN0ZW07XG4gIC8qKiBWaXJ0dWFsIHBhdGggYWdlbnRzIHNlZSBpbnNpZGUgdGhlIGNvbXBvc2VkIE1hc3RyYSB3b3Jrc3BhY2UuICovXG4gIG1vdW50UGF0aDogc3RyaW5nO1xufVxuXG4vKiogTG9jYWwgc2tpbGwgYmFja2luZyBhY2NlcHRlZCBieSBldmVyeSBhdXRvLWNyZWF0ZWQgd29ya3NwYWNlLiAqL1xuZXhwb3J0IHR5cGUgTG9jYWxTa2lsbE1vdW50ID0gTG9jYWxTa2lsbERpcmVjdG9yeU1vdW50IHwgTWVtb3J5U2tpbGxNb3VudDtcblxuLyoqIFRvcC1sZXZlbCByZW1vdGUtc2tpbGxzIHByb3Zpc2lvbmluZyBvcHRpb25zLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgLyoqIFNvdXJjZXMgdG8gbWF0ZXJpYWxpemUgYXQgc3RhcnR1cC4gKi9cbiAgc291cmNlczogUmVtb3RlU2tpbGxTb3VyY2UgfCBPbmVPck1hbnk8UmVtb3RlU2tpbGxTb3VyY2U+O1xuICAvKipcbiAgICogRmFpbCBhcHAgc3RhcnR1cCB3aGVuIGEgc291cmNlIGNhbid0IGJlIHJlc29sdmVkLiBEZWZhdWx0cyB0byBgdHJ1ZWAuIEFcbiAgICogcGVyLXNvdXJjZSBgZmFpbE9uRXJyb3JgIHdpbnMgb3ZlciB0aGlzLlxuICAgKi9cbiAgZmFpbE9uRXJyb3I/OiBib29sZWFuO1xuICAvKipcbiAgICogQWJzb2x1dGUgRGF0YWJyaWNrcyBwYXRoIHRoYXQgcm9vdHMgdGhlIGRlc3RpbmF0aW9uIEFzc2lzdGFudCBza2lsbHMgdHJlZS5cbiAgICogRGVmYXVsdHMgdG8gdGhlIE9CTyB1c2VyJ3MgYC9Xb3Jrc3BhY2UvVXNlcnMvPGVtYWlsPi8uYXNzaXN0YW50L3NraWxsc2AuXG4gICAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiBBdXRoLXNjb3BlZCBEYXRhYnJpY2tzIGNsaWVudC4gRGVmYXVsdHMgdG8gdGhlIEFwcEtpdCBleGVjdXRpb24gY29udGV4dC4gKi9cbiAgY2xpZW50PzogV29ya3NwYWNlQ2xpZW50TGlrZTtcbiAgLyoqIFVzZXIgZW1haWwgdXNlZCB0byBkZXJpdmUgdGhlIGRlZmF1bHQgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbi4gKi9cbiAgdXNlckVtYWlsPzogc3RyaW5nO1xuICAvKiogQnl0ZSBjZWlsaW5nIG9uIGEgZGlyZWN0LWZldGNoIGRvd25sb2FkLiBEZWZhdWx0cyB0byAxMCBNaUIuICovXG4gIG1heERvd25sb2FkQnl0ZXM/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBIb3cgbG9uZyBhIHByb3Zpc2lvbmVkIHRyZWUgaXMgcmV1c2VkIGJlZm9yZSBpdHMgc291cmNlIGlzIGRvd25sb2FkZWRcbiAgICogYWdhaW4sIGluIG1pbGxpc2Vjb25kcy4gQUkgVG9vbHMgZGVmYXVsdHMgdG8gb25lIGRheSBhbmQgb3RoZXIgc291cmNlcyB0b1xuICAgKiBzZXZlbiBkYXlzOyBgMGAgcmUtZG93bmxvYWRzIG9uIGV2ZXJ5IGJvb3QuIEEgcGVyLXNvdXJjZSBgcmVmcmVzaFR0bE1zYCB3aW5zLlxuICAgKi9cbiAgcmVmcmVzaFR0bE1zPzogbnVtYmVyO1xufVxuXG4vKiogV2hhdCB7QGxpbmsgcHJvdmlzaW9uUmVtb3RlU2tpbGxzfSByZXNvbHZlZC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdmlzaW9uZWRSZW1vdGVTa2lsbHMge1xuICAvKipcbiAgICogRXh0cmEgcmVhZC1vbmx5IGZpbGVzeXN0ZW0gbW91bnRzIHJldGFpbmVkIGZvciBkaXJlY3Qgd29ya3NwYWNlIGZpbGUgYWNjZXNzLlxuICAgKi9cbiAgbG9jYWxTa2lsbE1vdW50czogTG9jYWxTa2lsbE1vdW50W107XG4gIC8qKiBQcm9jZXNzLW1lbW9yeSB0cmVlcyBjb252ZXJ0ZWQgaW50byBzdGFuZGFyZCBhZ2VudC1sZXZlbCBza2lsbHMuICovXG4gIHN0YW5kYXJkU2tpbGxNb3VudHM6IExvY2FsU2tpbGxNb3VudFtdO1xuICAvKiogQWJzb2x1dGUgRGF0YWJyaWNrcyBkZXN0aW5hdGlvbiBlYWNoIHNvdXJjZSB3YXMgd3JpdHRlbiB0bywgaWYgYW55LiAqL1xuICBkYXRhYnJpY2tzQmFzZVBhdGg/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBOYW1lcyBvZiBldmVyeSBza2lsbCBkaXJlY3Rvcnkgbm93IGF2YWlsYWJsZSwgd2hldGhlciBpdCB3YXMgZG93bmxvYWRlZCBvblxuICAgKiB0aGlzIGJvb3Qgb3IgcmV1c2VkIGZyb20gYSBzdGlsbC1mcmVzaCB0cmVlIChzZWUge0BsaW5rIE1FVEFEQVRBX0ZJTEV9KS5cbiAgICovXG4gIHNraWxsTmFtZXM6IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIE1ldGFkYXRhIGZvciBvbmUgcmVzb2x2ZWQgc291cmNlIHNuYXBzaG90LiBHZW5lcmFsIHJlbW90ZSBzb3VyY2VzIHN0b3JlIGl0XG4gKiBpbiB7QGxpbmsgTUVUQURBVEFfRklMRX07IEFJIFRvb2xzIHN0b3JlcyBpdCB3aXRoIHRoZSBjYWNoZS1wYWNrYWdlIHZhbHVlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbW90ZVNraWxsQ2FjaGVFbnRyeSB7XG4gIC8qKiBUaGUgc291cmNlIHN0cmluZyB0aGlzIGVudHJ5IHdhcyBkb3dubG9hZGVkIGZyb20sIGZvciByZWFkYWJpbGl0eS4gKi9cbiAgc291cmNlOiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRoZSBkb3dubG9hZCBjb21wbGV0ZWQsIElTTy04NjAxLiAqL1xuICBkb3dubG9hZGVkQXQ6IHN0cmluZztcbiAgLyoqIFNraWxsIGRpcmVjdG9yeSBuYW1lcyB0aGUgZG93bmxvYWQgcHJvZHVjZWQuICovXG4gIHNraWxsczogc3RyaW5nW107XG4gIC8qKlxuICAgKiBUaGUgY29udGVudC1hZmZlY3RpbmcgcG9saWN5IHRoYXQgZG93bmxvYWQgdXNlZC4gQWxzbyBmb2xkZWQgaW50byB0aGUgZW50cnlcbiAgICogS0VZLCBzbyBuYXJyb3dpbmcgYHNraWxsc2Agb3IgbW92aW5nIGByZWZgIG1pc3NlcyB0aGUgY2FjaGUgaW5zdGVhZCBvZlxuICAgKiBzaWxlbnRseSBzZXJ2aW5nIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uXG4gICAqL1xuICBwb2xpY3k/OiB7IHNraWxscz86IHN0cmluZ1tdOyBleHBlcmltZW50YWw/OiBib29sZWFuOyByZWY/OiBzdHJpbmcgfTtcbn1cblxuLyoqIFRoZSB7QGxpbmsgTUVUQURBVEFfRklMRX0gZG9jdW1lbnQ6IG9uZSBlbnRyeSBwZXIgcHJvdmlzaW9uZWQgc291cmNlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZW1vdGVTa2lsbHNNZXRhZGF0YSB7XG4gIHZlcnNpb246IG51bWJlcjtcbiAgc291cmNlczogUmVjb3JkPHN0cmluZywgUmVtb3RlU2tpbGxDYWNoZUVudHJ5Pjtcbn1cblxuaW50ZXJmYWNlIENhY2hlZFNraWxsRmlsZSB7XG4gIHBhdGg6IHN0cmluZztcbiAgY29udGVudDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQ2FjaGVkQWlUb29sc1RyZWUge1xuICBmaWxlczogQ2FjaGVkU2tpbGxGaWxlW107XG4gIHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5O1xufVxuXG5pbnRlcmZhY2UgUmVzb2x2ZWRBaVRvb2xzVHJlZSBleHRlbmRzIENhY2hlZEFpVG9vbHNUcmVlIHtcbiAgY2FjaGVkOiBib29sZWFuO1xufVxuXG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG4vKiogTm9ybWFsaXplIHRoZSBgcmVtb3RlU2tpbGxzYCBvcHRpb24gaW50byBhIGZsYXQgb3B0aW9ucyBiYWcuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUmVtb3RlU2tpbGxzT3B0aW9uKFxuICBvcHRpb246IFJlbW90ZVNraWxsc09wdGlvbiB8IHVuZGVmaW5lZCxcbik6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMgfCB1bmRlZmluZWQge1xuICBpZiAob3B0aW9uID09PSB1bmRlZmluZWQpIHJldHVybiB1bmRlZmluZWQ7XG4gIGNvbnN0IGJhZyA9IGlzUHJvdmlzaW9uT3B0aW9ucyhvcHRpb24pID8gb3B0aW9uIDogdW5kZWZpbmVkO1xuICBjb25zdCBzb3VyY2VzID0gdG9Tb3VyY2VMaXN0KGJhZyA/IGJhZy5zb3VyY2VzIDogKG9wdGlvbiBhcyBSZW1vdGVTa2lsbFNvdXJjZSkpO1xuICAvLyBBbiBlbXB0eSBsaXN0IGlzIHRoZSBzYW1lIGFzIG5vIGNvbmZpZ3VyYXRpb24gYXQgYWxsLlxuICBpZiAoIW9iamVjdC5pc09uZU9yTWFueShzb3VyY2VzKSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgcmV0dXJuIHsgLi4uYmFnLCBzb3VyY2VzIH07XG59XG5cbi8qKiBBIGBzb3VyY2VzYC1iZWFyaW5nIGJhZyBpcyB0aGUgdG9wLWxldmVsIG9wdGlvbnMgc2hhcGUsIG5vdCBhIHNpbmdsZSBzb3VyY2UuICovXG5mdW5jdGlvbiBpc1Byb3Zpc2lvbk9wdGlvbnModmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zIHtcbiAgcmV0dXJuIG9iamVjdC5pc1JlY29yZCh2YWx1ZSkgJiYgXCJzb3VyY2VzXCIgaW4gdmFsdWU7XG59XG5cbi8qKiBPbmUgc291cmNlIG9yIG1hbnksIGFzIGEgcGxhaW4gYXJyYXkuIEEgc291cmNlIGlzIG5ldmVyIGl0c2VsZiBhbiBhcnJheS4gKi9cbmZ1bmN0aW9uIHRvU291cmNlTGlzdChcbiAgaW5wdXQ6IFJlbW90ZVNraWxsU291cmNlIHwgT25lT3JNYW55PFJlbW90ZVNraWxsU291cmNlPixcbik6IFJlbW90ZVNraWxsU291cmNlW10ge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShpbnB1dCkgPyBbLi4uaW5wdXRdIDogW2lucHV0XTtcbn1cblxuLyoqIEZsYXR0ZW4gYSBzb3VyY2UgZW50cnkgLSBzdHJpbmcsIGBVUkxgLCBgeyB1cmwgfWAsIG9yIG9wdGlvbnMgYmFnIC0gdG8gYSB7QGxpbmsgTm9ybWFsaXplZFNvdXJjZX0uICovXG5mdW5jdGlvbiB0b1NvdXJjZU9wdGlvbnMoc291cmNlOiBSZW1vdGVTa2lsbFNvdXJjZSk6IE5vcm1hbGl6ZWRTb3VyY2Uge1xuICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gXCJzdHJpbmdcIikgcmV0dXJuIHsgc291cmNlIH07XG4gIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBVUkwpIHJldHVybiB7IHNvdXJjZTogc291cmNlLnRvU3RyaW5nKCkgfTtcbiAgaWYgKFwic291cmNlXCIgaW4gc291cmNlKSByZXR1cm4geyAuLi5zb3VyY2UsIHNvdXJjZTogdG9Tb3VyY2VTdHJpbmcoc291cmNlLnNvdXJjZSkgfTtcbiAgcmV0dXJuIHsgc291cmNlOiBzb3VyY2UudXJsIH07XG59XG5cbi8qKiBBIHtAbGluayBuZXQuVXJsTGlrZX0gYXMgdGhlIHBsYWluIHN0cmluZyB0aGUgc3RhZ2luZyBwYXRocyB3b3JrIHdpdGguICovXG5mdW5jdGlvbiB0b1NvdXJjZVN0cmluZyhzb3VyY2U6IG5ldC5VcmxMaWtlKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiBzb3VyY2UgPT09IFwic3RyaW5nXCIpIHJldHVybiBzb3VyY2U7XG4gIHJldHVybiBzb3VyY2UgaW5zdGFuY2VvZiBVUkwgPyBzb3VyY2UudG9TdHJpbmcoKSA6IHNvdXJjZS51cmw7XG59XG5cbi8qKiBUcnVlIHdoZW4gYSBzb3VyY2Ugc2VsZWN0cyB0aGUgYnVpbHQtaW4gRGF0YWJyaWNrcyBBSSBUb29scyBza2lsbCBzZXQuICovXG5mdW5jdGlvbiBpc0FpVG9vbHNTb3VyY2Uoc291cmNlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHNvdXJjZS50cmltKCkudG9Mb3dlckNhc2UoKSA9PT0gQUlUT09MU19TT1VSQ0U7XG59XG5cbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGNhY2hlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbi8qKlxuICogVGhlIHBvbGljeSB0aGF0IGRlY2lkZXMgd2hhdCBhIHNvdXJjZSdzIGRvd25sb2FkIENPTlRBSU5TLlxuICpcbiAqIE9ubHkgdGhlc2UgdGhyZWUgY2hhbmdlIHRoZSByZXN1bHRpbmcgdHJlZSwgc28gb25seSB0aGVzZSBiZWxvbmcgaW4gdGhlIGNhY2hlXG4gKiBrZXkgLSBgZmFpbE9uRXJyb3JgIGFuZCBgbWF4RG93bmxvYWRCeXRlc2AgZ292ZXJuIGhvdyBhIGZhaWx1cmUgaXMgaGFuZGxlZCxcbiAqIG5vdCB3aGF0IGEgc3VjY2VzcyBwcm9kdWNlcy5cbiAqL1xuZnVuY3Rpb24gY2FjaGVQb2xpY3koc291cmNlT3B0aW9uczogTm9ybWFsaXplZFNvdXJjZSk6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeVtcInBvbGljeVwiXSB7XG4gIGNvbnN0IHNraWxscyA9IHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscyk7XG4gIGNvbnN0IHBvbGljeSA9IHtcbiAgICAuLi4oc2tpbGxzLmxlbmd0aCA+IDAgPyB7IHNraWxsczogWy4uLnNraWxsc10uc29ydCgpIH0gOiB7fSksXG4gICAgLi4uKHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlID8geyBleHBlcmltZW50YWw6IHRydWUgfSA6IHt9KSxcbiAgICAuLi4oc3RyaW5nVXRpbHMudHJpbVRvTnVsbChzb3VyY2VPcHRpb25zLnJlZikgPyB7IHJlZjogc291cmNlT3B0aW9ucy5yZWYhLnRyaW0oKSB9IDoge30pLFxuICB9O1xuICByZXR1cm4gT2JqZWN0LmtleXMocG9saWN5KS5sZW5ndGggPiAwID8gcG9saWN5IDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFN0YWJsZSBpZGVudGl0eSBvZiBhIHNvdXJjZSBBTkQgaXRzIGNvbnRlbnQtYWZmZWN0aW5nIHBvbGljeS5cbiAqXG4gKiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbG9uZSB3b3VsZCBsZXQgYSBjaGFuZ2VkIGBza2lsbHNgIGZpbHRlciBvciBgcmVmYCByZWFkXG4gKiBiYWNrIHRoZSBwcmV2aW91cyBkb3dubG9hZCBmb3IgYSBkYXk7IGtleWluZyBvbiBib3RoIHR1cm5zIHRoYXQgaW50byBhIG1pc3MuXG4gKiBUaGUgc2tpbGwgbGlzdCBpcyBzb3J0ZWQgZmlyc3Qgc28gYSByZW9yZGVyZWQgYXJyYXkgaXMgc3RpbGwgdGhlIHNhbWUga2V5LlxuICovXG5mdW5jdGlvbiBjYWNoZUtleShzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlKTogc3RyaW5nIHtcbiAgcmV0dXJuIGhhc2guZm52SGFzaChcbiAgICBKU09OLnN0cmluZ2lmeSh7IHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsIHBvbGljeTogY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucykgPz8gbnVsbCB9KSxcbiAgKTtcbn1cblxuLyoqIFN0YWJsZSB2aXJ0dWFsIHdvcmtzcGFjZSBwYXRoIGZvciBvbmUgbG9jYWxseSBwcm92aXNpb25lZCBzb3VyY2UuICovXG5mdW5jdGlvbiBsb2NhbFNraWxsTW91bnRQYXRoKHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsIGtleTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzQWlUb29sc1NvdXJjZShzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHJldHVybiBBSVRPT0xTX1NLSUxMU19NT1VOVDtcbiAgY29uc3QgY29uZmlndXJlZE5hbWUgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHNvdXJjZU9wdGlvbnMubmFtZSk7XG4gIGNvbnN0IGlkZW50aWZpZXIgPSBjb25maWd1cmVkTmFtZVxuICAgID8gc3RyaW5nVXRpbHMudG9TbHVnKGNvbmZpZ3VyZWROYW1lKVxuICAgIDogc3RyaW5nVXRpbHMudG9TbHVnKHJlbW90ZVNvdXJjZUlkZW50aWZpZXIoc291cmNlT3B0aW9ucy5zb3VyY2UpKSB8fCBcInNvdXJjZVwiO1xuICBpZiAoIWlkZW50aWZpZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgcmVtb3RlIHNraWxsIHNvdXJjZSBuYW1lIG11c3QgY29udGFpbiBsZXR0ZXJzIG9yIG51bWJlcnM6IFwiJHtjb25maWd1cmVkTmFtZX1cImAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcG9zaXguam9pbihSRU1PVEVfU0tJTExTX01PVU5ULCBjb25maWd1cmVkTmFtZSA/IGlkZW50aWZpZXIgOiBgJHtpZGVudGlmaWVyfS0ke2tleX1gKTtcbn1cblxuLyoqIEh1bWFuLXJlYWRhYmxlIHNvdXJjZSBwb3J0aW9uIHVzZWQgYnkgZ2VuZXJhdGVkIHZpcnR1YWwgbW91bnQgaWRlbnRpZmllcnMuICovXG5mdW5jdGlvbiByZW1vdGVTb3VyY2VJZGVudGlmaWVyKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgdXJsID0gbmV0LnVybEJ1aWxkZXIoc291cmNlKTtcbiAgaWYgKCF1cmwpIHJldHVybiBzb3VyY2U7XG4gIGNvbnN0IHBhdGggPSB1cmwucGF0aG5hbWUucmVwbGFjZSgvXFwuKGdpdHxtZHx6aXB8dGFyfHRnenxneikkL2ksIFwiXCIpO1xuICByZXR1cm4gYCR7dXJsLmhvc3RuYW1lfS0ke3BhdGh9YDtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgcmV1c2Ugd2luZG93OiBwZXItc291cmNlLCB0b3AtbGV2ZWwsIHRoZW4gdGhlIHNvdXJjZSBkZWZhdWx0LiAqL1xuZnVuY3Rpb24gcmVzb2x2ZVJlZnJlc2hUdGwoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBudW1iZXIge1xuICByZXR1cm4gKFxuICAgIHNvdXJjZU9wdGlvbnMucmVmcmVzaFR0bE1zID8/XG4gICAgb3B0aW9ucy5yZWZyZXNoVHRsTXMgPz9cbiAgICAoaXNBaVRvb2xzU291cmNlKHNvdXJjZU9wdGlvbnMuc291cmNlKSA/IEFJVE9PTFNfUkVGUkVTSF9UVExfTVMgOiBERUZBVUxUX1JFRlJFU0hfVFRMX01TKVxuICApO1xufVxuXG4vKipcbiAqIFJlYWQgdGhlIG1ldGFkYXRhIGRvY3VtZW50IGF0IHRoZSByb290IG9mIGEgcHJvdmlzaW9uZWQgdHJlZSwgb3IgYHVuZGVmaW5lZGBcbiAqIHdoZW4gdGhlcmUgaXMgbm9uZSwgaXQgaXMgdW5yZWFkYWJsZSwgb3IgaXQgd2FzIHdyaXR0ZW4gYnkgYSBzaGFwZSB0aGlzXG4gKiB2ZXJzaW9uIGRvZXMgbm90IGtub3cuXG4gKlxuICogTmV2ZXIgdGhyb3dzOiBhIG1pc3Npbmcgb3IgY29ycnVwdCByZWNvcmQgaXMgYSBjYWNoZSBNSVNTLCB3aGljaCBjb3N0cyBhXG4gKiBkb3dubG9hZCAtIHdoaWxlIGxldHRpbmcgaXQgZmFpbCB3b3VsZCB0YWtlIGFwcCBzdGFydHVwIGRvd24gb3ZlclxuICogYm9va2tlZXBpbmcuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlYWRNZXRhZGF0YShmczogRmlsZVN5c3RlbSk6IFByb21pc2U8UmVtb3RlU2tpbGxzTWV0YWRhdGEgfCB1bmRlZmluZWQ+IHtcbiAgdHJ5IHtcbiAgICBpZiAoIShhd2FpdCBmcy5leGlzdHMoTUVUQURBVEFfRklMRSkpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJhdyA9IGF3YWl0IGZzLnJlYWRGaWxlKE1FVEFEQVRBX0ZJTEUsIHsgZW5jb2Rpbmc6IFwidXRmOFwiIH0pO1xuICAgIGNvbnN0IHBhcnNlZCA9IGpzb24ucGFyc2UocmF3LCB1bmRlZmluZWQpIGFzIFJlbW90ZVNraWxsc01ldGFkYXRhIHwgdW5kZWZpbmVkO1xuICAgIGlmICghb2JqZWN0LmlzUmVjb3JkKHBhcnNlZCkgfHwgcGFyc2VkLnZlcnNpb24gIT09IE1FVEFEQVRBX1ZFUlNJT04pIHJldHVybiB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIG9iamVjdC5pc1JlY29yZChwYXJzZWQuc291cmNlcykgPyBwYXJzZWQgOiB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci5kZWJ1ZyhcImNhY2hlOnVucmVhZGFibGVcIiwgeyBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVycikgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufVxuXG4vKipcbiAqIFdoZXRoZXIgYW4gZW50cnkgaXMgc3RpbGwgaW5zaWRlIGl0cyByZXVzZSB3aW5kb3cuXG4gKlxuICogQSBgdHRsTXNgIG9mIGAwYCBkaXNhYmxlcyByZXVzZSBvdXRyaWdodCwgYW5kIGFuIHVucGFyc2VhYmxlIG9yIEZVVFVSRVxuICogdGltZXN0YW1wIGNvdW50cyBhcyBzdGFsZSAtIGEgY2xvY2sgdGhhdCBtb3ZlZCBiYWNrd2FyZHMgc2hvdWxkIGNvc3Qgb25lXG4gKiBleHRyYSBkb3dubG9hZCwgbm90IHBpbiBhIHRyZWUgYXMgZnJlc2ggaW5kZWZpbml0ZWx5LlxuICovXG5mdW5jdGlvbiBpc0ZyZXNoKGVudHJ5OiBSZW1vdGVTa2lsbENhY2hlRW50cnksIHR0bE1zOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKHR0bE1zIDw9IDAgfHwgIUFycmF5LmlzQXJyYXkoZW50cnkuc2tpbGxzKSkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBkb3dubG9hZGVkQXQgPSBvYmplY3QudG9EYXRlKGVudHJ5LmRvd25sb2FkZWRBdCk7XG4gIGlmICghZG93bmxvYWRlZEF0KSByZXR1cm4gZmFsc2U7XG4gIGNvbnN0IGFnZSA9IERhdGUubm93KCkgLSBkb3dubG9hZGVkQXQuZ2V0VGltZSgpO1xuICByZXR1cm4gYWdlID49IDAgJiYgYWdlIDwgdHRsTXM7XG59XG5cbi8qKlxuICogTWVyZ2Ugb25lIHNvdXJjZSdzIGVudHJ5IGludG8gdGhlIHRyZWUncyBtZXRhZGF0YSBkb2N1bWVudCwgcHJlc2VydmluZyB3aGF0XG4gKiBvdGhlciBzb3VyY2VzIHJlY29yZGVkIC0gdGhlIERhdGFicmlja3MgZGVzdGluYXRpb24gaXMgU0hBUkVELCBzbyBhIGJsaW5kXG4gKiBvdmVyd3JpdGUgd291bGQgZHJvcCBldmVyeSBzaWJsaW5nIHNvdXJjZSdzIHRpbWVzdGFtcCBhbmQgcmUtZG93bmxvYWQgdGhlXG4gKiBsb3Qgb24gdGhlIG5leHQgYm9vdC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gd3JpdGVNZXRhZGF0YShcbiAgZnM6IEZpbGVTeXN0ZW0sXG4gIGtleTogc3RyaW5nLFxuICBlbnRyeTogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGN1cnJlbnQgPSBhd2FpdCByZWFkTWV0YWRhdGEoZnMpO1xuICBjb25zdCBuZXh0OiBSZW1vdGVTa2lsbHNNZXRhZGF0YSA9IHtcbiAgICB2ZXJzaW9uOiBNRVRBREFUQV9WRVJTSU9OLFxuICAgIHNvdXJjZXM6IHsgLi4uY3VycmVudD8uc291cmNlcywgW2tleV06IGVudHJ5IH0sXG4gIH07XG4gIGF3YWl0IGZzLndyaXRlRmlsZShNRVRBREFUQV9GSUxFLCBgJHtKU09OLnN0cmluZ2lmeShuZXh0LCBudWxsLCAyKX1cXG5gLCB7IG92ZXJ3cml0ZTogdHJ1ZSB9KTtcbn1cblxuLyoqIFRoZSBzdGFibGUgbG9jYWwgdHJlZSBhIHNvdXJjZSBpcyByZWJ1aWx0IGludG8sIGtleWVkIGJ5IHtAbGluayBjYWNoZUtleX0uICovXG5mdW5jdGlvbiBsb2NhbFNraWxsc0ZTKGtleTogc3RyaW5nKTogTG9jYWxGaWxlU3lzdGVtIHtcbiAgcmV0dXJuIGxvY2FsRlMudG1wRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCk7XG59XG5cbi8qKlxuICogTWF0ZXJpYWxpemUgZXZlcnkgY29uZmlndXJlZCByZW1vdGUgc2tpbGwgc291cmNlIGF0IGFwcCBzdGFydHVwLlxuICpcbiAqIFdyaXRlcyBlYWNoIHJlc29sdmVkIGBTS0lMTC5tZGAgdHJlZSB0byB0aGUgRGF0YWJyaWNrcyB1c2VyIEFzc2lzdGFudCBza2lsbHNcbiAqIGZvbGRlciB3aGVuIGEgd3JpdGFibGUgd29ya3NwYWNlIGlzIGF2YWlsYWJsZSwgZWxzZSB1bmRlclxuICoge0BsaW5rIGxvY2FsRlMudG1wRlN9IHJldHVybmVkIGluIHtAbGluayBQcm92aXNpb25lZFJlbW90ZVNraWxscy5sb2NhbFNraWxsTW91bnRzfS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHByb3Zpc2lvblJlbW90ZVNraWxscyhcbiAgb3B0aW9uOiBSZW1vdGVTa2lsbHNPcHRpb24gfCB1bmRlZmluZWQsXG4pOiBQcm9taXNlPFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzPiB7XG4gIGNvbnN0IG9wdGlvbnMgPSBub3JtYWxpemVSZW1vdGVTa2lsbHNPcHRpb24ob3B0aW9uKTtcbiAgY29uc3QgZW1wdHk6IFByb3Zpc2lvbmVkUmVtb3RlU2tpbGxzID0ge1xuICAgIGxvY2FsU2tpbGxNb3VudHM6IFtdLFxuICAgIHN0YW5kYXJkU2tpbGxNb3VudHM6IFtdLFxuICAgIHNraWxsTmFtZXM6IFtdLFxuICB9O1xuICBpZiAoIW9wdGlvbnMpIHJldHVybiBlbXB0eTtcblxuICBjb25zdCBmYWlsRGVmYXVsdCA9IG9wdGlvbnMuZmFpbE9uRXJyb3IgIT09IGZhbHNlO1xuICBjb25zdCBzb3VyY2VzID0gKEFycmF5LmlzQXJyYXkob3B0aW9ucy5zb3VyY2VzKSA/IG9wdGlvbnMuc291cmNlcyA6IFtvcHRpb25zLnNvdXJjZXNdKS5tYXAoXG4gICAgdG9Tb3VyY2VPcHRpb25zLFxuICApO1xuICBjb25zdCBjbGllbnQgPSBvcHRpb25zLmNsaWVudCA/PyBhcHBraXQudHJ5R2V0RXhlY3V0aW9uQ29udGV4dCgpPy5jbGllbnQ7XG4gIC8vIFByb2JlZCByYXRoZXIgdGhhbiBhc3N1bWVkOiBhbiBpZGVudGl0eSB0aGF0IGNhbm5vdCB3cml0ZSB0aGUgd29ya3NwYWNlXG4gIC8vIHRyZWUgZmFsbHMgYmFjayB0byB0aGUgbG9jYWwgb25lIGluc3RlYWQgb2YgZmFpbGluZyBzdGFydHVwLiBUaGUgcHJvYmUgYWxzb1xuICAvLyBjcmVhdGVzIHRoZSByb290LCB3aGljaCB0aGUgZmlyc3QgY2FjaGUgUkVBRCBuZWVkcyAtIGBjb3B5U2tpbGxEaXJzYCB3b3VsZFxuICAvLyBvdGhlcndpc2UgYmUgdGhlIGZpcnN0IHRoaW5nIHRvIGNyZWF0ZSBpdCwgd2hpY2ggaXMgdG9vIGxhdGUuXG4gIGNvbnN0IHJlcXVlc3RlZEJhc2VQYXRoID0gc291cmNlcy5zb21lKChzb3VyY2UpID0+ICFpc0FpVG9vbHNTb3VyY2Uoc291cmNlLnNvdXJjZSkpXG4gICAgPyByZXNvbHZlRGF0YWJyaWNrc0Jhc2VQYXRoKG9wdGlvbnMsIGNsaWVudClcbiAgICA6IHVuZGVmaW5lZDtcbiAgY29uc3QgZGVzdGluYXRpb24gPSByZXF1ZXN0ZWRCYXNlUGF0aFxuICAgID8gYXdhaXQgb3BlbldyaXRhYmxlV29ya3NwYWNlKHJlcXVlc3RlZEJhc2VQYXRoLCBjbGllbnQgYXMgV29ya3NwYWNlQ2xpZW50KVxuICAgIDogdW5kZWZpbmVkO1xuICBjb25zdCBkYXRhYnJpY2tzQmFzZVBhdGggPSBkZXN0aW5hdGlvbiA/IHJlcXVlc3RlZEJhc2VQYXRoIDogdW5kZWZpbmVkO1xuXG4gIGNvbnN0IGxvY2FsU2tpbGxNb3VudHM6IExvY2FsU2tpbGxNb3VudFtdID0gW107XG4gIGNvbnN0IHN0YW5kYXJkU2tpbGxNb3VudHM6IExvY2FsU2tpbGxNb3VudFtdID0gW107XG4gIGNvbnN0IHNraWxsTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGxldCBzdGFnaW5nOiBMb2NhbEZpbGVTeXN0ZW0gfCB1bmRlZmluZWQ7XG5cbiAgdHJ5IHtcbiAgICBmb3IgKGNvbnN0IHNvdXJjZU9wdGlvbnMgb2Ygc291cmNlcykge1xuICAgICAgY29uc3QgZmFpbE9uRXJyb3IgPSBzb3VyY2VPcHRpb25zLmZhaWxPbkVycm9yID8/IGZhaWxEZWZhdWx0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gV2hlcmUgdGhpcyBzb3VyY2UncyBib29ra2VlcGluZyBsaXZlczogdGhlIHNoYXJlZCBEYXRhYnJpY2tzIHRyZWUsIG9yXG4gICAgICAgIC8vIHRoZSBzb3VyY2UncyBvd24gc3RhYmxlIGxvY2FsIGRpci5cbiAgICAgICAgY29uc3Qga2V5ID0gY2FjaGVLZXkoc291cmNlT3B0aW9ucyk7XG4gICAgICAgIGNvbnN0IG1vdW50UGF0aCA9IGxvY2FsU2tpbGxNb3VudFBhdGgoc291cmNlT3B0aW9ucywga2V5KTtcbiAgICAgICAgaWYgKGlzQWlUb29sc1NvdXJjZShzb3VyY2VPcHRpb25zLnNvdXJjZSkpIHtcbiAgICAgICAgICBzdGFnaW5nID8/PSBhd2FpdCBpbml0aWFsaXplZFNjcmF0Y2goXCJtYXN0cmEtcmVtb3RlLXNraWxsc1wiKTtcbiAgICAgICAgICBjb25zdCB0cmVlID0gYXdhaXQgY2FjaGVkQWlUb29sc1RyZWUoc291cmNlT3B0aW9ucywgc3RhZ2luZy5yb290LCBvcHRpb25zLCBrZXkpO1xuICAgICAgICAgIGNvbnN0IG1vdW50ID0ge1xuICAgICAgICAgICAgZmlsZXN5c3RlbTogYXdhaXQgbWVtb3J5U2tpbGxUcmVlKHRyZWUuZmlsZXMsIGBhaXRvb2xzLSR7a2V5fWApLFxuICAgICAgICAgICAgbW91bnRQYXRoLFxuICAgICAgICAgIH07XG4gICAgICAgICAgbG9jYWxTa2lsbE1vdW50cy5wdXNoKG1vdW50KTtcbiAgICAgICAgICBzdGFuZGFyZFNraWxsTW91bnRzLnB1c2gobW91bnQpO1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi50cmVlLnJlY29yZC5za2lsbHMpO1xuICAgICAgICAgIGxvZ2dlci5pbmZvKFwicmVtb3RlIHNraWxsIHJlYWR5XCIsIHtcbiAgICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgICBkZXN0aW5hdGlvbjogbW91bnRQYXRoLFxuICAgICAgICAgICAgZG93bmxvYWRlZEF0OiB0cmVlLnJlY29yZC5kb3dubG9hZGVkQXQsXG4gICAgICAgICAgICBza2lsbHM6IHRyZWUucmVjb3JkLnNraWxscyxcbiAgICAgICAgICAgIGNhY2hlZDogdHJlZS5jYWNoZWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FjaGVGUyA9IGRlc3RpbmF0aW9uID8/IGxvY2FsU2tpbGxzRlMoa2V5KTtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBhd2FpdCByZWFkTWV0YWRhdGEoY2FjaGVGUyk7XG4gICAgICAgIGNvbnN0IGNhY2hlZCA9IG1ldGFkYXRhPy5zb3VyY2VzW2tleV07XG4gICAgICAgIGlmIChjYWNoZWQgJiYgaXNGcmVzaChjYWNoZWQsIHJlc29sdmVSZWZyZXNoVHRsKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpKSkge1xuICAgICAgICAgIHNraWxsTmFtZXMucHVzaCguLi5jYWNoZWQuc2tpbGxzKTtcbiAgICAgICAgICBjb25zdCBzdGFuZGFyZE1vdW50ID0ge1xuICAgICAgICAgICAgZmlsZXN5c3RlbTogYXdhaXQgbWVtb3J5U2tpbGxUcmVlRnJvbUZpbGVTeXN0ZW0oXG4gICAgICAgICAgICAgIGNhY2hlRlMsXG4gICAgICAgICAgICAgIGNhY2hlZC5za2lsbHMsXG4gICAgICAgICAgICAgIGByZW1vdGUtJHtrZXl9YCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICBtb3VudFBhdGgsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBzdGFuZGFyZFNraWxsTW91bnRzLnB1c2goc3RhbmRhcmRNb3VudCk7XG4gICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbikgbG9jYWxTa2lsbE1vdW50cy5wdXNoKHsgcm9vdDogY2FjaGVGUy5yb290LCBtb3VudFBhdGggfSk7XG4gICAgICAgICAgbG9nZ2VyLmluZm8oXCJyZW1vdGUgc2tpbGwgcmVhZHlcIiwge1xuICAgICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgICAgIGRlc3RpbmF0aW9uOiBkYXRhYnJpY2tzQmFzZVBhdGggPz8gbW91bnRQYXRoLFxuICAgICAgICAgICAgZG93bmxvYWRlZEF0OiBjYWNoZWQuZG93bmxvYWRlZEF0LFxuICAgICAgICAgICAgc2tpbGxzOiBjYWNoZWQuc2tpbGxzLFxuICAgICAgICAgICAgY2FjaGVkOiB0cnVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oXCJpbnN0YWxsaW5nIHJlbW90ZSBza2lsbFwiLCB7XG4gICAgICAgICAgc291cmNlOiBzb3VyY2VPcHRpb25zLnNvdXJjZSxcbiAgICAgICAgfSk7XG4gICAgICAgIHN0YWdpbmcgPz89IGF3YWl0IGluaXRpYWxpemVkU2NyYXRjaChcIm1hc3RyYS1yZW1vdGUtc2tpbGxzXCIpO1xuICAgICAgICBjb25zdCBzdGFnZWREaXIgPSBhd2FpdCBzdGFnZVNvdXJjZShzb3VyY2VPcHRpb25zLCBzdGFnaW5nLnJvb3QsIG9wdGlvbnMpO1xuICAgICAgICBjb25zdCBzdGFnZWQgPSBhd2FpdCBjb2xsZWN0U2tpbGxEaXJzKHN0YWdlZERpcik7XG4gICAgICAgIGlmIChzdGFnZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBubyBTS0lMTC5tZCBmb3VuZCBmb3Igc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cImApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBvbGljeSA9IGNhY2hlUG9saWN5KHNvdXJjZU9wdGlvbnMpO1xuICAgICAgICBjb25zdCByZWNvcmQ6IFJlbW90ZVNraWxsQ2FjaGVFbnRyeSA9IHtcbiAgICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICAgIGRvd25sb2FkZWRBdDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHNraWxsczogc3RhZ2VkLm1hcCgoZGlyKSA9PiBkaXIubmFtZSksXG4gICAgICAgICAgLi4uKHBvbGljeSA/IHsgcG9saWN5IH0gOiB7fSksXG4gICAgICAgIH07XG4gICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkYXRhYnJpY2tzQmFzZVBhdGgpIHtcbiAgICAgICAgICBhd2FpdCByZW1vdmVEZWxldGVkU2tpbGxzKGRlc3RpbmF0aW9uLCBrZXksIG1ldGFkYXRhLCByZWNvcmQuc2tpbGxzKTtcbiAgICAgICAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKGRlc3RpbmF0aW9uLCBzdGFnZWQpO1xuICAgICAgICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIGNvcHkgbGFuZHM6IGEgbWV0YWRhdGEgZW50cnkgd3JpdHRlbiBmaXJzdCB3b3VsZFxuICAgICAgICAgIC8vIG1hcmsgYSBmYWlsZWQgcHJvdmlzaW9uIGFzIGZyZXNoIGFuZCBzdXBwcmVzcyB0aGUgcmV0cnkgZm9yIGEgZGF5LlxuICAgICAgICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoZGVzdGluYXRpb24sIGtleSwgcmVjb3JkKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2NhbFNraWxsTW91bnRzLnB1c2goe1xuICAgICAgICAgICAgcm9vdDogYXdhaXQgcGVyc2lzdExvY2FsbHkoa2V5LCBzdGFnZWQsIHJlY29yZCksXG4gICAgICAgICAgICBtb3VudFBhdGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgc3RhbmRhcmRTa2lsbE1vdW50cy5wdXNoKHtcbiAgICAgICAgICBmaWxlc3lzdGVtOiBhd2FpdCBtZW1vcnlTa2lsbFRyZWUoYXdhaXQgc2VyaWFsaXplU2tpbGxEaXJzKHN0YWdlZCksIGByZW1vdGUtJHtrZXl9YCksXG4gICAgICAgICAgbW91bnRQYXRoLFxuICAgICAgICB9KTtcbiAgICAgICAgc2tpbGxOYW1lcy5wdXNoKC4uLnJlY29yZC5za2lsbHMpO1xuICAgICAgICBsb2dnZXIuaW5mbyhcInJlbW90ZSBza2lsbCBpbnN0YWxsZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZGVzdGluYXRpb246IGRhdGFicmlja3NCYXNlUGF0aCA/PyBsb2NhbFNraWxsTW91bnRzLmF0KC0xKT8ubW91bnRQYXRoLFxuICAgICAgICAgIHNraWxsczogcmVjb3JkLnNraWxscyxcbiAgICAgICAgfSk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGZhaWxPbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYGZhaWxlZCB0byBwcm92aXNpb24gcmVtb3RlIHNraWxsIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCI6ICR7ZXJyb3JVdGlscy5lcnJvck1lc3NhZ2UoZXJyKX1gLFxuICAgICAgICAgICAgeyBjYXVzZTogZXJyb3JVdGlscy50b0Vycm9yKGVycikgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGxvZ2dlci53YXJuKFwic291cmNlOnNraXBwZWRcIiwge1xuICAgICAgICAgIHNvdXJjZTogc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgICAgICAgZXJyb3I6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZmluYWxseSB7XG4gICAgaWYgKHN0YWdpbmcpIHtcbiAgICAgIGF3YWl0IHJtKHN0YWdpbmcucm9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7XG4gICAgfVxuICB9XG5cbiAgYXNzZXJ0VW5pcXVlTG9jYWxTa2lsbE1vdW50cyhsb2NhbFNraWxsTW91bnRzKTtcbiAgcmV0dXJuIHsgbG9jYWxTa2lsbE1vdW50cywgc3RhbmRhcmRTa2lsbE1vdW50cywgZGF0YWJyaWNrc0Jhc2VQYXRoLCBza2lsbE5hbWVzIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNhY2hlZEFpVG9vbHNUcmVlKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBzdGFnaW5nUm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuICBrZXk6IHN0cmluZyxcbik6IFByb21pc2U8UmVzb2x2ZWRBaVRvb2xzVHJlZT4ge1xuICBjb25zdCB0dGwgPSByZXNvbHZlUmVmcmVzaFR0bChzb3VyY2VPcHRpb25zLCBvcHRpb25zKTtcbiAgbGV0IGxvYWRlZCA9IGZhbHNlO1xuICBjb25zdCBsb2FkID0gYXN5bmMgKCk6IFByb21pc2U8Q2FjaGVkQWlUb29sc1RyZWU+ID0+IHtcbiAgICBsb2FkZWQgPSB0cnVlO1xuICAgIGNvbnN0IHN0YWdlZERpciA9IGF3YWl0IHN0YWdlQWlUb29scyhcbiAgICAgIHNvdXJjZU9wdGlvbnMsXG4gICAgICBqb2luKHN0YWdpbmdSb290LCBgYWl0b29scy0ke2hhc2guaWQoKX1gKSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICBjb25zdCBzdGFnZWQgPSBhd2FpdCBjb2xsZWN0U2tpbGxEaXJzKHN0YWdlZERpcik7XG4gICAgaWYgKHN0YWdlZC5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbm8gU0tJTEwubWQgZm91bmQgZm9yIHNvdXJjZSBcIiR7c291cmNlT3B0aW9ucy5zb3VyY2V9XCJgKTtcbiAgICB9XG4gICAgY29uc3QgcG9saWN5ID0gY2FjaGVQb2xpY3koc291cmNlT3B0aW9ucyk7XG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVzOiBhd2FpdCBzZXJpYWxpemVTa2lsbERpcnMoc3RhZ2VkKSxcbiAgICAgIHJlY29yZDoge1xuICAgICAgICBzb3VyY2U6IHNvdXJjZU9wdGlvbnMuc291cmNlLFxuICAgICAgICBkb3dubG9hZGVkQXQ6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgc2tpbGxzOiBzdGFnZWQubWFwKChkaXIpID0+IGRpci5uYW1lKSxcbiAgICAgICAgLi4uKHBvbGljeSA/IHsgcG9saWN5IH0gOiB7fSksXG4gICAgICB9LFxuICAgIH07XG4gIH07XG4gIGNvbnN0IHRyZWUgPVxuICAgIHR0bCA8PSAwXG4gICAgICA/IGF3YWl0IGxvYWQoKVxuICAgICAgOiBhd2FpdCBnZXRPclNldChhaVRvb2xzQ2FjaGUsIGtleSwgbG9hZCwge1xuICAgICAgICAgIHR0bCxcbiAgICAgICAgICB0aHJvd0Vycm9yczogdHJ1ZSxcbiAgICAgICAgfSk7XG4gIGlmICghdHJlZSkgdGhyb3cgbmV3IEVycm9yKGBBSSBUb29scyBjYWNoZSByZXR1cm5lZCBubyB0cmVlIGZvciAke2tleX1gKTtcbiAgYXdhaXQgZmx1c2hDYWNoZShhaVRvb2xzQ2FjaGUpO1xuICByZXR1cm4geyAuLi50cmVlLCBjYWNoZWQ6ICFsb2FkZWQgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gc2VyaWFsaXplU2tpbGxEaXJzKGRpcnM6IHJlYWRvbmx5IFN0YWdlZFNraWxsRGlyW10pOiBQcm9taXNlPENhY2hlZFNraWxsRmlsZVtdPiB7XG4gIGNvbnN0IGZpbGVzOiBDYWNoZWRTa2lsbEZpbGVbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGRpciBvZiBkaXJzKSB7XG4gICAgZm9yIGF3YWl0IChjb25zdCByZWxhdGl2ZSBvZiBmaW5kLmZpbmRGaWxlcyhcIioqLypcIiwge1xuICAgICAgY3dkOiBkaXIuYWJzb2x1dGVQYXRoLFxuICAgICAgbm9kaXI6IHRydWUsXG4gICAgfSkpIHtcbiAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoOiBwb3NpeC5qb2luKGRpci5uYW1lLCByZWxhdGl2ZS5zcGxpdCgvW1xcXFwvXS8pLmpvaW4oXCIvXCIpKSxcbiAgICAgICAgY29udGVudDogKGF3YWl0IHJlYWRGaWxlKGpvaW4oZGlyLmFic29sdXRlUGF0aCwgcmVsYXRpdmUpKSkudG9TdHJpbmcoXCJiYXNlNjRcIiksXG4gICAgICB9KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZpbGVzO1xufVxuXG5hc3luYyBmdW5jdGlvbiBtZW1vcnlTa2lsbFRyZWUoXG4gIGZpbGVzOiByZWFkb25seSBDYWNoZWRTa2lsbEZpbGVbXSxcbiAgaWQ6IHN0cmluZyxcbik6IFByb21pc2U8TWVtb3J5RmlsZVN5c3RlbT4ge1xuICBjb25zdCBmaWxlc3lzdGVtID0gbmV3IE1lbW9yeUZpbGVTeXN0ZW0oeyBpZCwgcm9vdDogXCIvXCIgfSk7XG4gIGF3YWl0IGZpbGVzeXN0ZW0uaW5pdCgpO1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgZmlsZXMpIHtcbiAgICBhd2FpdCBmaWxlc3lzdGVtLndyaXRlRmlsZShmaWxlLnBhdGgsIEJ1ZmZlci5mcm9tKGZpbGUuY29udGVudCwgXCJiYXNlNjRcIiksIHtcbiAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICB9KTtcbiAgfVxuICByZXR1cm4gZmlsZXN5c3RlbTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gbWVtb3J5U2tpbGxUcmVlRnJvbUZpbGVTeXN0ZW0oXG4gIHNvdXJjZTogRmlsZVN5c3RlbSxcbiAgc2tpbGxOYW1lczogcmVhZG9ubHkgc3RyaW5nW10sXG4gIGlkOiBzdHJpbmcsXG4pOiBQcm9taXNlPE1lbW9yeUZpbGVTeXN0ZW0+IHtcbiAgYXdhaXQgc291cmNlLmluaXQoKTtcbiAgY29uc3QgZmlsZXM6IENhY2hlZFNraWxsRmlsZVtdID0gW107XG4gIGZvciAoY29uc3Qgc2tpbGwgb2Ygc2tpbGxOYW1lcykge1xuICAgIGZvciAoY29uc3QgZW50cnkgb2YgYXdhaXQgc291cmNlLnJlYWRkaXIoc2tpbGwsIHsgcmVjdXJzaXZlOiB0cnVlIH0pKSB7XG4gICAgICBpZiAoZW50cnkudHlwZSAhPT0gXCJmaWxlXCIpIGNvbnRpbnVlO1xuICAgICAgY29uc3QgcGF0aCA9IHBvc2l4LmpvaW4oc2tpbGwsIGVudHJ5Lm5hbWUpO1xuICAgICAgY29uc3QgY29udGVudCA9IGF3YWl0IHNvdXJjZS5yZWFkRmlsZShwYXRoKTtcbiAgICAgIGZpbGVzLnB1c2goe1xuICAgICAgICBwYXRoLFxuICAgICAgICBjb250ZW50OiBCdWZmZXIuZnJvbShjb250ZW50KS50b1N0cmluZyhcImJhc2U2NFwiKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbWVtb3J5U2tpbGxUcmVlKGZpbGVzLCBpZCk7XG59XG5cbi8qKiBGYWlsIGJlZm9yZSB3b3Jrc3BhY2UgY29tcG9zaXRpb24gd2hlbiB0d28gc291cmNlcyBjbGFpbSBvbmUgdmlydHVhbCBtb3VudC4gKi9cbmZ1bmN0aW9uIGFzc2VydFVuaXF1ZUxvY2FsU2tpbGxNb3VudHMobW91bnRzOiByZWFkb25seSBMb2NhbFNraWxsTW91bnRbXSk6IHZvaWQge1xuICBjb25zdCByb290c0J5TW91bnQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKGNvbnN0IG1vdW50IG9mIG1vdW50cykge1xuICAgIGNvbnN0IGlkZW50aXR5ID0gXCJyb290XCIgaW4gbW91bnQgPyBtb3VudC5yb290IDogbW91bnQuZmlsZXN5c3RlbS5pZDtcbiAgICBjb25zdCBwcmV2aW91c1Jvb3QgPSByb290c0J5TW91bnQuZ2V0KG1vdW50Lm1vdW50UGF0aCk7XG4gICAgaWYgKHByZXZpb3VzUm9vdCAmJiBwcmV2aW91c1Jvb3QgIT09IGlkZW50aXR5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBtdWx0aXBsZSByZW1vdGUgc2tpbGwgc291cmNlcyByZXNvbHZlIHRvIHZpcnR1YWwgbW91bnQgXCIke21vdW50Lm1vdW50UGF0aH1cIjsgZ2l2ZSBlYWNoIHNvdXJjZSBhIHVuaXF1ZSBuYW1lYCxcbiAgICAgICk7XG4gICAgfVxuICAgIHJvb3RzQnlNb3VudC5zZXQobW91bnQubW91bnRQYXRoLCBpZGVudGl0eSk7XG4gIH1cbn1cblxuLyoqIFJlbW92ZSBkaXJlY3RvcmllcyBkcm9wcGVkIGJ5IG9uZSBzb3VyY2UgdW5sZXNzIGFub3RoZXIgc291cmNlIHN0aWxsIG93bnMgdGhlbS4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlbW92ZURlbGV0ZWRTa2lsbHMoXG4gIGRlc3RpbmF0aW9uOiBGaWxlU3lzdGVtLFxuICBrZXk6IHN0cmluZyxcbiAgbWV0YWRhdGE6IFJlbW90ZVNraWxsc01ldGFkYXRhIHwgdW5kZWZpbmVkLFxuICBuZXh0U2tpbGxzOiByZWFkb25seSBzdHJpbmdbXSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwcmV2aW91cyA9IG1ldGFkYXRhPy5zb3VyY2VzW2tleV0/LnNraWxscyA/PyBbXTtcbiAgY29uc3QgcmV0YWluZWQgPSBuZXcgU2V0KG5leHRTa2lsbHMpO1xuICBmb3IgKGNvbnN0IFtzb3VyY2VLZXksIGVudHJ5XSBvZiBPYmplY3QuZW50cmllcyhtZXRhZGF0YT8uc291cmNlcyA/PyB7fSkpIHtcbiAgICBpZiAoc291cmNlS2V5ID09PSBrZXkpIGNvbnRpbnVlO1xuICAgIGZvciAoY29uc3Qgc2tpbGwgb2YgZW50cnkuc2tpbGxzKSByZXRhaW5lZC5hZGQoc2tpbGwpO1xuICB9XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIHByZXZpb3VzXG4gICAgICAuZmlsdGVyKChza2lsbCkgPT4gIXJldGFpbmVkLmhhcyhza2lsbCkpXG4gICAgICAubWFwKChza2lsbCkgPT4gZGVzdGluYXRpb24ucm1kaXIoc2tpbGwsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KSksXG4gICk7XG59XG5cbi8qKiBQcm9iZSBmaWxlIHtAbGluayBvcGVuV3JpdGFibGVXb3Jrc3BhY2V9IHdyaXRlcyBhbmQgcmVtb3Zlcy4gKi9cbmNvbnN0IFdSSVRFX1BST0JFX0ZJTEUgPSBcIi5kYngtdG9vbHMtd3JpdGUtcHJvYmVcIjtcblxuLyoqXG4gKiBPcGVuIHRoZSBEYXRhYnJpY2tzIHNraWxscyBkZXN0aW5hdGlvbiwgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGlzIGlkZW50aXR5XG4gKiBjYW5ub3Qgd3JpdGUgdGhlcmUuXG4gKlxuICogVGhlIGRlZmF1bHQgZGVzdGluYXRpb24gKGAvV29ya3NwYWNlLy5hc3Npc3RhbnQvc2tpbGxzYCkgaXMgY29tbW9ubHlcbiAqIGFkbWlucy1vbmx5LCBhbmQgYW4gYXBwIHNlcnZpY2UgcHJpbmNpcGFsIGlzIG5vdCBhbiBhZG1pbiAtIHNvIGEgRGF0YWJyaWNrc1xuICogQXBwIHdyaXRpbmcgdGhlcmUgZmFpbHMgd2l0aCBgUkVTT1VSQ0VfRE9FU19OT1RfRVhJU1RgLCB3aGljaCBpcyBob3cgdGhlXG4gKiB3b3Jrc3BhY2UgQVBJIHJlcG9ydHMgYSBwYXRoIHRoZSBjYWxsZXIgaXMgbm90IGFsbG93ZWQgdG8gc2VlLiBUaGF0IGlzIGEgZmFjdFxuICogYWJvdXQgV0hFUkUgdGhlIHRyZWUgaXMgc3RvcmVkLCBub3QgYWJvdXQgd2hldGhlciB0aGUgc2tpbGxzIGFyZSB1c2FibGUsIHNvIGl0XG4gKiBkZWdyYWRlcyB0byB0aGUgbG9jYWwgdHJlZSAoaGFuZGVkIHRvIE1hc3RyYSBhcyBhbiBleHRyYSBzY2FuIHBhdGgpIHJhdGhlclxuICogdGhhbiB0YWtpbmcgYXBwIHN0YXJ0dXAgZG93biBvdmVyIGJvb2trZWVwaW5nIGxvY2F0aW9uLlxuICpcbiAqIFRoZSBwcm9iZSBpcyBhIHJlYWwgd3JpdGU6IGBta2RpcnNgIHN1Y2NlZWRzIG9uIGFuIGV4aXN0aW5nIGRpcmVjdG9yeSBldmVuIGZvclxuICogYW4gaWRlbnRpdHkgdGhhdCBjYW5ub3Qgd3JpdGUgaW50byBpdCwgc28gaW5pdCBhbG9uZSBwcm92ZXMgbm90aGluZy4gUmVtb3ZpbmdcbiAqIHRoZSBwcm9iZSBmaWxlIGlzIGJlc3QtZWZmb3J0IC0gYSBmYWlsZWQgY2xlYW51cCBtdXN0IG5vdCBkZWNpZGUgd3JpdGFiaWxpdHkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG9wZW5Xcml0YWJsZVdvcmtzcGFjZShcbiAgYmFzZVBhdGg6IHN0cmluZyxcbiAgY2xpZW50OiBXb3Jrc3BhY2VDbGllbnQsXG4pOiBQcm9taXNlPERhdGFicmlja3NGaWxlU3lzdGVtIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IGZzID0gbmV3IERhdGFicmlja3NGaWxlU3lzdGVtKHtcbiAgICBjbGllbnQ6IHdvcmtzcGFjZUNsaWVudC50b0xlZ2FjeVdvcmtzcGFjZUNsaWVudChjbGllbnQpLFxuICAgIHJvb3Q6IGJhc2VQYXRoLFxuICAgIHJlYWRPbmx5OiBmYWxzZSxcbiAgICBjcmVhdGVSb290OiB0cnVlLFxuICB9KTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBmcy5pbml0KCk7XG4gICAgYXdhaXQgZnMud3JpdGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSwgeyBvdmVyd3JpdGU6IHRydWUgfSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxvZ2dlci53YXJuKFwiZGVzdGluYXRpb246dW53cml0YWJsZVwiLCB7XG4gICAgICBkZXN0aW5hdGlvbjogYmFzZVBhdGgsXG4gICAgICBlcnJvcjogZXJyb3JVdGlscy50b0Vycm9yKGVyciksXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBhd2FpdCBmcy5kZWxldGVGaWxlKFdSSVRFX1BST0JFX0ZJTEUsIHsgZm9yY2U6IHRydWUgfSkuY2F0Y2goKCkgPT4gdW5kZWZpbmVkKTtcbiAgcmV0dXJuIGZzO1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgRGF0YWJyaWNrcyBBc3Npc3RhbnQgc2tpbGxzIGRlc3RpbmF0aW9uLCBvciBgdW5kZWZpbmVkYCBmb3IgbG9jYWwgdGVtcC4gKi9cbmZ1bmN0aW9uIHJlc29sdmVEYXRhYnJpY2tzQmFzZVBhdGgoXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4gIGNsaWVudDogV29ya3NwYWNlQ2xpZW50TGlrZSB8IHVuZGVmaW5lZCxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghY2xpZW50KSByZXR1cm4gdW5kZWZpbmVkO1xuICBpZiAob3B0aW9ucy5kYXRhYnJpY2tzQmFzZVBhdGgpIHJldHVybiBzdHJpbmdVdGlscy50cmltVG9VbmRlZmluZWQob3B0aW9ucy5kYXRhYnJpY2tzQmFzZVBhdGgpO1xuICBjb25zdCBlbWFpbCA9IHN0cmluZ1V0aWxzLnRyaW1Ub051bGwob3B0aW9ucy51c2VyRW1haWwpO1xuICAvLyBBIG5hbWVkIHVzZXIgdGFyZ2V0cyB0aGVpciBwZXJzb25hbCBBc3Npc3RhbnQgdHJlZSAodGhlIFwic2F2ZSBhIHNraWxsXCJcbiAgLy8gdGFyZ2V0KTsgb3RoZXJ3aXNlIHRoZSBzaGFyZWQgd29ya3NwYWNlIEFzc2lzdGFudCB0cmVlLCB3aGljaCB0aGUgYnVpbHQtaW5cbiAgLy8gQXNzaXN0YW50LXNraWxscyBtb3VudCBhbHJlYWR5IHNjYW5zLlxuICByZXR1cm4gZW1haWwgPyBwZXJzb25hbFNraWxsc1BhdGgoZW1haWwpIDogT1JHQU5JWkFUSU9OX1NLSUxMU19QQVRIO1xufVxuXG4vKipcbiAqIFN0YWdlIG9uZSBzb3VyY2UgaW50byBhIGZyZXNoIGRpciB1bmRlciBgc3RhZ2luZ1Jvb3RgLCBwcmVmZXJyaW5nIHRoZSBvcHRpb25hbFxuICogYHNraWxsc2AgQ0xJIGFuZCBmYWxsaW5nIGJhY2sgdG8gYSBkaXJlY3QgZmV0Y2guXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIHN0YWdlU291cmNlKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICBzdGFnaW5nUm9vdDogc3RyaW5nLFxuICBvcHRpb25zOiBQcm92aXNpb25SZW1vdGVTa2lsbHNPcHRpb25zLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdGFyZ2V0ID0gam9pbihzdGFnaW5nUm9vdCwgYHNyYy0ke2hhc2guaWQoKX1gKTtcbiAgYXdhaXQgbWtkaXIodGFyZ2V0LCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgLy8gQUkgVG9vbHMgcmVzb2x2ZXMgZnJvbSBhIGtub3duIHJlcG8gbGF5b3V0LCBzbyBpdCBuZXZlciBuZWVkcyB0aGUgQ0xJLlxuICBpZiAoaXNBaVRvb2xzU291cmNlKHNvdXJjZU9wdGlvbnMuc291cmNlKSkgcmV0dXJuIHN0YWdlQWlUb29scyhzb3VyY2VPcHRpb25zLCB0YXJnZXQsIG9wdGlvbnMpO1xuICBjb25zdCB2aWFDbGkgPSBhd2FpdCBzdGFnZVZpYVNraWxsc0NsaShzb3VyY2VPcHRpb25zLCB0YXJnZXQpO1xuICBpZiAodmlhQ2xpKSByZXR1cm4gdmlhQ2xpO1xuICByZXR1cm4gc3RhZ2VWaWFGZXRjaChzb3VyY2VPcHRpb25zLCB0YXJnZXQsIG9wdGlvbnMpO1xufVxuXG4vKipcbiAqIE1hdGVyaWFsaXplIHRoZSBEYXRhYnJpY2tzIEFJIFRvb2xzIHNraWxscyBpbnRvIGB0YXJnZXRgLlxuICpcbiAqIFJlYWRzIHRoZSByZXBvJ3Mgb3duIGdlbmVyYXRlZCBgbWFuaWZlc3QuanNvbmAgKHdoaWNoIG5hbWVzIGVhY2ggc2tpbGwnc1xuICogZmlsZXMgYW5kIHdoZXRoZXIgaXQgbGl2ZXMgdW5kZXIgYHNraWxscy9gIG9yIGBleHBlcmltZW50YWwvYCkgYW5kIGRvd25sb2Fkc1xuICogdGhlbSAtIHRoZSBzYW1lIHRoaW5nIGBkYXRhYnJpY2tzIGFpdG9vbHMgaW5zdGFsbGAgZG9lcywgbWludXMgdGhlIENMSSBhbmRcbiAqIG1pbnVzIGFueSBEYXRhYnJpY2tzIGF1dGgsIHNpbmNlIHRoZSByZXBvIGlzIHB1YmxpYy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VBaVRvb2xzKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG1heEJ5dGVzID0gcmVzb2x2ZU1heEJ5dGVzKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpO1xuICBjb25zdCByZWYgPSBzdHJpbmdVdGlscy50cmltVG9OdWxsKHNvdXJjZU9wdGlvbnMucmVmKSA/PyBBSVRPT0xTX1JFRjtcbiAgY29uc3QgbWFuaWZlc3QgPSBqc29uLnBhcnNlKFxuICAgIChhd2FpdCBkb3dubG9hZChhaVRvb2xzUmF3VXJsKHJlZiwgXCJtYW5pZmVzdC5qc29uXCIpLCBtYXhCeXRlcykpLnRvU3RyaW5nKFwidXRmOFwiKSxcbiAgICB1bmRlZmluZWQsXG4gICkgYXMgQWlUb29sc01hbmlmZXN0IHwgdW5kZWZpbmVkO1xuXG4gIGNvbnN0IHdhbnRlZCA9IG5ldyBTZXQoc3RyaW5nVXRpbHMucGFyc2VMaXN0KHNvdXJjZU9wdGlvbnMuc2tpbGxzKSk7XG4gIGNvbnN0IHNlbGVjdGVkID0gT2JqZWN0LmVudHJpZXMobWFuaWZlc3Q/LnNraWxscyA/PyB7fSkuZmlsdGVyKChbbmFtZSwgZW50cnldKSA9PlxuICAgIHdhbnRlZC5zaXplID4gMFxuICAgICAgPyB3YW50ZWQuaGFzKG5hbWUpXG4gICAgICA6IGVudHJ5LnJlcG9fZGlyICE9PSBcImV4cGVyaW1lbnRhbFwiIHx8IHNvdXJjZU9wdGlvbnMuZXhwZXJpbWVudGFsID09PSB0cnVlLFxuICApO1xuICBpZiAoc2VsZWN0ZWQubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBubyBtYXRjaGluZyBza2lsbHMgaW4gJHtBSVRPT0xTX1JFUE99QCR7cmVmfWApO1xuICB9XG5cbiAgY29uc3QgZmlsZXMgPSBzZWxlY3RlZC5mbGF0TWFwKChbbmFtZSwgZW50cnldKSA9PlxuICAgIChlbnRyeS5maWxlcyA/PyBbXSkubWFwKChmaWxlKSA9PiAoe1xuICAgICAgdXJsOiBhaVRvb2xzUmF3VXJsKHJlZiwgYCR7ZW50cnkucmVwb19kaXIgPz8gXCJza2lsbHNcIn0vJHtuYW1lfS8ke2ZpbGV9YCksXG4gICAgICBwYXRoOiBqb2luKHRhcmdldCwgbmFtZSwgLi4uZmlsZS5zcGxpdChcIi9cIikpLFxuICAgIH0pKSxcbiAgKTtcbiAgYXdhaXQgYXN5bmNVdGlscy5tYXBDb25jdXJyZW50KFxuICAgIGZpbGVzLFxuICAgIGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICBjb25zdCBib2R5ID0gYXdhaXQgZG93bmxvYWQoaXRlbS51cmwsIG1heEJ5dGVzKTtcbiAgICAgIGF3YWl0IG1rZGlyKGRpcm5hbWUoaXRlbS5wYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoaXRlbS5wYXRoLCBib2R5KTtcbiAgICB9LFxuICAgIHsgY29uY3VycmVuY3k6IEFJVE9PTFNfQ09OQ1VSUkVOQ1kgfSxcbiAgKTtcblxuICBsb2dnZXIuZGVidWcoXCJhaXRvb2xzOnN0YWdlZFwiLCB7IHJlZiwgc2tpbGxzOiBzZWxlY3RlZC5sZW5ndGgsIGZpbGVzOiBmaWxlcy5sZW5ndGggfSk7XG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKiBSYXctY29udGVudCBVUkwgZm9yIGEgcGF0aCBpbiB0aGUgQUkgVG9vbHMgcmVwbyBhdCBgcmVmYC4gKi9cbmZ1bmN0aW9uIGFpVG9vbHNSYXdVcmwocmVmOiBzdHJpbmcsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tLyR7QUlUT09MU19SRVBPfS8ke3JlZn0vJHtwYXRofWA7XG59XG5cbi8qKlxuICogQ29weSBhIHNvdXJjZSBpbnRvIGB0YXJnZXRgIHdpdGggdGhlIGBza2lsbHNgIENMSSB3aGVuIGl0IGlzIGluc3RhbGxlZC5cbiAqIFJldHVybnMgdGhlIGRpciBob2xkaW5nIHRoZSBjb3BpZWQgYFNLSUxMLm1kYCB0cmVlcywgb3IgYHVuZGVmaW5lZGAgd2hlbiB0aGVcbiAqIENMSSBpcyBhYnNlbnQgKHNvIHRoZSBjYWxsZXIgY2FuIGZhbGwgYmFjayB0byBhIGZldGNoKS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc3RhZ2VWaWFTa2lsbHNDbGkoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIHRhcmdldDogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgY2xpID0gYXdhaXQgcmVzb2x2ZVNraWxsc0NsaSgpO1xuICBpZiAoIWNsaSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICBjb25zdCBhcmdzID0gW1xuICAgIC4uLmNsaS5hcmdzLFxuICAgIFwiYWRkXCIsXG4gICAgc291cmNlT3B0aW9ucy5zb3VyY2UsXG4gICAgXCItLWFnZW50XCIsXG4gICAgU0tJTExTX0NMSV9BR0VOVCxcbiAgICBcIi0tY29weVwiLFxuICAgIFwiLXlcIixcbiAgXTtcbiAgZm9yIChjb25zdCBza2lsbCBvZiBzdHJpbmdVdGlscy5wYXJzZUxpc3Qoc291cmNlT3B0aW9ucy5za2lsbHMpKSB7XG4gICAgYXJncy5wdXNoKFwiLS1za2lsbFwiLCBza2lsbCk7XG4gIH1cbiAgaWYgKHN0cmluZ1V0aWxzLnBhcnNlTGlzdChzb3VyY2VPcHRpb25zLnNraWxscykubGVuZ3RoID09PSAwKSBhcmdzLnB1c2goXCItLXNraWxsXCIsIFwiKlwiKTtcblxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBleGVjLnNwYXduKGNsaS5jb21tYW5kLCBhcmdzLCB7XG4gICAgY3dkOiB0YXJnZXQsXG4gICAgc3Rkb3V0OiBcImNhcHR1cmVcIixcbiAgICBzdGRlcnI6IFwiY2FwdHVyZVwiLFxuICAgIGNoZWNrOiBmYWxzZSxcbiAgfSk7XG4gIGlmIChyZXN1bHQuZXhpdENvZGUgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgc2tpbGxzIENMSSBmYWlsZWQgKGV4aXQgJHtyZXN1bHQuZXhpdENvZGV9KTogJHtyZXN1bHQuc3RkZXJyIHx8IHJlc3VsdC5zdGRvdXR9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBqb2luKHRhcmdldCwgLi4uU0tJTExTX0NMSV9MQVlPVVQpO1xufVxuXG4vKipcbiAqIExvY2F0ZSB0aGUgb3B0aW9uYWwgYHNraWxsc2AgQ0xJIGJpbiwgcmVzb2x2ZWQgZnJvbSBUSElTIHBhY2thZ2UncyBtb2R1bGVcbiAqIGdyYXBoLiBSZXR1cm5zIGB1bmRlZmluZWRgIHdoZW4gdGhlIHBlZXIgZGVwIGlzbid0IGluc3RhbGxlZCwgc28gdGhlIGNhbGxlclxuICogZmFsbHMgYmFjayB0byBhIGRpcmVjdCBmZXRjaC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVNraWxsc0NsaSgpOiBQcm9taXNlPHsgY29tbWFuZDogc3RyaW5nOyBhcmdzOiBzdHJpbmdbXSB9IHwgdW5kZWZpbmVkPiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgICBjb25zdCBwa2dQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFwic2tpbGxzL3BhY2thZ2UuanNvblwiKTtcbiAgICBjb25zdCBiaW4gPSBqb2luKHBrZ1BhdGgsIFwiLi5cIiwgXCJiaW5cIiwgXCJjbGkubWpzXCIpO1xuICAgIGlmIChhd2FpdCBwYXRoRXhpc3RzKGJpbikpIHJldHVybiB7IGNvbW1hbmQ6IHByb2Nlc3MuZXhlY1BhdGgsIGFyZ3M6IFtiaW5dIH07XG4gIH0gY2F0Y2gge1xuICAgIC8vIHBlZXIgZGVwIGFic2VudCBvciB1bnJlc29sdmFibGUgLSBmZXRjaCBmYWxsYmFjayBoYW5kbGVzIGl0XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBGZXRjaCBhIHNvdXJjZSBVUkwgYW5kIHdyaXRlIHRoZSBkb3dubG9hZGVkIGBTS0lMTC5tZGAgdW5kZXIgYHRhcmdldGAuXG4gKiBVc2VkIHdoZW4gdGhlIGBza2lsbHNgIENMSSBpc24ndCBpbnN0YWxsZWQ7IHN1cHBvcnRzIGEgZGlyZWN0IGBTS0lMTC5tZGAgVVJMLlxuICovXG5hc3luYyBmdW5jdGlvbiBzdGFnZVZpYUZldGNoKFxuICBzb3VyY2VPcHRpb25zOiBOb3JtYWxpemVkU291cmNlLFxuICB0YXJnZXQ6IHN0cmluZyxcbiAgb3B0aW9uczogUHJvdmlzaW9uUmVtb3RlU2tpbGxzT3B0aW9ucyxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHVybCA9IG5ldC51cmxCdWlsZGVyKHNvdXJjZU9wdGlvbnMuc291cmNlKTtcbiAgaWYgKCF1cmwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgc291cmNlIFwiJHtzb3VyY2VPcHRpb25zLnNvdXJjZX1cIiBpcyBub3QgYSBVUkwgYW5kIHRoZSBvcHRpb25hbCBcInNraWxsc1wiIHBhY2thZ2UgaXMgbm90IGluc3RhbGxlZGAsXG4gICAgKTtcbiAgfVxuICBjb25zdCBidWZmZXIgPSBhd2FpdCBkb3dubG9hZCh1cmwudG9TdHJpbmcoKSwgcmVzb2x2ZU1heEJ5dGVzKHNvdXJjZU9wdGlvbnMsIG9wdGlvbnMpKTtcbiAgY29uc3QgbmFtZSA9IHN0cmluZ1V0aWxzLnRvU2x1ZyhkZXJpdmVTa2lsbE5hbWUodXJsLnRvU3RyaW5nKCkpKSB8fCBcInJlbW90ZS1za2lsbFwiO1xuICBjb25zdCBza2lsbERpciA9IGpvaW4odGFyZ2V0LCBuYW1lKTtcbiAgYXdhaXQgbWtkaXIoc2tpbGxEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCB3cml0ZUZpbGUoam9pbihza2lsbERpciwgXCJTS0lMTC5tZFwiKSwgYnVmZmVyKTtcbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuLyoqIFRoZSBlZmZlY3RpdmUgZG93bmxvYWQgY2VpbGluZzogcGVyLXNvdXJjZSwgdGhlbiB0b3AtbGV2ZWwsIHRoZW4gdGhlIGRlZmF1bHQuICovXG5mdW5jdGlvbiByZXNvbHZlTWF4Qnl0ZXMoXG4gIHNvdXJjZU9wdGlvbnM6IE5vcm1hbGl6ZWRTb3VyY2UsXG4gIG9wdGlvbnM6IFByb3Zpc2lvblJlbW90ZVNraWxsc09wdGlvbnMsXG4pOiBudW1iZXIge1xuICByZXR1cm4gc291cmNlT3B0aW9ucy5tYXhEb3dubG9hZEJ5dGVzID8/IG9wdGlvbnMubWF4RG93bmxvYWRCeXRlcyA/PyBERUZBVUxUX01BWF9ET1dOTE9BRF9CWVRFUztcbn1cblxuLyoqIEdFVCBhIFVSTCwgZmFpbGluZyBsb3VkbHkgb24gYSBub24tMnh4IHN0YXR1cyBvciBhbiBvdmVyc2l6ZWQgYm9keS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkKHVybDogc3RyaW5nLCBtYXhCeXRlczogbnVtYmVyKTogUHJvbWlzZTxCdWZmZXI+IHtcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICBzaWduYWw6IEFib3J0U2lnbmFsLnRpbWVvdXQoREVGQVVMVF9ET1dOTE9BRF9USU1FT1VUX01TKSxcbiAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcihgZG93bmxvYWQgZmFpbGVkICgke3VybH0pOiAke2Vycm9yVXRpbHMuZXJyb3JNZXNzYWdlKGVycil9YCwge1xuICAgICAgY2F1c2U6IGVycm9yVXRpbHMudG9FcnJvcihlcnIpLFxuICAgIH0pO1xuICB9KTtcbiAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgZG93bmxvYWQgZmFpbGVkOiAke3Jlc3BvbnNlLnN0YXR1c30gJHtyZXNwb25zZS5zdGF0dXNUZXh0fSAoJHt1cmx9KWApO1xuICB9XG4gIGNvbnN0IGJ1ZmZlciA9IEJ1ZmZlci5mcm9tKGF3YWl0IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpO1xuICBpZiAoYnVmZmVyLmJ5dGVMZW5ndGggPiBtYXhCeXRlcykge1xuICAgIHRocm93IG5ldyBFcnJvcihgZG93bmxvYWQgZXhjZWVkcyAke21heEJ5dGVzfSBieXRlcyAoJHt1cmx9KWApO1xuICB9XG4gIHJldHVybiBidWZmZXI7XG59XG5cbi8qKiBEZXJpdmUgYSBza2lsbCBkaXJlY3RvcnkgbmFtZSBmcm9tIGEgZG93bmxvYWQgVVJMJ3MgbGFzdCBwYXRoIHNlZ21lbnQuICovXG5mdW5jdGlvbiBkZXJpdmVTa2lsbE5hbWUodXJsU3RyaW5nOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCB1cmwgPSBuZXQudXJsQnVpbGRlcih1cmxTdHJpbmcpO1xuICBjb25zdCBsYXN0ID0gdXJsPy5wYXRobmFtZS5zcGxpdChcIi9cIikuZmlsdGVyKEJvb2xlYW4pLnBvcCgpID8/IFwiXCI7XG4gIHJldHVybiBsYXN0LnJlcGxhY2UoL1xcLihtZHx6aXB8dGFyfHRnenxneikkL2ksIFwiXCIpO1xufVxuXG4vKiogQSBza2lsbCBkaXJlY3RvcnkgKGhvbGRpbmcgYSBgU0tJTEwubWRgKSBzdGFnZWQgb24gbG9jYWwgZGlzay4gKi9cbmludGVyZmFjZSBTdGFnZWRTa2lsbERpciB7XG4gIG5hbWU6IHN0cmluZztcbiAgYWJzb2x1dGVQYXRoOiBzdHJpbmc7XG59XG5cbi8qKlxuICogQ29sbGVjdCBldmVyeSBza2lsbCBkaXJlY3RvcnkgdW5kZXIgYHJvb3RgOiBhIGByb290L1NLSUxMLm1kYCAocm9vdCBJUyB0aGVcbiAqIHNraWxsKSBvciBlYWNoIGltbWVkaWF0ZSBjaGlsZCBkaXIgdGhhdCBjb250YWlucyBhIGBTS0lMTC5tZGAuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGNvbGxlY3RTa2lsbERpcnMocm9vdDogc3RyaW5nKTogUHJvbWlzZTxTdGFnZWRTa2lsbERpcltdPiB7XG4gIGlmICghKGF3YWl0IHBhdGhFeGlzdHMocm9vdCkpKSByZXR1cm4gW107XG4gIGlmIChhd2FpdCBwYXRoRXhpc3RzKGpvaW4ocm9vdCwgXCJTS0lMTC5tZFwiKSkpIHtcbiAgICBjb25zdCBuYW1lID0gcG9zaXguYmFzZW5hbWUocm9vdC5zcGxpdCgvW1xcXFwvXS8pLmpvaW4oXCIvXCIpKTtcbiAgICByZXR1cm4gW3sgbmFtZSwgYWJzb2x1dGVQYXRoOiByb290IH1dO1xuICB9XG4gIGNvbnN0IGRpcnM6IFN0YWdlZFNraWxsRGlyW10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiBhd2FpdCByZWFkZGlyKHJvb3QsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuICAgIGlmICghZW50cnkuaXNEaXJlY3RvcnkoKSkgY29udGludWU7XG4gICAgY29uc3QgZGlyID0gam9pbihyb290LCBlbnRyeS5uYW1lKTtcbiAgICBpZiAoYXdhaXQgcGF0aEV4aXN0cyhqb2luKGRpciwgXCJTS0lMTC5tZFwiKSkpIHtcbiAgICAgIGRpcnMucHVzaCh7IG5hbWU6IGVudHJ5Lm5hbWUsIGFic29sdXRlUGF0aDogZGlyIH0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGlycztcbn1cblxuLyoqXG4gKiBDb3B5IGV2ZXJ5IHN0YWdlZCBza2lsbCBkaXJlY3RvcnkgaW50byB7QGxpbmsgZGVzdGluYXRpb259LCBwcmVzZXJ2aW5nIHRoZVxuICogYDxza2lsbD4vPHJlbGF0aXZlPmAgbGF5b3V0LiBUaGUgZGVzdGluYXRpb24gaXMganVzdCBhIHtAbGluayBGaWxlU3lzdGVtfSxcbiAqIHNvIHRoZSBEYXRhYnJpY2tzIEFzc2lzdGFudCB0cmVlIGFuZCB0aGUgbG9jYWwgZmFsbGJhY2sgc2hhcmUgb25lIGNvcGllci5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gY29weVNraWxsRGlycyhkZXN0aW5hdGlvbjogRmlsZVN5c3RlbSwgZGlyczogU3RhZ2VkU2tpbGxEaXJbXSk6IFByb21pc2U8dm9pZD4ge1xuICBhd2FpdCBkZXN0aW5hdGlvbi5pbml0KCk7XG4gIGZvciAoY29uc3QgZGlyIG9mIGRpcnMpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHJlbGF0aXZlIG9mIGZpbmQuZmluZEZpbGVzKFwiKiovKlwiLCB7XG4gICAgICBjd2Q6IGRpci5hYnNvbHV0ZVBhdGgsXG4gICAgICBub2RpcjogdHJ1ZSxcbiAgICB9KSkge1xuICAgICAgY29uc3QgYnVmZmVyID0gYXdhaXQgcmVhZEZpbGUoam9pbihkaXIuYWJzb2x1dGVQYXRoLCByZWxhdGl2ZSkpO1xuICAgICAgY29uc3Qgc2tpbGxQYXRoID0gcG9zaXguam9pbihkaXIubmFtZSwgcmVsYXRpdmUuc3BsaXQoL1tcXFxcL10vKS5qb2luKFwiL1wiKSk7XG4gICAgICBhd2FpdCBkZXN0aW5hdGlvbi53cml0ZUZpbGUoc2tpbGxQYXRoLCBidWZmZXIsIHsgb3ZlcndyaXRlOiB0cnVlIH0pO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENvcHkgc3RhZ2VkIHNraWxsIGRpcnMgaW50byBhIFNUQUJMRSBsb2NhbCB0cmVlIGtleWVkIGJ5IHRoZSBzb3VyY2UsIGFuZFxuICogcmV0dXJuIGl0cyByb290IHBhdGguXG4gKlxuICogQSBnaXZlbiBzb3VyY2UgcmVzb2x2ZXMgdG8gdGhlIHNhbWUgY29udGVudCBvbiBhbG1vc3QgZXZlcnkgYm9vdCwgc28gZWFjaFxuICogb25lIG93bnMgYSBkaXJlY3RvcnkgbmFtZWQgZm9yIGl0cyB7QGxpbmsgY2FjaGVLZXl9IHJhdGhlciB0aGFuIGxlYXZpbmcgYVxuICogZnJlc2ggc2NyYXRjaCBkaXIgYmVoaW5kIHBlciByZXN0YXJ0LiBLZXlpbmcgb24gdGhlIHNvdXJjZSBhbmQgaXRzIHBvbGljeVxuICogKG5vdCB0aGUgY29udGVudCkgaXMgd2hhdCBrZWVwcyB0d28gZGlmZmVyZW50IHNvdXJjZXMgZnJvbSBvdmVyd3JpdGluZyBlYWNoXG4gKiBvdGhlci5cbiAqXG4gKiBUaGUgbWV0YWRhdGEgaXMgd3JpdHRlbiBJTlNJREUgdGhlIHJlYnVpbGQgcmF0aGVyIHRoYW4gYWZ0ZXIgaXQ6IGByZWJ1aWxkRlNgXG4gKiByZXBsYWNlcyB0aGUgc3RhYmxlIHJvb3Qgd2hvbGVzYWxlLCBzbyBhbnl0aGluZyB3cml0dGVuIGFmdGVyd2FyZHMgd291bGRcbiAqIHN1cnZpdmUgb25seSB1bnRpbCB0aGUgbmV4dCByZWZyZXNoLCBhbmQgYW55dGhpbmcgd3JpdHRlbiBiZWZvcmUgd291bGQgYmVcbiAqIHRocm93biBhd2F5IGJ5IHRoZSBzd2FwLlxuICovXG5hc3luYyBmdW5jdGlvbiBwZXJzaXN0TG9jYWxseShcbiAga2V5OiBzdHJpbmcsXG4gIGRpcnM6IFN0YWdlZFNraWxsRGlyW10sXG4gIHJlY29yZDogUmVtb3RlU2tpbGxDYWNoZUVudHJ5LFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgc3RhYmxlID0gYXdhaXQgbG9jYWxGUy5yZWJ1aWxkRlMoYCR7TE9DQUxfU0tJTExTX0RJUn0vJHtrZXl9YCwgYXN5bmMgKHNjcmF0Y2gpID0+IHtcbiAgICBhd2FpdCBjb3B5U2tpbGxEaXJzKHNjcmF0Y2gsIGRpcnMpO1xuICAgIGF3YWl0IHdyaXRlTWV0YWRhdGEoc2NyYXRjaCwga2V5LCByZWNvcmQpO1xuICB9KTtcbiAgcmV0dXJuIHN0YWJsZS5yb290O1xufVxuXG4vKipcbiAqIEEgc2NyYXRjaCBmaWxlc3lzdGVtIHdob3NlIHJvb3QgZXhpc3RzIG9uIGRpc2ssIGZvciB0aGUgcGF0aHMgdGhhdCBoYW5kIGFcbiAqIHJlYWwgZGlyZWN0b3J5IHRvIGBub2RlOmZzYCBvciBhIGNoaWxkIHByb2Nlc3MgcmF0aGVyIHRoYW4gZ29pbmcgdGhyb3VnaFxuICogdGhlIHtAbGluayBGaWxlU3lzdGVtfSBBUEkuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGluaXRpYWxpemVkU2NyYXRjaChwcmVmaXg6IHN0cmluZyk6IFByb21pc2U8TG9jYWxGaWxlU3lzdGVtPiB7XG4gIGNvbnN0IHNjcmF0Y2ggPSBsb2NhbEZTLnNjcmF0Y2hGUyhwcmVmaXgpO1xuICBhd2FpdCBzY3JhdGNoLmluaXQoKTtcbiAgcmV0dXJuIHNjcmF0Y2g7XG59XG5cbi8qKiBCZXN0LWVmZm9ydCBleGlzdGVuY2UgY2hlY2suICovXG5hc3luYyBmdW5jdGlvbiBwYXRoRXhpc3RzKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB0cnkge1xuICAgIGF3YWl0IHN0YXQocGF0aCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuIl19
|